diff --git a/QuickShell.Raycast/src/components/workspace-form.tsx b/QuickShell.Raycast/src/components/workspace-form.tsx index 3a535811..a97520d6 100644 --- a/QuickShell.Raycast/src/components/workspace-form.tsx +++ b/QuickShell.Raycast/src/components/workspace-form.tsx @@ -521,8 +521,8 @@ export default function WorkspaceForm({ terminal: selectedTerminal?.terminal ?? "default", wtProfile: selectedTerminal?.wtProfile ?? null, isPinned: formValues.isPinned, - runAsAdmin: isMacPlatform() ? false : formValues.runAsAdmin, - launches: isMacPlatform() ? launches.map((launch) => ({ ...launch, runAsAdmin: false })) : launches, + runAsAdmin: isMacPlatform() ? initialWorkspace.runAsAdmin : formValues.runAsAdmin, + launches, companions, devServerUrl: formValues.devServerUrl, openDevServerOnLaunch: formValues.openDevServerOnLaunch, diff --git a/QuickShell.Raycast/src/lib/import-export.ts b/QuickShell.Raycast/src/lib/import-export.ts index e284f1ab..b9845d02 100644 --- a/QuickShell.Raycast/src/lib/import-export.ts +++ b/QuickShell.Raycast/src/lib/import-export.ts @@ -1,7 +1,7 @@ import { createStableId, isStableWorkspaceId } from "./ids"; import { migrateStoredData } from "./migration"; import type { LayoutEntry, StoredData, Workspace } from "./schema"; -import { createEmptyStoredData } from "./schema"; +import { SCHEMA_VERSION, createEmptyStoredData } from "./schema"; import { createIngressSecurity } from "./security"; type UnknownRecord = Record; @@ -80,6 +80,9 @@ export function importParsedPayload(parsed: unknown, existing?: StoredData): Imp // CmdPal / Core layout envelope: { version, entries: [ shortcut | { Workspace } | separator ] } if (Array.isArray(record.entries)) { + if (typeof record.version === "number" && record.version > SCHEMA_VERSION) { + throw new Error(`Unsupported Quick Shell data version: ${record.version}`); + } return importCmdPalLayoutEnvelope(record.entries, existing); } @@ -213,7 +216,7 @@ function mergeImportedData(imported: StoredData, existing?: StoredData): ImportR ...(base.layoutEntries ?? []), // Prefer remapped imported layout (keeps CmdPal separators). Fall back to // appending workspace rows when the payload had no layout entries. - ...(remappedImportLayout.length > 0 + ...(remappedImportLayout.some((entry) => entry.type === "workspace") ? remappedImportLayout : newlyImported.map((workspace) => ({ type: "workspace" as const, workspaceId: workspace.id }))), ]; diff --git a/QuickShell.Raycast/src/lib/mac-launch.ts b/QuickShell.Raycast/src/lib/mac-launch.ts index 6f68cbbd..3d1042ae 100644 --- a/QuickShell.Raycast/src/lib/mac-launch.ts +++ b/QuickShell.Raycast/src/lib/mac-launch.ts @@ -10,7 +10,7 @@ export type MacLaunchInvocation = { displayName: string; }; -export type MacLaunchEntryGroup = { +type MacLaunchEntryGroup = { hostId: MacTerminalHostId; entries: LaunchPlanEntry[]; }; @@ -90,9 +90,13 @@ export function groupMacLaunchEntries( const groups: MacLaunchEntryGroup[] = []; const groupIndexByHost = new Map(); + let previousHostId: MacTerminalHostId | undefined; for (const entry of entries) { - const hostId = resolveMacTerminalHostId(entry.launch.terminal, settings); + const hostId = entry.launch.terminal?.trim().toLowerCase() === "same-as-previous" && previousHostId + ? previousHostId + : resolveMacTerminalHostId(entry.launch.terminal, settings); + previousHostId = hostId; const existingIndex = groupIndexByHost.get(hostId); if (existingIndex !== undefined) { groups[existingIndex].entries.push(entry); diff --git a/QuickShell.Raycast/src/lib/storage.ts b/QuickShell.Raycast/src/lib/storage.ts index ef999b3a..d0a6e47e 100644 --- a/QuickShell.Raycast/src/lib/storage.ts +++ b/QuickShell.Raycast/src/lib/storage.ts @@ -796,7 +796,7 @@ export class QuickShellStorage { clearTimeout(this.recentWriteTimer); } this.recentWriteTimer = setTimeout(() => { - void this.flushRecentWrites().catch(() => { + void writeLockContext.run(undefined, () => this.flushRecentWrites()).catch(() => { this.recentWriteDirty = true; }); }, RECENT_WRITE_DEBOUNCE_MS); diff --git a/QuickShell.Raycast/src/lib/workspace-transfer-files.ts b/QuickShell.Raycast/src/lib/workspace-transfer-files.ts index 9fc2a3fa..de46ef48 100644 --- a/QuickShell.Raycast/src/lib/workspace-transfer-files.ts +++ b/QuickShell.Raycast/src/lib/workspace-transfer-files.ts @@ -109,13 +109,15 @@ async function pickWindowsTransferJsonPath(kind: DialogKind): Promise if (fromStdout) { return fromStdout; } - console.error("macOS transfer dialog script failed:", error); return null; } }