@wrongstack/desktop 0.280.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/main/main.ts","../../src/main/ipc.ts","../../src/main/i18n-main.ts","../../src/main/desktop-config-io.ts","../../src/main/runtime-manager.ts","../../src/main/webui-command-bridge.ts"],"sourcesContent":["import * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport { wstackGlobalRoot } from '@wrongstack/core/utils';\nimport {\n app,\n BaseWindow,\n dialog,\n ipcMain,\n Menu,\n screen,\n shell,\n WebContentsView,\n type BaseWindowConstructorOptions,\n type MenuItemConstructorOptions,\n} from 'electron';\nimport type {\n DesktopRuntimeRecord,\n DesktopWebuiCommand,\n DesktopWebuiPrefs,\n DesktopWebuiStatusSnapshot,\n DesktopWindowState,\n} from '../shared/types.js';\nimport { DesktopAgentBridge } from './agent-bridge.js';\nimport { IPC } from './ipc.js';\nimport { getMainLocale, setMainLocale, tMain } from './i18n-main.js';\nimport { desktopConfigPaths, readUiLocale, writeUiLocale } from './desktop-config-io.js';\nimport {\n DesktopRuntimeManager,\n preloadPath,\n rendererIndexPath,\n webuiPreloadPath,\n} from './runtime-manager.js';\nimport { watchProviderConfig } from '@wrongstack/core/storage';\nimport {\n buildWebuiCommandFallbackScript,\n normalizeDesktopWebuiCommand,\n} from './webui-command-bridge.js';\n\nconst manager = new DesktopRuntimeManager();\nconst bridge = new DesktopAgentBridge();\n\nconst OPEN_EXTERNAL_ALLOWED_PROTOCOLS = new Set(['http:', 'https:', 'mailto:']);\nconst SIDEBAR_WIDTH_WIDE = 292;\nconst SIDEBAR_WIDTH_MEDIUM = 276;\nconst SIDEBAR_WIDTH_NARROW = 252;\nconst SIDEBAR_WIDTH_COLLAPSED = 56;\nconst MIN_WINDOW_WIDTH = 760;\nconst MIN_WINDOW_HEIGHT = 520;\nconst MAX_PENDING_WEBUI_COMMANDS = 50;\nconst MAX_PENDING_FLUSH_ATTEMPTS = 80;\nconst WEBUI_COMMAND_FALLBACK_MS = 350;\nconst WEBUI_COMMAND_ACK_TIMEOUT_MS = 2_000;\napp.setAppUserModelId('com.wrongstack.desktop');\napp.setPath('userData', path.join(wstackGlobalRoot(), 'desktop', 'electron-profile'));\n\ninterface DesktopWebuiRuntimeView {\n runtimeId: string;\n view: WebContentsView;\n url: string | null;\n status: DesktopWebuiStatusSnapshot;\n bridgeReady: boolean;\n attached: boolean;\n pendingCommands: DesktopWebuiCommand[];\n pendingFlushTimer: ReturnType<typeof setTimeout> | null;\n pendingFlushAttempts: number;\n}\n\ninterface PendingWebuiCommandAck {\n runtimeId: string;\n timer: ReturnType<typeof setTimeout>;\n fallbackTimer: ReturnType<typeof setTimeout> | null;\n resolve: (handled: boolean) => void;\n}\n\nfunction safeOpenExternal(target: string): void {\n let protocol: string;\n try {\n protocol = new URL(target).protocol;\n } catch {\n return;\n }\n if (OPEN_EXTERNAL_ALLOWED_PROTOCOLS.has(protocol)) {\n void shell.openExternal(target);\n }\n}\n\nlet mainWindow: BaseWindow | null = null;\nlet shellView: WebContentsView | null = null;\nconst webuiViews = new Map<string, DesktopWebuiRuntimeView>();\nlet activeWebuiRuntimeId: string | null = null;\nlet webuiStatus: DesktopWebuiStatusSnapshot = { runtimeId: null, status: 'idle' };\nlet webuiCommandSequence = 0;\nlet shellSidebarCollapsed = false;\nconst pendingWebuiCommandAcks = new Map<string, PendingWebuiCommandAck>();\nlet saveWindowStateTimer: ReturnType<typeof setTimeout> | null = null;\nlet quittingAfterCleanup = false;\n\nasync function createWindow(): Promise<void> {\n await manager.init();\n // Apply the shared display language from config before the first menu build.\n const bootLocale = await readUiLocale();\n if (bootLocale) setMainLocale(bootLocale);\n configureApplicationMenu();\n const windowState = validatedWindowState(manager.getWindowState());\n const windowOptions: BaseWindowConstructorOptions = {\n width: windowState?.width ?? 1320,\n height: windowState?.height ?? 860,\n minWidth: MIN_WINDOW_WIDTH,\n minHeight: MIN_WINDOW_HEIGHT,\n title: tMain('windowTitle'),\n backgroundColor: '#111217',\n };\n if (windowState?.x !== undefined) windowOptions.x = windowState.x;\n if (windowState?.y !== undefined) windowOptions.y = windowState.y;\n mainWindow = new BaseWindow(windowOptions);\n if (windowState?.maximized) {\n mainWindow.maximize();\n }\n\n shellView = new WebContentsView({\n webPreferences: {\n preload: preloadPath(),\n contextIsolation: true,\n nodeIntegration: false,\n sandbox: false,\n },\n });\n mainWindow.contentView.addChildView(shellView);\n // Once the shell renderer has loaded, push the config-backed display language\n // so its chrome (and localStorage cache) follows the shared setting from boot.\n shellView.webContents.once('did-finish-load', () => {\n shellView?.webContents.send(IPC.localeChanged, getMainLocale());\n });\n shellView.webContents.setWindowOpenHandler(({ url }) => {\n safeOpenExternal(url);\n return { action: 'deny' };\n });\n await shellView.webContents.loadFile(rendererIndexPath());\n\n mainWindow.on('resize', layoutViews);\n mainWindow.on('resize', scheduleWindowStateSave);\n mainWindow.on('move', scheduleWindowStateSave);\n mainWindow.on('maximize', scheduleWindowStateSave);\n mainWindow.on('unmaximize', scheduleWindowStateSave);\n mainWindow.on('close', () => {\n if (saveWindowStateTimer) {\n clearTimeout(saveWindowStateTimer);\n saveWindowStateTimer = null;\n }\n void saveWindowState();\n });\n mainWindow.on('closed', () => {\n if (saveWindowStateTimer) {\n clearTimeout(saveWindowStateTimer);\n saveWindowStateTimer = null;\n }\n mainWindow = null;\n disposeAllWebuiEntries();\n shellView = null;\n activeWebuiRuntimeId = null;\n webuiStatus = { runtimeId: null, status: 'idle' };\n });\n layoutViews();\n syncActiveWebuiView();\n void restoreLastWorkspace();\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(width, height);\n}\n\nfunction scheduleWindowStateSave(): void {\n if (saveWindowStateTimer) clearTimeout(saveWindowStateTimer);\n saveWindowStateTimer = setTimeout(() => {\n saveWindowStateTimer = null;\n void saveWindowState();\n }, 350);\n}\n\nasync function saveWindowState(): Promise<void> {\n if (!mainWindow) return;\n const bounds = mainWindow.getNormalBounds();\n await manager.saveWindowState({\n x: bounds.x,\n y: bounds.y,\n width: bounds.width,\n height: bounds.height,\n maximized: mainWindow.isMaximized(),\n });\n}\n\nfunction layoutWebuiViews(windowWidth?: number, windowHeight?: number): void {\n if (!mainWindow) return;\n const size = mainWindow.getContentSize();\n const width = windowWidth ?? size[0] ?? 0;\n const height = windowHeight ?? size[1] ?? 0;\n const snapshot = manager.snapshot();\n const active = snapshot.runtimes.find((runtime) => runtime.id === snapshot.activeRuntimeId);\n const sidebarWidth = desktopSidebarWidth(width);\n const contentWidth = Math.max(0, width - sidebarWidth);\n for (const entry of webuiViews.values()) {\n if (active?.id === entry.runtimeId && active.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\nfunction desktopSidebarWidth(windowWidth: number): number {\n if (shellSidebarCollapsed) 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\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 ensureWebuiEntry(runtimeId: string): DesktopWebuiRuntimeView | null {\n if (!mainWindow) return null;\n const existing = webuiViews.get(runtimeId);\n if (existing) return existing;\n\n const view = new WebContentsView({\n webPreferences: {\n preload: webuiPreloadPath(),\n contextIsolation: true,\n nodeIntegration: false,\n sandbox: false,\n },\n });\n const entry: DesktopWebuiRuntimeView = {\n runtimeId,\n view,\n url: null,\n status: { runtimeId, status: 'idle' },\n bridgeReady: false,\n attached: false,\n pendingCommands: [],\n pendingFlushTimer: null,\n pendingFlushAttempts: 0,\n };\n\n view.webContents.setWindowOpenHandler(({ url }) => {\n safeOpenExternal(url);\n return { action: 'deny' };\n });\n view.webContents.on('will-navigate', (event, url) => {\n if (sameOrigin(url, entry.url)) return;\n event.preventDefault();\n safeOpenExternal(url);\n });\n view.webContents.on('did-start-loading', () => {\n if (webuiViews.get(runtimeId) !== entry) return;\n entry.bridgeReady = false;\n setEntryWebuiStatus(entry, { runtimeId, status: 'loading' });\n });\n view.webContents.on('did-finish-load', () => {\n if (webuiViews.get(runtimeId) !== entry) return;\n schedulePendingWebuiFlush(entry);\n // Seed the locale so a webui mounted AFTER the shell locale was set\n // (e.g. user picks a language, then opens a project) renders in the\n // current language on first paint instead of falling back to en.\n try {\n entry.view.webContents.send(IPC.webuiLocaleChanged, getMainLocale());\n } catch {\n /* webui was destroyed mid-send */\n }\n });\n view.webContents.on('did-fail-load', (_event, errorCode, errorDescription) => {\n if (webuiViews.get(runtimeId) !== entry || errorCode === -3) return;\n setEntryWebuiStatus(entry, {\n runtimeId,\n status: 'error',\n error: errorDescription,\n });\n });\n view.webContents.on('render-process-gone', (_event, details) => {\n if (webuiViews.get(runtimeId) !== entry) return;\n setEntryWebuiStatus(entry, {\n runtimeId,\n status: 'error',\n error: `WebUI renderer exited: ${details.reason}`,\n });\n });\n webuiViews.set(runtimeId, entry);\n return entry;\n}\n\nfunction syncActiveWebuiView(): void {\n if (!mainWindow) return;\n const snapshot = manager.snapshot();\n pruneWebuiEntries(\n snapshot.runtimes\n .filter((runtime) => runtime.status === 'running')\n .map((runtime) => runtime.id),\n );\n const active = snapshot.runtimes.find((runtime) => runtime.id === snapshot.activeRuntimeId);\n if (active?.status !== 'running') {\n activeWebuiRuntimeId = active?.id ?? null;\n publishWebuiStatus({ runtimeId: active?.id ?? null, status: 'idle' });\n layoutWebuiViews();\n return;\n }\n\n const url = manager.getRuntimeUrlWithToken(active.id);\n if (!url) {\n activeWebuiRuntimeId = active.id;\n publishWebuiStatus({ runtimeId: active.id, status: 'idle' });\n layoutWebuiViews();\n return;\n }\n const entry = ensureWebuiEntry(active.id);\n if (!entry) return;\n activeWebuiRuntimeId = active.id;\n attachWebuiEntry(entry);\n layoutWebuiViews();\n publishWebuiStatus(entry.status);\n if (entry.url !== url) {\n entry.url = url;\n entry.bridgeReady = false;\n setEntryWebuiStatus(entry, { runtimeId: active.id, status: 'loading' });\n void entry.view.webContents.loadURL(url).catch((err) => {\n setEntryWebuiStatus(entry, {\n runtimeId: active.id,\n status: 'error',\n error: err instanceof Error ? err.message : String(err),\n });\n console.error('Failed to load desktop WebUI view:', err);\n });\n }\n}\n\nfunction broadcastState(): void {\n if (!shellView || shellView.webContents.isDestroyed()) return;\n shellView.webContents.send(IPC.stateChanged, manager.snapshot());\n}\n\nfunction publishWebuiStatus(next: DesktopWebuiStatusSnapshot): void {\n webuiStatus = next;\n if (!shellView || shellView.webContents.isDestroyed()) return;\n shellView.webContents.send(IPC.webuiStatusChanged, webuiStatus);\n}\n\nfunction setEntryWebuiStatus(\n entry: DesktopWebuiRuntimeView,\n next: DesktopWebuiStatusSnapshot,\n): void {\n const previousPrefs = entry.status.prefs;\n entry.status = {\n ...next,\n prefs: next.prefs ?? entry.status.prefs,\n pendingCommands: entry.pendingCommands.length || undefined,\n };\n if (activeWebuiRuntimeId === entry.runtimeId) {\n publishWebuiStatus(entry.status);\n if (menuRelevantPrefsChanged(previousPrefs, entry.status.prefs)) {\n configureApplicationMenu();\n }\n }\n}\n\nfunction menuRelevantPrefsChanged(\n previous: DesktopWebuiPrefs | undefined,\n next: DesktopWebuiPrefs | undefined,\n): boolean {\n return (\n previous?.yolo !== next?.yolo ||\n previous?.nextPrediction !== next?.nextPrediction ||\n previous?.contextAutoCompact !== next?.contextAutoCompact\n );\n}\n\nfunction runtimeWsUrlOrThrow(runtimeId: string): string {\n const wsUrl = manager.getRuntimeWsUrlWithToken(runtimeId);\n if (!wsUrl) throw new Error(`Runtime not found: ${runtimeId}`);\n return wsUrl;\n}\n\nfunction broadcastLocaleToEmbeddedWebuis(locale: string): void {\n // Push the locale into every running WebUI view so the React WebUI can\n // re-render in the new language instantly (the config-file watcher → WS\n // prefs.updated round-trip would also work but adds a noticeable delay).\n for (const entry of webuiViews.values()) {\n if (entry.view.webContents.isDestroyed()) continue;\n try {\n entry.view.webContents.send(IPC.webuiLocaleChanged, locale);\n } catch {\n /* destroyed mid-send — ignore */\n }\n }\n}\n\nfunction registerIpc(): void {\n ipcMain.handle(IPC.getState, () => manager.snapshot());\n ipcMain.handle(IPC.getConversation, (_event, runtimeId: string) => bridge.snapshot(runtimeId));\n ipcMain.handle(IPC.getWebuiStatus, () => webuiStatus);\n ipcMain.handle(IPC.navigateWebui, async (_event, command: unknown) =>\n dispatchWebuiCommand(command),\n );\n ipcMain.handle(IPC.reloadWebui, async () => reloadActiveWebuiView());\n ipcMain.handle(IPC.setShellSidebarCollapsed, (_event, collapsed: unknown) => {\n setShellSidebarCollapsed(collapsed === true);\n return true;\n });\n ipcMain.handle(IPC.openSettings, async () => openSettings());\n ipcMain.handle(IPC.openProjectSession, async (_event, runtimeId?: string | undefined) => {\n return openProjectSession(runtimeId);\n });\n ipcMain.handle(IPC.openProject, async (_event, requestedRoot?: string | undefined) => {\n return openProject(requestedRoot);\n });\n ipcMain.handle(IPC.registerProject, async (_event, requestedRoot?: string | undefined) => {\n return registerProject(requestedRoot);\n });\n ipcMain.handle(IPC.unregisterProject, async (_event, root: string) => {\n return unregisterProject(root);\n });\n ipcMain.handle(IPC.activateRuntime, async (_event, id: string) => {\n return activateRuntime(id);\n });\n ipcMain.handle(IPC.closeRuntime, async (_event, id: string) => {\n return closeRuntime(id);\n });\n ipcMain.handle(IPC.sendMessage, async (_event, id: string, content: string) =>\n bridge.sendMessage(id, runtimeWsUrlOrThrow(id), content),\n );\n ipcMain.handle(IPC.abortRuntime, async (_event, id: string) =>\n bridge.abort(id, runtimeWsUrlOrThrow(id)),\n );\n ipcMain.handle(IPC.openRuntimeInBrowser, async (_event, id: string) => {\n const url = manager.getRuntimeUrlWithToken(id);\n if (url) safeOpenExternal(url);\n });\n ipcMain.handle(IPC.revealRuntimeRoot, async (_event, id: string) => {\n const runtime = manager.getRuntime(id);\n if (runtime) await shell.openPath(runtime.root);\n });\n ipcMain.on(IPC.webuiReadyChanged, (event, ready: boolean) => {\n const entry = findWebuiEntryBySenderId(event.sender.id);\n if (!entry) return;\n entry.bridgeReady = ready === true;\n if (entry.bridgeReady) {\n setEntryWebuiStatus(entry, { ...entry.status, status: 'ready' });\n schedulePendingWebuiFlush(entry);\n } else if (entry.status.status === 'ready') {\n setEntryWebuiStatus(entry, { ...entry.status, status: 'loading' });\n }\n });\n ipcMain.on(IPC.webuiPrefsChanged, (event, prefs: unknown) => {\n const entry = findWebuiEntryBySenderId(event.sender.id);\n if (!entry) return;\n const sanitized = sanitizeWebuiPrefs(prefs);\n if (Object.keys(sanitized).length === 0) return;\n setEntryWebuiStatus(entry, {\n ...entry.status,\n prefs: { ...(entry.status.prefs ?? {}), ...sanitized },\n });\n });\n ipcMain.on(\n IPC.webuiCommandAck,\n (event, requestId: unknown, handled: unknown, _message?: unknown) => {\n const entry = findWebuiEntryBySenderId(event.sender.id);\n if (!entry || typeof requestId !== 'string') return;\n const pending = pendingWebuiCommandAcks.get(requestId);\n if (!pending || pending.runtimeId !== entry.runtimeId) return;\n settlePendingWebuiCommandAck(requestId, handled === true);\n },\n );\n}\n\nfunction findWebuiEntryBySenderId(senderId: number): DesktopWebuiRuntimeView | undefined {\n return Array.from(webuiViews.values()).find(\n (candidate) => candidate.view.webContents.id === senderId,\n );\n}\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\nasync function dispatchWebuiCommand(commandInput: unknown): Promise<boolean> {\n const command = normalizeDesktopWebuiCommand(commandInput);\n if (!command) return false;\n const entry = getActiveWebuiEntry();\n if (!entry?.url) return false;\n if (entry.status.status !== 'ready') {\n if (!entry.view.webContents.isLoading() && entry.status.status !== 'error') {\n return dispatchWebuiCommandNow(entry, command);\n }\n queueWebuiCommand(entry, command);\n schedulePendingWebuiFlush(entry);\n return true;\n }\n if (!(await isWebuiCommandBridgeReady(entry))) {\n if (!entry.view.webContents.isLoading()) {\n return dispatchWebuiCommandNow(entry, command);\n }\n queueWebuiCommand(entry, command);\n schedulePendingWebuiFlush(entry);\n return true;\n }\n return dispatchWebuiCommandNow(entry, command);\n}\n\nasync function reloadActiveWebuiView(): Promise<boolean> {\n const entry = getActiveWebuiEntry();\n if (!entry?.url) return false;\n entry.bridgeReady = false;\n setEntryWebuiStatus(entry, { runtimeId: entry.runtimeId, status: 'loading' });\n return entry.view.webContents\n .loadURL(entry.url)\n .then(() => true)\n .catch((err) => {\n setEntryWebuiStatus(entry, {\n runtimeId: entry.runtimeId,\n status: 'error',\n error: err instanceof Error ? err.message : String(err),\n });\n console.error('Failed to reload desktop WebUI view:', err);\n return false;\n });\n}\n\nasync function dispatchWebuiCommandNow(\n entry: DesktopWebuiRuntimeView,\n command: DesktopWebuiCommand,\n): Promise<boolean> {\n if (webuiViews.get(entry.runtimeId) !== entry || !entry.url) return false;\n const requestId = nextWebuiCommandRequestId(entry.runtimeId);\n const commandWithRequestId: DesktopWebuiCommand = { ...command, requestId };\n return new Promise<boolean>((resolve) => {\n const fallbackTimer = setTimeout(() => {\n const pending = pendingWebuiCommandAcks.get(requestId);\n if (!pending) return;\n sendWebuiCommandDomFallback(entry, commandWithRequestId);\n }, WEBUI_COMMAND_FALLBACK_MS);\n const timer = setTimeout(() => {\n settlePendingWebuiCommandAck(requestId, false);\n }, WEBUI_COMMAND_ACK_TIMEOUT_MS);\n pendingWebuiCommandAcks.set(requestId, {\n runtimeId: entry.runtimeId,\n timer,\n fallbackTimer,\n resolve,\n });\n try {\n entry.view.webContents.send(IPC.webuiCommand, commandWithRequestId);\n if (activeWebuiRuntimeId === entry.runtimeId) {\n entry.view.webContents.focus();\n }\n } catch {\n settlePendingWebuiCommandAck(requestId, false);\n }\n });\n}\n\nfunction sendWebuiCommandDomFallback(\n entry: DesktopWebuiRuntimeView,\n command: DesktopWebuiCommand,\n): void {\n if (webuiViews.get(entry.runtimeId) !== entry || entry.view.webContents.isDestroyed()) return;\n void entry.view.webContents\n .executeJavaScript(buildWebuiCommandFallbackScript(command), true)\n .catch(() => undefined);\n}\n\nfunction nextWebuiCommandRequestId(runtimeId: string): string {\n webuiCommandSequence += 1;\n return `${runtimeId}:${Date.now()}:${webuiCommandSequence}`;\n}\n\nfunction settlePendingWebuiCommandAck(requestId: string, handled: boolean): void {\n const pending = pendingWebuiCommandAcks.get(requestId);\n if (!pending) return;\n pendingWebuiCommandAcks.delete(requestId);\n clearTimeout(pending.timer);\n if (pending.fallbackTimer) clearTimeout(pending.fallbackTimer);\n if (handled) {\n const entry = webuiViews.get(pending.runtimeId);\n if (entry) {\n entry.bridgeReady = true;\n setEntryWebuiStatus(entry, { ...entry.status, status: 'ready' });\n }\n }\n pending.resolve(handled);\n}\n\nfunction settlePendingWebuiCommandAcksForRuntime(runtimeId: string, handled: boolean): void {\n for (const [requestId, pending] of [...pendingWebuiCommandAcks]) {\n if (pending.runtimeId === runtimeId) {\n settlePendingWebuiCommandAck(requestId, handled);\n }\n }\n}\n\nasync function flushPendingWebuiCommands(entry: DesktopWebuiRuntimeView): Promise<void> {\n if (webuiViews.get(entry.runtimeId) !== entry) return;\n if (entry.pendingCommands.length === 0) return;\n if (!(await isWebuiCommandBridgeReady(entry))) {\n entry.pendingFlushAttempts += 1;\n const canFallback = !entry.view.webContents.isLoading() && entry.pendingFlushAttempts >= 4;\n if (!canFallback && entry.pendingFlushAttempts <= MAX_PENDING_FLUSH_ATTEMPTS) {\n schedulePendingWebuiFlush(entry);\n setEntryWebuiStatus(entry, entry.status);\n return;\n }\n if (!canFallback) {\n entry.pendingCommands.length = 0;\n setEntryWebuiStatus(entry, {\n runtimeId: entry.runtimeId,\n status: 'error',\n error: 'WebUI command bridge did not become ready.',\n });\n return;\n }\n }\n entry.pendingFlushAttempts = 0;\n const commands = entry.pendingCommands.splice(0, entry.pendingCommands.length);\n setEntryWebuiStatus(entry, entry.status);\n for (const command of commands) {\n await dispatchWebuiCommandNow(entry, command).catch(() => undefined);\n }\n}\n\nfunction schedulePendingWebuiFlush(entry: DesktopWebuiRuntimeView): void {\n if (entry.pendingFlushTimer) return;\n entry.pendingFlushTimer = setTimeout(() => {\n entry.pendingFlushTimer = null;\n void flushPendingWebuiCommands(entry);\n }, 250);\n}\n\nasync function isWebuiCommandBridgeReady(entry: DesktopWebuiRuntimeView): Promise<boolean> {\n if (webuiViews.get(entry.runtimeId) !== entry || !entry.url) return false;\n return entry.bridgeReady;\n}\n\nfunction queueWebuiCommand(entry: DesktopWebuiRuntimeView, command: DesktopWebuiCommand): void {\n entry.pendingCommands.push(command);\n if (entry.pendingCommands.length > MAX_PENDING_WEBUI_COMMANDS) {\n entry.pendingCommands.splice(0, entry.pendingCommands.length - MAX_PENDING_WEBUI_COMMANDS);\n }\n entry.pendingFlushAttempts = 0;\n setEntryWebuiStatus(entry, entry.status);\n}\n\nfunction getActiveWebuiEntry(): DesktopWebuiRuntimeView | undefined {\n const activeId = manager.snapshot().activeRuntimeId;\n return activeId ? webuiViews.get(activeId) : undefined;\n}\n\nfunction attachWebuiEntry(entry: DesktopWebuiRuntimeView): void {\n if (!mainWindow) return;\n if (entry.attached) return;\n mainWindow.contentView.addChildView(entry.view);\n entry.attached = true;\n}\n\nfunction pruneWebuiEntries(runtimeIds: string[]): void {\n const live = new Set(runtimeIds);\n for (const [id, entry] of webuiViews) {\n if (!live.has(id)) {\n disposeWebuiEntry(entry);\n }\n }\n}\n\nfunction disposeWebuiEntry(entry: DesktopWebuiRuntimeView): void {\n webuiViews.delete(entry.runtimeId);\n entry.pendingCommands.length = 0;\n settlePendingWebuiCommandAcksForRuntime(entry.runtimeId, false);\n if (entry.pendingFlushTimer) {\n clearTimeout(entry.pendingFlushTimer);\n entry.pendingFlushTimer = null;\n }\n if (mainWindow && entry.attached) {\n mainWindow.contentView.removeChildView(entry.view);\n }\n entry.attached = false;\n if (!entry.view.webContents.isDestroyed()) {\n entry.view.webContents.close();\n }\n if (activeWebuiRuntimeId === entry.runtimeId) activeWebuiRuntimeId = null;\n}\n\nfunction disposeAllWebuiEntries(): void {\n for (const entry of Array.from(webuiViews.values())) {\n disposeWebuiEntry(entry);\n }\n webuiViews.clear();\n}\n\nasync function openProject(\n requestedRoot?: string | undefined,\n): Promise<ReturnType<DesktopRuntimeManager['snapshot']>> {\n let projectRoot = requestedRoot;\n if (!projectRoot) {\n const result = await dialog.showOpenDialog({\n title: tMain('openProject'),\n properties: ['openDirectory'],\n });\n projectRoot = result.filePaths[0];\n }\n if (!projectRoot) return manager.snapshot();\n await manager.openProject(projectRoot);\n syncActiveWebuiView();\n broadcastState();\n return manager.snapshot();\n}\n\nasync function registerProject(\n requestedRoot?: string | undefined,\n): Promise<ReturnType<DesktopRuntimeManager['snapshot']>> {\n let projectRoot = requestedRoot;\n if (!projectRoot) {\n const result = await dialog.showOpenDialog({\n title: tMain('registerProject'),\n properties: ['openDirectory'],\n });\n projectRoot = result.filePaths[0];\n }\n if (!projectRoot) return manager.snapshot();\n await manager.registerProject(projectRoot);\n broadcastState();\n return manager.snapshot();\n}\n\nasync function unregisterProject(\n root: string,\n): Promise<ReturnType<DesktopRuntimeManager['snapshot']>> {\n if (!root || typeof root !== 'string') return manager.snapshot();\n await manager.unregisterProject(root);\n broadcastState();\n return manager.snapshot();\n}\n\nasync function openProjectSession(\n runtimeId?: string | undefined,\n): Promise<ReturnType<DesktopRuntimeManager['snapshot']>> {\n const snapshot = manager.snapshot();\n const runtime =\n (runtimeId ? snapshot.runtimes.find((candidate) => candidate.id === runtimeId) : undefined) ??\n snapshot.runtimes.find((candidate) => candidate.id === snapshot.activeRuntimeId);\n if (runtime?.kind !== 'project') {\n return openProject();\n }\n await manager.openProject(runtime.root, { forceNew: true });\n syncActiveWebuiView();\n broadcastState();\n return manager.snapshot();\n}\n\nasync function openSettings(): Promise<ReturnType<DesktopRuntimeManager['snapshot']>> {\n const snapshot = manager.snapshot();\n const active = snapshot.runtimes.find((runtime) => runtime.id === snapshot.activeRuntimeId);\n if (!active || active.kind === 'global-settings' || active.status !== 'running') {\n const root = desktopSettingsWorkspaceRoot();\n await fs.mkdir(root, { recursive: true });\n await manager.openProject(root, {\n name: 'Global Settings',\n kind: 'global-settings',\n touchRecent: false,\n });\n syncActiveWebuiView();\n broadcastState();\n }\n await dispatchWebuiCommand({ view: 'settings' });\n return manager.snapshot();\n}\n\nasync function activateRuntime(id: string): Promise<ReturnType<DesktopRuntimeManager['snapshot']>> {\n await manager.activateRuntime(id);\n syncActiveWebuiView();\n broadcastState();\n return manager.snapshot();\n}\n\nasync function closeRuntime(id: string): Promise<ReturnType<DesktopRuntimeManager['snapshot']>> {\n bridge.close(id);\n await manager.closeRuntime(id);\n const entry = webuiViews.get(id);\n if (entry) disposeWebuiEntry(entry);\n syncActiveWebuiView();\n broadcastState();\n return manager.snapshot();\n}\n\nasync function restoreLastWorkspace(): Promise<void> {\n await manager.restoreLastWorkspace();\n syncActiveWebuiView();\n broadcastState();\n}\n\nfunction activeRuntimeId(): string | null {\n return manager.snapshot().activeRuntimeId;\n}\n\ninterface ProjectMenuActions {\n activate(runtimeId: string): void;\n activateAndNavigate(runtimeId: string, command: DesktopWebuiCommand): void;\n newSession(runtimeId: string): void;\n openBrowser(runtimeId: string): void;\n reload(runtimeId: string): void;\n close(runtimeId: string): void;\n reveal(runtimeId: string): void;\n}\n\ninterface ProjectMenuGroup {\n key: string;\n name: string;\n root: string;\n sessions: DesktopRuntimeRecord[];\n}\n\nfunction buildProjectsMenu(\n runtimes: DesktopRuntimeRecord[],\n actions: ProjectMenuActions,\n): MenuItemConstructorOptions[] {\n const projectGroups = groupProjectRuntimesForMenu(runtimes);\n const menu: MenuItemConstructorOptions[] = [\n {\n label: tMain('openProjectEllipsis'),\n accelerator: 'CmdOrCtrl+O',\n click: () => void openProject(),\n },\n { label: tMain('registerProjectEllipsis'), click: () => void registerProject() },\n { type: 'separator' },\n ];\n\n if (projectGroups.length === 0) {\n menu.push({ label: tMain('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: tMain('newSession'),\n click: () => actions.newSession(group.sessions[0]?.id ?? ''),\n enabled: Boolean(group.sessions[0]),\n },\n {\n label: tMain('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) => buildSessionMenu(runtime, index + 1, actions)),\n ],\n });\n }\n return menu;\n}\n\nfunction buildSessionMenu(\n runtime: DesktopRuntimeRecord,\n index: number,\n actions: ProjectMenuActions,\n): MenuItemConstructorOptions {\n const running = runtime.status === 'running';\n const label = `${tMain('session')} ${index} · ${runtime.status}`;\n return {\n label,\n submenu: [\n {\n label: tMain('quickView'),\n click: () => actions.activate(runtime.id),\n },\n {\n label: 'WebUI',\n enabled: running,\n submenu: [\n {\n label: tMain('chat'),\n click: () =>\n actions.activateAndNavigate(runtime.id, { activity: 'chat', view: 'chat' }),\n },\n {\n label: tMain('focusPrompt'),\n click: () => actions.activateAndNavigate(runtime.id, { action: 'focus-chat' }),\n },\n {\n label: tMain('terminal'),\n click: () => actions.activateAndNavigate(runtime.id, { terminal: 'toggle' }),\n },\n {\n label: tMain('newTerminal'),\n click: () => actions.activateAndNavigate(runtime.id, { terminal: 'new' }),\n },\n { type: 'separator' },\n {\n label: tMain('files'),\n click: () =>\n actions.activateAndNavigate(runtime.id, { activity: 'files', view: 'files' }),\n },\n {\n label: tMain('changes'),\n click: () =>\n actions.activateAndNavigate(runtime.id, { activity: 'changes', view: 'changes' }),\n },\n {\n label: tMain('sessions'),\n click: () => actions.activateAndNavigate(runtime.id, { view: 'sessions' }),\n },\n {\n label: tMain('fleetHQ'),\n click: () =>\n actions.activateAndNavigate(runtime.id, { activity: 'officemap', view: 'officemap' }),\n },\n {\n label: tMain('settings'),\n click: () => actions.activateAndNavigate(runtime.id, { view: 'settings' }),\n },\n { type: 'separator' },\n {\n label: tMain('commandPalette'),\n click: () =>\n actions.activateAndNavigate(runtime.id, { action: 'open-command-palette' }),\n },\n {\n label: tMain('modelSwitcher'),\n click: () => actions.activateAndNavigate(runtime.id, { action: 'open-model-switcher' }),\n },\n ],\n },\n { type: 'separator' },\n {\n label: tMain('openInBrowser'),\n enabled: running,\n click: () => actions.openBrowser(runtime.id),\n },\n {\n label: tMain('reloadWebui'),\n enabled: running,\n click: () => actions.reload(runtime.id),\n },\n {\n label: tMain('closeSession'),\n click: () => actions.close(runtime.id),\n },\n ],\n };\n}\n\nfunction 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\nfunction normalizeMenuRoot(root: string): string {\n return path.resolve(root).replace(/\\\\/g, '/').replace(/\\/+$/g, '').toLowerCase();\n}\n\nfunction configureApplicationMenu(): void {\n const navigate = (command: DesktopWebuiCommand) => {\n void dispatchWebuiCommand(command);\n };\n const activateAndNavigate = (runtimeId: string, command: DesktopWebuiCommand) => {\n void activateRuntime(runtimeId).then(() => dispatchWebuiCommand(command));\n };\n const reloadRuntimeWebui = (runtimeId: string) => {\n void activateRuntime(runtimeId).then(() => reloadActiveWebuiView());\n };\n const snapshot = manager.snapshot();\n const active = snapshot.runtimes.find((runtime) => runtime.id === snapshot.activeRuntimeId);\n const hasActiveRuntime = Boolean(active);\n const hasActiveWebui = active?.status === 'running';\n const hasActiveProjectWebui = hasActiveWebui && active?.kind === 'project';\n const activeWebuiPrefs = active ? webuiViews.get(active.id)?.status.prefs : undefined;\n const yoloChecked = activeWebuiPrefs?.yolo === true;\n const nextPredictionChecked = activeWebuiPrefs?.nextPrediction === true;\n const contextAutoCompactChecked = activeWebuiPrefs?.contextAutoCompact === true;\n const webuiItem = (item: MenuItemConstructorOptions): MenuItemConstructorOptions => ({\n ...item,\n enabled: item.enabled ?? hasActiveWebui,\n });\n const template: MenuItemConstructorOptions[] = [\n {\n label: tMain('file'),\n submenu: [\n {\n label: tMain('openProjectEllipsis'),\n accelerator: 'CmdOrCtrl+O',\n click: () => void openProject(),\n },\n { label: tMain('registerProjectEllipsis'), click: () => void registerProject() },\n {\n label: tMain('removeActiveFromRegistry'),\n enabled: hasActiveProjectWebui,\n click: () => {\n if (active?.kind === 'project') void unregisterProject(active.root);\n },\n },\n { type: 'separator' },\n {\n label: tMain('newSessionForActive'),\n accelerator: 'CmdOrCtrl+N',\n enabled: hasActiveProjectWebui,\n click: () => void openProjectSession(active?.id),\n },\n {\n label: tMain('settings'),\n accelerator: 'CmdOrCtrl+,',\n click: () => {\n if (hasActiveWebui) navigate({ view: 'settings' });\n else void openSettings();\n },\n },\n { type: 'separator' },\n {\n label: tMain('closeActiveRuntime'),\n accelerator: 'CmdOrCtrl+W',\n enabled: hasActiveRuntime,\n click: () => {\n const id = activeRuntimeId();\n if (id) void closeRuntime(id);\n },\n },\n { type: 'separator' },\n { role: process.platform === 'darwin' ? 'close' : 'quit' },\n ],\n },\n {\n label: tMain('projects'),\n submenu: buildProjectsMenu(snapshot.runtimes, {\n activate: (runtimeId) => void activateRuntime(runtimeId),\n activateAndNavigate,\n newSession: (runtimeId) => void openProjectSession(runtimeId),\n openBrowser: (runtimeId) => {\n const url = manager.getRuntimeUrlWithToken(runtimeId);\n if (url) safeOpenExternal(url);\n },\n reload: reloadRuntimeWebui,\n close: (runtimeId) => void closeRuntime(runtimeId),\n reveal: (runtimeId) => {\n const runtime = manager.getRuntime(runtimeId);\n if (runtime) void shell.openPath(runtime.root);\n },\n }),\n },\n {\n label: tMain('workspace'),\n submenu: [\n webuiItem({\n label: tMain('openChat'),\n accelerator: 'CmdOrCtrl+1',\n click: () => navigate({ activity: 'chat', view: 'chat' }),\n }),\n webuiItem({\n label: tMain('focusPrompt'),\n accelerator: 'CmdOrCtrl+/',\n click: () => navigate({ action: 'focus-chat' }),\n }),\n webuiItem({\n label: tMain('toggleTerminal'),\n accelerator: 'CmdOrCtrl+`',\n click: () => navigate({ terminal: 'toggle' }),\n }),\n webuiItem({ label: tMain('newTerminal'), click: () => navigate({ terminal: 'new' }) }),\n { type: 'separator' },\n webuiItem({\n label: tMain('commandPalette'),\n accelerator: 'CmdOrCtrl+K',\n click: () => navigate({ action: 'open-command-palette' }),\n }),\n webuiItem({\n label: tMain('quickModelSwitcher'),\n accelerator: 'CmdOrCtrl+M',\n click: () => navigate({ action: 'open-model-switcher' }),\n }),\n webuiItem({\n type: 'checkbox',\n label: tMain('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: tMain('nextPrediction'),\n checked: nextPredictionChecked,\n click: () => navigate({ pref: { key: 'nextPrediction', toggle: true } }),\n }),\n webuiItem({\n type: 'checkbox',\n label: tMain('contextAutoCompact'),\n checked: contextAutoCompactChecked,\n click: () => navigate({ pref: { key: 'contextAutoCompact', toggle: true } }),\n }),\n { type: 'separator' },\n webuiItem({\n label: tMain('reloadActiveWebui'),\n accelerator: 'CmdOrCtrl+Shift+R',\n click: () => void reloadActiveWebuiView(),\n }),\n ],\n },\n {\n label: tMain('view'),\n submenu: [\n {\n type: 'checkbox',\n label: tMain('compactDesktopSidebar'),\n accelerator: 'CmdOrCtrl+B',\n checked: shellSidebarCollapsed,\n click: () => setShellSidebarCollapsed(!shellSidebarCollapsed),\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 Menu.setApplicationMenu(Menu.buildFromTemplate(template));\n}\n\nmanager.on('changed', () => {\n configureApplicationMenu();\n syncActiveWebuiView();\n broadcastState();\n});\n\n// Renderer pushes its display locale here so the app menu + native dialogs\n// follow the user's language choice (see preload setLocale + renderer i18n).\n// Persist to the shared config so the change propagates to other surfaces, and\n// broadcast to every embedded WebUI view so the React UI re-renders in the new\n// language instantly (no need to wait for the config-file watcher round-trip).\nipcMain.on(IPC.setLocale, (_event, locale: string) => {\n setMainLocale(locale);\n configureApplicationMenu();\n broadcastLocaleToEmbeddedWebuis(locale);\n void writeUiLocale(locale);\n});\n\n// Live-follow the shared display language: when another process (embedded or\n// standalone webui) writes config.uiLocale, rebuild the app menu, push to the\n// shell renderer, and broadcast to every embedded WebUI view so the React UI\n// follows without a restart.\nwatchProviderConfig(\n desktopConfigPaths.globalConfigPath,\n desktopConfigPaths.vault,\n (snapshot) => {\n if (snapshot.uiLocale === undefined) return;\n setMainLocale(snapshot.uiLocale);\n configureApplicationMenu();\n shellView?.webContents.send(IPC.localeChanged, snapshot.uiLocale);\n broadcastLocaleToEmbeddedWebuis(snapshot.uiLocale);\n },\n { warn: (m) => console.warn(`Config watcher: ${m}`) },\n);\n\nbridge.on('changed', (conversation) => {\n shellView?.webContents.send(IPC.conversationChanged, conversation);\n});\n\napp.on('window-all-closed', () => {\n if (process.platform !== 'darwin') app.quit();\n});\n\napp.on('before-quit', (event) => {\n if (quittingAfterCleanup) return;\n event.preventDefault();\n quittingAfterCleanup = true;\n if (saveWindowStateTimer) {\n clearTimeout(saveWindowStateTimer);\n saveWindowStateTimer = null;\n }\n bridge.closeAll();\n void saveWindowState()\n .catch(() => undefined)\n .finally(() => manager.closeAll({ persistWorkspace: false }).finally(() => app.quit()));\n});\n\napp\n .whenReady()\n .then(async () => {\n registerIpc();\n await createWindow();\n app.on('activate', () => {\n if (mainWindow === null) void createWindow();\n });\n })\n .catch((err) => {\n console.error(err);\n app.exit(1);\n });\n\nfunction sameOrigin(candidate: string, base: string | null): boolean {\n if (!base) return false;\n try {\n const candidateUrl = new URL(candidate);\n const baseUrl = new URL(base);\n return candidateUrl.origin === baseUrl.origin;\n } catch {\n return false;\n }\n}\n\nfunction desktopSettingsWorkspaceRoot(): string {\n return path.join(wstackGlobalRoot(), 'desktop', 'global-settings-workspace');\n}\n\nfunction validatedWindowState(state: DesktopWindowState | null): DesktopWindowState | null {\n if (!state) return null;\n if (state.width < MIN_WINDOW_WIDTH || state.height < MIN_WINDOW_HEIGHT) return null;\n if (state.x === undefined || state.y === undefined) return state;\n const candidate = {\n x: state.x,\n y: state.y,\n width: state.width,\n height: state.height,\n };\n const visibleOnSomeDisplay = screen.getAllDisplays().some((display) => {\n const area = display.workArea;\n return rectanglesIntersect(candidate, area);\n });\n return visibleOnSomeDisplay ? state : null;\n}\n\nfunction rectanglesIntersect(\n left: { x: number; y: number; width: number; height: number },\n right: { x: number; y: number; width: number; height: number },\n): boolean {\n return (\n left.x < right.x + right.width &&\n left.x + left.width > right.x &&\n left.y < right.y + right.height &&\n left.y + left.height > right.y\n );\n}\n","export const IPC = {\n getState: 'desktop:get-state',\n getConversation: 'desktop:get-conversation',\n getWebuiStatus: 'desktop:get-webui-status',\n openProject: 'desktop:open-project',\n registerProject: 'desktop:register-project',\n unregisterProject: 'desktop:unregister-project',\n openProjectSession: 'desktop:open-project-session',\n activateRuntime: 'desktop:activate-runtime',\n closeRuntime: 'desktop:close-runtime',\n navigateWebui: 'desktop:navigate-webui',\n reloadWebui: 'desktop:reload-webui',\n setShellSidebarCollapsed: 'desktop:set-shell-sidebar-collapsed',\n openSettings: 'desktop:open-settings',\n sendMessage: 'desktop:send-message',\n abortRuntime: 'desktop:abort-runtime',\n openRuntimeInBrowser: 'desktop:open-runtime-in-browser',\n revealRuntimeRoot: 'desktop:reveal-runtime-root',\n stateChanged: 'desktop:state-changed',\n conversationChanged: 'desktop:conversation-changed',\n webuiStatusChanged: 'desktop:webui-status-changed',\n webuiReadyChanged: 'desktop:webui-ready-changed',\n webuiPrefsChanged: 'desktop:webui-prefs-changed',\n webuiCommandAck: 'desktop:webui-command-ack',\n webuiCommand: 'desktop:webui-command',\n shellSidebarCollapsedChanged: 'desktop:shell-sidebar-collapsed-changed',\n setLocale: 'desktop:set-locale',\n localeChanged: 'desktop:locale-changed',\n // Embedded WebUI view side — the desktop shell pushes locale changes here\n // so the React WebUI inside Electron can swap i18n instantly, without waiting\n // for the config-file watcher → WS prefs.updated round-trip.\n webuiLocaleChanged: 'desktop:webui-locale-changed',\n} as const;\n","/**\n * Main-process i18n for the Electron app menu + native dialogs.\n *\n * The renderer has its own i18n (localStorage-backed, see renderer/src/i18n.ts),\n * but the MAIN process (Node) builds the application menu and native dialogs and\n * can't touch localStorage. This is a small, self-contained catalog for those\n * main-process strings. The locale is pushed from the renderer via the\n * 'desktop:set-locale' IPC channel (see preload.ts + renderer setLocale()).\n *\n * Defaults to 'en'; falls back to 'en' for any missing key.\n */\nexport type DesktopLocale = 'en' | 'tr' | 'de' | 'fr' | 'it' | 'es' | 'pt-BR';\n\ntype Catalog = Record<string, string>;\n\nconst en: Catalog = {\n windowTitle: 'WrongStack Desktop',\n noOpenProjectSessions: 'No open project sessions',\n revealProjectFolder: 'Reveal Project Folder',\n quickView: 'Quick View',\n chat: 'Chat',\n terminal: 'Terminal',\n session: 'Session',\n newSession: 'New Session',\n file: 'File',\n view: 'View',\n workspace: 'Workspace',\n projects: 'Projects',\n openProject: 'Open Project',\n registerProject: 'Register Project',\n openProjectEllipsis: 'Open Project…',\n registerProjectEllipsis: 'Register Project…',\n removeActiveFromRegistry: 'Remove Active Project from Registry',\n newSessionForActive: 'New Session for Active Project',\n settings: 'Settings',\n closeActiveRuntime: 'Close Active Runtime',\n openChat: 'Open Chat',\n focusPrompt: 'Focus Prompt',\n toggleTerminal: 'Toggle Terminal',\n newTerminal: 'New Terminal',\n files: 'Files',\n changes: 'Changes',\n sessions: 'Sessions',\n fleetHQ: 'Fleet HQ',\n commandPalette: 'Command Palette',\n modelSwitcher: 'Model Switcher',\n quickModelSwitcher: 'Quick Model Switcher',\n openInBrowser: 'Open in Browser',\n reloadWebui: 'Reload WebUI',\n reloadActiveWebui: 'Reload Active WebUI',\n closeSession: 'Close Session',\n yoloMode: 'YOLO Mode',\n nextPrediction: 'Next Prediction',\n contextAutoCompact: 'Context Auto Compact',\n compactDesktopSidebar: 'Compact Desktop Sidebar',\n};\n\nconst tr: Catalog = {\n windowTitle: 'WrongStack Desktop',\n noOpenProjectSessions: 'Açık proje oturumu yok',\n revealProjectFolder: 'Proje klasörünü göster',\n quickView: 'Hızlı görünüm',\n chat: 'Sohbet',\n terminal: 'Terminal',\n session: 'Oturum',\n newSession: 'Yeni Oturum',\n file: 'Dosya',\n view: 'Görünüm',\n workspace: 'Çalışma alanı',\n projects: 'Projeler',\n openProject: 'Proje Aç',\n registerProject: 'Proje Kaydet',\n openProjectEllipsis: 'Proje Aç…',\n registerProjectEllipsis: 'Proje Kaydet…',\n removeActiveFromRegistry: 'Aktif Projeyi Kayıttan Kaldır',\n newSessionForActive: 'Aktif Proje için Yeni Oturum',\n settings: 'Ayarlar',\n closeActiveRuntime: 'Aktif Çalışma Zamanını Kapat',\n openChat: 'Sohbeti Aç',\n focusPrompt: 'İsteme Odaklan',\n toggleTerminal: 'Terminali Aç/Kapat',\n newTerminal: 'Yeni Terminal',\n files: 'Dosyalar',\n changes: 'Değişiklikler',\n sessions: 'Oturumlar',\n fleetHQ: 'Filo HQ',\n commandPalette: 'Komut Paleti',\n modelSwitcher: 'Model Değiştirici',\n quickModelSwitcher: 'Hızlı Model Değiştirici',\n openInBrowser: 'Tarayıcıda Aç',\n reloadWebui: 'WebUI Yeniden Yükle',\n reloadActiveWebui: 'Aktif WebUI Yeniden Yükle',\n closeSession: 'Oturumu Kapat',\n yoloMode: 'YOLO Modu',\n nextPrediction: 'Sonraki Tahmin',\n contextAutoCompact: 'Bağlamı Otomatik Sıkıştır',\n compactDesktopSidebar: 'Masaüstü Kenar Çubuğunu Daralt',\n};\n\nconst de: Catalog = {\n windowTitle: 'WrongStack Desktop',\n noOpenProjectSessions: 'Keine offenen Projektsessions',\n revealProjectFolder: 'Projektordner anzeigen',\n quickView: 'Schnellansicht',\n chat: 'Chat',\n terminal: 'Terminal',\n session: 'Sitzung',\n newSession: 'Neue Sitzung',\n file: 'Datei',\n view: 'Ansicht',\n workspace: 'Workspace',\n projects: 'Projekte',\n openProject: 'Projekt öffnen',\n registerProject: 'Projekt registrieren',\n openProjectEllipsis: 'Projekt öffnen…',\n registerProjectEllipsis: 'Projekt registrieren…',\n removeActiveFromRegistry: 'Aktives Projekt aus Registry entfernen',\n newSessionForActive: 'Neue Sitzung für aktives Projekt',\n settings: 'Einstellungen',\n closeActiveRuntime: 'Aktive Runtime schließen',\n openChat: 'Chat öffnen',\n focusPrompt: 'Prompt fokussieren',\n toggleTerminal: 'Terminal umschalten',\n newTerminal: 'Neues Terminal',\n files: 'Dateien',\n changes: 'Änderungen',\n sessions: 'Sitzungen',\n fleetHQ: 'Fleet HQ',\n commandPalette: 'Command Palette',\n modelSwitcher: 'Modell-Umschalter',\n quickModelSwitcher: 'Schneller Modell-Umschalter',\n openInBrowser: 'Im Browser öffnen',\n reloadWebui: 'WebUI neu laden',\n reloadActiveWebui: 'Aktive WebUI neu laden',\n closeSession: 'Sitzung schließen',\n yoloMode: 'YOLO-Modus',\n nextPrediction: 'Next-Step-Vorhersage',\n contextAutoCompact: 'Kontext auto-kompaktieren',\n compactDesktopSidebar: 'Desktop-Seitenleiste einklappen',\n};\n\nconst fr: Catalog = {\n windowTitle: 'WrongStack Desktop',\n noOpenProjectSessions: 'Aucune session de projet ouverte',\n revealProjectFolder: 'Révéler le dossier du projet',\n quickView: 'Vue rapide',\n chat: 'Chat',\n terminal: 'Terminal',\n session: 'Session',\n newSession: 'Nouvelle session',\n file: 'Fichier',\n view: 'Affichage',\n workspace: 'Espace de travail',\n projects: 'Projets',\n openProject: 'Ouvrir un projet',\n registerProject: 'Enregistrer le projet',\n openProjectEllipsis: 'Ouvrir un projet…',\n registerProjectEllipsis: 'Enregistrer le projet…',\n removeActiveFromRegistry: \"Retirer le projet actif du registre\",\n newSessionForActive: 'Nouvelle session pour le projet actif',\n settings: 'Paramètres',\n closeActiveRuntime: \"Fermer l'exécution active\",\n openChat: 'Ouvrir le chat',\n focusPrompt: 'Focaliser le prompt',\n toggleTerminal: 'Basculer le terminal',\n newTerminal: 'Nouveau terminal',\n files: 'Fichiers',\n changes: 'Modifications',\n sessions: 'Sessions',\n fleetHQ: 'Fleet HQ',\n commandPalette: 'Palette de commandes',\n modelSwitcher: 'Sélecteur de modèle',\n quickModelSwitcher: 'Sélecteur de modèle rapide',\n openInBrowser: 'Ouvrir dans le navigateur',\n reloadWebui: 'Recharger WebUI',\n reloadActiveWebui: 'Recharger WebUI actif',\n closeSession: 'Fermer la session',\n yoloMode: 'Mode YOLO',\n nextPrediction: 'Prédiction du prochain pas',\n contextAutoCompact: 'Compacter le contexte auto',\n compactDesktopSidebar: 'Réduire la barre latérale',\n};\n\nconst it: Catalog = {\n windowTitle: 'WrongStack Desktop',\n noOpenProjectSessions: 'Nessuna sessione di progetto aperta',\n revealProjectFolder: 'Rivela cartella progetto',\n quickView: 'Vista rapida',\n chat: 'Chat',\n terminal: 'Terminale',\n session: 'Sessione',\n newSession: 'Nuova sessione',\n file: 'File',\n view: 'Visualizza',\n workspace: 'Workspace',\n projects: 'Progetti',\n openProject: 'Apri progetto',\n registerProject: 'Registra progetto',\n openProjectEllipsis: 'Apri progetto…',\n registerProjectEllipsis: 'Registra progetto…',\n removeActiveFromRegistry: 'Rimuovi progetto attivo dal registro',\n newSessionForActive: 'Nuova sessione per il progetto attivo',\n settings: 'Impostazioni',\n closeActiveRuntime: 'Chiudi runtime attivo',\n openChat: 'Apri chat',\n focusPrompt: 'Focalizza prompt',\n toggleTerminal: 'Attiva/disattiva terminale',\n newTerminal: 'Nuovo terminale',\n files: 'File',\n changes: 'Modifiche',\n sessions: 'Sessioni',\n fleetHQ: 'Fleet HQ',\n commandPalette: 'Palette comandi',\n modelSwitcher: 'Selettore modello',\n quickModelSwitcher: 'Selettore modello rapido',\n openInBrowser: 'Apri nel browser',\n reloadWebui: 'Ricarica WebUI',\n reloadActiveWebui: 'Ricarica WebUI attivo',\n closeSession: 'Chiudi sessione',\n yoloMode: 'Modalità YOLO',\n nextPrediction: 'Predizione prossimo passo',\n contextAutoCompact: 'Compatta contesto auto',\n compactDesktopSidebar: 'Comprimi barra laterale desktop',\n};\n\nconst es: Catalog = {\n windowTitle: 'WrongStack Desktop',\n noOpenProjectSessions: 'Sin sesiones de proyecto abiertas',\n revealProjectFolder: 'Revelar carpeta del proyecto',\n quickView: 'Vista rápida',\n chat: 'Chat',\n terminal: 'Terminal',\n session: 'Sesión',\n newSession: 'Nueva sesión',\n file: 'Archivo',\n view: 'Ver',\n workspace: 'Espacio de trabajo',\n projects: 'Proyectos',\n openProject: 'Abrir proyecto',\n registerProject: 'Registrar proyecto',\n openProjectEllipsis: 'Abrir proyecto…',\n registerProjectEllipsis: 'Registrar proyecto…',\n removeActiveFromRegistry: 'Quitar proyecto activo del registro',\n newSessionForActive: 'Nueva sesión para el proyecto activo',\n settings: 'Ajustes',\n closeActiveRuntime: 'Cerrar runtime activo',\n openChat: 'Abrir chat',\n focusPrompt: 'Focalizar indicación',\n toggleTerminal: 'Alternar terminal',\n newTerminal: 'Nuevo terminal',\n files: 'Archivos',\n changes: 'Cambios',\n sessions: 'Sesiones',\n fleetHQ: 'Fleet HQ',\n commandPalette: 'Paleta de comandos',\n modelSwitcher: 'Selector de modelo',\n quickModelSwitcher: 'Selector de modelo rápido',\n openInBrowser: 'Abrir en el navegador',\n reloadWebui: 'Recargar WebUI',\n reloadActiveWebui: 'Recargar WebUI activo',\n closeSession: 'Cerrar sesión',\n yoloMode: 'Modo YOLO',\n nextPrediction: 'Predicción del siguiente paso',\n contextAutoCompact: 'Auto-compactar contexto',\n compactDesktopSidebar: 'Contraer barra lateral de escritorio',\n};\n\nconst ptBR: Catalog = {\n windowTitle: 'WrongStack Desktop',\n noOpenProjectSessions: 'Sem sessões de projeto abertas',\n revealProjectFolder: 'Revelar pasta do projeto',\n quickView: 'Vista rápida',\n chat: 'Chat',\n terminal: 'Terminal',\n session: 'Sessão',\n newSession: 'Nova sessão',\n file: 'Arquivo',\n view: 'Ver',\n workspace: 'Workspace',\n projects: 'Projetos',\n openProject: 'Abrir projeto',\n registerProject: 'Registrar projeto',\n openProjectEllipsis: 'Abrir projeto…',\n registerProjectEllipsis: 'Registrar projeto…',\n removeActiveFromRegistry: 'Remover projeto ativo do registro',\n newSessionForActive: 'Nova sessão para o projeto ativo',\n settings: 'Configurações',\n closeActiveRuntime: 'Fechar runtime ativo',\n openChat: 'Abrir chat',\n focusPrompt: 'Focar prompt',\n toggleTerminal: 'Alternar terminal',\n newTerminal: 'Novo terminal',\n files: 'Arquivos',\n changes: 'Alterações',\n sessions: 'Sessões',\n fleetHQ: 'Fleet HQ',\n commandPalette: 'Paleta de comandos',\n modelSwitcher: 'Seletor de modelo',\n quickModelSwitcher: 'Seletor de modelo rápido',\n openInBrowser: 'Abrir no navegador',\n reloadWebui: 'Recarregar WebUI',\n reloadActiveWebui: 'Recarregar WebUI ativo',\n closeSession: 'Fechar sessão',\n yoloMode: 'Modo YOLO',\n nextPrediction: 'Previsão do próximo passo',\n contextAutoCompact: 'Auto-compactar contexto',\n compactDesktopSidebar: 'Recolher barra lateral do desktop',\n};\n\nconst CATALOGS: Record<DesktopLocale, Catalog> = { en, tr, de, fr, it, es, 'pt-BR': ptBR };\n\nlet mainLocale: DesktopLocale = 'en';\n\n/** Renderer pushes its locale here via the 'desktop:set-locale' IPC channel. */\nexport function setMainLocale(locale: string): void {\n if (locale in CATALOGS) mainLocale = locale as DesktopLocale;\n}\n\n/** Current main-process locale (for the boot push to the shell renderer). */\nexport function getMainLocale(): DesktopLocale {\n return mainLocale;\n}\n\n/** Translate a main-process key, falling back to en then the key itself. */\nexport function tMain(key: string): string {\n return CATALOGS[mainLocale]?.[key] ?? CATALOGS.en[key] ?? key;\n}\n","/**\n * Desktop-shell read/write of the shared display language (`Config.uiLocale`).\n *\n * The desktop main process can't use the WebUI's localStorage-backed i18n, and\n * it isn't a WS client, so it touches `~/.wrongstack/config.json` directly to\n * (a) read the language at boot and (b) persist a change made in the shell —\n * using the SAME read → decrypt → mutate → encrypt → atomicWrite cycle as the\n * WebUI server (`pref-helpers.updateGlobalConfig`) so encrypted secrets in the\n * file are preserved byte-for-byte.\n *\n * The standalone WebUI's `watchProviderConfig` (now surfacing `uiLocale`) lets\n * a running shell follow a language change written by any other process.\n */\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\nimport { DefaultSecretVault } from '@wrongstack/core';\nimport { decryptConfigSecrets, encryptConfigSecrets } from '@wrongstack/core/security';\nimport { atomicWrite, wstackGlobalRoot } from '@wrongstack/core/utils';\nimport type { SecretVault } from '@wrongstack/core';\n\nconst globalConfigPath = path.join(wstackGlobalRoot(), 'config.json');\nconst vault: SecretVault = new DefaultSecretVault({\n keyFile: path.join(wstackGlobalRoot(), '.key'),\n});\n\n/** Read the persisted display language, or undefined when unset/unreadable. */\nexport async function readUiLocale(): Promise<string | undefined> {\n let raw: string;\n try {\n raw = await fs.readFile(globalConfigPath, 'utf8');\n } catch {\n return undefined;\n }\n try {\n const decrypted = decryptConfigSecrets(\n JSON.parse(raw) as Record<string, unknown>,\n vault,\n ) as { uiLocale?: string };\n const value = decrypted.uiLocale;\n return typeof value === 'string' && value ? value : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** The global config path + vault, for the live watcher in main.ts. */\nexport const desktopConfigPaths = { globalConfigPath, vault } as const;\n\n/**\n * Persist a display-language change. Refuses to overwrite a corrupt config\n * (the operator should fix it). Best-effort: never throws to the caller.\n */\nexport async function writeUiLocale(code: string): Promise<void> {\n let raw: string;\n try {\n raw = await fs.readFile(globalConfigPath, 'utf8');\n } catch {\n raw = '{}';\n }\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(raw) as Record<string, unknown>;\n } catch {\n return; // corrupt config — don't clobber\n }\n const decrypted = decryptConfigSecrets(parsed, vault) as Record<string, unknown>;\n decrypted.uiLocale = code;\n const encrypted = encryptConfigSecrets(decrypted, vault);\n await atomicWrite(globalConfigPath, JSON.stringify(encrypted, null, 2), { mode: 0o600 });\n}\n","import { type ChildProcess, spawn } from 'node:child_process';\nimport { randomBytes } from 'node:crypto';\nimport { EventEmitter } from 'node:events';\nimport * as fs from 'node:fs/promises';\nimport * as http from 'node:http';\nimport { createRequire } from 'node:module';\nimport * as net from 'node:net';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { atomicWrite, projectSlug, toErrorMessage, wstackGlobalRoot } from '@wrongstack/core/utils';\nimport type {\n DesktopProjectEntry,\n DesktopRuntimeKind,\n DesktopRuntimeRecord,\n DesktopStateSnapshot,\n DesktopWindowState,\n} from '../shared/types.js';\n\ninterface DesktopStateFile {\n recentProjects?: DesktopProjectEntry[] | undefined;\n openProjects?: string[] | undefined;\n openProjectSessions?: DesktopProjectSessionState[] | undefined;\n activeRuntimeId?: string | null | undefined;\n activeProjectRoot?: string | null | undefined;\n window?: DesktopWindowState | undefined;\n}\n\ninterface DesktopProjectSessionState {\n runtimeId?: string | undefined;\n name?: string | undefined;\n root: string;\n startedAt?: string | undefined;\n}\n\ninterface RuntimeInternal extends DesktopRuntimeRecord {\n child: ChildProcess | null;\n token: string;\n logs: string[];\n logNotifyTimer: ReturnType<typeof setTimeout> | null;\n}\n\ninterface OpenProjectOptions {\n name?: string | undefined;\n kind?: DesktopRuntimeKind | undefined;\n touchRecent?: boolean | undefined;\n forceNew?: boolean | undefined;\n runtimeId?: string | undefined;\n}\n\nconst HTTP_PORT_START = 34560;\nconst WS_PORT_START = 34660;\nconst START_TIMEOUT_MS = 30_000;\nconst MIN_WINDOW_WIDTH = 760;\nconst MIN_WINDOW_HEIGHT = 520;\n\nexport class DesktopRuntimeManager extends EventEmitter {\n private readonly runtimes = new Map<string, RuntimeInternal>();\n private readonly stateFile = path.join(wstackGlobalRoot(), 'desktop.json');\n private recentProjects: DesktopProjectEntry[] = [];\n private registeredProjects: DesktopProjectEntry[] = [];\n private restoreProjectSessions: DesktopProjectSessionState[] = [];\n private restoreActiveRuntimeId: string | null = null;\n private restoreActiveProjectRoot: string | null = null;\n private lastActiveProjectRoot: string | null = null;\n private windowState: DesktopWindowState | null = null;\n private activeRuntimeId: string | null = null;\n private restoring = false;\n private workspaceRestoreCompleted = false;\n\n async init(): Promise<void> {\n const state = await this.loadDesktopState();\n this.recentProjects = state.recentProjects;\n this.registeredProjects = await readGlobalProjectManifest();\n this.restoreProjectSessions = state.openProjectSessions;\n this.restoreActiveRuntimeId = state.activeRuntimeId;\n this.restoreActiveProjectRoot = state.activeProjectRoot;\n this.lastActiveProjectRoot = state.activeProjectRoot;\n this.windowState = state.window;\n }\n\n snapshot(): DesktopStateSnapshot {\n return {\n activeRuntimeId: this.activeRuntimeId,\n runtimes: Array.from(this.runtimes.values()).map(publicRuntime),\n recentProjects: [...this.recentProjects],\n registeredProjects: [...this.registeredProjects],\n restoring: this.restoring,\n };\n }\n\n getWindowState(): DesktopWindowState | null {\n return this.windowState ? { ...this.windowState } : null;\n }\n\n async saveWindowState(window: DesktopWindowState): Promise<void> {\n this.windowState = { ...window };\n await this.saveDesktopState();\n }\n\n async restoreLastWorkspace(): Promise<void> {\n const sessions = this.restoreProjectSessions.filter(\n (session) => typeof session.root === 'string' && session.root.trim(),\n );\n if (sessions.length === 0 || this.restoring || this.runtimes.size > 0) {\n this.workspaceRestoreCompleted = true;\n return;\n }\n this.restoring = true;\n this.emitChanged();\n try {\n const seen = new Map<string, number>();\n for (const session of sessions) {\n const key = pathKey(session.root);\n const seenCount = seen.get(key) ?? 0;\n seen.set(key, seenCount + 1);\n await this.openProject(session.root, {\n forceNew: seenCount > 0,\n name: session.name,\n runtimeId: session.runtimeId,\n }).catch((err) => {\n process.stderr.write(\n `[desktop:restore] Failed to restore ${session.root}: ${toErrorMessage(err)}\\n`,\n );\n });\n }\n let restoredActive = false;\n if (this.restoreActiveRuntimeId) {\n const active = this.runtimes.get(this.restoreActiveRuntimeId);\n if (active) {\n await this.activateRuntime(active.id);\n restoredActive = true;\n }\n }\n if (!restoredActive && this.restoreActiveProjectRoot) {\n const active = Array.from(this.runtimes.values()).find((runtime) =>\n samePath(runtime.root, this.restoreActiveProjectRoot ?? ''),\n );\n if (active) await this.activateRuntime(active.id);\n }\n } finally {\n this.restoring = false;\n this.workspaceRestoreCompleted = true;\n this.emitChanged();\n await this.saveDesktopState();\n }\n }\n\n getRuntime(id: string): DesktopRuntimeRecord | undefined {\n const runtime = this.runtimes.get(id);\n return runtime ? publicRuntime(runtime) : undefined;\n }\n\n getRuntimeUrlWithToken(id: string): string | undefined {\n const runtime = this.runtimes.get(id);\n if (!runtime) return undefined;\n const url = new URL(runtime.url);\n url.searchParams.set('token', runtime.token);\n url.searchParams.set('shell', 'desktop');\n return url.toString();\n }\n\n getRuntimeWsUrlWithToken(id: string): string | undefined {\n const runtime = this.runtimes.get(id);\n if (!runtime) return undefined;\n const url = new URL(`ws://127.0.0.1:${runtime.wsPort}`);\n url.searchParams.set('token', runtime.token);\n return url.toString();\n }\n\n async openProject(\n projectRoot: string,\n options: OpenProjectOptions = {},\n ): Promise<DesktopRuntimeRecord> {\n const resolved = path.resolve(projectRoot);\n const stat = await fs.stat(resolved).catch(() => null);\n if (!stat?.isDirectory()) throw new Error(`Not a directory: ${resolved}`);\n const kind = options.kind ?? 'project';\n const touchRecent = options.touchRecent ?? kind === 'project';\n const forceNew = options.forceNew === true;\n\n if (!forceNew) {\n const existing = Array.from(this.runtimes.values()).find(\n (runtime) =>\n samePath(runtime.root, resolved) &&\n runtime.kind === kind &&\n (runtime.status === 'starting' || runtime.status === 'running'),\n );\n if (existing) {\n this.activeRuntimeId = existing.id;\n if (existing.kind === 'project') this.lastActiveProjectRoot = existing.root;\n if (touchRecent) {\n await this.touchProject(existing.root);\n } else {\n await this.persistWorkspaceState();\n }\n this.emitChanged();\n return publicRuntime(existing);\n }\n const staleSameRoot = Array.from(this.runtimes.values()).filter(\n (runtime) => samePath(runtime.root, resolved) && runtime.kind === kind,\n );\n for (const stale of staleSameRoot) {\n await this.closeRuntimeInternal(stale.id, { persistWorkspace: false });\n }\n }\n\n const slug = projectSlug(resolved);\n const requestedRuntimeId = normalizeRuntimeId(options.runtimeId);\n const runtimeId =\n requestedRuntimeId && !this.runtimes.has(requestedRuntimeId)\n ? requestedRuntimeId\n : `${slug}-${randomBytes(3).toString('hex')}`;\n const name = options.name ?? nextRuntimeName(this.runtimes, resolved, kind);\n const httpPort = await findFreePort(HTTP_PORT_START, usedPorts(this.runtimes));\n const wsPort = await findFreePort(\n WS_PORT_START,\n new Set([...usedPorts(this.runtimes), httpPort]),\n );\n const token = randomBytes(24).toString('hex');\n const runtime: RuntimeInternal = {\n id: runtimeId,\n name,\n root: resolved,\n slug,\n kind,\n status: 'starting',\n httpPort,\n wsPort,\n url: `http://127.0.0.1:${httpPort}`,\n startedAt: new Date().toISOString(),\n token,\n child: null,\n logs: [],\n logNotifyTimer: null,\n };\n this.runtimes.set(runtimeId, runtime);\n this.activeRuntimeId = runtimeId;\n if (kind === 'project') this.lastActiveProjectRoot = resolved;\n if (touchRecent) {\n await this.touchProject(resolved);\n } else {\n await this.persistWorkspaceState();\n }\n this.emitChanged();\n\n try {\n const entry = resolveWebUiEntry();\n const child = spawn(\n process.execPath,\n [\n entry,\n '--host',\n '127.0.0.1',\n '--port',\n String(httpPort),\n '--ws-port',\n String(wsPort),\n '--token',\n token,\n '--require-token',\n ],\n {\n cwd: resolved,\n env: {\n ...process.env,\n ELECTRON_RUN_AS_NODE: '1',\n WEBUI_STRICT_PORT: '1',\n WRONGSTACK_DESKTOP: '1',\n },\n stdio: ['ignore', 'pipe', 'pipe'],\n windowsHide: true,\n },\n );\n runtime.child = child;\n runtime.pid = child.pid;\n child.stdout?.on('data', (chunk: Buffer) => {\n const text = chunk.toString();\n appendRuntimeLog(runtime, 'stdout', text);\n this.scheduleLogChanged(runtime);\n process.stdout.write(`[desktop:${runtime.id}] ${text}`);\n });\n child.stderr?.on('data', (chunk: Buffer) => {\n const text = chunk.toString();\n appendRuntimeLog(runtime, 'stderr', text);\n this.scheduleLogChanged(runtime);\n process.stderr.write(`[desktop:${runtime.id}] ${text}`);\n });\n child.once('exit', (code, signal) => {\n runtime.status = runtime.status === 'error' ? 'error' : 'stopped';\n runtime.error =\n runtime.status === 'error'\n ? runtime.error\n : code === 0\n ? undefined\n : `Exited with ${signal ?? `code ${code ?? 'unknown'}`}`;\n runtime.child = null;\n if (this.activeRuntimeId === runtime.id) {\n this.activeRuntimeId = firstRunningRuntimeId(this.runtimes);\n }\n this.emitChanged();\n });\n\n await waitForHttpReady(runtime.url, token, START_TIMEOUT_MS);\n runtime.status = 'running';\n await this.persistWorkspaceState();\n this.emitChanged();\n return publicRuntime(runtime);\n } catch (err) {\n runtime.status = 'error';\n runtime.error = toErrorMessage(err);\n await terminateProcessTree(runtime.child);\n runtime.child = null;\n this.emitChanged();\n throw err;\n }\n }\n\n async activateRuntime(id: string): Promise<void> {\n const runtime = this.runtimes.get(id);\n if (!runtime) throw new Error(`Runtime not found: ${id}`);\n this.activeRuntimeId = id;\n if (runtime.kind === 'project') this.lastActiveProjectRoot = runtime.root;\n if (runtime.kind === 'project') {\n await this.touchProject(runtime.root);\n } else {\n await this.persistWorkspaceState();\n }\n this.emitChanged();\n }\n\n async closeRuntime(id: string): Promise<void> {\n await this.closeRuntimeInternal(id, { persistWorkspace: true });\n }\n\n async closeAll(options: { persistWorkspace?: boolean } = {}): Promise<void> {\n const persistWorkspace = options.persistWorkspace ?? true;\n await Promise.all(\n Array.from(this.runtimes.keys()).map((id) =>\n this.closeRuntimeInternal(id, { persistWorkspace }),\n ),\n );\n }\n\n async registerProject(projectRoot: string): Promise<void> {\n const resolved = path.resolve(projectRoot);\n const stat = await fs.stat(resolved).catch(() => null);\n if (!stat?.isDirectory()) throw new Error(`Not a directory: ${resolved}`);\n const now = new Date().toISOString();\n const entry: DesktopProjectEntry = {\n name: path.basename(resolved) || resolved,\n root: resolved,\n slug: projectSlug(resolved),\n lastSeen: now,\n lastWorkingDir: resolved,\n };\n this.registeredProjects = await touchGlobalProjectManifest(entry);\n this.emitChanged();\n }\n\n async unregisterProject(projectRoot: string): Promise<void> {\n const resolved = path.resolve(projectRoot);\n this.registeredProjects = await removeGlobalProjectManifest(resolved);\n this.recentProjects = this.recentProjects.filter((project) => !samePath(project.root, resolved));\n await this.saveDesktopState();\n this.emitChanged();\n }\n\n private async closeRuntimeInternal(\n id: string,\n options: { persistWorkspace: boolean },\n ): Promise<void> {\n const runtime = this.runtimes.get(id);\n if (!runtime) return;\n runtime.status = 'stopped';\n const child = runtime.child;\n runtime.child = null;\n await terminateProcessTree(child);\n if (runtime.logNotifyTimer) {\n clearTimeout(runtime.logNotifyTimer);\n runtime.logNotifyTimer = null;\n }\n this.runtimes.delete(id);\n if (this.activeRuntimeId === id) this.activeRuntimeId = firstRunningRuntimeId(this.runtimes);\n if (this.lastActiveProjectRoot && samePath(this.lastActiveProjectRoot, runtime.root)) {\n this.lastActiveProjectRoot = firstProjectRuntimeRoot(this.runtimes);\n }\n if (options.persistWorkspace) {\n await this.persistWorkspaceState();\n }\n this.emitChanged();\n }\n\n private async touchProject(projectRoot: string): Promise<void> {\n const resolved = path.resolve(projectRoot);\n const now = new Date().toISOString();\n const entry: DesktopProjectEntry = {\n name: path.basename(resolved) || resolved,\n root: resolved,\n slug: projectSlug(resolved),\n lastSeen: now,\n lastWorkingDir: resolved,\n };\n this.recentProjects = [\n entry,\n ...this.recentProjects.filter((p) => !samePath(p.root, resolved)),\n ].slice(0, 24);\n const [, registeredProjects] = await Promise.all([\n this.saveDesktopState(),\n touchGlobalProjectManifest(entry),\n ]);\n this.registeredProjects = registeredProjects;\n }\n\n private async persistWorkspaceState(): Promise<void> {\n await this.saveDesktopState();\n }\n\n private async loadDesktopState(): Promise<{\n recentProjects: DesktopProjectEntry[];\n openProjects: string[];\n openProjectSessions: DesktopProjectSessionState[];\n activeRuntimeId: string | null;\n activeProjectRoot: string | null;\n window: DesktopWindowState | null;\n }> {\n try {\n const raw = await fs.readFile(this.stateFile, 'utf8');\n const parsed = JSON.parse(raw) as DesktopStateFile;\n const openProjects = normalizePathList(parsed.openProjects);\n const openProjectSessions = normalizeSessionStateList(\n parsed.openProjectSessions,\n openProjects,\n );\n return {\n recentProjects: Array.isArray(parsed.recentProjects) ? parsed.recentProjects : [],\n openProjects,\n openProjectSessions,\n activeRuntimeId: normalizeRuntimeId(parsed.activeRuntimeId) ?? null,\n activeProjectRoot:\n typeof parsed.activeProjectRoot === 'string' && parsed.activeProjectRoot.trim()\n ? path.resolve(parsed.activeProjectRoot)\n : null,\n window: normalizeWindowState(parsed.window),\n };\n } catch {\n return {\n recentProjects: [],\n openProjects: [],\n openProjectSessions: [],\n activeRuntimeId: null,\n activeProjectRoot: null,\n window: null,\n };\n }\n }\n\n private async saveDesktopState(): Promise<void> {\n await fs.mkdir(path.dirname(this.stateFile), { recursive: true });\n const liveProjectSessions = Array.from(this.runtimes.values())\n .filter((runtime) => runtime.status !== 'stopped' && runtime.kind === 'project')\n .map((runtime) => runtimeToSessionState(runtime));\n const openProjectSessions =\n liveProjectSessions.length === 0 && !this.workspaceRestoreCompleted\n ? [...this.restoreProjectSessions]\n : liveProjectSessions;\n const openProjects = openProjectSessions.map((session) => session.root);\n const activeRuntime = this.activeRuntimeId ? this.runtimes.get(this.activeRuntimeId) : null;\n const lastActiveProjectRoot = this.lastActiveProjectRoot;\n const fallbackSession =\n lastActiveProjectRoot\n ? openProjectSessions.find((session) => samePath(session.root, lastActiveProjectRoot))\n : undefined;\n const activeSession =\n activeRuntime?.kind === 'project'\n ? runtimeToSessionState(activeRuntime)\n : (fallbackSession ?? openProjectSessions[0]);\n const activeRoot = activeSession?.root;\n const activeRuntimeId = activeSession?.runtimeId ?? null;\n await atomicWrite(\n this.stateFile,\n `${JSON.stringify(\n {\n recentProjects: this.recentProjects,\n openProjects,\n openProjectSessions,\n activeRuntimeId,\n activeProjectRoot: activeRoot ?? null,\n window: this.windowState,\n },\n null,\n 2,\n )}\\n`,\n { mode: 0o600 },\n );\n }\n\n private emitChanged(): void {\n this.emit('changed');\n }\n\n private scheduleLogChanged(runtime: RuntimeInternal): void {\n if (runtime.logNotifyTimer) return;\n runtime.logNotifyTimer = setTimeout(() => {\n runtime.logNotifyTimer = null;\n if (this.runtimes.get(runtime.id) === runtime) {\n this.emitChanged();\n }\n }, 250);\n }\n}\n\nasync function terminateProcessTree(child: ChildProcess | null): Promise<void> {\n if (!child || child.killed || !child.pid) return;\n if (process.platform !== 'win32') {\n child.kill('SIGTERM');\n return;\n }\n\n await new Promise<void>((resolve) => {\n let settled = false;\n const finish = () => {\n if (settled) return;\n settled = true;\n resolve();\n };\n const timer = setTimeout(finish, 3000);\n timer.unref?.();\n const killer = spawn('taskkill', ['/PID', String(child.pid), '/T', '/F'], {\n stdio: 'ignore',\n windowsHide: true,\n });\n killer.once('exit', () => {\n clearTimeout(timer);\n finish();\n });\n killer.once('error', () => {\n clearTimeout(timer);\n child.kill();\n finish();\n });\n });\n}\n\nfunction publicRuntime(runtime: RuntimeInternal): DesktopRuntimeRecord {\n const {\n child: _child,\n token: _token,\n logs,\n logNotifyTimer: _logNotifyTimer,\n ...record\n } = runtime;\n void _child;\n void _token;\n void _logNotifyTimer;\n return {\n ...record,\n recentLogs: logs.slice(-40),\n };\n}\n\nfunction runtimeToSessionState(runtime: RuntimeInternal): DesktopProjectSessionState {\n return {\n runtimeId: runtime.id,\n name: runtime.name,\n root: runtime.root,\n startedAt: runtime.startedAt,\n };\n}\n\nfunction appendRuntimeLog(runtime: RuntimeInternal, stream: 'stdout' | 'stderr', text: string): void {\n for (const rawLine of text.split(/\\r?\\n/)) {\n const line = rawLine.trimEnd();\n if (!line) continue;\n runtime.logs.push(`[${stream}] ${line}`);\n }\n if (runtime.logs.length > 120) {\n runtime.logs.splice(0, runtime.logs.length - 120);\n }\n}\n\nfunction normalizePathList(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n const roots: string[] = [];\n for (const item of value) {\n if (typeof item !== 'string' || !item.trim()) continue;\n const resolved = path.resolve(item);\n roots.push(resolved);\n }\n return roots.slice(0, 12);\n}\n\nfunction normalizeSessionStateList(\n value: unknown,\n fallbackRoots: string[],\n): DesktopProjectSessionState[] {\n if (!Array.isArray(value)) {\n return fallbackRoots.map((root) => ({ root })).slice(0, 12);\n }\n const sessions: DesktopProjectSessionState[] = [];\n for (const item of value) {\n if (!item || typeof item !== 'object') continue;\n const candidate = item as Partial<DesktopProjectSessionState>;\n if (typeof candidate.root !== 'string' || !candidate.root.trim()) continue;\n const session: DesktopProjectSessionState = {\n root: path.resolve(candidate.root),\n };\n const runtimeId = normalizeRuntimeId(candidate.runtimeId);\n if (runtimeId) session.runtimeId = runtimeId;\n if (typeof candidate.name === 'string' && candidate.name.trim()) {\n session.name = candidate.name.trim().slice(0, 120);\n }\n if (typeof candidate.startedAt === 'string' && candidate.startedAt.trim()) {\n session.startedAt = candidate.startedAt.trim();\n }\n sessions.push(session);\n }\n return sessions.slice(0, 12);\n}\n\nfunction normalizeRuntimeId(value: unknown): string | undefined {\n if (typeof value !== 'string') return undefined;\n const trimmed = value.trim();\n if (!/^[a-zA-Z0-9._:-]{3,120}$/.test(trimmed)) return undefined;\n return trimmed;\n}\n\nfunction normalizeWindowState(value: unknown): DesktopWindowState | null {\n if (!value || typeof value !== 'object') return null;\n const candidate = value as Partial<DesktopWindowState>;\n const width = Number(candidate.width);\n const height = Number(candidate.height);\n if (!Number.isFinite(width) || !Number.isFinite(height)) return null;\n if (width < MIN_WINDOW_WIDTH || height < MIN_WINDOW_HEIGHT) return null;\n const state: DesktopWindowState = {\n width: Math.round(width),\n height: Math.round(height),\n maximized: Boolean(candidate.maximized),\n };\n if (Number.isFinite(Number(candidate.x))) state.x = Math.round(Number(candidate.x));\n if (Number.isFinite(Number(candidate.y))) state.y = Math.round(Number(candidate.y));\n return state;\n}\n\nfunction firstRunningRuntimeId(runtimes: Map<string, RuntimeInternal>): string | null {\n return Array.from(runtimes.values()).find((runtime) => runtime.status === 'running')?.id ?? null;\n}\n\nfunction firstProjectRuntimeRoot(runtimes: Map<string, RuntimeInternal>): string | null {\n return (\n Array.from(runtimes.values()).find(\n (runtime) => runtime.status === 'running' && runtime.kind === 'project',\n )?.root ?? null\n );\n}\n\nfunction usedPorts(runtimes: Map<string, RuntimeInternal>): Set<number> {\n const ports = new Set<number>();\n for (const runtime of runtimes.values()) {\n ports.add(runtime.httpPort);\n ports.add(runtime.wsPort);\n }\n return ports;\n}\n\nfunction nextRuntimeName(\n runtimes: Map<string, RuntimeInternal>,\n root: string,\n kind: DesktopRuntimeKind,\n): string {\n const baseName = path.basename(root) || root;\n if (kind !== 'project') return baseName;\n const liveSameRoot = Array.from(runtimes.values()).filter(\n (runtime) =>\n runtime.kind === 'project' &&\n samePath(runtime.root, root) &&\n runtime.status !== 'stopped',\n ).length;\n return liveSameRoot === 0 ? baseName : `${baseName} #${liveSameRoot + 1}`;\n}\n\nfunction pathKey(value: string): string {\n const resolved = path.resolve(value);\n return os.platform() === 'win32' ? resolved.toLowerCase() : resolved;\n}\n\nasync function findFreePort(startPort: number, exclude: Set<number>): Promise<number> {\n for (let port = startPort; port < startPort + 200; port++) {\n if (exclude.has(port)) continue;\n if (await isPortFree(port)) return port;\n }\n throw new Error(`No free local port found near ${startPort}`);\n}\n\nfunction isPortFree(port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const server = net.createServer();\n server.once('error', () => resolve(false));\n server.once('listening', () => {\n server.close(() => resolve(true));\n });\n server.listen(port, '127.0.0.1');\n });\n}\n\nfunction waitForHttpReady(baseUrl: string, token: string, timeoutMs: number): Promise<void> {\n const deadline = Date.now() + timeoutMs;\n const url = new URL(baseUrl);\n url.searchParams.set('token', token);\n url.searchParams.set('shell', 'desktop');\n\n return new Promise((resolve, reject) => {\n const probe = (): void => {\n const req = http.get(url, (res) => {\n res.resume();\n if (res.statusCode && res.statusCode >= 200 && res.statusCode < 500) {\n resolve();\n return;\n }\n retry();\n });\n req.once('error', retry);\n req.setTimeout(1000, () => {\n req.destroy();\n retry();\n });\n };\n const retry = (): void => {\n if (Date.now() >= deadline) {\n reject(new Error(`WebUI did not become ready at ${baseUrl}`));\n return;\n }\n setTimeout(probe, 250);\n };\n probe();\n });\n}\n\nfunction resolveWebUiEntry(): string {\n if (process.env['WRONGSTACK_WEBUI_ENTRY']) {\n return path.resolve(process.env['WRONGSTACK_WEBUI_ENTRY']);\n }\n const require = createRequire(import.meta.url);\n const serverIndex = require.resolve('@wrongstack/webui/server');\n return path.join(path.dirname(serverIndex), 'entry.js');\n}\n\nasync function readGlobalProjectManifest(): Promise<DesktopProjectEntry[]> {\n const manifestFile = path.join(wstackGlobalRoot(), 'projects.json');\n try {\n const raw = await fs.readFile(manifestFile, 'utf8');\n const parsed = JSON.parse(raw) as { projects?: DesktopProjectEntry[] | undefined };\n const projects = Array.isArray(parsed.projects) ? parsed.projects : [];\n return projects\n .filter((project) => typeof project?.root === 'string' && project.root.trim())\n .map((project) => ({\n ...project,\n name: project.name || path.basename(project.root) || project.root,\n root: path.resolve(project.root),\n slug: project.slug || projectSlug(path.resolve(project.root)),\n }))\n .sort((a, b) => (b.lastSeen ?? b.createdAt ?? '').localeCompare(a.lastSeen ?? a.createdAt ?? ''))\n .slice(0, 80);\n } catch {\n return [];\n }\n}\n\nasync function touchGlobalProjectManifest(entry: DesktopProjectEntry): Promise<DesktopProjectEntry[]> {\n const manifestFile = path.join(wstackGlobalRoot(), 'projects.json');\n const projects = await readGlobalProjectManifest();\n const existing = projects.find((p) => samePath(p.root, entry.root));\n if (existing) {\n existing.name = entry.name;\n existing.slug = entry.slug;\n existing.lastSeen = entry.lastSeen;\n existing.lastWorkingDir = entry.lastWorkingDir;\n } else {\n projects.push({ ...entry, createdAt: entry.lastSeen });\n }\n const sorted = projects\n .sort((a, b) => (b.lastSeen ?? b.createdAt ?? '').localeCompare(a.lastSeen ?? a.createdAt ?? ''))\n .slice(0, 80);\n await fs.mkdir(path.dirname(manifestFile), { recursive: true });\n await atomicWrite(manifestFile, `${JSON.stringify({ projects: sorted }, null, 2)}\\n`, { mode: 0o600 });\n return sorted;\n}\n\nasync function removeGlobalProjectManifest(projectRoot: string): Promise<DesktopProjectEntry[]> {\n const manifestFile = path.join(wstackGlobalRoot(), 'projects.json');\n const resolved = path.resolve(projectRoot);\n const projects = (await readGlobalProjectManifest()).filter(\n (project) => !samePath(project.root, resolved),\n );\n await fs.mkdir(path.dirname(manifestFile), { recursive: true });\n await atomicWrite(manifestFile, `${JSON.stringify({ projects }, null, 2)}\\n`, { mode: 0o600 });\n return projects;\n}\n\nfunction samePath(left: string, right: string): boolean {\n const a = path.resolve(left);\n const b = path.resolve(right);\n return os.platform() === 'win32' ? a.toLowerCase() === b.toLowerCase() : a === b;\n}\n\nexport function rendererIndexPath(): string {\n return fileURLToPath(new URL('../renderer/index.html', import.meta.url));\n}\n\nexport function preloadPath(): string {\n return fileURLToPath(new URL('../preload/preload.cjs', import.meta.url));\n}\n\nexport function webuiPreloadPath(): string {\n return fileURLToPath(new URL('../preload/webui-preload.cjs', import.meta.url));\n}\n","import type { DesktopWebuiCommand } from '../shared/types.js';\n\ntype DesktopCommandAction = NonNullable<DesktopWebuiCommand['action']>;\ntype DesktopCommandView = NonNullable<DesktopWebuiCommand['view']>;\ntype DesktopCommandActivity = NonNullable<DesktopWebuiCommand['activity']>;\ntype DesktopCommandOverlay = NonNullable<DesktopWebuiCommand['overlay']>;\ntype DesktopCommandDockSection = NonNullable<DesktopWebuiCommand['dockSection']>;\ntype DesktopCommandWorkTab = NonNullable<DesktopWebuiCommand['workTab']>;\ntype DesktopCommandPrefKey = NonNullable<DesktopWebuiCommand['pref']>['key'];\n\nconst DESKTOP_WEBUI_ACTIONS = new Set<DesktopCommandAction>([\n 'new-session',\n 'clear-context',\n 'compact-context',\n 'repair-context',\n 'download-chat',\n 'focus-chat',\n 'open-command-palette',\n 'open-shortcuts',\n 'search-chat',\n 'open-model-switcher',\n 'open-prompt-library',\n]);\n\nconst DESKTOP_WEBUI_VIEWS = new Set<DesktopCommandView>([\n 'chat',\n 'settings',\n 'autophase',\n 'specs',\n 'sddboard',\n 'sddwizard',\n 'files',\n 'changes',\n 'sessions',\n 'setup',\n 'skill',\n 'officemap',\n 'mailbox',\n 'debug',\n 'design-gallery',\n 'refresh-debug',\n 'analytics',\n]);\n\nconst DESKTOP_WEBUI_ACTIVITIES = new Set<DesktopCommandActivity>([\n 'chat',\n 'agents',\n 'history',\n 'files',\n 'changes',\n 'mailbox',\n 'skills',\n 'design',\n 'worktrees',\n 'officemap',\n]);\n\nconst DESKTOP_WEBUI_OVERLAYS = new Set<DesktopCommandOverlay>([\n 'fleet',\n 'agents-monitor',\n 'processes',\n 'queue',\n]);\n\nconst DESKTOP_WEBUI_DOCKS = new Set<DesktopCommandDockSection>([\n 'autophase',\n 'goal',\n 'fleet',\n 'work',\n 'worktrees',\n 'collab',\n]);\n\nconst DESKTOP_WEBUI_WORK_TABS = new Set<DesktopCommandWorkTab>(['todos', 'tasks', 'plan']);\nconst DESKTOP_WEBUI_PREF_KEYS = new Set<DesktopCommandPrefKey>([\n 'yolo',\n 'nextPrediction',\n 'contextAutoCompact',\n]);\n\nexport function normalizeDesktopWebuiCommand(value: unknown): DesktopWebuiCommand | null {\n if (!isRecord(value)) return null;\n const command: DesktopWebuiCommand = {};\n let hasCommand = false;\n\n const action = value['action'];\n if (action !== undefined) {\n if (typeof action !== 'string' || !DESKTOP_WEBUI_ACTIONS.has(action as DesktopCommandAction)) {\n return null;\n }\n command.action = action as DesktopCommandAction;\n hasCommand = true;\n }\n\n const view = value['view'];\n if (view !== undefined) {\n if (typeof view !== 'string' || !DESKTOP_WEBUI_VIEWS.has(view as DesktopCommandView)) {\n return null;\n }\n command.view = view as DesktopCommandView;\n hasCommand = true;\n }\n\n const activity = value['activity'];\n if (activity !== undefined) {\n if (\n typeof activity !== 'string' ||\n !DESKTOP_WEBUI_ACTIVITIES.has(activity as DesktopCommandActivity)\n ) {\n return null;\n }\n command.activity = activity as DesktopCommandActivity;\n hasCommand = true;\n }\n\n const overlay = value['overlay'];\n if (overlay !== undefined) {\n if (typeof overlay !== 'string' || !DESKTOP_WEBUI_OVERLAYS.has(overlay as DesktopCommandOverlay)) {\n return null;\n }\n command.overlay = overlay as DesktopCommandOverlay;\n hasCommand = true;\n }\n\n const dockSection = value['dockSection'];\n if (dockSection !== undefined) {\n if (\n typeof dockSection !== 'string' ||\n !DESKTOP_WEBUI_DOCKS.has(dockSection as DesktopCommandDockSection)\n ) {\n return null;\n }\n command.dockSection = dockSection as DesktopCommandDockSection;\n hasCommand = true;\n }\n\n const workTab = value['workTab'];\n if (workTab !== undefined) {\n if (typeof workTab !== 'string' || !DESKTOP_WEBUI_WORK_TABS.has(workTab as DesktopCommandWorkTab)) {\n return null;\n }\n command.workTab = workTab as DesktopCommandWorkTab;\n hasCommand = true;\n }\n\n const terminal = value['terminal'];\n if (terminal !== undefined) {\n if (terminal !== true && terminal !== false && terminal !== 'toggle' && terminal !== 'new') {\n return null;\n }\n command.terminal = terminal;\n hasCommand = true;\n }\n\n const pref = value['pref'];\n if (pref !== undefined) {\n if (!isRecord(pref)) return null;\n const key = pref['key'];\n if (typeof key !== 'string' || !DESKTOP_WEBUI_PREF_KEYS.has(key as DesktopCommandPrefKey)) {\n return null;\n }\n const toggle = pref['toggle'];\n const prefValue = pref['value'];\n if (toggle !== undefined && typeof toggle !== 'boolean') return null;\n if (prefValue !== undefined && typeof prefValue !== 'boolean') return null;\n if (toggle === undefined && prefValue === undefined) return null;\n command.pref = {\n key: key as DesktopCommandPrefKey,\n ...(typeof prefValue === 'boolean' ? { value: prefValue } : {}),\n ...(typeof toggle === 'boolean' ? { toggle } : {}),\n };\n hasCommand = true;\n }\n\n return hasCommand ? command : null;\n}\n\nexport function buildWebuiCommandFallbackScript(command: DesktopWebuiCommand): string {\n const payload = JSON.stringify(command).replace(/</g, '\\\\u003c');\n return `window.dispatchEvent(new CustomEvent('wrongstack:desktop-command', { detail: ${payload} })); true;`;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n}\n"],"mappings":"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","names":["path","fs","wstackGlobalRoot","fs","path","atomicWrite","wstackGlobalRoot","stat","runtime","activeRuntimeId","resolve","require","MIN_WINDOW_WIDTH","MIN_WINDOW_HEIGHT","wstackGlobalRoot","isRecord","resolve"]}
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+
3
+ // src/main/preload.ts
4
+ var import_electron = require("electron");
5
+
6
+ // src/main/ipc.ts
7
+ var IPC = {
8
+ getState: "desktop:get-state",
9
+ getConversation: "desktop:get-conversation",
10
+ getWebuiStatus: "desktop:get-webui-status",
11
+ openProject: "desktop:open-project",
12
+ registerProject: "desktop:register-project",
13
+ unregisterProject: "desktop:unregister-project",
14
+ openProjectSession: "desktop:open-project-session",
15
+ activateRuntime: "desktop:activate-runtime",
16
+ closeRuntime: "desktop:close-runtime",
17
+ navigateWebui: "desktop:navigate-webui",
18
+ reloadWebui: "desktop:reload-webui",
19
+ setShellSidebarCollapsed: "desktop:set-shell-sidebar-collapsed",
20
+ openSettings: "desktop:open-settings",
21
+ sendMessage: "desktop:send-message",
22
+ abortRuntime: "desktop:abort-runtime",
23
+ openRuntimeInBrowser: "desktop:open-runtime-in-browser",
24
+ revealRuntimeRoot: "desktop:reveal-runtime-root",
25
+ stateChanged: "desktop:state-changed",
26
+ conversationChanged: "desktop:conversation-changed",
27
+ webuiStatusChanged: "desktop:webui-status-changed",
28
+ webuiReadyChanged: "desktop:webui-ready-changed",
29
+ webuiPrefsChanged: "desktop:webui-prefs-changed",
30
+ webuiCommandAck: "desktop:webui-command-ack",
31
+ webuiCommand: "desktop:webui-command",
32
+ shellSidebarCollapsedChanged: "desktop:shell-sidebar-collapsed-changed",
33
+ setLocale: "desktop:set-locale",
34
+ localeChanged: "desktop:locale-changed",
35
+ // Embedded WebUI view side — the desktop shell pushes locale changes here
36
+ // so the React WebUI inside Electron can swap i18n instantly, without waiting
37
+ // for the config-file watcher → WS prefs.updated round-trip.
38
+ webuiLocaleChanged: "desktop:webui-locale-changed"
39
+ };
40
+
41
+ // src/main/preload.ts
42
+ var api = {
43
+ getState: () => import_electron.ipcRenderer.invoke(IPC.getState),
44
+ getConversation: (runtimeId) => import_electron.ipcRenderer.invoke(IPC.getConversation, runtimeId),
45
+ getWebuiStatus: () => import_electron.ipcRenderer.invoke(IPC.getWebuiStatus),
46
+ openProject: (root) => import_electron.ipcRenderer.invoke(IPC.openProject, root),
47
+ registerProject: (root) => import_electron.ipcRenderer.invoke(IPC.registerProject, root),
48
+ unregisterProject: (root) => import_electron.ipcRenderer.invoke(IPC.unregisterProject, root),
49
+ openProjectSession: (runtimeId) => import_electron.ipcRenderer.invoke(IPC.openProjectSession, runtimeId),
50
+ activateRuntime: (id) => import_electron.ipcRenderer.invoke(IPC.activateRuntime, id),
51
+ closeRuntime: (id) => import_electron.ipcRenderer.invoke(IPC.closeRuntime, id),
52
+ navigateWebui: (command) => import_electron.ipcRenderer.invoke(IPC.navigateWebui, command),
53
+ reloadWebui: () => import_electron.ipcRenderer.invoke(IPC.reloadWebui),
54
+ setShellSidebarCollapsed: (collapsed) => import_electron.ipcRenderer.invoke(IPC.setShellSidebarCollapsed, collapsed),
55
+ openSettings: () => import_electron.ipcRenderer.invoke(IPC.openSettings),
56
+ sendMessage: (runtimeId, content) => import_electron.ipcRenderer.invoke(IPC.sendMessage, runtimeId, content),
57
+ abortRuntime: (runtimeId) => import_electron.ipcRenderer.invoke(IPC.abortRuntime, runtimeId),
58
+ openRuntimeInBrowser: (id) => import_electron.ipcRenderer.invoke(IPC.openRuntimeInBrowser, id),
59
+ revealRuntimeRoot: (id) => import_electron.ipcRenderer.invoke(IPC.revealRuntimeRoot, id),
60
+ onStateChanged: (cb) => {
61
+ const handler = (_event, state) => cb(state);
62
+ import_electron.ipcRenderer.on(IPC.stateChanged, handler);
63
+ return () => import_electron.ipcRenderer.off(IPC.stateChanged, handler);
64
+ },
65
+ onConversationChanged: (cb) => {
66
+ const handler = (_event, conversation) => cb(conversation);
67
+ import_electron.ipcRenderer.on(IPC.conversationChanged, handler);
68
+ return () => import_electron.ipcRenderer.off(IPC.conversationChanged, handler);
69
+ },
70
+ onWebuiStatusChanged: (cb) => {
71
+ const handler = (_event, status) => cb(status);
72
+ import_electron.ipcRenderer.on(IPC.webuiStatusChanged, handler);
73
+ return () => import_electron.ipcRenderer.off(IPC.webuiStatusChanged, handler);
74
+ },
75
+ onShellSidebarCollapsedChanged: (cb) => {
76
+ const handler = (_event, collapsed) => cb(collapsed);
77
+ import_electron.ipcRenderer.on(IPC.shellSidebarCollapsedChanged, handler);
78
+ return () => import_electron.ipcRenderer.off(IPC.shellSidebarCollapsedChanged, handler);
79
+ },
80
+ setLocale: (locale) => {
81
+ import_electron.ipcRenderer.send(IPC.setLocale, locale);
82
+ },
83
+ onLocaleChanged: (cb) => {
84
+ const handler = (_event, locale) => cb(locale);
85
+ import_electron.ipcRenderer.on(IPC.localeChanged, handler);
86
+ return () => import_electron.ipcRenderer.off(IPC.localeChanged, handler);
87
+ }
88
+ };
89
+ import_electron.contextBridge.exposeInMainWorld("wrongstackDesktop", api);
90
+ //# sourceMappingURL=preload.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/main/preload.ts","../../src/main/ipc.ts"],"sourcesContent":["import { contextBridge, ipcRenderer } from 'electron';\nimport type {\n DesktopConversationSnapshot,\n DesktopStateSnapshot,\n DesktopWebuiStatusSnapshot,\n DesktopWebuiCommand,\n WrongStackDesktopApi,\n} from '../shared/types.js';\nimport { IPC } from './ipc.js';\n\nconst api: WrongStackDesktopApi = {\n getState: () => ipcRenderer.invoke(IPC.getState),\n getConversation: (runtimeId: string) => ipcRenderer.invoke(IPC.getConversation, runtimeId),\n getWebuiStatus: () => ipcRenderer.invoke(IPC.getWebuiStatus),\n openProject: (root?: string) => ipcRenderer.invoke(IPC.openProject, root),\n registerProject: (root?: string) => ipcRenderer.invoke(IPC.registerProject, root),\n unregisterProject: (root: string) => ipcRenderer.invoke(IPC.unregisterProject, root),\n openProjectSession: (runtimeId?: string) => ipcRenderer.invoke(IPC.openProjectSession, runtimeId),\n activateRuntime: (id: string) => ipcRenderer.invoke(IPC.activateRuntime, id),\n closeRuntime: (id: string) => ipcRenderer.invoke(IPC.closeRuntime, id),\n navigateWebui: (command: DesktopWebuiCommand) => ipcRenderer.invoke(IPC.navigateWebui, command),\n reloadWebui: () => ipcRenderer.invoke(IPC.reloadWebui),\n setShellSidebarCollapsed: (collapsed: boolean) =>\n ipcRenderer.invoke(IPC.setShellSidebarCollapsed, collapsed),\n openSettings: () => ipcRenderer.invoke(IPC.openSettings),\n sendMessage: (runtimeId: string, content: string) =>\n ipcRenderer.invoke(IPC.sendMessage, runtimeId, content),\n abortRuntime: (runtimeId: string) => ipcRenderer.invoke(IPC.abortRuntime, runtimeId),\n openRuntimeInBrowser: (id: string) => ipcRenderer.invoke(IPC.openRuntimeInBrowser, id),\n revealRuntimeRoot: (id: string) => ipcRenderer.invoke(IPC.revealRuntimeRoot, id),\n onStateChanged: (cb: (state: DesktopStateSnapshot) => void) => {\n const handler = (_event: Electron.IpcRendererEvent, state: DesktopStateSnapshot) => cb(state);\n ipcRenderer.on(IPC.stateChanged, handler);\n return () => ipcRenderer.off(IPC.stateChanged, handler);\n },\n onConversationChanged: (cb) => {\n const handler = (\n _event: Electron.IpcRendererEvent,\n conversation: DesktopConversationSnapshot,\n ) => cb(conversation);\n ipcRenderer.on(IPC.conversationChanged, handler);\n return () => ipcRenderer.off(IPC.conversationChanged, handler);\n },\n onWebuiStatusChanged: (cb: (status: DesktopWebuiStatusSnapshot) => void) => {\n const handler = (\n _event: Electron.IpcRendererEvent,\n status: DesktopWebuiStatusSnapshot,\n ) => cb(status);\n ipcRenderer.on(IPC.webuiStatusChanged, handler);\n return () => ipcRenderer.off(IPC.webuiStatusChanged, handler);\n },\n onShellSidebarCollapsedChanged: (cb: (collapsed: boolean) => void) => {\n const handler = (_event: Electron.IpcRendererEvent, collapsed: boolean) => cb(collapsed);\n ipcRenderer.on(IPC.shellSidebarCollapsedChanged, handler);\n return () => ipcRenderer.off(IPC.shellSidebarCollapsedChanged, handler);\n },\n setLocale: (locale: string) => {\n ipcRenderer.send(IPC.setLocale, locale);\n },\n onLocaleChanged: (cb: (locale: string) => void) => {\n const handler = (_event: Electron.IpcRendererEvent, locale: string) => cb(locale);\n ipcRenderer.on(IPC.localeChanged, handler);\n return () => ipcRenderer.off(IPC.localeChanged, handler);\n },\n};\n\ncontextBridge.exposeInMainWorld('wrongstackDesktop', api);\n","export const IPC = {\n getState: 'desktop:get-state',\n getConversation: 'desktop:get-conversation',\n getWebuiStatus: 'desktop:get-webui-status',\n openProject: 'desktop:open-project',\n registerProject: 'desktop:register-project',\n unregisterProject: 'desktop:unregister-project',\n openProjectSession: 'desktop:open-project-session',\n activateRuntime: 'desktop:activate-runtime',\n closeRuntime: 'desktop:close-runtime',\n navigateWebui: 'desktop:navigate-webui',\n reloadWebui: 'desktop:reload-webui',\n setShellSidebarCollapsed: 'desktop:set-shell-sidebar-collapsed',\n openSettings: 'desktop:open-settings',\n sendMessage: 'desktop:send-message',\n abortRuntime: 'desktop:abort-runtime',\n openRuntimeInBrowser: 'desktop:open-runtime-in-browser',\n revealRuntimeRoot: 'desktop:reveal-runtime-root',\n stateChanged: 'desktop:state-changed',\n conversationChanged: 'desktop:conversation-changed',\n webuiStatusChanged: 'desktop:webui-status-changed',\n webuiReadyChanged: 'desktop:webui-ready-changed',\n webuiPrefsChanged: 'desktop:webui-prefs-changed',\n webuiCommandAck: 'desktop:webui-command-ack',\n webuiCommand: 'desktop:webui-command',\n shellSidebarCollapsedChanged: 'desktop:shell-sidebar-collapsed-changed',\n setLocale: 'desktop:set-locale',\n localeChanged: 'desktop:locale-changed',\n // Embedded WebUI view side — the desktop shell pushes locale changes here\n // so the React WebUI inside Electron can swap i18n instantly, without waiting\n // for the config-file watcher → WS prefs.updated round-trip.\n webuiLocaleChanged: 'desktop:webui-locale-changed',\n} as const;\n"],"mappings":"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","names":[]}
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+
3
+ // src/main/webui-preload.ts
4
+ var import_electron = require("electron");
5
+
6
+ // src/main/ipc.ts
7
+ var IPC = {
8
+ getState: "desktop:get-state",
9
+ getConversation: "desktop:get-conversation",
10
+ getWebuiStatus: "desktop:get-webui-status",
11
+ openProject: "desktop:open-project",
12
+ registerProject: "desktop:register-project",
13
+ unregisterProject: "desktop:unregister-project",
14
+ openProjectSession: "desktop:open-project-session",
15
+ activateRuntime: "desktop:activate-runtime",
16
+ closeRuntime: "desktop:close-runtime",
17
+ navigateWebui: "desktop:navigate-webui",
18
+ reloadWebui: "desktop:reload-webui",
19
+ setShellSidebarCollapsed: "desktop:set-shell-sidebar-collapsed",
20
+ openSettings: "desktop:open-settings",
21
+ sendMessage: "desktop:send-message",
22
+ abortRuntime: "desktop:abort-runtime",
23
+ openRuntimeInBrowser: "desktop:open-runtime-in-browser",
24
+ revealRuntimeRoot: "desktop:reveal-runtime-root",
25
+ stateChanged: "desktop:state-changed",
26
+ conversationChanged: "desktop:conversation-changed",
27
+ webuiStatusChanged: "desktop:webui-status-changed",
28
+ webuiReadyChanged: "desktop:webui-ready-changed",
29
+ webuiPrefsChanged: "desktop:webui-prefs-changed",
30
+ webuiCommandAck: "desktop:webui-command-ack",
31
+ webuiCommand: "desktop:webui-command",
32
+ shellSidebarCollapsedChanged: "desktop:shell-sidebar-collapsed-changed",
33
+ setLocale: "desktop:set-locale",
34
+ localeChanged: "desktop:locale-changed",
35
+ // Embedded WebUI view side — the desktop shell pushes locale changes here
36
+ // so the React WebUI inside Electron can swap i18n instantly, without waiting
37
+ // for the config-file watcher → WS prefs.updated round-trip.
38
+ webuiLocaleChanged: "desktop:webui-locale-changed"
39
+ };
40
+
41
+ // src/main/webui-preload.ts
42
+ var api = {
43
+ setReady: (ready) => {
44
+ import_electron.ipcRenderer.send(IPC.webuiReadyChanged, ready);
45
+ },
46
+ setPrefs: (prefs) => {
47
+ import_electron.ipcRenderer.send(IPC.webuiPrefsChanged, prefs);
48
+ },
49
+ ackCommand: (requestId, handled, message) => {
50
+ import_electron.ipcRenderer.send(IPC.webuiCommandAck, requestId, handled, message);
51
+ },
52
+ onLocaleChanged: (cb) => {
53
+ const handler = (_event, locale) => cb(locale);
54
+ import_electron.ipcRenderer.on(IPC.webuiLocaleChanged, handler);
55
+ return () => {
56
+ import_electron.ipcRenderer.off(IPC.webuiLocaleChanged, handler);
57
+ };
58
+ }
59
+ };
60
+ var commandListeners = /* @__PURE__ */ new Set();
61
+ var commandApi = {
62
+ subscribe: (cb) => {
63
+ commandListeners.add(cb);
64
+ return () => {
65
+ commandListeners.delete(cb);
66
+ };
67
+ }
68
+ };
69
+ import_electron.ipcRenderer.on(IPC.webuiCommand, (_event, command) => {
70
+ for (const listener of [...commandListeners]) {
71
+ try {
72
+ listener(command);
73
+ } catch {
74
+ }
75
+ }
76
+ window.dispatchEvent(
77
+ new CustomEvent("wrongstack:desktop-command", {
78
+ detail: command
79
+ })
80
+ );
81
+ });
82
+ import_electron.contextBridge.exposeInMainWorld("wrongstackDesktopHost", api);
83
+ import_electron.contextBridge.exposeInMainWorld("wrongstackDesktopCommands", commandApi);
84
+ //# sourceMappingURL=webui-preload.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/main/webui-preload.ts","../../src/main/ipc.ts"],"sourcesContent":["import { contextBridge, ipcRenderer } from 'electron';\nimport type {\n WrongStackDesktopCommandApi,\n DesktopWebuiCommand,\n DesktopWebuiPrefs,\n WrongStackDesktopHostApi,\n} from '../shared/types.js';\nimport { IPC } from './ipc.js';\n\nconst api: WrongStackDesktopHostApi = {\n setReady: (ready: boolean) => {\n ipcRenderer.send(IPC.webuiReadyChanged, ready);\n },\n setPrefs: (prefs: DesktopWebuiPrefs) => {\n ipcRenderer.send(IPC.webuiPrefsChanged, prefs);\n },\n ackCommand: (requestId: string, handled: boolean, message?: string | undefined) => {\n ipcRenderer.send(IPC.webuiCommandAck, requestId, handled, message);\n },\n onLocaleChanged: (cb: (locale: string) => void) => {\n const handler = (_event: Electron.IpcRendererEvent, locale: string) => cb(locale);\n ipcRenderer.on(IPC.webuiLocaleChanged, handler);\n return () => {\n ipcRenderer.off(IPC.webuiLocaleChanged, handler);\n };\n },\n};\n\nconst commandListeners = new Set<(command: DesktopWebuiCommand) => void>();\nconst commandApi: WrongStackDesktopCommandApi = {\n subscribe: (cb: (command: DesktopWebuiCommand) => void) => {\n commandListeners.add(cb);\n return () => {\n commandListeners.delete(cb);\n };\n },\n};\n\nipcRenderer.on(IPC.webuiCommand, (_event, command: DesktopWebuiCommand) => {\n for (const listener of [...commandListeners]) {\n try {\n listener(command);\n } catch {\n /* The WebUI owns command handling errors. Keep the bridge alive. */\n }\n }\n window.dispatchEvent(\n new CustomEvent('wrongstack:desktop-command', {\n detail: command,\n }),\n );\n});\n\ncontextBridge.exposeInMainWorld('wrongstackDesktopHost', api);\ncontextBridge.exposeInMainWorld('wrongstackDesktopCommands', commandApi);\n","export const IPC = {\n getState: 'desktop:get-state',\n getConversation: 'desktop:get-conversation',\n getWebuiStatus: 'desktop:get-webui-status',\n openProject: 'desktop:open-project',\n registerProject: 'desktop:register-project',\n unregisterProject: 'desktop:unregister-project',\n openProjectSession: 'desktop:open-project-session',\n activateRuntime: 'desktop:activate-runtime',\n closeRuntime: 'desktop:close-runtime',\n navigateWebui: 'desktop:navigate-webui',\n reloadWebui: 'desktop:reload-webui',\n setShellSidebarCollapsed: 'desktop:set-shell-sidebar-collapsed',\n openSettings: 'desktop:open-settings',\n sendMessage: 'desktop:send-message',\n abortRuntime: 'desktop:abort-runtime',\n openRuntimeInBrowser: 'desktop:open-runtime-in-browser',\n revealRuntimeRoot: 'desktop:reveal-runtime-root',\n stateChanged: 'desktop:state-changed',\n conversationChanged: 'desktop:conversation-changed',\n webuiStatusChanged: 'desktop:webui-status-changed',\n webuiReadyChanged: 'desktop:webui-ready-changed',\n webuiPrefsChanged: 'desktop:webui-prefs-changed',\n webuiCommandAck: 'desktop:webui-command-ack',\n webuiCommand: 'desktop:webui-command',\n shellSidebarCollapsedChanged: 'desktop:shell-sidebar-collapsed-changed',\n setLocale: 'desktop:set-locale',\n localeChanged: 'desktop:locale-changed',\n // Embedded WebUI view side — the desktop shell pushes locale changes here\n // so the React WebUI inside Electron can swap i18n instantly, without waiting\n // for the config-file watcher → WS prefs.updated round-trip.\n webuiLocaleChanged: 'desktop:webui-locale-changed',\n} as const;\n"],"mappings":";;;AAAA,sBAA2C;;;ACApC,IAAM,MAAM;AAAA,EACjB,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,eAAe;AAAA,EACf,aAAa;AAAA,EACb,0BAA0B;AAAA,EAC1B,cAAc;AAAA,EACd,aAAa;AAAA,EACb,cAAc;AAAA,EACd,sBAAsB;AAAA,EACtB,mBAAmB;AAAA,EACnB,cAAc;AAAA,EACd,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,8BAA8B;AAAA,EAC9B,WAAW;AAAA,EACX,eAAe;AAAA;AAAA;AAAA;AAAA,EAIf,oBAAoB;AACtB;;;ADvBA,IAAM,MAAgC;AAAA,EACpC,UAAU,CAAC,UAAmB;AAC5B,gCAAY,KAAK,IAAI,mBAAmB,KAAK;AAAA,EAC/C;AAAA,EACA,UAAU,CAAC,UAA6B;AACtC,gCAAY,KAAK,IAAI,mBAAmB,KAAK;AAAA,EAC/C;AAAA,EACA,YAAY,CAAC,WAAmB,SAAkB,YAAiC;AACjF,gCAAY,KAAK,IAAI,iBAAiB,WAAW,SAAS,OAAO;AAAA,EACnE;AAAA,EACA,iBAAiB,CAAC,OAAiC;AACjD,UAAM,UAAU,CAAC,QAAmC,WAAmB,GAAG,MAAM;AAChF,gCAAY,GAAG,IAAI,oBAAoB,OAAO;AAC9C,WAAO,MAAM;AACX,kCAAY,IAAI,IAAI,oBAAoB,OAAO;AAAA,IACjD;AAAA,EACF;AACF;AAEA,IAAM,mBAAmB,oBAAI,IAA4C;AACzE,IAAM,aAA0C;AAAA,EAC9C,WAAW,CAAC,OAA+C;AACzD,qBAAiB,IAAI,EAAE;AACvB,WAAO,MAAM;AACX,uBAAiB,OAAO,EAAE;AAAA,IAC5B;AAAA,EACF;AACF;AAEA,4BAAY,GAAG,IAAI,cAAc,CAAC,QAAQ,YAAiC;AACzE,aAAW,YAAY,CAAC,GAAG,gBAAgB,GAAG;AAC5C,QAAI;AACF,eAAS,OAAO;AAAA,IAClB,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AAAA,IACL,IAAI,YAAY,8BAA8B;AAAA,MAC5C,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AACF,CAAC;AAED,8BAAc,kBAAkB,yBAAyB,GAAG;AAC5D,8BAAc,kBAAkB,6BAA6B,UAAU;","names":[]}