@wrongstack/desktop 0.282.1 → 0.283.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main/main.js +1 -1
- package/dist/main/main.js.map +1 -1
- package/package.json +3 -3
package/dist/main/main.js
CHANGED
|
@@ -2291,6 +2291,7 @@ async function boot() {
|
|
|
2291
2291
|
safeOpenExternal(url);
|
|
2292
2292
|
return { action: "deny" };
|
|
2293
2293
|
});
|
|
2294
|
+
registerIpcHandlers();
|
|
2294
2295
|
await shellView.webContents.loadURL(shellUrl);
|
|
2295
2296
|
const prevState = validatedWindowState(manager.getWindowState());
|
|
2296
2297
|
const defaultWidth = 1180;
|
|
@@ -2317,7 +2318,6 @@ async function boot() {
|
|
|
2317
2318
|
}
|
|
2318
2319
|
mainWindow.contentView.addChildView(shellView);
|
|
2319
2320
|
layoutViews();
|
|
2320
|
-
registerIpcHandlers();
|
|
2321
2321
|
configureApplicationMenu2();
|
|
2322
2322
|
mainWindow.on("resize", layoutViews);
|
|
2323
2323
|
bridge.on("changed", (conversation) => {
|
package/dist/main/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/main/main.ts","../../src/main/ipc.ts","../../src/main/i18n-main.ts","../../src/main/desktop-config-io.ts","../../src/main/runtime-manager.ts","../../src/main/webui-command-bridge.ts","../../src/main/state/constants.ts","../../src/main/layout/sidebar.ts","../../src/main/menu/index.ts","../../src/main/menu/projects-menu.ts","../../src/main/menu/sections.ts"],"sourcesContent":["/**\n * WrongStack Desktop - Electron Application Entry Point\n *\n * Architecture:\n * - Main state is managed here (centralized for simplicity)\n * - Modules handle specific concerns:\n * - layout/ → Window layout and sizing\n * - menu/ → Application menu building\n * - ipc-handlers/ → IPC message handlers\n * - runtime/ → Project/runtime operations\n * - state/ → Types and constants\n */\nimport * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport { wstackGlobalRoot } from '@wrongstack/core/utils';\nimport {\n app,\n BaseWindow,\n dialog,\n ipcMain,\n screen,\n shell,\n WebContentsView,\n type BaseWindowConstructorOptions,\n} from 'electron';\nimport type {\n DesktopWebuiCommand,\n DesktopWebuiPrefs,\n DesktopWebuiStatusSnapshot,\n DesktopWindowState,\n} from '../shared/types.js';\nimport { DesktopAgentBridge } from './agent-bridge.js';\nimport { IPC } from './ipc.js';\nimport { getMainLocale, setMainLocale, tMain } from './i18n-main.js';\nimport { desktopConfigPaths, readUiLocale, writeUiLocale } from './desktop-config-io.js';\nimport {\n DesktopRuntimeManager,\n preloadPath,\n rendererIndexPath,\n webuiPreloadPath,\n desktopSettingsWorkspaceRoot,\n} from './runtime-manager.js';\nimport { watchProviderConfig } from '@wrongstack/core/storage';\nimport {\n buildWebuiCommandFallbackScript,\n normalizeDesktopWebuiCommand,\n} from './webui-command-bridge.js';\n\n// Layout module\nimport { getSidebarWidth } from './layout/index.js';\n\n// Menu module\nimport { configureApplicationMenu as buildMenu } from './menu/index.js';\nimport type { MenuBuilderContext } from './menu/types.js';\n\n// Constants\nconst OPEN_EXTERNAL_ALLOWED_PROTOCOLS = new Set(['http:', 'https:', 'mailto:']);\nconst MIN_WINDOW_WIDTH = 760;\nconst MIN_WINDOW_HEIGHT = 520;\nconst MAX_PENDING_WEBUI_COMMANDS = 50;\nconst MAX_PENDING_FLUSH_ATTEMPTS = 80;\nconst WEBUI_COMMAND_FALLBACK_MS = 350;\nconst WEBUI_COMMAND_ACK_TIMEOUT_MS = 2_000;\n\napp.setAppUserModelId('com.wrongstack.desktop');\napp.setPath('userData', path.join(wstackGlobalRoot(), 'desktop', 'electron-profile'));\n\n// ============================================================================\n// Application State\n// ============================================================================\n\nconst manager = new DesktopRuntimeManager();\nconst bridge = new DesktopAgentBridge();\n\ninterface DesktopWebuiRuntimeView {\n runtimeId: string;\n view: WebContentsView;\n url: string | null;\n status: DesktopWebuiStatusSnapshot;\n bridgeReady: boolean;\n attached: boolean;\n pendingCommands: DesktopWebuiCommand[];\n pendingFlushTimer: ReturnType<typeof setTimeout> | null;\n pendingFlushAttempts: number;\n}\n\ninterface PendingWebuiCommandAck {\n runtimeId: string;\n timer: ReturnType<typeof setTimeout>;\n fallbackTimer: ReturnType<typeof setTimeout> | null;\n resolve: (handled: boolean) => void;\n}\n\nlet mainWindow: BaseWindow | null = null;\nlet shellView: WebContentsView | null = null;\nconst webuiViews = new Map<string, DesktopWebuiRuntimeView>();\nlet activeWebuiRuntimeId: string | null = null;\nlet webuiStatus: DesktopWebuiStatusSnapshot = { runtimeId: null, status: 'idle' };\nlet webuiCommandSequence = 0;\nlet shellSidebarCollapsed = false;\nconst pendingWebuiCommandAcks = new Map<string, PendingWebuiCommandAck>();\nlet saveWindowStateTimer: ReturnType<typeof setTimeout> | null = null;\nlet quittingAfterCleanup = false;\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\nfunction safeOpenExternal(target: string): void {\n let protocol: string;\n try {\n protocol = new URL(target).protocol;\n } catch {\n return;\n }\n if (OPEN_EXTERNAL_ALLOWED_PROTOCOLS.has(protocol)) {\n void shell.openExternal(target);\n }\n}\n\nfunction sameOrigin(candidate: string, base: string | null): boolean {\n if (!base) return false;\n try {\n return new URL(candidate).origin === new URL(base).origin;\n } catch {\n return false;\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction runtimeWsUrlOrThrow(runtimeId: string): string {\n const wsUrl = manager.getRuntimeWsUrlWithToken(runtimeId);\n if (!wsUrl) throw new Error(`Runtime not found: ${runtimeId}`);\n return wsUrl;\n}\n\n// ============================================================================\n// State Helpers\n// ============================================================================\n\nfunction setShellSidebarCollapsed(collapsed: boolean): void {\n shellSidebarCollapsed = collapsed;\n layoutWebuiViews();\n configureApplicationMenu();\n if (!shellView || shellView.webContents.isDestroyed()) return;\n shellView.webContents.send(IPC.shellSidebarCollapsedChanged, shellSidebarCollapsed);\n}\n\nfunction menuRelevantPrefsChanged(\n previous: DesktopWebuiPrefs | undefined,\n next: DesktopWebuiPrefs | undefined,\n): boolean {\n return (\n previous?.yolo !== next?.yolo ||\n previous?.nextPrediction !== next?.nextPrediction ||\n previous?.contextAutoCompact !== next?.contextAutoCompact\n );\n}\n\nfunction setEntryWebuiStatus(\n entry: DesktopWebuiRuntimeView,\n next: DesktopWebuiStatusSnapshot,\n): void {\n const previousPrefs = entry.status.prefs;\n entry.status = {\n ...next,\n prefs: next.prefs ?? entry.status.prefs,\n pendingCommands: entry.pendingCommands.length || undefined,\n };\n if (activeWebuiRuntimeId === entry.runtimeId) {\n publishWebuiStatus(entry.status);\n if (menuRelevantPrefsChanged(previousPrefs, entry.status.prefs)) {\n configureApplicationMenu();\n }\n }\n}\n\n// ============================================================================\n// Window State\n// ============================================================================\n\nfunction scheduleWindowStateSave(): void {\n if (saveWindowStateTimer) clearTimeout(saveWindowStateTimer);\n saveWindowStateTimer = setTimeout(() => {\n saveWindowStateTimer = null;\n void saveWindowState();\n }, 350);\n}\n\nasync function saveWindowState(): Promise<void> {\n if (!mainWindow) return;\n const bounds = mainWindow.getNormalBounds();\n await manager.saveWindowState({\n x: bounds.x,\n y: bounds.y,\n width: bounds.width,\n height: bounds.height,\n maximized: mainWindow.isMaximized(),\n });\n}\n\nfunction validatedWindowState(state: DesktopWindowState | null): DesktopWindowState | null {\n if (!state) return null;\n if (state.width < MIN_WINDOW_WIDTH || state.height < MIN_WINDOW_HEIGHT) return null;\n if (state.x === undefined || state.y === undefined) return state;\n const candidate = {\n x: state.x,\n y: state.y,\n width: state.width,\n height: state.height,\n };\n const visibleOnSomeDisplay = screen.getAllDisplays().some((display) => {\n const area = display.workArea;\n return rectanglesIntersect(candidate, area);\n });\n return visibleOnSomeDisplay ? state : null;\n}\n\nfunction rectanglesIntersect(\n left: { x: number; y: number; width: number; height: number },\n right: { x: number; y: number; width: number; height: number },\n): boolean {\n return (\n left.x < right.x + right.width &&\n left.x + left.width > right.x &&\n left.y < right.y + right.height &&\n left.y + left.height > right.y\n );\n}\n\n// ============================================================================\n// Layout Functions\n// ============================================================================\n\nfunction layoutViews(): void {\n if (!mainWindow || !shellView) return;\n const size = mainWindow.getContentSize();\n const width = size[0] ?? 0;\n const height = size[1] ?? 0;\n shellView.setBounds({ x: 0, y: 0, width, height });\n layoutWebuiViews();\n}\n\nfunction layoutWebuiViews(): void {\n if (!mainWindow) return;\n const size = mainWindow.getContentSize();\n const width = size[0] ?? 0;\n const height = size[1] ?? 0;\n const snapshot = manager.snapshot();\n const active = snapshot.runtimes.find((runtime) => runtime.id === snapshot.activeRuntimeId);\n const sidebarWidth = getSidebarWidth(width, shellSidebarCollapsed);\n const contentWidth = Math.max(0, width - sidebarWidth);\n\n for (const entry of webuiViews.values()) {\n const runtime = snapshot.runtimes.find((r) => r.id === entry.runtimeId);\n if (active?.id === entry.runtimeId && runtime?.status === 'running') {\n entry.view.setBounds({ x: sidebarWidth, y: 0, width: contentWidth, height });\n } else {\n entry.view.setBounds({ x: sidebarWidth, y: 0, width: 0, height });\n }\n }\n}\n\n// ============================================================================\n// WebUI View Management\n// ============================================================================\n\nfunction ensureWebuiEntry(runtimeId: string): DesktopWebuiRuntimeView | null {\n if (!mainWindow) return null;\n const existing = webuiViews.get(runtimeId);\n if (existing) return existing;\n\n const view = new WebContentsView({\n webPreferences: {\n preload: webuiPreloadPath(),\n contextIsolation: true,\n nodeIntegration: false,\n sandbox: false,\n },\n });\n\n const entry: DesktopWebuiRuntimeView = {\n runtimeId,\n view,\n url: null,\n status: { runtimeId, status: 'idle' },\n bridgeReady: false,\n attached: false,\n pendingCommands: [],\n pendingFlushTimer: null,\n pendingFlushAttempts: 0,\n };\n\n view.webContents.setWindowOpenHandler(({ url }) => {\n safeOpenExternal(url);\n return { action: 'deny' };\n });\n\n view.webContents.on('will-navigate', (event, url) => {\n if (sameOrigin(url, entry.url)) return;\n event.preventDefault();\n safeOpenExternal(url);\n });\n\n view.webContents.on('did-start-loading', () => {\n if (webuiViews.get(runtimeId) !== entry) return;\n entry.bridgeReady = false;\n setEntryWebuiStatus(entry, { runtimeId, status: 'loading' });\n });\n\n view.webContents.on('did-finish-load', () => {\n if (webuiViews.get(runtimeId) !== entry) return;\n schedulePendingWebuiFlush(entry);\n try {\n entry.view.webContents.send(IPC.webuiLocaleChanged, getMainLocale());\n } catch {\n /* webui was destroyed mid-send */\n }\n });\n\n view.webContents.on('did-fail-load', (_event, errorCode, errorDescription) => {\n if (webuiViews.get(runtimeId) !== entry || errorCode === -3) return;\n setEntryWebuiStatus(entry, { runtimeId, status: 'error', error: errorDescription });\n });\n\n view.webContents.on('render-process-gone', (_event, details) => {\n if (webuiViews.get(runtimeId) !== entry) return;\n setEntryWebuiStatus(entry, {\n runtimeId,\n status: 'error',\n error: `WebUI renderer exited: ${details.reason}`,\n });\n });\n\n webuiViews.set(runtimeId, entry);\n return entry;\n}\n\nfunction attachWebuiEntry(entry: DesktopWebuiRuntimeView): void {\n if (!mainWindow) return;\n if (entry.attached) return;\n mainWindow.contentView.addChildView(entry.view);\n entry.attached = true;\n}\n\nfunction disposeWebuiEntry(entry: DesktopWebuiRuntimeView): void {\n webuiViews.delete(entry.runtimeId);\n entry.pendingCommands.length = 0;\n settlePendingWebuiCommandAcksForRuntime(entry.runtimeId, false);\n if (entry.pendingFlushTimer) {\n clearTimeout(entry.pendingFlushTimer);\n entry.pendingFlushTimer = null;\n }\n if (mainWindow && entry.attached) {\n mainWindow.contentView.removeChildView(entry.view);\n }\n entry.attached = false;\n if (!entry.view.webContents.isDestroyed()) {\n entry.view.webContents.close();\n }\n if (activeWebuiRuntimeId === entry.runtimeId) activeWebuiRuntimeId = null;\n}\n\nfunction disposeAllWebuiEntries(): void {\n for (const entry of Array.from(webuiViews.values())) {\n disposeWebuiEntry(entry);\n }\n webuiViews.clear();\n}\n\nfunction pruneWebuiEntries(runtimeIds: string[]): void {\n const live = new Set(runtimeIds);\n for (const [id, entry] of webuiViews) {\n if (!live.has(id)) {\n disposeWebuiEntry(entry);\n }\n }\n}\n\nfunction findWebuiEntryBySenderId(senderId: number): DesktopWebuiRuntimeView | undefined {\n return Array.from(webuiViews.values()).find(\n (candidate) => candidate.view.webContents.id === senderId,\n );\n}\n\nfunction syncActiveWebuiView(): void {\n if (!mainWindow) return;\n const snapshot = manager.snapshot();\n pruneWebuiEntries(\n snapshot.runtimes\n .filter((runtime) => runtime.status === 'running')\n .map((runtime) => runtime.id),\n );\n const active = snapshot.runtimes.find((runtime) => runtime.id === snapshot.activeRuntimeId);\n if (active?.status !== 'running') {\n activeWebuiRuntimeId = active?.id ?? null;\n publishWebuiStatus({ runtimeId: active?.id ?? null, status: 'idle' });\n layoutWebuiViews();\n return;\n }\n\n const url = manager.getRuntimeUrlWithToken(active.id);\n if (!url) {\n activeWebuiRuntimeId = active.id;\n publishWebuiStatus({ runtimeId: active.id, status: 'idle' });\n layoutWebuiViews();\n return;\n }\n const entry = ensureWebuiEntry(active.id);\n if (!entry) return;\n activeWebuiRuntimeId = active.id;\n attachWebuiEntry(entry);\n layoutWebuiViews();\n publishWebuiStatus(entry.status);\n if (entry.url !== url) {\n entry.url = url;\n entry.bridgeReady = false;\n setEntryWebuiStatus(entry, { runtimeId: active.id, status: 'loading' });\n void entry.view.webContents.loadURL(url).catch((err) => {\n setEntryWebuiStatus(entry, {\n runtimeId: active.id,\n status: 'error',\n error: err instanceof Error ? err.message : String(err),\n });\n console.error(\n JSON.stringify({\n level: 'error',\n event: 'desktop.webui_view_load_failed',\n runtimeId: active.id,\n message: err instanceof Error ? err.message : String(err),\n timestamp: new Date().toISOString(),\n }),\n );\n });\n }\n}\n\n// ============================================================================\n// State Broadcasting\n// ============================================================================\n\nfunction broadcastState(): void {\n if (!shellView || shellView.webContents.isDestroyed()) return;\n shellView.webContents.send(IPC.stateChanged, manager.snapshot());\n}\n\nfunction publishWebuiStatus(next: DesktopWebuiStatusSnapshot): void {\n webuiStatus = next;\n if (!shellView || shellView.webContents.isDestroyed()) return;\n shellView.webContents.send(IPC.webuiStatusChanged, webuiStatus);\n}\n\nfunction broadcastLocaleToEmbeddedWebuis(locale: string): void {\n for (const entry of webuiViews.values()) {\n if (entry.view.webContents.isDestroyed()) continue;\n try {\n entry.view.webContents.send(IPC.webuiLocaleChanged, locale);\n } catch {\n /* destroyed mid-send */\n }\n }\n}\n\n// ============================================================================\n// WebUI Command Dispatch\n// ============================================================================\n\nfunction getActiveWebuiEntry(): DesktopWebuiRuntimeView | undefined {\n const activeId = manager.snapshot().activeRuntimeId;\n return activeId ? webuiViews.get(activeId) : undefined;\n}\n\nasync function isWebuiCommandBridgeReady(entry: DesktopWebuiRuntimeView): Promise<boolean> {\n if (webuiViews.get(entry.runtimeId) !== entry || !entry.url) return false;\n return entry.bridgeReady;\n}\n\nfunction queueWebuiCommand(entry: DesktopWebuiRuntimeView, command: DesktopWebuiCommand): void {\n entry.pendingCommands.push(command);\n if (entry.pendingCommands.length > MAX_PENDING_WEBUI_COMMANDS) {\n entry.pendingCommands.splice(0, entry.pendingCommands.length - MAX_PENDING_WEBUI_COMMANDS);\n }\n entry.pendingFlushAttempts = 0;\n setEntryWebuiStatus(entry, entry.status);\n}\n\nfunction nextWebuiCommandRequestId(runtimeId: string): string {\n webuiCommandSequence += 1;\n return `${runtimeId}:${Date.now()}:${webuiCommandSequence}`;\n}\n\nasync function dispatchWebuiCommand(commandInput: unknown): Promise<boolean> {\n const command = normalizeDesktopWebuiCommand(commandInput);\n if (!command) return false;\n const entry = getActiveWebuiEntry();\n if (!entry?.url) return false;\n\n if (entry.status.status !== 'ready') {\n if (!entry.view.webContents.isLoading() && entry.status.status !== 'error') {\n return dispatchWebuiCommandNow(entry, command);\n }\n queueWebuiCommand(entry, command);\n schedulePendingWebuiFlush(entry);\n return true;\n }\n\n if (!(await isWebuiCommandBridgeReady(entry))) {\n if (!entry.view.webContents.isLoading()) {\n return dispatchWebuiCommandNow(entry, command);\n }\n queueWebuiCommand(entry, command);\n schedulePendingWebuiFlush(entry);\n return true;\n }\n\n return dispatchWebuiCommandNow(entry, command);\n}\n\nasync function reloadActiveWebuiView(): Promise<boolean> {\n const entry = getActiveWebuiEntry();\n if (!entry?.url) return false;\n entry.bridgeReady = false;\n setEntryWebuiStatus(entry, { runtimeId: entry.runtimeId, status: 'loading' });\n return entry.view.webContents\n .loadURL(entry.url)\n .then(() => true)\n .catch((err) => {\n setEntryWebuiStatus(entry, {\n runtimeId: entry.runtimeId,\n status: 'error',\n error: err instanceof Error ? err.message : String(err),\n });\n console.error(\n JSON.stringify({\n level: 'error',\n event: 'desktop.webui_view_reload_failed',\n runtimeId: entry.runtimeId,\n message: err instanceof Error ? err.message : String(err),\n timestamp: new Date().toISOString(),\n }),\n );\n return false;\n });\n}\n\nasync function dispatchWebuiCommandNow(\n entry: DesktopWebuiRuntimeView,\n command: DesktopWebuiCommand,\n): Promise<boolean> {\n if (webuiViews.get(entry.runtimeId) !== entry || !entry.url) return false;\n const requestId = nextWebuiCommandRequestId(entry.runtimeId);\n const commandWithRequestId: DesktopWebuiCommand = { ...command, requestId };\n\n return new Promise<boolean>((resolve) => {\n const fallbackTimer = setTimeout(() => {\n const pending = pendingWebuiCommandAcks.get(requestId);\n if (!pending) return;\n sendWebuiCommandDomFallback(entry, commandWithRequestId);\n }, WEBUI_COMMAND_FALLBACK_MS);\n\n const timer = setTimeout(() => {\n settlePendingWebuiCommandAck(requestId, false);\n }, WEBUI_COMMAND_ACK_TIMEOUT_MS);\n\n pendingWebuiCommandAcks.set(requestId, {\n runtimeId: entry.runtimeId,\n timer,\n fallbackTimer,\n resolve,\n });\n\n try {\n entry.view.webContents.send(IPC.webuiCommand, commandWithRequestId);\n if (activeWebuiRuntimeId === entry.runtimeId) {\n entry.view.webContents.focus();\n }\n } catch {\n settlePendingWebuiCommandAck(requestId, false);\n }\n });\n}\n\nfunction sendWebuiCommandDomFallback(\n entry: DesktopWebuiRuntimeView,\n command: DesktopWebuiCommand,\n): void {\n if (webuiViews.get(entry.runtimeId) !== entry || entry.view.webContents.isDestroyed()) return;\n void entry.view.webContents\n .executeJavaScript(buildWebuiCommandFallbackScript(command), true)\n .catch(() => undefined);\n}\n\nfunction settlePendingWebuiCommandAck(requestId: string, handled: boolean): void {\n const pending = pendingWebuiCommandAcks.get(requestId);\n if (!pending) return;\n pendingWebuiCommandAcks.delete(requestId);\n clearTimeout(pending.timer);\n if (pending.fallbackTimer) clearTimeout(pending.fallbackTimer);\n if (handled) {\n const entry = webuiViews.get(pending.runtimeId);\n if (entry) {\n entry.bridgeReady = true;\n setEntryWebuiStatus(entry, { ...entry.status, status: 'ready' });\n }\n }\n pending.resolve(handled);\n}\n\nfunction settlePendingWebuiCommandAcksForRuntime(runtimeId: string, handled: boolean): void {\n for (const [requestId, pending] of [...pendingWebuiCommandAcks]) {\n if (pending.runtimeId === runtimeId) {\n settlePendingWebuiCommandAck(requestId, handled);\n }\n }\n}\n\nasync function flushPendingWebuiCommands(entry: DesktopWebuiRuntimeView): Promise<void> {\n if (webuiViews.get(entry.runtimeId) !== entry) return;\n if (entry.pendingCommands.length === 0) return;\n\n if (!(await isWebuiCommandBridgeReady(entry))) {\n entry.pendingFlushAttempts += 1;\n const canFallback = !entry.view.webContents.isLoading() && entry.pendingFlushAttempts >= 4;\n\n if (!canFallback && entry.pendingFlushAttempts <= MAX_PENDING_FLUSH_ATTEMPTS) {\n schedulePendingWebuiFlush(entry);\n setEntryWebuiStatus(entry, entry.status);\n return;\n }\n\n if (!canFallback) {\n entry.pendingCommands.length = 0;\n setEntryWebuiStatus(entry, {\n runtimeId: entry.runtimeId,\n status: 'error',\n error: 'WebUI command bridge did not become ready.',\n });\n return;\n }\n }\n\n entry.pendingFlushAttempts = 0;\n const commands = entry.pendingCommands.splice(0, entry.pendingCommands.length);\n setEntryWebuiStatus(entry, entry.status);\n\n for (const command of commands) {\n await dispatchWebuiCommandNow(entry, command).catch(() => undefined);\n }\n}\n\nfunction schedulePendingWebuiFlush(entry: DesktopWebuiRuntimeView): void {\n if (entry.pendingFlushTimer) return;\n entry.pendingFlushTimer = setTimeout(() => {\n entry.pendingFlushTimer = null;\n void flushPendingWebuiCommands(entry);\n }, 250);\n}\n\n// ============================================================================\n// Project/Runtime Operations\n// ============================================================================\n\nasync function openProject(\n requestedRoot?: string | undefined,\n): Promise<ReturnType<DesktopRuntimeManager['snapshot']>> {\n let projectRoot = requestedRoot;\n if (!projectRoot) {\n const result = await dialog.showOpenDialog({\n title: tMain('openProject'),\n properties: ['openDirectory'],\n });\n projectRoot = result.filePaths[0];\n }\n if (!projectRoot) return manager.snapshot();\n await manager.openProject(projectRoot);\n syncActiveWebuiView();\n broadcastState();\n return manager.snapshot();\n}\n\nasync function registerProject(\n requestedRoot?: string | undefined,\n): Promise<ReturnType<DesktopRuntimeManager['snapshot']>> {\n let projectRoot = requestedRoot;\n if (!projectRoot) {\n const result = await dialog.showOpenDialog({\n title: tMain('registerProject'),\n properties: ['openDirectory'],\n });\n projectRoot = result.filePaths[0];\n }\n if (!projectRoot) return manager.snapshot();\n await manager.registerProject(projectRoot);\n broadcastState();\n return manager.snapshot();\n}\n\nasync function unregisterProject(\n root: string,\n): Promise<ReturnType<DesktopRuntimeManager['snapshot']>> {\n if (!root || typeof root !== 'string') return manager.snapshot();\n await manager.unregisterProject(root);\n broadcastState();\n return manager.snapshot();\n}\n\nasync function openProjectSession(\n runtimeId?: string | undefined,\n): Promise<ReturnType<DesktopRuntimeManager['snapshot']>> {\n const snapshot = manager.snapshot();\n const runtime =\n (runtimeId ? snapshot.runtimes.find((candidate) => candidate.id === runtimeId) : undefined) ??\n snapshot.runtimes.find((candidate) => candidate.id === snapshot.activeRuntimeId);\n if (runtime?.kind !== 'project') {\n return openProject();\n }\n await manager.openProject(runtime.root, { forceNew: true });\n syncActiveWebuiView();\n broadcastState();\n return manager.snapshot();\n}\n\nasync function openSettings(): Promise<ReturnType<DesktopRuntimeManager['snapshot']>> {\n const snapshot = manager.snapshot();\n const active = snapshot.runtimes.find((runtime) => runtime.id === snapshot.activeRuntimeId);\n if (!active || active.kind === 'global-settings' || active.status !== 'running') {\n const root = desktopSettingsWorkspaceRoot();\n await fs.mkdir(root, { recursive: true });\n await manager.openProject(root, {\n name: 'Global Settings',\n kind: 'global-settings',\n touchRecent: false,\n });\n syncActiveWebuiView();\n broadcastState();\n }\n await dispatchWebuiCommand({ view: 'settings' });\n return manager.snapshot();\n}\n\nasync function activateRuntime(\n id: string,\n): Promise<ReturnType<DesktopRuntimeManager['snapshot']>> {\n await manager.activateRuntime(id);\n syncActiveWebuiView();\n broadcastState();\n return manager.snapshot();\n}\n\nasync function closeRuntime(\n id: string,\n): Promise<ReturnType<DesktopRuntimeManager['snapshot']>> {\n bridge.close(id);\n await manager.closeRuntime(id);\n const entry = webuiViews.get(id);\n if (entry) disposeWebuiEntry(entry);\n syncActiveWebuiView();\n broadcastState();\n return manager.snapshot();\n}\n\nasync function restoreLastWorkspace(): Promise<void> {\n await manager.restoreLastWorkspace();\n syncActiveWebuiView();\n broadcastState();\n}\n\n// ============================================================================\n// ============================================================================\n// Menu Configuration (delegated to menu/ module)\n// ============================================================================\n\n/**\n * Create the menu context for building the application menu.\n * This context is passed to the menu/ module's configureApplicationMenu.\n */\nfunction createMenuContext(): MenuBuilderContext {\n return {\n getSnapshot: () => manager.snapshot(),\n getActiveRuntime: () => {\n const snapshot = manager.snapshot();\n return snapshot.runtimes.find((r) => r.id === snapshot.activeRuntimeId);\n },\n getActiveWebuiPrefs: () => {\n const snapshot = manager.snapshot();\n if (!snapshot.activeRuntimeId) return undefined;\n return webuiViews.get(snapshot.activeRuntimeId)?.status.prefs;\n },\n getShellSidebarCollapsed: () => shellSidebarCollapsed,\n t: tMain,\n getRuntimeManager: () => manager,\n getWebuiViews: () => webuiViews,\n dispatchWebuiCommand,\n reloadActiveWebuiView,\n activateRuntime: async (id) => { await activateRuntime(id); },\n openProject: async () => { await openProject(); },\n registerProject: async () => { await registerProject(); },\n openSettings: async () => { await openSettings(); },\n openProjectSession: async (id) => { await openProjectSession(id); },\n closeRuntime: async (id) => { await closeRuntime(id); },\n unregisterProject: async (root) => { await unregisterProject(root); },\n getActiveRuntimeId: () => activeWebuiRuntimeId,\n setShellSidebarCollapsed: (collapsed) => { setShellSidebarCollapsed(collapsed); },\n restoreLastWorkspace: async () => { await restoreLastWorkspace(); },\n openExternal: (url) => { shell.openExternal(url); },\n revealInExplorer: (root) => { void shell.openPath(root); },\n };\n}\n\n/**\n * Configure the application menu using the menu module.\n */\nfunction configureApplicationMenu(): void {\n buildMenu(createMenuContext());\n}\n\n// ============================================================================\n// IPC Handlers\n// ============================================================================\n\nfunction registerIpcHandlers(): void {\n ipcMain.handle(IPC.getState, () => manager.snapshot());\n ipcMain.handle(IPC.getConversation, (_event, runtimeId: string) =>\n bridge.snapshot(runtimeId),\n );\n ipcMain.handle(IPC.getWebuiStatus, () => webuiStatus);\n\n ipcMain.handle(IPC.navigateWebui, async (_event, command: unknown) =>\n dispatchWebuiCommand(command),\n );\n ipcMain.handle(IPC.reloadWebui, async () => reloadActiveWebuiView());\n\n ipcMain.handle(IPC.setShellSidebarCollapsed, (_event, collapsed: unknown) => {\n setShellSidebarCollapsed(collapsed === true);\n return true;\n });\n ipcMain.handle(IPC.openSettings, async () => openSettings());\n\n ipcMain.handle(IPC.openProjectSession, async (_event, runtimeId?: string | undefined) =>\n openProjectSession(runtimeId),\n );\n ipcMain.handle(IPC.openProject, async (_event, requestedRoot?: string | undefined) =>\n openProject(requestedRoot),\n );\n ipcMain.handle(IPC.registerProject, async (_event, requestedRoot?: string | undefined) =>\n registerProject(requestedRoot),\n );\n ipcMain.handle(IPC.unregisterProject, async (_event, root: string) => unregisterProject(root));\n\n ipcMain.handle(IPC.activateRuntime, async (_event, id: string) => activateRuntime(id));\n ipcMain.handle(IPC.closeRuntime, async (_event, id: string) => closeRuntime(id));\n ipcMain.handle(IPC.sendMessage, async (_event, id: string, content: string) =>\n bridge.sendMessage(id, runtimeWsUrlOrThrow(id), content),\n );\n ipcMain.handle(IPC.abortRuntime, async (_event, id: string) =>\n bridge.abort(id, runtimeWsUrlOrThrow(id)),\n );\n ipcMain.handle(IPC.openRuntimeInBrowser, async (_event, id: string) => {\n const url = manager.getRuntimeUrlWithToken(id);\n if (url) safeOpenExternal(url);\n });\n ipcMain.handle(IPC.revealRuntimeRoot, async (_event, id: string) => {\n const runtime = manager.getRuntime(id);\n if (runtime) void shell.openPath(runtime.root);\n });\n\n ipcMain.on(IPC.webuiReadyChanged, (event, ready: boolean) => {\n const entry = findWebuiEntryBySenderId(event.sender.id);\n if (!entry) return;\n entry.bridgeReady = ready === true;\n if (entry.bridgeReady) {\n setEntryWebuiStatus(entry, { ...entry.status, status: 'ready' });\n schedulePendingWebuiFlush(entry);\n } else if (entry.status.status === 'ready') {\n setEntryWebuiStatus(entry, { ...entry.status, status: 'loading' });\n }\n });\n\n ipcMain.on(IPC.webuiPrefsChanged, (event, prefs: unknown) => {\n const entry = findWebuiEntryBySenderId(event.sender.id);\n if (!entry) return;\n const next: DesktopWebuiPrefs = {};\n if (isRecord(prefs) && typeof prefs['yolo'] === 'boolean') next.yolo = prefs['yolo'];\n if (isRecord(prefs) && typeof prefs['nextPrediction'] === 'boolean') {\n next.nextPrediction = prefs['nextPrediction'];\n }\n if (isRecord(prefs) && typeof prefs['contextAutoCompact'] === 'boolean') {\n next.contextAutoCompact = prefs['contextAutoCompact'];\n }\n if (Object.keys(next).length === 0) return;\n setEntryWebuiStatus(entry, {\n ...entry.status,\n prefs: { ...(entry.status.prefs ?? {}), ...next },\n });\n });\n\n ipcMain.on(\n IPC.webuiCommandAck,\n (event, requestId: unknown, handled: unknown, _message?: unknown) => {\n const entry = findWebuiEntryBySenderId(event.sender.id);\n if (!entry || typeof requestId !== 'string') return;\n const pending = pendingWebuiCommandAcks.get(requestId);\n if (!pending || pending.runtimeId !== entry.runtimeId) return;\n settlePendingWebuiCommandAck(requestId, handled === true);\n },\n );\n\n ipcMain.on(IPC.setLocale, (_event, locale: string) => {\n setMainLocale(locale);\n configureApplicationMenu();\n broadcastLocaleToEmbeddedWebuis(locale);\n void writeUiLocale(locale);\n });\n}\n\n// ============================================================================\n// Boot Sequence\n// ============================================================================\n\nasync function boot(): Promise<void> {\n const locale = await readUiLocale();\n if (locale) setMainLocale(locale);\n\n const shellUrl = rendererIndexPath();\n shellView = new WebContentsView({\n webPreferences: {\n preload: preloadPath(),\n contextIsolation: true,\n nodeIntegration: false,\n sandbox: false,\n },\n });\n shellView.webContents.setWindowOpenHandler(({ url }) => {\n safeOpenExternal(url);\n return { action: 'deny' };\n });\n\n await shellView.webContents.loadURL(shellUrl);\n\n const prevState = validatedWindowState(manager.getWindowState());\n const defaultWidth = 1180;\n const defaultHeight = 720;\n\n const winOptions: BaseWindowConstructorOptions = {\n width: prevState?.width ?? defaultWidth,\n height: prevState?.height ?? defaultHeight,\n show: false,\n minWidth: MIN_WINDOW_WIDTH,\n minHeight: MIN_WINDOW_HEIGHT,\n title: tMain('windowTitle'),\n };\n if (prevState) {\n if (prevState.x !== undefined) winOptions.x = prevState.x;\n if (prevState.y !== undefined) winOptions.y = prevState.y;\n }\n\n mainWindow = new BaseWindow(winOptions);\n mainWindow.on('resized', scheduleWindowStateSave);\n mainWindow.on('moved', scheduleWindowStateSave);\n mainWindow.on('maximize', scheduleWindowStateSave);\n mainWindow.on('unmaximize', scheduleWindowStateSave);\n\n if (prevState?.maximized) {\n mainWindow.maximize();\n }\n\n mainWindow.contentView.addChildView(shellView);\n layoutViews();\n\n registerIpcHandlers();\n\n configureApplicationMenu();\n\n mainWindow.on('resize', layoutViews);\n\n bridge.on('changed', (conversation) => {\n if (!shellView || shellView.webContents.isDestroyed()) return;\n shellView.webContents.send(IPC.conversationChanged, conversation);\n });\n\n manager.on('changed', () => {\n syncActiveWebuiView();\n configureApplicationMenu();\n broadcastState();\n });\n\n let lastWatchedLocale: string | undefined;\n watchProviderConfig(\n desktopConfigPaths.globalConfigPath,\n desktopConfigPaths.vault,\n (snapshot) => {\n const updated = snapshot.uiLocale;\n if (!updated || updated === lastWatchedLocale) return;\n lastWatchedLocale = updated;\n setMainLocale(updated);\n configureApplicationMenu();\n broadcastLocaleToEmbeddedWebuis(updated);\n if (shellView && !shellView.webContents.isDestroyed()) {\n shellView.webContents.send(IPC.localeChanged, updated);\n }\n },\n );\n\n mainWindow.on('close', (event) => {\n if (quittingAfterCleanup) return;\n event.preventDefault();\n bridge.closeAll();\n disposeAllWebuiEntries();\n void saveWindowState();\n quittingAfterCleanup = true;\n app.exit(0);\n });\n\n await restoreLastWorkspace();\n\n mainWindow.show();\n shellView.webContents.focus();\n}\n\n// ============================================================================\n// App Lifecycle\n// ============================================================================\n\napp.whenReady().then(boot);\n\napp.on('window-all-closed', () => {\n app.quit();\n});\n\napp.on('before-quit', () => {\n if (mainWindow) {\n mainWindow.removeAllListeners('close');\n void saveWindowState();\n }\n bridge.closeAll();\n disposeAllWebuiEntries();\n});\n\napp.on('activate', () => {\n if (!mainWindow) return;\n mainWindow.show();\n shellView?.webContents.focus();\n});\n","export const IPC = {\n getState: 'desktop:get-state',\n getConversation: 'desktop:get-conversation',\n getWebuiStatus: 'desktop:get-webui-status',\n openProject: 'desktop:open-project',\n registerProject: 'desktop:register-project',\n unregisterProject: 'desktop:unregister-project',\n openProjectSession: 'desktop:open-project-session',\n activateRuntime: 'desktop:activate-runtime',\n closeRuntime: 'desktop:close-runtime',\n navigateWebui: 'desktop:navigate-webui',\n reloadWebui: 'desktop:reload-webui',\n setShellSidebarCollapsed: 'desktop:set-shell-sidebar-collapsed',\n openSettings: 'desktop:open-settings',\n sendMessage: 'desktop:send-message',\n abortRuntime: 'desktop:abort-runtime',\n openRuntimeInBrowser: 'desktop:open-runtime-in-browser',\n revealRuntimeRoot: 'desktop:reveal-runtime-root',\n stateChanged: 'desktop:state-changed',\n conversationChanged: 'desktop:conversation-changed',\n webuiStatusChanged: 'desktop:webui-status-changed',\n webuiReadyChanged: 'desktop:webui-ready-changed',\n webuiPrefsChanged: 'desktop:webui-prefs-changed',\n webuiCommandAck: 'desktop:webui-command-ack',\n webuiCommand: 'desktop:webui-command',\n shellSidebarCollapsedChanged: 'desktop:shell-sidebar-collapsed-changed',\n setLocale: 'desktop:set-locale',\n localeChanged: 'desktop:locale-changed',\n // Embedded WebUI view side — the desktop shell pushes locale changes here\n // so the React WebUI inside Electron can swap i18n instantly, without waiting\n // for the config-file watcher → WS prefs.updated round-trip.\n webuiLocaleChanged: 'desktop:webui-locale-changed',\n} as const;\n","/**\n * Main-process i18n for the Electron app menu + native dialogs.\n *\n * The renderer has its own i18n (localStorage-backed, see renderer/src/i18n.ts),\n * but the MAIN process (Node) builds the application menu and native dialogs and\n * can't touch localStorage. This is a small, self-contained catalog for those\n * main-process strings. The locale is pushed from the renderer via the\n * 'desktop:set-locale' IPC channel (see preload.ts + renderer setLocale()).\n *\n * Defaults to 'en'; falls back to 'en' for any missing key.\n */\nexport type DesktopLocale = 'en' | 'tr' | 'de' | 'fr' | 'it' | 'es' | 'pt-BR';\n\ntype Catalog = Record<string, string>;\n\nconst en: Catalog = {\n windowTitle: 'WrongStack Desktop',\n noOpenProjectSessions: 'No open project sessions',\n revealProjectFolder: 'Reveal Project Folder',\n quickView: 'Quick View',\n chat: 'Chat',\n terminal: 'Terminal',\n session: 'Session',\n newSession: 'New Session',\n file: 'File',\n view: 'View',\n workspace: 'Workspace',\n projects: 'Projects',\n openProject: 'Open Project',\n registerProject: 'Register Project',\n openProjectEllipsis: 'Open Project…',\n registerProjectEllipsis: 'Register Project…',\n removeActiveFromRegistry: 'Remove Active Project from Registry',\n newSessionForActive: 'New Session for Active Project',\n settings: 'Settings',\n closeActiveRuntime: 'Close Active Runtime',\n openChat: 'Open Chat',\n focusPrompt: 'Focus Prompt',\n toggleTerminal: 'Toggle Terminal',\n newTerminal: 'New Terminal',\n files: 'Files',\n changes: 'Changes',\n sessions: 'Sessions',\n fleetHQ: 'Fleet HQ',\n commandPalette: 'Command Palette',\n modelSwitcher: 'Model Switcher',\n quickModelSwitcher: 'Quick Model Switcher',\n openInBrowser: 'Open in Browser',\n reloadWebui: 'Reload WebUI',\n reloadActiveWebui: 'Reload Active WebUI',\n closeSession: 'Close Session',\n yoloMode: 'YOLO Mode',\n nextPrediction: 'Next Prediction',\n contextAutoCompact: 'Context Auto Compact',\n compactDesktopSidebar: 'Compact Desktop Sidebar',\n};\n\nconst tr: Catalog = {\n windowTitle: 'WrongStack Desktop',\n noOpenProjectSessions: 'Açık proje oturumu yok',\n revealProjectFolder: 'Proje klasörünü göster',\n quickView: 'Hızlı görünüm',\n chat: 'Sohbet',\n terminal: 'Terminal',\n session: 'Oturum',\n newSession: 'Yeni Oturum',\n file: 'Dosya',\n view: 'Görünüm',\n workspace: 'Çalışma alanı',\n projects: 'Projeler',\n openProject: 'Proje Aç',\n registerProject: 'Proje Kaydet',\n openProjectEllipsis: 'Proje Aç…',\n registerProjectEllipsis: 'Proje Kaydet…',\n removeActiveFromRegistry: 'Aktif Projeyi Kayıttan Kaldır',\n newSessionForActive: 'Aktif Proje için Yeni Oturum',\n settings: 'Ayarlar',\n closeActiveRuntime: 'Aktif Çalışma Zamanını Kapat',\n openChat: 'Sohbeti Aç',\n focusPrompt: 'İsteme Odaklan',\n toggleTerminal: 'Terminali Aç/Kapat',\n newTerminal: 'Yeni Terminal',\n files: 'Dosyalar',\n changes: 'Değişiklikler',\n sessions: 'Oturumlar',\n fleetHQ: 'Filo HQ',\n commandPalette: 'Komut Paleti',\n modelSwitcher: 'Model Değiştirici',\n quickModelSwitcher: 'Hızlı Model Değiştirici',\n openInBrowser: 'Tarayıcıda Aç',\n reloadWebui: 'WebUI Yeniden Yükle',\n reloadActiveWebui: 'Aktif WebUI Yeniden Yükle',\n closeSession: 'Oturumu Kapat',\n yoloMode: 'YOLO Modu',\n nextPrediction: 'Sonraki Tahmin',\n contextAutoCompact: 'Bağlamı Otomatik Sıkıştır',\n compactDesktopSidebar: 'Masaüstü Kenar Çubuğunu Daralt',\n};\n\nconst de: Catalog = {\n windowTitle: 'WrongStack Desktop',\n noOpenProjectSessions: 'Keine offenen Projektsessions',\n revealProjectFolder: 'Projektordner anzeigen',\n quickView: 'Schnellansicht',\n chat: 'Chat',\n terminal: 'Terminal',\n session: 'Sitzung',\n newSession: 'Neue Sitzung',\n file: 'Datei',\n view: 'Ansicht',\n workspace: 'Workspace',\n projects: 'Projekte',\n openProject: 'Projekt öffnen',\n registerProject: 'Projekt registrieren',\n openProjectEllipsis: 'Projekt öffnen…',\n registerProjectEllipsis: 'Projekt registrieren…',\n removeActiveFromRegistry: 'Aktives Projekt aus Registry entfernen',\n newSessionForActive: 'Neue Sitzung für aktives Projekt',\n settings: 'Einstellungen',\n closeActiveRuntime: 'Aktive Runtime schließen',\n openChat: 'Chat öffnen',\n focusPrompt: 'Prompt fokussieren',\n toggleTerminal: 'Terminal umschalten',\n newTerminal: 'Neues Terminal',\n files: 'Dateien',\n changes: 'Änderungen',\n sessions: 'Sitzungen',\n fleetHQ: 'Fleet HQ',\n commandPalette: 'Command Palette',\n modelSwitcher: 'Modell-Umschalter',\n quickModelSwitcher: 'Schneller Modell-Umschalter',\n openInBrowser: 'Im Browser öffnen',\n reloadWebui: 'WebUI neu laden',\n reloadActiveWebui: 'Aktive WebUI neu laden',\n closeSession: 'Sitzung schließen',\n yoloMode: 'YOLO-Modus',\n nextPrediction: 'Next-Step-Vorhersage',\n contextAutoCompact: 'Kontext auto-kompaktieren',\n compactDesktopSidebar: 'Desktop-Seitenleiste einklappen',\n};\n\nconst fr: Catalog = {\n windowTitle: 'WrongStack Desktop',\n noOpenProjectSessions: 'Aucune session de projet ouverte',\n revealProjectFolder: 'Révéler le dossier du projet',\n quickView: 'Vue rapide',\n chat: 'Chat',\n terminal: 'Terminal',\n session: 'Session',\n newSession: 'Nouvelle session',\n file: 'Fichier',\n view: 'Affichage',\n workspace: 'Espace de travail',\n projects: 'Projets',\n openProject: 'Ouvrir un projet',\n registerProject: 'Enregistrer le projet',\n openProjectEllipsis: 'Ouvrir un projet…',\n registerProjectEllipsis: 'Enregistrer le projet…',\n removeActiveFromRegistry: \"Retirer le projet actif du registre\",\n newSessionForActive: 'Nouvelle session pour le projet actif',\n settings: 'Paramètres',\n closeActiveRuntime: \"Fermer l'exécution active\",\n openChat: 'Ouvrir le chat',\n focusPrompt: 'Focaliser le prompt',\n toggleTerminal: 'Basculer le terminal',\n newTerminal: 'Nouveau terminal',\n files: 'Fichiers',\n changes: 'Modifications',\n sessions: 'Sessions',\n fleetHQ: 'Fleet HQ',\n commandPalette: 'Palette de commandes',\n modelSwitcher: 'Sélecteur de modèle',\n quickModelSwitcher: 'Sélecteur de modèle rapide',\n openInBrowser: 'Ouvrir dans le navigateur',\n reloadWebui: 'Recharger WebUI',\n reloadActiveWebui: 'Recharger WebUI actif',\n closeSession: 'Fermer la session',\n yoloMode: 'Mode YOLO',\n nextPrediction: 'Prédiction du prochain pas',\n contextAutoCompact: 'Compacter le contexte auto',\n compactDesktopSidebar: 'Réduire la barre latérale',\n};\n\nconst it: Catalog = {\n windowTitle: 'WrongStack Desktop',\n noOpenProjectSessions: 'Nessuna sessione di progetto aperta',\n revealProjectFolder: 'Rivela cartella progetto',\n quickView: 'Vista rapida',\n chat: 'Chat',\n terminal: 'Terminale',\n session: 'Sessione',\n newSession: 'Nuova sessione',\n file: 'File',\n view: 'Visualizza',\n workspace: 'Workspace',\n projects: 'Progetti',\n openProject: 'Apri progetto',\n registerProject: 'Registra progetto',\n openProjectEllipsis: 'Apri progetto…',\n registerProjectEllipsis: 'Registra progetto…',\n removeActiveFromRegistry: 'Rimuovi progetto attivo dal registro',\n newSessionForActive: 'Nuova sessione per il progetto attivo',\n settings: 'Impostazioni',\n closeActiveRuntime: 'Chiudi runtime attivo',\n openChat: 'Apri chat',\n focusPrompt: 'Focalizza prompt',\n toggleTerminal: 'Attiva/disattiva terminale',\n newTerminal: 'Nuovo terminale',\n files: 'File',\n changes: 'Modifiche',\n sessions: 'Sessioni',\n fleetHQ: 'Fleet HQ',\n commandPalette: 'Palette comandi',\n modelSwitcher: 'Selettore modello',\n quickModelSwitcher: 'Selettore modello rapido',\n openInBrowser: 'Apri nel browser',\n reloadWebui: 'Ricarica WebUI',\n reloadActiveWebui: 'Ricarica WebUI attivo',\n closeSession: 'Chiudi sessione',\n yoloMode: 'Modalità YOLO',\n nextPrediction: 'Predizione prossimo passo',\n contextAutoCompact: 'Compatta contesto auto',\n compactDesktopSidebar: 'Comprimi barra laterale desktop',\n};\n\nconst es: Catalog = {\n windowTitle: 'WrongStack Desktop',\n noOpenProjectSessions: 'Sin sesiones de proyecto abiertas',\n revealProjectFolder: 'Revelar carpeta del proyecto',\n quickView: 'Vista rápida',\n chat: 'Chat',\n terminal: 'Terminal',\n session: 'Sesión',\n newSession: 'Nueva sesión',\n file: 'Archivo',\n view: 'Ver',\n workspace: 'Espacio de trabajo',\n projects: 'Proyectos',\n openProject: 'Abrir proyecto',\n registerProject: 'Registrar proyecto',\n openProjectEllipsis: 'Abrir proyecto…',\n registerProjectEllipsis: 'Registrar proyecto…',\n removeActiveFromRegistry: 'Quitar proyecto activo del registro',\n newSessionForActive: 'Nueva sesión para el proyecto activo',\n settings: 'Ajustes',\n closeActiveRuntime: 'Cerrar runtime activo',\n openChat: 'Abrir chat',\n focusPrompt: 'Focalizar indicación',\n toggleTerminal: 'Alternar terminal',\n newTerminal: 'Nuevo terminal',\n files: 'Archivos',\n changes: 'Cambios',\n sessions: 'Sesiones',\n fleetHQ: 'Fleet HQ',\n commandPalette: 'Paleta de comandos',\n modelSwitcher: 'Selector de modelo',\n quickModelSwitcher: 'Selector de modelo rápido',\n openInBrowser: 'Abrir en el navegador',\n reloadWebui: 'Recargar WebUI',\n reloadActiveWebui: 'Recargar WebUI activo',\n closeSession: 'Cerrar sesión',\n yoloMode: 'Modo YOLO',\n nextPrediction: 'Predicción del siguiente paso',\n contextAutoCompact: 'Auto-compactar contexto',\n compactDesktopSidebar: 'Contraer barra lateral de escritorio',\n};\n\nconst ptBR: Catalog = {\n windowTitle: 'WrongStack Desktop',\n noOpenProjectSessions: 'Sem sessões de projeto abertas',\n revealProjectFolder: 'Revelar pasta do projeto',\n quickView: 'Vista rápida',\n chat: 'Chat',\n terminal: 'Terminal',\n session: 'Sessão',\n newSession: 'Nova sessão',\n file: 'Arquivo',\n view: 'Ver',\n workspace: 'Workspace',\n projects: 'Projetos',\n openProject: 'Abrir projeto',\n registerProject: 'Registrar projeto',\n openProjectEllipsis: 'Abrir projeto…',\n registerProjectEllipsis: 'Registrar projeto…',\n removeActiveFromRegistry: 'Remover projeto ativo do registro',\n newSessionForActive: 'Nova sessão para o projeto ativo',\n settings: 'Configurações',\n closeActiveRuntime: 'Fechar runtime ativo',\n openChat: 'Abrir chat',\n focusPrompt: 'Focar prompt',\n toggleTerminal: 'Alternar terminal',\n newTerminal: 'Novo terminal',\n files: 'Arquivos',\n changes: 'Alterações',\n sessions: 'Sessões',\n fleetHQ: 'Fleet HQ',\n commandPalette: 'Paleta de comandos',\n modelSwitcher: 'Seletor de modelo',\n quickModelSwitcher: 'Seletor de modelo rápido',\n openInBrowser: 'Abrir no navegador',\n reloadWebui: 'Recarregar WebUI',\n reloadActiveWebui: 'Recarregar WebUI ativo',\n closeSession: 'Fechar sessão',\n yoloMode: 'Modo YOLO',\n nextPrediction: 'Previsão do próximo passo',\n contextAutoCompact: 'Auto-compactar contexto',\n compactDesktopSidebar: 'Recolher barra lateral do desktop',\n};\n\nconst CATALOGS: Record<DesktopLocale, Catalog> = { en, tr, de, fr, it, es, 'pt-BR': ptBR };\n\nlet mainLocale: DesktopLocale = 'en';\n\n/** Renderer pushes its locale here via the 'desktop:set-locale' IPC channel. */\nexport function setMainLocale(locale: string): void {\n if (locale in CATALOGS) mainLocale = locale as DesktopLocale;\n}\n\n/** Current main-process locale (for the boot push to the shell renderer). */\nexport function getMainLocale(): DesktopLocale {\n return mainLocale;\n}\n\n/** Translate a main-process key, falling back to en then the key itself. */\nexport function tMain(key: string): string {\n return CATALOGS[mainLocale]?.[key] ?? CATALOGS.en[key] ?? key;\n}\n","/**\n * Desktop-shell read/write of the shared display language (`Config.uiLocale`).\n *\n * The desktop main process can't use the WebUI's localStorage-backed i18n, and\n * it isn't a WS client, so it touches `~/.wrongstack/config.json` directly to\n * (a) read the language at boot and (b) persist a change made in the shell —\n * using the SAME read → decrypt → mutate → encrypt → atomicWrite cycle as the\n * WebUI server (`pref-helpers.updateGlobalConfig`) so encrypted secrets in the\n * file are preserved byte-for-byte.\n *\n * The standalone WebUI's `watchProviderConfig` (now surfacing `uiLocale`) lets\n * a running shell follow a language change written by any other process.\n */\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\nimport { DefaultSecretVault } from '@wrongstack/core';\nimport { decryptConfigSecrets, encryptConfigSecrets } from '@wrongstack/core/security';\nimport { atomicWrite, wstackGlobalRoot } from '@wrongstack/core/utils';\nimport type { SecretVault } from '@wrongstack/core';\n\nconst globalConfigPath = path.join(wstackGlobalRoot(), 'config.json');\nconst vault: SecretVault = new DefaultSecretVault({\n keyFile: path.join(wstackGlobalRoot(), '.key'),\n});\n\n/** Read the persisted display language, or undefined when unset/unreadable. */\nexport async function readUiLocale(): Promise<string | undefined> {\n let raw: string;\n try {\n raw = await fs.readFile(globalConfigPath, 'utf8');\n } catch {\n return undefined;\n }\n try {\n const decrypted = decryptConfigSecrets(\n JSON.parse(raw) as Record<string, unknown>,\n vault,\n ) as { uiLocale?: string };\n const value = decrypted.uiLocale;\n return typeof value === 'string' && value ? value : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** The global config path + vault, for the live watcher in main.ts. */\nexport const desktopConfigPaths = { globalConfigPath, vault } as const;\n\n/**\n * Persist a display-language change. Refuses to overwrite a corrupt config\n * (the operator should fix it). Best-effort: never throws to the caller.\n */\nexport async function writeUiLocale(code: string): Promise<void> {\n let raw: string;\n try {\n raw = await fs.readFile(globalConfigPath, 'utf8');\n } catch {\n raw = '{}';\n }\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(raw) as Record<string, unknown>;\n } catch {\n return; // corrupt config — don't clobber\n }\n const decrypted = decryptConfigSecrets(parsed, vault) as Record<string, unknown>;\n decrypted.uiLocale = code;\n const encrypted = encryptConfigSecrets(decrypted, vault);\n await atomicWrite(globalConfigPath, JSON.stringify(encrypted, null, 2), { mode: 0o600 });\n}\n","import { type ChildProcess, spawn } from 'node:child_process';\nimport { randomBytes } from 'node:crypto';\nimport { EventEmitter } from 'node:events';\nimport * as fs from 'node:fs/promises';\nimport * as http from 'node:http';\nimport { createRequire } from 'node:module';\nimport * as net from 'node:net';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { atomicWrite, projectSlug, toErrorMessage, wstackGlobalRoot } from '@wrongstack/core/utils';\nimport type {\n DesktopProjectEntry,\n DesktopRuntimeKind,\n DesktopRuntimeRecord,\n DesktopStateSnapshot,\n DesktopWindowState,\n} from '../shared/types.js';\n\ninterface DesktopStateFile {\n recentProjects?: DesktopProjectEntry[] | undefined;\n openProjects?: string[] | undefined;\n openProjectSessions?: DesktopProjectSessionState[] | undefined;\n activeRuntimeId?: string | null | undefined;\n activeProjectRoot?: string | null | undefined;\n window?: DesktopWindowState | undefined;\n}\n\ninterface DesktopProjectSessionState {\n runtimeId?: string | undefined;\n name?: string | undefined;\n root: string;\n startedAt?: string | undefined;\n}\n\ninterface RuntimeInternal extends DesktopRuntimeRecord {\n child: ChildProcess | null;\n token: string;\n logs: string[];\n logNotifyTimer: ReturnType<typeof setTimeout> | null;\n}\n\ninterface OpenProjectOptions {\n name?: string | undefined;\n kind?: DesktopRuntimeKind | undefined;\n touchRecent?: boolean | undefined;\n forceNew?: boolean | undefined;\n runtimeId?: string | undefined;\n}\n\nconst HTTP_PORT_START = 34560;\nconst WS_PORT_START = 34660;\nconst START_TIMEOUT_MS = 30_000;\nconst MIN_WINDOW_WIDTH = 760;\nconst MIN_WINDOW_HEIGHT = 520;\n\nexport class DesktopRuntimeManager extends EventEmitter {\n private readonly runtimes = new Map<string, RuntimeInternal>();\n private readonly stateFile = path.join(wstackGlobalRoot(), 'desktop.json');\n private recentProjects: DesktopProjectEntry[] = [];\n private registeredProjects: DesktopProjectEntry[] = [];\n private restoreProjectSessions: DesktopProjectSessionState[] = [];\n private restoreActiveRuntimeId: string | null = null;\n private restoreActiveProjectRoot: string | null = null;\n private lastActiveProjectRoot: string | null = null;\n private windowState: DesktopWindowState | null = null;\n private activeRuntimeId: string | null = null;\n private restoring = false;\n private workspaceRestoreCompleted = false;\n\n async init(): Promise<void> {\n const state = await this.loadDesktopState();\n this.recentProjects = state.recentProjects;\n this.registeredProjects = await readGlobalProjectManifest();\n this.restoreProjectSessions = state.openProjectSessions;\n this.restoreActiveRuntimeId = state.activeRuntimeId;\n this.restoreActiveProjectRoot = state.activeProjectRoot;\n this.lastActiveProjectRoot = state.activeProjectRoot;\n this.windowState = state.window;\n }\n\n snapshot(): DesktopStateSnapshot {\n return {\n activeRuntimeId: this.activeRuntimeId,\n runtimes: Array.from(this.runtimes.values()).map(publicRuntime),\n recentProjects: [...this.recentProjects],\n registeredProjects: [...this.registeredProjects],\n restoring: this.restoring,\n };\n }\n\n getWindowState(): DesktopWindowState | null {\n return this.windowState ? { ...this.windowState } : null;\n }\n\n async saveWindowState(window: DesktopWindowState): Promise<void> {\n this.windowState = { ...window };\n await this.saveDesktopState();\n }\n\n async restoreLastWorkspace(): Promise<void> {\n const sessions = this.restoreProjectSessions.filter(\n (session) => typeof session.root === 'string' && session.root.trim(),\n );\n if (sessions.length === 0 || this.restoring || this.runtimes.size > 0) {\n this.workspaceRestoreCompleted = true;\n return;\n }\n this.restoring = true;\n this.emitChanged();\n try {\n const seen = new Map<string, number>();\n for (const session of sessions) {\n const key = pathKey(session.root);\n const seenCount = seen.get(key) ?? 0;\n seen.set(key, seenCount + 1);\n await this.openProject(session.root, {\n forceNew: seenCount > 0,\n name: session.name,\n runtimeId: session.runtimeId,\n }).catch((err) => {\n process.stderr.write(\n `[desktop:restore] Failed to restore ${session.root}: ${toErrorMessage(err)}\\n`,\n );\n });\n }\n let restoredActive = false;\n if (this.restoreActiveRuntimeId) {\n const active = this.runtimes.get(this.restoreActiveRuntimeId);\n if (active) {\n await this.activateRuntime(active.id);\n restoredActive = true;\n }\n }\n if (!restoredActive && this.restoreActiveProjectRoot) {\n const active = Array.from(this.runtimes.values()).find((runtime) =>\n samePath(runtime.root, this.restoreActiveProjectRoot ?? ''),\n );\n if (active) await this.activateRuntime(active.id);\n }\n } finally {\n this.restoring = false;\n this.workspaceRestoreCompleted = true;\n this.emitChanged();\n await this.saveDesktopState();\n }\n }\n\n getRuntime(id: string): DesktopRuntimeRecord | undefined {\n const runtime = this.runtimes.get(id);\n return runtime ? publicRuntime(runtime) : undefined;\n }\n\n getRuntimeUrlWithToken(id: string): string | undefined {\n const runtime = this.runtimes.get(id);\n if (!runtime) return undefined;\n const url = new URL(runtime.url);\n url.searchParams.set('token', runtime.token);\n url.searchParams.set('shell', 'desktop');\n return url.toString();\n }\n\n getRuntimeWsUrlWithToken(id: string): string | undefined {\n const runtime = this.runtimes.get(id);\n if (!runtime) return undefined;\n const url = new URL(`ws://127.0.0.1:${runtime.wsPort}`);\n url.searchParams.set('token', runtime.token);\n return url.toString();\n }\n\n async openProject(\n projectRoot: string,\n options: OpenProjectOptions = {},\n ): Promise<DesktopRuntimeRecord> {\n const resolved = path.resolve(projectRoot);\n const stat = await fs.stat(resolved).catch(() => null);\n if (!stat?.isDirectory()) throw new Error(`Not a directory: ${resolved}`);\n const kind = options.kind ?? 'project';\n const touchRecent = options.touchRecent ?? kind === 'project';\n const forceNew = options.forceNew === true;\n\n if (!forceNew) {\n const existing = Array.from(this.runtimes.values()).find(\n (runtime) =>\n samePath(runtime.root, resolved) &&\n runtime.kind === kind &&\n (runtime.status === 'starting' || runtime.status === 'running'),\n );\n if (existing) {\n this.activeRuntimeId = existing.id;\n if (existing.kind === 'project') this.lastActiveProjectRoot = existing.root;\n if (touchRecent) {\n await this.touchProject(existing.root);\n } else {\n await this.persistWorkspaceState();\n }\n this.emitChanged();\n return publicRuntime(existing);\n }\n const staleSameRoot = Array.from(this.runtimes.values()).filter(\n (runtime) => samePath(runtime.root, resolved) && runtime.kind === kind,\n );\n for (const stale of staleSameRoot) {\n await this.closeRuntimeInternal(stale.id, { persistWorkspace: false });\n }\n }\n\n const slug = projectSlug(resolved);\n const requestedRuntimeId = normalizeRuntimeId(options.runtimeId);\n const runtimeId =\n requestedRuntimeId && !this.runtimes.has(requestedRuntimeId)\n ? requestedRuntimeId\n : `${slug}-${randomBytes(3).toString('hex')}`;\n const name = options.name ?? nextRuntimeName(this.runtimes, resolved, kind);\n const httpPort = await findFreePort(HTTP_PORT_START, usedPorts(this.runtimes));\n const wsPort = await findFreePort(\n WS_PORT_START,\n new Set([...usedPorts(this.runtimes), httpPort]),\n );\n const token = randomBytes(24).toString('hex');\n const runtime: RuntimeInternal = {\n id: runtimeId,\n name,\n root: resolved,\n slug,\n kind,\n status: 'starting',\n httpPort,\n wsPort,\n url: `http://127.0.0.1:${httpPort}`,\n startedAt: new Date().toISOString(),\n token,\n child: null,\n logs: [],\n logNotifyTimer: null,\n };\n this.runtimes.set(runtimeId, runtime);\n this.activeRuntimeId = runtimeId;\n if (kind === 'project') this.lastActiveProjectRoot = resolved;\n if (touchRecent) {\n await this.touchProject(resolved);\n } else {\n await this.persistWorkspaceState();\n }\n this.emitChanged();\n\n try {\n const entry = resolveWebUiEntry();\n const child = spawn(\n process.execPath,\n [\n entry,\n '--host',\n '127.0.0.1',\n '--port',\n String(httpPort),\n '--ws-port',\n String(wsPort),\n '--token',\n token,\n '--require-token',\n ],\n {\n cwd: resolved,\n env: {\n ...process.env,\n ELECTRON_RUN_AS_NODE: '1',\n WEBUI_STRICT_PORT: '1',\n WRONGSTACK_DESKTOP: '1',\n },\n stdio: ['ignore', 'pipe', 'pipe'],\n windowsHide: true,\n },\n );\n runtime.child = child;\n runtime.pid = child.pid;\n child.stdout?.on('data', (chunk: Buffer) => {\n const text = chunk.toString();\n appendRuntimeLog(runtime, 'stdout', text);\n this.scheduleLogChanged(runtime);\n process.stdout.write(`[desktop:${runtime.id}] ${text}`);\n });\n child.stderr?.on('data', (chunk: Buffer) => {\n const text = chunk.toString();\n appendRuntimeLog(runtime, 'stderr', text);\n this.scheduleLogChanged(runtime);\n process.stderr.write(`[desktop:${runtime.id}] ${text}`);\n });\n child.once('exit', (code, signal) => {\n runtime.status = runtime.status === 'error' ? 'error' : 'stopped';\n runtime.error =\n runtime.status === 'error'\n ? runtime.error\n : code === 0\n ? undefined\n : `Exited with ${signal ?? `code ${code ?? 'unknown'}`}`;\n runtime.child = null;\n if (this.activeRuntimeId === runtime.id) {\n this.activeRuntimeId = firstRunningRuntimeId(this.runtimes);\n }\n this.emitChanged();\n });\n\n await waitForHttpReady(runtime.url, token, START_TIMEOUT_MS);\n runtime.status = 'running';\n await this.persistWorkspaceState();\n this.emitChanged();\n return publicRuntime(runtime);\n } catch (err) {\n runtime.status = 'error';\n runtime.error = toErrorMessage(err);\n await terminateProcessTree(runtime.child);\n runtime.child = null;\n this.emitChanged();\n throw err;\n }\n }\n\n async activateRuntime(id: string): Promise<void> {\n const runtime = this.runtimes.get(id);\n if (!runtime) throw new Error(`Runtime not found: ${id}`);\n this.activeRuntimeId = id;\n if (runtime.kind === 'project') this.lastActiveProjectRoot = runtime.root;\n if (runtime.kind === 'project') {\n await this.touchProject(runtime.root);\n } else {\n await this.persistWorkspaceState();\n }\n this.emitChanged();\n }\n\n async closeRuntime(id: string): Promise<void> {\n await this.closeRuntimeInternal(id, { persistWorkspace: true });\n }\n\n async closeAll(options: { persistWorkspace?: boolean } = {}): Promise<void> {\n const persistWorkspace = options.persistWorkspace ?? true;\n await Promise.all(\n Array.from(this.runtimes.keys()).map((id) =>\n this.closeRuntimeInternal(id, { persistWorkspace }),\n ),\n );\n }\n\n async registerProject(projectRoot: string): Promise<void> {\n const resolved = path.resolve(projectRoot);\n const stat = await fs.stat(resolved).catch(() => null);\n if (!stat?.isDirectory()) throw new Error(`Not a directory: ${resolved}`);\n const now = new Date().toISOString();\n const entry: DesktopProjectEntry = {\n name: path.basename(resolved) || resolved,\n root: resolved,\n slug: projectSlug(resolved),\n lastSeen: now,\n lastWorkingDir: resolved,\n };\n this.registeredProjects = await touchGlobalProjectManifest(entry);\n this.emitChanged();\n }\n\n async unregisterProject(projectRoot: string): Promise<void> {\n const resolved = path.resolve(projectRoot);\n this.registeredProjects = await removeGlobalProjectManifest(resolved);\n this.recentProjects = this.recentProjects.filter((project) => !samePath(project.root, resolved));\n await this.saveDesktopState();\n this.emitChanged();\n }\n\n private async closeRuntimeInternal(\n id: string,\n options: { persistWorkspace: boolean },\n ): Promise<void> {\n const runtime = this.runtimes.get(id);\n if (!runtime) return;\n runtime.status = 'stopped';\n const child = runtime.child;\n runtime.child = null;\n await terminateProcessTree(child);\n if (runtime.logNotifyTimer) {\n clearTimeout(runtime.logNotifyTimer);\n runtime.logNotifyTimer = null;\n }\n this.runtimes.delete(id);\n if (this.activeRuntimeId === id) this.activeRuntimeId = firstRunningRuntimeId(this.runtimes);\n if (this.lastActiveProjectRoot && samePath(this.lastActiveProjectRoot, runtime.root)) {\n this.lastActiveProjectRoot = firstProjectRuntimeRoot(this.runtimes);\n }\n if (options.persistWorkspace) {\n await this.persistWorkspaceState();\n }\n this.emitChanged();\n }\n\n private async touchProject(projectRoot: string): Promise<void> {\n const resolved = path.resolve(projectRoot);\n const now = new Date().toISOString();\n const entry: DesktopProjectEntry = {\n name: path.basename(resolved) || resolved,\n root: resolved,\n slug: projectSlug(resolved),\n lastSeen: now,\n lastWorkingDir: resolved,\n };\n this.recentProjects = [\n entry,\n ...this.recentProjects.filter((p) => !samePath(p.root, resolved)),\n ].slice(0, 24);\n const [, registeredProjects] = await Promise.all([\n this.saveDesktopState(),\n touchGlobalProjectManifest(entry),\n ]);\n this.registeredProjects = registeredProjects;\n }\n\n private async persistWorkspaceState(): Promise<void> {\n await this.saveDesktopState();\n }\n\n private async loadDesktopState(): Promise<{\n recentProjects: DesktopProjectEntry[];\n openProjects: string[];\n openProjectSessions: DesktopProjectSessionState[];\n activeRuntimeId: string | null;\n activeProjectRoot: string | null;\n window: DesktopWindowState | null;\n }> {\n try {\n const raw = await fs.readFile(this.stateFile, 'utf8');\n const parsed = JSON.parse(raw) as DesktopStateFile;\n const openProjects = normalizePathList(parsed.openProjects);\n const openProjectSessions = normalizeSessionStateList(\n parsed.openProjectSessions,\n openProjects,\n );\n return {\n recentProjects: Array.isArray(parsed.recentProjects) ? parsed.recentProjects : [],\n openProjects,\n openProjectSessions,\n activeRuntimeId: normalizeRuntimeId(parsed.activeRuntimeId) ?? null,\n activeProjectRoot:\n typeof parsed.activeProjectRoot === 'string' && parsed.activeProjectRoot.trim()\n ? path.resolve(parsed.activeProjectRoot)\n : null,\n window: normalizeWindowState(parsed.window),\n };\n } catch {\n return {\n recentProjects: [],\n openProjects: [],\n openProjectSessions: [],\n activeRuntimeId: null,\n activeProjectRoot: null,\n window: null,\n };\n }\n }\n\n private async saveDesktopState(): Promise<void> {\n await fs.mkdir(path.dirname(this.stateFile), { recursive: true });\n const liveProjectSessions = Array.from(this.runtimes.values())\n .filter((runtime) => runtime.status !== 'stopped' && runtime.kind === 'project')\n .map((runtime) => runtimeToSessionState(runtime));\n const openProjectSessions =\n liveProjectSessions.length === 0 && !this.workspaceRestoreCompleted\n ? [...this.restoreProjectSessions]\n : liveProjectSessions;\n const openProjects = openProjectSessions.map((session) => session.root);\n const activeRuntime = this.activeRuntimeId ? this.runtimes.get(this.activeRuntimeId) : null;\n const lastActiveProjectRoot = this.lastActiveProjectRoot;\n const fallbackSession =\n lastActiveProjectRoot\n ? openProjectSessions.find((session) => samePath(session.root, lastActiveProjectRoot))\n : undefined;\n const activeSession =\n activeRuntime?.kind === 'project'\n ? runtimeToSessionState(activeRuntime)\n : (fallbackSession ?? openProjectSessions[0]);\n const activeRoot = activeSession?.root;\n const activeRuntimeId = activeSession?.runtimeId ?? null;\n await atomicWrite(\n this.stateFile,\n `${JSON.stringify(\n {\n recentProjects: this.recentProjects,\n openProjects,\n openProjectSessions,\n activeRuntimeId,\n activeProjectRoot: activeRoot ?? null,\n window: this.windowState,\n },\n null,\n 2,\n )}\\n`,\n { mode: 0o600 },\n );\n }\n\n private emitChanged(): void {\n this.emit('changed');\n }\n\n private scheduleLogChanged(runtime: RuntimeInternal): void {\n if (runtime.logNotifyTimer) return;\n runtime.logNotifyTimer = setTimeout(() => {\n runtime.logNotifyTimer = null;\n if (this.runtimes.get(runtime.id) === runtime) {\n this.emitChanged();\n }\n }, 250);\n }\n}\n\nasync function terminateProcessTree(child: ChildProcess | null): Promise<void> {\n if (!child || child.killed || !child.pid) return;\n if (process.platform !== 'win32') {\n child.kill('SIGTERM');\n return;\n }\n\n await new Promise<void>((resolve) => {\n let settled = false;\n const finish = () => {\n if (settled) return;\n settled = true;\n resolve();\n };\n const timer = setTimeout(finish, 3000);\n timer.unref?.();\n const killer = spawn('taskkill', ['/PID', String(child.pid), '/T', '/F'], {\n stdio: 'ignore',\n windowsHide: true,\n });\n killer.once('exit', () => {\n clearTimeout(timer);\n finish();\n });\n killer.once('error', () => {\n clearTimeout(timer);\n child.kill();\n finish();\n });\n });\n}\n\nfunction publicRuntime(runtime: RuntimeInternal): DesktopRuntimeRecord {\n const {\n child: _child,\n token: _token,\n logs,\n logNotifyTimer: _logNotifyTimer,\n ...record\n } = runtime;\n void _child;\n void _token;\n void _logNotifyTimer;\n return {\n ...record,\n recentLogs: logs.slice(-40),\n };\n}\n\nfunction runtimeToSessionState(runtime: RuntimeInternal): DesktopProjectSessionState {\n return {\n runtimeId: runtime.id,\n name: runtime.name,\n root: runtime.root,\n startedAt: runtime.startedAt,\n };\n}\n\nfunction appendRuntimeLog(runtime: RuntimeInternal, stream: 'stdout' | 'stderr', text: string): void {\n for (const rawLine of text.split(/\\r?\\n/)) {\n const line = rawLine.trimEnd();\n if (!line) continue;\n runtime.logs.push(`[${stream}] ${line}`);\n }\n if (runtime.logs.length > 120) {\n runtime.logs.splice(0, runtime.logs.length - 120);\n }\n}\n\nfunction normalizePathList(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n const roots: string[] = [];\n for (const item of value) {\n if (typeof item !== 'string' || !item.trim()) continue;\n const resolved = path.resolve(item);\n roots.push(resolved);\n }\n return roots.slice(0, 12);\n}\n\nfunction normalizeSessionStateList(\n value: unknown,\n fallbackRoots: string[],\n): DesktopProjectSessionState[] {\n if (!Array.isArray(value)) {\n return fallbackRoots.map((root) => ({ root })).slice(0, 12);\n }\n const sessions: DesktopProjectSessionState[] = [];\n for (const item of value) {\n if (!item || typeof item !== 'object') continue;\n const candidate = item as Partial<DesktopProjectSessionState>;\n if (typeof candidate.root !== 'string' || !candidate.root.trim()) continue;\n const session: DesktopProjectSessionState = {\n root: path.resolve(candidate.root),\n };\n const runtimeId = normalizeRuntimeId(candidate.runtimeId);\n if (runtimeId) session.runtimeId = runtimeId;\n if (typeof candidate.name === 'string' && candidate.name.trim()) {\n session.name = candidate.name.trim().slice(0, 120);\n }\n if (typeof candidate.startedAt === 'string' && candidate.startedAt.trim()) {\n session.startedAt = candidate.startedAt.trim();\n }\n sessions.push(session);\n }\n return sessions.slice(0, 12);\n}\n\nfunction normalizeRuntimeId(value: unknown): string | undefined {\n if (typeof value !== 'string') return undefined;\n const trimmed = value.trim();\n if (!/^[a-zA-Z0-9._:-]{3,120}$/.test(trimmed)) return undefined;\n return trimmed;\n}\n\nfunction normalizeWindowState(value: unknown): DesktopWindowState | null {\n if (!value || typeof value !== 'object') return null;\n const candidate = value as Partial<DesktopWindowState>;\n const width = Number(candidate.width);\n const height = Number(candidate.height);\n if (!Number.isFinite(width) || !Number.isFinite(height)) return null;\n if (width < MIN_WINDOW_WIDTH || height < MIN_WINDOW_HEIGHT) return null;\n const state: DesktopWindowState = {\n width: Math.round(width),\n height: Math.round(height),\n maximized: Boolean(candidate.maximized),\n };\n if (Number.isFinite(Number(candidate.x))) state.x = Math.round(Number(candidate.x));\n if (Number.isFinite(Number(candidate.y))) state.y = Math.round(Number(candidate.y));\n return state;\n}\n\nfunction firstRunningRuntimeId(runtimes: Map<string, RuntimeInternal>): string | null {\n return Array.from(runtimes.values()).find((runtime) => runtime.status === 'running')?.id ?? null;\n}\n\nfunction firstProjectRuntimeRoot(runtimes: Map<string, RuntimeInternal>): string | null {\n return (\n Array.from(runtimes.values()).find(\n (runtime) => runtime.status === 'running' && runtime.kind === 'project',\n )?.root ?? null\n );\n}\n\nfunction usedPorts(runtimes: Map<string, RuntimeInternal>): Set<number> {\n const ports = new Set<number>();\n for (const runtime of runtimes.values()) {\n ports.add(runtime.httpPort);\n ports.add(runtime.wsPort);\n }\n return ports;\n}\n\nfunction nextRuntimeName(\n runtimes: Map<string, RuntimeInternal>,\n root: string,\n kind: DesktopRuntimeKind,\n): string {\n const baseName = path.basename(root) || root;\n if (kind !== 'project') return baseName;\n const liveSameRoot = Array.from(runtimes.values()).filter(\n (runtime) =>\n runtime.kind === 'project' &&\n samePath(runtime.root, root) &&\n runtime.status !== 'stopped',\n ).length;\n return liveSameRoot === 0 ? baseName : `${baseName} #${liveSameRoot + 1}`;\n}\n\nfunction pathKey(value: string): string {\n const resolved = path.resolve(value);\n return os.platform() === 'win32' ? resolved.toLowerCase() : resolved;\n}\n\nasync function findFreePort(startPort: number, exclude: Set<number>): Promise<number> {\n for (let port = startPort; port < startPort + 200; port++) {\n if (exclude.has(port)) continue;\n if (await isPortFree(port)) return port;\n }\n throw new Error(`No free local port found near ${startPort}`);\n}\n\nfunction isPortFree(port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const server = net.createServer();\n server.once('error', () => resolve(false));\n server.once('listening', () => {\n server.close(() => resolve(true));\n });\n server.listen(port, '127.0.0.1');\n });\n}\n\nfunction waitForHttpReady(baseUrl: string, token: string, timeoutMs: number): Promise<void> {\n const deadline = Date.now() + timeoutMs;\n const url = new URL(baseUrl);\n url.searchParams.set('token', token);\n url.searchParams.set('shell', 'desktop');\n\n return new Promise((resolve, reject) => {\n const probe = (): void => {\n const req = http.get(url, (res) => {\n res.resume();\n if (res.statusCode && res.statusCode >= 200 && res.statusCode < 500) {\n resolve();\n return;\n }\n retry();\n });\n req.once('error', retry);\n req.setTimeout(1000, () => {\n req.destroy();\n retry();\n });\n };\n const retry = (): void => {\n if (Date.now() >= deadline) {\n reject(new Error(`WebUI did not become ready at ${baseUrl}`));\n return;\n }\n setTimeout(probe, 250);\n };\n probe();\n });\n}\n\nfunction resolveWebUiEntry(): string {\n if (process.env['WRONGSTACK_WEBUI_ENTRY']) {\n return path.resolve(process.env['WRONGSTACK_WEBUI_ENTRY']);\n }\n const require = createRequire(import.meta.url);\n const serverIndex = require.resolve('@wrongstack/webui/server');\n return path.join(path.dirname(serverIndex), 'entry.js');\n}\n\nasync function readGlobalProjectManifest(): Promise<DesktopProjectEntry[]> {\n const manifestFile = path.join(wstackGlobalRoot(), 'projects.json');\n try {\n const raw = await fs.readFile(manifestFile, 'utf8');\n const parsed = JSON.parse(raw) as { projects?: DesktopProjectEntry[] | undefined };\n const projects = Array.isArray(parsed.projects) ? parsed.projects : [];\n return projects\n .filter((project) => typeof project?.root === 'string' && project.root.trim())\n .map((project) => ({\n ...project,\n name: project.name || path.basename(project.root) || project.root,\n root: path.resolve(project.root),\n slug: project.slug || projectSlug(path.resolve(project.root)),\n }))\n .sort((a, b) => (b.lastSeen ?? b.createdAt ?? '').localeCompare(a.lastSeen ?? a.createdAt ?? ''))\n .slice(0, 80);\n } catch {\n return [];\n }\n}\n\nasync function touchGlobalProjectManifest(entry: DesktopProjectEntry): Promise<DesktopProjectEntry[]> {\n const manifestFile = path.join(wstackGlobalRoot(), 'projects.json');\n const projects = await readGlobalProjectManifest();\n const existing = projects.find((p) => samePath(p.root, entry.root));\n if (existing) {\n existing.name = entry.name;\n existing.slug = entry.slug;\n existing.lastSeen = entry.lastSeen;\n existing.lastWorkingDir = entry.lastWorkingDir;\n } else {\n projects.push({ ...entry, createdAt: entry.lastSeen });\n }\n const sorted = projects\n .sort((a, b) => (b.lastSeen ?? b.createdAt ?? '').localeCompare(a.lastSeen ?? a.createdAt ?? ''))\n .slice(0, 80);\n await fs.mkdir(path.dirname(manifestFile), { recursive: true });\n await atomicWrite(manifestFile, `${JSON.stringify({ projects: sorted }, null, 2)}\\n`, { mode: 0o600 });\n return sorted;\n}\n\nasync function removeGlobalProjectManifest(projectRoot: string): Promise<DesktopProjectEntry[]> {\n const manifestFile = path.join(wstackGlobalRoot(), 'projects.json');\n const resolved = path.resolve(projectRoot);\n const projects = (await readGlobalProjectManifest()).filter(\n (project) => !samePath(project.root, resolved),\n );\n await fs.mkdir(path.dirname(manifestFile), { recursive: true });\n await atomicWrite(manifestFile, `${JSON.stringify({ projects }, null, 2)}\\n`, { mode: 0o600 });\n return projects;\n}\n\nfunction samePath(left: string, right: string): boolean {\n const a = path.resolve(left);\n const b = path.resolve(right);\n return os.platform() === 'win32' ? a.toLowerCase() === b.toLowerCase() : a === b;\n}\n\nexport function rendererIndexPath(): string {\n return fileURLToPath(new URL('../renderer/index.html', import.meta.url));\n}\n\nexport function preloadPath(): string {\n return fileURLToPath(new URL('../preload/preload.cjs', import.meta.url));\n}\n\nexport function webuiPreloadPath(): string {\n return fileURLToPath(new URL('../preload/webui-preload.cjs', import.meta.url));\n}\n\n/**\n * Filesystem root for the built-in \"Global Settings\" workspace.\n *\n * The desktop shell opens this directory as a `global-settings` runtime so the\n * user can edit provider/config state without an actual project checkout. It\n * lives under the WrongStack global root next to `desktop.json` and\n * `projects.json`.\n */\nexport function desktopSettingsWorkspaceRoot(): string {\n return path.join(wstackGlobalRoot(), 'settings');\n}\n","import type { DesktopWebuiCommand } from '../shared/types.js';\n\ntype DesktopCommandAction = NonNullable<DesktopWebuiCommand['action']>;\ntype DesktopCommandView = NonNullable<DesktopWebuiCommand['view']>;\ntype DesktopCommandActivity = NonNullable<DesktopWebuiCommand['activity']>;\ntype DesktopCommandOverlay = NonNullable<DesktopWebuiCommand['overlay']>;\ntype DesktopCommandDockSection = NonNullable<DesktopWebuiCommand['dockSection']>;\ntype DesktopCommandWorkTab = NonNullable<DesktopWebuiCommand['workTab']>;\ntype DesktopCommandPrefKey = NonNullable<DesktopWebuiCommand['pref']>['key'];\n\nconst DESKTOP_WEBUI_ACTIONS = new Set<DesktopCommandAction>([\n 'new-session',\n 'clear-context',\n 'compact-context',\n 'repair-context',\n 'download-chat',\n 'focus-chat',\n 'open-command-palette',\n 'open-shortcuts',\n 'search-chat',\n 'open-model-switcher',\n 'open-prompt-library',\n]);\n\nconst DESKTOP_WEBUI_VIEWS = new Set<DesktopCommandView>([\n 'chat',\n 'settings',\n 'autophase',\n 'specs',\n 'sddboard',\n 'sddwizard',\n 'files',\n 'changes',\n 'sessions',\n 'setup',\n 'skill',\n 'officemap',\n 'mailbox',\n 'debug',\n 'design-gallery',\n 'refresh-debug',\n 'analytics',\n]);\n\nconst DESKTOP_WEBUI_ACTIVITIES = new Set<DesktopCommandActivity>([\n 'chat',\n 'agents',\n 'history',\n 'files',\n 'changes',\n 'mailbox',\n 'skills',\n 'design',\n 'worktrees',\n 'officemap',\n]);\n\nconst DESKTOP_WEBUI_OVERLAYS = new Set<DesktopCommandOverlay>([\n 'fleet',\n 'agents-monitor',\n 'processes',\n 'queue',\n]);\n\nconst DESKTOP_WEBUI_DOCKS = new Set<DesktopCommandDockSection>([\n 'autophase',\n 'goal',\n 'fleet',\n 'work',\n 'worktrees',\n 'collab',\n]);\n\nconst DESKTOP_WEBUI_WORK_TABS = new Set<DesktopCommandWorkTab>(['todos', 'tasks', 'plan']);\nconst DESKTOP_WEBUI_PREF_KEYS = new Set<DesktopCommandPrefKey>([\n 'yolo',\n 'nextPrediction',\n 'contextAutoCompact',\n]);\n\nexport function normalizeDesktopWebuiCommand(value: unknown): DesktopWebuiCommand | null {\n if (!isRecord(value)) return null;\n const command: DesktopWebuiCommand = {};\n let hasCommand = false;\n\n const action = value['action'];\n if (action !== undefined) {\n if (typeof action !== 'string' || !DESKTOP_WEBUI_ACTIONS.has(action as DesktopCommandAction)) {\n return null;\n }\n command.action = action as DesktopCommandAction;\n hasCommand = true;\n }\n\n const view = value['view'];\n if (view !== undefined) {\n if (typeof view !== 'string' || !DESKTOP_WEBUI_VIEWS.has(view as DesktopCommandView)) {\n return null;\n }\n command.view = view as DesktopCommandView;\n hasCommand = true;\n }\n\n const activity = value['activity'];\n if (activity !== undefined) {\n if (\n typeof activity !== 'string' ||\n !DESKTOP_WEBUI_ACTIVITIES.has(activity as DesktopCommandActivity)\n ) {\n return null;\n }\n command.activity = activity as DesktopCommandActivity;\n hasCommand = true;\n }\n\n const overlay = value['overlay'];\n if (overlay !== undefined) {\n if (typeof overlay !== 'string' || !DESKTOP_WEBUI_OVERLAYS.has(overlay as DesktopCommandOverlay)) {\n return null;\n }\n command.overlay = overlay as DesktopCommandOverlay;\n hasCommand = true;\n }\n\n const dockSection = value['dockSection'];\n if (dockSection !== undefined) {\n if (\n typeof dockSection !== 'string' ||\n !DESKTOP_WEBUI_DOCKS.has(dockSection as DesktopCommandDockSection)\n ) {\n return null;\n }\n command.dockSection = dockSection as DesktopCommandDockSection;\n hasCommand = true;\n }\n\n const workTab = value['workTab'];\n if (workTab !== undefined) {\n if (typeof workTab !== 'string' || !DESKTOP_WEBUI_WORK_TABS.has(workTab as DesktopCommandWorkTab)) {\n return null;\n }\n command.workTab = workTab as DesktopCommandWorkTab;\n hasCommand = true;\n }\n\n const terminal = value['terminal'];\n if (terminal !== undefined) {\n if (terminal !== true && terminal !== false && terminal !== 'toggle' && terminal !== 'new') {\n return null;\n }\n command.terminal = terminal;\n hasCommand = true;\n }\n\n const pref = value['pref'];\n if (pref !== undefined) {\n if (!isRecord(pref)) return null;\n const key = pref['key'];\n if (typeof key !== 'string' || !DESKTOP_WEBUI_PREF_KEYS.has(key as DesktopCommandPrefKey)) {\n return null;\n }\n const toggle = pref['toggle'];\n const prefValue = pref['value'];\n if (toggle !== undefined && typeof toggle !== 'boolean') return null;\n if (prefValue !== undefined && typeof prefValue !== 'boolean') return null;\n if (toggle === undefined && prefValue === undefined) return null;\n command.pref = {\n key: key as DesktopCommandPrefKey,\n ...(typeof prefValue === 'boolean' ? { value: prefValue } : {}),\n ...(typeof toggle === 'boolean' ? { toggle } : {}),\n };\n hasCommand = true;\n }\n\n return hasCommand ? command : null;\n}\n\nexport function buildWebuiCommandFallbackScript(command: DesktopWebuiCommand): string {\n const payload = JSON.stringify(command).replace(/</g, '\\\\u003c');\n return `window.dispatchEvent(new CustomEvent('wrongstack:desktop-command', { detail: ${payload} })); true;`;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n}\n","/**\n * Application-wide constants.\n * Centralized here to avoid magic numbers scattered across modules.\n */\n\nexport const OPEN_EXTERNAL_ALLOWED_PROTOCOLS = new Set(['http:', 'https:', 'mailto:']);\n\nexport const SIDEBAR_WIDTH_WIDE = 292;\nexport const SIDEBAR_WIDTH_MEDIUM = 276;\nexport const SIDEBAR_WIDTH_NARROW = 252;\nexport const SIDEBAR_WIDTH_COLLAPSED = 56;\n\nexport const MIN_WINDOW_WIDTH = 760;\nexport const MIN_WINDOW_HEIGHT = 520;\n\nexport const MAX_PENDING_WEBUI_COMMANDS = 50;\nexport const MAX_PENDING_FLUSH_ATTEMPTS = 80;\nexport const WEBUI_COMMAND_FALLBACK_MS = 350;\nexport const WEBUI_COMMAND_ACK_TIMEOUT_MS = 2_000;\n\nexport const WINDOW_STATE_SAVE_DEBOUNCE_MS = 350;\nexport const PENDING_WEBUI_FLUSH_DELAY_MS = 250;\nexport const LOG_NOTIFY_DEBOUNCE_MS = 250;\n","/**\n * Sidebar width calculation utilities.\n * Main layout logic is in index.ts.\n */\nimport {\n SIDEBAR_WIDTH_WIDE,\n SIDEBAR_WIDTH_MEDIUM,\n SIDEBAR_WIDTH_NARROW,\n SIDEBAR_WIDTH_COLLAPSED,\n} from '../state/constants.js';\n\n/**\n * Calculate the sidebar width based on window width and collapse state.\n */\nexport function getSidebarWidth(windowWidth: number, collapsed: boolean): number {\n if (collapsed) return SIDEBAR_WIDTH_COLLAPSED;\n if (windowWidth < 900) return SIDEBAR_WIDTH_NARROW;\n if (windowWidth < 1180) return SIDEBAR_WIDTH_MEDIUM;\n return SIDEBAR_WIDTH_WIDE;\n}\n","/**\n * Application menu builder.\n * Builds the complete application menu with all sections.\n */\nimport { Menu } from 'electron';\nimport type { DesktopWebuiCommand } from '../../shared/types.js';\nimport type { MenuBuilderContext, ProjectMenuActions } from './types.js';\nimport { buildProjectsMenu } from './projects-menu.js';\nimport { buildFileMenu, buildWorkspaceMenu, buildViewMenu } from './sections.js';\n\nexport { buildProjectsMenu, normalizeMenuRoot, groupProjectRuntimesForMenu } from './projects-menu.js';\nexport { buildProjectsMenu as buildProjectsMenuSection } from './projects-menu.js';\nexport * from './types.js';\n\n/**\n * Configure the complete application menu.\n * This is the main entry point for building the menu.\n */\nexport function configureApplicationMenu(ctx: MenuBuilderContext): void {\n const snapshot = ctx.getSnapshot();\n const active = ctx.getActiveRuntime();\n const hasActiveRuntime = Boolean(active);\n const hasActiveWebui = active?.status === 'running';\n const hasActiveProjectWebui = hasActiveWebui && active?.kind === 'project';\n const activeWebuiPrefs = ctx.getActiveWebuiPrefs();\n\n const navigate = (command: DesktopWebuiCommand) => {\n void ctx.dispatchWebuiCommand(command);\n };\n\n const activateAndNavigate = (runtimeId: string, command: DesktopWebuiCommand) => {\n void ctx.activateRuntime(runtimeId).then(() => ctx.dispatchWebuiCommand(command));\n };\n\n const reloadRuntimeWebui = (runtimeId: string) => {\n void ctx.activateRuntime(runtimeId).then(() => ctx.reloadActiveWebuiView());\n };\n\n const actions: ProjectMenuActions = {\n activate: (runtimeId) => void ctx.activateRuntime(runtimeId),\n activateAndNavigate,\n newSession: (runtimeId) => {\n if (runtimeId) void ctx.openProjectSession(runtimeId);\n else void ctx.openProject();\n },\n openBrowser: (runtimeId) => {\n const url = ctx.getRuntimeManager().getRuntimeUrlWithToken(runtimeId);\n if (url) ctx.openExternal(url);\n },\n reload: reloadRuntimeWebui,\n close: (runtimeId) => void ctx.closeRuntime(runtimeId),\n reveal: (runtimeId) => {\n const runtime = ctx.getRuntimeManager().getRuntime(runtimeId);\n if (runtime) ctx.revealInExplorer(runtime.root);\n },\n };\n\n const template: import('electron').MenuItemConstructorOptions[] = [\n buildFileMenu(ctx, actions, hasActiveRuntime, hasActiveProjectWebui, active, navigate, ctx.getActiveRuntimeId),\n {\n label: ctx.t('projects'),\n submenu: buildProjectsMenu(snapshot.runtimes, actions, ctx.t),\n },\n buildWorkspaceMenu(ctx, actions, hasActiveWebui, activeWebuiPrefs, navigate),\n buildViewMenu(ctx),\n ];\n\n Menu.setApplicationMenu(Menu.buildFromTemplate(template));\n}\n\n// Re-export for backwards compatibility\nexport { type MenuBuilderContext, type ProjectMenuActions, type ProjectMenuGroup } from './types.js';\n","/**\n * Projects menu builder.\n */\nimport type { MenuItemConstructorOptions } from 'electron';\nimport type { DesktopRuntimeRecord } from '../../shared/types.js';\nimport type { ProjectMenuActions, ProjectMenuGroup } from './types.js';\n\nconst posix = (await import('node:path')).posix;\n\nexport function buildProjectsMenu(\n runtimes: DesktopRuntimeRecord[],\n actions: ProjectMenuActions,\n t: (key: string) => string,\n): MenuItemConstructorOptions[] {\n const projectGroups = groupProjectRuntimesForMenu(runtimes);\n const menu: MenuItemConstructorOptions[] = [\n {\n label: t('openProjectEllipsis'),\n accelerator: 'CmdOrCtrl+O',\n click: () => actions.newSession(''), // Will open dialog\n },\n { label: t('registerProjectEllipsis'), click: () => actions.newSession('') },\n { type: 'separator' },\n ];\n\n if (projectGroups.length === 0) {\n menu.push({ label: t('noOpenProjectSessions'), enabled: false });\n return menu;\n }\n\n for (const group of projectGroups) {\n menu.push({\n label: group.name,\n submenu: [\n {\n label: t('newSession'),\n click: () => actions.newSession(group.sessions[0]?.id ?? ''),\n enabled: Boolean(group.sessions[0]),\n },\n {\n label: t('revealProjectFolder'),\n click: () => actions.reveal(group.sessions[0]?.id ?? ''),\n enabled: Boolean(group.sessions[0]),\n },\n { type: 'separator' },\n ...group.sessions.map((runtime, index) =>\n buildSessionMenu(runtime, index + 1, actions, t),\n ),\n ],\n });\n }\n return menu;\n}\n\nexport function buildSessionMenu(\n runtime: DesktopRuntimeRecord,\n index: number,\n actions: ProjectMenuActions,\n t: (key: string) => string,\n): MenuItemConstructorOptions {\n const running = runtime.status === 'running';\n const label = `${t('session')} ${index} · ${runtime.status}`;\n return {\n label,\n submenu: [\n {\n label: t('quickView'),\n click: () => actions.activate(runtime.id),\n },\n {\n label: 'WebUI',\n enabled: running,\n submenu: [\n {\n label: t('chat'),\n click: () => actions.activateAndNavigate(runtime.id, { activity: 'chat', view: 'chat' }),\n },\n {\n label: t('focusPrompt'),\n click: () => actions.activateAndNavigate(runtime.id, { action: 'focus-chat' }),\n },\n {\n label: t('terminal'),\n click: () => actions.activateAndNavigate(runtime.id, { terminal: 'toggle' }),\n },\n {\n label: t('newTerminal'),\n click: () => actions.activateAndNavigate(runtime.id, { terminal: 'new' }),\n },\n { type: 'separator' },\n {\n label: t('files'),\n click: () =>\n actions.activateAndNavigate(runtime.id, { activity: 'files', view: 'files' }),\n },\n {\n label: t('changes'),\n click: () =>\n actions.activateAndNavigate(runtime.id, { activity: 'changes', view: 'changes' }),\n },\n {\n label: t('sessions'),\n click: () => actions.activateAndNavigate(runtime.id, { view: 'sessions' }),\n },\n {\n label: t('fleetHQ'),\n click: () =>\n actions.activateAndNavigate(runtime.id, { activity: 'officemap', view: 'officemap' }),\n },\n {\n label: t('settings'),\n click: () => actions.activateAndNavigate(runtime.id, { view: 'settings' }),\n },\n { type: 'separator' },\n {\n label: t('commandPalette'),\n click: () =>\n actions.activateAndNavigate(runtime.id, { action: 'open-command-palette' }),\n },\n {\n label: t('modelSwitcher'),\n click: () =>\n actions.activateAndNavigate(runtime.id, { action: 'open-model-switcher' }),\n },\n ],\n },\n { type: 'separator' },\n {\n label: t('openInBrowser'),\n enabled: running,\n click: () => actions.openBrowser(runtime.id),\n },\n {\n label: t('reloadWebui'),\n enabled: running,\n click: () => actions.reload(runtime.id),\n },\n {\n label: t('closeSession'),\n click: () => actions.close(runtime.id),\n },\n ],\n };\n}\n\nexport function groupProjectRuntimesForMenu(runtimes: DesktopRuntimeRecord[]): ProjectMenuGroup[] {\n const groups = new Map<string, ProjectMenuGroup>();\n for (const runtime of runtimes) {\n if (runtime.kind !== 'project') continue;\n const key = normalizeMenuRoot(runtime.root);\n const existing = groups.get(key);\n if (existing) {\n existing.sessions.push(runtime);\n continue;\n }\n groups.set(key, {\n key,\n name: posix.basename(runtime.root) || runtime.name,\n root: runtime.root,\n sessions: [runtime],\n });\n }\n return [...groups.values()].sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport function normalizeMenuRoot(root: string): string {\n return root.replace(/\\\\/g, '/').replace(/\\/+$/g, '').toLowerCase();\n}\n","/**\n * Menu sections builder.\n * Each function builds a specific menu section.\n */\nimport type { MenuItemConstructorOptions } from 'electron';\nimport type { DesktopRuntimeRecord, DesktopWebuiCommand, DesktopWebuiPrefs } from '../../shared/types.js';\nimport type { MenuBuilderContext } from './types.js';\n\n/**\n * Build File menu section.\n */\nexport function buildFileMenu(\n ctx: MenuBuilderContext,\n _actions: unknown,\n hasActiveRuntime: boolean,\n hasActiveProjectWebui: boolean,\n active: DesktopRuntimeRecord | undefined,\n navigate: (command: DesktopWebuiCommand) => void,\n getActiveRuntimeId: () => string | null,\n): MenuItemConstructorOptions {\n return {\n label: ctx.t('file'),\n submenu: [\n {\n label: ctx.t('openProjectEllipsis'),\n accelerator: 'CmdOrCtrl+O',\n click: () => void ctx.openProject(),\n },\n { label: ctx.t('registerProjectEllipsis'), click: () => void ctx.registerProject() },\n {\n label: ctx.t('removeActiveFromRegistry'),\n enabled: hasActiveProjectWebui,\n click: () => {\n if (active?.kind === 'project') void ctx.unregisterProject(active.root);\n },\n },\n { type: 'separator' },\n {\n label: ctx.t('newSessionForActive'),\n accelerator: 'CmdOrCtrl+N',\n enabled: hasActiveProjectWebui,\n click: () => void ctx.openProjectSession(active?.id),\n },\n {\n label: ctx.t('settings'),\n accelerator: 'CmdOrCtrl+,',\n click: () => {\n if (hasActiveRuntime) navigate({ view: 'settings' });\n else void ctx.openSettings();\n },\n },\n { type: 'separator' },\n {\n label: ctx.t('closeActiveRuntime'),\n accelerator: 'CmdOrCtrl+W',\n enabled: hasActiveRuntime,\n click: () => {\n const id = getActiveRuntimeId();\n if (id) void ctx.closeRuntime(id);\n },\n },\n { type: 'separator' },\n {\n role: process.platform === 'darwin' ? 'close' : 'quit',\n },\n ],\n };\n}\n\n/**\n * Build Workspace menu section.\n */\nexport function buildWorkspaceMenu(\n ctx: MenuBuilderContext,\n _actions: unknown,\n hasActiveWebui: boolean,\n prefs: DesktopWebuiPrefs | undefined,\n navigate: (command: DesktopWebuiCommand) => void,\n): MenuItemConstructorOptions {\n const yoloChecked = prefs?.yolo === true;\n const nextPredictionChecked = prefs?.nextPrediction === true;\n const contextAutoCompactChecked = prefs?.contextAutoCompact === true;\n\n const webuiItem = (item: MenuItemConstructorOptions): MenuItemConstructorOptions => ({\n ...item,\n enabled: item.enabled ?? hasActiveWebui,\n });\n\n return {\n label: ctx.t('workspace'),\n submenu: [\n webuiItem({\n label: ctx.t('openChat'),\n accelerator: 'CmdOrCtrl+1',\n click: () => navigate({ activity: 'chat', view: 'chat' }),\n }),\n webuiItem({\n label: ctx.t('focusPrompt'),\n accelerator: 'CmdOrCtrl+/',\n click: () => navigate({ action: 'focus-chat' }),\n }),\n webuiItem({\n label: ctx.t('toggleTerminal'),\n accelerator: 'CmdOrCtrl+`',\n click: () => navigate({ terminal: 'toggle' }),\n }),\n webuiItem({ label: ctx.t('newTerminal'), click: () => navigate({ terminal: 'new' }) }),\n { type: 'separator' },\n webuiItem({\n label: ctx.t('commandPalette'),\n accelerator: 'CmdOrCtrl+K',\n click: () => navigate({ action: 'open-command-palette' }),\n }),\n webuiItem({\n label: ctx.t('quickModelSwitcher'),\n accelerator: 'CmdOrCtrl+M',\n click: () => navigate({ action: 'open-model-switcher' }),\n }),\n webuiItem({\n type: 'checkbox',\n label: ctx.t('yoloMode'),\n checked: yoloChecked,\n accelerator: 'CmdOrCtrl+Shift+Y',\n click: () => navigate({ pref: { key: 'yolo', toggle: true } }),\n }),\n webuiItem({\n type: 'checkbox',\n label: ctx.t('nextPrediction'),\n checked: nextPredictionChecked,\n click: () => navigate({ pref: { key: 'nextPrediction', toggle: true } }),\n }),\n webuiItem({\n type: 'checkbox',\n label: ctx.t('contextAutoCompact'),\n checked: contextAutoCompactChecked,\n click: () => navigate({ pref: { key: 'contextAutoCompact', toggle: true } }),\n }),\n { type: 'separator' },\n webuiItem({\n label: ctx.t('reloadActiveWebui'),\n accelerator: 'CmdOrCtrl+Shift+R',\n click: () => void ctx.reloadActiveWebuiView(),\n }),\n ],\n };\n}\n\n/**\n * Build View menu section.\n */\nexport function buildViewMenu(ctx: MenuBuilderContext): MenuItemConstructorOptions {\n return {\n label: ctx.t('view'),\n submenu: [\n {\n type: 'checkbox',\n label: ctx.t('compactDesktopSidebar'),\n accelerator: 'CmdOrCtrl+B',\n checked: ctx.getShellSidebarCollapsed(),\n click: () => ctx.setShellSidebarCollapsed(!ctx.getShellSidebarCollapsed()),\n },\n { type: 'separator' },\n { role: 'reload' },\n { role: 'toggleDevTools' },\n { type: 'separator' },\n { role: 'resetZoom' },\n { role: 'zoomIn' },\n { role: 'zoomOut' },\n { type: 'separator' },\n { role: 'togglefullscreen' },\n ],\n };\n}\n"],"mappings":"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","names":["path","fs","wstackGlobalRoot","fs","path","atomicWrite","wstackGlobalRoot","stat","runtime","resolve","require","MIN_WINDOW_WIDTH","MIN_WINDOW_HEIGHT","wstackGlobalRoot","isRecord","configureApplicationMenu","resolve"]}
|
|
1
|
+
{"version":3,"sources":["../../src/main/main.ts","../../src/main/ipc.ts","../../src/main/i18n-main.ts","../../src/main/desktop-config-io.ts","../../src/main/runtime-manager.ts","../../src/main/webui-command-bridge.ts","../../src/main/state/constants.ts","../../src/main/layout/sidebar.ts","../../src/main/menu/index.ts","../../src/main/menu/projects-menu.ts","../../src/main/menu/sections.ts"],"sourcesContent":["/**\n * WrongStack Desktop - Electron Application Entry Point\n *\n * Architecture:\n * - Main state is managed here (centralized for simplicity)\n * - Modules handle specific concerns:\n * - layout/ → Window layout and sizing\n * - menu/ → Application menu building\n * - ipc-handlers/ → IPC message handlers\n * - runtime/ → Project/runtime operations\n * - state/ → Types and constants\n */\nimport * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport { wstackGlobalRoot } from '@wrongstack/core/utils';\nimport {\n app,\n BaseWindow,\n dialog,\n ipcMain,\n screen,\n shell,\n WebContentsView,\n type BaseWindowConstructorOptions,\n} from 'electron';\nimport type {\n DesktopWebuiCommand,\n DesktopWebuiPrefs,\n DesktopWebuiStatusSnapshot,\n DesktopWindowState,\n} from '../shared/types.js';\nimport { DesktopAgentBridge } from './agent-bridge.js';\nimport { IPC } from './ipc.js';\nimport { getMainLocale, setMainLocale, tMain } from './i18n-main.js';\nimport { desktopConfigPaths, readUiLocale, writeUiLocale } from './desktop-config-io.js';\nimport {\n DesktopRuntimeManager,\n preloadPath,\n rendererIndexPath,\n webuiPreloadPath,\n desktopSettingsWorkspaceRoot,\n} from './runtime-manager.js';\nimport { watchProviderConfig } from '@wrongstack/core/storage';\nimport {\n buildWebuiCommandFallbackScript,\n normalizeDesktopWebuiCommand,\n} from './webui-command-bridge.js';\n\n// Layout module\nimport { getSidebarWidth } from './layout/index.js';\n\n// Menu module\nimport { configureApplicationMenu as buildMenu } from './menu/index.js';\nimport type { MenuBuilderContext } from './menu/types.js';\n\n// Constants\nconst OPEN_EXTERNAL_ALLOWED_PROTOCOLS = new Set(['http:', 'https:', 'mailto:']);\nconst MIN_WINDOW_WIDTH = 760;\nconst MIN_WINDOW_HEIGHT = 520;\nconst MAX_PENDING_WEBUI_COMMANDS = 50;\nconst MAX_PENDING_FLUSH_ATTEMPTS = 80;\nconst WEBUI_COMMAND_FALLBACK_MS = 350;\nconst WEBUI_COMMAND_ACK_TIMEOUT_MS = 2_000;\n\napp.setAppUserModelId('com.wrongstack.desktop');\napp.setPath('userData', path.join(wstackGlobalRoot(), 'desktop', 'electron-profile'));\n\n// ============================================================================\n// Application State\n// ============================================================================\n\nconst manager = new DesktopRuntimeManager();\nconst bridge = new DesktopAgentBridge();\n\ninterface DesktopWebuiRuntimeView {\n runtimeId: string;\n view: WebContentsView;\n url: string | null;\n status: DesktopWebuiStatusSnapshot;\n bridgeReady: boolean;\n attached: boolean;\n pendingCommands: DesktopWebuiCommand[];\n pendingFlushTimer: ReturnType<typeof setTimeout> | null;\n pendingFlushAttempts: number;\n}\n\ninterface PendingWebuiCommandAck {\n runtimeId: string;\n timer: ReturnType<typeof setTimeout>;\n fallbackTimer: ReturnType<typeof setTimeout> | null;\n resolve: (handled: boolean) => void;\n}\n\nlet mainWindow: BaseWindow | null = null;\nlet shellView: WebContentsView | null = null;\nconst webuiViews = new Map<string, DesktopWebuiRuntimeView>();\nlet activeWebuiRuntimeId: string | null = null;\nlet webuiStatus: DesktopWebuiStatusSnapshot = { runtimeId: null, status: 'idle' };\nlet webuiCommandSequence = 0;\nlet shellSidebarCollapsed = false;\nconst pendingWebuiCommandAcks = new Map<string, PendingWebuiCommandAck>();\nlet saveWindowStateTimer: ReturnType<typeof setTimeout> | null = null;\nlet quittingAfterCleanup = false;\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\nfunction safeOpenExternal(target: string): void {\n let protocol: string;\n try {\n protocol = new URL(target).protocol;\n } catch {\n return;\n }\n if (OPEN_EXTERNAL_ALLOWED_PROTOCOLS.has(protocol)) {\n void shell.openExternal(target);\n }\n}\n\nfunction sameOrigin(candidate: string, base: string | null): boolean {\n if (!base) return false;\n try {\n return new URL(candidate).origin === new URL(base).origin;\n } catch {\n return false;\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction runtimeWsUrlOrThrow(runtimeId: string): string {\n const wsUrl = manager.getRuntimeWsUrlWithToken(runtimeId);\n if (!wsUrl) throw new Error(`Runtime not found: ${runtimeId}`);\n return wsUrl;\n}\n\n// ============================================================================\n// State Helpers\n// ============================================================================\n\nfunction setShellSidebarCollapsed(collapsed: boolean): void {\n shellSidebarCollapsed = collapsed;\n layoutWebuiViews();\n configureApplicationMenu();\n if (!shellView || shellView.webContents.isDestroyed()) return;\n shellView.webContents.send(IPC.shellSidebarCollapsedChanged, shellSidebarCollapsed);\n}\n\nfunction menuRelevantPrefsChanged(\n previous: DesktopWebuiPrefs | undefined,\n next: DesktopWebuiPrefs | undefined,\n): boolean {\n return (\n previous?.yolo !== next?.yolo ||\n previous?.nextPrediction !== next?.nextPrediction ||\n previous?.contextAutoCompact !== next?.contextAutoCompact\n );\n}\n\nfunction setEntryWebuiStatus(\n entry: DesktopWebuiRuntimeView,\n next: DesktopWebuiStatusSnapshot,\n): void {\n const previousPrefs = entry.status.prefs;\n entry.status = {\n ...next,\n prefs: next.prefs ?? entry.status.prefs,\n pendingCommands: entry.pendingCommands.length || undefined,\n };\n if (activeWebuiRuntimeId === entry.runtimeId) {\n publishWebuiStatus(entry.status);\n if (menuRelevantPrefsChanged(previousPrefs, entry.status.prefs)) {\n configureApplicationMenu();\n }\n }\n}\n\n// ============================================================================\n// Window State\n// ============================================================================\n\nfunction scheduleWindowStateSave(): void {\n if (saveWindowStateTimer) clearTimeout(saveWindowStateTimer);\n saveWindowStateTimer = setTimeout(() => {\n saveWindowStateTimer = null;\n void saveWindowState();\n }, 350);\n}\n\nasync function saveWindowState(): Promise<void> {\n if (!mainWindow) return;\n const bounds = mainWindow.getNormalBounds();\n await manager.saveWindowState({\n x: bounds.x,\n y: bounds.y,\n width: bounds.width,\n height: bounds.height,\n maximized: mainWindow.isMaximized(),\n });\n}\n\nfunction validatedWindowState(state: DesktopWindowState | null): DesktopWindowState | null {\n if (!state) return null;\n if (state.width < MIN_WINDOW_WIDTH || state.height < MIN_WINDOW_HEIGHT) return null;\n if (state.x === undefined || state.y === undefined) return state;\n const candidate = {\n x: state.x,\n y: state.y,\n width: state.width,\n height: state.height,\n };\n const visibleOnSomeDisplay = screen.getAllDisplays().some((display) => {\n const area = display.workArea;\n return rectanglesIntersect(candidate, area);\n });\n return visibleOnSomeDisplay ? state : null;\n}\n\nfunction rectanglesIntersect(\n left: { x: number; y: number; width: number; height: number },\n right: { x: number; y: number; width: number; height: number },\n): boolean {\n return (\n left.x < right.x + right.width &&\n left.x + left.width > right.x &&\n left.y < right.y + right.height &&\n left.y + left.height > right.y\n );\n}\n\n// ============================================================================\n// Layout Functions\n// ============================================================================\n\nfunction layoutViews(): void {\n if (!mainWindow || !shellView) return;\n const size = mainWindow.getContentSize();\n const width = size[0] ?? 0;\n const height = size[1] ?? 0;\n shellView.setBounds({ x: 0, y: 0, width, height });\n layoutWebuiViews();\n}\n\nfunction layoutWebuiViews(): void {\n if (!mainWindow) return;\n const size = mainWindow.getContentSize();\n const width = size[0] ?? 0;\n const height = size[1] ?? 0;\n const snapshot = manager.snapshot();\n const active = snapshot.runtimes.find((runtime) => runtime.id === snapshot.activeRuntimeId);\n const sidebarWidth = getSidebarWidth(width, shellSidebarCollapsed);\n const contentWidth = Math.max(0, width - sidebarWidth);\n\n for (const entry of webuiViews.values()) {\n const runtime = snapshot.runtimes.find((r) => r.id === entry.runtimeId);\n if (active?.id === entry.runtimeId && runtime?.status === 'running') {\n entry.view.setBounds({ x: sidebarWidth, y: 0, width: contentWidth, height });\n } else {\n entry.view.setBounds({ x: sidebarWidth, y: 0, width: 0, height });\n }\n }\n}\n\n// ============================================================================\n// WebUI View Management\n// ============================================================================\n\nfunction ensureWebuiEntry(runtimeId: string): DesktopWebuiRuntimeView | null {\n if (!mainWindow) return null;\n const existing = webuiViews.get(runtimeId);\n if (existing) return existing;\n\n const view = new WebContentsView({\n webPreferences: {\n preload: webuiPreloadPath(),\n contextIsolation: true,\n nodeIntegration: false,\n sandbox: false,\n },\n });\n\n const entry: DesktopWebuiRuntimeView = {\n runtimeId,\n view,\n url: null,\n status: { runtimeId, status: 'idle' },\n bridgeReady: false,\n attached: false,\n pendingCommands: [],\n pendingFlushTimer: null,\n pendingFlushAttempts: 0,\n };\n\n view.webContents.setWindowOpenHandler(({ url }) => {\n safeOpenExternal(url);\n return { action: 'deny' };\n });\n\n view.webContents.on('will-navigate', (event, url) => {\n if (sameOrigin(url, entry.url)) return;\n event.preventDefault();\n safeOpenExternal(url);\n });\n\n view.webContents.on('did-start-loading', () => {\n if (webuiViews.get(runtimeId) !== entry) return;\n entry.bridgeReady = false;\n setEntryWebuiStatus(entry, { runtimeId, status: 'loading' });\n });\n\n view.webContents.on('did-finish-load', () => {\n if (webuiViews.get(runtimeId) !== entry) return;\n schedulePendingWebuiFlush(entry);\n try {\n entry.view.webContents.send(IPC.webuiLocaleChanged, getMainLocale());\n } catch {\n /* webui was destroyed mid-send */\n }\n });\n\n view.webContents.on('did-fail-load', (_event, errorCode, errorDescription) => {\n if (webuiViews.get(runtimeId) !== entry || errorCode === -3) return;\n setEntryWebuiStatus(entry, { runtimeId, status: 'error', error: errorDescription });\n });\n\n view.webContents.on('render-process-gone', (_event, details) => {\n if (webuiViews.get(runtimeId) !== entry) return;\n setEntryWebuiStatus(entry, {\n runtimeId,\n status: 'error',\n error: `WebUI renderer exited: ${details.reason}`,\n });\n });\n\n webuiViews.set(runtimeId, entry);\n return entry;\n}\n\nfunction attachWebuiEntry(entry: DesktopWebuiRuntimeView): void {\n if (!mainWindow) return;\n if (entry.attached) return;\n mainWindow.contentView.addChildView(entry.view);\n entry.attached = true;\n}\n\nfunction disposeWebuiEntry(entry: DesktopWebuiRuntimeView): void {\n webuiViews.delete(entry.runtimeId);\n entry.pendingCommands.length = 0;\n settlePendingWebuiCommandAcksForRuntime(entry.runtimeId, false);\n if (entry.pendingFlushTimer) {\n clearTimeout(entry.pendingFlushTimer);\n entry.pendingFlushTimer = null;\n }\n if (mainWindow && entry.attached) {\n mainWindow.contentView.removeChildView(entry.view);\n }\n entry.attached = false;\n if (!entry.view.webContents.isDestroyed()) {\n entry.view.webContents.close();\n }\n if (activeWebuiRuntimeId === entry.runtimeId) activeWebuiRuntimeId = null;\n}\n\nfunction disposeAllWebuiEntries(): void {\n for (const entry of Array.from(webuiViews.values())) {\n disposeWebuiEntry(entry);\n }\n webuiViews.clear();\n}\n\nfunction pruneWebuiEntries(runtimeIds: string[]): void {\n const live = new Set(runtimeIds);\n for (const [id, entry] of webuiViews) {\n if (!live.has(id)) {\n disposeWebuiEntry(entry);\n }\n }\n}\n\nfunction findWebuiEntryBySenderId(senderId: number): DesktopWebuiRuntimeView | undefined {\n return Array.from(webuiViews.values()).find(\n (candidate) => candidate.view.webContents.id === senderId,\n );\n}\n\nfunction syncActiveWebuiView(): void {\n if (!mainWindow) return;\n const snapshot = manager.snapshot();\n pruneWebuiEntries(\n snapshot.runtimes\n .filter((runtime) => runtime.status === 'running')\n .map((runtime) => runtime.id),\n );\n const active = snapshot.runtimes.find((runtime) => runtime.id === snapshot.activeRuntimeId);\n if (active?.status !== 'running') {\n activeWebuiRuntimeId = active?.id ?? null;\n publishWebuiStatus({ runtimeId: active?.id ?? null, status: 'idle' });\n layoutWebuiViews();\n return;\n }\n\n const url = manager.getRuntimeUrlWithToken(active.id);\n if (!url) {\n activeWebuiRuntimeId = active.id;\n publishWebuiStatus({ runtimeId: active.id, status: 'idle' });\n layoutWebuiViews();\n return;\n }\n const entry = ensureWebuiEntry(active.id);\n if (!entry) return;\n activeWebuiRuntimeId = active.id;\n attachWebuiEntry(entry);\n layoutWebuiViews();\n publishWebuiStatus(entry.status);\n if (entry.url !== url) {\n entry.url = url;\n entry.bridgeReady = false;\n setEntryWebuiStatus(entry, { runtimeId: active.id, status: 'loading' });\n void entry.view.webContents.loadURL(url).catch((err) => {\n setEntryWebuiStatus(entry, {\n runtimeId: active.id,\n status: 'error',\n error: err instanceof Error ? err.message : String(err),\n });\n console.error(\n JSON.stringify({\n level: 'error',\n event: 'desktop.webui_view_load_failed',\n runtimeId: active.id,\n message: err instanceof Error ? err.message : String(err),\n timestamp: new Date().toISOString(),\n }),\n );\n });\n }\n}\n\n// ============================================================================\n// State Broadcasting\n// ============================================================================\n\nfunction broadcastState(): void {\n if (!shellView || shellView.webContents.isDestroyed()) return;\n shellView.webContents.send(IPC.stateChanged, manager.snapshot());\n}\n\nfunction publishWebuiStatus(next: DesktopWebuiStatusSnapshot): void {\n webuiStatus = next;\n if (!shellView || shellView.webContents.isDestroyed()) return;\n shellView.webContents.send(IPC.webuiStatusChanged, webuiStatus);\n}\n\nfunction broadcastLocaleToEmbeddedWebuis(locale: string): void {\n for (const entry of webuiViews.values()) {\n if (entry.view.webContents.isDestroyed()) continue;\n try {\n entry.view.webContents.send(IPC.webuiLocaleChanged, locale);\n } catch {\n /* destroyed mid-send */\n }\n }\n}\n\n// ============================================================================\n// WebUI Command Dispatch\n// ============================================================================\n\nfunction getActiveWebuiEntry(): DesktopWebuiRuntimeView | undefined {\n const activeId = manager.snapshot().activeRuntimeId;\n return activeId ? webuiViews.get(activeId) : undefined;\n}\n\nasync function isWebuiCommandBridgeReady(entry: DesktopWebuiRuntimeView): Promise<boolean> {\n if (webuiViews.get(entry.runtimeId) !== entry || !entry.url) return false;\n return entry.bridgeReady;\n}\n\nfunction queueWebuiCommand(entry: DesktopWebuiRuntimeView, command: DesktopWebuiCommand): void {\n entry.pendingCommands.push(command);\n if (entry.pendingCommands.length > MAX_PENDING_WEBUI_COMMANDS) {\n entry.pendingCommands.splice(0, entry.pendingCommands.length - MAX_PENDING_WEBUI_COMMANDS);\n }\n entry.pendingFlushAttempts = 0;\n setEntryWebuiStatus(entry, entry.status);\n}\n\nfunction nextWebuiCommandRequestId(runtimeId: string): string {\n webuiCommandSequence += 1;\n return `${runtimeId}:${Date.now()}:${webuiCommandSequence}`;\n}\n\nasync function dispatchWebuiCommand(commandInput: unknown): Promise<boolean> {\n const command = normalizeDesktopWebuiCommand(commandInput);\n if (!command) return false;\n const entry = getActiveWebuiEntry();\n if (!entry?.url) return false;\n\n if (entry.status.status !== 'ready') {\n if (!entry.view.webContents.isLoading() && entry.status.status !== 'error') {\n return dispatchWebuiCommandNow(entry, command);\n }\n queueWebuiCommand(entry, command);\n schedulePendingWebuiFlush(entry);\n return true;\n }\n\n if (!(await isWebuiCommandBridgeReady(entry))) {\n if (!entry.view.webContents.isLoading()) {\n return dispatchWebuiCommandNow(entry, command);\n }\n queueWebuiCommand(entry, command);\n schedulePendingWebuiFlush(entry);\n return true;\n }\n\n return dispatchWebuiCommandNow(entry, command);\n}\n\nasync function reloadActiveWebuiView(): Promise<boolean> {\n const entry = getActiveWebuiEntry();\n if (!entry?.url) return false;\n entry.bridgeReady = false;\n setEntryWebuiStatus(entry, { runtimeId: entry.runtimeId, status: 'loading' });\n return entry.view.webContents\n .loadURL(entry.url)\n .then(() => true)\n .catch((err) => {\n setEntryWebuiStatus(entry, {\n runtimeId: entry.runtimeId,\n status: 'error',\n error: err instanceof Error ? err.message : String(err),\n });\n console.error(\n JSON.stringify({\n level: 'error',\n event: 'desktop.webui_view_reload_failed',\n runtimeId: entry.runtimeId,\n message: err instanceof Error ? err.message : String(err),\n timestamp: new Date().toISOString(),\n }),\n );\n return false;\n });\n}\n\nasync function dispatchWebuiCommandNow(\n entry: DesktopWebuiRuntimeView,\n command: DesktopWebuiCommand,\n): Promise<boolean> {\n if (webuiViews.get(entry.runtimeId) !== entry || !entry.url) return false;\n const requestId = nextWebuiCommandRequestId(entry.runtimeId);\n const commandWithRequestId: DesktopWebuiCommand = { ...command, requestId };\n\n return new Promise<boolean>((resolve) => {\n const fallbackTimer = setTimeout(() => {\n const pending = pendingWebuiCommandAcks.get(requestId);\n if (!pending) return;\n sendWebuiCommandDomFallback(entry, commandWithRequestId);\n }, WEBUI_COMMAND_FALLBACK_MS);\n\n const timer = setTimeout(() => {\n settlePendingWebuiCommandAck(requestId, false);\n }, WEBUI_COMMAND_ACK_TIMEOUT_MS);\n\n pendingWebuiCommandAcks.set(requestId, {\n runtimeId: entry.runtimeId,\n timer,\n fallbackTimer,\n resolve,\n });\n\n try {\n entry.view.webContents.send(IPC.webuiCommand, commandWithRequestId);\n if (activeWebuiRuntimeId === entry.runtimeId) {\n entry.view.webContents.focus();\n }\n } catch {\n settlePendingWebuiCommandAck(requestId, false);\n }\n });\n}\n\nfunction sendWebuiCommandDomFallback(\n entry: DesktopWebuiRuntimeView,\n command: DesktopWebuiCommand,\n): void {\n if (webuiViews.get(entry.runtimeId) !== entry || entry.view.webContents.isDestroyed()) return;\n void entry.view.webContents\n .executeJavaScript(buildWebuiCommandFallbackScript(command), true)\n .catch(() => undefined);\n}\n\nfunction settlePendingWebuiCommandAck(requestId: string, handled: boolean): void {\n const pending = pendingWebuiCommandAcks.get(requestId);\n if (!pending) return;\n pendingWebuiCommandAcks.delete(requestId);\n clearTimeout(pending.timer);\n if (pending.fallbackTimer) clearTimeout(pending.fallbackTimer);\n if (handled) {\n const entry = webuiViews.get(pending.runtimeId);\n if (entry) {\n entry.bridgeReady = true;\n setEntryWebuiStatus(entry, { ...entry.status, status: 'ready' });\n }\n }\n pending.resolve(handled);\n}\n\nfunction settlePendingWebuiCommandAcksForRuntime(runtimeId: string, handled: boolean): void {\n for (const [requestId, pending] of [...pendingWebuiCommandAcks]) {\n if (pending.runtimeId === runtimeId) {\n settlePendingWebuiCommandAck(requestId, handled);\n }\n }\n}\n\nasync function flushPendingWebuiCommands(entry: DesktopWebuiRuntimeView): Promise<void> {\n if (webuiViews.get(entry.runtimeId) !== entry) return;\n if (entry.pendingCommands.length === 0) return;\n\n if (!(await isWebuiCommandBridgeReady(entry))) {\n entry.pendingFlushAttempts += 1;\n const canFallback = !entry.view.webContents.isLoading() && entry.pendingFlushAttempts >= 4;\n\n if (!canFallback && entry.pendingFlushAttempts <= MAX_PENDING_FLUSH_ATTEMPTS) {\n schedulePendingWebuiFlush(entry);\n setEntryWebuiStatus(entry, entry.status);\n return;\n }\n\n if (!canFallback) {\n entry.pendingCommands.length = 0;\n setEntryWebuiStatus(entry, {\n runtimeId: entry.runtimeId,\n status: 'error',\n error: 'WebUI command bridge did not become ready.',\n });\n return;\n }\n }\n\n entry.pendingFlushAttempts = 0;\n const commands = entry.pendingCommands.splice(0, entry.pendingCommands.length);\n setEntryWebuiStatus(entry, entry.status);\n\n for (const command of commands) {\n await dispatchWebuiCommandNow(entry, command).catch(() => undefined);\n }\n}\n\nfunction schedulePendingWebuiFlush(entry: DesktopWebuiRuntimeView): void {\n if (entry.pendingFlushTimer) return;\n entry.pendingFlushTimer = setTimeout(() => {\n entry.pendingFlushTimer = null;\n void flushPendingWebuiCommands(entry);\n }, 250);\n}\n\n// ============================================================================\n// Project/Runtime Operations\n// ============================================================================\n\nasync function openProject(\n requestedRoot?: string | undefined,\n): Promise<ReturnType<DesktopRuntimeManager['snapshot']>> {\n let projectRoot = requestedRoot;\n if (!projectRoot) {\n const result = await dialog.showOpenDialog({\n title: tMain('openProject'),\n properties: ['openDirectory'],\n });\n projectRoot = result.filePaths[0];\n }\n if (!projectRoot) return manager.snapshot();\n await manager.openProject(projectRoot);\n syncActiveWebuiView();\n broadcastState();\n return manager.snapshot();\n}\n\nasync function registerProject(\n requestedRoot?: string | undefined,\n): Promise<ReturnType<DesktopRuntimeManager['snapshot']>> {\n let projectRoot = requestedRoot;\n if (!projectRoot) {\n const result = await dialog.showOpenDialog({\n title: tMain('registerProject'),\n properties: ['openDirectory'],\n });\n projectRoot = result.filePaths[0];\n }\n if (!projectRoot) return manager.snapshot();\n await manager.registerProject(projectRoot);\n broadcastState();\n return manager.snapshot();\n}\n\nasync function unregisterProject(\n root: string,\n): Promise<ReturnType<DesktopRuntimeManager['snapshot']>> {\n if (!root || typeof root !== 'string') return manager.snapshot();\n await manager.unregisterProject(root);\n broadcastState();\n return manager.snapshot();\n}\n\nasync function openProjectSession(\n runtimeId?: string | undefined,\n): Promise<ReturnType<DesktopRuntimeManager['snapshot']>> {\n const snapshot = manager.snapshot();\n const runtime =\n (runtimeId ? snapshot.runtimes.find((candidate) => candidate.id === runtimeId) : undefined) ??\n snapshot.runtimes.find((candidate) => candidate.id === snapshot.activeRuntimeId);\n if (runtime?.kind !== 'project') {\n return openProject();\n }\n await manager.openProject(runtime.root, { forceNew: true });\n syncActiveWebuiView();\n broadcastState();\n return manager.snapshot();\n}\n\nasync function openSettings(): Promise<ReturnType<DesktopRuntimeManager['snapshot']>> {\n const snapshot = manager.snapshot();\n const active = snapshot.runtimes.find((runtime) => runtime.id === snapshot.activeRuntimeId);\n if (!active || active.kind === 'global-settings' || active.status !== 'running') {\n const root = desktopSettingsWorkspaceRoot();\n await fs.mkdir(root, { recursive: true });\n await manager.openProject(root, {\n name: 'Global Settings',\n kind: 'global-settings',\n touchRecent: false,\n });\n syncActiveWebuiView();\n broadcastState();\n }\n await dispatchWebuiCommand({ view: 'settings' });\n return manager.snapshot();\n}\n\nasync function activateRuntime(\n id: string,\n): Promise<ReturnType<DesktopRuntimeManager['snapshot']>> {\n await manager.activateRuntime(id);\n syncActiveWebuiView();\n broadcastState();\n return manager.snapshot();\n}\n\nasync function closeRuntime(\n id: string,\n): Promise<ReturnType<DesktopRuntimeManager['snapshot']>> {\n bridge.close(id);\n await manager.closeRuntime(id);\n const entry = webuiViews.get(id);\n if (entry) disposeWebuiEntry(entry);\n syncActiveWebuiView();\n broadcastState();\n return manager.snapshot();\n}\n\nasync function restoreLastWorkspace(): Promise<void> {\n await manager.restoreLastWorkspace();\n syncActiveWebuiView();\n broadcastState();\n}\n\n// ============================================================================\n// ============================================================================\n// Menu Configuration (delegated to menu/ module)\n// ============================================================================\n\n/**\n * Create the menu context for building the application menu.\n * This context is passed to the menu/ module's configureApplicationMenu.\n */\nfunction createMenuContext(): MenuBuilderContext {\n return {\n getSnapshot: () => manager.snapshot(),\n getActiveRuntime: () => {\n const snapshot = manager.snapshot();\n return snapshot.runtimes.find((r) => r.id === snapshot.activeRuntimeId);\n },\n getActiveWebuiPrefs: () => {\n const snapshot = manager.snapshot();\n if (!snapshot.activeRuntimeId) return undefined;\n return webuiViews.get(snapshot.activeRuntimeId)?.status.prefs;\n },\n getShellSidebarCollapsed: () => shellSidebarCollapsed,\n t: tMain,\n getRuntimeManager: () => manager,\n getWebuiViews: () => webuiViews,\n dispatchWebuiCommand,\n reloadActiveWebuiView,\n activateRuntime: async (id) => { await activateRuntime(id); },\n openProject: async () => { await openProject(); },\n registerProject: async () => { await registerProject(); },\n openSettings: async () => { await openSettings(); },\n openProjectSession: async (id) => { await openProjectSession(id); },\n closeRuntime: async (id) => { await closeRuntime(id); },\n unregisterProject: async (root) => { await unregisterProject(root); },\n getActiveRuntimeId: () => activeWebuiRuntimeId,\n setShellSidebarCollapsed: (collapsed) => { setShellSidebarCollapsed(collapsed); },\n restoreLastWorkspace: async () => { await restoreLastWorkspace(); },\n openExternal: (url) => { shell.openExternal(url); },\n revealInExplorer: (root) => { void shell.openPath(root); },\n };\n}\n\n/**\n * Configure the application menu using the menu module.\n */\nfunction configureApplicationMenu(): void {\n buildMenu(createMenuContext());\n}\n\n// ============================================================================\n// IPC Handlers\n// ============================================================================\n\nfunction registerIpcHandlers(): void {\n ipcMain.handle(IPC.getState, () => manager.snapshot());\n ipcMain.handle(IPC.getConversation, (_event, runtimeId: string) =>\n bridge.snapshot(runtimeId),\n );\n ipcMain.handle(IPC.getWebuiStatus, () => webuiStatus);\n\n ipcMain.handle(IPC.navigateWebui, async (_event, command: unknown) =>\n dispatchWebuiCommand(command),\n );\n ipcMain.handle(IPC.reloadWebui, async () => reloadActiveWebuiView());\n\n ipcMain.handle(IPC.setShellSidebarCollapsed, (_event, collapsed: unknown) => {\n setShellSidebarCollapsed(collapsed === true);\n return true;\n });\n ipcMain.handle(IPC.openSettings, async () => openSettings());\n\n ipcMain.handle(IPC.openProjectSession, async (_event, runtimeId?: string | undefined) =>\n openProjectSession(runtimeId),\n );\n ipcMain.handle(IPC.openProject, async (_event, requestedRoot?: string | undefined) =>\n openProject(requestedRoot),\n );\n ipcMain.handle(IPC.registerProject, async (_event, requestedRoot?: string | undefined) =>\n registerProject(requestedRoot),\n );\n ipcMain.handle(IPC.unregisterProject, async (_event, root: string) => unregisterProject(root));\n\n ipcMain.handle(IPC.activateRuntime, async (_event, id: string) => activateRuntime(id));\n ipcMain.handle(IPC.closeRuntime, async (_event, id: string) => closeRuntime(id));\n ipcMain.handle(IPC.sendMessage, async (_event, id: string, content: string) =>\n bridge.sendMessage(id, runtimeWsUrlOrThrow(id), content),\n );\n ipcMain.handle(IPC.abortRuntime, async (_event, id: string) =>\n bridge.abort(id, runtimeWsUrlOrThrow(id)),\n );\n ipcMain.handle(IPC.openRuntimeInBrowser, async (_event, id: string) => {\n const url = manager.getRuntimeUrlWithToken(id);\n if (url) safeOpenExternal(url);\n });\n ipcMain.handle(IPC.revealRuntimeRoot, async (_event, id: string) => {\n const runtime = manager.getRuntime(id);\n if (runtime) void shell.openPath(runtime.root);\n });\n\n ipcMain.on(IPC.webuiReadyChanged, (event, ready: boolean) => {\n const entry = findWebuiEntryBySenderId(event.sender.id);\n if (!entry) return;\n entry.bridgeReady = ready === true;\n if (entry.bridgeReady) {\n setEntryWebuiStatus(entry, { ...entry.status, status: 'ready' });\n schedulePendingWebuiFlush(entry);\n } else if (entry.status.status === 'ready') {\n setEntryWebuiStatus(entry, { ...entry.status, status: 'loading' });\n }\n });\n\n ipcMain.on(IPC.webuiPrefsChanged, (event, prefs: unknown) => {\n const entry = findWebuiEntryBySenderId(event.sender.id);\n if (!entry) return;\n const next: DesktopWebuiPrefs = {};\n if (isRecord(prefs) && typeof prefs['yolo'] === 'boolean') next.yolo = prefs['yolo'];\n if (isRecord(prefs) && typeof prefs['nextPrediction'] === 'boolean') {\n next.nextPrediction = prefs['nextPrediction'];\n }\n if (isRecord(prefs) && typeof prefs['contextAutoCompact'] === 'boolean') {\n next.contextAutoCompact = prefs['contextAutoCompact'];\n }\n if (Object.keys(next).length === 0) return;\n setEntryWebuiStatus(entry, {\n ...entry.status,\n prefs: { ...(entry.status.prefs ?? {}), ...next },\n });\n });\n\n ipcMain.on(\n IPC.webuiCommandAck,\n (event, requestId: unknown, handled: unknown, _message?: unknown) => {\n const entry = findWebuiEntryBySenderId(event.sender.id);\n if (!entry || typeof requestId !== 'string') return;\n const pending = pendingWebuiCommandAcks.get(requestId);\n if (!pending || pending.runtimeId !== entry.runtimeId) return;\n settlePendingWebuiCommandAck(requestId, handled === true);\n },\n );\n\n ipcMain.on(IPC.setLocale, (_event, locale: string) => {\n setMainLocale(locale);\n configureApplicationMenu();\n broadcastLocaleToEmbeddedWebuis(locale);\n void writeUiLocale(locale);\n });\n}\n\n// ============================================================================\n// Boot Sequence\n// ============================================================================\n\nasync function boot(): Promise<void> {\n const locale = await readUiLocale();\n if (locale) setMainLocale(locale);\n\n const shellUrl = rendererIndexPath();\n shellView = new WebContentsView({\n webPreferences: {\n preload: preloadPath(),\n contextIsolation: true,\n nodeIntegration: false,\n sandbox: false,\n },\n });\n shellView.webContents.setWindowOpenHandler(({ url }) => {\n safeOpenExternal(url);\n return { action: 'deny' };\n });\n\n // The shell preload can invoke desktop:* channels during renderer startup.\n registerIpcHandlers();\n\n await shellView.webContents.loadURL(shellUrl);\n\n const prevState = validatedWindowState(manager.getWindowState());\n const defaultWidth = 1180;\n const defaultHeight = 720;\n\n const winOptions: BaseWindowConstructorOptions = {\n width: prevState?.width ?? defaultWidth,\n height: prevState?.height ?? defaultHeight,\n show: false,\n minWidth: MIN_WINDOW_WIDTH,\n minHeight: MIN_WINDOW_HEIGHT,\n title: tMain('windowTitle'),\n };\n if (prevState) {\n if (prevState.x !== undefined) winOptions.x = prevState.x;\n if (prevState.y !== undefined) winOptions.y = prevState.y;\n }\n\n mainWindow = new BaseWindow(winOptions);\n mainWindow.on('resized', scheduleWindowStateSave);\n mainWindow.on('moved', scheduleWindowStateSave);\n mainWindow.on('maximize', scheduleWindowStateSave);\n mainWindow.on('unmaximize', scheduleWindowStateSave);\n\n if (prevState?.maximized) {\n mainWindow.maximize();\n }\n\n mainWindow.contentView.addChildView(shellView);\n layoutViews();\n\n configureApplicationMenu();\n\n mainWindow.on('resize', layoutViews);\n\n bridge.on('changed', (conversation) => {\n if (!shellView || shellView.webContents.isDestroyed()) return;\n shellView.webContents.send(IPC.conversationChanged, conversation);\n });\n\n manager.on('changed', () => {\n syncActiveWebuiView();\n configureApplicationMenu();\n broadcastState();\n });\n\n let lastWatchedLocale: string | undefined;\n watchProviderConfig(\n desktopConfigPaths.globalConfigPath,\n desktopConfigPaths.vault,\n (snapshot) => {\n const updated = snapshot.uiLocale;\n if (!updated || updated === lastWatchedLocale) return;\n lastWatchedLocale = updated;\n setMainLocale(updated);\n configureApplicationMenu();\n broadcastLocaleToEmbeddedWebuis(updated);\n if (shellView && !shellView.webContents.isDestroyed()) {\n shellView.webContents.send(IPC.localeChanged, updated);\n }\n },\n );\n\n mainWindow.on('close', (event) => {\n if (quittingAfterCleanup) return;\n event.preventDefault();\n bridge.closeAll();\n disposeAllWebuiEntries();\n void saveWindowState();\n quittingAfterCleanup = true;\n app.exit(0);\n });\n\n await restoreLastWorkspace();\n\n mainWindow.show();\n shellView.webContents.focus();\n}\n\n// ============================================================================\n// App Lifecycle\n// ============================================================================\n\napp.whenReady().then(boot);\n\napp.on('window-all-closed', () => {\n app.quit();\n});\n\napp.on('before-quit', () => {\n if (mainWindow) {\n mainWindow.removeAllListeners('close');\n void saveWindowState();\n }\n bridge.closeAll();\n disposeAllWebuiEntries();\n});\n\napp.on('activate', () => {\n if (!mainWindow) return;\n mainWindow.show();\n shellView?.webContents.focus();\n});\n","export const IPC = {\n getState: 'desktop:get-state',\n getConversation: 'desktop:get-conversation',\n getWebuiStatus: 'desktop:get-webui-status',\n openProject: 'desktop:open-project',\n registerProject: 'desktop:register-project',\n unregisterProject: 'desktop:unregister-project',\n openProjectSession: 'desktop:open-project-session',\n activateRuntime: 'desktop:activate-runtime',\n closeRuntime: 'desktop:close-runtime',\n navigateWebui: 'desktop:navigate-webui',\n reloadWebui: 'desktop:reload-webui',\n setShellSidebarCollapsed: 'desktop:set-shell-sidebar-collapsed',\n openSettings: 'desktop:open-settings',\n sendMessage: 'desktop:send-message',\n abortRuntime: 'desktop:abort-runtime',\n openRuntimeInBrowser: 'desktop:open-runtime-in-browser',\n revealRuntimeRoot: 'desktop:reveal-runtime-root',\n stateChanged: 'desktop:state-changed',\n conversationChanged: 'desktop:conversation-changed',\n webuiStatusChanged: 'desktop:webui-status-changed',\n webuiReadyChanged: 'desktop:webui-ready-changed',\n webuiPrefsChanged: 'desktop:webui-prefs-changed',\n webuiCommandAck: 'desktop:webui-command-ack',\n webuiCommand: 'desktop:webui-command',\n shellSidebarCollapsedChanged: 'desktop:shell-sidebar-collapsed-changed',\n setLocale: 'desktop:set-locale',\n localeChanged: 'desktop:locale-changed',\n // Embedded WebUI view side — the desktop shell pushes locale changes here\n // so the React WebUI inside Electron can swap i18n instantly, without waiting\n // for the config-file watcher → WS prefs.updated round-trip.\n webuiLocaleChanged: 'desktop:webui-locale-changed',\n} as const;\n","/**\n * Main-process i18n for the Electron app menu + native dialogs.\n *\n * The renderer has its own i18n (localStorage-backed, see renderer/src/i18n.ts),\n * but the MAIN process (Node) builds the application menu and native dialogs and\n * can't touch localStorage. This is a small, self-contained catalog for those\n * main-process strings. The locale is pushed from the renderer via the\n * 'desktop:set-locale' IPC channel (see preload.ts + renderer setLocale()).\n *\n * Defaults to 'en'; falls back to 'en' for any missing key.\n */\nexport type DesktopLocale = 'en' | 'tr' | 'de' | 'fr' | 'it' | 'es' | 'pt-BR';\n\ntype Catalog = Record<string, string>;\n\nconst en: Catalog = {\n windowTitle: 'WrongStack Desktop',\n noOpenProjectSessions: 'No open project sessions',\n revealProjectFolder: 'Reveal Project Folder',\n quickView: 'Quick View',\n chat: 'Chat',\n terminal: 'Terminal',\n session: 'Session',\n newSession: 'New Session',\n file: 'File',\n view: 'View',\n workspace: 'Workspace',\n projects: 'Projects',\n openProject: 'Open Project',\n registerProject: 'Register Project',\n openProjectEllipsis: 'Open Project…',\n registerProjectEllipsis: 'Register Project…',\n removeActiveFromRegistry: 'Remove Active Project from Registry',\n newSessionForActive: 'New Session for Active Project',\n settings: 'Settings',\n closeActiveRuntime: 'Close Active Runtime',\n openChat: 'Open Chat',\n focusPrompt: 'Focus Prompt',\n toggleTerminal: 'Toggle Terminal',\n newTerminal: 'New Terminal',\n files: 'Files',\n changes: 'Changes',\n sessions: 'Sessions',\n fleetHQ: 'Fleet HQ',\n commandPalette: 'Command Palette',\n modelSwitcher: 'Model Switcher',\n quickModelSwitcher: 'Quick Model Switcher',\n openInBrowser: 'Open in Browser',\n reloadWebui: 'Reload WebUI',\n reloadActiveWebui: 'Reload Active WebUI',\n closeSession: 'Close Session',\n yoloMode: 'YOLO Mode',\n nextPrediction: 'Next Prediction',\n contextAutoCompact: 'Context Auto Compact',\n compactDesktopSidebar: 'Compact Desktop Sidebar',\n};\n\nconst tr: Catalog = {\n windowTitle: 'WrongStack Desktop',\n noOpenProjectSessions: 'Açık proje oturumu yok',\n revealProjectFolder: 'Proje klasörünü göster',\n quickView: 'Hızlı görünüm',\n chat: 'Sohbet',\n terminal: 'Terminal',\n session: 'Oturum',\n newSession: 'Yeni Oturum',\n file: 'Dosya',\n view: 'Görünüm',\n workspace: 'Çalışma alanı',\n projects: 'Projeler',\n openProject: 'Proje Aç',\n registerProject: 'Proje Kaydet',\n openProjectEllipsis: 'Proje Aç…',\n registerProjectEllipsis: 'Proje Kaydet…',\n removeActiveFromRegistry: 'Aktif Projeyi Kayıttan Kaldır',\n newSessionForActive: 'Aktif Proje için Yeni Oturum',\n settings: 'Ayarlar',\n closeActiveRuntime: 'Aktif Çalışma Zamanını Kapat',\n openChat: 'Sohbeti Aç',\n focusPrompt: 'İsteme Odaklan',\n toggleTerminal: 'Terminali Aç/Kapat',\n newTerminal: 'Yeni Terminal',\n files: 'Dosyalar',\n changes: 'Değişiklikler',\n sessions: 'Oturumlar',\n fleetHQ: 'Filo HQ',\n commandPalette: 'Komut Paleti',\n modelSwitcher: 'Model Değiştirici',\n quickModelSwitcher: 'Hızlı Model Değiştirici',\n openInBrowser: 'Tarayıcıda Aç',\n reloadWebui: 'WebUI Yeniden Yükle',\n reloadActiveWebui: 'Aktif WebUI Yeniden Yükle',\n closeSession: 'Oturumu Kapat',\n yoloMode: 'YOLO Modu',\n nextPrediction: 'Sonraki Tahmin',\n contextAutoCompact: 'Bağlamı Otomatik Sıkıştır',\n compactDesktopSidebar: 'Masaüstü Kenar Çubuğunu Daralt',\n};\n\nconst de: Catalog = {\n windowTitle: 'WrongStack Desktop',\n noOpenProjectSessions: 'Keine offenen Projektsessions',\n revealProjectFolder: 'Projektordner anzeigen',\n quickView: 'Schnellansicht',\n chat: 'Chat',\n terminal: 'Terminal',\n session: 'Sitzung',\n newSession: 'Neue Sitzung',\n file: 'Datei',\n view: 'Ansicht',\n workspace: 'Workspace',\n projects: 'Projekte',\n openProject: 'Projekt öffnen',\n registerProject: 'Projekt registrieren',\n openProjectEllipsis: 'Projekt öffnen…',\n registerProjectEllipsis: 'Projekt registrieren…',\n removeActiveFromRegistry: 'Aktives Projekt aus Registry entfernen',\n newSessionForActive: 'Neue Sitzung für aktives Projekt',\n settings: 'Einstellungen',\n closeActiveRuntime: 'Aktive Runtime schließen',\n openChat: 'Chat öffnen',\n focusPrompt: 'Prompt fokussieren',\n toggleTerminal: 'Terminal umschalten',\n newTerminal: 'Neues Terminal',\n files: 'Dateien',\n changes: 'Änderungen',\n sessions: 'Sitzungen',\n fleetHQ: 'Fleet HQ',\n commandPalette: 'Command Palette',\n modelSwitcher: 'Modell-Umschalter',\n quickModelSwitcher: 'Schneller Modell-Umschalter',\n openInBrowser: 'Im Browser öffnen',\n reloadWebui: 'WebUI neu laden',\n reloadActiveWebui: 'Aktive WebUI neu laden',\n closeSession: 'Sitzung schließen',\n yoloMode: 'YOLO-Modus',\n nextPrediction: 'Next-Step-Vorhersage',\n contextAutoCompact: 'Kontext auto-kompaktieren',\n compactDesktopSidebar: 'Desktop-Seitenleiste einklappen',\n};\n\nconst fr: Catalog = {\n windowTitle: 'WrongStack Desktop',\n noOpenProjectSessions: 'Aucune session de projet ouverte',\n revealProjectFolder: 'Révéler le dossier du projet',\n quickView: 'Vue rapide',\n chat: 'Chat',\n terminal: 'Terminal',\n session: 'Session',\n newSession: 'Nouvelle session',\n file: 'Fichier',\n view: 'Affichage',\n workspace: 'Espace de travail',\n projects: 'Projets',\n openProject: 'Ouvrir un projet',\n registerProject: 'Enregistrer le projet',\n openProjectEllipsis: 'Ouvrir un projet…',\n registerProjectEllipsis: 'Enregistrer le projet…',\n removeActiveFromRegistry: \"Retirer le projet actif du registre\",\n newSessionForActive: 'Nouvelle session pour le projet actif',\n settings: 'Paramètres',\n closeActiveRuntime: \"Fermer l'exécution active\",\n openChat: 'Ouvrir le chat',\n focusPrompt: 'Focaliser le prompt',\n toggleTerminal: 'Basculer le terminal',\n newTerminal: 'Nouveau terminal',\n files: 'Fichiers',\n changes: 'Modifications',\n sessions: 'Sessions',\n fleetHQ: 'Fleet HQ',\n commandPalette: 'Palette de commandes',\n modelSwitcher: 'Sélecteur de modèle',\n quickModelSwitcher: 'Sélecteur de modèle rapide',\n openInBrowser: 'Ouvrir dans le navigateur',\n reloadWebui: 'Recharger WebUI',\n reloadActiveWebui: 'Recharger WebUI actif',\n closeSession: 'Fermer la session',\n yoloMode: 'Mode YOLO',\n nextPrediction: 'Prédiction du prochain pas',\n contextAutoCompact: 'Compacter le contexte auto',\n compactDesktopSidebar: 'Réduire la barre latérale',\n};\n\nconst it: Catalog = {\n windowTitle: 'WrongStack Desktop',\n noOpenProjectSessions: 'Nessuna sessione di progetto aperta',\n revealProjectFolder: 'Rivela cartella progetto',\n quickView: 'Vista rapida',\n chat: 'Chat',\n terminal: 'Terminale',\n session: 'Sessione',\n newSession: 'Nuova sessione',\n file: 'File',\n view: 'Visualizza',\n workspace: 'Workspace',\n projects: 'Progetti',\n openProject: 'Apri progetto',\n registerProject: 'Registra progetto',\n openProjectEllipsis: 'Apri progetto…',\n registerProjectEllipsis: 'Registra progetto…',\n removeActiveFromRegistry: 'Rimuovi progetto attivo dal registro',\n newSessionForActive: 'Nuova sessione per il progetto attivo',\n settings: 'Impostazioni',\n closeActiveRuntime: 'Chiudi runtime attivo',\n openChat: 'Apri chat',\n focusPrompt: 'Focalizza prompt',\n toggleTerminal: 'Attiva/disattiva terminale',\n newTerminal: 'Nuovo terminale',\n files: 'File',\n changes: 'Modifiche',\n sessions: 'Sessioni',\n fleetHQ: 'Fleet HQ',\n commandPalette: 'Palette comandi',\n modelSwitcher: 'Selettore modello',\n quickModelSwitcher: 'Selettore modello rapido',\n openInBrowser: 'Apri nel browser',\n reloadWebui: 'Ricarica WebUI',\n reloadActiveWebui: 'Ricarica WebUI attivo',\n closeSession: 'Chiudi sessione',\n yoloMode: 'Modalità YOLO',\n nextPrediction: 'Predizione prossimo passo',\n contextAutoCompact: 'Compatta contesto auto',\n compactDesktopSidebar: 'Comprimi barra laterale desktop',\n};\n\nconst es: Catalog = {\n windowTitle: 'WrongStack Desktop',\n noOpenProjectSessions: 'Sin sesiones de proyecto abiertas',\n revealProjectFolder: 'Revelar carpeta del proyecto',\n quickView: 'Vista rápida',\n chat: 'Chat',\n terminal: 'Terminal',\n session: 'Sesión',\n newSession: 'Nueva sesión',\n file: 'Archivo',\n view: 'Ver',\n workspace: 'Espacio de trabajo',\n projects: 'Proyectos',\n openProject: 'Abrir proyecto',\n registerProject: 'Registrar proyecto',\n openProjectEllipsis: 'Abrir proyecto…',\n registerProjectEllipsis: 'Registrar proyecto…',\n removeActiveFromRegistry: 'Quitar proyecto activo del registro',\n newSessionForActive: 'Nueva sesión para el proyecto activo',\n settings: 'Ajustes',\n closeActiveRuntime: 'Cerrar runtime activo',\n openChat: 'Abrir chat',\n focusPrompt: 'Focalizar indicación',\n toggleTerminal: 'Alternar terminal',\n newTerminal: 'Nuevo terminal',\n files: 'Archivos',\n changes: 'Cambios',\n sessions: 'Sesiones',\n fleetHQ: 'Fleet HQ',\n commandPalette: 'Paleta de comandos',\n modelSwitcher: 'Selector de modelo',\n quickModelSwitcher: 'Selector de modelo rápido',\n openInBrowser: 'Abrir en el navegador',\n reloadWebui: 'Recargar WebUI',\n reloadActiveWebui: 'Recargar WebUI activo',\n closeSession: 'Cerrar sesión',\n yoloMode: 'Modo YOLO',\n nextPrediction: 'Predicción del siguiente paso',\n contextAutoCompact: 'Auto-compactar contexto',\n compactDesktopSidebar: 'Contraer barra lateral de escritorio',\n};\n\nconst ptBR: Catalog = {\n windowTitle: 'WrongStack Desktop',\n noOpenProjectSessions: 'Sem sessões de projeto abertas',\n revealProjectFolder: 'Revelar pasta do projeto',\n quickView: 'Vista rápida',\n chat: 'Chat',\n terminal: 'Terminal',\n session: 'Sessão',\n newSession: 'Nova sessão',\n file: 'Arquivo',\n view: 'Ver',\n workspace: 'Workspace',\n projects: 'Projetos',\n openProject: 'Abrir projeto',\n registerProject: 'Registrar projeto',\n openProjectEllipsis: 'Abrir projeto…',\n registerProjectEllipsis: 'Registrar projeto…',\n removeActiveFromRegistry: 'Remover projeto ativo do registro',\n newSessionForActive: 'Nova sessão para o projeto ativo',\n settings: 'Configurações',\n closeActiveRuntime: 'Fechar runtime ativo',\n openChat: 'Abrir chat',\n focusPrompt: 'Focar prompt',\n toggleTerminal: 'Alternar terminal',\n newTerminal: 'Novo terminal',\n files: 'Arquivos',\n changes: 'Alterações',\n sessions: 'Sessões',\n fleetHQ: 'Fleet HQ',\n commandPalette: 'Paleta de comandos',\n modelSwitcher: 'Seletor de modelo',\n quickModelSwitcher: 'Seletor de modelo rápido',\n openInBrowser: 'Abrir no navegador',\n reloadWebui: 'Recarregar WebUI',\n reloadActiveWebui: 'Recarregar WebUI ativo',\n closeSession: 'Fechar sessão',\n yoloMode: 'Modo YOLO',\n nextPrediction: 'Previsão do próximo passo',\n contextAutoCompact: 'Auto-compactar contexto',\n compactDesktopSidebar: 'Recolher barra lateral do desktop',\n};\n\nconst CATALOGS: Record<DesktopLocale, Catalog> = { en, tr, de, fr, it, es, 'pt-BR': ptBR };\n\nlet mainLocale: DesktopLocale = 'en';\n\n/** Renderer pushes its locale here via the 'desktop:set-locale' IPC channel. */\nexport function setMainLocale(locale: string): void {\n if (locale in CATALOGS) mainLocale = locale as DesktopLocale;\n}\n\n/** Current main-process locale (for the boot push to the shell renderer). */\nexport function getMainLocale(): DesktopLocale {\n return mainLocale;\n}\n\n/** Translate a main-process key, falling back to en then the key itself. */\nexport function tMain(key: string): string {\n return CATALOGS[mainLocale]?.[key] ?? CATALOGS.en[key] ?? key;\n}\n","/**\n * Desktop-shell read/write of the shared display language (`Config.uiLocale`).\n *\n * The desktop main process can't use the WebUI's localStorage-backed i18n, and\n * it isn't a WS client, so it touches `~/.wrongstack/config.json` directly to\n * (a) read the language at boot and (b) persist a change made in the shell —\n * using the SAME read → decrypt → mutate → encrypt → atomicWrite cycle as the\n * WebUI server (`pref-helpers.updateGlobalConfig`) so encrypted secrets in the\n * file are preserved byte-for-byte.\n *\n * The standalone WebUI's `watchProviderConfig` (now surfacing `uiLocale`) lets\n * a running shell follow a language change written by any other process.\n */\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\nimport { DefaultSecretVault } from '@wrongstack/core';\nimport { decryptConfigSecrets, encryptConfigSecrets } from '@wrongstack/core/security';\nimport { atomicWrite, wstackGlobalRoot } from '@wrongstack/core/utils';\nimport type { SecretVault } from '@wrongstack/core';\n\nconst globalConfigPath = path.join(wstackGlobalRoot(), 'config.json');\nconst vault: SecretVault = new DefaultSecretVault({\n keyFile: path.join(wstackGlobalRoot(), '.key'),\n});\n\n/** Read the persisted display language, or undefined when unset/unreadable. */\nexport async function readUiLocale(): Promise<string | undefined> {\n let raw: string;\n try {\n raw = await fs.readFile(globalConfigPath, 'utf8');\n } catch {\n return undefined;\n }\n try {\n const decrypted = decryptConfigSecrets(\n JSON.parse(raw) as Record<string, unknown>,\n vault,\n ) as { uiLocale?: string };\n const value = decrypted.uiLocale;\n return typeof value === 'string' && value ? value : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** The global config path + vault, for the live watcher in main.ts. */\nexport const desktopConfigPaths = { globalConfigPath, vault } as const;\n\n/**\n * Persist a display-language change. Refuses to overwrite a corrupt config\n * (the operator should fix it). Best-effort: never throws to the caller.\n */\nexport async function writeUiLocale(code: string): Promise<void> {\n let raw: string;\n try {\n raw = await fs.readFile(globalConfigPath, 'utf8');\n } catch {\n raw = '{}';\n }\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(raw) as Record<string, unknown>;\n } catch {\n return; // corrupt config — don't clobber\n }\n const decrypted = decryptConfigSecrets(parsed, vault) as Record<string, unknown>;\n decrypted.uiLocale = code;\n const encrypted = encryptConfigSecrets(decrypted, vault);\n await atomicWrite(globalConfigPath, JSON.stringify(encrypted, null, 2), { mode: 0o600 });\n}\n","import { type ChildProcess, spawn } from 'node:child_process';\nimport { randomBytes } from 'node:crypto';\nimport { EventEmitter } from 'node:events';\nimport * as fs from 'node:fs/promises';\nimport * as http from 'node:http';\nimport { createRequire } from 'node:module';\nimport * as net from 'node:net';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { atomicWrite, projectSlug, toErrorMessage, wstackGlobalRoot } from '@wrongstack/core/utils';\nimport type {\n DesktopProjectEntry,\n DesktopRuntimeKind,\n DesktopRuntimeRecord,\n DesktopStateSnapshot,\n DesktopWindowState,\n} from '../shared/types.js';\n\ninterface DesktopStateFile {\n recentProjects?: DesktopProjectEntry[] | undefined;\n openProjects?: string[] | undefined;\n openProjectSessions?: DesktopProjectSessionState[] | undefined;\n activeRuntimeId?: string | null | undefined;\n activeProjectRoot?: string | null | undefined;\n window?: DesktopWindowState | undefined;\n}\n\ninterface DesktopProjectSessionState {\n runtimeId?: string | undefined;\n name?: string | undefined;\n root: string;\n startedAt?: string | undefined;\n}\n\ninterface RuntimeInternal extends DesktopRuntimeRecord {\n child: ChildProcess | null;\n token: string;\n logs: string[];\n logNotifyTimer: ReturnType<typeof setTimeout> | null;\n}\n\ninterface OpenProjectOptions {\n name?: string | undefined;\n kind?: DesktopRuntimeKind | undefined;\n touchRecent?: boolean | undefined;\n forceNew?: boolean | undefined;\n runtimeId?: string | undefined;\n}\n\nconst HTTP_PORT_START = 34560;\nconst WS_PORT_START = 34660;\nconst START_TIMEOUT_MS = 30_000;\nconst MIN_WINDOW_WIDTH = 760;\nconst MIN_WINDOW_HEIGHT = 520;\n\nexport class DesktopRuntimeManager extends EventEmitter {\n private readonly runtimes = new Map<string, RuntimeInternal>();\n private readonly stateFile = path.join(wstackGlobalRoot(), 'desktop.json');\n private recentProjects: DesktopProjectEntry[] = [];\n private registeredProjects: DesktopProjectEntry[] = [];\n private restoreProjectSessions: DesktopProjectSessionState[] = [];\n private restoreActiveRuntimeId: string | null = null;\n private restoreActiveProjectRoot: string | null = null;\n private lastActiveProjectRoot: string | null = null;\n private windowState: DesktopWindowState | null = null;\n private activeRuntimeId: string | null = null;\n private restoring = false;\n private workspaceRestoreCompleted = false;\n\n async init(): Promise<void> {\n const state = await this.loadDesktopState();\n this.recentProjects = state.recentProjects;\n this.registeredProjects = await readGlobalProjectManifest();\n this.restoreProjectSessions = state.openProjectSessions;\n this.restoreActiveRuntimeId = state.activeRuntimeId;\n this.restoreActiveProjectRoot = state.activeProjectRoot;\n this.lastActiveProjectRoot = state.activeProjectRoot;\n this.windowState = state.window;\n }\n\n snapshot(): DesktopStateSnapshot {\n return {\n activeRuntimeId: this.activeRuntimeId,\n runtimes: Array.from(this.runtimes.values()).map(publicRuntime),\n recentProjects: [...this.recentProjects],\n registeredProjects: [...this.registeredProjects],\n restoring: this.restoring,\n };\n }\n\n getWindowState(): DesktopWindowState | null {\n return this.windowState ? { ...this.windowState } : null;\n }\n\n async saveWindowState(window: DesktopWindowState): Promise<void> {\n this.windowState = { ...window };\n await this.saveDesktopState();\n }\n\n async restoreLastWorkspace(): Promise<void> {\n const sessions = this.restoreProjectSessions.filter(\n (session) => typeof session.root === 'string' && session.root.trim(),\n );\n if (sessions.length === 0 || this.restoring || this.runtimes.size > 0) {\n this.workspaceRestoreCompleted = true;\n return;\n }\n this.restoring = true;\n this.emitChanged();\n try {\n const seen = new Map<string, number>();\n for (const session of sessions) {\n const key = pathKey(session.root);\n const seenCount = seen.get(key) ?? 0;\n seen.set(key, seenCount + 1);\n await this.openProject(session.root, {\n forceNew: seenCount > 0,\n name: session.name,\n runtimeId: session.runtimeId,\n }).catch((err) => {\n process.stderr.write(\n `[desktop:restore] Failed to restore ${session.root}: ${toErrorMessage(err)}\\n`,\n );\n });\n }\n let restoredActive = false;\n if (this.restoreActiveRuntimeId) {\n const active = this.runtimes.get(this.restoreActiveRuntimeId);\n if (active) {\n await this.activateRuntime(active.id);\n restoredActive = true;\n }\n }\n if (!restoredActive && this.restoreActiveProjectRoot) {\n const active = Array.from(this.runtimes.values()).find((runtime) =>\n samePath(runtime.root, this.restoreActiveProjectRoot ?? ''),\n );\n if (active) await this.activateRuntime(active.id);\n }\n } finally {\n this.restoring = false;\n this.workspaceRestoreCompleted = true;\n this.emitChanged();\n await this.saveDesktopState();\n }\n }\n\n getRuntime(id: string): DesktopRuntimeRecord | undefined {\n const runtime = this.runtimes.get(id);\n return runtime ? publicRuntime(runtime) : undefined;\n }\n\n getRuntimeUrlWithToken(id: string): string | undefined {\n const runtime = this.runtimes.get(id);\n if (!runtime) return undefined;\n const url = new URL(runtime.url);\n url.searchParams.set('token', runtime.token);\n url.searchParams.set('shell', 'desktop');\n return url.toString();\n }\n\n getRuntimeWsUrlWithToken(id: string): string | undefined {\n const runtime = this.runtimes.get(id);\n if (!runtime) return undefined;\n const url = new URL(`ws://127.0.0.1:${runtime.wsPort}`);\n url.searchParams.set('token', runtime.token);\n return url.toString();\n }\n\n async openProject(\n projectRoot: string,\n options: OpenProjectOptions = {},\n ): Promise<DesktopRuntimeRecord> {\n const resolved = path.resolve(projectRoot);\n const stat = await fs.stat(resolved).catch(() => null);\n if (!stat?.isDirectory()) throw new Error(`Not a directory: ${resolved}`);\n const kind = options.kind ?? 'project';\n const touchRecent = options.touchRecent ?? kind === 'project';\n const forceNew = options.forceNew === true;\n\n if (!forceNew) {\n const existing = Array.from(this.runtimes.values()).find(\n (runtime) =>\n samePath(runtime.root, resolved) &&\n runtime.kind === kind &&\n (runtime.status === 'starting' || runtime.status === 'running'),\n );\n if (existing) {\n this.activeRuntimeId = existing.id;\n if (existing.kind === 'project') this.lastActiveProjectRoot = existing.root;\n if (touchRecent) {\n await this.touchProject(existing.root);\n } else {\n await this.persistWorkspaceState();\n }\n this.emitChanged();\n return publicRuntime(existing);\n }\n const staleSameRoot = Array.from(this.runtimes.values()).filter(\n (runtime) => samePath(runtime.root, resolved) && runtime.kind === kind,\n );\n for (const stale of staleSameRoot) {\n await this.closeRuntimeInternal(stale.id, { persistWorkspace: false });\n }\n }\n\n const slug = projectSlug(resolved);\n const requestedRuntimeId = normalizeRuntimeId(options.runtimeId);\n const runtimeId =\n requestedRuntimeId && !this.runtimes.has(requestedRuntimeId)\n ? requestedRuntimeId\n : `${slug}-${randomBytes(3).toString('hex')}`;\n const name = options.name ?? nextRuntimeName(this.runtimes, resolved, kind);\n const httpPort = await findFreePort(HTTP_PORT_START, usedPorts(this.runtimes));\n const wsPort = await findFreePort(\n WS_PORT_START,\n new Set([...usedPorts(this.runtimes), httpPort]),\n );\n const token = randomBytes(24).toString('hex');\n const runtime: RuntimeInternal = {\n id: runtimeId,\n name,\n root: resolved,\n slug,\n kind,\n status: 'starting',\n httpPort,\n wsPort,\n url: `http://127.0.0.1:${httpPort}`,\n startedAt: new Date().toISOString(),\n token,\n child: null,\n logs: [],\n logNotifyTimer: null,\n };\n this.runtimes.set(runtimeId, runtime);\n this.activeRuntimeId = runtimeId;\n if (kind === 'project') this.lastActiveProjectRoot = resolved;\n if (touchRecent) {\n await this.touchProject(resolved);\n } else {\n await this.persistWorkspaceState();\n }\n this.emitChanged();\n\n try {\n const entry = resolveWebUiEntry();\n const child = spawn(\n process.execPath,\n [\n entry,\n '--host',\n '127.0.0.1',\n '--port',\n String(httpPort),\n '--ws-port',\n String(wsPort),\n '--token',\n token,\n '--require-token',\n ],\n {\n cwd: resolved,\n env: {\n ...process.env,\n ELECTRON_RUN_AS_NODE: '1',\n WEBUI_STRICT_PORT: '1',\n WRONGSTACK_DESKTOP: '1',\n },\n stdio: ['ignore', 'pipe', 'pipe'],\n windowsHide: true,\n },\n );\n runtime.child = child;\n runtime.pid = child.pid;\n child.stdout?.on('data', (chunk: Buffer) => {\n const text = chunk.toString();\n appendRuntimeLog(runtime, 'stdout', text);\n this.scheduleLogChanged(runtime);\n process.stdout.write(`[desktop:${runtime.id}] ${text}`);\n });\n child.stderr?.on('data', (chunk: Buffer) => {\n const text = chunk.toString();\n appendRuntimeLog(runtime, 'stderr', text);\n this.scheduleLogChanged(runtime);\n process.stderr.write(`[desktop:${runtime.id}] ${text}`);\n });\n child.once('exit', (code, signal) => {\n runtime.status = runtime.status === 'error' ? 'error' : 'stopped';\n runtime.error =\n runtime.status === 'error'\n ? runtime.error\n : code === 0\n ? undefined\n : `Exited with ${signal ?? `code ${code ?? 'unknown'}`}`;\n runtime.child = null;\n if (this.activeRuntimeId === runtime.id) {\n this.activeRuntimeId = firstRunningRuntimeId(this.runtimes);\n }\n this.emitChanged();\n });\n\n await waitForHttpReady(runtime.url, token, START_TIMEOUT_MS);\n runtime.status = 'running';\n await this.persistWorkspaceState();\n this.emitChanged();\n return publicRuntime(runtime);\n } catch (err) {\n runtime.status = 'error';\n runtime.error = toErrorMessage(err);\n await terminateProcessTree(runtime.child);\n runtime.child = null;\n this.emitChanged();\n throw err;\n }\n }\n\n async activateRuntime(id: string): Promise<void> {\n const runtime = this.runtimes.get(id);\n if (!runtime) throw new Error(`Runtime not found: ${id}`);\n this.activeRuntimeId = id;\n if (runtime.kind === 'project') this.lastActiveProjectRoot = runtime.root;\n if (runtime.kind === 'project') {\n await this.touchProject(runtime.root);\n } else {\n await this.persistWorkspaceState();\n }\n this.emitChanged();\n }\n\n async closeRuntime(id: string): Promise<void> {\n await this.closeRuntimeInternal(id, { persistWorkspace: true });\n }\n\n async closeAll(options: { persistWorkspace?: boolean } = {}): Promise<void> {\n const persistWorkspace = options.persistWorkspace ?? true;\n await Promise.all(\n Array.from(this.runtimes.keys()).map((id) =>\n this.closeRuntimeInternal(id, { persistWorkspace }),\n ),\n );\n }\n\n async registerProject(projectRoot: string): Promise<void> {\n const resolved = path.resolve(projectRoot);\n const stat = await fs.stat(resolved).catch(() => null);\n if (!stat?.isDirectory()) throw new Error(`Not a directory: ${resolved}`);\n const now = new Date().toISOString();\n const entry: DesktopProjectEntry = {\n name: path.basename(resolved) || resolved,\n root: resolved,\n slug: projectSlug(resolved),\n lastSeen: now,\n lastWorkingDir: resolved,\n };\n this.registeredProjects = await touchGlobalProjectManifest(entry);\n this.emitChanged();\n }\n\n async unregisterProject(projectRoot: string): Promise<void> {\n const resolved = path.resolve(projectRoot);\n this.registeredProjects = await removeGlobalProjectManifest(resolved);\n this.recentProjects = this.recentProjects.filter((project) => !samePath(project.root, resolved));\n await this.saveDesktopState();\n this.emitChanged();\n }\n\n private async closeRuntimeInternal(\n id: string,\n options: { persistWorkspace: boolean },\n ): Promise<void> {\n const runtime = this.runtimes.get(id);\n if (!runtime) return;\n runtime.status = 'stopped';\n const child = runtime.child;\n runtime.child = null;\n await terminateProcessTree(child);\n if (runtime.logNotifyTimer) {\n clearTimeout(runtime.logNotifyTimer);\n runtime.logNotifyTimer = null;\n }\n this.runtimes.delete(id);\n if (this.activeRuntimeId === id) this.activeRuntimeId = firstRunningRuntimeId(this.runtimes);\n if (this.lastActiveProjectRoot && samePath(this.lastActiveProjectRoot, runtime.root)) {\n this.lastActiveProjectRoot = firstProjectRuntimeRoot(this.runtimes);\n }\n if (options.persistWorkspace) {\n await this.persistWorkspaceState();\n }\n this.emitChanged();\n }\n\n private async touchProject(projectRoot: string): Promise<void> {\n const resolved = path.resolve(projectRoot);\n const now = new Date().toISOString();\n const entry: DesktopProjectEntry = {\n name: path.basename(resolved) || resolved,\n root: resolved,\n slug: projectSlug(resolved),\n lastSeen: now,\n lastWorkingDir: resolved,\n };\n this.recentProjects = [\n entry,\n ...this.recentProjects.filter((p) => !samePath(p.root, resolved)),\n ].slice(0, 24);\n const [, registeredProjects] = await Promise.all([\n this.saveDesktopState(),\n touchGlobalProjectManifest(entry),\n ]);\n this.registeredProjects = registeredProjects;\n }\n\n private async persistWorkspaceState(): Promise<void> {\n await this.saveDesktopState();\n }\n\n private async loadDesktopState(): Promise<{\n recentProjects: DesktopProjectEntry[];\n openProjects: string[];\n openProjectSessions: DesktopProjectSessionState[];\n activeRuntimeId: string | null;\n activeProjectRoot: string | null;\n window: DesktopWindowState | null;\n }> {\n try {\n const raw = await fs.readFile(this.stateFile, 'utf8');\n const parsed = JSON.parse(raw) as DesktopStateFile;\n const openProjects = normalizePathList(parsed.openProjects);\n const openProjectSessions = normalizeSessionStateList(\n parsed.openProjectSessions,\n openProjects,\n );\n return {\n recentProjects: Array.isArray(parsed.recentProjects) ? parsed.recentProjects : [],\n openProjects,\n openProjectSessions,\n activeRuntimeId: normalizeRuntimeId(parsed.activeRuntimeId) ?? null,\n activeProjectRoot:\n typeof parsed.activeProjectRoot === 'string' && parsed.activeProjectRoot.trim()\n ? path.resolve(parsed.activeProjectRoot)\n : null,\n window: normalizeWindowState(parsed.window),\n };\n } catch {\n return {\n recentProjects: [],\n openProjects: [],\n openProjectSessions: [],\n activeRuntimeId: null,\n activeProjectRoot: null,\n window: null,\n };\n }\n }\n\n private async saveDesktopState(): Promise<void> {\n await fs.mkdir(path.dirname(this.stateFile), { recursive: true });\n const liveProjectSessions = Array.from(this.runtimes.values())\n .filter((runtime) => runtime.status !== 'stopped' && runtime.kind === 'project')\n .map((runtime) => runtimeToSessionState(runtime));\n const openProjectSessions =\n liveProjectSessions.length === 0 && !this.workspaceRestoreCompleted\n ? [...this.restoreProjectSessions]\n : liveProjectSessions;\n const openProjects = openProjectSessions.map((session) => session.root);\n const activeRuntime = this.activeRuntimeId ? this.runtimes.get(this.activeRuntimeId) : null;\n const lastActiveProjectRoot = this.lastActiveProjectRoot;\n const fallbackSession =\n lastActiveProjectRoot\n ? openProjectSessions.find((session) => samePath(session.root, lastActiveProjectRoot))\n : undefined;\n const activeSession =\n activeRuntime?.kind === 'project'\n ? runtimeToSessionState(activeRuntime)\n : (fallbackSession ?? openProjectSessions[0]);\n const activeRoot = activeSession?.root;\n const activeRuntimeId = activeSession?.runtimeId ?? null;\n await atomicWrite(\n this.stateFile,\n `${JSON.stringify(\n {\n recentProjects: this.recentProjects,\n openProjects,\n openProjectSessions,\n activeRuntimeId,\n activeProjectRoot: activeRoot ?? null,\n window: this.windowState,\n },\n null,\n 2,\n )}\\n`,\n { mode: 0o600 },\n );\n }\n\n private emitChanged(): void {\n this.emit('changed');\n }\n\n private scheduleLogChanged(runtime: RuntimeInternal): void {\n if (runtime.logNotifyTimer) return;\n runtime.logNotifyTimer = setTimeout(() => {\n runtime.logNotifyTimer = null;\n if (this.runtimes.get(runtime.id) === runtime) {\n this.emitChanged();\n }\n }, 250);\n }\n}\n\nasync function terminateProcessTree(child: ChildProcess | null): Promise<void> {\n if (!child || child.killed || !child.pid) return;\n if (process.platform !== 'win32') {\n child.kill('SIGTERM');\n return;\n }\n\n await new Promise<void>((resolve) => {\n let settled = false;\n const finish = () => {\n if (settled) return;\n settled = true;\n resolve();\n };\n const timer = setTimeout(finish, 3000);\n timer.unref?.();\n const killer = spawn('taskkill', ['/PID', String(child.pid), '/T', '/F'], {\n stdio: 'ignore',\n windowsHide: true,\n });\n killer.once('exit', () => {\n clearTimeout(timer);\n finish();\n });\n killer.once('error', () => {\n clearTimeout(timer);\n child.kill();\n finish();\n });\n });\n}\n\nfunction publicRuntime(runtime: RuntimeInternal): DesktopRuntimeRecord {\n const {\n child: _child,\n token: _token,\n logs,\n logNotifyTimer: _logNotifyTimer,\n ...record\n } = runtime;\n void _child;\n void _token;\n void _logNotifyTimer;\n return {\n ...record,\n recentLogs: logs.slice(-40),\n };\n}\n\nfunction runtimeToSessionState(runtime: RuntimeInternal): DesktopProjectSessionState {\n return {\n runtimeId: runtime.id,\n name: runtime.name,\n root: runtime.root,\n startedAt: runtime.startedAt,\n };\n}\n\nfunction appendRuntimeLog(runtime: RuntimeInternal, stream: 'stdout' | 'stderr', text: string): void {\n for (const rawLine of text.split(/\\r?\\n/)) {\n const line = rawLine.trimEnd();\n if (!line) continue;\n runtime.logs.push(`[${stream}] ${line}`);\n }\n if (runtime.logs.length > 120) {\n runtime.logs.splice(0, runtime.logs.length - 120);\n }\n}\n\nfunction normalizePathList(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n const roots: string[] = [];\n for (const item of value) {\n if (typeof item !== 'string' || !item.trim()) continue;\n const resolved = path.resolve(item);\n roots.push(resolved);\n }\n return roots.slice(0, 12);\n}\n\nfunction normalizeSessionStateList(\n value: unknown,\n fallbackRoots: string[],\n): DesktopProjectSessionState[] {\n if (!Array.isArray(value)) {\n return fallbackRoots.map((root) => ({ root })).slice(0, 12);\n }\n const sessions: DesktopProjectSessionState[] = [];\n for (const item of value) {\n if (!item || typeof item !== 'object') continue;\n const candidate = item as Partial<DesktopProjectSessionState>;\n if (typeof candidate.root !== 'string' || !candidate.root.trim()) continue;\n const session: DesktopProjectSessionState = {\n root: path.resolve(candidate.root),\n };\n const runtimeId = normalizeRuntimeId(candidate.runtimeId);\n if (runtimeId) session.runtimeId = runtimeId;\n if (typeof candidate.name === 'string' && candidate.name.trim()) {\n session.name = candidate.name.trim().slice(0, 120);\n }\n if (typeof candidate.startedAt === 'string' && candidate.startedAt.trim()) {\n session.startedAt = candidate.startedAt.trim();\n }\n sessions.push(session);\n }\n return sessions.slice(0, 12);\n}\n\nfunction normalizeRuntimeId(value: unknown): string | undefined {\n if (typeof value !== 'string') return undefined;\n const trimmed = value.trim();\n if (!/^[a-zA-Z0-9._:-]{3,120}$/.test(trimmed)) return undefined;\n return trimmed;\n}\n\nfunction normalizeWindowState(value: unknown): DesktopWindowState | null {\n if (!value || typeof value !== 'object') return null;\n const candidate = value as Partial<DesktopWindowState>;\n const width = Number(candidate.width);\n const height = Number(candidate.height);\n if (!Number.isFinite(width) || !Number.isFinite(height)) return null;\n if (width < MIN_WINDOW_WIDTH || height < MIN_WINDOW_HEIGHT) return null;\n const state: DesktopWindowState = {\n width: Math.round(width),\n height: Math.round(height),\n maximized: Boolean(candidate.maximized),\n };\n if (Number.isFinite(Number(candidate.x))) state.x = Math.round(Number(candidate.x));\n if (Number.isFinite(Number(candidate.y))) state.y = Math.round(Number(candidate.y));\n return state;\n}\n\nfunction firstRunningRuntimeId(runtimes: Map<string, RuntimeInternal>): string | null {\n return Array.from(runtimes.values()).find((runtime) => runtime.status === 'running')?.id ?? null;\n}\n\nfunction firstProjectRuntimeRoot(runtimes: Map<string, RuntimeInternal>): string | null {\n return (\n Array.from(runtimes.values()).find(\n (runtime) => runtime.status === 'running' && runtime.kind === 'project',\n )?.root ?? null\n );\n}\n\nfunction usedPorts(runtimes: Map<string, RuntimeInternal>): Set<number> {\n const ports = new Set<number>();\n for (const runtime of runtimes.values()) {\n ports.add(runtime.httpPort);\n ports.add(runtime.wsPort);\n }\n return ports;\n}\n\nfunction nextRuntimeName(\n runtimes: Map<string, RuntimeInternal>,\n root: string,\n kind: DesktopRuntimeKind,\n): string {\n const baseName = path.basename(root) || root;\n if (kind !== 'project') return baseName;\n const liveSameRoot = Array.from(runtimes.values()).filter(\n (runtime) =>\n runtime.kind === 'project' &&\n samePath(runtime.root, root) &&\n runtime.status !== 'stopped',\n ).length;\n return liveSameRoot === 0 ? baseName : `${baseName} #${liveSameRoot + 1}`;\n}\n\nfunction pathKey(value: string): string {\n const resolved = path.resolve(value);\n return os.platform() === 'win32' ? resolved.toLowerCase() : resolved;\n}\n\nasync function findFreePort(startPort: number, exclude: Set<number>): Promise<number> {\n for (let port = startPort; port < startPort + 200; port++) {\n if (exclude.has(port)) continue;\n if (await isPortFree(port)) return port;\n }\n throw new Error(`No free local port found near ${startPort}`);\n}\n\nfunction isPortFree(port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const server = net.createServer();\n server.once('error', () => resolve(false));\n server.once('listening', () => {\n server.close(() => resolve(true));\n });\n server.listen(port, '127.0.0.1');\n });\n}\n\nfunction waitForHttpReady(baseUrl: string, token: string, timeoutMs: number): Promise<void> {\n const deadline = Date.now() + timeoutMs;\n const url = new URL(baseUrl);\n url.searchParams.set('token', token);\n url.searchParams.set('shell', 'desktop');\n\n return new Promise((resolve, reject) => {\n const probe = (): void => {\n const req = http.get(url, (res) => {\n res.resume();\n if (res.statusCode && res.statusCode >= 200 && res.statusCode < 500) {\n resolve();\n return;\n }\n retry();\n });\n req.once('error', retry);\n req.setTimeout(1000, () => {\n req.destroy();\n retry();\n });\n };\n const retry = (): void => {\n if (Date.now() >= deadline) {\n reject(new Error(`WebUI did not become ready at ${baseUrl}`));\n return;\n }\n setTimeout(probe, 250);\n };\n probe();\n });\n}\n\nfunction resolveWebUiEntry(): string {\n if (process.env['WRONGSTACK_WEBUI_ENTRY']) {\n return path.resolve(process.env['WRONGSTACK_WEBUI_ENTRY']);\n }\n const require = createRequire(import.meta.url);\n const serverIndex = require.resolve('@wrongstack/webui/server');\n return path.join(path.dirname(serverIndex), 'entry.js');\n}\n\nasync function readGlobalProjectManifest(): Promise<DesktopProjectEntry[]> {\n const manifestFile = path.join(wstackGlobalRoot(), 'projects.json');\n try {\n const raw = await fs.readFile(manifestFile, 'utf8');\n const parsed = JSON.parse(raw) as { projects?: DesktopProjectEntry[] | undefined };\n const projects = Array.isArray(parsed.projects) ? parsed.projects : [];\n return projects\n .filter((project) => typeof project?.root === 'string' && project.root.trim())\n .map((project) => ({\n ...project,\n name: project.name || path.basename(project.root) || project.root,\n root: path.resolve(project.root),\n slug: project.slug || projectSlug(path.resolve(project.root)),\n }))\n .sort((a, b) => (b.lastSeen ?? b.createdAt ?? '').localeCompare(a.lastSeen ?? a.createdAt ?? ''))\n .slice(0, 80);\n } catch {\n return [];\n }\n}\n\nasync function touchGlobalProjectManifest(entry: DesktopProjectEntry): Promise<DesktopProjectEntry[]> {\n const manifestFile = path.join(wstackGlobalRoot(), 'projects.json');\n const projects = await readGlobalProjectManifest();\n const existing = projects.find((p) => samePath(p.root, entry.root));\n if (existing) {\n existing.name = entry.name;\n existing.slug = entry.slug;\n existing.lastSeen = entry.lastSeen;\n existing.lastWorkingDir = entry.lastWorkingDir;\n } else {\n projects.push({ ...entry, createdAt: entry.lastSeen });\n }\n const sorted = projects\n .sort((a, b) => (b.lastSeen ?? b.createdAt ?? '').localeCompare(a.lastSeen ?? a.createdAt ?? ''))\n .slice(0, 80);\n await fs.mkdir(path.dirname(manifestFile), { recursive: true });\n await atomicWrite(manifestFile, `${JSON.stringify({ projects: sorted }, null, 2)}\\n`, { mode: 0o600 });\n return sorted;\n}\n\nasync function removeGlobalProjectManifest(projectRoot: string): Promise<DesktopProjectEntry[]> {\n const manifestFile = path.join(wstackGlobalRoot(), 'projects.json');\n const resolved = path.resolve(projectRoot);\n const projects = (await readGlobalProjectManifest()).filter(\n (project) => !samePath(project.root, resolved),\n );\n await fs.mkdir(path.dirname(manifestFile), { recursive: true });\n await atomicWrite(manifestFile, `${JSON.stringify({ projects }, null, 2)}\\n`, { mode: 0o600 });\n return projects;\n}\n\nfunction samePath(left: string, right: string): boolean {\n const a = path.resolve(left);\n const b = path.resolve(right);\n return os.platform() === 'win32' ? a.toLowerCase() === b.toLowerCase() : a === b;\n}\n\nexport function rendererIndexPath(): string {\n return fileURLToPath(new URL('../renderer/index.html', import.meta.url));\n}\n\nexport function preloadPath(): string {\n return fileURLToPath(new URL('../preload/preload.cjs', import.meta.url));\n}\n\nexport function webuiPreloadPath(): string {\n return fileURLToPath(new URL('../preload/webui-preload.cjs', import.meta.url));\n}\n\n/**\n * Filesystem root for the built-in \"Global Settings\" workspace.\n *\n * The desktop shell opens this directory as a `global-settings` runtime so the\n * user can edit provider/config state without an actual project checkout. It\n * lives under the WrongStack global root next to `desktop.json` and\n * `projects.json`.\n */\nexport function desktopSettingsWorkspaceRoot(): string {\n return path.join(wstackGlobalRoot(), 'settings');\n}\n","import type { DesktopWebuiCommand } from '../shared/types.js';\n\ntype DesktopCommandAction = NonNullable<DesktopWebuiCommand['action']>;\ntype DesktopCommandView = NonNullable<DesktopWebuiCommand['view']>;\ntype DesktopCommandActivity = NonNullable<DesktopWebuiCommand['activity']>;\ntype DesktopCommandOverlay = NonNullable<DesktopWebuiCommand['overlay']>;\ntype DesktopCommandDockSection = NonNullable<DesktopWebuiCommand['dockSection']>;\ntype DesktopCommandWorkTab = NonNullable<DesktopWebuiCommand['workTab']>;\ntype DesktopCommandPrefKey = NonNullable<DesktopWebuiCommand['pref']>['key'];\n\nconst DESKTOP_WEBUI_ACTIONS = new Set<DesktopCommandAction>([\n 'new-session',\n 'clear-context',\n 'compact-context',\n 'repair-context',\n 'download-chat',\n 'focus-chat',\n 'open-command-palette',\n 'open-shortcuts',\n 'search-chat',\n 'open-model-switcher',\n 'open-prompt-library',\n]);\n\nconst DESKTOP_WEBUI_VIEWS = new Set<DesktopCommandView>([\n 'chat',\n 'settings',\n 'autophase',\n 'specs',\n 'sddboard',\n 'sddwizard',\n 'files',\n 'changes',\n 'sessions',\n 'setup',\n 'skill',\n 'officemap',\n 'mailbox',\n 'debug',\n 'design-gallery',\n 'refresh-debug',\n 'analytics',\n]);\n\nconst DESKTOP_WEBUI_ACTIVITIES = new Set<DesktopCommandActivity>([\n 'chat',\n 'agents',\n 'history',\n 'files',\n 'changes',\n 'mailbox',\n 'skills',\n 'design',\n 'worktrees',\n 'officemap',\n]);\n\nconst DESKTOP_WEBUI_OVERLAYS = new Set<DesktopCommandOverlay>([\n 'fleet',\n 'agents-monitor',\n 'processes',\n 'queue',\n]);\n\nconst DESKTOP_WEBUI_DOCKS = new Set<DesktopCommandDockSection>([\n 'autophase',\n 'goal',\n 'fleet',\n 'work',\n 'worktrees',\n 'collab',\n]);\n\nconst DESKTOP_WEBUI_WORK_TABS = new Set<DesktopCommandWorkTab>(['todos', 'tasks', 'plan']);\nconst DESKTOP_WEBUI_PREF_KEYS = new Set<DesktopCommandPrefKey>([\n 'yolo',\n 'nextPrediction',\n 'contextAutoCompact',\n]);\n\nexport function normalizeDesktopWebuiCommand(value: unknown): DesktopWebuiCommand | null {\n if (!isRecord(value)) return null;\n const command: DesktopWebuiCommand = {};\n let hasCommand = false;\n\n const action = value['action'];\n if (action !== undefined) {\n if (typeof action !== 'string' || !DESKTOP_WEBUI_ACTIONS.has(action as DesktopCommandAction)) {\n return null;\n }\n command.action = action as DesktopCommandAction;\n hasCommand = true;\n }\n\n const view = value['view'];\n if (view !== undefined) {\n if (typeof view !== 'string' || !DESKTOP_WEBUI_VIEWS.has(view as DesktopCommandView)) {\n return null;\n }\n command.view = view as DesktopCommandView;\n hasCommand = true;\n }\n\n const activity = value['activity'];\n if (activity !== undefined) {\n if (\n typeof activity !== 'string' ||\n !DESKTOP_WEBUI_ACTIVITIES.has(activity as DesktopCommandActivity)\n ) {\n return null;\n }\n command.activity = activity as DesktopCommandActivity;\n hasCommand = true;\n }\n\n const overlay = value['overlay'];\n if (overlay !== undefined) {\n if (typeof overlay !== 'string' || !DESKTOP_WEBUI_OVERLAYS.has(overlay as DesktopCommandOverlay)) {\n return null;\n }\n command.overlay = overlay as DesktopCommandOverlay;\n hasCommand = true;\n }\n\n const dockSection = value['dockSection'];\n if (dockSection !== undefined) {\n if (\n typeof dockSection !== 'string' ||\n !DESKTOP_WEBUI_DOCKS.has(dockSection as DesktopCommandDockSection)\n ) {\n return null;\n }\n command.dockSection = dockSection as DesktopCommandDockSection;\n hasCommand = true;\n }\n\n const workTab = value['workTab'];\n if (workTab !== undefined) {\n if (typeof workTab !== 'string' || !DESKTOP_WEBUI_WORK_TABS.has(workTab as DesktopCommandWorkTab)) {\n return null;\n }\n command.workTab = workTab as DesktopCommandWorkTab;\n hasCommand = true;\n }\n\n const terminal = value['terminal'];\n if (terminal !== undefined) {\n if (terminal !== true && terminal !== false && terminal !== 'toggle' && terminal !== 'new') {\n return null;\n }\n command.terminal = terminal;\n hasCommand = true;\n }\n\n const pref = value['pref'];\n if (pref !== undefined) {\n if (!isRecord(pref)) return null;\n const key = pref['key'];\n if (typeof key !== 'string' || !DESKTOP_WEBUI_PREF_KEYS.has(key as DesktopCommandPrefKey)) {\n return null;\n }\n const toggle = pref['toggle'];\n const prefValue = pref['value'];\n if (toggle !== undefined && typeof toggle !== 'boolean') return null;\n if (prefValue !== undefined && typeof prefValue !== 'boolean') return null;\n if (toggle === undefined && prefValue === undefined) return null;\n command.pref = {\n key: key as DesktopCommandPrefKey,\n ...(typeof prefValue === 'boolean' ? { value: prefValue } : {}),\n ...(typeof toggle === 'boolean' ? { toggle } : {}),\n };\n hasCommand = true;\n }\n\n return hasCommand ? command : null;\n}\n\nexport function buildWebuiCommandFallbackScript(command: DesktopWebuiCommand): string {\n const payload = JSON.stringify(command).replace(/</g, '\\\\u003c');\n return `window.dispatchEvent(new CustomEvent('wrongstack:desktop-command', { detail: ${payload} })); true;`;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n}\n","/**\n * Application-wide constants.\n * Centralized here to avoid magic numbers scattered across modules.\n */\n\nexport const OPEN_EXTERNAL_ALLOWED_PROTOCOLS = new Set(['http:', 'https:', 'mailto:']);\n\nexport const SIDEBAR_WIDTH_WIDE = 292;\nexport const SIDEBAR_WIDTH_MEDIUM = 276;\nexport const SIDEBAR_WIDTH_NARROW = 252;\nexport const SIDEBAR_WIDTH_COLLAPSED = 56;\n\nexport const MIN_WINDOW_WIDTH = 760;\nexport const MIN_WINDOW_HEIGHT = 520;\n\nexport const MAX_PENDING_WEBUI_COMMANDS = 50;\nexport const MAX_PENDING_FLUSH_ATTEMPTS = 80;\nexport const WEBUI_COMMAND_FALLBACK_MS = 350;\nexport const WEBUI_COMMAND_ACK_TIMEOUT_MS = 2_000;\n\nexport const WINDOW_STATE_SAVE_DEBOUNCE_MS = 350;\nexport const PENDING_WEBUI_FLUSH_DELAY_MS = 250;\nexport const LOG_NOTIFY_DEBOUNCE_MS = 250;\n","/**\n * Sidebar width calculation utilities.\n * Main layout logic is in index.ts.\n */\nimport {\n SIDEBAR_WIDTH_WIDE,\n SIDEBAR_WIDTH_MEDIUM,\n SIDEBAR_WIDTH_NARROW,\n SIDEBAR_WIDTH_COLLAPSED,\n} from '../state/constants.js';\n\n/**\n * Calculate the sidebar width based on window width and collapse state.\n */\nexport function getSidebarWidth(windowWidth: number, collapsed: boolean): number {\n if (collapsed) return SIDEBAR_WIDTH_COLLAPSED;\n if (windowWidth < 900) return SIDEBAR_WIDTH_NARROW;\n if (windowWidth < 1180) return SIDEBAR_WIDTH_MEDIUM;\n return SIDEBAR_WIDTH_WIDE;\n}\n","/**\n * Application menu builder.\n * Builds the complete application menu with all sections.\n */\nimport { Menu } from 'electron';\nimport type { DesktopWebuiCommand } from '../../shared/types.js';\nimport type { MenuBuilderContext, ProjectMenuActions } from './types.js';\nimport { buildProjectsMenu } from './projects-menu.js';\nimport { buildFileMenu, buildWorkspaceMenu, buildViewMenu } from './sections.js';\n\nexport { buildProjectsMenu, normalizeMenuRoot, groupProjectRuntimesForMenu } from './projects-menu.js';\nexport { buildProjectsMenu as buildProjectsMenuSection } from './projects-menu.js';\nexport * from './types.js';\n\n/**\n * Configure the complete application menu.\n * This is the main entry point for building the menu.\n */\nexport function configureApplicationMenu(ctx: MenuBuilderContext): void {\n const snapshot = ctx.getSnapshot();\n const active = ctx.getActiveRuntime();\n const hasActiveRuntime = Boolean(active);\n const hasActiveWebui = active?.status === 'running';\n const hasActiveProjectWebui = hasActiveWebui && active?.kind === 'project';\n const activeWebuiPrefs = ctx.getActiveWebuiPrefs();\n\n const navigate = (command: DesktopWebuiCommand) => {\n void ctx.dispatchWebuiCommand(command);\n };\n\n const activateAndNavigate = (runtimeId: string, command: DesktopWebuiCommand) => {\n void ctx.activateRuntime(runtimeId).then(() => ctx.dispatchWebuiCommand(command));\n };\n\n const reloadRuntimeWebui = (runtimeId: string) => {\n void ctx.activateRuntime(runtimeId).then(() => ctx.reloadActiveWebuiView());\n };\n\n const actions: ProjectMenuActions = {\n activate: (runtimeId) => void ctx.activateRuntime(runtimeId),\n activateAndNavigate,\n newSession: (runtimeId) => {\n if (runtimeId) void ctx.openProjectSession(runtimeId);\n else void ctx.openProject();\n },\n openBrowser: (runtimeId) => {\n const url = ctx.getRuntimeManager().getRuntimeUrlWithToken(runtimeId);\n if (url) ctx.openExternal(url);\n },\n reload: reloadRuntimeWebui,\n close: (runtimeId) => void ctx.closeRuntime(runtimeId),\n reveal: (runtimeId) => {\n const runtime = ctx.getRuntimeManager().getRuntime(runtimeId);\n if (runtime) ctx.revealInExplorer(runtime.root);\n },\n };\n\n const template: import('electron').MenuItemConstructorOptions[] = [\n buildFileMenu(ctx, actions, hasActiveRuntime, hasActiveProjectWebui, active, navigate, ctx.getActiveRuntimeId),\n {\n label: ctx.t('projects'),\n submenu: buildProjectsMenu(snapshot.runtimes, actions, ctx.t),\n },\n buildWorkspaceMenu(ctx, actions, hasActiveWebui, activeWebuiPrefs, navigate),\n buildViewMenu(ctx),\n ];\n\n Menu.setApplicationMenu(Menu.buildFromTemplate(template));\n}\n\n// Re-export for backwards compatibility\nexport { type MenuBuilderContext, type ProjectMenuActions, type ProjectMenuGroup } from './types.js';\n","/**\n * Projects menu builder.\n */\nimport type { MenuItemConstructorOptions } from 'electron';\nimport type { DesktopRuntimeRecord } from '../../shared/types.js';\nimport type { ProjectMenuActions, ProjectMenuGroup } from './types.js';\n\nconst posix = (await import('node:path')).posix;\n\nexport function buildProjectsMenu(\n runtimes: DesktopRuntimeRecord[],\n actions: ProjectMenuActions,\n t: (key: string) => string,\n): MenuItemConstructorOptions[] {\n const projectGroups = groupProjectRuntimesForMenu(runtimes);\n const menu: MenuItemConstructorOptions[] = [\n {\n label: t('openProjectEllipsis'),\n accelerator: 'CmdOrCtrl+O',\n click: () => actions.newSession(''), // Will open dialog\n },\n { label: t('registerProjectEllipsis'), click: () => actions.newSession('') },\n { type: 'separator' },\n ];\n\n if (projectGroups.length === 0) {\n menu.push({ label: t('noOpenProjectSessions'), enabled: false });\n return menu;\n }\n\n for (const group of projectGroups) {\n menu.push({\n label: group.name,\n submenu: [\n {\n label: t('newSession'),\n click: () => actions.newSession(group.sessions[0]?.id ?? ''),\n enabled: Boolean(group.sessions[0]),\n },\n {\n label: t('revealProjectFolder'),\n click: () => actions.reveal(group.sessions[0]?.id ?? ''),\n enabled: Boolean(group.sessions[0]),\n },\n { type: 'separator' },\n ...group.sessions.map((runtime, index) =>\n buildSessionMenu(runtime, index + 1, actions, t),\n ),\n ],\n });\n }\n return menu;\n}\n\nexport function buildSessionMenu(\n runtime: DesktopRuntimeRecord,\n index: number,\n actions: ProjectMenuActions,\n t: (key: string) => string,\n): MenuItemConstructorOptions {\n const running = runtime.status === 'running';\n const label = `${t('session')} ${index} · ${runtime.status}`;\n return {\n label,\n submenu: [\n {\n label: t('quickView'),\n click: () => actions.activate(runtime.id),\n },\n {\n label: 'WebUI',\n enabled: running,\n submenu: [\n {\n label: t('chat'),\n click: () => actions.activateAndNavigate(runtime.id, { activity: 'chat', view: 'chat' }),\n },\n {\n label: t('focusPrompt'),\n click: () => actions.activateAndNavigate(runtime.id, { action: 'focus-chat' }),\n },\n {\n label: t('terminal'),\n click: () => actions.activateAndNavigate(runtime.id, { terminal: 'toggle' }),\n },\n {\n label: t('newTerminal'),\n click: () => actions.activateAndNavigate(runtime.id, { terminal: 'new' }),\n },\n { type: 'separator' },\n {\n label: t('files'),\n click: () =>\n actions.activateAndNavigate(runtime.id, { activity: 'files', view: 'files' }),\n },\n {\n label: t('changes'),\n click: () =>\n actions.activateAndNavigate(runtime.id, { activity: 'changes', view: 'changes' }),\n },\n {\n label: t('sessions'),\n click: () => actions.activateAndNavigate(runtime.id, { view: 'sessions' }),\n },\n {\n label: t('fleetHQ'),\n click: () =>\n actions.activateAndNavigate(runtime.id, { activity: 'officemap', view: 'officemap' }),\n },\n {\n label: t('settings'),\n click: () => actions.activateAndNavigate(runtime.id, { view: 'settings' }),\n },\n { type: 'separator' },\n {\n label: t('commandPalette'),\n click: () =>\n actions.activateAndNavigate(runtime.id, { action: 'open-command-palette' }),\n },\n {\n label: t('modelSwitcher'),\n click: () =>\n actions.activateAndNavigate(runtime.id, { action: 'open-model-switcher' }),\n },\n ],\n },\n { type: 'separator' },\n {\n label: t('openInBrowser'),\n enabled: running,\n click: () => actions.openBrowser(runtime.id),\n },\n {\n label: t('reloadWebui'),\n enabled: running,\n click: () => actions.reload(runtime.id),\n },\n {\n label: t('closeSession'),\n click: () => actions.close(runtime.id),\n },\n ],\n };\n}\n\nexport function groupProjectRuntimesForMenu(runtimes: DesktopRuntimeRecord[]): ProjectMenuGroup[] {\n const groups = new Map<string, ProjectMenuGroup>();\n for (const runtime of runtimes) {\n if (runtime.kind !== 'project') continue;\n const key = normalizeMenuRoot(runtime.root);\n const existing = groups.get(key);\n if (existing) {\n existing.sessions.push(runtime);\n continue;\n }\n groups.set(key, {\n key,\n name: posix.basename(runtime.root) || runtime.name,\n root: runtime.root,\n sessions: [runtime],\n });\n }\n return [...groups.values()].sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport function normalizeMenuRoot(root: string): string {\n return root.replace(/\\\\/g, '/').replace(/\\/+$/g, '').toLowerCase();\n}\n","/**\n * Menu sections builder.\n * Each function builds a specific menu section.\n */\nimport type { MenuItemConstructorOptions } from 'electron';\nimport type { DesktopRuntimeRecord, DesktopWebuiCommand, DesktopWebuiPrefs } from '../../shared/types.js';\nimport type { MenuBuilderContext } from './types.js';\n\n/**\n * Build File menu section.\n */\nexport function buildFileMenu(\n ctx: MenuBuilderContext,\n _actions: unknown,\n hasActiveRuntime: boolean,\n hasActiveProjectWebui: boolean,\n active: DesktopRuntimeRecord | undefined,\n navigate: (command: DesktopWebuiCommand) => void,\n getActiveRuntimeId: () => string | null,\n): MenuItemConstructorOptions {\n return {\n label: ctx.t('file'),\n submenu: [\n {\n label: ctx.t('openProjectEllipsis'),\n accelerator: 'CmdOrCtrl+O',\n click: () => void ctx.openProject(),\n },\n { label: ctx.t('registerProjectEllipsis'), click: () => void ctx.registerProject() },\n {\n label: ctx.t('removeActiveFromRegistry'),\n enabled: hasActiveProjectWebui,\n click: () => {\n if (active?.kind === 'project') void ctx.unregisterProject(active.root);\n },\n },\n { type: 'separator' },\n {\n label: ctx.t('newSessionForActive'),\n accelerator: 'CmdOrCtrl+N',\n enabled: hasActiveProjectWebui,\n click: () => void ctx.openProjectSession(active?.id),\n },\n {\n label: ctx.t('settings'),\n accelerator: 'CmdOrCtrl+,',\n click: () => {\n if (hasActiveRuntime) navigate({ view: 'settings' });\n else void ctx.openSettings();\n },\n },\n { type: 'separator' },\n {\n label: ctx.t('closeActiveRuntime'),\n accelerator: 'CmdOrCtrl+W',\n enabled: hasActiveRuntime,\n click: () => {\n const id = getActiveRuntimeId();\n if (id) void ctx.closeRuntime(id);\n },\n },\n { type: 'separator' },\n {\n role: process.platform === 'darwin' ? 'close' : 'quit',\n },\n ],\n };\n}\n\n/**\n * Build Workspace menu section.\n */\nexport function buildWorkspaceMenu(\n ctx: MenuBuilderContext,\n _actions: unknown,\n hasActiveWebui: boolean,\n prefs: DesktopWebuiPrefs | undefined,\n navigate: (command: DesktopWebuiCommand) => void,\n): MenuItemConstructorOptions {\n const yoloChecked = prefs?.yolo === true;\n const nextPredictionChecked = prefs?.nextPrediction === true;\n const contextAutoCompactChecked = prefs?.contextAutoCompact === true;\n\n const webuiItem = (item: MenuItemConstructorOptions): MenuItemConstructorOptions => ({\n ...item,\n enabled: item.enabled ?? hasActiveWebui,\n });\n\n return {\n label: ctx.t('workspace'),\n submenu: [\n webuiItem({\n label: ctx.t('openChat'),\n accelerator: 'CmdOrCtrl+1',\n click: () => navigate({ activity: 'chat', view: 'chat' }),\n }),\n webuiItem({\n label: ctx.t('focusPrompt'),\n accelerator: 'CmdOrCtrl+/',\n click: () => navigate({ action: 'focus-chat' }),\n }),\n webuiItem({\n label: ctx.t('toggleTerminal'),\n accelerator: 'CmdOrCtrl+`',\n click: () => navigate({ terminal: 'toggle' }),\n }),\n webuiItem({ label: ctx.t('newTerminal'), click: () => navigate({ terminal: 'new' }) }),\n { type: 'separator' },\n webuiItem({\n label: ctx.t('commandPalette'),\n accelerator: 'CmdOrCtrl+K',\n click: () => navigate({ action: 'open-command-palette' }),\n }),\n webuiItem({\n label: ctx.t('quickModelSwitcher'),\n accelerator: 'CmdOrCtrl+M',\n click: () => navigate({ action: 'open-model-switcher' }),\n }),\n webuiItem({\n type: 'checkbox',\n label: ctx.t('yoloMode'),\n checked: yoloChecked,\n accelerator: 'CmdOrCtrl+Shift+Y',\n click: () => navigate({ pref: { key: 'yolo', toggle: true } }),\n }),\n webuiItem({\n type: 'checkbox',\n label: ctx.t('nextPrediction'),\n checked: nextPredictionChecked,\n click: () => navigate({ pref: { key: 'nextPrediction', toggle: true } }),\n }),\n webuiItem({\n type: 'checkbox',\n label: ctx.t('contextAutoCompact'),\n checked: contextAutoCompactChecked,\n click: () => navigate({ pref: { key: 'contextAutoCompact', toggle: true } }),\n }),\n { type: 'separator' },\n webuiItem({\n label: ctx.t('reloadActiveWebui'),\n accelerator: 'CmdOrCtrl+Shift+R',\n click: () => void ctx.reloadActiveWebuiView(),\n }),\n ],\n };\n}\n\n/**\n * Build View menu section.\n */\nexport function buildViewMenu(ctx: MenuBuilderContext): MenuItemConstructorOptions {\n return {\n label: ctx.t('view'),\n submenu: [\n {\n type: 'checkbox',\n label: ctx.t('compactDesktopSidebar'),\n accelerator: 'CmdOrCtrl+B',\n checked: ctx.getShellSidebarCollapsed(),\n click: () => ctx.setShellSidebarCollapsed(!ctx.getShellSidebarCollapsed()),\n },\n { type: 'separator' },\n { role: 'reload' },\n { role: 'toggleDevTools' },\n { type: 'separator' },\n { role: 'resetZoom' },\n { role: 'zoomIn' },\n { role: 'zoomOut' },\n { type: 'separator' },\n { role: 'togglefullscreen' },\n ],\n };\n}\n"],"mappings":"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","names":["path","fs","wstackGlobalRoot","fs","path","atomicWrite","wstackGlobalRoot","stat","runtime","resolve","require","MIN_WINDOW_WIDTH","MIN_WINDOW_HEIGHT","wstackGlobalRoot","isRecord","configureApplicationMenu","resolve"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wrongstack/desktop",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.283.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "WrongStack Desktop - Electron shell for managing multiple local WrongStack runtimes.",
|
|
6
6
|
"keywords": [
|
|
@@ -33,8 +33,8 @@
|
|
|
33
33
|
"electron": "^43.0.0",
|
|
34
34
|
"ws": "^8.21.0",
|
|
35
35
|
"zod": "^4.4.3",
|
|
36
|
-
"@wrongstack/
|
|
37
|
-
"@wrongstack/
|
|
36
|
+
"@wrongstack/webui": "0.283.0",
|
|
37
|
+
"@wrongstack/core": "0.283.0"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@types/node": "^26.0.1",
|