@wrongstack/desktop 0.309.0 → 0.310.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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/main/main.ts", "../../src/main/macos-platform.ts", "../../src/main/agent-bridge.ts", "../../src/main/desktop-privileged-actions.ts", "../../src/main/ipc.ts", "../../src/main/i18n-main.ts", "../../src/main/desktop-config-io.ts", "../../src/main/runtime-manager.ts", "../../src/main/runtime-manager-paths.ts", "../../src/main/webui/controller.ts", "../../src/main/state/constants.ts", "../../src/main/webui-command-bridge.ts", "../../src/main/webui/navigation.ts", "../../src/main/app-icon.ts", "../../src/main/window-state-controller.ts", "../../src/main/runtime/operations.ts", "../../src/main/layout/sidebar.ts", "../../src/main/menu/index.ts", "../../src/main/menu/projects-menu.ts", "../../src/main/menu/sections.ts", "../../src/main/ipc-handlers/index.ts", "../../src/main/validation/index.ts", "../../src/main/validation/schemas.ts"],
4
- "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/ \u2192 Window layout and sizing\n * - menu/ \u2192 Application menu building\n * - ipc-handlers/ \u2192 IPC message handlers\n * - runtime/ \u2192 Project/runtime operations\n * - state/ \u2192 Types and constants\n */\nimport * as path from 'node:path';\nimport { installCrashShield, resolveWstackPaths } from '@wrongstack/core/utils';\nimport {\n app,\n BaseWindow,\n dialog,\n screen,\n shell,\n WebContentsView,\n type BaseWindowConstructorOptions,\n} from 'electron';\nimport { drainPendingOpenFilePath, firstOpenFileArg, initMacOS } from './macos-platform.js';\nimport type { DesktopWebuiPrefs } from '../shared/types.js';\nimport type {\n IpcHandlerContext,\n IRuntimeManager,\n} from './state/types.js';\nimport { DesktopAgentBridge } from './agent-bridge.js';\nimport {\n authorizeDesktopAction,\n desktopCompatibilityTrustBoundary,\n} from './desktop-privileged-actions.js';\nimport { IPC } from './ipc.js';\nimport { getMainLocale, setMainLocale, tMain } from './i18n-main.js';\nimport {\n desktopConfigPaths,\n readUiLocale,\n resolveActiveProfileConfigPath,\n writeUiLocale,\n} from './desktop-config-io.js';\nimport {\n DesktopRuntimeManager,\n preloadPath,\n rendererIndexPath,\n} from './runtime-manager.js';\nimport { watchProviderConfig } from '@wrongstack/core/storage';\nimport { DesktopWebuiController } from './webui/controller.js';\nimport { allowedExternalProtocol } from './webui/navigation.js';\nimport { loadDesktopAppIcon } from './app-icon.js';\nimport { DesktopWindowStateController } from './window-state-controller.js';\nimport {\n activateRuntime as activateRuntimeOperation,\n closeRuntime as closeRuntimeOperation,\n openProject as openProjectOperation,\n openProjectSession as openProjectSessionOperation,\n openSettings as openSettingsOperation,\n registerProject as registerProjectOperation,\n restoreLastWorkspace as restoreLastWorkspaceOperation,\n unregisterProject as unregisterProjectOperation,\n type RuntimeOperationsContext,\n} from './runtime/operations.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// IPC handler module\nimport { registerIpcHandlers as registerExtractedIpcHandlers } from './ipc-handlers/index.js';\n\n// Constants \u2014 centralized in state/constants.ts to avoid duplication\nimport {\n MIN_WINDOW_HEIGHT,\n MIN_WINDOW_WIDTH,\n} from './state/constants.js';\n\n// macOS initialisation \u2014 must run before app.whenReady to ensure\n// activation policy, open-file queuing, and Dock menu are registered\n// before the event loop starts.\ninitMacOS();\n\n// Windows-only: app user model id (used for taskbar grouping)\nif (process.platform === 'win32') {\n app.setAppUserModelId('com.wrongstack.desktop');\n}\napp.setPath(\n 'userData',\n path.join(\n resolveWstackPaths({ projectRoot: process.cwd() }).configDir,\n 'desktop',\n 'electron-profile',\n ),\n);\n\n// ============================================================================\n// Application State\n// ============================================================================\n\nconst desktopTrustBoundary = desktopCompatibilityTrustBoundary;\nconst manager = new DesktopRuntimeManager(desktopTrustBoundary);\nconst bridge = new DesktopAgentBridge();\n\nlet mainWindow: BaseWindow | null = null;\nlet shellView: WebContentsView | null = null;\nlet shellSidebarCollapsed = false;\nlet quittingAfterCleanup = false;\n\nconst webuiController = new DesktopWebuiController({\n manager,\n trustBoundary: desktopTrustBoundary,\n getMainWindow: () => mainWindow,\n getShellView: () => shellView,\n getLocale: getMainLocale,\n layoutViews: () => layoutWebuiViews(),\n onPrefsChanged: (previous, next) => {\n if (menuRelevantPrefsChanged(previous, next)) configureApplicationMenu();\n },\n});\n\nconst windowStateController = new DesktopWindowStateController({\n getWindow: () => mainWindow,\n getDisplays: () => screen.getAllDisplays(),\n save: (state) => manager.saveWindowState(state),\n});\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\nfunction safeOpenExternal(target: string): void {\n const protocol = allowedExternalProtocol(target);\n if (protocol) {\n void authorizeDesktopAction(desktopTrustBoundary, {\n capability: 'url.open-external',\n subject: { kind: 'url', id: target, attributes: { protocol } },\n risk: 'elevated',\n metadata: { operation: 'open-external' },\n }).then((authorization) => {\n if (authorization.allowed) return shell.openExternal(target);\n return undefined;\n });\n }\n}\n\n/** Open a directory in the platform file manager (Finder / Explorer). */\nfunction revealInExplorer(root: string): void {\n // On macOS, `shell.openPath(dir)` opens Finder at the directory.\n // On Windows, it opens Explorer. On Linux, it opens the default\n // file manager.\n //\n // The promise is intentionally not awaited \u2014 it's a fire-and-forget\n // UI operation. Errors are logged but not surfaced because the\n // operation is non-critical.\n void authorizeDesktopAction(desktopTrustBoundary, {\n capability: 'filesystem.open-native',\n subject: { kind: 'path', id: root, attributes: { target: 'file-manager' } },\n risk: 'elevated',\n cwd: root,\n metadata: { operation: 'reveal-in-explorer' },\n }).then((authorization) => {\n if (!authorization.allowed) return;\n return shell.openPath(root).catch((err) => {\n if (process.platform === 'darwin') {\n // macOS may fail if the path contains characters Finder can't\n // resolve (e.g., certain Unicode normalizations). Fall back to\n // the parent directory.\n void shell.openPath(path.dirname(root)).catch(() => undefined);\n }\n console.error(\n JSON.stringify({\n level: 'warn',\n event: 'desktop.reveal_in_explorer_failed',\n root,\n message: err instanceof Error ? err.message : String(err),\n timestamp: new Date().toISOString(),\n }),\n );\n });\n });\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\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 webuiController.views.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// State Broadcasting\n// ============================================================================\n\nfunction broadcastState(): void {\n if (!shellView || shellView.webContents.isDestroyed()) return;\n shellView.webContents.send(IPC.stateChanged, manager.snapshot());\n}\n\n// ============================================================================\n// Project/Runtime Operations\n// ============================================================================\n\nconst runtimeOperationsContext: RuntimeOperationsContext = {\n getRuntimeManager: () => manager as unknown as IRuntimeManager,\n getAgentBridge: () => bridge,\n broadcastState,\n syncActiveWebuiView: () => webuiController.syncActive(),\n dispatchWebuiCommand: (command) => webuiController.dispatch(command),\n chooseProjectRoot: async (kind) => {\n const result = await dialog.showOpenDialog({\n title: tMain(kind === 'open' ? 'openProject' : 'registerProject'),\n properties: ['openDirectory'],\n });\n return result.filePaths[0];\n },\n};\n\nconst openProject = (root?: string) => openProjectOperation(runtimeOperationsContext, root);\nconst registerProject = (root?: string) => registerProjectOperation(runtimeOperationsContext, root);\nconst unregisterProject = (root: string) =>\n unregisterProjectOperation(runtimeOperationsContext, root);\nconst openProjectSession = (id?: string) =>\n openProjectSessionOperation(runtimeOperationsContext, id);\nconst openSettings = () => openSettingsOperation(runtimeOperationsContext);\nconst activateRuntime = (id: string) => activateRuntimeOperation(runtimeOperationsContext, id);\nconst closeRuntime = (id: string) => closeRuntimeOperation(runtimeOperationsContext, id);\nconst restoreLastWorkspace = () => restoreLastWorkspaceOperation(runtimeOperationsContext);\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 webuiController.views.get(snapshot.activeRuntimeId)?.status.prefs;\n },\n getShellSidebarCollapsed: () => shellSidebarCollapsed,\n t: tMain,\n getRuntimeManager: () => manager,\n getWebuiViews: () => webuiController.views,\n dispatchWebuiCommand: (command) => webuiController.dispatch(command),\n reloadActiveWebuiView: () => webuiController.reload(),\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: () => webuiController.activeRuntimeId,\n setShellSidebarCollapsed: (collapsed) => { setShellSidebarCollapsed(collapsed); },\n restoreLastWorkspace: async () => { await restoreLastWorkspace(); },\n openExternal: (url) => { safeOpenExternal(url); },\n revealInExplorer: (root) => { revealInExplorer(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\n/**\n * Build the context object for the extracted IPC handler module.\n * Wires module-level state into the IpcHandlerContext interface.\n */\nfunction buildIpcHandlerContext(): IpcHandlerContext {\n return {\n getMainWindow: () => mainWindow,\n getShellView: () => shellView,\n getWebuiViews: () => webuiController.views,\n getWebuiStatus: () => webuiController.status,\n getRuntimeManager: () => manager as unknown as IRuntimeManager,\n getAgentBridge: () => bridge,\n getI18n: () => ({ getMainLocale, setMainLocale, tMain }),\n getConfigIo: () => ({ desktopConfigPaths, readUiLocale, writeUiLocale }),\n getShellSidebarCollapsed: () => shellSidebarCollapsed,\n setShellSidebarCollapsed: (collapsed) => setShellSidebarCollapsed(collapsed),\n broadcastState: () => broadcastState(),\n publishWebuiStatus: (next) => {\n const entry = next.runtimeId ? webuiController.views.get(next.runtimeId) : undefined;\n if (entry) webuiController.setEntryStatus(entry, next);\n },\n syncActiveWebuiView: () => webuiController.syncActive(),\n configureApplicationMenu: () => configureApplicationMenu(),\n broadcastLocaleToEmbeddedWebuis: (locale) => webuiController.broadcastLocale(locale),\n dispatchWebuiCommand: (command) => webuiController.dispatch(command),\n reloadActiveWebuiView: () => webuiController.reload(),\n openProject: (root) => openProject(root),\n registerProject: (root) => registerProject(root),\n unregisterProject: (root) => unregisterProject(root),\n openProjectSession: (id) => openProjectSession(id),\n activateRuntime: (id) => activateRuntime(id),\n closeRuntime: (id) => closeRuntime(id),\n openSettings: () => openSettings(),\n sendMessage: (id, wsUrl, content) => bridge.sendMessage(id, wsUrl, content),\n abortRuntime: (id, wsUrl) => bridge.abort(id, wsUrl),\n openExternal: (url) => safeOpenExternal(url),\n revealInExplorer: (root) => { revealInExplorer(root); },\n findWebuiEntryBySenderId: (senderId) => webuiController.findBySenderId(senderId),\n getPendingWebuiCommandAcks: () => webuiController.pendingAcks,\n settlePendingWebuiCommandAck: (requestId, handled) =>\n webuiController.settleAck(requestId, handled),\n setEntryWebuiStatus: (entry, next) => webuiController.setEntryStatus(entry, next),\n schedulePendingWebuiFlush: (entry) => webuiController.scheduleFlush(entry),\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 // OS-level renderer sandbox. contextIsolation and nodeIntegration:false\n // already bound what renderer JS can reach through the bridge; the\n // sandbox is what contains the renderer PROCESS if it is compromised\n // through the content it renders. This preload only imports electron's\n // contextBridge/ipcRenderer plus a constants map, so it runs unchanged\n // under the sandboxed preload subset (WS-093).\n sandbox: true,\n },\n });\n shellView.webContents.setWindowOpenHandler(({ url }) => {\n safeOpenExternal(url);\n return { action: 'deny' };\n });\n // The WebUI view has had this since it was written; the shell view had only\n // the window-open handler, so an in-page navigation (a link, a script\n // setting location) could move the shell itself off its local renderer\n // entry point instead of opening externally (WS-093).\n shellView.webContents.on('will-navigate', (event, url) => {\n if (url === shellUrl) return;\n event.preventDefault();\n safeOpenExternal(url);\n });\n\n // The shell preload can invoke desktop:* channels during renderer startup.\n registerExtractedIpcHandlers(buildIpcHandlerContext());\n\n await shellView.webContents.loadURL(shellUrl);\n\n const prevState = windowStateController.validated(manager.getWindowState());\n const defaultWidth = 1180;\n const defaultHeight = 720;\n\n const appIcon = await loadDesktopAppIcon();\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 ...(appIcon ? { icon: appIcon } : {}),\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', () => windowStateController.scheduleSave());\n mainWindow.on('moved', () => windowStateController.scheduleSave());\n mainWindow.on('maximize', () => windowStateController.scheduleSave());\n mainWindow.on('unmaximize', () => windowStateController.scheduleSave());\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 webuiController.syncActive();\n configureApplicationMenu();\n broadcastState();\n });\n\n // macOS open-file events \u2014 forward to IPC so the shell renderer can\n // decide whether to open the path as a project or register it.\n app.on('open-file', (_event, filePath) => {\n if (shellView && !shellView.webContents.isDestroyed()) {\n shellView.webContents.send(IPC.openFile, filePath);\n }\n });\n\n let lastWatchedLocale: string | undefined;\n const activeProfileConfigPath = await resolveActiveProfileConfigPath();\n watchProviderConfig(\n activeProfileConfigPath,\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 webuiController.broadcastLocale(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 webuiController.disposeAll();\n void windowStateController.save();\n quittingAfterCleanup = true;\n app.exit(0);\n });\n\n await restoreLastWorkspace();\n\n // macOS: handle file-open from argv (app launched by double-click) or\n // from a pre-ready open-file event (queued by Electron's event system).\n const argvOpenPath = firstOpenFileArg(process.argv);\n const queuedOpenPath = drainPendingOpenFilePath();\n const openPath = argvOpenPath ?? queuedOpenPath;\n if (openPath && shellView && !shellView.webContents.isDestroyed()) {\n shellView.webContents.send(IPC.openFile, openPath);\n }\n\n mainWindow.show();\n shellView.webContents.focus();\n}\n\n// ============================================================================\n// App Lifecycle\n// ============================================================================\n\n// Same last-resort shield as the CLI host: a background rejection in a watcher,\n// IPC handler, or the agent bridge must not take the desktop app down (WS-076).\ninstallCrashShield();\n\n// `boot` is async \u2014 an unhandled rejection here would leave the app running with\n// no window and no error shown, which reads to the user as a silent hang.\napp.whenReady().then(boot, (error: unknown) => {\n const detail = error instanceof Error ? (error.stack ?? error.message) : String(error);\n // Not localised on purpose: boot failed before the renderer could push a\n // locale over IPC, so tMain would resolve to the 'en' catalog regardless.\n dialog.showErrorBox('WrongStack failed to start', detail);\n app.exit(1);\n});\n\napp.on('window-all-closed', () => {\n // Standard macOS behavior: the app stays running when all windows\n // are closed (the user can open a new window from the Dock or menu).\n // On Windows and Linux, closing the last window quits the app.\n if (process.platform !== 'darwin') {\n app.quit();\n }\n});\n\napp.on('before-quit', () => {\n if (mainWindow) {\n mainWindow.removeAllListeners('close');\n void windowStateController.save();\n }\n bridge.closeAll();\n webuiController.disposeAll();\n // Terminate WebUI child processes so they don't become orphans after the\n // desktop app exits. closeAll() is async but before-quit is synchronous \u2014\n // we fire-and-forget and rely on OS process-group cleanup for stragglers.\n void manager.closeAll({ persistWorkspace: false });\n});\n\napp.on('activate', () => {\n if (!mainWindow) return;\n mainWindow.show();\n shellView?.webContents.focus();\n});\n", "/**\n * macOS platform initialization for WrongStack Desktop.\n *\n * Handles activation policy, Dock menu, file-open events, and other\n * macOS-specific Electron behaviors that are required for the app to\n * behave as a proper macOS citizen (dock icon, menu bar focus, etc.).\n *\n * This module is a no-op on non-macOS platforms.\n */\n\nimport { app, Menu } from 'electron';\n\n/**\n * Initialize macOS-specific app behavior. Safe to call on any platform;\n * no-ops when `process.platform !== 'darwin'`.\n */\nexport function initMacOS(): void {\n if (process.platform !== 'darwin') return;\n\n // ------------------------------------------------------------------\n // Activation Policy\n // ------------------------------------------------------------------\n // Set to 'regular' so the app appears in the Dock with an icon and\n // shows a standard menu bar. Without this, Electron apps launched\n // from the command line may start as 'accessory' (no Dock icon) and\n // the user sees a ghost window with no app to Cmd+Tab to.\n app.setActivationPolicy('regular');\n\n // ------------------------------------------------------------------\n // File-Open Handler\n // ------------------------------------------------------------------\n // macOS sends an `open-file` event when the user double-clicks a\n // file associated with the app or drops a folder on the Dock icon.\n // Register this early (before `app.whenReady`) so macOS queues the\n // event and delivers it after ready.\n //\n // We decrypt the path into a URI and forward it to the IPC layer;\n // the shell renderer decides whether to open it as a project.\n app.on('open-file', (_event, filePath) => {\n // open-file fires before `ready` on cold launch. Electron queues\n // it and re-emits after ready. We handle it once in the boot\n // sequence via `process.argv` for the initial open, and via the\n // event for subsequent opens while the app is running.\n if (app.isReady()) {\n handleFileOpen(filePath);\n }\n });\n\n // ------------------------------------------------------------------\n // Dock Menu\n // ------------------------------------------------------------------\n // Show a minimal Dock menu available even when no window is open.\n // Enables \"New Window\" from the Dock icon context menu.\n app.dock?.setMenu(\n Menu.buildFromTemplate([\n {\n label: 'New Window',\n click: () => {\n // The open-file handler will be invoked if the user picks a\n // folder; otherwise we rely on the renderer's \"no windows\n // \u2192 open recent\" logic.\n },\n },\n ]),\n );\n\n // ------------------------------------------------------------------\n // About Panel\n // ------------------------------------------------------------------\n // Populated from package.json; called by the standard macOS\n // \"WrongStack Desktop\" > \"About WrongStack Desktop\" menu item.\n app.setAboutPanelOptions({\n applicationName: 'WrongStack Desktop',\n applicationVersion: app.getVersion(),\n version: process.versions.electron ? `Electron ${process.versions.electron}` : '',\n });\n}\n\n/**\n * Forward a macOS file-open event to the renderer IPC channel.\n * Called both from the `open-file` event handler and from the boot\n * sequence's argv inspection.\n *\n * The renderer shell subscribes to `IPC.openFile` and decides whether\n * to treat `filePath` as a project directory to open or register.\n */\nfunction handleFileOpen(filePath: string): void {\n // Forwarding is done via a global IPC broadcast registered in boot().\n // The actual send happens after the shell WebContents is ready.\n // We cache the path here; the boot sequence drains the cache.\n pendingOpenFilePath = filePath;\n}\n\n/** Cached file path from a pre-ready open-file event. */\nlet pendingOpenFilePath: string | null = null;\n\n/**\n * Drain the pending open-file path and return it (consuming the cache).\n * Called by the boot sequence after the shell WebContents is ready.\n */\nexport function drainPendingOpenFilePath(): string | null {\n const path = pendingOpenFilePath;\n pendingOpenFilePath = null;\n return path;\n}\n\n/**\n * Check whether the user opened the app via a file/directory drag or\n * double-click. On macOS, the first argument after the app path is the\n * opened file/directory.\n */\nexport function firstOpenFileArg(argv: readonly string[]): string | null {\n if (process.platform !== 'darwin') return null;\n // argv on macOS: ['/path/to/Electron.app/Contents/MacOS/Electron', '/opened/folder']\n // In dev: ['/path/to/node', '/path/to/electron', '.', '/opened/folder']\n for (let index = 1; index < argv.length; index++) {\n const arg = argv[index];\n if (arg == null) continue;\n // Skip Electron's own flags and the app directory\n if (arg.startsWith('-')) continue;\n if (arg === '.' || arg === '--') continue;\n // The first non-flag, non-dot argument after the binary is likely\n // a file/folder path.\n return arg;\n }\n return null;\n}\n", "/**\n * Desktop Agent Bridge - WebSocket communication with runtimes.\n * Handles conversation management and WebSocket connections with automatic reconnection.\n */\nimport { randomUUID } from 'node:crypto';\nimport { EventEmitter } from 'node:events';\nimport {\n createSurfaceConnectionState,\n DEFAULT_SURFACE_CONNECTION_CONFIG,\n decodeProtocolFrame,\n markConnectionActivity,\n markConnectionConnecting,\n markConnectionOpen,\n planConnectionReconnect,\n resetConnection,\n type SurfaceConnectionState,\n stopConnection,\n} from '@wrongstack/webui-server/protocol';\nimport WebSocket from 'ws';\nimport type {\n DesktopConversationMessage,\n DesktopConversationSnapshot,\n DesktopConversationStatus,\n} from '../shared/types.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface ConversationInternal {\n runtimeId: string;\n status: DesktopConversationStatus;\n sessionId?: string | undefined;\n error?: string | undefined;\n messages: DesktopConversationMessage[];\n ws: WebSocket | null;\n connectPromise: Promise<void> | null;\n activeAssistantMessageId: string | null;\n /** Reconnection state */\n reconnectAttempt: number;\n reconnectTimer: ReturnType<typeof setTimeout> | null;\n reconnectUrl: string | null;\n connectionState: SurfaceConnectionState;\n // Per-reconnect message-handler bookkeeping. The anonymous\n // `ws.on('message', \u2026)` pattern pins the socket + its closure (which\n // captures `conversation`) for the socket's full lifetime \u2014 fine for\n // open sockets, fatal across reconnects, where each new connect() leaks\n // a stale message listener + closure onto the previous (now-orphaned)\n // WebSocket. RAM-leak audit 2026-08-11, HIGH.\n onMessage: ((data: WebSocket.RawData) => void) | null;\n socketGeneration: number;\n}\n\ninterface ServerMessage {\n type: string;\n payload?: Record<string, unknown> | undefined;\n}\n\n// ============================================================================\n// Configuration\n// ============================================================================\n\nconst MAX_MESSAGES = 300;\n\n/** Reconnection configuration */\nconst RECONNECT_CONFIG = {\n /** Maximum number of reconnection attempts (0 = disabled) */\n maxAttempts: 5,\n /** Initial delay in ms before first reconnection */\n initialDelayMs: 1000,\n /** Maximum delay in ms between reconnection attempts */\n maxDelayMs: 30000,\n /** Multiplier for exponential backoff */\n backoffMultiplier: 2,\n /** Jitter factor (0-1) to add randomness to delays */\n jitterFactor: 0.1,\n};\n\nconst DESKTOP_CONNECTION_CONFIG = {\n ...DEFAULT_SURFACE_CONNECTION_CONFIG,\n maxReconnectAttempts: RECONNECT_CONFIG.maxAttempts,\n initialBackoffMs: RECONNECT_CONFIG.initialDelayMs,\n maxBackoffMs: RECONNECT_CONFIG.maxDelayMs,\n backoffMultiplier: RECONNECT_CONFIG.backoffMultiplier,\n jitterRatio: RECONNECT_CONFIG.jitterFactor,\n};\n\n// ============================================================================\n// Bridge Implementation\n// ============================================================================\n\nexport class DesktopAgentBridge extends EventEmitter {\n private readonly conversations = new Map<string, ConversationInternal>();\n\n snapshot(runtimeId: string): DesktopConversationSnapshot {\n return publicConversation(this.getOrCreate(runtimeId));\n }\n\n /**\n * Get reconnection status for a runtime.\n */\n getReconnectStatus(runtimeId: string): { attempt: number; maxAttempts: number } | null {\n const conversation = this.conversations.get(runtimeId);\n if (!conversation) return null;\n return {\n attempt: conversation.reconnectAttempt,\n maxAttempts: RECONNECT_CONFIG.maxAttempts,\n };\n }\n\n /**\n * Force reconnection for a runtime (resets reconnection state).\n */\n forceReconnect(runtimeId: string, wsUrl: string): void {\n const conversation = this.getOrCreate(runtimeId);\n this.cancelReconnect(conversation);\n conversation.reconnectAttempt = 0;\n conversation.connectionState = resetConnection(conversation.connectionState);\n void this.ensureConnected(runtimeId, wsUrl);\n }\n\n async ensureConnected(runtimeId: string, wsUrl: string): Promise<DesktopConversationSnapshot> {\n const conversation = this.getOrCreate(runtimeId);\n\n // If already connected, return immediately\n if (conversation.ws?.readyState === WebSocket.OPEN) return publicConversation(conversation);\n\n // If currently connecting, wait for it\n if (conversation.connectPromise) {\n await conversation.connectPromise;\n return publicConversation(conversation);\n }\n\n // A user action cannot continue while only a delayed reconnect exists:\n // sendMessage() would otherwise write to a closed socket.\n if (conversation.reconnectTimer) {\n this.cancelReconnect(conversation);\n await this.connect(runtimeId, wsUrl);\n return publicConversation(conversation);\n }\n\n // Start fresh connection\n conversation.reconnectUrl = wsUrl;\n conversation.reconnectAttempt = 0;\n conversation.connectionState = resetConnection(conversation.connectionState);\n await this.connect(runtimeId, wsUrl);\n return publicConversation(conversation);\n }\n\n /**\n * Internal connect method that actually establishes the WebSocket.\n */\n private async connect(runtimeId: string, wsUrl: string): Promise<void> {\n const conversation = this.getOrCreate(runtimeId);\n\n // Cancel any pending reconnect timer\n this.cancelReconnect(conversation);\n\n conversation.status = 'connecting';\n conversation.connectionState = markConnectionConnecting(conversation.connectionState);\n conversation.error = undefined;\n this.emitChanged(conversation);\n this.emitReconnectEvent(conversation, 'connecting');\n\n // Store the in-flight connect promise so concurrent ensureConnected()\n // calls dedup through the conversation.connectPromise read at L129-130.\n // Without this, the dedup branch is dead and two parallel calls each\n // construct a fresh WebSocket \u2014 the loser's close-handler guard\n // (if (conversation.ws === ws)) means the superseded socket is never\n // closed, leaking one OPEN socket per race until close().\n const promise = new Promise<void>((resolve, reject) => {\n const ws = new WebSocket(wsUrl);\n conversation.ws = ws;\n\n // Bump the generation so a message handler from this socket knows it\n // is the current one. Each connect() call gets a unique generation,\n // so a stale socket that fires a late 'message' after its successor\n // has taken over sees a mismatch and bails before touching state.\n // RAM-leak audit 2026-08-11, HIGH.\n const myGeneration = ++conversation.socketGeneration;\n\n // Named (not anonymous) so we can detach it in close() and in the\n // 'close' handler. An anonymous ws.on('message', \u2026) was never removed,\n // so the closure pinned ConversationInternal (and its messages[],\n // ws, sessionId, \u2026) until the WebSocket was GC'd \u2014 across a reconnect\n // storm this leaked every ConversationInternal that ever connected.\n // RAM-leak audit 2026-08-11, HIGH.\n const onMessage = (data: unknown): void => {\n if (conversation.socketGeneration !== myGeneration) return;\n this.handleServerMessage(conversation, String(data));\n };\n conversation.onMessage = onMessage;\n ws.on('message', onMessage);\n\n // Set connection timeout\n const timeout = setTimeout(() => {\n if (conversation.ws === ws) {\n ws.close();\n reject(new Error('Connection timeout'));\n }\n }, 10000);\n\n ws.once('open', () => {\n clearTimeout(timeout);\n conversation.status = 'connected';\n conversation.error = undefined;\n conversation.connectPromise = null;\n conversation.reconnectAttempt = 0;\n conversation.connectionState = markConnectionOpen(conversation.connectionState);\n this.emitChanged(conversation);\n this.emitReconnectEvent(conversation, 'connected');\n resolve();\n });\n\n ws.once('error', (err) => {\n clearTimeout(timeout);\n conversation.status = 'error';\n conversation.error = err instanceof Error ? err.message : String(err);\n conversation.connectPromise = null;\n this.appendMessage(conversation, {\n role: 'system',\n text: `Connection error: ${conversation.error}`,\n });\n this.emitChanged(conversation);\n this.emitReconnectEvent(conversation, 'error');\n reject(err);\n });\n\n ws.once('close', () => {\n clearTimeout(timeout);\n // Only the socket that currently owns the conversation invalidates\n // the generation \u2014 a superseded socket closing must not clobber its\n // successor's generation, or late messages from the successor would\n // be wrongly dropped. RAM-leak audit 2026-08-11, HIGH (chimera review).\n if (conversation.ws === ws) {\n conversation.socketGeneration++;\n conversation.ws = null;\n }\n // Detach our named message handler so the closure (which retains\n // conversation) is releasable even if the ws is kept alive by the\n // runtime or pending GC. RAM-leak audit 2026-08-11, HIGH.\n ws.off('message', onMessage);\n // Only clear the tracked handler if it's still ours \u2014 a newer\n // connect() may have already installed its own. Clearing\n // unconditionally would orphan the new handler's reference,\n // making it impossible for close(runtimeId) to detach it later.\n // RAM-leak audit 2026-08-11, HIGH (chimera review Medium #1).\n if (conversation.onMessage === onMessage) {\n conversation.onMessage = null;\n }\n conversation.connectPromise = null;\n\n if (conversation.status !== 'error') {\n conversation.status = 'disconnected';\n }\n conversation.activeAssistantMessageId = null;\n this.emitChanged(conversation);\n\n // Schedule reconnection if applicable\n if (conversation.reconnectUrl && conversation.status === 'disconnected') {\n this.scheduleReconnect(conversation);\n }\n });\n });\n conversation.connectPromise = promise;\n return promise;\n }\n\n /**\n * Schedule a reconnection attempt with exponential backoff.\n */\n private scheduleReconnect(conversation: ConversationInternal): void {\n const reconnect = planConnectionReconnect(\n conversation.connectionState,\n DESKTOP_CONNECTION_CONFIG,\n );\n conversation.connectionState = reconnect.state;\n conversation.reconnectAttempt = reconnect.state.reconnectAttempt;\n if (!reconnect.plan) {\n this.emitReconnectEvent(conversation, 'exhausted');\n return;\n }\n this.emitReconnectEvent(conversation, 'scheduled', {\n delay: reconnect.plan.delayMs,\n attempt: reconnect.plan.attempt,\n });\n\n conversation.reconnectTimer = setTimeout(() => {\n conversation.reconnectTimer = null;\n if (!conversation.reconnectUrl) return;\n\n // Check if still disconnected\n if (conversation.ws?.readyState !== WebSocket.OPEN) {\n void this.connect(conversation.runtimeId, conversation.reconnectUrl);\n }\n }, reconnect.plan.delayMs);\n }\n\n /**\n * Cancel pending reconnection.\n */\n private cancelReconnect(conversation: ConversationInternal): void {\n if (conversation.reconnectTimer) {\n clearTimeout(conversation.reconnectTimer);\n conversation.reconnectTimer = null;\n }\n }\n\n /**\n * Emit reconnection event for UI feedback.\n */\n private emitReconnectEvent(\n conversation: ConversationInternal,\n status: 'connecting' | 'connected' | 'error' | 'scheduled' | 'exhausted',\n data?: { delay?: number; attempt?: number },\n ): void {\n this.emit('reconnect', {\n runtimeId: conversation.runtimeId,\n status,\n attempt: conversation.reconnectAttempt,\n maxAttempts: RECONNECT_CONFIG.maxAttempts,\n ...data,\n });\n }\n\n async sendMessage(\n runtimeId: string,\n wsUrl: string,\n content: string,\n ): Promise<DesktopConversationSnapshot> {\n const trimmed = content.trim();\n if (!trimmed) return this.snapshot(runtimeId);\n\n // Reset reconnection state on manual action\n const conversation = this.getOrCreate(runtimeId);\n conversation.reconnectAttempt = 0;\n conversation.connectionState = resetConnection(conversation.connectionState);\n\n await this.ensureConnected(runtimeId, wsUrl);\n\n // Refresh conversation after connect\n const conv = this.getOrCreate(runtimeId);\n this.appendMessage(conv, {\n id: `user_${randomUUID()}`,\n role: 'user',\n text: trimmed,\n });\n conv.status = 'running';\n conv.activeAssistantMessageId = null;\n this.emitChanged(conv);\n this.send(conv, {\n type: 'user_message',\n payload: {\n id: `msg_${Date.now()}_${randomUUID().slice(0, 8)}`,\n content: trimmed,\n timestamp: Date.now(),\n ...(conv.sessionId ? { sessionId: conv.sessionId } : {}),\n },\n });\n return publicConversation(conv);\n }\n\n async abort(runtimeId: string, wsUrl: string): Promise<DesktopConversationSnapshot> {\n // Reset reconnection state on manual action\n const conversation = this.getOrCreate(runtimeId);\n conversation.reconnectAttempt = 0;\n conversation.connectionState = resetConnection(conversation.connectionState);\n\n await this.ensureConnected(runtimeId, wsUrl);\n const conv = this.getOrCreate(runtimeId);\n this.send(conv, {\n type: 'abort',\n payload: conv.sessionId ? { sessionId: conv.sessionId } : {},\n });\n conv.status = 'connected';\n this.appendMessage(conv, { role: 'system', text: 'Abort requested.' });\n return publicConversation(conv);\n }\n\n close(runtimeId: string): void {\n const conversation = this.conversations.get(runtimeId);\n if (!conversation) return;\n\n // Cancel reconnection and clear state\n this.cancelReconnect(conversation);\n conversation.reconnectAttempt = 0;\n conversation.reconnectUrl = null;\n conversation.connectionState = stopConnection(conversation.connectionState);\n\n // Detach the per-reconnect message listener BEFORE nulling the ws ref.\n // Without this, the ws.on('message', \u2026) closure pins ConversationInternal\n // (and its messages[]) until the socket is GC'd. RAM-leak audit 2026-08-11, HIGH.\n if (conversation.onMessage) {\n conversation.ws?.off('message', conversation.onMessage);\n conversation.onMessage = null;\n }\n // Invalidate this conversation's generation so any in-flight socket whose\n // 'close' event fires after deletion cannot resurrect the conversation ref.\n conversation.socketGeneration++;\n conversation.ws?.close();\n conversation.ws = null;\n conversation.connectPromise = null;\n conversation.status = 'disconnected';\n conversation.activeAssistantMessageId = null;\n this.emitChanged(conversation);\n\n // Remove from the map so closed conversations don't accumulate in memory.\n this.conversations.delete(runtimeId);\n }\n\n closeAll(): void {\n // Snapshot keys first \u2014 close() deletes from the map during iteration.\n for (const runtimeId of [...this.conversations.keys()]) {\n this.close(runtimeId);\n }\n }\n\n private handleServerMessage(conversation: ConversationInternal, raw: string): void {\n const decoded = decodeProtocolFrame(raw, 'server');\n if (!decoded.ok) return;\n conversation.connectionState = markConnectionActivity(conversation.connectionState);\n const message = decoded.message as ServerMessage;\n const payload = message.payload ?? {};\n switch (message.type) {\n case 'session.start': {\n const sessionId = stringValue(payload['sessionId']);\n if (sessionId) conversation.sessionId = sessionId;\n conversation.status = conversation.status === 'running' ? 'running' : 'connected';\n this.emitChanged(conversation);\n break;\n }\n case 'provider.text_delta': {\n conversation.status = 'running';\n this.appendAssistantDelta(conversation, stringValue(payload['text']) ?? '');\n break;\n }\n case 'tool.started': {\n conversation.status = 'running';\n const name = stringValue(payload['name']) ?? 'tool';\n this.appendMessage(conversation, { role: 'tool', text: `Started ${name}` });\n break;\n }\n case 'tool.executed': {\n const name = stringValue(payload['name']) ?? 'tool';\n const ok = payload['ok'] === true;\n this.appendMessage(conversation, {\n role: 'tool',\n text: `${name} ${ok ? 'completed' : 'failed'}`,\n });\n break;\n }\n case 'provider.error':\n case 'provider.stream_error':\n case 'error': {\n const text =\n stringValue(payload['message']) ??\n stringValue(payload['description']) ??\n `${message.type} received`;\n conversation.status = 'error';\n conversation.error = text;\n this.appendMessage(conversation, { role: 'system', text });\n break;\n }\n case 'run.result': {\n const finalText = stringValue(payload['finalText']);\n if (finalText && !this.lastAssistantHasText(conversation)) {\n this.appendMessage(conversation, { role: 'assistant', text: finalText });\n }\n conversation.status = payload['status'] === 'failed' ? 'error' : 'connected';\n conversation.activeAssistantMessageId = null;\n this.emitChanged(conversation);\n break;\n }\n }\n }\n\n private send(conversation: ConversationInternal, message: Record<string, unknown>): void {\n if (conversation.ws?.readyState !== WebSocket.OPEN) {\n throw new Error('Runtime socket is not connected');\n }\n conversation.ws.send(JSON.stringify(message));\n }\n\n private appendAssistantDelta(conversation: ConversationInternal, text: string): void {\n if (!text) return;\n let message = conversation.messages.find((m) => m.id === conversation.activeAssistantMessageId);\n if (!message) {\n message = {\n id: `assistant_${randomUUID()}`,\n role: 'assistant',\n text: '',\n timestamp: Date.now(),\n };\n conversation.activeAssistantMessageId = message.id;\n conversation.messages.push(message);\n }\n message.text += text;\n this.trimMessages(conversation);\n this.emitChanged(conversation);\n }\n\n private appendMessage(\n conversation: ConversationInternal,\n input: Partial<DesktopConversationMessage> & Pick<DesktopConversationMessage, 'role' | 'text'>,\n ): void {\n conversation.messages.push({\n id: input.id ?? `${input.role}_${randomUUID()}`,\n role: input.role,\n text: input.text,\n timestamp: input.timestamp ?? Date.now(),\n });\n this.trimMessages(conversation);\n this.emitChanged(conversation);\n }\n\n private lastAssistantHasText(conversation: ConversationInternal): boolean {\n const lastAssistant = [...conversation.messages].reverse().find((m) => m.role === 'assistant');\n return Boolean(lastAssistant?.text.trim());\n }\n\n private trimMessages(conversation: ConversationInternal): void {\n if (conversation.messages.length <= MAX_MESSAGES) return;\n conversation.messages.splice(0, conversation.messages.length - MAX_MESSAGES);\n }\n\n private getOrCreate(runtimeId: string): ConversationInternal {\n let conversation = this.conversations.get(runtimeId);\n if (conversation) return conversation;\n conversation = {\n runtimeId,\n status: 'disconnected',\n messages: [],\n ws: null,\n connectPromise: null,\n activeAssistantMessageId: null,\n reconnectAttempt: 0,\n reconnectTimer: null,\n reconnectUrl: null,\n connectionState: createSurfaceConnectionState(),\n onMessage: null,\n socketGeneration: 0,\n };\n this.conversations.set(runtimeId, conversation);\n return conversation;\n }\n\n private emitChanged(conversation: ConversationInternal): void {\n this.emit('changed', publicConversation(conversation));\n }\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction publicConversation(conversation: ConversationInternal): DesktopConversationSnapshot {\n return {\n runtimeId: conversation.runtimeId,\n status: conversation.status,\n sessionId: conversation.sessionId,\n error: conversation.error,\n messages: conversation.messages.map((message) => ({ ...message })),\n };\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\n// ============================================================================\n// Reconnect Event Type (for external consumers)\n// ============================================================================\n\nexport interface DesktopBridgeReconnectEvent {\n runtimeId: string;\n status: 'connecting' | 'connected' | 'error' | 'scheduled' | 'exhausted';\n attempt: number;\n maxAttempts: number;\n delay?: number;\n}\n", "import { randomUUID } from 'node:crypto';\nimport type { Logger } from '@wrongstack/core/types';\nimport {\n createCompatibilityTrustBoundary,\n isTrustDecisionAllowed,\n type TrustBoundary,\n type TrustRisk,\n type TrustSubject,\n} from '@wrongstack/core/security';\n\nexport const desktopCompatibilityTrustBoundary = createCompatibilityTrustBoundary({\n policyId: 'desktop-trusted-host-compat-v1',\n});\n\nexport async function authorizeDesktopAction(\n boundary: TrustBoundary,\n action: {\n capability: string;\n subject: TrustSubject;\n risk: TrustRisk;\n cwd?: string | undefined;\n metadata?: Readonly<Record<string, string | number | boolean | null>> | undefined;\n },\n logger?: Logger,\n): Promise<{ allowed: boolean; reason: string }> {\n const request = {\n version: 1 as const,\n requestId: randomUUID(),\n actor: { kind: 'user' as const, id: 'desktop-user' },\n surface: 'desktop' as const,\n capability: action.capability,\n subject: action.subject,\n risk: action.risk,\n scope: action.cwd ? { cwd: action.cwd } : {},\n authContext: { method: 'local-process' as const, principalId: 'desktop-user' },\n ...(action.metadata ? { metadata: action.metadata } : {}),\n };\n const decision = await boundary.evaluate(request);\n const auditEntry = {\n event: 'desktop.trust_boundary.decision',\n requestId: request.requestId,\n capability: request.capability,\n decision: decision.kind,\n policyId: decision.policyId,\n };\n if (logger) {\n logger.info('Trust boundary decision', auditEntry);\n } else {\n console.warn(JSON.stringify({ level: 'info', ...auditEntry, timestamp: new Date().toISOString() }));\n }\n return { allowed: isTrustDecisionAllowed(decision), reason: decision.reason };\n}\n\nexport function authorizeDesktopRuntimeStart(\n boundary: TrustBoundary,\n cwd: string,\n runtimeKind: string,\n): Promise<{ allowed: boolean; reason: string }> {\n return authorizeDesktopAction(boundary, {\n capability: 'process.spawn',\n subject: {\n kind: 'command',\n id: 'wrongstack-webui-runtime',\n attributes: { runtimeKind },\n },\n risk: 'high',\n cwd,\n metadata: { operation: 'open-project' },\n });\n}\n\nexport function authorizeDesktopRuntimeStop(\n boundary: TrustBoundary,\n runtime: { id: string; pid?: number | undefined; root: string },\n): Promise<{ allowed: boolean; reason: string }> {\n return authorizeDesktopAction(boundary, {\n capability: 'process.terminate',\n subject: {\n kind: 'process',\n id: runtime.id,\n attributes: {\n ...(runtime.pid !== undefined ? { pid: runtime.pid } : {}),\n runtimeId: runtime.id,\n },\n },\n risk: 'high',\n cwd: runtime.root,\n metadata: { operation: 'close-runtime' },\n });\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 \u2014 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 \u2192 WS prefs.updated round-trip.\n webuiLocaleChanged: 'desktop:webui-locale-changed',\n // macOS open-file event forwarded from main process to shell renderer.\n // The shell uses this to decide whether to open a dragged/double-clicked\n // path as a project directory.\n openFile: 'desktop:open-file',\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\u2026',\n registerProjectEllipsis: 'Register Project\u2026',\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\u00E7\u0131k proje oturumu yok',\n revealProjectFolder: 'Proje klas\u00F6r\u00FCn\u00FC g\u00F6ster',\n quickView: 'H\u0131zl\u0131 g\u00F6r\u00FCn\u00FCm',\n chat: 'Sohbet',\n terminal: 'Terminal',\n session: 'Oturum',\n newSession: 'Yeni Oturum',\n file: 'Dosya',\n view: 'G\u00F6r\u00FCn\u00FCm',\n workspace: '\u00C7al\u0131\u015Fma alan\u0131',\n projects: 'Projeler',\n openProject: 'Proje A\u00E7',\n registerProject: 'Proje Kaydet',\n openProjectEllipsis: 'Proje A\u00E7\u2026',\n registerProjectEllipsis: 'Proje Kaydet\u2026',\n removeActiveFromRegistry: 'Aktif Projeyi Kay\u0131ttan Kald\u0131r',\n newSessionForActive: 'Aktif Proje i\u00E7in Yeni Oturum',\n settings: 'Ayarlar',\n closeActiveRuntime: 'Aktif \u00C7al\u0131\u015Fma Zaman\u0131n\u0131 Kapat',\n openChat: 'Sohbeti A\u00E7',\n focusPrompt: '\u0130steme Odaklan',\n toggleTerminal: 'Terminali A\u00E7/Kapat',\n newTerminal: 'Yeni Terminal',\n files: 'Dosyalar',\n changes: 'De\u011Fi\u015Fiklikler',\n sessions: 'Oturumlar',\n fleetHQ: 'Filo HQ',\n commandPalette: 'Komut Paleti',\n modelSwitcher: 'Model De\u011Fi\u015Ftirici',\n quickModelSwitcher: 'H\u0131zl\u0131 Model De\u011Fi\u015Ftirici',\n openInBrowser: 'Taray\u0131c\u0131da A\u00E7',\n reloadWebui: 'WebUI Yeniden Y\u00FCkle',\n reloadActiveWebui: 'Aktif WebUI Yeniden Y\u00FCkle',\n closeSession: 'Oturumu Kapat',\n yoloMode: 'YOLO Modu',\n nextPrediction: 'Sonraki Tahmin',\n contextAutoCompact: 'Ba\u011Flam\u0131 Otomatik S\u0131k\u0131\u015Ft\u0131r',\n compactDesktopSidebar: 'Masa\u00FCst\u00FC Kenar \u00C7ubu\u011Funu 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 \u00F6ffnen',\n registerProject: 'Projekt registrieren',\n openProjectEllipsis: 'Projekt \u00F6ffnen\u2026',\n registerProjectEllipsis: 'Projekt registrieren\u2026',\n removeActiveFromRegistry: 'Aktives Projekt aus Registry entfernen',\n newSessionForActive: 'Neue Sitzung f\u00FCr aktives Projekt',\n settings: 'Einstellungen',\n closeActiveRuntime: 'Aktive Runtime schlie\u00DFen',\n openChat: 'Chat \u00F6ffnen',\n focusPrompt: 'Prompt fokussieren',\n toggleTerminal: 'Terminal umschalten',\n newTerminal: 'Neues Terminal',\n files: 'Dateien',\n changes: '\u00C4nderungen',\n sessions: 'Sitzungen',\n fleetHQ: 'Fleet HQ',\n commandPalette: 'Command Palette',\n modelSwitcher: 'Modell-Umschalter',\n quickModelSwitcher: 'Schneller Modell-Umschalter',\n openInBrowser: 'Im Browser \u00F6ffnen',\n reloadWebui: 'WebUI neu laden',\n reloadActiveWebui: 'Aktive WebUI neu laden',\n closeSession: 'Sitzung schlie\u00DFen',\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\u00E9v\u00E9ler 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\u2026',\n registerProjectEllipsis: 'Enregistrer le projet\u2026',\n removeActiveFromRegistry: \"Retirer le projet actif du registre\",\n newSessionForActive: 'Nouvelle session pour le projet actif',\n settings: 'Param\u00E8tres',\n closeActiveRuntime: \"Fermer l'ex\u00E9cution 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\u00E9lecteur de mod\u00E8le',\n quickModelSwitcher: 'S\u00E9lecteur de mod\u00E8le 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\u00E9diction du prochain pas',\n contextAutoCompact: 'Compacter le contexte auto',\n compactDesktopSidebar: 'R\u00E9duire la barre lat\u00E9rale',\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\u2026',\n registerProjectEllipsis: 'Registra progetto\u2026',\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\u00E0 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\u00E1pida',\n chat: 'Chat',\n terminal: 'Terminal',\n session: 'Sesi\u00F3n',\n newSession: 'Nueva sesi\u00F3n',\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\u2026',\n registerProjectEllipsis: 'Registrar proyecto\u2026',\n removeActiveFromRegistry: 'Quitar proyecto activo del registro',\n newSessionForActive: 'Nueva sesi\u00F3n para el proyecto activo',\n settings: 'Ajustes',\n closeActiveRuntime: 'Cerrar runtime activo',\n openChat: 'Abrir chat',\n focusPrompt: 'Focalizar indicaci\u00F3n',\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\u00E1pido',\n openInBrowser: 'Abrir en el navegador',\n reloadWebui: 'Recargar WebUI',\n reloadActiveWebui: 'Recargar WebUI activo',\n closeSession: 'Cerrar sesi\u00F3n',\n yoloMode: 'Modo YOLO',\n nextPrediction: 'Predicci\u00F3n 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\u00F5es de projeto abertas',\n revealProjectFolder: 'Revelar pasta do projeto',\n quickView: 'Vista r\u00E1pida',\n chat: 'Chat',\n terminal: 'Terminal',\n session: 'Sess\u00E3o',\n newSession: 'Nova sess\u00E3o',\n file: 'Arquivo',\n view: 'Ver',\n workspace: 'Workspace',\n projects: 'Projetos',\n openProject: 'Abrir projeto',\n registerProject: 'Registrar projeto',\n openProjectEllipsis: 'Abrir projeto\u2026',\n registerProjectEllipsis: 'Registrar projeto\u2026',\n removeActiveFromRegistry: 'Remover projeto ativo do registro',\n newSessionForActive: 'Nova sess\u00E3o para o projeto ativo',\n settings: 'Configura\u00E7\u00F5es',\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\u00E7\u00F5es',\n sessions: 'Sess\u00F5es',\n fleetHQ: 'Fleet HQ',\n commandPalette: 'Paleta de comandos',\n modelSwitcher: 'Seletor de modelo',\n quickModelSwitcher: 'Seletor de modelo r\u00E1pido',\n openInBrowser: 'Abrir no navegador',\n reloadWebui: 'Recarregar WebUI',\n reloadActiveWebui: 'Recarregar WebUI ativo',\n closeSession: 'Fechar sess\u00E3o',\n yoloMode: 'Modo YOLO',\n nextPrediction: 'Previs\u00E3o do pr\u00F3ximo 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 resolves the active profile from the root\n * bootstrap and reads/writes that profile's `config.json` \u2014\n * using the SAME read \u2192 decrypt \u2192 mutate \u2192 encrypt \u2192 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';\nimport { decryptConfigSecrets, DefaultSecretVault, encryptConfigSecrets } from '@wrongstack/core/security';\nimport type { SecretVault } from '@wrongstack/core/types';\nimport { atomicWrite, wstackGlobalRoot } from '@wrongstack/core/utils';\n\nconst globalRoot = wstackGlobalRoot();\nconst bootstrapConfigPath = path.join(globalRoot, 'config.json');\nconst defaultProfileConfigPath = path.join(globalRoot, 'profiles', 'default', 'config.json');\nconst vault: SecretVault = new DefaultSecretVault({\n keyFile: path.join(globalRoot, '.key'),\n});\n\nfunction safeProfileName(value: unknown): string {\n if (typeof value !== 'string' || !value.trim()) return 'default';\n return value.replace(/[/\\\\:]/g, '_').replace(/\\.\\./g, '_') || 'default';\n}\n\n/** Resolve the current profile from the thin root bootstrap. */\nexport async function resolveActiveProfileConfigPath(): Promise<string> {\n try {\n const raw = await fs.readFile(bootstrapConfigPath, 'utf8');\n const parsed = JSON.parse(raw) as { activeProfile?: unknown };\n return path.join(globalRoot, 'profiles', safeProfileName(parsed.activeProfile), 'config.json');\n } catch {\n return defaultProfileConfigPath;\n }\n}\n\n/** Read the persisted display language, or undefined when unset/unreadable. */\nexport async function readUiLocale(): Promise<string | undefined> {\n const profileConfigPath = await resolveActiveProfileConfigPath();\n let raw: string;\n try {\n raw = await fs.readFile(profileConfigPath, 'utf8');\n } catch {\n return undefined;\n }\n try {\n const decrypted = decryptConfigSecrets(JSON.parse(raw) as Record<string, unknown>, vault) as {\n uiLocale?: string;\n };\n const value = decrypted.uiLocale;\n return typeof value === 'string' && value ? value : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** Stable paths + vault exposed for the desktop boot watcher and tests. */\nexport const desktopConfigPaths = {\n bootstrapConfigPath,\n profileConfigPath: defaultProfileConfigPath,\n vault,\n} 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 const profileConfigPath = await resolveActiveProfileConfigPath();\n let raw: string;\n try {\n raw = await fs.readFile(profileConfigPath, '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 \u2014 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 fs.mkdir(path.dirname(profileConfigPath), { recursive: true });\n await atomicWrite(profileConfigPath, 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 * as net from 'node:net';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport {\n atomicWrite,\n buildChildEnv,\n projectSlug,\n resolveWstackPaths,\n toErrorMessage,\n wstackGlobalRoot,\n} from '@wrongstack/core/utils';\nimport type { TrustBoundary } from '@wrongstack/core/security';\nimport {\n authorizeDesktopRuntimeStart,\n authorizeDesktopRuntimeStop,\n desktopCompatibilityTrustBoundary,\n} from './desktop-privileged-actions.js';\nimport { resolveWebUiDistDir, resolveWebUiEntry } from './runtime-manager-paths.js';\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(\n resolveWstackPaths({ projectRoot: process.cwd() }).configDir,\n 'desktop.json',\n );\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 constructor(private readonly trustBoundary: TrustBoundary = desktopCompatibilityTrustBoundary) {\n super();\n }\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 const authorization = await authorizeDesktopRuntimeStart(this.trustBoundary, resolved, kind);\n if (!authorization.allowed) {\n throw new Error(`Desktop runtime start denied: ${authorization.reason}`);\n }\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 distDir = resolveWebUiDistDir();\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 '--dist-dir',\n distDir,\n '--require-token',\n ],\n {\n cwd: resolved,\n env: {\n ...buildChildEnv(),\n ELECTRON_RUN_AS_NODE: '1',\n WEBUI_STRICT_PORT: '1',\n WRONGSTACK_DESKTOP: '1',\n // Passed by environment, not argv. A process command line is\n // world-readable on every platform this ships to \u2014 `ps -ef` on\n // POSIX, Task Manager's command-line column or a plain WMI query on\n // Windows \u2014 so `--token <secret>` handed the WebUI access token to\n // any local process that cared to look. The token grants full agent\n // control, so that is a credential disclosure, not a nuisance.\n // entry.ts already reads WEBUI_TOKEN; argv only took precedence\n // over it (WS-087).\n WEBUI_TOKEN: token,\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('error', (err) => {\n runtime.status = 'error';\n runtime.error = toErrorMessage(err);\n runtime.child = null;\n if (this.activeRuntimeId === runtime.id) {\n this.activeRuntimeId = firstRunningRuntimeId(this.runtimes);\n }\n this.emitChanged();\n });\n child.once('exit', (code, signal) => {\n if (runtime.status === 'error') return;\n runtime.status = 'stopped';\n runtime.error =\n code === 0 ? undefined : `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 if (runtime.status !== 'starting') {\n // The child exited or hit a spawn error while we were waiting.\n throw new Error(runtime.error ?? 'WebUI process exited during startup');\n }\n runtime.status = 'running';\n await this.persistWorkspaceState();\n this.emitChanged();\n return publicRuntime(runtime);\n } catch (err) {\n if (runtime.status !== 'stopped' && runtime.status !== 'error') {\n runtime.status = 'error';\n }\n if (runtime.error === undefined) {\n runtime.error = toErrorMessage(err);\n }\n await terminateProcessTree(runtime.child);\n runtime.child = null;\n if (this.activeRuntimeId === runtime.id) {\n this.activeRuntimeId = firstRunningRuntimeId(this.runtimes);\n }\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 const runtime = this.runtimes.get(id);\n if (runtime) {\n const authorization = await authorizeDesktopRuntimeStop(this.trustBoundary, runtime);\n if (!authorization.allowed) {\n throw new Error(`Desktop runtime stop denied: ${authorization.reason}`);\n }\n }\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 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: normalizeProjectEntries(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 = 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\nfunction hasChildExited(child: ChildProcess): boolean {\n return child.exitCode !== null || child.signalCode !== null;\n}\n\n/** Wait for actual process exit; ChildProcess.killed only means a signal was sent. */\nexport function waitForChildExit(child: ChildProcess, timeoutMs: number): Promise<boolean> {\n if (hasChildExited(child)) return Promise.resolve(true);\n\n return new Promise<boolean>((resolve) => {\n let settled = false;\n const finish = (exited: boolean): void => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n child.off('exit', onExit);\n resolve(exited);\n };\n const onExit = (): void => finish(true);\n const timer = setTimeout(() => finish(hasChildExited(child)), timeoutMs);\n timer.unref?.();\n child.once('exit', onExit);\n\n // Close the race between the initial state check and listener registration.\n if (hasChildExited(child)) finish(true);\n });\n}\n\nasync function terminateProcessTree(child: ChildProcess | null): Promise<void> {\n if (!child?.pid || hasChildExited(child)) return;\n if (process.platform !== 'win32') {\n // macOS / Linux: send SIGTERM first, then SIGKILL after a grace\n // period. Electron child processes spawned with ELECTRON_RUN_AS_NODE\n // may ignore the initial signal during busy I/O.\n const pid = child.pid;\n const exited = waitForChildExit(child, 5000);\n child.kill('SIGTERM');\n if (await exited) return;\n\n // Grace period expired \u2014 force kill the process tree. Do not use\n // child.killed here: it becomes true as soon as SIGTERM is sent.\n if (!hasChildExited(child)) {\n try {\n process.kill(-pid, 'SIGKILL');\n } catch {\n child.kill('SIGKILL');\n }\n await waitForChildExit(child, 1000);\n }\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(\n runtime: RuntimeInternal,\n stream: 'stdout' | 'stderr',\n text: string,\n): 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' && samePath(runtime.root, root) && 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 let probeTimer: ReturnType<typeof setTimeout> | undefined;\n\n const cleanup = (): void => {\n if (probeTimer) {\n clearTimeout(probeTimer);\n probeTimer = undefined;\n }\n };\n\n const probe = (): void => {\n let done = false;\n\n const triggerRetry = (): void => {\n if (done) return;\n done = true;\n if (Date.now() >= deadline) {\n reject(new Error(`WebUI did not become ready at ${baseUrl}`));\n return;\n }\n probeTimer = setTimeout(probe, 250);\n };\n\n const req = http.get(url, (res) => {\n res.resume();\n if (res.statusCode && res.statusCode >= 200 && res.statusCode < 500) {\n if (!done) {\n done = true;\n cleanup();\n resolve();\n }\n return;\n }\n triggerRetry();\n });\n\n req.once('error', () => {\n triggerRetry();\n });\n\n req.setTimeout(1000, () => {\n req.destroy();\n triggerRetry();\n });\n };\n\n probe();\n });\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 return normalizeProjectManifest(JSON.parse(raw) as unknown);\n } catch {\n return [];\n }\n}\n\nexport function normalizeProjectManifest(value: unknown): DesktopProjectEntry[] {\n if (Array.isArray(value)) return normalizeProjectEntries(value).slice(0, 80);\n if (!value || typeof value !== 'object') return [];\n const manifest = value as { projects?: unknown; recentProjects?: unknown; recents?: unknown };\n const source = Array.isArray(manifest.projects)\n ? manifest.projects\n : Array.isArray(manifest.recentProjects)\n ? manifest.recentProjects\n : Array.isArray(manifest.recents)\n ? manifest.recents\n : [];\n return normalizeProjectEntries(source).slice(0, 80);\n}\n\nfunction normalizeProjectEntries(value: unknown): DesktopProjectEntry[] {\n if (!Array.isArray(value)) return [];\n const seen = new Set<string>();\n const projects: DesktopProjectEntry[] = [];\n for (const item of value) {\n const project = normalizeProjectEntry(item);\n if (!project) continue;\n const key = pathKey(project.root);\n if (seen.has(key)) continue;\n seen.add(key);\n projects.push(project);\n }\n return projects.sort((a, b) =>\n (b.lastSeen ?? b.createdAt ?? '').localeCompare(a.lastSeen ?? a.createdAt ?? ''),\n );\n}\n\nfunction normalizeProjectEntry(value: unknown): DesktopProjectEntry | null {\n if (!value || typeof value !== 'object') return null;\n const candidate = value as Partial<DesktopProjectEntry>;\n if (typeof candidate.root !== 'string' || !candidate.root.trim()) return null;\n const root = path.resolve(candidate.root);\n const name =\n typeof candidate.name === 'string' && candidate.name.trim()\n ? candidate.name.trim()\n : path.basename(root) || root;\n const entry: DesktopProjectEntry = {\n name,\n root,\n slug:\n typeof candidate.slug === 'string' && candidate.slug.trim()\n ? candidate.slug.trim()\n : projectSlug(root),\n };\n if (typeof candidate.lastSeen === 'string' && candidate.lastSeen.trim()) {\n entry.lastSeen = candidate.lastSeen.trim();\n }\n if (typeof candidate.createdAt === 'string' && candidate.createdAt.trim()) {\n entry.createdAt = candidate.createdAt.trim();\n }\n if (typeof candidate.lastWorkingDir === 'string' && candidate.lastWorkingDir.trim()) {\n entry.lastWorkingDir = path.resolve(candidate.lastWorkingDir);\n }\n return entry;\n}\n\nasync function touchGlobalProjectManifest(\n entry: DesktopProjectEntry,\n): 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) =>\n (b.lastSeen ?? b.createdAt ?? '').localeCompare(a.lastSeen ?? a.createdAt ?? ''),\n )\n .slice(0, 80);\n await fs.mkdir(path.dirname(manifestFile), { recursive: true });\n await atomicWrite(manifestFile, `${JSON.stringify({ projects: sorted }, null, 2)}\\n`, {\n mode: 0o600,\n });\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 {\n desktopSettingsWorkspaceRoot,\n preloadPath,\n rendererIndexPath,\n webuiPreloadPath,\n} from './runtime-manager-paths.js';\n", "import { existsSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { resolveWstackPaths } from '@wrongstack/core/utils';\n\nexport function 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 try {\n const serverPkgPath = require.resolve('@wrongstack/webui-server/package.json');\n const candidate = path.join(path.dirname(serverPkgPath), 'dist', 'server', 'entry.js');\n if (existsSync(candidate)) return candidate;\n } catch {\n // fall through to legacy path\n }\n const serverIndex = require.resolve('@wrongstack/webui-server');\n return path.join(path.dirname(serverIndex), 'server', 'entry.js');\n}\n\nexport function resolveWebUiDistDir(): string {\n if (process.env['WRONGSTACK_WEBUI_DIST']) {\n return path.resolve(process.env['WRONGSTACK_WEBUI_DIST']);\n }\n const require = createRequire(import.meta.url);\n const serverEntry = require.resolve('@wrongstack/webui');\n const candidate = path.dirname(serverEntry);\n if (existsSync(candidate)) return candidate;\n throw new Error(\n `WebUI frontend assets not found at ${candidate}. Build @wrongstack/webui or set WRONGSTACK_WEBUI_DIST.`,\n );\n}\n\nexport function rendererIndexPath(): string {\n return new URL('../renderer/index.html', import.meta.url).href;\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\nexport function desktopSettingsWorkspaceRoot(): string {\n return path.join(resolveWstackPaths({ projectRoot: process.cwd() }).configDir, 'settings');\n}\n", "import type { TrustBoundary } from '@wrongstack/core/security';\nimport { shell, WebContentsView, type BaseWindow } from 'electron';\nimport type {\n DesktopWebuiCommand,\n DesktopWebuiPrefs,\n DesktopWebuiStatusSnapshot,\n} from '../../shared/types.js';\nimport { authorizeDesktopAction } from '../desktop-privileged-actions.js';\nimport { IPC } from '../ipc.js';\nimport type { DesktopRuntimeManager } from '../runtime-manager.js';\nimport { webuiPreloadPath } from '../runtime-manager.js';\nimport {\n MAX_PENDING_FLUSH_ATTEMPTS,\n MAX_PENDING_WEBUI_COMMANDS,\n WEBUI_COMMAND_ACK_TIMEOUT_MS,\n WEBUI_COMMAND_FALLBACK_MS,\n} from '../state/constants.js';\nimport type { DesktopWebuiRuntimeView, PendingWebuiCommandAck } from '../state/types.js';\nimport {\n buildWebuiCommandFallbackScript,\n normalizeDesktopWebuiCommand,\n} from '../webui-command-bridge.js';\nimport { allowedExternalProtocol, sameOrigin } from './navigation.js';\n\nexport interface DesktopWebuiControllerContext {\n manager: DesktopRuntimeManager;\n trustBoundary: TrustBoundary;\n getMainWindow: () => BaseWindow | null;\n getShellView: () => WebContentsView | null;\n getLocale: () => string;\n layoutViews: () => void;\n onPrefsChanged?:\n | ((previous: DesktopWebuiPrefs | undefined, next: DesktopWebuiPrefs | undefined) => void)\n | undefined;\n}\n\n/** Instance-owned lifecycle and command authority for embedded WebUI views. */\nexport class DesktopWebuiController {\n readonly views = new Map<string, DesktopWebuiRuntimeView>();\n readonly pendingAcks = new Map<string, PendingWebuiCommandAck>();\n activeRuntimeId: string | null = null;\n status: DesktopWebuiStatusSnapshot = { runtimeId: null, status: 'idle' };\n private commandSequence = 0;\n\n constructor(private readonly ctx: DesktopWebuiControllerContext) {}\n\n private openExternal(target: string): void {\n const protocol = allowedExternalProtocol(target);\n if (!protocol) return;\n void authorizeDesktopAction(this.ctx.trustBoundary, {\n capability: 'url.open-external',\n subject: { kind: 'url', id: target, attributes: { protocol } },\n risk: 'elevated',\n metadata: { operation: 'webui-navigation' },\n })\n .then((decision) =>\n decision.allowed ? void shell.openExternal(target) : undefined,\n )\n .catch(() => undefined);\n }\n\n private publishStatus(next: DesktopWebuiStatusSnapshot): void {\n this.status = next;\n const shellView = this.ctx.getShellView();\n if (!shellView || shellView.webContents.isDestroyed()) return;\n shellView.webContents.send(IPC.webuiStatusChanged, next);\n }\n\n setEntryStatus(entry: DesktopWebuiRuntimeView, next: DesktopWebuiStatusSnapshot): void {\n const previousPrefs = entry.status.prefs;\n entry.status = {\n ...next,\n ...(next.prefs === undefined && previousPrefs !== undefined ? { prefs: previousPrefs } : {}),\n // `pendingCommands` is always derived from the entry's own array (source of truth).\n // Any `next.pendingCommands` value is intentionally overwritten.\n pendingCommands: entry.pendingCommands.length,\n };\n if (this.activeRuntimeId === entry.runtimeId) {\n this.publishStatus(entry.status);\n this.ctx.onPrefsChanged?.(previousPrefs, entry.status.prefs);\n }\n }\n\n ensure(runtimeId: string): DesktopWebuiRuntimeView | null {\n const mainWindow = this.ctx.getMainWindow();\n if (!mainWindow) return null;\n const existing = this.views.get(runtimeId);\n if (existing) return existing;\n const view = new WebContentsView({\n webPreferences: {\n preload: webuiPreloadPath(),\n contextIsolation: true,\n nodeIntegration: false,\n // This is the view that renders agent output, tool results, file\n // contents, and fetched pages \u2014 i.e. the most attacker-influenceable\n // surface in the app, and the one that most needs process-level\n // containment rather than only bridge-level. webui-preload.ts imports\n // just electron's contextBridge/ipcRenderer and a constants map, so it\n // is already within the sandboxed preload subset (WS-093).\n sandbox: true,\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 view.webContents.setWindowOpenHandler(({ url }) => {\n this.openExternal(url);\n return { action: 'deny' };\n });\n view.webContents.on('will-navigate', (event, url) => {\n if (sameOrigin(url, entry.url)) return;\n event.preventDefault();\n this.openExternal(url);\n });\n view.webContents.on('did-start-loading', () => {\n if (this.views.get(runtimeId) !== entry) return;\n entry.bridgeReady = false;\n this.setEntryStatus(entry, { runtimeId, status: 'loading' });\n });\n view.webContents.on('did-finish-load', () => {\n if (this.views.get(runtimeId) !== entry) return;\n this.scheduleFlush(entry);\n try {\n entry.view.webContents.send(IPC.webuiLocaleChanged, this.ctx.getLocale());\n } catch {}\n });\n view.webContents.on('did-fail-load', (_event, errorCode, errorDescription) => {\n if (this.views.get(runtimeId) !== entry || errorCode === -3) return;\n this.setEntryStatus(entry, { runtimeId, status: 'error', error: errorDescription });\n });\n view.webContents.on('render-process-gone', (_event, details) => {\n if (this.views.get(runtimeId) !== entry) return;\n this.setEntryStatus(entry, {\n runtimeId,\n status: 'error',\n error: `WebUI renderer exited: ${details.reason}`,\n });\n });\n this.views.set(runtimeId, entry);\n return entry;\n }\n\n attach(entry: DesktopWebuiRuntimeView): void {\n const mainWindow = this.ctx.getMainWindow();\n if (!mainWindow || entry.attached) return;\n mainWindow.contentView.addChildView(entry.view);\n entry.attached = true;\n }\n\n dispose(entry: DesktopWebuiRuntimeView): void {\n this.views.delete(entry.runtimeId);\n entry.pendingCommands.length = 0;\n this.settleRuntimeAcks(entry.runtimeId, false);\n if (entry.pendingFlushTimer) clearTimeout(entry.pendingFlushTimer);\n entry.pendingFlushTimer = null;\n const mainWindow = this.ctx.getMainWindow();\n if (mainWindow && entry.attached) mainWindow.contentView.removeChildView(entry.view);\n entry.attached = false;\n if (!entry.view.webContents.isDestroyed()) entry.view.webContents.close();\n if (this.activeRuntimeId === entry.runtimeId) this.activeRuntimeId = null;\n }\n\n disposeAll(): void {\n for (const entry of [...this.views.values()]) this.dispose(entry);\n }\n\n findBySenderId(senderId: number): DesktopWebuiRuntimeView | undefined {\n return [...this.views.values()].find((entry) => entry.view.webContents.id === senderId);\n }\n\n syncActive(): void {\n if (!this.ctx.getMainWindow()) return;\n const snapshot = this.ctx.manager.snapshot();\n const live = new Set(snapshot.runtimes.filter((r) => r.status === 'running').map((r) => r.id));\n for (const [id, entry] of this.views) if (!live.has(id)) this.dispose(entry);\n const active = snapshot.runtimes.find((runtime) => runtime.id === snapshot.activeRuntimeId);\n if (active?.status !== 'running') {\n this.activeRuntimeId = active?.id ?? null;\n this.publishStatus({ runtimeId: active?.id ?? null, status: 'idle' });\n this.ctx.layoutViews();\n return;\n }\n const url = this.ctx.manager.getRuntimeUrlWithToken(active.id);\n if (!url) {\n this.activeRuntimeId = active.id;\n this.publishStatus({ runtimeId: active.id, status: 'idle' });\n this.ctx.layoutViews();\n return;\n }\n const entry = this.ensure(active.id);\n if (!entry) return;\n this.activeRuntimeId = active.id;\n this.attach(entry);\n this.ctx.layoutViews();\n this.publishStatus(entry.status);\n if (entry.url === url) return;\n entry.url = url;\n entry.bridgeReady = false;\n this.setEntryStatus(entry, { runtimeId: active.id, status: 'loading' });\n void entry.view.webContents.loadURL(url).catch((error) => {\n this.setEntryStatus(entry, {\n runtimeId: active.id,\n status: 'error',\n error: error instanceof Error ? error.message : String(error),\n });\n });\n }\n\n broadcastLocale(locale: string): void {\n for (const entry of this.views.values()) {\n if (!entry.view.webContents.isDestroyed())\n entry.view.webContents.send(IPC.webuiLocaleChanged, locale);\n }\n }\n\n private activeEntry(): DesktopWebuiRuntimeView | undefined {\n const id = this.ctx.manager.snapshot().activeRuntimeId;\n return id ? this.views.get(id) : undefined;\n }\n\n async dispatch(commandInput: unknown): Promise<boolean> {\n const command = normalizeDesktopWebuiCommand(commandInput);\n if (!command) return false;\n const entry = this.activeEntry();\n if (!entry?.url) return false;\n if (entry.status.status !== 'ready' || !entry.bridgeReady) {\n if (!entry.view.webContents.isLoading() && entry.status.status !== 'error')\n return this.dispatchNow(entry, command);\n this.queue(entry, command);\n this.scheduleFlush(entry);\n return true;\n }\n return this.dispatchNow(entry, command);\n }\n\n async reload(): Promise<boolean> {\n const entry = this.activeEntry();\n if (!entry?.url) return false;\n entry.bridgeReady = false;\n this.setEntryStatus(entry, { runtimeId: entry.runtimeId, status: 'loading' });\n return entry.view.webContents.loadURL(entry.url).then(() => true).catch((error) => {\n this.setEntryStatus(entry, {\n runtimeId: entry.runtimeId,\n status: 'error',\n error: error instanceof Error ? error.message : String(error),\n });\n return false;\n });\n }\n\n private queue(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 entry.pendingFlushAttempts = 0;\n this.setEntryStatus(entry, entry.status);\n }\n\n private dispatchNow(entry: DesktopWebuiRuntimeView, command: DesktopWebuiCommand): Promise<boolean> {\n if (this.views.get(entry.runtimeId) !== entry || !entry.url) return Promise.resolve(false);\n const requestId = `${entry.runtimeId}:${Date.now()}:${++this.commandSequence}`;\n const outbound = { ...command, requestId };\n return new Promise<boolean>((resolve) => {\n const fallbackTimer = setTimeout(() => {\n if (!this.pendingAcks.has(requestId)) return;\n if (this.views.get(entry.runtimeId) !== entry || entry.view.webContents.isDestroyed()) return;\n void entry.view.webContents.executeJavaScript(buildWebuiCommandFallbackScript(outbound), true).catch(() => undefined);\n }, WEBUI_COMMAND_FALLBACK_MS);\n const timer = setTimeout(() => this.settleAck(requestId, false), WEBUI_COMMAND_ACK_TIMEOUT_MS);\n this.pendingAcks.set(requestId, { runtimeId: entry.runtimeId, timer, fallbackTimer, resolve });\n try {\n entry.view.webContents.send(IPC.webuiCommand, outbound);\n if (this.activeRuntimeId === entry.runtimeId) entry.view.webContents.focus();\n } catch {\n this.settleAck(requestId, false);\n }\n });\n }\n\n settleAck(requestId: string, handled: boolean): void {\n const pending = this.pendingAcks.get(requestId);\n if (!pending) return;\n this.pendingAcks.delete(requestId);\n clearTimeout(pending.timer);\n if (pending.fallbackTimer) clearTimeout(pending.fallbackTimer);\n if (handled) {\n const entry = this.views.get(pending.runtimeId);\n if (entry) {\n entry.bridgeReady = true;\n this.setEntryStatus(entry, { ...entry.status, status: 'ready' });\n }\n }\n pending.resolve(handled);\n }\n\n private settleRuntimeAcks(runtimeId: string, handled: boolean): void {\n for (const [id, pending] of [...this.pendingAcks])\n if (pending.runtimeId === runtimeId) this.settleAck(id, handled);\n }\n\n scheduleFlush(entry: DesktopWebuiRuntimeView): void {\n if (entry.pendingFlushTimer) return;\n entry.pendingFlushTimer = setTimeout(() => {\n entry.pendingFlushTimer = null;\n void this.flush(entry);\n }, 250);\n }\n\n private async flush(entry: DesktopWebuiRuntimeView): Promise<void> {\n if (this.views.get(entry.runtimeId) !== entry || entry.pendingCommands.length === 0) return;\n if (!entry.bridgeReady) {\n entry.pendingFlushAttempts += 1;\n const shouldExecuteFallback = !entry.view.webContents.isLoading() && entry.pendingFlushAttempts >= 4;\n if (!shouldExecuteFallback && entry.pendingFlushAttempts <= MAX_PENDING_FLUSH_ATTEMPTS) {\n this.scheduleFlush(entry);\n this.setEntryStatus(entry, entry.status);\n return;\n }\n if (!shouldExecuteFallback) {\n entry.pendingCommands.length = 0;\n this.setEntryStatus(entry, { runtimeId: entry.runtimeId, status: 'error', error: 'WebUI command bridge did not become ready.' });\n return;\n }\n }\n entry.pendingFlushAttempts = 0;\n const commands = entry.pendingCommands.splice(0);\n this.setEntryStatus(entry, entry.status);\n for (const command of commands) await this.dispatchNow(entry, command).catch(() => undefined);\n }\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", "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 'goal',\n 'sddhub',\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 '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", "import { OPEN_EXTERNAL_ALLOWED_PROTOCOLS } from '../state/constants.js';\n\nexport function allowedExternalProtocol(target: string): string | undefined {\n try {\n const protocol = new URL(target).protocol;\n return OPEN_EXTERNAL_ALLOWED_PROTOCOLS.has(protocol) ? protocol : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function 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", "import * as fs from 'node:fs/promises';\nimport { nativeImage, type NativeImage } from 'electron';\n\nasync function readIcon(relativePath: string): Promise<NativeImage | undefined> {\n try {\n const iconPath = new URL(relativePath, import.meta.url).pathname;\n await fs.stat(iconPath);\n const icon = nativeImage.createFromPath(iconPath);\n return icon.isEmpty() ? undefined : icon;\n } catch {\n return undefined;\n }\n}\n\n/** Resolves the best supported desktop icon without making application boot depend on it. */\nexport async function loadDesktopAppIcon(): Promise<NativeImage | undefined> {\n if (process.platform !== 'darwin') return readIcon('../../assets/icon.svg');\n return (await readIcon('../../assets/icon.png')) ?? readIcon('../../assets/icon.icns');\n}\n", "import type { BaseWindow, Display, Rectangle } from 'electron';\nimport type { DesktopWindowState } from '../shared/types.js';\nimport { MIN_WINDOW_HEIGHT, MIN_WINDOW_WIDTH } from './state/constants.js';\n\nexport interface DesktopWindowStateControllerContext {\n getWindow(): BaseWindow | null;\n getDisplays(): Display[];\n save(state: DesktopWindowState): Promise<void>;\n}\n\n/** Owns debounced window persistence and display-aware restoration validation. */\nexport class DesktopWindowStateController {\n private saveTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(private readonly ctx: DesktopWindowStateControllerContext) {}\n\n scheduleSave(): void {\n if (this.saveTimer) clearTimeout(this.saveTimer);\n this.saveTimer = setTimeout(() => {\n this.saveTimer = null;\n void this.save();\n }, 350);\n }\n\n async save(): Promise<void> {\n const window = this.ctx.getWindow();\n if (!window || window.isDestroyed?.()) return;\n const bounds = window.getNormalBounds();\n await this.ctx.save({ ...bounds, maximized: window.isMaximized() });\n }\n\n validated(state: DesktopWindowState | null): DesktopWindowState | null {\n if (\n !state ||\n !Number.isFinite(state.width) ||\n !Number.isFinite(state.height) ||\n state.width < MIN_WINDOW_WIDTH ||\n state.height < MIN_WINDOW_HEIGHT\n )\n return null;\n if (state.x === undefined || state.y === undefined) {\n return { width: state.width, height: state.height, maximized: state.maximized };\n }\n const candidate = { x: state.x, y: state.y, width: state.width, height: state.height };\n return this.ctx.getDisplays().some(({ workArea }) => intersects(candidate, workArea))\n ? { x: state.x, y: state.y, width: state.width, height: state.height, maximized: state.maximized }\n : null;\n }\n}\n\nfunction intersects(left: Rectangle, right: Rectangle): 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 * Runtime and project operations.\n * Handles project management, runtime lifecycle, and workspace operations.\n */\nimport * as fs from 'node:fs/promises';\nimport type { DesktopWebuiCommand } from '../../shared/types.js';\nimport type { IRuntimeManager, IAgentBridge } from '../state/types.js';\nimport { desktopSettingsWorkspaceRoot } from '../runtime-manager.js';\n\nexport interface RuntimeOperationsContext {\n getRuntimeManager(): IRuntimeManager;\n getAgentBridge(): IAgentBridge;\n broadcastState(): void;\n syncActiveWebuiView(): void;\n dispatchWebuiCommand(command: DesktopWebuiCommand): Promise<boolean>;\n chooseProjectRoot(kind: 'open' | 'register'): Promise<string | undefined>;\n}\n\n/**\n * Open a project, optionally at a specific path.\n */\nexport async function openProject(\n ctx: RuntimeOperationsContext,\n requestedRoot?: string,\n): Promise<ReturnType<IRuntimeManager['snapshot']>> {\n let projectRoot = requestedRoot;\n if (!projectRoot) {\n projectRoot = await ctx.chooseProjectRoot('open');\n }\n if (!projectRoot) return ctx.getRuntimeManager().snapshot();\n\n await ctx.getRuntimeManager().openProject(projectRoot);\n ctx.syncActiveWebuiView();\n ctx.broadcastState();\n return ctx.getRuntimeManager().snapshot();\n}\n\n/**\n * Register a project (add to global registry without opening).\n */\nexport async function registerProject(\n ctx: RuntimeOperationsContext,\n requestedRoot?: string,\n): Promise<ReturnType<IRuntimeManager['snapshot']>> {\n let projectRoot = requestedRoot;\n if (!projectRoot) {\n projectRoot = await ctx.chooseProjectRoot('register');\n }\n if (!projectRoot) return ctx.getRuntimeManager().snapshot();\n\n await ctx.getRuntimeManager().registerProject(projectRoot);\n ctx.broadcastState();\n return ctx.getRuntimeManager().snapshot();\n}\n\n/**\n * Unregister a project from the global registry.\n */\nexport async function unregisterProject(\n ctx: RuntimeOperationsContext,\n root: string,\n): Promise<ReturnType<IRuntimeManager['snapshot']>> {\n if (!root || typeof root !== 'string') return ctx.getRuntimeManager().snapshot();\n await ctx.getRuntimeManager().unregisterProject(root);\n ctx.broadcastState();\n return ctx.getRuntimeManager().snapshot();\n}\n\n/**\n * Open a new session for an existing project.\n */\nexport async function openProjectSession(\n ctx: RuntimeOperationsContext,\n runtimeId?: string,\n): Promise<ReturnType<IRuntimeManager['snapshot']>> {\n const snapshot = ctx.getRuntimeManager().snapshot();\n const runtime =\n (runtimeId ? snapshot.runtimes.find((candidate) => candidate.id === runtimeId) : undefined) ??\n snapshot.runtimes.find((candidate) => candidate.id === snapshot.activeRuntimeId);\n\n if (runtime?.kind !== 'project') {\n return openProject(ctx);\n }\n\n await ctx.getRuntimeManager().openProject(runtime.root, { forceNew: true });\n ctx.syncActiveWebuiView();\n ctx.broadcastState();\n return ctx.getRuntimeManager().snapshot();\n}\n\n/**\n * Open global settings workspace.\n */\nexport async function openSettings(\n ctx: RuntimeOperationsContext,\n): Promise<ReturnType<IRuntimeManager['snapshot']>> {\n const snapshot = ctx.getRuntimeManager().snapshot();\n const active = snapshot.runtimes.find((runtime) => runtime.id === snapshot.activeRuntimeId);\n\n if (!active || active.kind === 'global-settings' || active.status !== 'running') {\n const root = desktopSettingsWorkspaceRoot();\n await fs.mkdir(root, { recursive: true });\n await ctx.getRuntimeManager().openProject(root, {\n name: 'Global Settings',\n kind: 'global-settings',\n touchRecent: false,\n });\n ctx.syncActiveWebuiView();\n ctx.broadcastState();\n }\n\n await ctx.dispatchWebuiCommand({ view: 'settings' });\n return ctx.getRuntimeManager().snapshot();\n}\n\n/**\n * Activate a runtime (make it the active runtime).\n */\nexport async function activateRuntime(\n ctx: RuntimeOperationsContext,\n id: string,\n): Promise<ReturnType<IRuntimeManager['snapshot']>> {\n await ctx.getRuntimeManager().activateRuntime(id);\n ctx.syncActiveWebuiView();\n ctx.broadcastState();\n return ctx.getRuntimeManager().snapshot();\n}\n\n/**\n * Close a runtime.\n */\nexport async function closeRuntime(\n ctx: RuntimeOperationsContext,\n id: string,\n): Promise<ReturnType<IRuntimeManager['snapshot']>> {\n ctx.getAgentBridge().close(id);\n await ctx.getRuntimeManager().closeRuntime(id);\n ctx.syncActiveWebuiView();\n ctx.broadcastState();\n return ctx.getRuntimeManager().snapshot();\n}\n\n/**\n * Restore the last workspace (called on app startup).\n */\nexport async function restoreLastWorkspace(ctx: RuntimeOperationsContext): Promise<void> {\n await ctx.getRuntimeManager().restoreLastWorkspace();\n ctx.syncActiveWebuiView();\n ctx.broadcastState();\n}\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 * 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 registerProject: () => void ctx.registerProject(),\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, ProjectMenuActions, ProjectMenuGroup } from './types.js';\n", "/**\n * Projects menu builder.\n */\nimport path from 'node:path';\nimport type { MenuItemConstructorOptions } from 'electron';\nimport type { DesktopRuntimeRecord } from '../../shared/types.js';\nimport type { ProjectMenuActions, ProjectMenuGroup } from './types.js';\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(''),\n },\n {\n label: t('registerProjectEllipsis'),\n click: () => actions.registerProject?.(),\n },\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} \u00B7 ${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: path.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", "/**\n * IPC handler registration with validation.\n * Centralizes all IPC handler registration logic with Zod schema validation.\n */\nimport { ipcMain } from 'electron';\nimport type { DesktopWebuiPrefs } from '../../shared/types.js';\nimport { IPC } from '../ipc.js';\nimport type { IpcHandlerContext } from '../state/types.js';\nimport { createValidationLogger, validate, validateOrDefault } from '../validation/index.js';\nimport {\n booleanSchema,\n pathSchema,\n runtimeIdSchema,\n setLocaleSchema,\n webuiCommandAckSchema,\n} from '../validation/schemas.js';\n\n// Validation logger for tracking malformed messages\nconst validationLogger = createValidationLogger('IPC');\n\n/**\n * Register all IPC handlers with validation.\n */\nexport function registerIpcHandlers(ctx: IpcHandlerContext): void {\n // State handlers (no validation needed - internal data)\n ipcMain.handle(IPC.getState, () => ctx.getRuntimeManager().snapshot());\n\n ipcMain.handle(IPC.getConversation, (_event, runtimeId: unknown) => {\n const result = validate(runtimeIdSchema, runtimeId);\n if (!result.success) {\n validationLogger.log(`getConversation: ${result.error}`);\n return ctx.getAgentBridge().snapshot('');\n }\n return ctx.getAgentBridge().snapshot(result.data);\n });\n\n ipcMain.handle(IPC.getWebuiStatus, () => ctx.getWebuiStatus());\n\n // Navigation handlers\n ipcMain.handle(IPC.navigateWebui, async (_event, command: unknown) => {\n // Command validation is handled by normalizeDesktopWebuiCommand\n return ctx.dispatchWebuiCommand(command);\n });\n\n ipcMain.handle(IPC.reloadWebui, async () => ctx.reloadActiveWebuiView());\n\n // Shell handlers\n ipcMain.handle(IPC.setShellSidebarCollapsed, (_event, collapsed: unknown) => {\n const result = validateOrDefault(booleanSchema, collapsed, true);\n ctx.setShellSidebarCollapsed(result);\n return true;\n });\n\n ipcMain.handle(IPC.openSettings, async () => ctx.openSettings());\n\n // Project handlers\n ipcMain.handle(IPC.openProjectSession, async (_event, runtimeId: unknown) => {\n const validated = validateOptional(runtimeIdSchema, runtimeId);\n return ctx.openProjectSession(validated);\n });\n\n ipcMain.handle(IPC.openProject, async (_event, requestedRoot: unknown) => {\n const validated = validateOptional(pathSchema, requestedRoot);\n return ctx.openProject(validated);\n });\n\n ipcMain.handle(IPC.registerProject, async (_event, requestedRoot: unknown) => {\n const validated = validateOptional(pathSchema, requestedRoot);\n return ctx.registerProject(validated);\n });\n\n ipcMain.handle(IPC.unregisterProject, async (_event, root: unknown) => {\n const result = validate(pathSchema, root);\n if (!result.success) {\n validationLogger.log(`unregisterProject: ${result.error}`);\n return ctx.getRuntimeManager().snapshot();\n }\n return ctx.unregisterProject(result.data);\n });\n\n // Runtime handlers\n ipcMain.handle(IPC.activateRuntime, async (_event, id: unknown) => {\n const result = validate(runtimeIdSchema, id);\n if (!result.success) {\n validationLogger.log(`activateRuntime: ${result.error}`);\n return ctx.getRuntimeManager().snapshot();\n }\n return ctx.activateRuntime(result.data);\n });\n\n ipcMain.handle(IPC.closeRuntime, async (_event, id: unknown) => {\n const result = validate(runtimeIdSchema, id);\n if (!result.success) {\n validationLogger.log(`closeRuntime: ${result.error}`);\n return ctx.getRuntimeManager().snapshot();\n }\n return ctx.closeRuntime(result.data);\n });\n\n ipcMain.handle(IPC.sendMessage, async (_event, id: unknown, content: unknown) => {\n const idResult = validate(runtimeIdSchema, id);\n if (!idResult.success) {\n validationLogger.log(`sendMessage (id): ${idResult.error}`);\n return ctx.sendMessage('', '', '');\n }\n const contentResult = validate(pathSchema.transform(() => String(content ?? '')), content);\n const safeContent = contentResult.success ? contentResult.data : String(content ?? '');\n return ctx.sendMessage(\n idResult.data,\n ctx.getRuntimeManager().getRuntimeWsUrlWithToken(idResult.data) ?? '',\n safeContent,\n );\n });\n\n ipcMain.handle(IPC.abortRuntime, async (_event, id: unknown) => {\n const result = validate(runtimeIdSchema, id);\n if (!result.success) {\n validationLogger.log(`abortRuntime: ${result.error}`);\n return ctx.abortRuntime('', '');\n }\n return ctx.abortRuntime(\n result.data,\n ctx.getRuntimeManager().getRuntimeWsUrlWithToken(result.data) ?? '',\n );\n });\n\n ipcMain.handle(IPC.openRuntimeInBrowser, async (_event, id: unknown) => {\n const result = validate(runtimeIdSchema, id);\n if (!result.success) {\n validationLogger.log(`openRuntimeInBrowser: ${result.error}`);\n return;\n }\n const url = ctx.getRuntimeManager().getRuntimeUrlWithToken(result.data);\n if (url) ctx.openExternal(url);\n });\n\n ipcMain.handle(IPC.revealRuntimeRoot, async (_event, id: unknown) => {\n const result = validate(runtimeIdSchema, id);\n if (!result.success) {\n validationLogger.log(`revealRuntimeRoot: ${result.error}`);\n return;\n }\n const runtime = ctx.getRuntimeManager().getRuntime(result.data);\n if (runtime) ctx.revealInExplorer(runtime.root);\n });\n\n // WebUI event handlers\n ipcMain.on(IPC.webuiReadyChanged, (event, ready: unknown) => {\n const entry = ctx.findWebuiEntryBySenderId(event.sender.id);\n if (!entry) return;\n const isReady = ready === true;\n entry.bridgeReady = isReady;\n if (entry.bridgeReady) {\n ctx.setEntryWebuiStatus(entry, { ...entry.status, status: 'ready' });\n ctx.schedulePendingWebuiFlush(entry);\n } else if (entry.status.status === 'ready') {\n ctx.setEntryWebuiStatus(entry, { ...entry.status, status: 'loading' });\n }\n });\n\n ipcMain.on(IPC.webuiPrefsChanged, (event, prefs: unknown) => {\n const entry = ctx.findWebuiEntryBySenderId(event.sender.id);\n if (!entry) return;\n const sanitized = sanitizeWebuiPrefs(prefs);\n if (Object.keys(sanitized).length === 0) return;\n ctx.setEntryWebuiStatus(entry, {\n ...entry.status,\n prefs: { ...(entry.status.prefs ?? {}), ...sanitized },\n });\n });\n\n ipcMain.on(IPC.webuiCommandAck, (event, requestId: unknown, handled: unknown, _message?: unknown) => {\n const entry = ctx.findWebuiEntryBySenderId(event.sender.id);\n if (!entry) return;\n\n const result = validate(webuiCommandAckSchema, {\n requestId,\n handled,\n message: _message,\n });\n\n if (!result.success) {\n validationLogger.log(`webuiCommandAck: ${result.error}`);\n return;\n }\n\n const pending = ctx.getPendingWebuiCommandAcks().get(result.data.requestId);\n if (!pending || pending.runtimeId !== entry.runtimeId) return;\n ctx.settlePendingWebuiCommandAck(result.data.requestId, result.data.handled);\n });\n\n // Locale handlers\n ipcMain.on(IPC.setLocale, (_event, locale: unknown) => {\n const result = validate(setLocaleSchema, { locale });\n if (!result.success) {\n validationLogger.log(`setLocale: ${result.error}`);\n return;\n }\n ctx.getI18n().setMainLocale(result.data.locale);\n ctx.configureApplicationMenu();\n ctx.broadcastLocaleToEmbeddedWebuis(result.data.locale);\n void ctx.getConfigIo().writeUiLocale(result.data.locale);\n });\n}\n\n/**\n * Validate optional value with schema.\n */\nfunction validateOptional<T>(schema: { safeParse: (v: unknown) => { success: boolean; data?: T; error?: unknown } }, value: unknown): T | undefined {\n if (value === undefined || value === null) return undefined;\n const result = schema.safeParse(value);\n return result.success ? result.data : undefined;\n}\n\n/**\n * Sanitize WebUI preferences from renderer.\n */\nfunction sanitizeWebuiPrefs(prefs: unknown): DesktopWebuiPrefs {\n const next: DesktopWebuiPrefs = {};\n if (!isRecord(prefs)) return next;\n if (typeof prefs['yolo'] === 'boolean') next.yolo = prefs['yolo'];\n if (typeof prefs['nextPrediction'] === 'boolean') next.nextPrediction = prefs['nextPrediction'];\n if (typeof prefs['contextAutoCompact'] === 'boolean') {\n next.contextAutoCompact = prefs['contextAutoCompact'];\n }\n return next;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n}\n", "/**\n * Validation utilities for IPC messages.\n * Provides safe parsing and error handling for untrusted input.\n */\nimport type { ZodSchema, ZodError } from 'zod';\n\n/**\n * Result type for validation operations.\n * Success contains the validated data, Failure contains the error.\n */\ntype ValidationResult<T> =\n | { success: true; data: T }\n | { success: false; error: string };\n\n/**\n * Validate data against a Zod schema.\n * Returns a safe result that never throws.\n */\nexport function validate<T>(schema: ZodSchema<T>, data: unknown): ValidationResult<T> {\n try {\n const result = schema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return { success: false, error: formatZodError(result.error) };\n } catch (err) {\n return { success: false, error: String(err) };\n }\n}\n\n/**\n * Validate data and throw on failure.\n * Use this when you want to reject invalid input.\n */\nexport function validateOrThrow<T>(schema: ZodSchema<T>, data: unknown, context?: string): T {\n const result = validate(schema, data);\n if (!result.success) {\n const prefix = context ? `[${context}] ` : '';\n throw new Error(`${prefix}Validation failed: ${result.error}`);\n }\n return result.data;\n}\n\n/**\n * Validate with a fallback value.\n * Returns the validated data or a default on failure.\n */\nexport function validateOrDefault<T>(\n schema: ZodSchema<T>,\n data: unknown,\n defaultValue: T,\n): T {\n const result = validate(schema, data);\n return result.success ? result.data : defaultValue;\n}\n\n/**\n * Validate optional input.\n * Returns undefined for undefined/null input, validated data otherwise.\n */\nexport function validateOptional<T>(\n schema: ZodSchema<T>,\n data: unknown,\n): T | undefined {\n if (data === undefined || data === null) return undefined;\n const result = validate(schema, data);\n return result.success ? result.data : undefined;\n}\n\n/**\n * Format Zod error into a human-readable string.\n */\nfunction formatZodError(error: ZodError): string {\n return error.issues\n .map((e) => `${e.path.join('.')}: ${e.message}`)\n .join('; ');\n}\n\n/**\n * Create a logger for validation errors.\n * Helps track malformed messages for debugging.\n */\nexport function createValidationLogger(prefix: string) {\n const loggedErrors = new Set<string>();\n const maxErrors = 100;\n\n return {\n log(error: string): void {\n if (loggedErrors.size >= maxErrors) return;\n const key = `${prefix}:${error}`;\n if (!loggedErrors.has(key)) {\n loggedErrors.add(key);\n console.warn(\n JSON.stringify({\n level: 'warn',\n event: 'desktop.validation_error',\n prefix,\n message: error,\n timestamp: new Date().toISOString(),\n }),\n );\n }\n },\n reset(): void {\n loggedErrors.clear();\n },\n };\n}\n", "/**\n * Zod schemas for IPC message validation.\n * These schemas validate incoming data from the renderer to ensure type safety.\n */\nimport { z } from 'zod';\n\n// ============================================================================\n// Base Validators\n// ============================================================================\n\n/** Valid runtime ID pattern: alphanumeric, dots, underscores, hyphens, 3-120 chars */\nconst RUNTIME_ID_PATTERN = /^[a-zA-Z0-9._:-]{3,120}$/;\n\nexport const runtimeIdSchema = z.string().regex(RUNTIME_ID_PATTERN, 'Invalid runtime ID format');\n\nexport const pathSchema = z.string().min(1).max(10000);\n\nexport const booleanSchema = z.boolean();\n\nexport const numberSchema = z.number().int().finite();\n\n// ============================================================================\n// IPC Handler Input Schemas\n// ============================================================================\n\n/**\n * Schema for IPC.openProject handler.\n * Accepts optional project root path.\n */\nexport const openProjectSchema = z.object({\n requestedRoot: pathSchema.optional(),\n});\n\n/**\n * Schema for IPC.registerProject handler.\n * Accepts optional project root path.\n */\nexport const registerProjectSchema = z.object({\n requestedRoot: pathSchema.optional(),\n});\n\n/**\n * Schema for IPC.unregisterProject handler.\n * Requires a valid root path.\n */\nexport const unregisterProjectSchema = z.object({\n root: pathSchema,\n});\n\n/**\n * Schema for IPC.openProjectSession handler.\n * Accepts optional runtime ID.\n */\nexport const openProjectSessionSchema = z.object({\n runtimeId: runtimeIdSchema.optional(),\n});\n\n/**\n * Schema for IPC.activateRuntime handler.\n * Requires a valid runtime ID.\n */\nexport const activateRuntimeSchema = z.object({\n id: runtimeIdSchema,\n});\n\n/**\n * Schema for IPC.closeRuntime handler.\n * Requires a valid runtime ID.\n */\nexport const closeRuntimeSchema = z.object({\n id: runtimeIdSchema,\n});\n\n/**\n * Schema for IPC.sendMessage handler.\n * Requires runtime ID and message content.\n */\nexport const sendMessageSchema = z.object({\n id: runtimeIdSchema,\n content: z.string(),\n});\n\n/**\n * Schema for IPC.abortRuntime handler.\n * Requires runtime ID.\n */\nexport const abortRuntimeSchema = z.object({\n id: runtimeIdSchema,\n});\n\n/**\n * Schema for IPC.openRuntimeInBrowser handler.\n * Requires runtime ID.\n */\nexport const openRuntimeInBrowserSchema = z.object({\n id: runtimeIdSchema,\n});\n\n/**\n * Schema for IPC.revealRuntimeRoot handler.\n * Requires runtime ID.\n */\nexport const revealRuntimeRootSchema = z.object({\n id: runtimeIdSchema,\n});\n\n/**\n * Schema for IPC.setShellSidebarCollapsed handler.\n * Requires a boolean.\n */\nexport const setShellSidebarCollapsedSchema = z.object({\n collapsed: booleanSchema,\n});\n\n/**\n * Schema for IPC.navigateWebui handler.\n * Validates DesktopWebuiCommand structure.\n */\nexport const navigateWebuiSchema = z.object({\n command: z.unknown(),\n});\n\n/**\n * Schema for IPC.getConversation handler.\n * Requires runtime ID.\n */\nexport const getConversationSchema = z.object({\n runtimeId: runtimeIdSchema,\n});\n\n// ============================================================================\n// Renderer Event Schemas (from preload)\n// ============================================================================\n\n/**\n * Schema for webui:readyChanged event.\n * Requires a boolean ready state.\n */\nexport const webuiReadyChangedSchema = z.object({\n ready: booleanSchema,\n});\n\n/**\n * Schema for webui:prefsChanged event.\n * Validates WebUI preferences object.\n */\nexport const webuiPrefsChangedSchema = z.object({\n prefs: z.record(z.string(), z.unknown()),\n});\n\n/**\n * Schema for webui:commandAck event.\n * Requires requestId (string) and handled (boolean).\n */\nexport const webuiCommandAckSchema = z.object({\n requestId: z.string(),\n handled: z.boolean(),\n message: z.string().optional(),\n});\n\n/**\n * Schema for desktop:setLocale event.\n * Requires locale code string.\n */\nexport const setLocaleSchema = z.object({\n locale: z.string().min(2).max(10),\n});\n"],
5
- "mappings": "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",
6
- "names": ["path", "resolveWstackPaths", "app", "shell", "WebContentsView", "path", "resolve", "randomUUID", "EventEmitter", "fs", "path", "atomicWrite", "resolveWstackPaths", "wstackGlobalRoot", "path", "require", "EventEmitter", "resolveWstackPaths", "stat", "runtime", "atomicWrite", "resolve", "wstackGlobalRoot", "MIN_WINDOW_WIDTH", "MIN_WINDOW_HEIGHT", "shellView", "mainWindow", "entry", "resolve", "fs", "MIN_WINDOW_WIDTH", "MIN_WINDOW_HEIGHT", "fs", "Menu", "path", "Menu", "isRecord", "app", "resolveWstackPaths", "configureApplicationMenu", "shell", "openProject", "registerProject", "unregisterProject", "openProjectSession", "openSettings", "activateRuntime", "closeRuntime", "restoreLastWorkspace", "WebContentsView", "MIN_WINDOW_WIDTH", "MIN_WINDOW_HEIGHT"]
4
+ "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/ \u2192 Window layout and sizing\n * - menu/ \u2192 Application menu building\n * - ipc-handlers/ \u2192 IPC message handlers\n * - runtime/ \u2192 Project/runtime operations\n * - state/ \u2192 Types and constants\n */\nimport * as path from 'node:path';\nimport { installCrashShield, resolveWstackPaths } from '@wrongstack/core/utils';\nimport {\n app,\n BaseWindow,\n dialog,\n screen,\n shell,\n WebContentsView,\n type BaseWindowConstructorOptions,\n} from 'electron';\nimport { drainPendingOpenFilePath, firstOpenFileArg, initMacOS } from './macos-platform.js';\nimport type { DesktopWebuiPrefs } from '../shared/types.js';\nimport type {\n IpcHandlerContext,\n IRuntimeManager,\n} from './state/types.js';\nimport { DesktopAgentBridge } from './agent-bridge.js';\nimport {\n authorizeDesktopAction,\n desktopCompatibilityTrustBoundary,\n} from './desktop-privileged-actions.js';\nimport { IPC } from './ipc.js';\nimport { getMainLocale, setMainLocale, tMain } from './i18n-main.js';\nimport {\n desktopConfigPaths,\n readUiLocale,\n resolveActiveProfileConfigPath,\n writeUiLocale,\n} from './desktop-config-io.js';\nimport {\n DesktopRuntimeManager,\n preloadPath,\n rendererIndexPath,\n} from './runtime-manager.js';\nimport { watchProviderConfig } from '@wrongstack/core/storage';\nimport { DesktopWebuiController } from './webui/controller.js';\nimport { allowedExternalProtocol } from './webui/navigation.js';\nimport { loadDesktopAppIcon } from './app-icon.js';\nimport { DesktopWindowStateController } from './window-state-controller.js';\nimport {\n activateRuntime as activateRuntimeOperation,\n closeRuntime as closeRuntimeOperation,\n openProject as openProjectOperation,\n openProjectSession as openProjectSessionOperation,\n openSettings as openSettingsOperation,\n registerProject as registerProjectOperation,\n restoreLastWorkspace as restoreLastWorkspaceOperation,\n unregisterProject as unregisterProjectOperation,\n type RuntimeOperationsContext,\n} from './runtime/operations.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// IPC handler module\nimport { registerIpcHandlers as registerExtractedIpcHandlers } from './ipc-handlers/index.js';\n\n// Constants \u2014 centralized in state/constants.ts to avoid duplication\nimport {\n MIN_WINDOW_HEIGHT,\n MIN_WINDOW_WIDTH,\n} from './state/constants.js';\n\n// macOS initialisation \u2014 must run before app.whenReady to ensure\n// activation policy, open-file queuing, and Dock menu are registered\n// before the event loop starts.\ninitMacOS();\n\n// Windows-only: app user model id (used for taskbar grouping)\nif (process.platform === 'win32') {\n app.setAppUserModelId('com.wrongstack.desktop');\n}\napp.setPath(\n 'userData',\n path.join(\n resolveWstackPaths({ projectRoot: process.cwd() }).configDir,\n 'desktop',\n 'electron-profile',\n ),\n);\n\n// ============================================================================\n// Application State\n// ============================================================================\n\nconst desktopTrustBoundary = desktopCompatibilityTrustBoundary;\nconst manager = new DesktopRuntimeManager(desktopTrustBoundary);\nconst bridge = new DesktopAgentBridge();\n\nlet mainWindow: BaseWindow | null = null;\nlet shellView: WebContentsView | null = null;\nlet shellSidebarCollapsed = false;\nlet quittingAfterCleanup = false;\n\nconst webuiController = new DesktopWebuiController({\n manager,\n trustBoundary: desktopTrustBoundary,\n getMainWindow: () => mainWindow,\n getShellView: () => shellView,\n getLocale: getMainLocale,\n layoutViews: () => layoutWebuiViews(),\n onPrefsChanged: (previous, next) => {\n if (menuRelevantPrefsChanged(previous, next)) configureApplicationMenu();\n },\n});\n\nconst windowStateController = new DesktopWindowStateController({\n getWindow: () => mainWindow,\n getDisplays: () => screen.getAllDisplays(),\n save: (state) => manager.saveWindowState(state),\n});\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\nfunction safeOpenExternal(target: string): void {\n const protocol = allowedExternalProtocol(target);\n if (protocol) {\n void authorizeDesktopAction(desktopTrustBoundary, {\n capability: 'url.open-external',\n subject: { kind: 'url', id: target, attributes: { protocol } },\n risk: 'elevated',\n metadata: { operation: 'open-external' },\n }).then((authorization) => {\n if (authorization.allowed) return shell.openExternal(target);\n return undefined;\n });\n }\n}\n\n/** Open a directory in the platform file manager (Finder / Explorer). */\nfunction revealInExplorer(root: string): void {\n // On macOS, `shell.openPath(dir)` opens Finder at the directory.\n // On Windows, it opens Explorer. On Linux, it opens the default\n // file manager.\n //\n // The promise is intentionally not awaited \u2014 it's a fire-and-forget\n // UI operation. Errors are logged but not surfaced because the\n // operation is non-critical.\n void authorizeDesktopAction(desktopTrustBoundary, {\n capability: 'filesystem.open-native',\n subject: { kind: 'path', id: root, attributes: { target: 'file-manager' } },\n risk: 'elevated',\n cwd: root,\n metadata: { operation: 'reveal-in-explorer' },\n }).then((authorization) => {\n if (!authorization.allowed) return;\n return shell.openPath(root).catch((err) => {\n if (process.platform === 'darwin') {\n // macOS may fail if the path contains characters Finder can't\n // resolve (e.g., certain Unicode normalizations). Fall back to\n // the parent directory.\n void shell.openPath(path.dirname(root)).catch(() => undefined);\n }\n console.error(\n JSON.stringify({\n level: 'warn',\n event: 'desktop.reveal_in_explorer_failed',\n root,\n message: err instanceof Error ? err.message : String(err),\n timestamp: new Date().toISOString(),\n }),\n );\n });\n });\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\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 webuiController.views.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// State Broadcasting\n// ============================================================================\n\nfunction broadcastState(): void {\n if (!shellView || shellView.webContents.isDestroyed()) return;\n shellView.webContents.send(IPC.stateChanged, manager.snapshot());\n}\n\n// ============================================================================\n// Project/Runtime Operations\n// ============================================================================\n\nconst runtimeOperationsContext: RuntimeOperationsContext = {\n getRuntimeManager: () => manager as unknown as IRuntimeManager,\n getAgentBridge: () => bridge,\n broadcastState,\n syncActiveWebuiView: () => webuiController.syncActive(),\n dispatchWebuiCommand: (command) => webuiController.dispatch(command),\n chooseProjectRoot: async (kind) => {\n const result = await dialog.showOpenDialog({\n title: tMain(kind === 'open' ? 'openProject' : 'registerProject'),\n properties: ['openDirectory'],\n });\n return result.filePaths[0];\n },\n};\n\nconst openProject = (root?: string) => openProjectOperation(runtimeOperationsContext, root);\nconst registerProject = (root?: string) => registerProjectOperation(runtimeOperationsContext, root);\nconst unregisterProject = (root: string) =>\n unregisterProjectOperation(runtimeOperationsContext, root);\nconst openProjectSession = (id?: string) =>\n openProjectSessionOperation(runtimeOperationsContext, id);\nconst openSettings = () => openSettingsOperation(runtimeOperationsContext);\nconst activateRuntime = (id: string) => activateRuntimeOperation(runtimeOperationsContext, id);\nconst closeRuntime = (id: string) => closeRuntimeOperation(runtimeOperationsContext, id);\nconst restoreLastWorkspace = () => restoreLastWorkspaceOperation(runtimeOperationsContext);\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 webuiController.views.get(snapshot.activeRuntimeId)?.status.prefs;\n },\n getShellSidebarCollapsed: () => shellSidebarCollapsed,\n t: tMain,\n getRuntimeManager: () => manager,\n getWebuiViews: () => webuiController.views,\n dispatchWebuiCommand: (command) => webuiController.dispatch(command),\n reloadActiveWebuiView: () => webuiController.reload(),\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: () => webuiController.activeRuntimeId,\n setShellSidebarCollapsed: (collapsed) => { setShellSidebarCollapsed(collapsed); },\n restoreLastWorkspace: async () => { await restoreLastWorkspace(); },\n openExternal: (url) => { safeOpenExternal(url); },\n revealInExplorer: (root) => { revealInExplorer(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\n/**\n * Build the context object for the extracted IPC handler module.\n * Wires module-level state into the IpcHandlerContext interface.\n */\nfunction buildIpcHandlerContext(): IpcHandlerContext {\n return {\n getMainWindow: () => mainWindow,\n getShellView: () => shellView,\n getWebuiViews: () => webuiController.views,\n getWebuiStatus: () => webuiController.status,\n getRuntimeManager: () => manager as unknown as IRuntimeManager,\n getAgentBridge: () => bridge,\n getI18n: () => ({ getMainLocale, setMainLocale, tMain }),\n getConfigIo: () => ({ desktopConfigPaths, readUiLocale, writeUiLocale }),\n getShellSidebarCollapsed: () => shellSidebarCollapsed,\n setShellSidebarCollapsed: (collapsed) => setShellSidebarCollapsed(collapsed),\n broadcastState: () => broadcastState(),\n publishWebuiStatus: (next) => {\n const entry = next.runtimeId ? webuiController.views.get(next.runtimeId) : undefined;\n if (entry) webuiController.setEntryStatus(entry, next);\n },\n syncActiveWebuiView: () => webuiController.syncActive(),\n configureApplicationMenu: () => configureApplicationMenu(),\n broadcastLocaleToEmbeddedWebuis: (locale) => webuiController.broadcastLocale(locale),\n dispatchWebuiCommand: (command) => webuiController.dispatch(command),\n reloadActiveWebuiView: () => webuiController.reload(),\n openProject: (root) => openProject(root),\n registerProject: (root) => registerProject(root),\n unregisterProject: (root) => unregisterProject(root),\n openProjectSession: (id) => openProjectSession(id),\n activateRuntime: (id) => activateRuntime(id),\n closeRuntime: (id) => closeRuntime(id),\n openSettings: () => openSettings(),\n sendMessage: (id, wsUrl, content) => bridge.sendMessage(id, wsUrl, content),\n abortRuntime: (id, wsUrl) => bridge.abort(id, wsUrl),\n openExternal: (url) => safeOpenExternal(url),\n revealInExplorer: (root) => { revealInExplorer(root); },\n findWebuiEntryBySenderId: (senderId) => webuiController.findBySenderId(senderId),\n getPendingWebuiCommandAcks: () => webuiController.pendingAcks,\n settlePendingWebuiCommandAck: (requestId, handled) =>\n webuiController.settleAck(requestId, handled),\n setEntryWebuiStatus: (entry, next) => webuiController.setEntryStatus(entry, next),\n schedulePendingWebuiFlush: (entry) => webuiController.scheduleFlush(entry),\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 // OS-level renderer sandbox. contextIsolation and nodeIntegration:false\n // already bound what renderer JS can reach through the bridge; the\n // sandbox is what contains the renderer PROCESS if it is compromised\n // through the content it renders. This preload only imports electron's\n // contextBridge/ipcRenderer plus a constants map, so it runs unchanged\n // under the sandboxed preload subset (WS-093).\n sandbox: true,\n },\n });\n shellView.webContents.setWindowOpenHandler(({ url }) => {\n safeOpenExternal(url);\n return { action: 'deny' };\n });\n // The WebUI view has had this since it was written; the shell view had only\n // the window-open handler, so an in-page navigation (a link, a script\n // setting location) could move the shell itself off its local renderer\n // entry point instead of opening externally (WS-093).\n shellView.webContents.on('will-navigate', (event, url) => {\n if (url === shellUrl) return;\n event.preventDefault();\n safeOpenExternal(url);\n });\n\n // The shell preload can invoke desktop:* channels during renderer startup.\n registerExtractedIpcHandlers(buildIpcHandlerContext());\n\n await shellView.webContents.loadURL(shellUrl);\n\n const prevState = windowStateController.validated(manager.getWindowState());\n const defaultWidth = 1180;\n const defaultHeight = 720;\n\n const appIcon = await loadDesktopAppIcon();\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 ...(appIcon ? { icon: appIcon } : {}),\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', () => windowStateController.scheduleSave());\n mainWindow.on('moved', () => windowStateController.scheduleSave());\n mainWindow.on('maximize', () => windowStateController.scheduleSave());\n mainWindow.on('unmaximize', () => windowStateController.scheduleSave());\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 webuiController.syncActive();\n configureApplicationMenu();\n broadcastState();\n });\n\n // macOS open-file events \u2014 forward to IPC so the shell renderer can\n // decide whether to open the path as a project or register it.\n app.on('open-file', (_event, filePath) => {\n if (shellView && !shellView.webContents.isDestroyed()) {\n shellView.webContents.send(IPC.openFile, filePath);\n }\n });\n\n let lastWatchedLocale: string | undefined;\n const activeProfileConfigPath = await resolveActiveProfileConfigPath();\n watchProviderConfig(\n activeProfileConfigPath,\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 webuiController.broadcastLocale(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 webuiController.disposeAll();\n void windowStateController.save();\n quittingAfterCleanup = true;\n app.exit(0);\n });\n\n await restoreLastWorkspace();\n\n // macOS: handle file-open from argv (app launched by double-click) or\n // from a pre-ready open-file event (queued by Electron's event system).\n const argvOpenPath = firstOpenFileArg(process.argv);\n const queuedOpenPath = drainPendingOpenFilePath();\n const openPath = argvOpenPath ?? queuedOpenPath;\n if (openPath && shellView && !shellView.webContents.isDestroyed()) {\n shellView.webContents.send(IPC.openFile, openPath);\n }\n\n mainWindow.show();\n shellView.webContents.focus();\n}\n\n// ============================================================================\n// App Lifecycle\n// ============================================================================\n\n// Same last-resort shield as the CLI host: a background rejection in a watcher,\n// IPC handler, or the agent bridge must not take the desktop app down (WS-076).\ninstallCrashShield();\n\n// `boot` is async \u2014 an unhandled rejection here would leave the app running with\n// no window and no error shown, which reads to the user as a silent hang.\napp.whenReady().then(boot, (error: unknown) => {\n const detail = error instanceof Error ? (error.stack ?? error.message) : String(error);\n // Not localised on purpose: boot failed before the renderer could push a\n // locale over IPC, so tMain would resolve to the 'en' catalog regardless.\n dialog.showErrorBox('WrongStack failed to start', detail);\n app.exit(1);\n});\n\napp.on('window-all-closed', () => {\n // Standard macOS behavior: the app stays running when all windows\n // are closed (the user can open a new window from the Dock or menu).\n // On Windows and Linux, closing the last window quits the app.\n if (process.platform !== 'darwin') {\n app.quit();\n }\n});\n\napp.on('before-quit', () => {\n if (mainWindow) {\n mainWindow.removeAllListeners('close');\n void windowStateController.save();\n }\n bridge.closeAll();\n webuiController.disposeAll();\n // Terminate WebUI child processes so they don't become orphans after the\n // desktop app exits. closeAll() is async but before-quit is synchronous \u2014\n // we fire-and-forget and rely on OS process-group cleanup for stragglers.\n void manager.closeAll({ persistWorkspace: false });\n});\n\napp.on('activate', () => {\n if (!mainWindow) return;\n mainWindow.show();\n shellView?.webContents.focus();\n});\n", "/**\n * macOS platform initialization for WrongStack Desktop.\n *\n * Handles activation policy, Dock menu, file-open events, and other\n * macOS-specific Electron behaviors that are required for the app to\n * behave as a proper macOS citizen (dock icon, menu bar focus, etc.).\n *\n * This module is a no-op on non-macOS platforms.\n */\n\nimport { app, Menu } from 'electron';\n\n/**\n * Initialize macOS-specific app behavior. Safe to call on any platform;\n * no-ops when `process.platform !== 'darwin'`.\n */\nexport function initMacOS(): void {\n if (process.platform !== 'darwin') return;\n\n // ------------------------------------------------------------------\n // Activation Policy\n // ------------------------------------------------------------------\n // Set to 'regular' so the app appears in the Dock with an icon and\n // shows a standard menu bar. Without this, Electron apps launched\n // from the command line may start as 'accessory' (no Dock icon) and\n // the user sees a ghost window with no app to Cmd+Tab to.\n app.setActivationPolicy('regular');\n\n // ------------------------------------------------------------------\n // File-Open Handler\n // ------------------------------------------------------------------\n // macOS sends an `open-file` event when the user double-clicks a\n // file associated with the app or drops a folder on the Dock icon.\n // Register this early (before `app.whenReady`) so macOS queues the\n // event and delivers it after ready.\n //\n // We decrypt the path into a URI and forward it to the IPC layer;\n // the shell renderer decides whether to open it as a project.\n app.on('open-file', (_event, filePath) => {\n // open-file fires before `ready` on cold launch. Electron queues\n // it and re-emits after ready. We handle it once in the boot\n // sequence via `process.argv` for the initial open, and via the\n // event for subsequent opens while the app is running.\n if (app.isReady()) {\n handleFileOpen(filePath);\n }\n });\n\n // ------------------------------------------------------------------\n // Dock Menu\n // ------------------------------------------------------------------\n // Show a minimal Dock menu available even when no window is open.\n // Enables \"New Window\" from the Dock icon context menu.\n app.dock?.setMenu(\n Menu.buildFromTemplate([\n {\n label: 'New Window',\n click: () => {\n // The open-file handler will be invoked if the user picks a\n // folder; otherwise we rely on the renderer's \"no windows\n // \u2192 open recent\" logic.\n },\n },\n ]),\n );\n\n // ------------------------------------------------------------------\n // About Panel\n // ------------------------------------------------------------------\n // Populated from package.json; called by the standard macOS\n // \"WrongStack Desktop\" > \"About WrongStack Desktop\" menu item.\n app.setAboutPanelOptions({\n applicationName: 'WrongStack Desktop',\n applicationVersion: app.getVersion(),\n version: process.versions.electron ? `Electron ${process.versions.electron}` : '',\n });\n}\n\n/**\n * Forward a macOS file-open event to the renderer IPC channel.\n * Called both from the `open-file` event handler and from the boot\n * sequence's argv inspection.\n *\n * The renderer shell subscribes to `IPC.openFile` and decides whether\n * to treat `filePath` as a project directory to open or register.\n */\nfunction handleFileOpen(filePath: string): void {\n // Forwarding is done via a global IPC broadcast registered in boot().\n // The actual send happens after the shell WebContents is ready.\n // We cache the path here; the boot sequence drains the cache.\n pendingOpenFilePath = filePath;\n}\n\n/** Cached file path from a pre-ready open-file event. */\nlet pendingOpenFilePath: string | null = null;\n\n/**\n * Drain the pending open-file path and return it (consuming the cache).\n * Called by the boot sequence after the shell WebContents is ready.\n */\nexport function drainPendingOpenFilePath(): string | null {\n const path = pendingOpenFilePath;\n pendingOpenFilePath = null;\n return path;\n}\n\n/**\n * Check whether the user opened the app via a file/directory drag or\n * double-click. On macOS, the first argument after the app path is the\n * opened file/directory.\n */\nexport function firstOpenFileArg(argv: readonly string[]): string | null {\n if (process.platform !== 'darwin') return null;\n // argv on macOS: ['/path/to/Electron.app/Contents/MacOS/Electron', '/opened/folder']\n // In dev: ['/path/to/node', '/path/to/electron', '.', '/opened/folder']\n for (let index = 1; index < argv.length; index++) {\n const arg = argv[index];\n if (arg == null) continue;\n // Skip Electron's own flags and the app directory\n if (arg.startsWith('-')) continue;\n if (arg === '.' || arg === '--') continue;\n // The first non-flag, non-dot argument after the binary is likely\n // a file/folder path.\n return arg;\n }\n return null;\n}\n", "/**\n * Desktop Agent Bridge - WebSocket communication with runtimes.\n * Handles conversation management and WebSocket connections with automatic reconnection.\n */\nimport { randomUUID } from 'node:crypto';\nimport { EventEmitter } from 'node:events';\nimport {\n createSurfaceConnectionState,\n DEFAULT_SURFACE_CONNECTION_CONFIG,\n decodeProtocolFrame,\n markConnectionActivity,\n markConnectionConnecting,\n markConnectionOpen,\n planConnectionReconnect,\n resetConnection,\n type SurfaceConnectionState,\n stopConnection,\n} from '@wrongstack/webui-protocol';\nimport WebSocket from 'ws';\nimport type {\n DesktopConversationMessage,\n DesktopConversationSnapshot,\n DesktopConversationStatus,\n} from '../shared/types.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface ConversationInternal {\n runtimeId: string;\n status: DesktopConversationStatus;\n sessionId?: string | undefined;\n error?: string | undefined;\n messages: DesktopConversationMessage[];\n ws: WebSocket | null;\n connectPromise: Promise<void> | null;\n activeAssistantMessageId: string | null;\n /** Reconnection state */\n reconnectAttempt: number;\n reconnectTimer: ReturnType<typeof setTimeout> | null;\n reconnectUrl: string | null;\n connectionState: SurfaceConnectionState;\n // Per-reconnect message-handler bookkeeping. The anonymous\n // `ws.on('message', \u2026)` pattern pins the socket + its closure (which\n // captures `conversation`) for the socket's full lifetime \u2014 fine for\n // open sockets, fatal across reconnects, where each new connect() leaks\n // a stale message listener + closure onto the previous (now-orphaned)\n // WebSocket. RAM-leak audit 2026-08-11, HIGH.\n onMessage: ((data: WebSocket.RawData) => void) | null;\n socketGeneration: number;\n}\n\ninterface ServerMessage {\n type: string;\n payload?: Record<string, unknown> | undefined;\n}\n\n// ============================================================================\n// Configuration\n// ============================================================================\n\nconst MAX_MESSAGES = 300;\n\n/** Reconnection configuration */\nconst RECONNECT_CONFIG = {\n /** Maximum number of reconnection attempts (0 = disabled) */\n maxAttempts: 5,\n /** Initial delay in ms before first reconnection */\n initialDelayMs: 1000,\n /** Maximum delay in ms between reconnection attempts */\n maxDelayMs: 30000,\n /** Multiplier for exponential backoff */\n backoffMultiplier: 2,\n /** Jitter factor (0-1) to add randomness to delays */\n jitterFactor: 0.1,\n};\n\nconst DESKTOP_CONNECTION_CONFIG = {\n ...DEFAULT_SURFACE_CONNECTION_CONFIG,\n maxReconnectAttempts: RECONNECT_CONFIG.maxAttempts,\n initialBackoffMs: RECONNECT_CONFIG.initialDelayMs,\n maxBackoffMs: RECONNECT_CONFIG.maxDelayMs,\n backoffMultiplier: RECONNECT_CONFIG.backoffMultiplier,\n jitterRatio: RECONNECT_CONFIG.jitterFactor,\n};\n\n// ============================================================================\n// Bridge Implementation\n// ============================================================================\n\nexport class DesktopAgentBridge extends EventEmitter {\n private readonly conversations = new Map<string, ConversationInternal>();\n\n snapshot(runtimeId: string): DesktopConversationSnapshot {\n return publicConversation(this.getOrCreate(runtimeId));\n }\n\n /**\n * Get reconnection status for a runtime.\n */\n getReconnectStatus(runtimeId: string): { attempt: number; maxAttempts: number } | null {\n const conversation = this.conversations.get(runtimeId);\n if (!conversation) return null;\n return {\n attempt: conversation.reconnectAttempt,\n maxAttempts: RECONNECT_CONFIG.maxAttempts,\n };\n }\n\n /**\n * Force reconnection for a runtime (resets reconnection state).\n */\n forceReconnect(runtimeId: string, wsUrl: string): void {\n const conversation = this.getOrCreate(runtimeId);\n this.cancelReconnect(conversation);\n conversation.reconnectAttempt = 0;\n conversation.connectionState = resetConnection(conversation.connectionState);\n void this.ensureConnected(runtimeId, wsUrl);\n }\n\n async ensureConnected(runtimeId: string, wsUrl: string): Promise<DesktopConversationSnapshot> {\n const conversation = this.getOrCreate(runtimeId);\n\n // If already connected, return immediately\n if (conversation.ws?.readyState === WebSocket.OPEN) return publicConversation(conversation);\n\n // If currently connecting, wait for it\n if (conversation.connectPromise) {\n await conversation.connectPromise;\n return publicConversation(conversation);\n }\n\n // A user action cannot continue while only a delayed reconnect exists:\n // sendMessage() would otherwise write to a closed socket.\n if (conversation.reconnectTimer) {\n this.cancelReconnect(conversation);\n await this.connect(runtimeId, wsUrl);\n return publicConversation(conversation);\n }\n\n // Start fresh connection\n conversation.reconnectUrl = wsUrl;\n conversation.reconnectAttempt = 0;\n conversation.connectionState = resetConnection(conversation.connectionState);\n await this.connect(runtimeId, wsUrl);\n return publicConversation(conversation);\n }\n\n /**\n * Internal connect method that actually establishes the WebSocket.\n */\n private async connect(runtimeId: string, wsUrl: string): Promise<void> {\n const conversation = this.getOrCreate(runtimeId);\n\n // Cancel any pending reconnect timer\n this.cancelReconnect(conversation);\n\n conversation.status = 'connecting';\n conversation.connectionState = markConnectionConnecting(conversation.connectionState);\n conversation.error = undefined;\n this.emitChanged(conversation);\n this.emitReconnectEvent(conversation, 'connecting');\n\n // Store the in-flight connect promise so concurrent ensureConnected()\n // calls dedup through the conversation.connectPromise read at L129-130.\n // Without this, the dedup branch is dead and two parallel calls each\n // construct a fresh WebSocket \u2014 the loser's close-handler guard\n // (if (conversation.ws === ws)) means the superseded socket is never\n // closed, leaking one OPEN socket per race until close().\n const promise = new Promise<void>((resolve, reject) => {\n const ws = new WebSocket(wsUrl);\n conversation.ws = ws;\n\n // Bump the generation so a message handler from this socket knows it\n // is the current one. Each connect() call gets a unique generation,\n // so a stale socket that fires a late 'message' after its successor\n // has taken over sees a mismatch and bails before touching state.\n // RAM-leak audit 2026-08-11, HIGH.\n const myGeneration = ++conversation.socketGeneration;\n\n // Named (not anonymous) so we can detach it in close() and in the\n // 'close' handler. An anonymous ws.on('message', \u2026) was never removed,\n // so the closure pinned ConversationInternal (and its messages[],\n // ws, sessionId, \u2026) until the WebSocket was GC'd \u2014 across a reconnect\n // storm this leaked every ConversationInternal that ever connected.\n // RAM-leak audit 2026-08-11, HIGH.\n const onMessage = (data: unknown): void => {\n if (conversation.socketGeneration !== myGeneration) return;\n this.handleServerMessage(conversation, String(data));\n };\n conversation.onMessage = onMessage;\n ws.on('message', onMessage);\n\n // Set connection timeout\n const timeout = setTimeout(() => {\n if (conversation.ws === ws) {\n ws.close();\n reject(new Error('Connection timeout'));\n }\n }, 10000);\n\n ws.once('open', () => {\n clearTimeout(timeout);\n conversation.status = 'connected';\n conversation.error = undefined;\n conversation.connectPromise = null;\n conversation.reconnectAttempt = 0;\n conversation.connectionState = markConnectionOpen(conversation.connectionState);\n this.emitChanged(conversation);\n this.emitReconnectEvent(conversation, 'connected');\n resolve();\n });\n\n ws.once('error', (err) => {\n clearTimeout(timeout);\n conversation.status = 'error';\n conversation.error = err instanceof Error ? err.message : String(err);\n conversation.connectPromise = null;\n this.appendMessage(conversation, {\n role: 'system',\n text: `Connection error: ${conversation.error}`,\n });\n this.emitChanged(conversation);\n this.emitReconnectEvent(conversation, 'error');\n reject(err);\n });\n\n ws.once('close', () => {\n clearTimeout(timeout);\n // Only the socket that currently owns the conversation invalidates\n // the generation \u2014 a superseded socket closing must not clobber its\n // successor's generation, or late messages from the successor would\n // be wrongly dropped. RAM-leak audit 2026-08-11, HIGH (chimera review).\n if (conversation.ws === ws) {\n conversation.socketGeneration++;\n conversation.ws = null;\n }\n // Detach our named message handler so the closure (which retains\n // conversation) is releasable even if the ws is kept alive by the\n // runtime or pending GC. RAM-leak audit 2026-08-11, HIGH.\n ws.off('message', onMessage);\n // Only clear the tracked handler if it's still ours \u2014 a newer\n // connect() may have already installed its own. Clearing\n // unconditionally would orphan the new handler's reference,\n // making it impossible for close(runtimeId) to detach it later.\n // RAM-leak audit 2026-08-11, HIGH (chimera review Medium #1).\n if (conversation.onMessage === onMessage) {\n conversation.onMessage = null;\n }\n conversation.connectPromise = null;\n\n if (conversation.status !== 'error') {\n conversation.status = 'disconnected';\n }\n conversation.activeAssistantMessageId = null;\n this.emitChanged(conversation);\n\n // Schedule reconnection if applicable\n if (conversation.reconnectUrl && conversation.status === 'disconnected') {\n this.scheduleReconnect(conversation);\n }\n });\n });\n conversation.connectPromise = promise;\n return promise;\n }\n\n /**\n * Schedule a reconnection attempt with exponential backoff.\n */\n private scheduleReconnect(conversation: ConversationInternal): void {\n const reconnect = planConnectionReconnect(\n conversation.connectionState,\n DESKTOP_CONNECTION_CONFIG,\n );\n conversation.connectionState = reconnect.state;\n conversation.reconnectAttempt = reconnect.state.reconnectAttempt;\n if (!reconnect.plan) {\n this.emitReconnectEvent(conversation, 'exhausted');\n return;\n }\n this.emitReconnectEvent(conversation, 'scheduled', {\n delay: reconnect.plan.delayMs,\n attempt: reconnect.plan.attempt,\n });\n\n conversation.reconnectTimer = setTimeout(() => {\n conversation.reconnectTimer = null;\n if (!conversation.reconnectUrl) return;\n\n // Check if still disconnected\n if (conversation.ws?.readyState !== WebSocket.OPEN) {\n void this.connect(conversation.runtimeId, conversation.reconnectUrl);\n }\n }, reconnect.plan.delayMs);\n }\n\n /**\n * Cancel pending reconnection.\n */\n private cancelReconnect(conversation: ConversationInternal): void {\n if (conversation.reconnectTimer) {\n clearTimeout(conversation.reconnectTimer);\n conversation.reconnectTimer = null;\n }\n }\n\n /**\n * Emit reconnection event for UI feedback.\n */\n private emitReconnectEvent(\n conversation: ConversationInternal,\n status: 'connecting' | 'connected' | 'error' | 'scheduled' | 'exhausted',\n data?: { delay?: number; attempt?: number },\n ): void {\n this.emit('reconnect', {\n runtimeId: conversation.runtimeId,\n status,\n attempt: conversation.reconnectAttempt,\n maxAttempts: RECONNECT_CONFIG.maxAttempts,\n ...data,\n });\n }\n\n async sendMessage(\n runtimeId: string,\n wsUrl: string,\n content: string,\n ): Promise<DesktopConversationSnapshot> {\n const trimmed = content.trim();\n if (!trimmed) return this.snapshot(runtimeId);\n\n // Reset reconnection state on manual action\n const conversation = this.getOrCreate(runtimeId);\n conversation.reconnectAttempt = 0;\n conversation.connectionState = resetConnection(conversation.connectionState);\n\n await this.ensureConnected(runtimeId, wsUrl);\n\n // Refresh conversation after connect\n const conv = this.getOrCreate(runtimeId);\n this.appendMessage(conv, {\n id: `user_${randomUUID()}`,\n role: 'user',\n text: trimmed,\n });\n conv.status = 'running';\n conv.activeAssistantMessageId = null;\n this.emitChanged(conv);\n this.send(conv, {\n type: 'user_message',\n payload: {\n id: `msg_${Date.now()}_${randomUUID().slice(0, 8)}`,\n content: trimmed,\n timestamp: Date.now(),\n ...(conv.sessionId ? { sessionId: conv.sessionId } : {}),\n },\n });\n return publicConversation(conv);\n }\n\n async abort(runtimeId: string, wsUrl: string): Promise<DesktopConversationSnapshot> {\n // Reset reconnection state on manual action\n const conversation = this.getOrCreate(runtimeId);\n conversation.reconnectAttempt = 0;\n conversation.connectionState = resetConnection(conversation.connectionState);\n\n await this.ensureConnected(runtimeId, wsUrl);\n const conv = this.getOrCreate(runtimeId);\n this.send(conv, {\n type: 'abort',\n payload: conv.sessionId ? { sessionId: conv.sessionId } : {},\n });\n conv.status = 'connected';\n this.appendMessage(conv, { role: 'system', text: 'Abort requested.' });\n return publicConversation(conv);\n }\n\n close(runtimeId: string): void {\n const conversation = this.conversations.get(runtimeId);\n if (!conversation) return;\n\n // Cancel reconnection and clear state\n this.cancelReconnect(conversation);\n conversation.reconnectAttempt = 0;\n conversation.reconnectUrl = null;\n conversation.connectionState = stopConnection(conversation.connectionState);\n\n // Detach the per-reconnect message listener BEFORE nulling the ws ref.\n // Without this, the ws.on('message', \u2026) closure pins ConversationInternal\n // (and its messages[]) until the socket is GC'd. RAM-leak audit 2026-08-11, HIGH.\n if (conversation.onMessage) {\n conversation.ws?.off('message', conversation.onMessage);\n conversation.onMessage = null;\n }\n // Invalidate this conversation's generation so any in-flight socket whose\n // 'close' event fires after deletion cannot resurrect the conversation ref.\n conversation.socketGeneration++;\n conversation.ws?.close();\n conversation.ws = null;\n conversation.connectPromise = null;\n conversation.status = 'disconnected';\n conversation.activeAssistantMessageId = null;\n this.emitChanged(conversation);\n\n // Remove from the map so closed conversations don't accumulate in memory.\n this.conversations.delete(runtimeId);\n }\n\n closeAll(): void {\n // Snapshot keys first \u2014 close() deletes from the map during iteration.\n for (const runtimeId of [...this.conversations.keys()]) {\n this.close(runtimeId);\n }\n }\n\n private handleServerMessage(conversation: ConversationInternal, raw: string): void {\n const decoded = decodeProtocolFrame(raw, 'server');\n if (!decoded.ok) return;\n conversation.connectionState = markConnectionActivity(conversation.connectionState);\n const message = decoded.message as ServerMessage;\n const payload = message.payload ?? {};\n switch (message.type) {\n case 'session.start': {\n const sessionId = stringValue(payload['sessionId']);\n if (sessionId) conversation.sessionId = sessionId;\n conversation.status = conversation.status === 'running' ? 'running' : 'connected';\n this.emitChanged(conversation);\n break;\n }\n case 'provider.text_delta': {\n conversation.status = 'running';\n this.appendAssistantDelta(conversation, stringValue(payload['text']) ?? '');\n break;\n }\n case 'tool.started': {\n conversation.status = 'running';\n const name = stringValue(payload['name']) ?? 'tool';\n this.appendMessage(conversation, { role: 'tool', text: `Started ${name}` });\n break;\n }\n case 'tool.executed': {\n const name = stringValue(payload['name']) ?? 'tool';\n const ok = payload['ok'] === true;\n this.appendMessage(conversation, {\n role: 'tool',\n text: `${name} ${ok ? 'completed' : 'failed'}`,\n });\n break;\n }\n case 'provider.error':\n case 'provider.stream_error':\n case 'error': {\n const text =\n stringValue(payload['message']) ??\n stringValue(payload['description']) ??\n `${message.type} received`;\n conversation.status = 'error';\n conversation.error = text;\n this.appendMessage(conversation, { role: 'system', text });\n break;\n }\n case 'run.result': {\n const finalText = stringValue(payload['finalText']);\n if (finalText && !this.lastAssistantHasText(conversation)) {\n this.appendMessage(conversation, { role: 'assistant', text: finalText });\n }\n conversation.status = payload['status'] === 'failed' ? 'error' : 'connected';\n conversation.activeAssistantMessageId = null;\n this.emitChanged(conversation);\n break;\n }\n }\n }\n\n private send(conversation: ConversationInternal, message: Record<string, unknown>): void {\n if (conversation.ws?.readyState !== WebSocket.OPEN) {\n throw new Error('Runtime socket is not connected');\n }\n conversation.ws.send(JSON.stringify(message));\n }\n\n private appendAssistantDelta(conversation: ConversationInternal, text: string): void {\n if (!text) return;\n let message = conversation.messages.find((m) => m.id === conversation.activeAssistantMessageId);\n if (!message) {\n message = {\n id: `assistant_${randomUUID()}`,\n role: 'assistant',\n text: '',\n timestamp: Date.now(),\n };\n conversation.activeAssistantMessageId = message.id;\n conversation.messages.push(message);\n }\n message.text += text;\n this.trimMessages(conversation);\n this.emitChanged(conversation);\n }\n\n private appendMessage(\n conversation: ConversationInternal,\n input: Partial<DesktopConversationMessage> & Pick<DesktopConversationMessage, 'role' | 'text'>,\n ): void {\n conversation.messages.push({\n id: input.id ?? `${input.role}_${randomUUID()}`,\n role: input.role,\n text: input.text,\n timestamp: input.timestamp ?? Date.now(),\n });\n this.trimMessages(conversation);\n this.emitChanged(conversation);\n }\n\n private lastAssistantHasText(conversation: ConversationInternal): boolean {\n const lastAssistant = [...conversation.messages].reverse().find((m) => m.role === 'assistant');\n return Boolean(lastAssistant?.text.trim());\n }\n\n private trimMessages(conversation: ConversationInternal): void {\n if (conversation.messages.length <= MAX_MESSAGES) return;\n conversation.messages.splice(0, conversation.messages.length - MAX_MESSAGES);\n }\n\n private getOrCreate(runtimeId: string): ConversationInternal {\n let conversation = this.conversations.get(runtimeId);\n if (conversation) return conversation;\n conversation = {\n runtimeId,\n status: 'disconnected',\n messages: [],\n ws: null,\n connectPromise: null,\n activeAssistantMessageId: null,\n reconnectAttempt: 0,\n reconnectTimer: null,\n reconnectUrl: null,\n connectionState: createSurfaceConnectionState(),\n onMessage: null,\n socketGeneration: 0,\n };\n this.conversations.set(runtimeId, conversation);\n return conversation;\n }\n\n private emitChanged(conversation: ConversationInternal): void {\n this.emit('changed', publicConversation(conversation));\n }\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction publicConversation(conversation: ConversationInternal): DesktopConversationSnapshot {\n return {\n runtimeId: conversation.runtimeId,\n status: conversation.status,\n sessionId: conversation.sessionId,\n error: conversation.error,\n messages: conversation.messages.map((message) => ({ ...message })),\n };\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\n// ============================================================================\n// Reconnect Event Type (for external consumers)\n// ============================================================================\n\nexport interface DesktopBridgeReconnectEvent {\n runtimeId: string;\n status: 'connecting' | 'connected' | 'error' | 'scheduled' | 'exhausted';\n attempt: number;\n maxAttempts: number;\n delay?: number;\n}\n", "import { randomUUID } from 'node:crypto';\nimport type { Logger } from '@wrongstack/core/types';\nimport {\n createCompatibilityTrustBoundary,\n isTrustDecisionAllowed,\n type TrustBoundary,\n type TrustRisk,\n type TrustSubject,\n} from '@wrongstack/core/security';\n\nexport const desktopCompatibilityTrustBoundary = createCompatibilityTrustBoundary({\n policyId: 'desktop-trusted-host-compat-v1',\n});\n\nexport async function authorizeDesktopAction(\n boundary: TrustBoundary,\n action: {\n capability: string;\n subject: TrustSubject;\n risk: TrustRisk;\n cwd?: string | undefined;\n metadata?: Readonly<Record<string, string | number | boolean | null>> | undefined;\n },\n logger?: Logger,\n): Promise<{ allowed: boolean; reason: string }> {\n const request = {\n version: 1 as const,\n requestId: randomUUID(),\n actor: { kind: 'user' as const, id: 'desktop-user' },\n surface: 'desktop' as const,\n capability: action.capability,\n subject: action.subject,\n risk: action.risk,\n scope: action.cwd ? { cwd: action.cwd } : {},\n authContext: { method: 'local-process' as const, principalId: 'desktop-user' },\n ...(action.metadata ? { metadata: action.metadata } : {}),\n };\n const decision = await boundary.evaluate(request);\n const auditEntry = {\n event: 'desktop.trust_boundary.decision',\n requestId: request.requestId,\n capability: request.capability,\n decision: decision.kind,\n policyId: decision.policyId,\n };\n if (logger) {\n logger.info('Trust boundary decision', auditEntry);\n } else {\n console.warn(JSON.stringify({ level: 'info', ...auditEntry, timestamp: new Date().toISOString() }));\n }\n return { allowed: isTrustDecisionAllowed(decision), reason: decision.reason };\n}\n\nexport function authorizeDesktopRuntimeStart(\n boundary: TrustBoundary,\n cwd: string,\n runtimeKind: string,\n): Promise<{ allowed: boolean; reason: string }> {\n return authorizeDesktopAction(boundary, {\n capability: 'process.spawn',\n subject: {\n kind: 'command',\n id: 'wrongstack-webui-runtime',\n attributes: { runtimeKind },\n },\n risk: 'high',\n cwd,\n metadata: { operation: 'open-project' },\n });\n}\n\nexport function authorizeDesktopRuntimeStop(\n boundary: TrustBoundary,\n runtime: { id: string; pid?: number | undefined; root: string },\n): Promise<{ allowed: boolean; reason: string }> {\n return authorizeDesktopAction(boundary, {\n capability: 'process.terminate',\n subject: {\n kind: 'process',\n id: runtime.id,\n attributes: {\n ...(runtime.pid !== undefined ? { pid: runtime.pid } : {}),\n runtimeId: runtime.id,\n },\n },\n risk: 'high',\n cwd: runtime.root,\n metadata: { operation: 'close-runtime' },\n });\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 \u2014 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 \u2192 WS prefs.updated round-trip.\n webuiLocaleChanged: 'desktop:webui-locale-changed',\n // macOS open-file event forwarded from main process to shell renderer.\n // The shell uses this to decide whether to open a dragged/double-clicked\n // path as a project directory.\n openFile: 'desktop:open-file',\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\u2026',\n registerProjectEllipsis: 'Register Project\u2026',\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\u00E7\u0131k proje oturumu yok',\n revealProjectFolder: 'Proje klas\u00F6r\u00FCn\u00FC g\u00F6ster',\n quickView: 'H\u0131zl\u0131 g\u00F6r\u00FCn\u00FCm',\n chat: 'Sohbet',\n terminal: 'Terminal',\n session: 'Oturum',\n newSession: 'Yeni Oturum',\n file: 'Dosya',\n view: 'G\u00F6r\u00FCn\u00FCm',\n workspace: '\u00C7al\u0131\u015Fma alan\u0131',\n projects: 'Projeler',\n openProject: 'Proje A\u00E7',\n registerProject: 'Proje Kaydet',\n openProjectEllipsis: 'Proje A\u00E7\u2026',\n registerProjectEllipsis: 'Proje Kaydet\u2026',\n removeActiveFromRegistry: 'Aktif Projeyi Kay\u0131ttan Kald\u0131r',\n newSessionForActive: 'Aktif Proje i\u00E7in Yeni Oturum',\n settings: 'Ayarlar',\n closeActiveRuntime: 'Aktif \u00C7al\u0131\u015Fma Zaman\u0131n\u0131 Kapat',\n openChat: 'Sohbeti A\u00E7',\n focusPrompt: '\u0130steme Odaklan',\n toggleTerminal: 'Terminali A\u00E7/Kapat',\n newTerminal: 'Yeni Terminal',\n files: 'Dosyalar',\n changes: 'De\u011Fi\u015Fiklikler',\n sessions: 'Oturumlar',\n fleetHQ: 'Filo HQ',\n commandPalette: 'Komut Paleti',\n modelSwitcher: 'Model De\u011Fi\u015Ftirici',\n quickModelSwitcher: 'H\u0131zl\u0131 Model De\u011Fi\u015Ftirici',\n openInBrowser: 'Taray\u0131c\u0131da A\u00E7',\n reloadWebui: 'WebUI Yeniden Y\u00FCkle',\n reloadActiveWebui: 'Aktif WebUI Yeniden Y\u00FCkle',\n closeSession: 'Oturumu Kapat',\n yoloMode: 'YOLO Modu',\n nextPrediction: 'Sonraki Tahmin',\n contextAutoCompact: 'Ba\u011Flam\u0131 Otomatik S\u0131k\u0131\u015Ft\u0131r',\n compactDesktopSidebar: 'Masa\u00FCst\u00FC Kenar \u00C7ubu\u011Funu 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 \u00F6ffnen',\n registerProject: 'Projekt registrieren',\n openProjectEllipsis: 'Projekt \u00F6ffnen\u2026',\n registerProjectEllipsis: 'Projekt registrieren\u2026',\n removeActiveFromRegistry: 'Aktives Projekt aus Registry entfernen',\n newSessionForActive: 'Neue Sitzung f\u00FCr aktives Projekt',\n settings: 'Einstellungen',\n closeActiveRuntime: 'Aktive Runtime schlie\u00DFen',\n openChat: 'Chat \u00F6ffnen',\n focusPrompt: 'Prompt fokussieren',\n toggleTerminal: 'Terminal umschalten',\n newTerminal: 'Neues Terminal',\n files: 'Dateien',\n changes: '\u00C4nderungen',\n sessions: 'Sitzungen',\n fleetHQ: 'Fleet HQ',\n commandPalette: 'Command Palette',\n modelSwitcher: 'Modell-Umschalter',\n quickModelSwitcher: 'Schneller Modell-Umschalter',\n openInBrowser: 'Im Browser \u00F6ffnen',\n reloadWebui: 'WebUI neu laden',\n reloadActiveWebui: 'Aktive WebUI neu laden',\n closeSession: 'Sitzung schlie\u00DFen',\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\u00E9v\u00E9ler 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\u2026',\n registerProjectEllipsis: 'Enregistrer le projet\u2026',\n removeActiveFromRegistry: \"Retirer le projet actif du registre\",\n newSessionForActive: 'Nouvelle session pour le projet actif',\n settings: 'Param\u00E8tres',\n closeActiveRuntime: \"Fermer l'ex\u00E9cution 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\u00E9lecteur de mod\u00E8le',\n quickModelSwitcher: 'S\u00E9lecteur de mod\u00E8le 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\u00E9diction du prochain pas',\n contextAutoCompact: 'Compacter le contexte auto',\n compactDesktopSidebar: 'R\u00E9duire la barre lat\u00E9rale',\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\u2026',\n registerProjectEllipsis: 'Registra progetto\u2026',\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\u00E0 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\u00E1pida',\n chat: 'Chat',\n terminal: 'Terminal',\n session: 'Sesi\u00F3n',\n newSession: 'Nueva sesi\u00F3n',\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\u2026',\n registerProjectEllipsis: 'Registrar proyecto\u2026',\n removeActiveFromRegistry: 'Quitar proyecto activo del registro',\n newSessionForActive: 'Nueva sesi\u00F3n para el proyecto activo',\n settings: 'Ajustes',\n closeActiveRuntime: 'Cerrar runtime activo',\n openChat: 'Abrir chat',\n focusPrompt: 'Focalizar indicaci\u00F3n',\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\u00E1pido',\n openInBrowser: 'Abrir en el navegador',\n reloadWebui: 'Recargar WebUI',\n reloadActiveWebui: 'Recargar WebUI activo',\n closeSession: 'Cerrar sesi\u00F3n',\n yoloMode: 'Modo YOLO',\n nextPrediction: 'Predicci\u00F3n 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\u00F5es de projeto abertas',\n revealProjectFolder: 'Revelar pasta do projeto',\n quickView: 'Vista r\u00E1pida',\n chat: 'Chat',\n terminal: 'Terminal',\n session: 'Sess\u00E3o',\n newSession: 'Nova sess\u00E3o',\n file: 'Arquivo',\n view: 'Ver',\n workspace: 'Workspace',\n projects: 'Projetos',\n openProject: 'Abrir projeto',\n registerProject: 'Registrar projeto',\n openProjectEllipsis: 'Abrir projeto\u2026',\n registerProjectEllipsis: 'Registrar projeto\u2026',\n removeActiveFromRegistry: 'Remover projeto ativo do registro',\n newSessionForActive: 'Nova sess\u00E3o para o projeto ativo',\n settings: 'Configura\u00E7\u00F5es',\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\u00E7\u00F5es',\n sessions: 'Sess\u00F5es',\n fleetHQ: 'Fleet HQ',\n commandPalette: 'Paleta de comandos',\n modelSwitcher: 'Seletor de modelo',\n quickModelSwitcher: 'Seletor de modelo r\u00E1pido',\n openInBrowser: 'Abrir no navegador',\n reloadWebui: 'Recarregar WebUI',\n reloadActiveWebui: 'Recarregar WebUI ativo',\n closeSession: 'Fechar sess\u00E3o',\n yoloMode: 'Modo YOLO',\n nextPrediction: 'Previs\u00E3o do pr\u00F3ximo 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 resolves the active profile from the root\n * bootstrap and reads/writes that profile's `config.json` \u2014\n * using the SAME read \u2192 decrypt \u2192 mutate \u2192 encrypt \u2192 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';\nimport { decryptConfigSecrets, DefaultSecretVault, encryptConfigSecrets } from '@wrongstack/core/security';\nimport type { SecretVault } from '@wrongstack/core/types';\nimport { atomicWrite, wstackGlobalRoot } from '@wrongstack/core/utils';\n\nconst globalRoot = wstackGlobalRoot();\nconst bootstrapConfigPath = path.join(globalRoot, 'config.json');\nconst defaultProfileConfigPath = path.join(globalRoot, 'profiles', 'default', 'config.json');\nconst vault: SecretVault = new DefaultSecretVault({\n keyFile: path.join(globalRoot, '.key'),\n});\n\nfunction safeProfileName(value: unknown): string {\n if (typeof value !== 'string' || !value.trim()) return 'default';\n return value.replace(/[/\\\\:]/g, '_').replace(/\\.\\./g, '_') || 'default';\n}\n\n/** Resolve the current profile from the thin root bootstrap. */\nexport async function resolveActiveProfileConfigPath(): Promise<string> {\n try {\n const raw = await fs.readFile(bootstrapConfigPath, 'utf8');\n const parsed = JSON.parse(raw) as { activeProfile?: unknown };\n return path.join(globalRoot, 'profiles', safeProfileName(parsed.activeProfile), 'config.json');\n } catch {\n return defaultProfileConfigPath;\n }\n}\n\n/** Read the persisted display language, or undefined when unset/unreadable. */\nexport async function readUiLocale(): Promise<string | undefined> {\n const profileConfigPath = await resolveActiveProfileConfigPath();\n let raw: string;\n try {\n raw = await fs.readFile(profileConfigPath, 'utf8');\n } catch {\n return undefined;\n }\n try {\n const decrypted = decryptConfigSecrets(JSON.parse(raw) as Record<string, unknown>, vault) as {\n uiLocale?: string;\n };\n const value = decrypted.uiLocale;\n return typeof value === 'string' && value ? value : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** Stable paths + vault exposed for the desktop boot watcher and tests. */\nexport const desktopConfigPaths = {\n bootstrapConfigPath,\n profileConfigPath: defaultProfileConfigPath,\n vault,\n} 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 const profileConfigPath = await resolveActiveProfileConfigPath();\n let raw: string;\n try {\n raw = await fs.readFile(profileConfigPath, '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 \u2014 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 fs.mkdir(path.dirname(profileConfigPath), { recursive: true });\n await atomicWrite(profileConfigPath, 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 * as net from 'node:net';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport {\n atomicWrite,\n buildChildEnv,\n projectSlug,\n resolveWstackPaths,\n toErrorMessage,\n wstackGlobalRoot,\n} from '@wrongstack/core/utils';\nimport type { TrustBoundary } from '@wrongstack/core/security';\nimport {\n authorizeDesktopRuntimeStart,\n authorizeDesktopRuntimeStop,\n desktopCompatibilityTrustBoundary,\n} from './desktop-privileged-actions.js';\nimport { resolveWebUiDistDir, resolveWebUiEntry } from './runtime-manager-paths.js';\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(\n resolveWstackPaths({ projectRoot: process.cwd() }).configDir,\n 'desktop.json',\n );\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 constructor(private readonly trustBoundary: TrustBoundary = desktopCompatibilityTrustBoundary) {\n super();\n }\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 const authorization = await authorizeDesktopRuntimeStart(this.trustBoundary, resolved, kind);\n if (!authorization.allowed) {\n throw new Error(`Desktop runtime start denied: ${authorization.reason}`);\n }\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 distDir = resolveWebUiDistDir();\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 '--dist-dir',\n distDir,\n '--require-token',\n ],\n {\n cwd: resolved,\n env: {\n ...buildChildEnv(),\n ELECTRON_RUN_AS_NODE: '1',\n WEBUI_STRICT_PORT: '1',\n WRONGSTACK_DESKTOP: '1',\n // Passed by environment, not argv. A process command line is\n // world-readable on every platform this ships to \u2014 `ps -ef` on\n // POSIX, Task Manager's command-line column or a plain WMI query on\n // Windows \u2014 so `--token <secret>` handed the WebUI access token to\n // any local process that cared to look. The token grants full agent\n // control, so that is a credential disclosure, not a nuisance.\n // entry.ts already reads WEBUI_TOKEN; argv only took precedence\n // over it (WS-087).\n WEBUI_TOKEN: token,\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('error', (err) => {\n runtime.status = 'error';\n runtime.error = toErrorMessage(err);\n runtime.child = null;\n if (this.activeRuntimeId === runtime.id) {\n this.activeRuntimeId = firstRunningRuntimeId(this.runtimes);\n }\n this.emitChanged();\n });\n child.once('exit', (code, signal) => {\n if (runtime.status === 'error') return;\n runtime.status = 'stopped';\n runtime.error =\n code === 0 ? undefined : `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 if (runtime.status !== 'starting') {\n // The child exited or hit a spawn error while we were waiting.\n throw new Error(runtime.error ?? 'WebUI process exited during startup');\n }\n runtime.status = 'running';\n await this.persistWorkspaceState();\n this.emitChanged();\n return publicRuntime(runtime);\n } catch (err) {\n if (runtime.status !== 'stopped' && runtime.status !== 'error') {\n runtime.status = 'error';\n }\n if (runtime.error === undefined) {\n runtime.error = toErrorMessage(err);\n }\n await terminateProcessTree(runtime.child);\n runtime.child = null;\n if (this.activeRuntimeId === runtime.id) {\n this.activeRuntimeId = firstRunningRuntimeId(this.runtimes);\n }\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 const runtime = this.runtimes.get(id);\n if (runtime) {\n const authorization = await authorizeDesktopRuntimeStop(this.trustBoundary, runtime);\n if (!authorization.allowed) {\n throw new Error(`Desktop runtime stop denied: ${authorization.reason}`);\n }\n }\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 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: normalizeProjectEntries(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 = 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\nfunction hasChildExited(child: ChildProcess): boolean {\n return child.exitCode !== null || child.signalCode !== null;\n}\n\n/** Wait for actual process exit; ChildProcess.killed only means a signal was sent. */\nexport function waitForChildExit(child: ChildProcess, timeoutMs: number): Promise<boolean> {\n if (hasChildExited(child)) return Promise.resolve(true);\n\n return new Promise<boolean>((resolve) => {\n let settled = false;\n const finish = (exited: boolean): void => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n child.off('exit', onExit);\n resolve(exited);\n };\n const onExit = (): void => finish(true);\n const timer = setTimeout(() => finish(hasChildExited(child)), timeoutMs);\n timer.unref?.();\n child.once('exit', onExit);\n\n // Close the race between the initial state check and listener registration.\n if (hasChildExited(child)) finish(true);\n });\n}\n\nasync function terminateProcessTree(child: ChildProcess | null): Promise<void> {\n if (!child?.pid || hasChildExited(child)) return;\n if (process.platform !== 'win32') {\n // macOS / Linux: send SIGTERM first, then SIGKILL after a grace\n // period. Electron child processes spawned with ELECTRON_RUN_AS_NODE\n // may ignore the initial signal during busy I/O.\n const pid = child.pid;\n const exited = waitForChildExit(child, 5000);\n child.kill('SIGTERM');\n if (await exited) return;\n\n // Grace period expired \u2014 force kill the process tree. Do not use\n // child.killed here: it becomes true as soon as SIGTERM is sent.\n if (!hasChildExited(child)) {\n try {\n process.kill(-pid, 'SIGKILL');\n } catch {\n child.kill('SIGKILL');\n }\n await waitForChildExit(child, 1000);\n }\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(\n runtime: RuntimeInternal,\n stream: 'stdout' | 'stderr',\n text: string,\n): 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' && samePath(runtime.root, root) && 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 let probeTimer: ReturnType<typeof setTimeout> | undefined;\n\n const cleanup = (): void => {\n if (probeTimer) {\n clearTimeout(probeTimer);\n probeTimer = undefined;\n }\n };\n\n const probe = (): void => {\n let done = false;\n\n const triggerRetry = (): void => {\n if (done) return;\n done = true;\n if (Date.now() >= deadline) {\n reject(new Error(`WebUI did not become ready at ${baseUrl}`));\n return;\n }\n probeTimer = setTimeout(probe, 250);\n };\n\n const req = http.get(url, (res) => {\n res.resume();\n if (res.statusCode && res.statusCode >= 200 && res.statusCode < 500) {\n if (!done) {\n done = true;\n cleanup();\n resolve();\n }\n return;\n }\n triggerRetry();\n });\n\n req.once('error', () => {\n triggerRetry();\n });\n\n req.setTimeout(1000, () => {\n req.destroy();\n triggerRetry();\n });\n };\n\n probe();\n });\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 return normalizeProjectManifest(JSON.parse(raw) as unknown);\n } catch {\n return [];\n }\n}\n\nexport function normalizeProjectManifest(value: unknown): DesktopProjectEntry[] {\n if (Array.isArray(value)) return normalizeProjectEntries(value).slice(0, 80);\n if (!value || typeof value !== 'object') return [];\n const manifest = value as { projects?: unknown; recentProjects?: unknown; recents?: unknown };\n const source = Array.isArray(manifest.projects)\n ? manifest.projects\n : Array.isArray(manifest.recentProjects)\n ? manifest.recentProjects\n : Array.isArray(manifest.recents)\n ? manifest.recents\n : [];\n return normalizeProjectEntries(source).slice(0, 80);\n}\n\nfunction normalizeProjectEntries(value: unknown): DesktopProjectEntry[] {\n if (!Array.isArray(value)) return [];\n const seen = new Set<string>();\n const projects: DesktopProjectEntry[] = [];\n for (const item of value) {\n const project = normalizeProjectEntry(item);\n if (!project) continue;\n const key = pathKey(project.root);\n if (seen.has(key)) continue;\n seen.add(key);\n projects.push(project);\n }\n return projects.sort((a, b) =>\n (b.lastSeen ?? b.createdAt ?? '').localeCompare(a.lastSeen ?? a.createdAt ?? ''),\n );\n}\n\nfunction normalizeProjectEntry(value: unknown): DesktopProjectEntry | null {\n if (!value || typeof value !== 'object') return null;\n const candidate = value as Partial<DesktopProjectEntry>;\n if (typeof candidate.root !== 'string' || !candidate.root.trim()) return null;\n const root = path.resolve(candidate.root);\n const name =\n typeof candidate.name === 'string' && candidate.name.trim()\n ? candidate.name.trim()\n : path.basename(root) || root;\n const entry: DesktopProjectEntry = {\n name,\n root,\n slug:\n typeof candidate.slug === 'string' && candidate.slug.trim()\n ? candidate.slug.trim()\n : projectSlug(root),\n };\n if (typeof candidate.lastSeen === 'string' && candidate.lastSeen.trim()) {\n entry.lastSeen = candidate.lastSeen.trim();\n }\n if (typeof candidate.createdAt === 'string' && candidate.createdAt.trim()) {\n entry.createdAt = candidate.createdAt.trim();\n }\n if (typeof candidate.lastWorkingDir === 'string' && candidate.lastWorkingDir.trim()) {\n entry.lastWorkingDir = path.resolve(candidate.lastWorkingDir);\n }\n return entry;\n}\n\nasync function touchGlobalProjectManifest(\n entry: DesktopProjectEntry,\n): 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) =>\n (b.lastSeen ?? b.createdAt ?? '').localeCompare(a.lastSeen ?? a.createdAt ?? ''),\n )\n .slice(0, 80);\n await fs.mkdir(path.dirname(manifestFile), { recursive: true });\n await atomicWrite(manifestFile, `${JSON.stringify({ projects: sorted }, null, 2)}\\n`, {\n mode: 0o600,\n });\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 {\n desktopSettingsWorkspaceRoot,\n preloadPath,\n rendererIndexPath,\n webuiPreloadPath,\n} from './runtime-manager-paths.js';\n", "import { existsSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { resolveWstackPaths } from '@wrongstack/core/utils';\n\nexport function 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 try {\n const serverPkgPath = require.resolve('@wrongstack/webui-server/package.json');\n const candidate = path.join(path.dirname(serverPkgPath), 'dist', 'server', 'entry.js');\n if (existsSync(candidate)) return candidate;\n } catch {\n // fall through to legacy path\n }\n const serverIndex = require.resolve('@wrongstack/webui-server');\n return path.join(path.dirname(serverIndex), 'server', 'entry.js');\n}\n\nexport function resolveWebUiDistDir(): string {\n if (process.env['WRONGSTACK_WEBUI_DIST']) {\n return path.resolve(process.env['WRONGSTACK_WEBUI_DIST']);\n }\n const require = createRequire(import.meta.url);\n const serverEntry = require.resolve('@wrongstack/webui');\n const candidate = path.dirname(serverEntry);\n if (existsSync(candidate)) return candidate;\n throw new Error(\n `WebUI frontend assets not found at ${candidate}. Build @wrongstack/webui or set WRONGSTACK_WEBUI_DIST.`,\n );\n}\n\nexport function rendererIndexPath(): string {\n return new URL('../renderer/index.html', import.meta.url).href;\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\nexport function desktopSettingsWorkspaceRoot(): string {\n return path.join(resolveWstackPaths({ projectRoot: process.cwd() }).configDir, 'settings');\n}\n", "import type { TrustBoundary } from '@wrongstack/core/security';\nimport { shell, WebContentsView, type BaseWindow } from 'electron';\nimport type {\n DesktopWebuiCommand,\n DesktopWebuiPrefs,\n DesktopWebuiStatusSnapshot,\n} from '../../shared/types.js';\nimport { authorizeDesktopAction } from '../desktop-privileged-actions.js';\nimport { IPC } from '../ipc.js';\nimport type { DesktopRuntimeManager } from '../runtime-manager.js';\nimport { webuiPreloadPath } from '../runtime-manager.js';\nimport {\n MAX_PENDING_FLUSH_ATTEMPTS,\n MAX_PENDING_WEBUI_COMMANDS,\n WEBUI_COMMAND_ACK_TIMEOUT_MS,\n WEBUI_COMMAND_FALLBACK_MS,\n} from '../state/constants.js';\nimport type { DesktopWebuiRuntimeView, PendingWebuiCommandAck } from '../state/types.js';\nimport {\n buildWebuiCommandFallbackScript,\n normalizeDesktopWebuiCommand,\n} from '../webui-command-bridge.js';\nimport { allowedExternalProtocol, sameOrigin } from './navigation.js';\n\nexport interface DesktopWebuiControllerContext {\n manager: DesktopRuntimeManager;\n trustBoundary: TrustBoundary;\n getMainWindow: () => BaseWindow | null;\n getShellView: () => WebContentsView | null;\n getLocale: () => string;\n layoutViews: () => void;\n onPrefsChanged?:\n | ((previous: DesktopWebuiPrefs | undefined, next: DesktopWebuiPrefs | undefined) => void)\n | undefined;\n}\n\n/** Instance-owned lifecycle and command authority for embedded WebUI views. */\nexport class DesktopWebuiController {\n readonly views = new Map<string, DesktopWebuiRuntimeView>();\n readonly pendingAcks = new Map<string, PendingWebuiCommandAck>();\n activeRuntimeId: string | null = null;\n status: DesktopWebuiStatusSnapshot = { runtimeId: null, status: 'idle' };\n private commandSequence = 0;\n\n constructor(private readonly ctx: DesktopWebuiControllerContext) {}\n\n private openExternal(target: string): void {\n const protocol = allowedExternalProtocol(target);\n if (!protocol) return;\n void authorizeDesktopAction(this.ctx.trustBoundary, {\n capability: 'url.open-external',\n subject: { kind: 'url', id: target, attributes: { protocol } },\n risk: 'elevated',\n metadata: { operation: 'webui-navigation' },\n })\n .then((decision) =>\n decision.allowed ? void shell.openExternal(target) : undefined,\n )\n .catch(() => undefined);\n }\n\n private publishStatus(next: DesktopWebuiStatusSnapshot): void {\n this.status = next;\n const shellView = this.ctx.getShellView();\n if (!shellView || shellView.webContents.isDestroyed()) return;\n shellView.webContents.send(IPC.webuiStatusChanged, next);\n }\n\n setEntryStatus(entry: DesktopWebuiRuntimeView, next: DesktopWebuiStatusSnapshot): void {\n const previousPrefs = entry.status.prefs;\n entry.status = {\n ...next,\n ...(next.prefs === undefined && previousPrefs !== undefined ? { prefs: previousPrefs } : {}),\n // `pendingCommands` is always derived from the entry's own array (source of truth).\n // Any `next.pendingCommands` value is intentionally overwritten.\n pendingCommands: entry.pendingCommands.length,\n };\n if (this.activeRuntimeId === entry.runtimeId) {\n this.publishStatus(entry.status);\n this.ctx.onPrefsChanged?.(previousPrefs, entry.status.prefs);\n }\n }\n\n ensure(runtimeId: string): DesktopWebuiRuntimeView | null {\n const mainWindow = this.ctx.getMainWindow();\n if (!mainWindow) return null;\n const existing = this.views.get(runtimeId);\n if (existing) return existing;\n const view = new WebContentsView({\n webPreferences: {\n preload: webuiPreloadPath(),\n contextIsolation: true,\n nodeIntegration: false,\n // This is the view that renders agent output, tool results, file\n // contents, and fetched pages \u2014 i.e. the most attacker-influenceable\n // surface in the app, and the one that most needs process-level\n // containment rather than only bridge-level. webui-preload.ts imports\n // just electron's contextBridge/ipcRenderer and a constants map, so it\n // is already within the sandboxed preload subset (WS-093).\n sandbox: true,\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 view.webContents.setWindowOpenHandler(({ url }) => {\n this.openExternal(url);\n return { action: 'deny' };\n });\n view.webContents.on('will-navigate', (event, url) => {\n if (sameOrigin(url, entry.url)) return;\n event.preventDefault();\n this.openExternal(url);\n });\n view.webContents.on('did-start-loading', () => {\n if (this.views.get(runtimeId) !== entry) return;\n entry.bridgeReady = false;\n this.setEntryStatus(entry, { runtimeId, status: 'loading' });\n });\n view.webContents.on('did-finish-load', () => {\n if (this.views.get(runtimeId) !== entry) return;\n this.scheduleFlush(entry);\n try {\n entry.view.webContents.send(IPC.webuiLocaleChanged, this.ctx.getLocale());\n } catch {}\n });\n view.webContents.on('did-fail-load', (_event, errorCode, errorDescription) => {\n if (this.views.get(runtimeId) !== entry || errorCode === -3) return;\n this.setEntryStatus(entry, { runtimeId, status: 'error', error: errorDescription });\n });\n view.webContents.on('render-process-gone', (_event, details) => {\n if (this.views.get(runtimeId) !== entry) return;\n this.setEntryStatus(entry, {\n runtimeId,\n status: 'error',\n error: `WebUI renderer exited: ${details.reason}`,\n });\n });\n this.views.set(runtimeId, entry);\n return entry;\n }\n\n attach(entry: DesktopWebuiRuntimeView): void {\n const mainWindow = this.ctx.getMainWindow();\n if (!mainWindow || entry.attached) return;\n mainWindow.contentView.addChildView(entry.view);\n entry.attached = true;\n }\n\n dispose(entry: DesktopWebuiRuntimeView): void {\n this.views.delete(entry.runtimeId);\n entry.pendingCommands.length = 0;\n this.settleRuntimeAcks(entry.runtimeId, false);\n if (entry.pendingFlushTimer) clearTimeout(entry.pendingFlushTimer);\n entry.pendingFlushTimer = null;\n const mainWindow = this.ctx.getMainWindow();\n if (mainWindow && entry.attached) mainWindow.contentView.removeChildView(entry.view);\n entry.attached = false;\n if (!entry.view.webContents.isDestroyed()) entry.view.webContents.close();\n if (this.activeRuntimeId === entry.runtimeId) this.activeRuntimeId = null;\n }\n\n disposeAll(): void {\n for (const entry of [...this.views.values()]) this.dispose(entry);\n }\n\n findBySenderId(senderId: number): DesktopWebuiRuntimeView | undefined {\n return [...this.views.values()].find((entry) => entry.view.webContents.id === senderId);\n }\n\n syncActive(): void {\n if (!this.ctx.getMainWindow()) return;\n const snapshot = this.ctx.manager.snapshot();\n const live = new Set(snapshot.runtimes.filter((r) => r.status === 'running').map((r) => r.id));\n for (const [id, entry] of this.views) if (!live.has(id)) this.dispose(entry);\n const active = snapshot.runtimes.find((runtime) => runtime.id === snapshot.activeRuntimeId);\n if (active?.status !== 'running') {\n this.activeRuntimeId = active?.id ?? null;\n this.publishStatus({ runtimeId: active?.id ?? null, status: 'idle' });\n this.ctx.layoutViews();\n return;\n }\n const url = this.ctx.manager.getRuntimeUrlWithToken(active.id);\n if (!url) {\n this.activeRuntimeId = active.id;\n this.publishStatus({ runtimeId: active.id, status: 'idle' });\n this.ctx.layoutViews();\n return;\n }\n const entry = this.ensure(active.id);\n if (!entry) return;\n this.activeRuntimeId = active.id;\n this.attach(entry);\n this.ctx.layoutViews();\n this.publishStatus(entry.status);\n if (entry.url === url) return;\n entry.url = url;\n entry.bridgeReady = false;\n this.setEntryStatus(entry, { runtimeId: active.id, status: 'loading' });\n void entry.view.webContents.loadURL(url).catch((error) => {\n this.setEntryStatus(entry, {\n runtimeId: active.id,\n status: 'error',\n error: error instanceof Error ? error.message : String(error),\n });\n });\n }\n\n broadcastLocale(locale: string): void {\n for (const entry of this.views.values()) {\n if (!entry.view.webContents.isDestroyed())\n entry.view.webContents.send(IPC.webuiLocaleChanged, locale);\n }\n }\n\n private activeEntry(): DesktopWebuiRuntimeView | undefined {\n const id = this.ctx.manager.snapshot().activeRuntimeId;\n return id ? this.views.get(id) : undefined;\n }\n\n async dispatch(commandInput: unknown): Promise<boolean> {\n const command = normalizeDesktopWebuiCommand(commandInput);\n if (!command) return false;\n const entry = this.activeEntry();\n if (!entry?.url) return false;\n if (entry.status.status !== 'ready' || !entry.bridgeReady) {\n if (!entry.view.webContents.isLoading() && entry.status.status !== 'error')\n return this.dispatchNow(entry, command);\n this.queue(entry, command);\n this.scheduleFlush(entry);\n return true;\n }\n return this.dispatchNow(entry, command);\n }\n\n async reload(): Promise<boolean> {\n const entry = this.activeEntry();\n if (!entry?.url) return false;\n entry.bridgeReady = false;\n this.setEntryStatus(entry, { runtimeId: entry.runtimeId, status: 'loading' });\n return entry.view.webContents.loadURL(entry.url).then(() => true).catch((error) => {\n this.setEntryStatus(entry, {\n runtimeId: entry.runtimeId,\n status: 'error',\n error: error instanceof Error ? error.message : String(error),\n });\n return false;\n });\n }\n\n private queue(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 entry.pendingFlushAttempts = 0;\n this.setEntryStatus(entry, entry.status);\n }\n\n private dispatchNow(entry: DesktopWebuiRuntimeView, command: DesktopWebuiCommand): Promise<boolean> {\n if (this.views.get(entry.runtimeId) !== entry || !entry.url) return Promise.resolve(false);\n const requestId = `${entry.runtimeId}:${Date.now()}:${++this.commandSequence}`;\n const outbound = { ...command, requestId };\n return new Promise<boolean>((resolve) => {\n const fallbackTimer = setTimeout(() => {\n if (!this.pendingAcks.has(requestId)) return;\n if (this.views.get(entry.runtimeId) !== entry || entry.view.webContents.isDestroyed()) return;\n void entry.view.webContents.executeJavaScript(buildWebuiCommandFallbackScript(outbound), true).catch(() => undefined);\n }, WEBUI_COMMAND_FALLBACK_MS);\n const timer = setTimeout(() => this.settleAck(requestId, false), WEBUI_COMMAND_ACK_TIMEOUT_MS);\n this.pendingAcks.set(requestId, { runtimeId: entry.runtimeId, timer, fallbackTimer, resolve });\n try {\n entry.view.webContents.send(IPC.webuiCommand, outbound);\n if (this.activeRuntimeId === entry.runtimeId) entry.view.webContents.focus();\n } catch {\n this.settleAck(requestId, false);\n }\n });\n }\n\n settleAck(requestId: string, handled: boolean): void {\n const pending = this.pendingAcks.get(requestId);\n if (!pending) return;\n this.pendingAcks.delete(requestId);\n clearTimeout(pending.timer);\n if (pending.fallbackTimer) clearTimeout(pending.fallbackTimer);\n if (handled) {\n const entry = this.views.get(pending.runtimeId);\n if (entry) {\n entry.bridgeReady = true;\n this.setEntryStatus(entry, { ...entry.status, status: 'ready' });\n }\n }\n pending.resolve(handled);\n }\n\n private settleRuntimeAcks(runtimeId: string, handled: boolean): void {\n for (const [id, pending] of [...this.pendingAcks])\n if (pending.runtimeId === runtimeId) this.settleAck(id, handled);\n }\n\n scheduleFlush(entry: DesktopWebuiRuntimeView): void {\n if (entry.pendingFlushTimer) return;\n entry.pendingFlushTimer = setTimeout(() => {\n entry.pendingFlushTimer = null;\n void this.flush(entry);\n }, 250);\n }\n\n private async flush(entry: DesktopWebuiRuntimeView): Promise<void> {\n if (this.views.get(entry.runtimeId) !== entry || entry.pendingCommands.length === 0) return;\n if (!entry.bridgeReady) {\n entry.pendingFlushAttempts += 1;\n const shouldExecuteFallback = !entry.view.webContents.isLoading() && entry.pendingFlushAttempts >= 4;\n if (!shouldExecuteFallback && entry.pendingFlushAttempts <= MAX_PENDING_FLUSH_ATTEMPTS) {\n this.scheduleFlush(entry);\n this.setEntryStatus(entry, entry.status);\n return;\n }\n if (!shouldExecuteFallback) {\n entry.pendingCommands.length = 0;\n this.setEntryStatus(entry, { runtimeId: entry.runtimeId, status: 'error', error: 'WebUI command bridge did not become ready.' });\n return;\n }\n }\n entry.pendingFlushAttempts = 0;\n const commands = entry.pendingCommands.splice(0);\n this.setEntryStatus(entry, entry.status);\n for (const command of commands) await this.dispatchNow(entry, command).catch(() => undefined);\n }\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", "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 'goal',\n 'sddhub',\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 '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", "import { OPEN_EXTERNAL_ALLOWED_PROTOCOLS } from '../state/constants.js';\n\nexport function allowedExternalProtocol(target: string): string | undefined {\n try {\n const protocol = new URL(target).protocol;\n return OPEN_EXTERNAL_ALLOWED_PROTOCOLS.has(protocol) ? protocol : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function 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", "import * as fs from 'node:fs/promises';\nimport { nativeImage, type NativeImage } from 'electron';\n\nasync function readIcon(relativePath: string): Promise<NativeImage | undefined> {\n try {\n const iconPath = new URL(relativePath, import.meta.url).pathname;\n await fs.stat(iconPath);\n const icon = nativeImage.createFromPath(iconPath);\n return icon.isEmpty() ? undefined : icon;\n } catch {\n return undefined;\n }\n}\n\n/** Resolves the best supported desktop icon without making application boot depend on it. */\nexport async function loadDesktopAppIcon(): Promise<NativeImage | undefined> {\n if (process.platform !== 'darwin') return readIcon('../../assets/icon.svg');\n return (await readIcon('../../assets/icon.png')) ?? readIcon('../../assets/icon.icns');\n}\n", "import type { BaseWindow, Display, Rectangle } from 'electron';\nimport type { DesktopWindowState } from '../shared/types.js';\nimport { MIN_WINDOW_HEIGHT, MIN_WINDOW_WIDTH } from './state/constants.js';\n\nexport interface DesktopWindowStateControllerContext {\n getWindow(): BaseWindow | null;\n getDisplays(): Display[];\n save(state: DesktopWindowState): Promise<void>;\n}\n\n/** Owns debounced window persistence and display-aware restoration validation. */\nexport class DesktopWindowStateController {\n private saveTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(private readonly ctx: DesktopWindowStateControllerContext) {}\n\n scheduleSave(): void {\n if (this.saveTimer) clearTimeout(this.saveTimer);\n this.saveTimer = setTimeout(() => {\n this.saveTimer = null;\n void this.save();\n }, 350);\n }\n\n async save(): Promise<void> {\n const window = this.ctx.getWindow();\n if (!window || window.isDestroyed?.()) return;\n const bounds = window.getNormalBounds();\n await this.ctx.save({ ...bounds, maximized: window.isMaximized() });\n }\n\n validated(state: DesktopWindowState | null): DesktopWindowState | null {\n if (\n !state ||\n !Number.isFinite(state.width) ||\n !Number.isFinite(state.height) ||\n state.width < MIN_WINDOW_WIDTH ||\n state.height < MIN_WINDOW_HEIGHT\n )\n return null;\n if (state.x === undefined || state.y === undefined) {\n return { width: state.width, height: state.height, maximized: state.maximized };\n }\n const candidate = { x: state.x, y: state.y, width: state.width, height: state.height };\n return this.ctx.getDisplays().some(({ workArea }) => intersects(candidate, workArea))\n ? { x: state.x, y: state.y, width: state.width, height: state.height, maximized: state.maximized }\n : null;\n }\n}\n\nfunction intersects(left: Rectangle, right: Rectangle): 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 * Runtime and project operations.\n * Handles project management, runtime lifecycle, and workspace operations.\n */\nimport * as fs from 'node:fs/promises';\nimport type { DesktopWebuiCommand } from '../../shared/types.js';\nimport type { IRuntimeManager, IAgentBridge } from '../state/types.js';\nimport { desktopSettingsWorkspaceRoot } from '../runtime-manager.js';\n\nexport interface RuntimeOperationsContext {\n getRuntimeManager(): IRuntimeManager;\n getAgentBridge(): IAgentBridge;\n broadcastState(): void;\n syncActiveWebuiView(): void;\n dispatchWebuiCommand(command: DesktopWebuiCommand): Promise<boolean>;\n chooseProjectRoot(kind: 'open' | 'register'): Promise<string | undefined>;\n}\n\n/**\n * Open a project, optionally at a specific path.\n */\nexport async function openProject(\n ctx: RuntimeOperationsContext,\n requestedRoot?: string,\n): Promise<ReturnType<IRuntimeManager['snapshot']>> {\n let projectRoot = requestedRoot;\n if (!projectRoot) {\n projectRoot = await ctx.chooseProjectRoot('open');\n }\n if (!projectRoot) return ctx.getRuntimeManager().snapshot();\n\n await ctx.getRuntimeManager().openProject(projectRoot);\n ctx.syncActiveWebuiView();\n ctx.broadcastState();\n return ctx.getRuntimeManager().snapshot();\n}\n\n/**\n * Register a project (add to global registry without opening).\n */\nexport async function registerProject(\n ctx: RuntimeOperationsContext,\n requestedRoot?: string,\n): Promise<ReturnType<IRuntimeManager['snapshot']>> {\n let projectRoot = requestedRoot;\n if (!projectRoot) {\n projectRoot = await ctx.chooseProjectRoot('register');\n }\n if (!projectRoot) return ctx.getRuntimeManager().snapshot();\n\n await ctx.getRuntimeManager().registerProject(projectRoot);\n ctx.broadcastState();\n return ctx.getRuntimeManager().snapshot();\n}\n\n/**\n * Unregister a project from the global registry.\n */\nexport async function unregisterProject(\n ctx: RuntimeOperationsContext,\n root: string,\n): Promise<ReturnType<IRuntimeManager['snapshot']>> {\n if (!root || typeof root !== 'string') return ctx.getRuntimeManager().snapshot();\n await ctx.getRuntimeManager().unregisterProject(root);\n ctx.broadcastState();\n return ctx.getRuntimeManager().snapshot();\n}\n\n/**\n * Open a new session for an existing project.\n */\nexport async function openProjectSession(\n ctx: RuntimeOperationsContext,\n runtimeId?: string,\n): Promise<ReturnType<IRuntimeManager['snapshot']>> {\n const snapshot = ctx.getRuntimeManager().snapshot();\n const runtime =\n (runtimeId ? snapshot.runtimes.find((candidate) => candidate.id === runtimeId) : undefined) ??\n snapshot.runtimes.find((candidate) => candidate.id === snapshot.activeRuntimeId);\n\n if (runtime?.kind !== 'project') {\n return openProject(ctx);\n }\n\n await ctx.getRuntimeManager().openProject(runtime.root, { forceNew: true });\n ctx.syncActiveWebuiView();\n ctx.broadcastState();\n return ctx.getRuntimeManager().snapshot();\n}\n\n/**\n * Open global settings workspace.\n */\nexport async function openSettings(\n ctx: RuntimeOperationsContext,\n): Promise<ReturnType<IRuntimeManager['snapshot']>> {\n const snapshot = ctx.getRuntimeManager().snapshot();\n const active = snapshot.runtimes.find((runtime) => runtime.id === snapshot.activeRuntimeId);\n\n if (!active || active.kind === 'global-settings' || active.status !== 'running') {\n const root = desktopSettingsWorkspaceRoot();\n await fs.mkdir(root, { recursive: true });\n await ctx.getRuntimeManager().openProject(root, {\n name: 'Global Settings',\n kind: 'global-settings',\n touchRecent: false,\n });\n ctx.syncActiveWebuiView();\n ctx.broadcastState();\n }\n\n await ctx.dispatchWebuiCommand({ view: 'settings' });\n return ctx.getRuntimeManager().snapshot();\n}\n\n/**\n * Activate a runtime (make it the active runtime).\n */\nexport async function activateRuntime(\n ctx: RuntimeOperationsContext,\n id: string,\n): Promise<ReturnType<IRuntimeManager['snapshot']>> {\n await ctx.getRuntimeManager().activateRuntime(id);\n ctx.syncActiveWebuiView();\n ctx.broadcastState();\n return ctx.getRuntimeManager().snapshot();\n}\n\n/**\n * Close a runtime.\n */\nexport async function closeRuntime(\n ctx: RuntimeOperationsContext,\n id: string,\n): Promise<ReturnType<IRuntimeManager['snapshot']>> {\n ctx.getAgentBridge().close(id);\n await ctx.getRuntimeManager().closeRuntime(id);\n ctx.syncActiveWebuiView();\n ctx.broadcastState();\n return ctx.getRuntimeManager().snapshot();\n}\n\n/**\n * Restore the last workspace (called on app startup).\n */\nexport async function restoreLastWorkspace(ctx: RuntimeOperationsContext): Promise<void> {\n await ctx.getRuntimeManager().restoreLastWorkspace();\n ctx.syncActiveWebuiView();\n ctx.broadcastState();\n}\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 * 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 registerProject: () => void ctx.registerProject(),\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, ProjectMenuActions, ProjectMenuGroup } from './types.js';\n", "/**\n * Projects menu builder.\n */\nimport path from 'node:path';\nimport type { MenuItemConstructorOptions } from 'electron';\nimport type { DesktopRuntimeRecord } from '../../shared/types.js';\nimport type { ProjectMenuActions, ProjectMenuGroup } from './types.js';\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(''),\n },\n {\n label: t('registerProjectEllipsis'),\n click: () => actions.registerProject?.(),\n },\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} \u00B7 ${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: path.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", "/**\n * IPC handler registration with validation.\n * Centralizes all IPC handler registration logic with Zod schema validation.\n */\nimport { ipcMain } from 'electron';\nimport type { DesktopWebuiPrefs } from '../../shared/types.js';\nimport { IPC } from '../ipc.js';\nimport type { IpcHandlerContext } from '../state/types.js';\nimport { createValidationLogger, validate, validateOrDefault } from '../validation/index.js';\nimport {\n booleanSchema,\n pathSchema,\n projectRootSchema,\n runtimeIdSchema,\n setLocaleSchema,\n webuiCommandAckSchema,\n} from '../validation/schemas.js';\n\n// Validation logger for tracking malformed messages\nconst validationLogger = createValidationLogger('IPC');\n\n/**\n * Register all IPC handlers with validation.\n */\nexport function registerIpcHandlers(ctx: IpcHandlerContext): void {\n // State handlers (no validation needed - internal data)\n ipcMain.handle(IPC.getState, () => ctx.getRuntimeManager().snapshot());\n\n ipcMain.handle(IPC.getConversation, (_event, runtimeId: unknown) => {\n const result = validate(runtimeIdSchema, runtimeId);\n if (!result.success) {\n validationLogger.log(`getConversation: ${result.error}`);\n return ctx.getAgentBridge().snapshot('');\n }\n return ctx.getAgentBridge().snapshot(result.data);\n });\n\n ipcMain.handle(IPC.getWebuiStatus, () => ctx.getWebuiStatus());\n\n // Navigation handlers\n ipcMain.handle(IPC.navigateWebui, async (_event, command: unknown) => {\n // Command validation is handled by normalizeDesktopWebuiCommand\n return ctx.dispatchWebuiCommand(command);\n });\n\n ipcMain.handle(IPC.reloadWebui, async () => ctx.reloadActiveWebuiView());\n\n // Shell handlers\n ipcMain.handle(IPC.setShellSidebarCollapsed, (_event, collapsed: unknown) => {\n const result = validateOrDefault(booleanSchema, collapsed, true);\n ctx.setShellSidebarCollapsed(result);\n return true;\n });\n\n ipcMain.handle(IPC.openSettings, async () => ctx.openSettings());\n\n // Project handlers\n ipcMain.handle(IPC.openProjectSession, async (_event, runtimeId: unknown) => {\n const validated = validateOptional(runtimeIdSchema, runtimeId);\n return ctx.openProjectSession(validated);\n });\n\n // projectRootSchema, not pathSchema: this value becomes a spawned agent's\n // working directory, and pathSchema only bounds the string's length.\n ipcMain.handle(IPC.openProject, async (_event, requestedRoot: unknown) => {\n const validated = validateOptional(projectRootSchema, requestedRoot);\n return ctx.openProject(validated);\n });\n\n ipcMain.handle(IPC.registerProject, async (_event, requestedRoot: unknown) => {\n const validated = validateOptional(projectRootSchema, requestedRoot);\n return ctx.registerProject(validated);\n });\n\n ipcMain.handle(IPC.unregisterProject, async (_event, root: unknown) => {\n const result = validate(pathSchema, root);\n if (!result.success) {\n validationLogger.log(`unregisterProject: ${result.error}`);\n return ctx.getRuntimeManager().snapshot();\n }\n return ctx.unregisterProject(result.data);\n });\n\n // Runtime handlers\n ipcMain.handle(IPC.activateRuntime, async (_event, id: unknown) => {\n const result = validate(runtimeIdSchema, id);\n if (!result.success) {\n validationLogger.log(`activateRuntime: ${result.error}`);\n return ctx.getRuntimeManager().snapshot();\n }\n return ctx.activateRuntime(result.data);\n });\n\n ipcMain.handle(IPC.closeRuntime, async (_event, id: unknown) => {\n const result = validate(runtimeIdSchema, id);\n if (!result.success) {\n validationLogger.log(`closeRuntime: ${result.error}`);\n return ctx.getRuntimeManager().snapshot();\n }\n return ctx.closeRuntime(result.data);\n });\n\n ipcMain.handle(IPC.sendMessage, async (_event, id: unknown, content: unknown) => {\n const idResult = validate(runtimeIdSchema, id);\n if (!idResult.success) {\n validationLogger.log(`sendMessage (id): ${idResult.error}`);\n return ctx.sendMessage('', '', '');\n }\n const contentResult = validate(\n pathSchema.transform(() => String(content ?? '')),\n content,\n );\n const safeContent = contentResult.success ? contentResult.data : String(content ?? '');\n return ctx.sendMessage(\n idResult.data,\n ctx.getRuntimeManager().getRuntimeWsUrlWithToken(idResult.data) ?? '',\n safeContent,\n );\n });\n\n ipcMain.handle(IPC.abortRuntime, async (_event, id: unknown) => {\n const result = validate(runtimeIdSchema, id);\n if (!result.success) {\n validationLogger.log(`abortRuntime: ${result.error}`);\n return ctx.abortRuntime('', '');\n }\n return ctx.abortRuntime(\n result.data,\n ctx.getRuntimeManager().getRuntimeWsUrlWithToken(result.data) ?? '',\n );\n });\n\n ipcMain.handle(IPC.openRuntimeInBrowser, async (_event, id: unknown) => {\n const result = validate(runtimeIdSchema, id);\n if (!result.success) {\n validationLogger.log(`openRuntimeInBrowser: ${result.error}`);\n return;\n }\n const url = ctx.getRuntimeManager().getRuntimeUrlWithToken(result.data);\n if (url) ctx.openExternal(url);\n });\n\n ipcMain.handle(IPC.revealRuntimeRoot, async (_event, id: unknown) => {\n const result = validate(runtimeIdSchema, id);\n if (!result.success) {\n validationLogger.log(`revealRuntimeRoot: ${result.error}`);\n return;\n }\n const runtime = ctx.getRuntimeManager().getRuntime(result.data);\n if (runtime) ctx.revealInExplorer(runtime.root);\n });\n\n // WebUI event handlers\n ipcMain.on(IPC.webuiReadyChanged, (event, ready: unknown) => {\n const entry = ctx.findWebuiEntryBySenderId(event.sender.id);\n if (!entry) return;\n const isReady = ready === true;\n entry.bridgeReady = isReady;\n if (entry.bridgeReady) {\n ctx.setEntryWebuiStatus(entry, { ...entry.status, status: 'ready' });\n ctx.schedulePendingWebuiFlush(entry);\n } else if (entry.status.status === 'ready') {\n ctx.setEntryWebuiStatus(entry, { ...entry.status, status: 'loading' });\n }\n });\n\n ipcMain.on(IPC.webuiPrefsChanged, (event, prefs: unknown) => {\n const entry = ctx.findWebuiEntryBySenderId(event.sender.id);\n if (!entry) return;\n const sanitized = sanitizeWebuiPrefs(prefs);\n if (Object.keys(sanitized).length === 0) return;\n ctx.setEntryWebuiStatus(entry, {\n ...entry.status,\n prefs: { ...(entry.status.prefs ?? {}), ...sanitized },\n });\n });\n\n ipcMain.on(\n IPC.webuiCommandAck,\n (event, requestId: unknown, handled: unknown, _message?: unknown) => {\n const entry = ctx.findWebuiEntryBySenderId(event.sender.id);\n if (!entry) return;\n\n const result = validate(webuiCommandAckSchema, {\n requestId,\n handled,\n message: _message,\n });\n\n if (!result.success) {\n validationLogger.log(`webuiCommandAck: ${result.error}`);\n return;\n }\n\n const pending = ctx.getPendingWebuiCommandAcks().get(result.data.requestId);\n if (!pending || pending.runtimeId !== entry.runtimeId) return;\n ctx.settlePendingWebuiCommandAck(result.data.requestId, result.data.handled);\n },\n );\n\n // Locale handlers\n ipcMain.on(IPC.setLocale, (_event, locale: unknown) => {\n const result = validate(setLocaleSchema, { locale });\n if (!result.success) {\n validationLogger.log(`setLocale: ${result.error}`);\n return;\n }\n ctx.getI18n().setMainLocale(result.data.locale);\n ctx.configureApplicationMenu();\n ctx.broadcastLocaleToEmbeddedWebuis(result.data.locale);\n void ctx.getConfigIo().writeUiLocale(result.data.locale);\n });\n}\n\n/**\n * Validate optional value with schema.\n */\nfunction validateOptional<T>(\n schema: { safeParse: (v: unknown) => { success: boolean; data?: T; error?: unknown } },\n value: unknown,\n): T | undefined {\n if (value === undefined || value === null) return undefined;\n const result = schema.safeParse(value);\n return result.success ? result.data : undefined;\n}\n\n/**\n * Sanitize WebUI preferences from renderer.\n */\nfunction sanitizeWebuiPrefs(prefs: unknown): DesktopWebuiPrefs {\n const next: DesktopWebuiPrefs = {};\n if (!isRecord(prefs)) return next;\n if (typeof prefs['yolo'] === 'boolean') next.yolo = prefs['yolo'];\n if (typeof prefs['nextPrediction'] === 'boolean') next.nextPrediction = prefs['nextPrediction'];\n if (typeof prefs['contextAutoCompact'] === 'boolean') {\n next.contextAutoCompact = prefs['contextAutoCompact'];\n }\n return next;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n}\n", "/**\n * Validation utilities for IPC messages.\n * Provides safe parsing and error handling for untrusted input.\n */\nimport type { ZodSchema, ZodError } from 'zod';\n\n/**\n * Result type for validation operations.\n * Success contains the validated data, Failure contains the error.\n */\ntype ValidationResult<T> =\n | { success: true; data: T }\n | { success: false; error: string };\n\n/**\n * Validate data against a Zod schema.\n * Returns a safe result that never throws.\n */\nexport function validate<T>(schema: ZodSchema<T>, data: unknown): ValidationResult<T> {\n try {\n const result = schema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return { success: false, error: formatZodError(result.error) };\n } catch (err) {\n return { success: false, error: String(err) };\n }\n}\n\n/**\n * Validate data and throw on failure.\n * Use this when you want to reject invalid input.\n */\nexport function validateOrThrow<T>(schema: ZodSchema<T>, data: unknown, context?: string): T {\n const result = validate(schema, data);\n if (!result.success) {\n const prefix = context ? `[${context}] ` : '';\n throw new Error(`${prefix}Validation failed: ${result.error}`);\n }\n return result.data;\n}\n\n/**\n * Validate with a fallback value.\n * Returns the validated data or a default on failure.\n */\nexport function validateOrDefault<T>(\n schema: ZodSchema<T>,\n data: unknown,\n defaultValue: T,\n): T {\n const result = validate(schema, data);\n return result.success ? result.data : defaultValue;\n}\n\n/**\n * Validate optional input.\n * Returns undefined for undefined/null input, validated data otherwise.\n */\nexport function validateOptional<T>(\n schema: ZodSchema<T>,\n data: unknown,\n): T | undefined {\n if (data === undefined || data === null) return undefined;\n const result = validate(schema, data);\n return result.success ? result.data : undefined;\n}\n\n/**\n * Format Zod error into a human-readable string.\n */\nfunction formatZodError(error: ZodError): string {\n return error.issues\n .map((e) => `${e.path.join('.')}: ${e.message}`)\n .join('; ');\n}\n\n/**\n * Create a logger for validation errors.\n * Helps track malformed messages for debugging.\n */\nexport function createValidationLogger(prefix: string) {\n const loggedErrors = new Set<string>();\n const maxErrors = 100;\n\n return {\n log(error: string): void {\n if (loggedErrors.size >= maxErrors) return;\n const key = `${prefix}:${error}`;\n if (!loggedErrors.has(key)) {\n loggedErrors.add(key);\n console.warn(\n JSON.stringify({\n level: 'warn',\n event: 'desktop.validation_error',\n prefix,\n message: error,\n timestamp: new Date().toISOString(),\n }),\n );\n }\n },\n reset(): void {\n loggedErrors.clear();\n },\n };\n}\n", "/**\n * Zod schemas for IPC message validation.\n * These schemas validate incoming data from the renderer to ensure type safety.\n */\nimport { statSync } from 'node:fs';\nimport * as path from 'node:path';\nimport { z } from 'zod';\n\n// ============================================================================\n// Base Validators\n// ============================================================================\n\n/** Valid runtime ID pattern: alphanumeric, dots, underscores, hyphens, 3-120 chars */\nconst RUNTIME_ID_PATTERN = /^[a-zA-Z0-9._:-]{3,120}$/;\n\nexport const runtimeIdSchema = z.string().regex(RUNTIME_ID_PATTERN, 'Invalid runtime ID format');\n\nexport const pathSchema = z.string().min(1).max(10000);\n\n/**\n * A filesystem path that will become a spawned agent's working directory.\n *\n * `pathSchema` is a LENGTH check, not a path check \u2014 it accepts any string. The\n * value reaches `openProject` / `registerProject` and ends up as an agent `cwd`,\n * so a renderer compromise could point the agent at an arbitrary location\n * (audit 2026-08-20). Requiring the path to resolve to a real directory removes\n * the arbitrary-string class without constraining where a user may legitimately\n * open a project \u2014 this is a local single-user app, and the directory has to\n * exist for the session to be meaningful anyway.\n *\n * Deliberately not a containment check: there is no root to contain to.\n */\nexport const projectRootSchema = pathSchema\n .refine((value) => !value.includes('\\0'), {\n message: 'path must not contain a NUL byte',\n })\n .refine(\n (value) => {\n try {\n return statSync(path.resolve(value)).isDirectory();\n } catch {\n return false;\n }\n },\n { message: 'path must be an existing directory' },\n );\n\nexport const booleanSchema = z.boolean();\n\nexport const numberSchema = z.number().int().finite();\n\n// ============================================================================\n// IPC Handler Input Schemas\n// ============================================================================\n\n/**\n * Schema for IPC.openProject handler.\n * Accepts optional project root path.\n */\nexport const openProjectSchema = z.object({\n requestedRoot: pathSchema.optional(),\n});\n\n/**\n * Schema for IPC.registerProject handler.\n * Accepts optional project root path.\n */\nexport const registerProjectSchema = z.object({\n requestedRoot: pathSchema.optional(),\n});\n\n/**\n * Schema for IPC.unregisterProject handler.\n * Requires a valid root path.\n */\nexport const unregisterProjectSchema = z.object({\n root: pathSchema,\n});\n\n/**\n * Schema for IPC.openProjectSession handler.\n * Accepts optional runtime ID.\n */\nexport const openProjectSessionSchema = z.object({\n runtimeId: runtimeIdSchema.optional(),\n});\n\n/**\n * Schema for IPC.activateRuntime handler.\n * Requires a valid runtime ID.\n */\nexport const activateRuntimeSchema = z.object({\n id: runtimeIdSchema,\n});\n\n/**\n * Schema for IPC.closeRuntime handler.\n * Requires a valid runtime ID.\n */\nexport const closeRuntimeSchema = z.object({\n id: runtimeIdSchema,\n});\n\n/**\n * Schema for IPC.sendMessage handler.\n * Requires runtime ID and message content.\n */\nexport const sendMessageSchema = z.object({\n id: runtimeIdSchema,\n content: z.string(),\n});\n\n/**\n * Schema for IPC.abortRuntime handler.\n * Requires runtime ID.\n */\nexport const abortRuntimeSchema = z.object({\n id: runtimeIdSchema,\n});\n\n/**\n * Schema for IPC.openRuntimeInBrowser handler.\n * Requires runtime ID.\n */\nexport const openRuntimeInBrowserSchema = z.object({\n id: runtimeIdSchema,\n});\n\n/**\n * Schema for IPC.revealRuntimeRoot handler.\n * Requires runtime ID.\n */\nexport const revealRuntimeRootSchema = z.object({\n id: runtimeIdSchema,\n});\n\n/**\n * Schema for IPC.setShellSidebarCollapsed handler.\n * Requires a boolean.\n */\nexport const setShellSidebarCollapsedSchema = z.object({\n collapsed: booleanSchema,\n});\n\n/**\n * Schema for IPC.navigateWebui handler.\n * Validates DesktopWebuiCommand structure.\n */\nexport const navigateWebuiSchema = z.object({\n command: z.unknown(),\n});\n\n/**\n * Schema for IPC.getConversation handler.\n * Requires runtime ID.\n */\nexport const getConversationSchema = z.object({\n runtimeId: runtimeIdSchema,\n});\n\n// ============================================================================\n// Renderer Event Schemas (from preload)\n// ============================================================================\n\n/**\n * Schema for webui:readyChanged event.\n * Requires a boolean ready state.\n */\nexport const webuiReadyChangedSchema = z.object({\n ready: booleanSchema,\n});\n\n/**\n * Schema for webui:prefsChanged event.\n * Validates WebUI preferences object.\n */\nexport const webuiPrefsChangedSchema = z.object({\n prefs: z.record(z.string(), z.unknown()),\n});\n\n/**\n * Schema for webui:commandAck event.\n * Requires requestId (string) and handled (boolean).\n */\nexport const webuiCommandAckSchema = z.object({\n requestId: z.string(),\n handled: z.boolean(),\n message: z.string().optional(),\n});\n\n/**\n * Schema for desktop:setLocale event.\n * Requires locale code string.\n */\nexport const setLocaleSchema = z.object({\n locale: z.string().min(2).max(10),\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["path", "resolveWstackPaths", "app", "shell", "WebContentsView", "path", "resolve", "randomUUID", "EventEmitter", "fs", "path", "atomicWrite", "resolveWstackPaths", "wstackGlobalRoot", "path", "require", "EventEmitter", "resolveWstackPaths", "stat", "runtime", "atomicWrite", "resolve", "wstackGlobalRoot", "MIN_WINDOW_WIDTH", "MIN_WINDOW_HEIGHT", "shellView", "mainWindow", "entry", "resolve", "fs", "MIN_WINDOW_WIDTH", "MIN_WINDOW_HEIGHT", "fs", "Menu", "path", "Menu", "path", "isRecord", "app", "resolveWstackPaths", "configureApplicationMenu", "shell", "openProject", "registerProject", "unregisterProject", "openProjectSession", "openSettings", "activateRuntime", "closeRuntime", "restoreLastWorkspace", "WebContentsView", "MIN_WINDOW_WIDTH", "MIN_WINDOW_HEIGHT"]
7
7
  }