reasonix 0.46.1 → 0.47.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +62 -13
- package/README.zh-CN.md +52 -10
- package/dashboard/dist/app.js +217 -60
- package/dashboard/dist/app.js.map +1 -1
- package/dist/cli/{acp-LKJU5DZX.js → acp-QK3DMC53.js} +22 -22
- package/dist/cli/chat-VV5UWY4V.js +51 -0
- package/dist/cli/{chunk-DGA5QYFM.js → chunk-24A7FHGJ.js} +42 -13
- package/dist/cli/chunk-24A7FHGJ.js.map +1 -0
- package/dist/cli/{chunk-K3AIFMI6.js → chunk-6J6BSUCR.js} +2 -2
- package/dist/cli/{chunk-C72TNHDE.js → chunk-BWYVFFKR.js} +2 -2
- package/dist/cli/{chunk-EAOL43HB.js → chunk-BYYVYJDX.js} +3 -3
- package/dist/cli/{chunk-HNXDZGC6.js → chunk-CI2PF5QX.js} +2 -2
- package/dist/cli/{chunk-JVQT5IYP.js → chunk-COWPEX54.js} +19 -9
- package/dist/cli/chunk-COWPEX54.js.map +1 -0
- package/dist/cli/{chunk-IYQ325V7.js → chunk-E5WCLUIU.js} +2 -2
- package/dist/cli/{chunk-YRLC2EDF.js → chunk-EQATK2L2.js} +2 -2
- package/dist/cli/{chunk-R2ASNSEO.js → chunk-FDKOUJKZ.js} +8 -8
- package/dist/cli/{chunk-TEUDEGX2.js → chunk-FY4S7TJZ.js} +19 -5
- package/dist/cli/chunk-FY4S7TJZ.js.map +1 -0
- package/dist/cli/{chunk-JVFEJAJX.js → chunk-GDKB2PPK.js} +2 -2
- package/dist/cli/{chunk-WQ6ZRDQM.js → chunk-HIYTRCSW.js} +16 -12
- package/dist/cli/chunk-HIYTRCSW.js.map +1 -0
- package/dist/cli/{chunk-ZOQHVQON.js → chunk-ICAFSZHS.js} +307 -30
- package/dist/cli/chunk-ICAFSZHS.js.map +1 -0
- package/dist/cli/{chunk-SPXN5JIT.js → chunk-ICSYGIPN.js} +1386 -1021
- package/dist/cli/chunk-ICSYGIPN.js.map +1 -0
- package/dist/cli/{chunk-XPAUNFOL.js → chunk-K6GUKSXH.js} +3 -2
- package/dist/cli/chunk-K6GUKSXH.js.map +1 -0
- package/dist/cli/{chunk-6VANO7KB.js → chunk-KDRUEXII.js} +147 -20
- package/dist/cli/chunk-KDRUEXII.js.map +1 -0
- package/dist/cli/{chunk-NCBP5D6E.js → chunk-LBLR4CUZ.js} +2 -2
- package/dist/cli/{chunk-2425HK6U.js → chunk-LGEKVMMV.js} +7 -2
- package/dist/cli/{chunk-2425HK6U.js.map → chunk-LGEKVMMV.js.map} +1 -1
- package/dist/cli/{chunk-7SGGXNB2.js → chunk-OJVITDGB.js} +2 -2
- package/dist/cli/{chunk-SE7C5ZSI.js → chunk-QVDWH2A2.js} +3 -3
- package/dist/cli/{chunk-WRONKNIH.js → chunk-QVUFWDD2.js} +2 -2
- package/dist/cli/{chunk-3AAG2CUT.js → chunk-R6GQKKBW.js} +2 -2
- package/dist/cli/{chunk-E7TAHQ4A.js → chunk-RRXUIPWG.js} +19 -18
- package/dist/cli/chunk-RRXUIPWG.js.map +1 -0
- package/dist/cli/{chunk-CXVWUPA3.js → chunk-TKVXTQ3T.js} +26 -26
- package/dist/cli/chunk-TKVXTQ3T.js.map +1 -0
- package/dist/cli/{chunk-DHRVZJ2D.js → chunk-UDVFBEXC.js} +3 -3
- package/dist/cli/{chunk-7YW6TPXK.js → chunk-VC2CQA5D.js} +9 -9
- package/dist/cli/{chunk-M4E5JK6S.js → chunk-VJMBISEI.js} +2 -2
- package/dist/cli/{chunk-TDSBASOF.js → chunk-VKYSZKH2.js} +2 -2
- package/dist/cli/{chunk-7LOJS3LV.js → chunk-VMUUFWFF.js} +2 -2
- package/dist/cli/{chunk-MIIZJD5O.js → chunk-VNQGCA3Q.js} +2 -2
- package/dist/cli/{chunk-2AASOSD5.js → chunk-WF7TPVZM.js} +2 -2
- package/dist/cli/{chunk-JLQDNLZF.js → chunk-YDPLF7XR.js} +26 -14
- package/dist/cli/chunk-YDPLF7XR.js.map +1 -0
- package/dist/cli/{code-2JIHL5M2.js → code-C24TUAE5.js} +39 -34
- package/dist/cli/code-C24TUAE5.js.map +1 -0
- package/dist/cli/{commands-OPT5AJNH.js → commands-RR3GIYOK.js} +4 -4
- package/dist/cli/{commit-KA37H6GM.js → commit-FSHPIINM.js} +3 -3
- package/dist/cli/{desktop-5ONTRU3C.js → desktop-7NCHPEFB.js} +263 -36
- package/dist/cli/desktop-7NCHPEFB.js.map +1 -0
- package/dist/cli/{diff-SOIA7AKH.js → diff-RAAHHLHV.js} +8 -8
- package/dist/cli/{doctor-RCUP4XRV.js → doctor-PKVQIXRT.js} +9 -9
- package/dist/cli/{events-6KHITNX4.js → events-VRYXOSKI.js} +3 -3
- package/dist/cli/index.js +81 -40
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/{mcp-JP5OWD6R.js → mcp-CRJ26PP4.js} +2 -2
- package/dist/cli/{mcp-browse-ONCJJPJN.js → mcp-browse-QPAOWZOP.js} +2 -2
- package/dist/cli/{mcp-inspect-TPLHW5JA.js → mcp-inspect-CVCLABRS.js} +4 -4
- package/dist/cli/{prompt-RJDNCQAP.js → prompt-SKYXERSI.js} +4 -4
- package/dist/cli/{prune-sessions-MKEATRVL.js → prune-sessions-SEWX7GP6.js} +2 -2
- package/dist/cli/{replay-4NILJG4U.js → replay-KPDW2ZMJ.js} +9 -9
- package/dist/cli/{run-WFGXB4SB.js → run-WIKDIXTG.js} +17 -17
- package/dist/cli/{server-5VFQP3PV.js → server-P6V2G3P6.js} +82 -34
- package/dist/cli/server-P6V2G3P6.js.map +1 -0
- package/dist/cli/{sessions-5XDJDALO.js → sessions-2NULRMSA.js} +15 -15
- package/dist/cli/{setup-F6XSWLRA.js → setup-Y5WDBQFL.js} +6 -6
- package/dist/cli/{stats-ALHBZICE.js → stats-T7BL2YOR.js} +6 -6
- package/dist/cli/{version-JVRAHBMM.js → version-3KWDNWLN.js} +15 -15
- package/dist/index.d.ts +31 -10
- package/dist/index.js +505 -66
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/cli/chat-W7LAWEN6.js +0 -51
- package/dist/cli/chunk-6VANO7KB.js.map +0 -1
- package/dist/cli/chunk-CXVWUPA3.js.map +0 -1
- package/dist/cli/chunk-DGA5QYFM.js.map +0 -1
- package/dist/cli/chunk-E7TAHQ4A.js.map +0 -1
- package/dist/cli/chunk-JLQDNLZF.js.map +0 -1
- package/dist/cli/chunk-JVQT5IYP.js.map +0 -1
- package/dist/cli/chunk-SPXN5JIT.js.map +0 -1
- package/dist/cli/chunk-TEUDEGX2.js.map +0 -1
- package/dist/cli/chunk-WQ6ZRDQM.js.map +0 -1
- package/dist/cli/chunk-XPAUNFOL.js.map +0 -1
- package/dist/cli/chunk-ZOQHVQON.js.map +0 -1
- package/dist/cli/code-2JIHL5M2.js.map +0 -1
- package/dist/cli/desktop-5ONTRU3C.js.map +0 -1
- package/dist/cli/server-5VFQP3PV.js.map +0 -1
- /package/dist/cli/{acp-LKJU5DZX.js.map → acp-QK3DMC53.js.map} +0 -0
- /package/dist/cli/{chat-W7LAWEN6.js.map → chat-VV5UWY4V.js.map} +0 -0
- /package/dist/cli/{chunk-K3AIFMI6.js.map → chunk-6J6BSUCR.js.map} +0 -0
- /package/dist/cli/{chunk-C72TNHDE.js.map → chunk-BWYVFFKR.js.map} +0 -0
- /package/dist/cli/{chunk-EAOL43HB.js.map → chunk-BYYVYJDX.js.map} +0 -0
- /package/dist/cli/{chunk-HNXDZGC6.js.map → chunk-CI2PF5QX.js.map} +0 -0
- /package/dist/cli/{chunk-IYQ325V7.js.map → chunk-E5WCLUIU.js.map} +0 -0
- /package/dist/cli/{chunk-YRLC2EDF.js.map → chunk-EQATK2L2.js.map} +0 -0
- /package/dist/cli/{chunk-R2ASNSEO.js.map → chunk-FDKOUJKZ.js.map} +0 -0
- /package/dist/cli/{chunk-JVFEJAJX.js.map → chunk-GDKB2PPK.js.map} +0 -0
- /package/dist/cli/{chunk-NCBP5D6E.js.map → chunk-LBLR4CUZ.js.map} +0 -0
- /package/dist/cli/{chunk-7SGGXNB2.js.map → chunk-OJVITDGB.js.map} +0 -0
- /package/dist/cli/{chunk-SE7C5ZSI.js.map → chunk-QVDWH2A2.js.map} +0 -0
- /package/dist/cli/{chunk-WRONKNIH.js.map → chunk-QVUFWDD2.js.map} +0 -0
- /package/dist/cli/{chunk-3AAG2CUT.js.map → chunk-R6GQKKBW.js.map} +0 -0
- /package/dist/cli/{chunk-DHRVZJ2D.js.map → chunk-UDVFBEXC.js.map} +0 -0
- /package/dist/cli/{chunk-7YW6TPXK.js.map → chunk-VC2CQA5D.js.map} +0 -0
- /package/dist/cli/{chunk-M4E5JK6S.js.map → chunk-VJMBISEI.js.map} +0 -0
- /package/dist/cli/{chunk-TDSBASOF.js.map → chunk-VKYSZKH2.js.map} +0 -0
- /package/dist/cli/{chunk-7LOJS3LV.js.map → chunk-VMUUFWFF.js.map} +0 -0
- /package/dist/cli/{chunk-MIIZJD5O.js.map → chunk-VNQGCA3Q.js.map} +0 -0
- /package/dist/cli/{chunk-2AASOSD5.js.map → chunk-WF7TPVZM.js.map} +0 -0
- /package/dist/cli/{commands-OPT5AJNH.js.map → commands-RR3GIYOK.js.map} +0 -0
- /package/dist/cli/{commit-KA37H6GM.js.map → commit-FSHPIINM.js.map} +0 -0
- /package/dist/cli/{diff-SOIA7AKH.js.map → diff-RAAHHLHV.js.map} +0 -0
- /package/dist/cli/{doctor-RCUP4XRV.js.map → doctor-PKVQIXRT.js.map} +0 -0
- /package/dist/cli/{events-6KHITNX4.js.map → events-VRYXOSKI.js.map} +0 -0
- /package/dist/cli/{mcp-JP5OWD6R.js.map → mcp-CRJ26PP4.js.map} +0 -0
- /package/dist/cli/{mcp-browse-ONCJJPJN.js.map → mcp-browse-QPAOWZOP.js.map} +0 -0
- /package/dist/cli/{mcp-inspect-TPLHW5JA.js.map → mcp-inspect-CVCLABRS.js.map} +0 -0
- /package/dist/cli/{prompt-RJDNCQAP.js.map → prompt-SKYXERSI.js.map} +0 -0
- /package/dist/cli/{prune-sessions-MKEATRVL.js.map → prune-sessions-SEWX7GP6.js.map} +0 -0
- /package/dist/cli/{replay-4NILJG4U.js.map → replay-KPDW2ZMJ.js.map} +0 -0
- /package/dist/cli/{run-WFGXB4SB.js.map → run-WIKDIXTG.js.map} +0 -0
- /package/dist/cli/{sessions-5XDJDALO.js.map → sessions-2NULRMSA.js.map} +0 -0
- /package/dist/cli/{setup-F6XSWLRA.js.map → setup-Y5WDBQFL.js.map} +0 -0
- /package/dist/cli/{stats-ALHBZICE.js.map → stats-T7BL2YOR.js.map} +0 -0
- /package/dist/cli/{version-JVRAHBMM.js.map → version-3KWDNWLN.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/cli/commands/desktop.ts","../../src/desktop/qq-settings.ts"],"sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { existsSync, statSync, writeSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { isAbsolute, join, resolve } from \"node:path\";\nimport { stdin } from \"node:process\";\nimport { createInterface } from \"node:readline\";\nimport {\n type FileWithStats,\n listDirectory,\n listFilesWithStatsAsync,\n parseAtQuery,\n rankPickerCandidates,\n} from \"../../at-mentions.js\";\nimport { pickPrimaryBalance } from \"../../client.js\";\nimport { codeSystemPrompt } from \"../../code/prompt.js\";\nimport { buildCodeToolset } from \"../../code/setup.js\";\nimport {\n type DesktopOpenTab,\n type EditMode,\n isPlausibleKey,\n loadApiKey,\n loadBaseUrl,\n loadDesktopOpenTabs,\n loadEditMode,\n loadEditor,\n loadPreset,\n loadQQConfig,\n loadReasoningEffort,\n loadRecentWorkspaces,\n loadResolvedSkillPaths,\n loadWorkspaceDir,\n pushRecentWorkspace,\n readConfig,\n saveApiKey,\n saveBaseUrl,\n saveDesktopOpenTabs,\n saveEditMode,\n saveEditor,\n savePreset,\n saveReasoningEffort,\n saveWorkspaceDir,\n writeConfig,\n} from \"../../config.js\";\nimport { Eventizer } from \"../../core/eventize.js\";\nimport type { Event as KernelEvent } from \"../../core/events.js\";\nimport {\n type CheckpointVerdict,\n type ChoiceVerdict,\n type ConfirmationChoice,\n type PlanVerdict,\n type RevisionVerdict,\n pauseGate,\n} from \"../../core/pause-gate.js\";\nimport { autoResolveVerdict } from \"../../core/pause-policy.js\";\nimport {\n loadDesktopQQState,\n saveDesktopQQSettings,\n setDesktopQQEnabled,\n} from \"../../desktop/qq-settings.js\";\nimport { loadDotenv } from \"../../env.js\";\nimport { CacheFirstLoop, DeepSeekClient, ImmutablePrefix } from \"../../index.js\";\nimport { parseMcpSpec } from \"../../mcp/spec.js\";\nimport {\n deleteSession,\n listSessionsForWorkspace,\n loadSessionMessages,\n loadSessionMeta,\n patchSessionMeta,\n sessionPath,\n timestampSuffix,\n} from \"../../memory/session.js\";\nimport { MemoryStore } from \"../../memory/user.js\";\nimport { SkillStore } from \"../../skills.js\";\nimport { countTokensBounded } from \"../../tokenizer.js\";\nimport type { ChoiceOption } from \"../../tools/choice.js\";\nimport type { ChatMessage } from \"../../types.js\";\nimport { VERSION } from \"../../version.js\";\nimport { canonicalPresetName, resolvePreset } from \"../ui/presets.js\";\nimport { type McpRuntime, createMcpRuntime } from \"./mcp-runtime.js\";\n\nexport interface DesktopOptions {\n model: string;\n budgetUsd?: number;\n /** Root directory the agent's filesystem tools operate inside. Defaults to cwd. */\n dir?: string;\n}\n\ntype InMessage = { tabId?: string } & (\n | { cmd: \"user_input\"; text: string }\n | { cmd: \"abort\" }\n | { cmd: \"confirm_response\"; id: number; response: ConfirmationChoice }\n | { cmd: \"choice_response\"; id: number; response: ChoiceVerdict }\n | { cmd: \"plan_response\"; id: number; response: PlanVerdict }\n | { cmd: \"checkpoint_response\"; id: number; response: CheckpointVerdict }\n | { cmd: \"revision_response\"; id: number; response: RevisionVerdict }\n | { cmd: \"session_list\" }\n | { cmd: \"session_delete\"; name: string }\n | { cmd: \"session_load\"; name: string }\n | { cmd: \"new_chat\" }\n | { cmd: \"setup_save_key\"; key: string }\n | { cmd: \"settings_get\" }\n | {\n cmd: \"settings_save\";\n reasoningEffort?: \"high\" | \"max\";\n editMode?: EditMode;\n budgetUsd?: number | null;\n baseUrl?: string;\n workspaceDir?: string;\n preset?: \"auto\" | \"flash\" | \"pro\";\n editor?: string;\n }\n | { cmd: \"qq_status_get\" }\n | { cmd: \"qq_connect\" }\n | { cmd: \"qq_disconnect\" }\n | {\n cmd: \"qq_config_save\";\n appId?: string;\n appSecret?: string;\n sandbox: boolean;\n }\n | { cmd: \"mention_query\"; query: string; nonce: number }\n | { cmd: \"mention_preview\"; path: string; nonce: number }\n | { cmd: \"mention_picked\"; path: string }\n | { cmd: \"tab_open\"; workspaceDir?: string }\n | { cmd: \"tab_close\" }\n | { cmd: \"tab_activate\"; tabId: string }\n | { cmd: \"mcp_specs_get\" }\n | { cmd: \"mcp_specs_add\"; spec: string }\n | { cmd: \"mcp_specs_remove\"; spec: string }\n | { cmd: \"skills_get\" }\n | { cmd: \"skill_run\"; name: string; args?: string }\n | { cmd: \"jobs_list\" }\n | { cmd: \"jobs_stop\"; jobId: number }\n | { cmd: \"jobs_stop_all\" }\n | { cmd: \"compact_history\" }\n | { cmd: \"retry\" }\n | { cmd: \"btw\"; text: string }\n);\n\ninterface NeedsSetupEvent {\n type: \"$needs_setup\";\n reason: \"no_api_key\";\n}\n\ninterface SettingsEvent {\n type: \"$settings\";\n reasoningEffort: \"high\" | \"max\";\n editMode: EditMode;\n budgetUsd: number | null;\n baseUrl?: string;\n apiKeyPrefix?: string;\n workspaceDir: string;\n recentWorkspaces: string[];\n model: string;\n preset: \"auto\" | \"flash\" | \"pro\";\n editor?: string;\n version: string;\n}\n\ninterface QQSettingsEvent {\n type: \"$qq_settings\";\n appId?: string;\n appSecret?: string;\n sandbox: boolean;\n enabled: boolean;\n configured: boolean;\n connected: boolean;\n appIdPreview?: string;\n access: string;\n}\n\ninterface BalanceEvent {\n type: \"$balance\";\n currency: string;\n total: number;\n isAvailable: boolean;\n}\n\ninterface PlanRequiredEvent {\n type: \"$plan_required\";\n id: number;\n plan: string;\n steps?: unknown[];\n summary?: string;\n}\n\ninterface SessionsEvent {\n type: \"$sessions\";\n items: { name: string; messageCount: number; mtime: string }[];\n}\n\ninterface MentionResultsEvent {\n type: \"$mention_results\";\n nonce: number;\n query: string;\n results: string[];\n}\n\ninterface MentionPreviewEvent {\n type: \"$mention_preview\";\n nonce: number;\n path: string;\n head: string;\n totalLines: number;\n}\n\ninterface TabOpenedEvent {\n type: \"$tab_opened\";\n workspaceDir: string;\n /** True when the frontend should focus this tab (user-opened, or the restored focused tab). */\n active?: boolean;\n}\n\ninterface TabClosedEvent {\n type: \"$tab_closed\";\n}\n\ntype LoadedSegment =\n | { kind: \"text\"; text: string }\n | { kind: \"reasoning\"; text: string }\n | {\n kind: \"tool\";\n callId: string;\n name: string;\n args: string;\n result?: string;\n ok?: boolean;\n };\n\ntype LoadedMessage =\n | { kind: \"user\"; text: string }\n | {\n kind: \"assistant\";\n turn: number;\n segments: LoadedSegment[];\n pending: false;\n };\n\ninterface SessionLoadedEvent {\n type: \"$session_loaded\";\n name: string;\n messages: LoadedMessage[];\n carryover: {\n totalCostUsd: number;\n cacheHitTokens: number;\n cacheMissTokens: number;\n };\n}\n\ninterface SessionEmptyEvent {\n type: \"$session_empty\";\n name: string;\n sizeBytes: number;\n}\n\ninterface ConfirmRequiredEvent {\n type: \"$confirm_required\";\n id: number;\n kind: \"run_command\" | \"run_background\";\n command: string;\n}\n\ninterface PathAccessRequiredEvent {\n type: \"$path_access_required\";\n id: number;\n path: string;\n intent: \"read\" | \"write\";\n toolName: string;\n sandboxRoot: string;\n allowPrefix: string;\n}\n\ninterface ChoiceRequiredEvent {\n type: \"$choice_required\";\n id: number;\n question: string;\n options: ChoiceOption[];\n allowCustom: boolean;\n}\n\ninterface PlanStepLite {\n id: string;\n title: string;\n action: string;\n risk?: \"low\" | \"med\" | \"high\";\n}\n\ninterface CheckpointRequiredEvent {\n type: \"$checkpoint_required\";\n id: number;\n stepId: string;\n title?: string;\n result: string;\n notes?: string;\n completed: number;\n total: number;\n}\n\ninterface RevisionRequiredEvent {\n type: \"$revision_required\";\n id: number;\n reason: string;\n remainingSteps: PlanStepLite[];\n summary?: string;\n}\n\ninterface StepCompletedEvent {\n type: \"$step_completed\";\n stepId: string;\n title?: string;\n result: string;\n notes?: string;\n}\n\ninterface PlanClearedEvent {\n type: \"$plan_cleared\";\n}\n\ntype McpSpecStatus = \"configured\" | \"handshake\" | \"connected\" | \"failed\" | \"disabled\";\n\ninterface McpSpecInfo {\n raw: string;\n name: string | null;\n transport: \"stdio\" | \"sse\" | \"streamable-http\";\n summary: string;\n parseError?: string;\n status: McpSpecStatus;\n statusReason?: string;\n toolCount?: number;\n}\n\ninterface McpSpecsEvent {\n type: \"$mcp_specs\";\n specs: McpSpecInfo[];\n bridged: boolean;\n}\n\ninterface CtxBreakdownEvent {\n type: \"$ctx_breakdown\";\n reservedTokens: number;\n}\n\ninterface MemoryEntryInfo {\n name: string;\n scope: \"project\" | \"global\";\n description: string;\n}\n\ninterface MemoryEvent {\n type: \"$memory\";\n entries: MemoryEntryInfo[];\n}\n\ninterface SkillInfo {\n name: string;\n description: string;\n scope: \"project\" | \"custom\" | \"global\" | \"builtin\";\n path: string;\n runAs: \"inline\" | \"subagent\";\n model?: string;\n}\n\ninterface SkillsEvent {\n type: \"$skills\";\n items: SkillInfo[];\n}\n\ninterface JobInfoPayload {\n id: number;\n tabId: string;\n sessionLabel: string;\n command: string;\n pid: number | null;\n running: boolean;\n exitCode: number | null;\n startedAt: number;\n outputTail: string;\n spawnError?: string;\n}\n\ninterface JobsEvent {\n type: \"$jobs\";\n items: JobInfoPayload[];\n}\n\ninterface RetryResultEvent {\n type: \"$retry_result\";\n text: string;\n}\n\ninterface BtwResultEvent {\n type: \"$btw_result\";\n question: string;\n answer: string;\n}\n\n/** Direct fd write — bypasses Node's stream layer (and its piped-output\n * block buffering) so every JSON line reaches Rust the moment it's\n * produced, not whenever the next 8 KB flushes. */\ntype EmittableEvent =\n | KernelEvent\n | { type: \"$ready\" }\n | { type: \"$error\"; message: string }\n | { type: \"$turn_complete\" }\n | ConfirmRequiredEvent\n | PathAccessRequiredEvent\n | ChoiceRequiredEvent\n | PlanRequiredEvent\n | CheckpointRequiredEvent\n | RevisionRequiredEvent\n | StepCompletedEvent\n | PlanClearedEvent\n | SessionsEvent\n | SessionLoadedEvent\n | SessionEmptyEvent\n | NeedsSetupEvent\n | SettingsEvent\n | QQSettingsEvent\n | BalanceEvent\n | MentionResultsEvent\n | MentionPreviewEvent\n | RetryResultEvent\n | BtwResultEvent\n | TabOpenedEvent\n | TabClosedEvent\n | McpSpecsEvent\n | SkillsEvent\n | CtxBreakdownEvent\n | MemoryEvent\n | JobsEvent;\n\nfunction emit(ev: EmittableEvent, tabId?: string): void {\n const payload = tabId ? { ...ev, tabId } : ev;\n writeSync(1, Buffer.from(`${JSON.stringify(payload)}\\n`, \"utf8\"));\n}\n\nfunction tailLines(s: string, n: number): string {\n if (!s) return \"\";\n const lines = s.split(/\\r?\\n/);\n return lines.slice(-n).join(\"\\n\");\n}\n\nfunction buildLoadedMessages(records: ChatMessage[]): LoadedMessage[] {\n const out: LoadedMessage[] = [];\n let turn = 0;\n let pendingAssistantIdx = -1;\n for (const rec of records) {\n if (rec.role === \"system\") continue;\n if (rec.role === \"user\") {\n out.push({ kind: \"user\", text: rec.content ?? \"\" });\n pendingAssistantIdx = -1;\n continue;\n }\n if (rec.role === \"assistant\") {\n turn++;\n const segments: LoadedSegment[] = [];\n if (rec.reasoning_content) segments.push({ kind: \"reasoning\", text: rec.reasoning_content });\n if (rec.content) segments.push({ kind: \"text\", text: rec.content });\n if (rec.tool_calls) {\n for (let i = 0; i < rec.tool_calls.length; i++) {\n const tc = rec.tool_calls[i];\n if (!tc) continue;\n segments.push({\n kind: \"tool\",\n callId: tc.id ?? `tc-r-${turn}-${i}`,\n name: tc.function?.name ?? \"\",\n args: tc.function?.arguments ?? \"\",\n });\n }\n }\n out.push({ kind: \"assistant\", turn, segments, pending: false });\n pendingAssistantIdx = out.length - 1;\n continue;\n }\n if (rec.role === \"tool\") {\n if (pendingAssistantIdx < 0) continue;\n const host = out[pendingAssistantIdx];\n if (host?.kind !== \"assistant\") continue;\n const callId = rec.tool_call_id;\n if (!callId) continue;\n const seg = host.segments.find((s) => s.kind === \"tool\" && s.callId === callId);\n if (seg && seg.kind === \"tool\") {\n seg.result = rec.content ?? \"\";\n seg.ok = !/error|failed/i.test(seg.result.slice(0, 200));\n }\n }\n }\n return out;\n}\n\nfunction emitSettings(tab: Tab): void {\n const apiKey = loadApiKey();\n const recent = loadRecentWorkspaces().filter((p) => p !== tab.rootDir);\n emit(\n {\n type: \"$settings\",\n reasoningEffort: loadReasoningEffort(),\n editMode: loadEditMode(),\n budgetUsd: tab.runtime?.loop.budgetUsd ?? null,\n baseUrl: loadBaseUrl(),\n apiKeyPrefix: apiKey ? `${apiKey.slice(0, 6)}…${apiKey.slice(-3)}` : undefined,\n workspaceDir: tab.rootDir,\n recentWorkspaces: recent,\n model: tab.currentModel,\n preset: tab.currentPreset,\n editor: loadEditor(),\n version: VERSION,\n },\n tab.id,\n );\n}\n\nfunction emitQQSettings(tab: Tab): void {\n emit({ type: \"$qq_settings\", ...loadDesktopQQState() }, tab.id);\n}\n\nasync function emitBalance(tab: Tab): Promise<void> {\n if (!tab.runtime) return;\n const bal = await tab.runtime.loop.client.getBalance().catch(() => null);\n if (!bal) return;\n const primary = pickPrimaryBalance(bal.balance_infos);\n if (!primary) return;\n emit(\n {\n type: \"$balance\",\n currency: primary.currency,\n total: Number(primary.total_balance),\n isAvailable: bal.is_available,\n },\n tab.id,\n );\n}\n\nfunction emitSessions(tab: Tab): void {\n try {\n const items = listSessionsForWorkspace(tab.rootDir).map((s) => ({\n name: s.name,\n messageCount: s.messageCount,\n mtime: s.mtime.toISOString(),\n summary: s.meta.summary,\n }));\n emit({ type: \"$sessions\", items }, tab.id);\n } catch (err) {\n emit({ type: \"$error\", message: `session_list failed: ${(err as Error).message}` }, tab.id);\n }\n}\n\nfunction summarizeMcpSpec(raw: string): McpSpecInfo {\n try {\n const parsed = parseMcpSpec(raw);\n if (parsed.transport === \"stdio\") {\n const argv = [parsed.command, ...parsed.args].join(\" \");\n return {\n raw,\n name: parsed.name,\n transport: \"stdio\",\n summary: `stdio · ${argv}`,\n status: \"configured\",\n };\n }\n return {\n raw,\n name: parsed.name,\n transport: parsed.transport,\n summary: `${parsed.transport} · ${parsed.url}`,\n status: \"configured\",\n };\n } catch (err) {\n return {\n raw,\n name: null,\n transport: \"stdio\",\n summary: raw,\n parseError: (err as Error).message,\n status: \"failed\",\n statusReason: (err as Error).message,\n };\n }\n}\n\nfunction emitMcpSpecs(tab: Tab): void {\n const cfg = readConfig();\n const specs = (cfg.mcp ?? []).map((raw) => {\n const base = summarizeMcpSpec(raw);\n const live = tab.mcpStatuses.get(raw);\n if (!live) return base;\n return { ...base, status: live.kind, statusReason: live.reason, toolCount: live.toolCount };\n });\n const bridged = specs.length > 0 && specs.every((s) => s.status === \"connected\");\n emit({ type: \"$mcp_specs\", specs, bridged }, tab.id);\n}\n\nfunction emitMemory(tab: Tab): void {\n try {\n const store = new MemoryStore({ projectRoot: tab.rootDir });\n const entries: MemoryEntryInfo[] = store.list().map((e) => ({\n name: e.name,\n scope: e.scope,\n description: e.description,\n }));\n emit({ type: \"$memory\", entries }, tab.id);\n } catch (err) {\n emit({ type: \"$error\", message: `memory_get failed: ${(err as Error).message}` }, tab.id);\n }\n}\n\n// reserved = system prompt + tool specs, constant for the tab's lifetime once\n// the loop is built. The growing log portion is already covered by the\n// per-turn cache hit/miss numbers in `model.final`.\nfunction emitCtxBreakdown(tab: Tab): void {\n if (!tab.runtime) return;\n try {\n const sys = countTokensBounded(tab.runtime.loop.prefix.system);\n const tools = countTokensBounded(JSON.stringify(tab.runtime.loop.prefix.toolSpecs));\n emit({ type: \"$ctx_breakdown\", reservedTokens: sys + tools }, tab.id);\n } catch {\n // tokenizer warmup can throw on first call before the data file loads\n }\n}\n\nfunction emitSkills(tab: Tab): void {\n try {\n const store = new SkillStore({\n projectRoot: tab.rootDir,\n customSkillPaths: loadResolvedSkillPaths(tab.rootDir),\n });\n const items = store.list().map((s) => ({\n name: s.name,\n description: s.description,\n scope: s.scope,\n path: s.path,\n runAs: s.runAs,\n model: s.model,\n }));\n emit({ type: \"$skills\", items }, tab.id);\n } catch (err) {\n emit({ type: \"$error\", message: `skills_get failed: ${(err as Error).message}` }, tab.id);\n }\n}\n\ninterface RuntimeState {\n loop: CacheFirstLoop;\n eventizer: Eventizer;\n ctx: { model: string; prefixHash: string; reasoningEffort: \"high\" | \"max\" };\n}\n\ntype SymbolEntry = { name: string; path: string; line: number; kind: string };\n\ninterface Tab {\n readonly id: string;\n rootDir: string;\n currentSession: string;\n currentPreset: \"auto\" | \"flash\" | \"pro\";\n currentModel: string;\n budgetUsd: number | undefined;\n /** null while the tab is bootstrapping — see `initTabToolset`. UI gates input on `$ready`, which only fires once this is set. */\n toolset: Awaited<ReturnType<typeof buildCodeToolset>> | null;\n /** Empty while bootstrapping; populated together with `toolset`. */\n system: string;\n runtime: RuntimeState | null;\n aborter: AbortController | null;\n fileIndex: FileWithStats[] | null;\n fileIndexBuilding: Promise<FileWithStats[]> | null;\n fileIndexBuiltAt: number;\n symbolIndex: SymbolEntry[] | null;\n symbolBuilding: Promise<SymbolEntry[]> | null;\n recentMentions: string[];\n /** Pause-gate ids waiting on this tab — abort uses these to free stranded plan_checkpoint / plan_revision / shell-confirm callers. */\n pendingGateIds: Set<number>;\n /** Step ids already marked complete in the in-flight plan — also tells UI when a plan is \"active\". */\n completedStepIds: Set<string>;\n /** Total steps in the in-flight plan (0 = no active plan / steps not provided). */\n planTotalSteps: number;\n mcpRuntime: McpRuntime | null;\n mcpStatuses: Map<string, { kind: McpSpecStatus; reason?: string; toolCount?: number }>;\n}\n\nlet tabCounter = 0;\nfunction nextTabId(): string {\n tabCounter++;\n return `t${tabCounter}`;\n}\n\nfunction mintSessionFor(rootDir: string): string {\n const name = `desktop-${timestampSuffix()}-${tabCounter}`;\n try {\n patchSessionMeta(name, { workspace: rootDir });\n } catch {\n // session meta is for filtering only — failure shouldn't block chat\n }\n return name;\n}\n\nfunction buildRuntimeFor(tab: Tab): RuntimeState {\n if (!tab.toolset) throw new Error(\"buildRuntimeFor called before initTabToolset finished\");\n const toolset = tab.toolset;\n const client = new DeepSeekClient({ baseUrl: loadBaseUrl() });\n const prefix = new ImmutablePrefix({ system: tab.system, toolSpecs: toolset.tools.specs() });\n const reasoningEffort = loadReasoningEffort();\n const { autoEscalate } = resolvePreset(tab.currentPreset);\n const loop = new CacheFirstLoop({\n client,\n prefix,\n tools: toolset.tools,\n model: tab.currentModel,\n budgetUsd: tab.budgetUsd,\n session: tab.currentSession,\n reasoningEffort,\n autoEscalate,\n });\n const eventizer = new Eventizer();\n const ctx = { model: tab.currentModel, prefixHash: prefix.fingerprint, reasoningEffort };\n return { loop, eventizer, ctx };\n}\n\nconst TS_EXPORT_RE =\n /^export\\s+(?:default\\s+)?(?:async\\s+)?(function|class|const|let|var|interface|type|enum)\\s+\\*?\\s*(\\w+)/;\n\n/** TTL on the in-memory file index — without this, files deleted / renamed since the last @ popup still show up as candidates. 10s balances \"fresh enough for typical edit-then-mention flows\" against \"don't re-scan 5000 files on every keystroke\". */\nconst FILE_INDEX_TTL_MS = 10_000;\n\nasync function getFileIndexFor(tab: Tab): Promise<FileWithStats[]> {\n const fresh = tab.fileIndex && Date.now() - tab.fileIndexBuiltAt < FILE_INDEX_TTL_MS;\n if (fresh) return tab.fileIndex as FileWithStats[];\n if (tab.fileIndexBuilding) return tab.fileIndexBuilding;\n tab.fileIndexBuilding = listFilesWithStatsAsync(tab.rootDir, { maxResults: 5000 })\n .then((res) => {\n tab.fileIndex = res;\n tab.fileIndexBuiltAt = Date.now();\n tab.fileIndexBuilding = null;\n return res;\n })\n .catch((err) => {\n tab.fileIndexBuilding = null;\n throw err;\n });\n return tab.fileIndexBuilding;\n}\n\nasync function getSymbolIndexFor(tab: Tab): Promise<SymbolEntry[]> {\n if (tab.symbolIndex) return tab.symbolIndex;\n if (tab.symbolBuilding) return tab.symbolBuilding;\n tab.symbolBuilding = (async () => {\n const files = await getFileIndexFor(tab);\n const sourceExts = /\\.(?:ts|tsx|js|jsx|mts|cts)$/;\n const candidates = files.filter((f) => sourceExts.test(f.path)).slice(0, 1500);\n const out: SymbolEntry[] = [];\n const PARALLEL = 16;\n for (let i = 0; i < candidates.length; i += PARALLEL) {\n const batch = candidates.slice(i, i + PARALLEL);\n await Promise.all(\n batch.map(async (entry) => {\n const abs = isAbsolute(entry.path) ? entry.path : join(tab.rootDir, entry.path);\n try {\n const text = await readFile(abs, \"utf8\");\n const lines = text.split(/\\r?\\n/);\n for (let li = 0; li < lines.length; li++) {\n const line = lines[li]!;\n if (!line.startsWith(\"export \")) continue;\n const m = TS_EXPORT_RE.exec(line);\n if (m) out.push({ kind: m[1]!, name: m[2]!, path: entry.path, line: li + 1 });\n }\n } catch {\n // unreadable / binary — skip\n }\n }),\n );\n }\n tab.symbolIndex = out;\n tab.symbolBuilding = null;\n return out;\n })().catch((err) => {\n tab.symbolBuilding = null;\n throw err;\n });\n return tab.symbolBuilding;\n}\n\nfunction rankSymbols(syms: readonly SymbolEntry[], q: string, limit: number): string[] {\n const needle = q.toLowerCase();\n const scored: { entry: SymbolEntry; score: number }[] = [];\n for (const s of syms) {\n const lower = s.name.toLowerCase();\n let score: number;\n if (lower === needle) score = 0;\n else if (lower.startsWith(needle)) score = 100;\n else if (lower.includes(needle)) score = 500 + lower.indexOf(needle);\n else continue;\n scored.push({ entry: s, score });\n }\n scored.sort((a, b) => a.score - b.score || a.entry.name.localeCompare(b.entry.name));\n return scored.slice(0, limit).map((s) => `${s.entry.path}:${s.entry.line}`);\n}\n\nfunction pushMentionRecent(tab: Tab, path: string): void {\n const MAX = 20;\n const idx = tab.recentMentions.indexOf(path);\n if (idx >= 0) tab.recentMentions.splice(idx, 1);\n tab.recentMentions.unshift(path);\n if (tab.recentMentions.length > MAX) tab.recentMentions.length = MAX;\n}\n\n/** The desktop sidecar is a long-running daemon — Tauri spawns this Node process once per app launch and pipes JSON over stdin/stdout. Without these handlers, any orphaned promise rejection (e.g. from an aborted turn whose cleanup races a session-switch — #1074) crashes the process with exit code 1, which the Tauri host surfaces as \"reasonix exited (code 1)\" and a full reconnect cycle. Log loudly so we can find the underlying bug, but don't take the daemon down. */\nexport function installDesktopCrashGuards(\n stderr: { write: (s: string) => unknown } = process.stderr,\n): void {\n process.on(\"unhandledRejection\", (reason) => {\n const err = reason instanceof Error ? reason : new Error(String(reason));\n stderr.write(`[desktop] unhandledRejection: ${err.stack ?? err.message}\\n`);\n });\n process.on(\"uncaughtException\", (err) => {\n stderr.write(`[desktop] uncaughtException: ${err.stack ?? err.message}\\n`);\n });\n}\n\nexport async function desktopCommand(opts: DesktopOptions): Promise<void> {\n loadDotenv();\n installDesktopCrashGuards();\n\n const tabs = new Map<string, Tab>();\n const tabContext = new AsyncLocalStorage<string>();\n // Frontend-reported focused tab — persisted so a restart reopens on it (#1244).\n let lastActiveTabId = \"\";\n\n function activeRunningTab(): Tab | undefined {\n const id = tabContext.getStore();\n return id ? tabs.get(id) : undefined;\n }\n\n /** Synchronous tab construction — no I/O. All cheap, disk-only events (`$settings`, `$sessions`, `$memory`, `$skills`, `$mcp_specs`) can fire against this immediately. The heavy bits (`buildCodeToolset`, MCP probes, runtime construction) happen in `initTabToolset` so the UI shell paints without waiting for them. */\n function createTabSkeleton(initialDir?: string): Tab {\n const dir = resolve(initialDir ?? opts.dir ?? loadWorkspaceDir() ?? process.cwd());\n pushRecentWorkspace(dir);\n const preset = canonicalPresetName(loadPreset());\n const resolved = resolvePreset(preset);\n const model = opts.model || resolved.model;\n const tab: Tab = {\n id: nextTabId(),\n rootDir: dir,\n currentSession: \"\",\n currentPreset: preset,\n currentModel: model,\n budgetUsd: opts.budgetUsd,\n toolset: null,\n system: \"\",\n runtime: null,\n aborter: null,\n fileIndex: null,\n fileIndexBuilding: null,\n fileIndexBuiltAt: 0,\n symbolIndex: null,\n symbolBuilding: null,\n recentMentions: [],\n pendingGateIds: new Set<number>(),\n completedStepIds: new Set<string>(),\n planTotalSteps: 0,\n mcpRuntime: null,\n mcpStatuses: new Map(),\n };\n tab.currentSession = mintSessionFor(dir);\n tabs.set(tab.id, tab);\n return tab;\n }\n\n /** Builds the toolset / system prompt / runtime / MCP bridge for a freshly-created skeleton. Reads `tab.currentModel` at call time so preset changes that landed during the wait are honored. */\n async function initTabToolset(tab: Tab): Promise<void> {\n const toolset = await buildCodeToolset({\n rootDir: tab.rootDir,\n onSkillInstalled: () => emitSkills(tab),\n onJobsChanged: () => emitJobs(),\n });\n tab.toolset = toolset;\n tab.system = codeSystemPrompt(tab.rootDir, {\n hasSemanticSearch: toolset.semantic.enabled,\n modelId: tab.currentModel,\n });\n if (loadApiKey()) {\n process.env.DEEPSEEK_API_KEY = loadApiKey();\n tab.runtime = buildRuntimeFor(tab);\n void bridgeTabMcp(tab);\n }\n }\n\n function bridgeTabMcp(tab: Tab): Promise<void> {\n if (!tab.runtime || !tab.toolset) return Promise.resolve();\n if (tab.mcpRuntime) {\n // Already constructed — reload so new/removed specs settle without restart.\n return tab.mcpRuntime\n .reloadFromConfig(tab.runtime.loop)\n .then(() => emitMcpSpecs(tab))\n .catch((err) => {\n emit({ type: \"$error\", message: `mcp reload failed: ${(err as Error).message}` }, tab.id);\n });\n }\n const requested = (readConfig().mcp ?? []).length;\n if (requested === 0) return Promise.resolve();\n const runtime = createMcpRuntime({\n getTools: () => {\n if (!tab.toolset) throw new Error(\"toolset gone\");\n return tab.toolset.tools;\n },\n getMcpPrefix: () => undefined,\n getRequestedCount: () => requested,\n progressSink: { current: null },\n });\n tab.mcpRuntime = runtime;\n runtime.setLifecycleSink((notice) => {\n if (notice.kind === \"slow\") return; // not surfaced in the desktop panel\n const cfg = readConfig().mcp ?? [];\n const target = cfg.find((raw) => {\n try {\n return parseMcpSpec(raw).name === notice.name;\n } catch {\n return false;\n }\n });\n if (!target) return;\n if (notice.kind === \"handshake\") {\n tab.mcpStatuses.set(target, { kind: \"handshake\" });\n } else if (notice.kind === \"connected\") {\n tab.mcpStatuses.set(target, { kind: \"connected\", toolCount: notice.tools });\n } else if (notice.kind === \"failed\") {\n tab.mcpStatuses.set(target, { kind: \"failed\", reason: notice.reason });\n } else if (notice.kind === \"disabled\") {\n tab.mcpStatuses.set(target, { kind: \"disabled\" });\n }\n emitMcpSpecs(tab);\n });\n return runtime\n .reloadFromConfig(tab.runtime.loop)\n .then(() => undefined)\n .catch((err) => {\n emit({ type: \"$error\", message: `mcp bridge failed: ${(err as Error).message}` }, tab.id);\n });\n }\n\n /** Snapshot of every open tab — workspace dir, loaded session and focus, in tab order. Persisted after open/close/switch so a restart restores the full tab set and each conversation (issues #933, #1244). */\n function persistOpenTabs(): void {\n try {\n saveDesktopOpenTabs(\n Array.from(tabs.values()).map((t) => ({\n dir: t.rootDir,\n session: t.currentSession || undefined,\n active: t.id === lastActiveTabId,\n })),\n );\n } catch {\n // best-effort — disk / perms shouldn't break tab management\n }\n }\n\n async function closeTab(tab: Tab): Promise<void> {\n abortTurn(tab);\n try {\n await tab.toolset?.jobs.shutdown();\n } catch {\n // shutdown errors aren't actionable here\n }\n if (tab.mcpRuntime) {\n try {\n await tab.mcpRuntime.closeAll();\n } catch {\n // MCP shutdown errors aren't actionable here either\n }\n }\n tabs.delete(tab.id);\n if (first && first.id === tab.id) {\n const next = tabs.values().next().value;\n if (next) first = next;\n }\n persistOpenTabs();\n emit({ type: \"$tab_closed\" }, tab.id);\n }\n\n async function runTurn(tab: Tab, text: string): Promise<void> {\n if (!tab.runtime) return;\n const rt = tab.runtime;\n tab.aborter = new AbortController();\n if (tab.currentSession) {\n const existing = loadSessionMeta(tab.currentSession).summary;\n if (!existing || !existing.trim()) {\n const summary = text.replace(/\\s+/g, \" \").trim().slice(0, 60);\n if (summary) {\n try {\n patchSessionMeta(tab.currentSession, { summary });\n } catch {\n // meta is for display only — failure shouldn't block the turn\n }\n }\n }\n }\n await tabContext.run(tab.id, async () => {\n try {\n for await (const ev of rt.loop.step(text)) {\n for (const kev of rt.eventizer.consume(ev, rt.ctx)) emit(kev, tab.id);\n // Memory tools mutate disk state behind the loop's back — the UI\n // panel won't know until we re-emit. Without this the right-hand\n // panel only updates on tab reopen.\n if (ev.role === \"tool\" && (ev.toolName === \"remember\" || ev.toolName === \"forget\")) {\n emitMemory(tab);\n }\n if (tab.aborter?.signal.aborted) break;\n }\n } catch (err) {\n emit({ type: \"$error\", message: (err as Error).message }, tab.id);\n } finally {\n tab.aborter = null;\n emit({ type: \"$turn_complete\" }, tab.id);\n if (tab.planTotalSteps > 0 && tab.completedStepIds.size >= tab.planTotalSteps) {\n tab.completedStepIds.clear();\n tab.planTotalSteps = 0;\n emit({ type: \"$plan_cleared\" }, tab.id);\n }\n emitSessions(tab);\n void emitBalance(tab);\n }\n });\n }\n\n async function switchWorkspace(tab: Tab, nextDir: string): Promise<void> {\n const target = resolve(nextDir);\n if (target === tab.rootDir) {\n emitSettings(tab);\n return;\n }\n if (!existsSync(target) || !statSync(target).isDirectory()) {\n emit({ type: \"$error\", message: `Workspace not found: ${target}` }, tab.id);\n emitSettings(tab);\n return;\n }\n abortTurn(tab);\n try {\n await tab.toolset?.jobs.shutdown();\n } catch {\n // shutdown errors aren't actionable here\n }\n tab.rootDir = target;\n saveWorkspaceDir(target);\n pushRecentWorkspace(target);\n tab.fileIndex = null;\n tab.fileIndexBuilding = null;\n tab.fileIndexBuiltAt = 0;\n tab.symbolIndex = null;\n tab.symbolBuilding = null;\n tab.recentMentions.length = 0;\n tab.currentSession = mintSessionFor(target);\n tab.toolset = await buildCodeToolset({\n rootDir: target,\n onSkillInstalled: () => emitSkills(tab),\n onJobsChanged: () => emitJobs(),\n });\n tab.system = codeSystemPrompt(target, {\n hasSemanticSearch: tab.toolset.semantic.enabled,\n modelId: tab.currentModel,\n });\n if (tab.runtime) tab.runtime = buildRuntimeFor(tab);\n emitSessions(tab);\n emitSettings(tab);\n emitSkills(tab);\n persistOpenTabs();\n }\n\n function forgetGate(id: number): Tab | undefined {\n for (const t of tabs.values()) {\n if (t.pendingGateIds.delete(id)) return t;\n }\n return undefined;\n }\n\n function abortTurn(tab: Tab): void {\n tab.aborter?.abort();\n tab.runtime?.loop.abort();\n }\n\n function tabSessionLabel(tab: Tab): string {\n if (tab.currentSession) {\n try {\n const summary = loadSessionMeta(tab.currentSession).summary?.trim();\n if (summary) return summary;\n } catch {\n // session file unreadable — fall through to workspace basename\n }\n }\n return tab.rootDir.split(/[\\\\/]/).filter(Boolean).pop() ?? tab.rootDir;\n }\n\n function emitJobs(): void {\n const items: JobInfoPayload[] = [];\n for (const t of tabs.values()) {\n const reg = t.toolset?.jobs;\n if (!reg) continue;\n const label = tabSessionLabel(t);\n for (const j of reg.list()) {\n items.push({\n id: j.id,\n tabId: t.id,\n sessionLabel: label,\n command: j.command,\n pid: j.pid,\n running: j.running,\n exitCode: j.exitCode,\n startedAt: j.startedAt,\n outputTail: tailLines(j.output, 8),\n spawnError: j.spawnError,\n });\n }\n }\n items.sort((a, b) => {\n if (a.running !== b.running) return a.running ? -1 : 1;\n return b.startedAt - a.startedAt;\n });\n emit({ type: \"$jobs\", items });\n }\n\n async function stopJob(jobId: number): Promise<boolean> {\n for (const t of tabs.values()) {\n const reg = t.toolset?.jobs;\n if (!reg) continue;\n const hit = reg.list().find((j) => j.id === jobId);\n if (!hit) continue;\n await reg.stop(jobId);\n return true;\n }\n return false;\n }\n\n async function stopAllJobs(): Promise<void> {\n const ops: Promise<unknown>[] = [];\n for (const t of tabs.values()) {\n const reg = t.toolset?.jobs;\n if (!reg) continue;\n for (const j of reg.list()) {\n if (j.running) ops.push(reg.stop(j.id));\n }\n }\n await Promise.allSettled(ops);\n }\n\n function cancelPendingGates(tab: Tab): void {\n const hadActivePlan = tab.planTotalSteps > 0 || tab.completedStepIds.size > 0;\n const ids = [...tab.pendingGateIds];\n tab.pendingGateIds.clear();\n for (const id of ids) pauseGate.cancel(id);\n if (hadActivePlan) {\n tab.completedStepIds.clear();\n tab.planTotalSteps = 0;\n emit({ type: \"$plan_cleared\" }, tab.id);\n }\n }\n\n // `first` is the fallback tab for legacy tabId-less RPC messages. We\n // assign it lazily below so saved-tabs restore (issue #933) can choose\n // the boot dir before construction, and rotate `first` to the next\n // surviving tab when its source closes.\n let first: Tab;\n\n let shuttingDown = false;\n async function gracefulShutdown(): Promise<void> {\n if (shuttingDown) return;\n shuttingDown = true;\n await Promise.allSettled(\n [...tabs.values()].map((t) => t.toolset?.jobs.shutdown(1500) ?? Promise.resolve()),\n );\n process.exit(0);\n }\n process.on(\"SIGTERM\", () => {\n void gracefulShutdown();\n });\n process.on(\"SIGINT\", () => {\n void gracefulShutdown();\n });\n\n pauseGate.on((req) => {\n const tab = activeRunningTab();\n const tabId = tab?.id;\n if (tab) tab.pendingGateIds.add(req.id);\n // Shared auto-resolve policy (e.g. plan_checkpoint in auto/yolo) — must\n // still run BEFORE we emit any UI event, otherwise the surface flickers\n // a card that we'd immediately tear down.\n const auto = autoResolveVerdict(req, loadEditMode());\n if (auto !== null) {\n // plan_checkpoint specifically needs the step-completed signal to flow\n // through so the rail progress ticks. Emit it before resolving.\n if (req.kind === \"plan_checkpoint\") {\n const payload = req.payload as {\n stepId: string;\n title?: string;\n result: string;\n notes?: string;\n };\n if (tab) tab.completedStepIds.add(payload.stepId);\n emit(\n {\n type: \"$step_completed\",\n stepId: payload.stepId,\n title: payload.title,\n result: payload.result,\n notes: payload.notes,\n },\n tabId,\n );\n }\n if (tab) tab.pendingGateIds.delete(req.id);\n pauseGate.resolve(req.id, auto);\n return;\n }\n if (req.kind === \"run_command\" || req.kind === \"run_background\") {\n const payload = req.payload as { command?: string };\n emit(\n { type: \"$confirm_required\", id: req.id, kind: req.kind, command: payload.command ?? \"\" },\n tabId,\n );\n return;\n }\n if (req.kind === \"path_access\") {\n const payload = req.payload as {\n path: string;\n intent: \"read\" | \"write\";\n toolName: string;\n sandboxRoot: string;\n allowPrefix: string;\n };\n emit(\n {\n type: \"$path_access_required\",\n id: req.id,\n path: payload.path,\n intent: payload.intent,\n toolName: payload.toolName,\n sandboxRoot: payload.sandboxRoot,\n allowPrefix: payload.allowPrefix,\n },\n tabId,\n );\n return;\n }\n if (req.kind === \"choice\") {\n const payload = req.payload as {\n question: string;\n options: ChoiceOption[];\n allowCustom: boolean;\n };\n emit(\n {\n type: \"$choice_required\",\n id: req.id,\n question: payload.question,\n options: payload.options,\n allowCustom: payload.allowCustom,\n },\n tabId,\n );\n return;\n }\n if (req.kind === \"plan_proposed\") {\n const payload = req.payload as { plan: string; steps?: PlanStepLite[]; summary?: string };\n if (tab) {\n tab.completedStepIds.clear();\n tab.planTotalSteps = payload.steps?.length ?? 0;\n }\n emit(\n {\n type: \"$plan_required\",\n id: req.id,\n plan: payload.plan,\n steps: payload.steps,\n summary: payload.summary,\n },\n tabId,\n );\n return;\n }\n if (req.kind === \"plan_checkpoint\") {\n const payload = req.payload as {\n stepId: string;\n title?: string;\n result: string;\n notes?: string;\n };\n if (tab) tab.completedStepIds.add(payload.stepId);\n emit(\n {\n type: \"$step_completed\",\n stepId: payload.stepId,\n title: payload.title,\n result: payload.result,\n notes: payload.notes,\n },\n tabId,\n );\n emit(\n {\n type: \"$checkpoint_required\",\n id: req.id,\n stepId: payload.stepId,\n title: payload.title,\n result: payload.result,\n notes: payload.notes,\n completed: tab?.completedStepIds.size ?? 0,\n total: tab?.planTotalSteps ?? 0,\n },\n tabId,\n );\n return;\n }\n if (req.kind === \"plan_revision\") {\n const payload = req.payload as {\n reason: string;\n remainingSteps: PlanStepLite[];\n summary?: string;\n };\n emit(\n {\n type: \"$revision_required\",\n id: req.id,\n reason: payload.reason,\n remainingSteps: payload.remainingSteps,\n summary: payload.summary,\n },\n tabId,\n );\n return;\n }\n // Unknown PauseKind — `never` makes a new kind without a handler a compile\n // error; the runtime cancel is the last-mile defense so the agent loop\n // doesn't hang waiting on a request no one will resolve.\n const exhaustive: never = req.kind;\n process.stderr.write(\n `[desktop] no handler for pause kind \"${String(exhaustive)}\" — auto-cancelling gate id=${req.id}\\n`,\n );\n if (tab) tab.pendingGateIds.delete(req.id);\n pauseGate.cancel(req.id);\n });\n\n // Fast-path: emit disk-only events immediately so the UI shell renders\n // before the toolset finishes building. Heavy work (semantic bootstrap,\n // MCP probes, runtime construction) runs in initTabToolset which fires\n // `$ready` when it completes — until then `state.ready` keeps the\n // composer disabled, so users can't send a message before the runtime\n // exists. emitBalance was already fire-and-forget.\n function bootstrapTab(\n initialDir?: string,\n restore?: { session?: string; active?: boolean },\n ): Tab {\n const tab = createTabSkeleton(initialDir);\n // Reopen the conversation the tab had, if its jsonl is still readable.\n let restoredMessages: LoadedMessage[] | undefined;\n if (restore?.session) {\n try {\n if (existsSync(sessionPath(restore.session))) {\n const msgs = buildLoadedMessages(loadSessionMessages(restore.session));\n if (msgs.length > 0) {\n tab.currentSession = restore.session;\n restoredMessages = msgs;\n }\n }\n } catch {\n // unreadable jsonl — fall back to the freshly minted session\n }\n }\n emit({ type: \"$tab_opened\", workspaceDir: tab.rootDir, active: restore?.active }, tab.id);\n emitSessions(tab);\n emitSettings(tab);\n emitMcpSpecs(tab);\n emitSkills(tab);\n emitMemory(tab);\n emitQQSettings(tab);\n if (restoredMessages) {\n const meta = loadSessionMeta(tab.currentSession);\n emit(\n {\n type: \"$session_loaded\",\n name: tab.currentSession,\n messages: restoredMessages,\n carryover: {\n totalCostUsd: meta.totalCostUsd ?? 0,\n cacheHitTokens: meta.cacheHitTokens ?? 0,\n cacheMissTokens: meta.cacheMissTokens ?? 0,\n },\n },\n tab.id,\n );\n }\n if (!loadApiKey()) emit({ type: \"$needs_setup\", reason: \"no_api_key\" }, tab.id);\n void emitBalance(tab);\n void initTabToolset(tab)\n .then(() => {\n if (loadApiKey()) emit({ type: \"$ready\" }, tab.id);\n emitCtxBreakdown(tab);\n })\n .catch((err) => {\n emit({ type: \"$error\", message: `init failed: ${(err as Error).message}` }, tab.id);\n });\n return tab;\n }\n\n // Restore the full tab set from the previous session — workspace dir,\n // loaded session and focused tab (issues #933, #1244). `--dir` overrides\n // saved tabs so a CLI-supplied workspace stays authoritative. Missing\n // dirs are silently skipped — a deleted workspace shouldn't block boot.\n const savedTabs = opts.dir\n ? []\n : loadDesktopOpenTabs().filter((t) => {\n try {\n return existsSync(t.dir) && statSync(t.dir).isDirectory();\n } catch {\n return false;\n }\n });\n first = bootstrapTab(savedTabs[0]?.dir, savedTabs[0]);\n const restored: Tab[] = [first];\n for (const t of savedTabs.slice(1)) restored.push(bootstrapTab(t.dir, t));\n // Mirror the persisted focus so the next persist round-trips it.\n const activeIdx = savedTabs.findIndex((t) => t.active);\n lastActiveTabId = ((activeIdx >= 0 ? restored[activeIdx] : first) ?? first).id;\n persistOpenTabs();\n\n const rl = createInterface({ input: stdin });\n rl.on(\"line\", (line) => {\n const trimmed = line.trim();\n if (!trimmed) return;\n let msg: InMessage;\n try {\n msg = JSON.parse(trimmed) as InMessage;\n } catch {\n emit({ type: \"$error\", message: `bad json on stdin: ${trimmed.slice(0, 80)}` });\n return;\n }\n\n if (msg.cmd === \"tab_open\") {\n try {\n // A user-opened tab takes focus.\n const opened = bootstrapTab(msg.workspaceDir, { active: true });\n lastActiveTabId = opened.id;\n persistOpenTabs();\n } catch (err) {\n emit({ type: \"$error\", message: `tab_open failed: ${(err as Error).message}` });\n }\n return;\n }\n if (msg.cmd === \"tab_activate\") {\n if (tabs.has(msg.tabId)) {\n lastActiveTabId = msg.tabId;\n persistOpenTabs();\n }\n return;\n }\n if (msg.cmd === \"confirm_response\") {\n forgetGate(msg.id);\n pauseGate.resolve(msg.id, msg.response);\n return;\n }\n if (msg.cmd === \"choice_response\") {\n forgetGate(msg.id);\n pauseGate.resolve(msg.id, msg.response);\n return;\n }\n if (msg.cmd === \"plan_response\") {\n const tab = forgetGate(msg.id);\n if (tab && msg.response.type === \"cancel\") {\n tab.completedStepIds.clear();\n tab.planTotalSteps = 0;\n emit({ type: \"$plan_cleared\" }, tab.id);\n }\n pauseGate.resolve(msg.id, msg.response);\n return;\n }\n if (msg.cmd === \"checkpoint_response\") {\n const tab = forgetGate(msg.id);\n if (tab && msg.response.type === \"stop\") {\n tab.completedStepIds.clear();\n tab.planTotalSteps = 0;\n emit({ type: \"$plan_cleared\" }, tab.id);\n }\n pauseGate.resolve(msg.id, msg.response);\n return;\n }\n if (msg.cmd === \"revision_response\") {\n forgetGate(msg.id);\n pauseGate.resolve(msg.id, msg.response);\n return;\n }\n if (msg.cmd === \"setup_save_key\") {\n const key = msg.key.trim();\n if (!isPlausibleKey(key)) {\n emit({\n type: \"$error\",\n message: \"Key looks too short — paste the full token (16+ chars, no spaces).\",\n });\n return;\n }\n try {\n saveApiKey(key);\n process.env.DEEPSEEK_API_KEY = key;\n for (const tab of tabs.values()) {\n // Skeleton tabs still mid-bootstrap pick up the new key inside\n // initTabToolset's tail when buildCodeToolset settles — don't\n // try to construct a runtime against a null toolset here.\n if (!tab.toolset) {\n emitSettings(tab);\n void emitBalance(tab);\n continue;\n }\n tab.runtime = buildRuntimeFor(tab);\n emit({ type: \"$ready\" }, tab.id);\n emitSettings(tab);\n void emitBalance(tab);\n }\n } catch (err) {\n emit({ type: \"$error\", message: `saveApiKey failed: ${(err as Error).message}` });\n }\n return;\n }\n\n if (msg.cmd === \"jobs_list\") {\n emitJobs();\n return;\n }\n if (msg.cmd === \"jobs_stop\") {\n void stopJob(msg.jobId).finally(() => emitJobs());\n return;\n }\n if (msg.cmd === \"jobs_stop_all\") {\n void stopAllJobs().finally(() => emitJobs());\n return;\n }\n\n const tab = msg.tabId ? tabs.get(msg.tabId) : first;\n if (!tab) {\n // No tabId on the emit ⇒ the renderer's per-tab router drops it\n // silently. Surface to stderr instead so it's at least visible\n // when the desktop is launched from a terminal.\n process.stderr.write(\n `rpc dispatch: unknown tabId=${msg.tabId} for cmd=${msg.cmd} — dropping\\n`,\n );\n return;\n }\n\n if (msg.cmd === \"abort\") {\n abortTurn(tab);\n cancelPendingGates(tab);\n return;\n }\n if (msg.cmd === \"tab_close\") {\n void closeTab(tab);\n return;\n }\n if (msg.cmd === \"mcp_specs_get\") {\n emitMcpSpecs(tab);\n return;\n }\n if (msg.cmd === \"mcp_specs_add\") {\n const spec = msg.spec.trim();\n if (!spec) {\n emit({ type: \"$error\", message: \"mcp_specs_add: spec is empty\" }, tab.id);\n return;\n }\n try {\n parseMcpSpec(spec);\n } catch (err) {\n emit({ type: \"$error\", message: `mcp_specs_add: ${(err as Error).message}` }, tab.id);\n return;\n }\n try {\n const cfg = readConfig();\n const list = cfg.mcp ?? [];\n if (!list.includes(spec)) {\n cfg.mcp = [...list, spec];\n writeConfig(cfg);\n }\n emitMcpSpecs(tab);\n void bridgeTabMcp(tab);\n } catch (err) {\n emit({ type: \"$error\", message: `mcp_specs_add: ${(err as Error).message}` }, tab.id);\n }\n return;\n }\n if (msg.cmd === \"mcp_specs_remove\") {\n try {\n const cfg = readConfig();\n const list = cfg.mcp ?? [];\n if (list.includes(msg.spec)) {\n cfg.mcp = list.filter((s) => s !== msg.spec);\n writeConfig(cfg);\n }\n tab.mcpStatuses.delete(msg.spec);\n emitMcpSpecs(tab);\n void bridgeTabMcp(tab);\n } catch (err) {\n emit({ type: \"$error\", message: `mcp_specs_remove: ${(err as Error).message}` }, tab.id);\n }\n return;\n }\n if (msg.cmd === \"skills_get\") {\n emitSkills(tab);\n return;\n }\n if (msg.cmd === \"skill_run\") {\n if (!tab.runtime) {\n emit(\n { type: \"$error\", message: \"Not configured yet — paste your DeepSeek API key first.\" },\n tab.id,\n );\n return;\n }\n try {\n const store = new SkillStore({\n projectRoot: tab.rootDir,\n customSkillPaths: loadResolvedSkillPaths(tab.rootDir),\n });\n const found = store.read(msg.name);\n if (!found) {\n emit({ type: \"$error\", message: `skill not found: ${msg.name}` }, tab.id);\n return;\n }\n const extra = msg.args?.trim() ?? \"\";\n const header = `# Skill: ${found.name}${found.description ? `\\n> ${found.description}` : \"\"}`;\n const argsLine = extra ? `\\n\\nArguments: ${extra}` : \"\";\n const payload = `${header}\\n\\n${found.body}${argsLine}`;\n void runTurn(tab, payload);\n } catch (err) {\n emit({ type: \"$error\", message: `skill_run: ${(err as Error).message}` }, tab.id);\n }\n return;\n }\n if (msg.cmd === \"session_list\") {\n emitSessions(tab);\n return;\n }\n if (msg.cmd === \"session_delete\") {\n deleteSession(msg.name);\n emitSessions(tab);\n return;\n }\n if (msg.cmd === \"session_load\") {\n try {\n const records = loadSessionMessages(msg.name);\n const meta = loadSessionMeta(msg.name);\n abortTurn(tab);\n cancelPendingGates(tab);\n tab.currentSession = msg.name;\n persistOpenTabs();\n if (tab.runtime) tab.runtime = buildRuntimeFor(tab);\n const loadedMessages = buildLoadedMessages(records);\n // Empty load is a known silent-failure path (file 0 bytes, all\n // lines malformed, etc.). Log to stderr so a terminal-launched\n // desktop reports something diagnostic, and emit a $session_empty\n // event so the UI can surface \"loaded but empty\" instead of\n // looking like the click did nothing. Issue #1179.\n if (loadedMessages.length === 0) {\n let sizeBytes = 0;\n try {\n sizeBytes = statSync(sessionPath(msg.name)).size;\n } catch {\n /* file may not exist */\n }\n process.stderr.write(\n `session_load: \"${msg.name}\" returned 0 messages (file size=${sizeBytes}B) — empty or unreadable jsonl\\n`,\n );\n emit({ type: \"$session_empty\", name: msg.name, sizeBytes }, tab.id);\n }\n emit(\n {\n type: \"$session_loaded\",\n name: msg.name,\n messages: loadedMessages,\n carryover: {\n totalCostUsd: meta.totalCostUsd ?? 0,\n cacheHitTokens: meta.cacheHitTokens ?? 0,\n cacheMissTokens: meta.cacheMissTokens ?? 0,\n },\n },\n tab.id,\n );\n } catch (err) {\n process.stderr.write(`session_load: \"${msg.name}\" threw — ${(err as Error).message}\\n`);\n emit({ type: \"$error\", message: `session_load failed: ${(err as Error).message}` }, tab.id);\n }\n return;\n }\n if (msg.cmd === \"new_chat\") {\n abortTurn(tab);\n cancelPendingGates(tab);\n tab.currentSession = mintSessionFor(tab.rootDir);\n persistOpenTabs();\n if (tab.runtime) tab.runtime = buildRuntimeFor(tab);\n emitSessions(tab);\n return;\n }\n if (msg.cmd === \"settings_get\") {\n emitSettings(tab);\n return;\n }\n if (msg.cmd === \"qq_status_get\") {\n emitQQSettings(tab);\n return;\n }\n if (msg.cmd === \"settings_save\") {\n try {\n if (msg.reasoningEffort !== undefined) {\n saveReasoningEffort(msg.reasoningEffort);\n tab.runtime?.loop.configure({ reasoningEffort: msg.reasoningEffort });\n }\n if (msg.editMode !== undefined) saveEditMode(msg.editMode);\n if (msg.budgetUsd !== undefined) {\n tab.budgetUsd = msg.budgetUsd ?? undefined;\n tab.runtime?.loop.setBudget(msg.budgetUsd);\n }\n if (msg.baseUrl !== undefined) saveBaseUrl(msg.baseUrl);\n if (msg.workspaceDir !== undefined) {\n void switchWorkspace(tab, msg.workspaceDir);\n return;\n }\n if (msg.editor !== undefined) saveEditor(msg.editor);\n if (msg.preset !== undefined) {\n tab.currentPreset = canonicalPresetName(msg.preset);\n const resolved = resolvePreset(tab.currentPreset);\n tab.currentModel = resolved.model;\n savePreset(tab.currentPreset);\n // If the toolset isn't built yet (mid-bootstrap), let initTabToolset\n // see the updated currentModel and compute system + runtime once.\n if (tab.toolset) {\n tab.system = codeSystemPrompt(tab.rootDir, {\n hasSemanticSearch: tab.toolset.semantic.enabled,\n modelId: tab.currentModel,\n });\n if (tab.runtime) tab.runtime = buildRuntimeFor(tab);\n }\n }\n emitSettings(tab);\n } catch (err) {\n emit(\n { type: \"$error\", message: `settings_save failed: ${(err as Error).message}` },\n tab.id,\n );\n }\n return;\n }\n if (msg.cmd === \"qq_config_save\") {\n try {\n saveDesktopQQSettings(\n {\n appId: msg.appId,\n appSecret: msg.appSecret,\n sandbox: msg.sandbox,\n },\n undefined,\n );\n emitQQSettings(tab);\n } catch (err) {\n emit(\n { type: \"$error\", message: `qq_config_save failed: ${(err as Error).message}` },\n tab.id,\n );\n }\n return;\n }\n if (msg.cmd === \"qq_connect\") {\n try {\n const current = loadQQConfig();\n setDesktopQQEnabled(true);\n emit(\n {\n type: \"status\",\n id: Date.now(),\n ts: new Date().toISOString(),\n turn: 0,\n text: `QQ enabled (${current.sandbox ? \"sandbox\" : \"production\"})`,\n },\n tab.id,\n );\n emitQQSettings(tab);\n } catch (err) {\n emit({ type: \"$error\", message: `qq_connect failed: ${(err as Error).message}` }, tab.id);\n emitQQSettings(tab);\n }\n return;\n }\n if (msg.cmd === \"qq_disconnect\") {\n try {\n setDesktopQQEnabled(false);\n emit(\n {\n type: \"status\",\n id: Date.now(),\n ts: new Date().toISOString(),\n turn: 0,\n text: \"QQ disabled\",\n },\n tab.id,\n );\n emitQQSettings(tab);\n } catch (err) {\n emit(\n { type: \"$error\", message: `qq_disconnect failed: ${(err as Error).message}` },\n tab.id,\n );\n }\n return;\n }\n if (msg.cmd === \"mention_query\") {\n const nonce = msg.nonce;\n const query = msg.query;\n const parsed = parseAtQuery(query);\n // Empty query → list workspace root's top-level entries (tree\n // style). Without this, bare `@` floods with all 5000 files; the\n // TUI's @+Tab pattern already shows the tree top.\n const treeWalk = parsed.trailingSlash || query.length === 0;\n if (treeWalk) {\n void listDirectory(tab.rootDir, parsed.dir)\n .then((entries) => {\n const results = entries.map((e) => (e.isDir ? `${e.path}/` : e.path));\n emit({ type: \"$mention_results\", nonce, query, results }, tab.id);\n })\n .catch((err) => {\n emit(\n { type: \"$error\", message: `mention_query (dir) failed: ${(err as Error).message}` },\n tab.id,\n );\n emit({ type: \"$mention_results\", nonce, query, results: [] }, tab.id);\n });\n return;\n }\n const wantSymbols = query.length >= 2 && !query.includes(\"/\");\n void (async () => {\n try {\n const files = await getFileIndexFor(tab);\n const fileResults = rankPickerCandidates(files, query, {\n limit: wantSymbols ? 19 : 25,\n recentlyUsed: tab.recentMentions,\n });\n let symResults: string[] = [];\n if (wantSymbols) {\n const syms = await getSymbolIndexFor(tab);\n symResults = rankSymbols(syms, query, 6);\n }\n emit(\n { type: \"$mention_results\", nonce, query, results: [...symResults, ...fileResults] },\n tab.id,\n );\n } catch (err) {\n emit(\n { type: \"$error\", message: `mention_query failed: ${(err as Error).message}` },\n tab.id,\n );\n emit({ type: \"$mention_results\", nonce, query, results: [] }, tab.id);\n }\n })();\n return;\n }\n if (msg.cmd === \"mention_picked\") {\n pushMentionRecent(tab, msg.path);\n return;\n }\n if (msg.cmd === \"mention_preview\") {\n const nonce = msg.nonce;\n const rel = msg.path;\n const abs = isAbsolute(rel) ? rel : join(tab.rootDir, rel);\n const safeAbs = resolve(abs);\n const safeRoot = resolve(tab.rootDir);\n if (!safeAbs.startsWith(safeRoot)) {\n emit({ type: \"$mention_preview\", nonce, path: rel, head: \"\", totalLines: 0 }, tab.id);\n return;\n }\n void readFile(safeAbs, \"utf8\")\n .then((text) => {\n const lines = text.split(/\\r?\\n/);\n if (lines.length > 0 && lines[lines.length - 1] === \"\") lines.pop();\n const head = lines.slice(0, 12).join(\"\\n\");\n emit(\n { type: \"$mention_preview\", nonce, path: rel, head, totalLines: lines.length },\n tab.id,\n );\n })\n .catch(() => {\n emit({ type: \"$mention_preview\", nonce, path: rel, head: \"\", totalLines: 0 }, tab.id);\n });\n return;\n }\n if (msg.cmd === \"compact_history\") {\n if (!tab.runtime) return;\n void tab.runtime.loop.compactHistory().catch((err: Error) => {\n emit({ type: \"$error\", message: `/compact failed: ${err.message}` }, tab.id);\n });\n return;\n }\n if (msg.cmd === \"retry\") {\n if (!tab.runtime) return;\n const prev = tab.runtime.loop.retryLastUser();\n if (prev) {\n emit({ type: \"$retry_result\", text: prev }, tab.id);\n }\n return;\n }\n if (msg.cmd === \"btw\") {\n if (!tab.runtime) return;\n const question = msg.text.trim();\n if (!question) return;\n void (async () => {\n try {\n const reply = await tab.runtime!.loop.client.chat({\n model: tab.currentModel,\n messages: [\n { role: \"system\", content: tab.system },\n { role: \"user\", content: question },\n ],\n });\n const answer =\n (typeof reply.content === \"string\" ? reply.content.trim() : \"\") || \"(no answer)\";\n emit({ type: \"$btw_result\", question, answer }, tab.id);\n } catch (err) {\n emit({ type: \"$error\", message: `/btw failed: ${(err as Error).message}` }, tab.id);\n }\n })();\n return;\n }\n if (msg.cmd === \"user_input\") {\n if (!tab.runtime) {\n emit(\n { type: \"$error\", message: \"Not configured yet — paste your DeepSeek API key first.\" },\n tab.id,\n );\n return;\n }\n void runTurn(tab, msg.text);\n }\n });\n\n await new Promise<void>((resolve) => {\n rl.on(\"close\", () => {\n void gracefulShutdown();\n resolve();\n });\n });\n}\n","import { type LoadedQQConfig, type QQBotConfig, loadQQConfig, saveQQConfig } from \"../config.js\";\nimport { describeQQAccess } from \"../qq/access.js\";\n\nexport interface DesktopQQSettingsState extends Omit<LoadedQQConfig, \"sandbox\" | \"enabled\"> {\n sandbox: boolean;\n enabled: boolean;\n configured: boolean;\n connected: boolean;\n appIdPreview?: string;\n access: string;\n}\n\nexport interface DesktopQQSettingsPatch {\n appId?: string;\n appSecret?: string;\n sandbox: boolean;\n}\n\nfunction trimOptional(value: string | undefined): string | undefined {\n const trimmed = value?.trim();\n return trimmed ? trimmed : undefined;\n}\n\nfunction toPreview(appId: string | undefined): string | undefined {\n if (!appId) return undefined;\n return appId.length > 6 ? `${appId.slice(0, 6)}...` : appId;\n}\n\nfunction toAccess(config: QQBotConfig | LoadedQQConfig): string {\n return describeQQAccess({\n ownerOpenId: config.ownerOpenId,\n allowlist: config.allowlist,\n });\n}\n\nexport function loadDesktopQQState(path?: string): DesktopQQSettingsState {\n const config = loadQQConfig(path);\n const configured = Boolean(config.appId && config.appSecret);\n return {\n ...config,\n sandbox: config.sandbox ?? false,\n enabled: config.enabled === true,\n configured,\n connected: configured && config.enabled === true,\n appIdPreview: toPreview(config.appId),\n access: toAccess(config),\n };\n}\n\nexport function saveDesktopQQSettings(\n patch: DesktopQQSettingsPatch,\n path?: string,\n): DesktopQQSettingsState {\n const existing = loadQQConfig(path);\n saveQQConfig(\n {\n ...existing,\n appId: trimOptional(patch.appId),\n appSecret: trimOptional(patch.appSecret),\n sandbox: patch.sandbox,\n },\n path,\n );\n return loadDesktopQQState(path);\n}\n\nexport function setDesktopQQEnabled(enabled: boolean, path?: string): DesktopQQSettingsState {\n const existing = loadQQConfig(path);\n if (enabled && !(existing.appId && existing.appSecret)) {\n throw new Error(\"QQ App ID and App Secret are required.\");\n }\n saveQQConfig({ ...existing, enabled }, path);\n return loadDesktopQQState(path);\n}\n"],"mappings":"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","names":["tab","resolve"]}
|
|
@@ -2,17 +2,17 @@
|
|
|
2
2
|
import { createRequire as __cr } from 'node:module'; if (typeof globalThis.require === 'undefined') { globalThis.require = __cr(import.meta.url); }
|
|
3
3
|
import {
|
|
4
4
|
RecordView
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-R6GQKKBW.js";
|
|
6
6
|
import {
|
|
7
7
|
diffTranscripts,
|
|
8
8
|
findNextDivergence,
|
|
9
9
|
findPrevDivergence,
|
|
10
10
|
renderMarkdown,
|
|
11
11
|
renderSummaryTable
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-VKYSZKH2.js";
|
|
13
13
|
import {
|
|
14
14
|
readTranscript
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-BYYVYJDX.js";
|
|
16
16
|
import {
|
|
17
17
|
Box_default,
|
|
18
18
|
Static,
|
|
@@ -22,13 +22,13 @@ import {
|
|
|
22
22
|
use_app_default,
|
|
23
23
|
use_input_default
|
|
24
24
|
} from "./chunk-X53B3JIX.js";
|
|
25
|
-
import "./chunk-
|
|
25
|
+
import "./chunk-VNQGCA3Q.js";
|
|
26
26
|
import "./chunk-25T6CVUP.js";
|
|
27
|
-
import "./chunk-
|
|
27
|
+
import "./chunk-VJMBISEI.js";
|
|
28
28
|
import {
|
|
29
29
|
t
|
|
30
|
-
} from "./chunk-
|
|
31
|
-
import "./chunk-
|
|
30
|
+
} from "./chunk-KDRUEXII.js";
|
|
31
|
+
import "./chunk-24A7FHGJ.js";
|
|
32
32
|
import {
|
|
33
33
|
__toESM
|
|
34
34
|
} from "./chunk-TUK7OWJA.js";
|
|
@@ -162,4 +162,4 @@ markdown report written to ${opts.mdPath}`);
|
|
|
162
162
|
export {
|
|
163
163
|
diffCommand
|
|
164
164
|
};
|
|
165
|
-
//# sourceMappingURL=diff-
|
|
165
|
+
//# sourceMappingURL=diff-RAAHHLHV.js.map
|
|
@@ -4,19 +4,19 @@ import {
|
|
|
4
4
|
doctorCommand,
|
|
5
5
|
formatDoctorJson,
|
|
6
6
|
runDoctorChecks
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-FDKOUJKZ.js";
|
|
8
8
|
import "./chunk-5QCB62C4.js";
|
|
9
9
|
import "./chunk-6OWJV3YW.js";
|
|
10
|
-
import "./chunk-
|
|
10
|
+
import "./chunk-VNQGCA3Q.js";
|
|
11
11
|
import "./chunk-25T6CVUP.js";
|
|
12
12
|
import "./chunk-2UQP6H6T.js";
|
|
13
|
-
import "./chunk-
|
|
14
|
-
import "./chunk-
|
|
15
|
-
import "./chunk-
|
|
13
|
+
import "./chunk-VMUUFWFF.js";
|
|
14
|
+
import "./chunk-YDPLF7XR.js";
|
|
15
|
+
import "./chunk-BWYVFFKR.js";
|
|
16
16
|
import "./chunk-S4XVGLRW.js";
|
|
17
|
-
import "./chunk-
|
|
18
|
-
import "./chunk-
|
|
19
|
-
import "./chunk-
|
|
17
|
+
import "./chunk-RRXUIPWG.js";
|
|
18
|
+
import "./chunk-KDRUEXII.js";
|
|
19
|
+
import "./chunk-24A7FHGJ.js";
|
|
20
20
|
import "./chunk-XXC2BYTV.js";
|
|
21
21
|
import "./chunk-TUK7OWJA.js";
|
|
22
22
|
export {
|
|
@@ -24,4 +24,4 @@ export {
|
|
|
24
24
|
formatDoctorJson,
|
|
25
25
|
runDoctorChecks
|
|
26
26
|
};
|
|
27
|
-
//# sourceMappingURL=doctor-
|
|
27
|
+
//# sourceMappingURL=doctor-PKVQIXRT.js.map
|
|
@@ -5,8 +5,8 @@ import {
|
|
|
5
5
|
} from "./chunk-J5XJHLWM.js";
|
|
6
6
|
import {
|
|
7
7
|
eventLogPath
|
|
8
|
-
} from "./chunk-
|
|
9
|
-
import "./chunk-
|
|
8
|
+
} from "./chunk-E5WCLUIU.js";
|
|
9
|
+
import "./chunk-RRXUIPWG.js";
|
|
10
10
|
import "./chunk-TUK7OWJA.js";
|
|
11
11
|
|
|
12
12
|
// src/core/reducers.ts
|
|
@@ -337,4 +337,4 @@ function mapReplacer(_key, value) {
|
|
|
337
337
|
export {
|
|
338
338
|
eventsCommand
|
|
339
339
|
};
|
|
340
|
-
//# sourceMappingURL=events-
|
|
340
|
+
//# sourceMappingURL=events-VRYXOSKI.js.map
|
package/dist/cli/index.js
CHANGED
|
@@ -5,42 +5,43 @@ import {
|
|
|
5
5
|
startCpuProfile,
|
|
6
6
|
stopAndSaveCpuProfile
|
|
7
7
|
} from "./chunk-ZZM6QJ4W.js";
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-
|
|
10
|
-
import "./chunk-
|
|
11
|
-
import "./chunk-
|
|
8
|
+
import "./chunk-ICAFSZHS.js";
|
|
9
|
+
import "./chunk-VKYSZKH2.js";
|
|
10
|
+
import "./chunk-BYYVYJDX.js";
|
|
11
|
+
import "./chunk-HIYTRCSW.js";
|
|
12
12
|
import {
|
|
13
13
|
applyMemoryStack
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-UDVFBEXC.js";
|
|
15
15
|
import {
|
|
16
|
+
presetNameForSettings,
|
|
16
17
|
resolvePreset
|
|
17
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-LGEKVMMV.js";
|
|
18
19
|
import {
|
|
19
20
|
installProxyIfConfigured
|
|
20
21
|
} from "./chunk-5QCB62C4.js";
|
|
21
22
|
import "./chunk-6OWJV3YW.js";
|
|
22
|
-
import "./chunk-
|
|
23
|
+
import "./chunk-VNQGCA3Q.js";
|
|
23
24
|
import "./chunk-25T6CVUP.js";
|
|
24
25
|
import "./chunk-2UQP6H6T.js";
|
|
25
|
-
import "./chunk-
|
|
26
|
+
import "./chunk-GDKB2PPK.js";
|
|
26
27
|
import {
|
|
27
28
|
escalationContract
|
|
28
|
-
} from "./chunk-
|
|
29
|
-
import "./chunk-
|
|
29
|
+
} from "./chunk-FY4S7TJZ.js";
|
|
30
|
+
import "./chunk-BWYVFFKR.js";
|
|
30
31
|
import "./chunk-S4XVGLRW.js";
|
|
31
32
|
import {
|
|
32
33
|
listSessions
|
|
33
|
-
} from "./chunk-
|
|
34
|
-
import "./chunk-
|
|
35
|
-
import "./chunk-
|
|
34
|
+
} from "./chunk-RRXUIPWG.js";
|
|
35
|
+
import "./chunk-QVUFWDD2.js";
|
|
36
|
+
import "./chunk-VJMBISEI.js";
|
|
36
37
|
import {
|
|
37
38
|
t
|
|
38
|
-
} from "./chunk-
|
|
39
|
+
} from "./chunk-KDRUEXII.js";
|
|
39
40
|
import {
|
|
40
41
|
normalizeMcpConfig,
|
|
41
42
|
readConfig,
|
|
42
43
|
specToRaw
|
|
43
|
-
} from "./chunk-
|
|
44
|
+
} from "./chunk-24A7FHGJ.js";
|
|
44
45
|
import {
|
|
45
46
|
VERSION
|
|
46
47
|
} from "./chunk-XXC2BYTV.js";
|
|
@@ -3106,20 +3107,58 @@ var {
|
|
|
3106
3107
|
Help
|
|
3107
3108
|
} = import_index.default;
|
|
3108
3109
|
|
|
3110
|
+
// src/mcp/dot-mcp-json.ts
|
|
3111
|
+
import { existsSync, readFileSync } from "fs";
|
|
3112
|
+
import { join } from "path";
|
|
3113
|
+
var DOT_MCP_JSON = ".mcp.json";
|
|
3114
|
+
function loadDotMcpJson(projectRoot) {
|
|
3115
|
+
const path = join(projectRoot, DOT_MCP_JSON);
|
|
3116
|
+
if (!existsSync(path)) return void 0;
|
|
3117
|
+
let raw;
|
|
3118
|
+
try {
|
|
3119
|
+
raw = readFileSync(path, "utf8");
|
|
3120
|
+
} catch {
|
|
3121
|
+
return void 0;
|
|
3122
|
+
}
|
|
3123
|
+
let parsed;
|
|
3124
|
+
try {
|
|
3125
|
+
parsed = JSON.parse(raw);
|
|
3126
|
+
} catch {
|
|
3127
|
+
return void 0;
|
|
3128
|
+
}
|
|
3129
|
+
if (!parsed || typeof parsed !== "object") return void 0;
|
|
3130
|
+
const servers = parsed.mcpServers;
|
|
3131
|
+
if (!servers || typeof servers !== "object" || Array.isArray(servers)) return void 0;
|
|
3132
|
+
const out = {};
|
|
3133
|
+
for (const [name, entry] of Object.entries(servers)) {
|
|
3134
|
+
if (!entry || typeof entry !== "object" || Array.isArray(entry)) continue;
|
|
3135
|
+
out[name] = entry;
|
|
3136
|
+
}
|
|
3137
|
+
return Object.keys(out).length > 0 ? out : void 0;
|
|
3138
|
+
}
|
|
3139
|
+
|
|
3109
3140
|
// src/cli/resolve.ts
|
|
3110
3141
|
function resolveDefaults(flags) {
|
|
3111
3142
|
const cfg = flags.noConfig ? {} : readConfig();
|
|
3112
3143
|
const preset = pickPreset(flags.preset, cfg.preset);
|
|
3113
3144
|
const presetSettings = resolvePreset(preset);
|
|
3114
3145
|
const model = flags.model ?? presetSettings.model;
|
|
3146
|
+
const presetName = flags.model ? void 0 : presetNameForSettings(presetSettings);
|
|
3147
|
+
const autoEscalate = flags.model ? false : presetSettings.autoEscalate;
|
|
3115
3148
|
const reasoningEffort = presetSettings.reasoningEffort;
|
|
3149
|
+
const merged = flags.noConfig ? cfg : mergeDotMcpJson(cfg, process.cwd());
|
|
3116
3150
|
const normalizedMcp = normalizeMcpConfig(
|
|
3117
|
-
|
|
3151
|
+
merged,
|
|
3118
3152
|
flags.mcp && flags.mcp.length > 0 ? flags.mcp : void 0
|
|
3119
3153
|
);
|
|
3120
3154
|
const mcp2 = normalizedMcp.map(specToRaw);
|
|
3121
3155
|
const session = resolveSession(flags.session, cfg.session);
|
|
3122
|
-
return { model, reasoningEffort, mcp: mcp2, session };
|
|
3156
|
+
return { model, preset: presetName, autoEscalate, reasoningEffort, mcp: mcp2, session };
|
|
3157
|
+
}
|
|
3158
|
+
function mergeDotMcpJson(cfg, projectRoot) {
|
|
3159
|
+
const project = loadDotMcpJson(projectRoot);
|
|
3160
|
+
if (!project) return cfg;
|
|
3161
|
+
return { ...cfg, mcpServers: { ...cfg.mcpServers ?? {}, ...project } };
|
|
3123
3162
|
}
|
|
3124
3163
|
function pickPreset(flagPreset, configPreset) {
|
|
3125
3164
|
if (flagPreset && isPresetName(flagPreset)) return flagPreset;
|
|
@@ -3240,15 +3279,15 @@ program2.action(async (opts) => {
|
|
|
3240
3279
|
const cfg = readConfig();
|
|
3241
3280
|
const mode = resolveBareCommandMode(cfg);
|
|
3242
3281
|
if (mode === "setup") {
|
|
3243
|
-
const { setupCommand } = await import("./setup-
|
|
3282
|
+
const { setupCommand } = await import("./setup-Y5WDBQFL.js");
|
|
3244
3283
|
await setupCommand({ forceKeyStep: true });
|
|
3245
3284
|
return;
|
|
3246
3285
|
}
|
|
3247
|
-
const { codeCommand } = await import("./code-
|
|
3286
|
+
const { codeCommand } = await import("./code-C24TUAE5.js");
|
|
3248
3287
|
await codeCommand({ dir: process.cwd(), forceResume: !!opts.continue });
|
|
3249
3288
|
});
|
|
3250
3289
|
program2.command("setup").description(t("cli.setup")).action(async () => {
|
|
3251
|
-
const { setupCommand } = await import("./setup-
|
|
3290
|
+
const { setupCommand } = await import("./setup-Y5WDBQFL.js");
|
|
3252
3291
|
await setupCommand({ forceKeyStep: true });
|
|
3253
3292
|
});
|
|
3254
3293
|
program2.command("code [dir]").description(t("cli.code")).option("-m, --model <id>", t("ui.modelOverride")).option("--no-session", t("ui.noSession")).option("-r, --resume", t("ui.resumeHint")).option("-n, --new", t("ui.newHint")).option("--transcript <path>", t("ui.transcriptHint")).option("--budget <usd>", t("ui.budgetHint"), (v) => Number.parseFloat(v)).option("--no-dashboard", t("ui.noDashboard")).option("--open-dashboard", t("ui.openDashboardHint")).option("--dashboard-port <port>", t("ui.dashboardPortHint")).option(
|
|
@@ -3260,7 +3299,7 @@ program2.command("code [dir]").description(t("cli.code")).option("-m, --model <i
|
|
|
3260
3299
|
).action(async (dir, opts) => {
|
|
3261
3300
|
const profiling = await maybeStartCpuProfile(opts.profile);
|
|
3262
3301
|
try {
|
|
3263
|
-
const { codeCommand } = await import("./code-
|
|
3302
|
+
const { codeCommand } = await import("./code-C24TUAE5.js");
|
|
3264
3303
|
await codeCommand({
|
|
3265
3304
|
dir,
|
|
3266
3305
|
model: opts.model,
|
|
@@ -3309,12 +3348,14 @@ program2.command("chat").description(t("cli.chat")).option("-m, --model <id>", t
|
|
|
3309
3348
|
(msg) => process.stderr.write(`${msg}
|
|
3310
3349
|
`)
|
|
3311
3350
|
);
|
|
3312
|
-
const { chatCommand } = await import("./chat-
|
|
3351
|
+
const { chatCommand } = await import("./chat-VV5UWY4V.js");
|
|
3313
3352
|
const chatBase = opts.system ?? defaultSystemPrompt(defaults.model);
|
|
3314
3353
|
const chatCwd = process.cwd();
|
|
3315
3354
|
const chatRebuildSystem = () => applyMemoryStack(chatBase, chatCwd);
|
|
3316
3355
|
await chatCommand({
|
|
3317
3356
|
model: defaults.model,
|
|
3357
|
+
preset: defaults.preset,
|
|
3358
|
+
autoEscalate: defaults.autoEscalate,
|
|
3318
3359
|
system: chatRebuildSystem(),
|
|
3319
3360
|
rebuildSystem: chatRebuildSystem,
|
|
3320
3361
|
transcript: opts.transcript,
|
|
@@ -3349,7 +3390,7 @@ program2.command("run <task>").description(t("cli.run")).option("-m, --model <id
|
|
|
3349
3390
|
preset: opts.preset,
|
|
3350
3391
|
noConfig: opts.config === false
|
|
3351
3392
|
});
|
|
3352
|
-
const { runCommand } = await import("./run-
|
|
3393
|
+
const { runCommand } = await import("./run-WIKDIXTG.js");
|
|
3353
3394
|
await runCommand({
|
|
3354
3395
|
task,
|
|
3355
3396
|
model: defaults.model,
|
|
@@ -3372,7 +3413,7 @@ program2.command("acp").description("run reasonix as an Agent Client Protocol (A
|
|
|
3372
3413
|
preset: opts.preset,
|
|
3373
3414
|
noConfig: false
|
|
3374
3415
|
});
|
|
3375
|
-
const { acpCommand } = await import("./acp-
|
|
3416
|
+
const { acpCommand } = await import("./acp-QK3DMC53.js");
|
|
3376
3417
|
await acpCommand({
|
|
3377
3418
|
model: defaults.model,
|
|
3378
3419
|
budgetUsd: parseBudgetFlag(opts.budget),
|
|
@@ -3390,7 +3431,7 @@ program2.command("desktop").description("headless JSON-RPC chat for the desktop
|
|
|
3390
3431
|
preset: opts.preset,
|
|
3391
3432
|
noConfig: false
|
|
3392
3433
|
});
|
|
3393
|
-
const { desktopCommand } = await import("./desktop-
|
|
3434
|
+
const { desktopCommand } = await import("./desktop-7NCHPEFB.js");
|
|
3394
3435
|
await desktopCommand({
|
|
3395
3436
|
model: defaults.model,
|
|
3396
3437
|
budgetUsd: parseBudgetFlag(opts.budget),
|
|
@@ -3398,27 +3439,27 @@ program2.command("desktop").description("headless JSON-RPC chat for the desktop
|
|
|
3398
3439
|
});
|
|
3399
3440
|
});
|
|
3400
3441
|
program2.command("stats [transcript]").description(t("cli.stats")).action(async (transcript) => {
|
|
3401
|
-
const { statsCommand } = await import("./stats-
|
|
3442
|
+
const { statsCommand } = await import("./stats-T7BL2YOR.js");
|
|
3402
3443
|
statsCommand({ transcript });
|
|
3403
3444
|
});
|
|
3404
3445
|
program2.command("doctor").description(t("cli.doctor")).option("--json", t("ui.jsonHint")).action(async (opts) => {
|
|
3405
|
-
const { doctorCommand } = await import("./doctor-
|
|
3446
|
+
const { doctorCommand } = await import("./doctor-PKVQIXRT.js");
|
|
3406
3447
|
await doctorCommand({ json: !!opts.json });
|
|
3407
3448
|
});
|
|
3408
3449
|
program2.command("commit").description(t("cli.commit")).option("-m, --model <id>", t("ui.modelOverrideFlash")).option("-y, --yes", t("ui.skipConfirmHint")).action(async (opts) => {
|
|
3409
|
-
const { commitCommand } = await import("./commit-
|
|
3450
|
+
const { commitCommand } = await import("./commit-FSHPIINM.js");
|
|
3410
3451
|
await commitCommand({ model: opts.model, yes: !!opts.yes });
|
|
3411
3452
|
});
|
|
3412
3453
|
program2.command("sessions [name]").description(t("cli.sessions")).option("-v, --verbose", t("ui.verboseHint")).action(async (name, opts) => {
|
|
3413
|
-
const { sessionsCommand } = await import("./sessions-
|
|
3454
|
+
const { sessionsCommand } = await import("./sessions-2NULRMSA.js");
|
|
3414
3455
|
sessionsCommand({ name, verbose: !!opts.verbose });
|
|
3415
3456
|
});
|
|
3416
3457
|
program2.command("prune-sessions").description(t("cli.pruneSessions")).option("--days <n>", t("ui.pruneDaysHint"), (v) => Number.parseInt(v, 10)).option("--dry-run", t("ui.pruneDryRunHint")).action(async (opts) => {
|
|
3417
|
-
const { pruneSessionsCommand } = await import("./prune-sessions-
|
|
3458
|
+
const { pruneSessionsCommand } = await import("./prune-sessions-SEWX7GP6.js");
|
|
3418
3459
|
pruneSessionsCommand({ days: opts.days, dryRun: !!opts.dryRun });
|
|
3419
3460
|
});
|
|
3420
3461
|
program2.command("events <name>").description(t("cli.events")).option("--type <type>", t("ui.eventTypeHint")).option("--since <id>", t("ui.eventSinceHint"), (v) => Number.parseInt(v, 10)).option("--tail <n>", t("ui.eventTailHint"), (v) => Number.parseInt(v, 10)).option("--json", t("ui.jsonHint")).option("--projection", t("ui.projectionHint")).action(async (name, opts) => {
|
|
3421
|
-
const { eventsCommand } = await import("./events-
|
|
3462
|
+
const { eventsCommand } = await import("./events-VRYXOSKI.js");
|
|
3422
3463
|
eventsCommand({
|
|
3423
3464
|
name,
|
|
3424
3465
|
type: opts.type,
|
|
@@ -3429,7 +3470,7 @@ program2.command("events <name>").description(t("cli.events")).option("--type <t
|
|
|
3429
3470
|
});
|
|
3430
3471
|
});
|
|
3431
3472
|
program2.command("replay <transcript>").description(t("cli.replay")).option("--print", t("ui.printHint")).option("--head <n>", t("ui.headHint"), (v) => Number.parseInt(v, 10)).option("--tail <n>", t("ui.tailHint"), (v) => Number.parseInt(v, 10)).action(async (transcript, opts) => {
|
|
3432
|
-
const { replayCommand } = await import("./replay-
|
|
3473
|
+
const { replayCommand } = await import("./replay-KPDW2ZMJ.js");
|
|
3433
3474
|
await replayCommand({
|
|
3434
3475
|
path: transcript,
|
|
3435
3476
|
print: !!opts.print,
|
|
@@ -3438,7 +3479,7 @@ program2.command("replay <transcript>").description(t("cli.replay")).option("--p
|
|
|
3438
3479
|
});
|
|
3439
3480
|
});
|
|
3440
3481
|
program2.command("diff <a> <b>").description(t("cli.diff")).option("--md <path>", t("ui.mdReportHint")).option("--print", t("ui.printHintTable")).option("--tui", t("ui.tuiHint")).option("--label-a <label>", t("ui.labelAHint")).option("--label-b <label>", t("ui.labelBHint")).action(async (a, b, opts) => {
|
|
3441
|
-
const { diffCommand } = await import("./diff-
|
|
3482
|
+
const { diffCommand } = await import("./diff-RAAHHLHV.js");
|
|
3442
3483
|
await diffCommand({
|
|
3443
3484
|
a,
|
|
3444
3485
|
b,
|
|
@@ -3452,7 +3493,7 @@ program2.command("diff <a> <b>").description(t("cli.diff")).option("--md <path>"
|
|
|
3452
3493
|
var mcp = program2.command("mcp").description(t("cli.mcp"));
|
|
3453
3494
|
mcp.command("list").description(t("ui.mcpListDescription")).option("--json", t("ui.jsonHintCatalog")).option("--local", t("ui.mcpLocalHint")).option("--refresh", t("ui.mcpRefreshHint")).option("--limit <n>", t("ui.mcpLimitHint"), (v) => Number.parseInt(v, 10)).option("--pages <n>", t("ui.mcpPagesHint"), (v) => Number.parseInt(v, 10)).option("--all", t("ui.mcpAllHint")).action(async (opts) => {
|
|
3454
3495
|
try {
|
|
3455
|
-
const { mcpListCommand } = await import("./mcp-
|
|
3496
|
+
const { mcpListCommand } = await import("./mcp-CRJ26PP4.js");
|
|
3456
3497
|
await mcpListCommand({
|
|
3457
3498
|
json: !!opts.json,
|
|
3458
3499
|
local: !!opts.local,
|
|
@@ -3469,7 +3510,7 @@ mcp.command("list").description(t("ui.mcpListDescription")).option("--json", t("
|
|
|
3469
3510
|
});
|
|
3470
3511
|
mcp.command("search <query>").description(t("ui.mcpSearchDescription")).option("--json", t("ui.jsonHintCatalog")).option("--refresh", t("ui.mcpRefreshHint")).option("--limit <n>", t("ui.mcpLimitHint"), (v) => Number.parseInt(v, 10)).option("--max-pages <n>", t("ui.mcpMaxPagesHint"), (v) => Number.parseInt(v, 10)).action(async (query, opts) => {
|
|
3471
3512
|
try {
|
|
3472
|
-
const { mcpSearchCommand } = await import("./mcp-
|
|
3513
|
+
const { mcpSearchCommand } = await import("./mcp-CRJ26PP4.js");
|
|
3473
3514
|
await mcpSearchCommand(query, {
|
|
3474
3515
|
json: !!opts.json,
|
|
3475
3516
|
refresh: !!opts.refresh,
|
|
@@ -3484,7 +3525,7 @@ mcp.command("search <query>").description(t("ui.mcpSearchDescription")).option("
|
|
|
3484
3525
|
});
|
|
3485
3526
|
mcp.command("install <name>").description(t("ui.mcpInstallDescription")).option("--refresh", t("ui.mcpRefreshHint")).option("--max-pages <n>", t("ui.mcpMaxPagesHint"), (v) => Number.parseInt(v, 10)).action(async (name, opts) => {
|
|
3486
3527
|
try {
|
|
3487
|
-
const { mcpInstallCommand } = await import("./mcp-
|
|
3528
|
+
const { mcpInstallCommand } = await import("./mcp-CRJ26PP4.js");
|
|
3488
3529
|
await mcpInstallCommand(name, {
|
|
3489
3530
|
refresh: !!opts.refresh,
|
|
3490
3531
|
maxPages: typeof opts.maxPages === "number" && opts.maxPages > 0 ? opts.maxPages : void 0
|
|
@@ -3497,7 +3538,7 @@ mcp.command("install <name>").description(t("ui.mcpInstallDescription")).option(
|
|
|
3497
3538
|
});
|
|
3498
3539
|
mcp.command("browse").description(t("ui.mcpBrowseDescription")).action(async () => {
|
|
3499
3540
|
try {
|
|
3500
|
-
const { mcpBrowseCommand } = await import("./mcp-browse-
|
|
3541
|
+
const { mcpBrowseCommand } = await import("./mcp-browse-QPAOWZOP.js");
|
|
3501
3542
|
await mcpBrowseCommand();
|
|
3502
3543
|
} catch (err) {
|
|
3503
3544
|
process.stderr.write(`mcp browse failed: ${err.message}
|
|
@@ -3506,7 +3547,7 @@ mcp.command("browse").description(t("ui.mcpBrowseDescription")).action(async ()
|
|
|
3506
3547
|
}
|
|
3507
3548
|
});
|
|
3508
3549
|
mcp.command("inspect <spec>").description(t("ui.mcpInspectDescription")).option("--json", t("ui.jsonHintReport")).action(async (spec, opts) => {
|
|
3509
|
-
const { formatMcpInspectFailure, mcpInspectCommand } = await import("./mcp-inspect-
|
|
3550
|
+
const { formatMcpInspectFailure, mcpInspectCommand } = await import("./mcp-inspect-CVCLABRS.js");
|
|
3510
3551
|
try {
|
|
3511
3552
|
await mcpInspectCommand({ spec, json: !!opts.json });
|
|
3512
3553
|
} catch (err) {
|
|
@@ -3516,7 +3557,7 @@ mcp.command("inspect <spec>").description(t("ui.mcpInspectDescription")).option(
|
|
|
3516
3557
|
}
|
|
3517
3558
|
});
|
|
3518
3559
|
program2.command("version").description(t("cli.version")).action(async () => {
|
|
3519
|
-
const { versionCommand } = await import("./version-
|
|
3560
|
+
const { versionCommand } = await import("./version-3KWDNWLN.js");
|
|
3520
3561
|
versionCommand();
|
|
3521
3562
|
});
|
|
3522
3563
|
program2.command("update").description(t("cli.update")).option("--dry-run", t("ui.dryRunHint")).action(async (opts) => {
|
|
@@ -3525,7 +3566,7 @@ program2.command("update").description(t("cli.update")).option("--dry-run", t("u
|
|
|
3525
3566
|
});
|
|
3526
3567
|
program2.command("index").description(t("cli.index")).option("--rebuild", t("ui.rebuildHint")).option("--model <name>", t("ui.embedModelHint")).option("--dir <path>", t("ui.projectDirHint")).option("--ollama-url <url>", t("ui.ollamaUrlHint")).option("-y, --yes", t("ui.skipPromptsHint")).action(
|
|
3527
3568
|
async (opts) => {
|
|
3528
|
-
const { indexCommand } = await import("./commands-
|
|
3569
|
+
const { indexCommand } = await import("./commands-RR3GIYOK.js");
|
|
3529
3570
|
await indexCommand(opts);
|
|
3530
3571
|
}
|
|
3531
3572
|
);
|