@tulex-cli/tulex-code 0.1.1
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 +54 -0
- package/dist/.last_build +0 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +98 -0
- package/dist/index.js.map +1 -0
- package/dist/package.json +121 -0
- package/dist/src/acp-integration/acpAgent.d.ts +59 -0
- package/dist/src/acp-integration/acpAgent.js +3646 -0
- package/dist/src/acp-integration/acpAgent.js.map +1 -0
- package/dist/src/acp-integration/acpAgent.test.d.ts +6 -0
- package/dist/src/acp-integration/acpAgent.test.js +3690 -0
- package/dist/src/acp-integration/acpAgent.test.js.map +1 -0
- package/dist/src/acp-integration/acpAgent.worktree.test.d.ts +16 -0
- package/dist/src/acp-integration/acpAgent.worktree.test.js +354 -0
- package/dist/src/acp-integration/acpAgent.worktree.test.js.map +1 -0
- package/dist/src/acp-integration/authMethods.d.ts +9 -0
- package/dist/src/acp-integration/authMethods.js +28 -0
- package/dist/src/acp-integration/authMethods.js.map +1 -0
- package/dist/src/acp-integration/authMethods.test.d.ts +6 -0
- package/dist/src/acp-integration/authMethods.test.js +23 -0
- package/dist/src/acp-integration/authMethods.test.js.map +1 -0
- package/dist/src/acp-integration/authPreflight.test.d.ts +6 -0
- package/dist/src/acp-integration/authPreflight.test.js +54 -0
- package/dist/src/acp-integration/authPreflight.test.js.map +1 -0
- package/dist/src/acp-integration/errorCodes.d.ts +15 -0
- package/dist/src/acp-integration/errorCodes.js +22 -0
- package/dist/src/acp-integration/errorCodes.js.map +1 -0
- package/dist/src/acp-integration/runtimeOutputDirContext.d.ts +2 -0
- package/dist/src/acp-integration/runtimeOutputDirContext.js +5 -0
- package/dist/src/acp-integration/runtimeOutputDirContext.js.map +1 -0
- package/dist/src/acp-integration/runtimeOutputDirContext.test.d.ts +1 -0
- package/dist/src/acp-integration/runtimeOutputDirContext.test.js +29 -0
- package/dist/src/acp-integration/runtimeOutputDirContext.test.js.map +1 -0
- package/dist/src/acp-integration/service/filesystem.d.ts +17 -0
- package/dist/src/acp-integration/service/filesystem.js +73 -0
- package/dist/src/acp-integration/service/filesystem.js.map +1 -0
- package/dist/src/acp-integration/service/filesystem.test.d.ts +6 -0
- package/dist/src/acp-integration/service/filesystem.test.js +85 -0
- package/dist/src/acp-integration/service/filesystem.test.js.map +1 -0
- package/dist/src/acp-integration/session/HistoryReplayer.d.ts +63 -0
- package/dist/src/acp-integration/session/HistoryReplayer.js +222 -0
- package/dist/src/acp-integration/session/HistoryReplayer.js.map +1 -0
- package/dist/src/acp-integration/session/HistoryReplayer.test.d.ts +6 -0
- package/dist/src/acp-integration/session/HistoryReplayer.test.js +405 -0
- package/dist/src/acp-integration/session/HistoryReplayer.test.js.map +1 -0
- package/dist/src/acp-integration/session/Session.d.ts +150 -0
- package/dist/src/acp-integration/session/Session.js +2381 -0
- package/dist/src/acp-integration/session/Session.js.map +1 -0
- package/dist/src/acp-integration/session/Session.test.d.ts +6 -0
- package/dist/src/acp-integration/session/Session.test.js +3845 -0
- package/dist/src/acp-integration/session/Session.test.js.map +1 -0
- package/dist/src/acp-integration/session/Session.worktree.test.d.ts +18 -0
- package/dist/src/acp-integration/session/Session.worktree.test.js +195 -0
- package/dist/src/acp-integration/session/Session.worktree.test.js.map +1 -0
- package/dist/src/acp-integration/session/SubAgentTracker.d.ts +58 -0
- package/dist/src/acp-integration/session/SubAgentTracker.js +208 -0
- package/dist/src/acp-integration/session/SubAgentTracker.js.map +1 -0
- package/dist/src/acp-integration/session/SubAgentTracker.test.d.ts +6 -0
- package/dist/src/acp-integration/session/SubAgentTracker.test.js +612 -0
- package/dist/src/acp-integration/session/SubAgentTracker.test.js.map +1 -0
- package/dist/src/acp-integration/session/emitters/BaseEmitter.d.ts +34 -0
- package/dist/src/acp-integration/session/emitters/BaseEmitter.js +53 -0
- package/dist/src/acp-integration/session/emitters/BaseEmitter.js.map +1 -0
- package/dist/src/acp-integration/session/emitters/MessageEmitter.d.ts +61 -0
- package/dist/src/acp-integration/session/emitters/MessageEmitter.js +124 -0
- package/dist/src/acp-integration/session/emitters/MessageEmitter.js.map +1 -0
- package/dist/src/acp-integration/session/emitters/MessageEmitter.test.d.ts +6 -0
- package/dist/src/acp-integration/session/emitters/MessageEmitter.test.js +202 -0
- package/dist/src/acp-integration/session/emitters/MessageEmitter.test.js.map +1 -0
- package/dist/src/acp-integration/session/emitters/PlanEmitter.d.ts +39 -0
- package/dist/src/acp-integration/session/emitters/PlanEmitter.js +83 -0
- package/dist/src/acp-integration/session/emitters/PlanEmitter.js.map +1 -0
- package/dist/src/acp-integration/session/emitters/PlanEmitter.test.d.ts +6 -0
- package/dist/src/acp-integration/session/emitters/PlanEmitter.test.js +176 -0
- package/dist/src/acp-integration/session/emitters/PlanEmitter.test.js.map +1 -0
- package/dist/src/acp-integration/session/emitters/ToolCallEmitter.d.ts +82 -0
- package/dist/src/acp-integration/session/emitters/ToolCallEmitter.js +284 -0
- package/dist/src/acp-integration/session/emitters/ToolCallEmitter.js.map +1 -0
- package/dist/src/acp-integration/session/emitters/ToolCallEmitter.test.d.ts +6 -0
- package/dist/src/acp-integration/session/emitters/ToolCallEmitter.test.js +607 -0
- package/dist/src/acp-integration/session/emitters/ToolCallEmitter.test.js.map +1 -0
- package/dist/src/acp-integration/session/emitters/index.d.ts +9 -0
- package/dist/src/acp-integration/session/emitters/index.js +10 -0
- package/dist/src/acp-integration/session/emitters/index.js.map +1 -0
- package/dist/src/acp-integration/session/index.d.ts +24 -0
- package/dist/src/acp-integration/session/index.js +16 -0
- package/dist/src/acp-integration/session/index.js.map +1 -0
- package/dist/src/acp-integration/session/permissionUtils.d.ts +9 -0
- package/dist/src/acp-integration/session/permissionUtils.js +165 -0
- package/dist/src/acp-integration/session/permissionUtils.js.map +1 -0
- package/dist/src/acp-integration/session/permissionUtils.test.d.ts +6 -0
- package/dist/src/acp-integration/session/permissionUtils.test.js +83 -0
- package/dist/src/acp-integration/session/permissionUtils.test.js.map +1 -0
- package/dist/src/acp-integration/session/rewrite/LlmRewriter.d.ts +26 -0
- package/dist/src/acp-integration/session/rewrite/LlmRewriter.js +131 -0
- package/dist/src/acp-integration/session/rewrite/LlmRewriter.js.map +1 -0
- package/dist/src/acp-integration/session/rewrite/LlmRewriter.test.d.ts +6 -0
- package/dist/src/acp-integration/session/rewrite/LlmRewriter.test.js +188 -0
- package/dist/src/acp-integration/session/rewrite/LlmRewriter.test.js.map +1 -0
- package/dist/src/acp-integration/session/rewrite/MessageRewriteMiddleware.d.ts +42 -0
- package/dist/src/acp-integration/session/rewrite/MessageRewriteMiddleware.js +159 -0
- package/dist/src/acp-integration/session/rewrite/MessageRewriteMiddleware.js.map +1 -0
- package/dist/src/acp-integration/session/rewrite/MessageRewriteMiddleware.test.d.ts +6 -0
- package/dist/src/acp-integration/session/rewrite/MessageRewriteMiddleware.test.js +255 -0
- package/dist/src/acp-integration/session/rewrite/MessageRewriteMiddleware.test.js.map +1 -0
- package/dist/src/acp-integration/session/rewrite/README.md +35 -0
- package/dist/src/acp-integration/session/rewrite/TurnBuffer.d.ts +25 -0
- package/dist/src/acp-integration/session/rewrite/TurnBuffer.js +53 -0
- package/dist/src/acp-integration/session/rewrite/TurnBuffer.js.map +1 -0
- package/dist/src/acp-integration/session/rewrite/TurnBuffer.test.d.ts +6 -0
- package/dist/src/acp-integration/session/rewrite/TurnBuffer.test.js +95 -0
- package/dist/src/acp-integration/session/rewrite/TurnBuffer.test.js.map +1 -0
- package/dist/src/acp-integration/session/rewrite/config.d.ts +13 -0
- package/dist/src/acp-integration/session/rewrite/config.js +19 -0
- package/dist/src/acp-integration/session/rewrite/config.js.map +1 -0
- package/dist/src/acp-integration/session/rewrite/config.test.d.ts +6 -0
- package/dist/src/acp-integration/session/rewrite/config.test.js +72 -0
- package/dist/src/acp-integration/session/rewrite/config.test.js.map +1 -0
- package/dist/src/acp-integration/session/rewrite/index.d.ts +8 -0
- package/dist/src/acp-integration/session/rewrite/index.js +8 -0
- package/dist/src/acp-integration/session/rewrite/index.js.map +1 -0
- package/dist/src/acp-integration/session/rewrite/types.d.ts +36 -0
- package/dist/src/acp-integration/session/rewrite/types.js +7 -0
- package/dist/src/acp-integration/session/rewrite/types.js.map +1 -0
- package/dist/src/acp-integration/session/types.d.ts +93 -0
- package/dist/src/acp-integration/session/types.js +7 -0
- package/dist/src/acp-integration/session/types.js.map +1 -0
- package/dist/src/commands/auth.d.ts +9 -0
- package/dist/src/commands/auth.js +55 -0
- package/dist/src/commands/auth.js.map +1 -0
- package/dist/src/commands/auth.test.d.ts +6 -0
- package/dist/src/commands/auth.test.js +84 -0
- package/dist/src/commands/auth.test.js.map +1 -0
- package/dist/src/commands/channel/channel-registry.d.ts +4 -0
- package/dist/src/commands/channel/channel-registry.js +33 -0
- package/dist/src/commands/channel/channel-registry.js.map +1 -0
- package/dist/src/commands/channel/config-utils.d.ts +4 -0
- package/dist/src/commands/channel/config-utils.js +66 -0
- package/dist/src/commands/channel/config-utils.js.map +1 -0
- package/dist/src/commands/channel/config-utils.test.d.ts +1 -0
- package/dist/src/commands/channel/config-utils.test.js +142 -0
- package/dist/src/commands/channel/config-utils.test.js.map +1 -0
- package/dist/src/commands/channel/configure.d.ts +4 -0
- package/dist/src/commands/channel/configure.js +65 -0
- package/dist/src/commands/channel/configure.js.map +1 -0
- package/dist/src/commands/channel/pairing.d.ts +8 -0
- package/dist/src/commands/channel/pairing.js +49 -0
- package/dist/src/commands/channel/pairing.js.map +1 -0
- package/dist/src/commands/channel/pidfile.d.ts +25 -0
- package/dist/src/commands/channel/pidfile.js +104 -0
- package/dist/src/commands/channel/pidfile.js.map +1 -0
- package/dist/src/commands/channel/pidfile.test.d.ts +1 -0
- package/dist/src/commands/channel/pidfile.test.js +143 -0
- package/dist/src/commands/channel/pidfile.test.js.map +1 -0
- package/dist/src/commands/channel/start.d.ts +16 -0
- package/dist/src/commands/channel/start.js +352 -0
- package/dist/src/commands/channel/start.js.map +1 -0
- package/dist/src/commands/channel/start.test.d.ts +1 -0
- package/dist/src/commands/channel/start.test.js +156 -0
- package/dist/src/commands/channel/start.test.js.map +1 -0
- package/dist/src/commands/channel/status.d.ts +2 -0
- package/dist/src/commands/channel/status.js +58 -0
- package/dist/src/commands/channel/status.js.map +1 -0
- package/dist/src/commands/channel/stop.d.ts +2 -0
- package/dist/src/commands/channel/stop.js +34 -0
- package/dist/src/commands/channel/stop.js.map +1 -0
- package/dist/src/commands/channel.d.ts +2 -0
- package/dist/src/commands/channel.js +29 -0
- package/dist/src/commands/channel.js.map +1 -0
- package/dist/src/commands/extensions/consent.d.ts +47 -0
- package/dist/src/commands/extensions/consent.js +182 -0
- package/dist/src/commands/extensions/consent.js.map +1 -0
- package/dist/src/commands/extensions/consent.test.d.ts +6 -0
- package/dist/src/commands/extensions/consent.test.js +277 -0
- package/dist/src/commands/extensions/consent.test.js.map +1 -0
- package/dist/src/commands/extensions/disable.d.ts +13 -0
- package/dist/src/commands/extensions/disable.js +65 -0
- package/dist/src/commands/extensions/disable.js.map +1 -0
- package/dist/src/commands/extensions/disable.test.d.ts +6 -0
- package/dist/src/commands/extensions/disable.test.js +101 -0
- package/dist/src/commands/extensions/disable.test.js.map +1 -0
- package/dist/src/commands/extensions/enable.d.ts +13 -0
- package/dist/src/commands/extensions/enable.js +70 -0
- package/dist/src/commands/extensions/enable.js.map +1 -0
- package/dist/src/commands/extensions/enable.test.d.ts +6 -0
- package/dist/src/commands/extensions/enable.test.js +93 -0
- package/dist/src/commands/extensions/enable.test.js.map +1 -0
- package/dist/src/commands/extensions/examples/agent/agents/diary.md +86 -0
- package/dist/src/commands/extensions/examples/agent/qwen-extension.json +5 -0
- package/dist/src/commands/extensions/examples/commands/commands/fs/grep-code.md +3 -0
- package/dist/src/commands/extensions/examples/commands/qwen-extension.json +5 -0
- package/dist/src/commands/extensions/examples/context/QWEN.md +8 -0
- package/dist/src/commands/extensions/examples/context/qwen-extension.json +5 -0
- package/dist/src/commands/extensions/examples/mcp-server/example.ts +60 -0
- package/dist/src/commands/extensions/examples/mcp-server/package.json +18 -0
- package/dist/src/commands/extensions/examples/mcp-server/qwen-extension.json +12 -0
- package/dist/src/commands/extensions/examples/mcp-server/tsconfig.json +13 -0
- package/dist/src/commands/extensions/examples/skills/qwen-extension.json +5 -0
- package/dist/src/commands/extensions/examples/skills/skills/synonyms/SKILL.md +48 -0
- package/dist/src/commands/extensions/install.d.ts +17 -0
- package/dist/src/commands/extensions/install.js +105 -0
- package/dist/src/commands/extensions/install.js.map +1 -0
- package/dist/src/commands/extensions/install.test.d.ts +6 -0
- package/dist/src/commands/extensions/install.test.js +164 -0
- package/dist/src/commands/extensions/install.test.js.map +1 -0
- package/dist/src/commands/extensions/link.d.ts +12 -0
- package/dist/src/commands/extensions/link.js +48 -0
- package/dist/src/commands/extensions/link.js.map +1 -0
- package/dist/src/commands/extensions/link.test.d.ts +6 -0
- package/dist/src/commands/extensions/link.test.js +74 -0
- package/dist/src/commands/extensions/link.test.js.map +1 -0
- package/dist/src/commands/extensions/list.d.ts +8 -0
- package/dist/src/commands/extensions/list.js +35 -0
- package/dist/src/commands/extensions/list.js.map +1 -0
- package/dist/src/commands/extensions/list.test.d.ts +6 -0
- package/dist/src/commands/extensions/list.test.js +76 -0
- package/dist/src/commands/extensions/list.test.js.map +1 -0
- package/dist/src/commands/extensions/new.d.ts +7 -0
- package/dist/src/commands/extensions/new.js +95 -0
- package/dist/src/commands/extensions/new.js.map +1 -0
- package/dist/src/commands/extensions/new.test.d.ts +6 -0
- package/dist/src/commands/extensions/new.test.js +59 -0
- package/dist/src/commands/extensions/new.test.js.map +1 -0
- package/dist/src/commands/extensions/settings.d.ts +7 -0
- package/dist/src/commands/extensions/settings.js +115 -0
- package/dist/src/commands/extensions/settings.js.map +1 -0
- package/dist/src/commands/extensions/settings.test.d.ts +6 -0
- package/dist/src/commands/extensions/settings.test.js +251 -0
- package/dist/src/commands/extensions/settings.test.js.map +1 -0
- package/dist/src/commands/extensions/uninstall.d.ts +12 -0
- package/dist/src/commands/extensions/uninstall.js +50 -0
- package/dist/src/commands/extensions/uninstall.js.map +1 -0
- package/dist/src/commands/extensions/uninstall.test.d.ts +6 -0
- package/dist/src/commands/extensions/uninstall.test.js +18 -0
- package/dist/src/commands/extensions/uninstall.test.js.map +1 -0
- package/dist/src/commands/extensions/update.d.ts +13 -0
- package/dist/src/commands/extensions/update.js +102 -0
- package/dist/src/commands/extensions/update.js.map +1 -0
- package/dist/src/commands/extensions/update.test.d.ts +6 -0
- package/dist/src/commands/extensions/update.test.js +185 -0
- package/dist/src/commands/extensions/update.test.js.map +1 -0
- package/dist/src/commands/extensions/utils.d.ts +8 -0
- package/dist/src/commands/extensions/utils.js +79 -0
- package/dist/src/commands/extensions/utils.js.map +1 -0
- package/dist/src/commands/extensions/utils.test.d.ts +6 -0
- package/dist/src/commands/extensions/utils.test.js +147 -0
- package/dist/src/commands/extensions/utils.test.js.map +1 -0
- package/dist/src/commands/extensions.d.ts +7 -0
- package/dist/src/commands/extensions.js +35 -0
- package/dist/src/commands/extensions.js.map +1 -0
- package/dist/src/commands/extensions.test.d.ts +6 -0
- package/dist/src/commands/extensions.test.js +72 -0
- package/dist/src/commands/extensions.test.js.map +1 -0
- package/dist/src/commands/hooks.d.ts +7 -0
- package/dist/src/commands/hooks.js +20 -0
- package/dist/src/commands/hooks.js.map +1 -0
- package/dist/src/commands/mcp/add.d.ts +7 -0
- package/dist/src/commands/mcp/add.js +247 -0
- package/dist/src/commands/mcp/add.js.map +1 -0
- package/dist/src/commands/mcp/list.d.ts +8 -0
- package/dist/src/commands/mcp/list.js +118 -0
- package/dist/src/commands/mcp/list.js.map +1 -0
- package/dist/src/commands/mcp/reconnect.d.ts +7 -0
- package/dist/src/commands/mcp/reconnect.js +154 -0
- package/dist/src/commands/mcp/reconnect.js.map +1 -0
- package/dist/src/commands/mcp/remove.d.ts +7 -0
- package/dist/src/commands/mcp/remove.js +54 -0
- package/dist/src/commands/mcp/remove.js.map +1 -0
- package/dist/src/commands/mcp.d.ts +7 -0
- package/dist/src/commands/mcp.js +25 -0
- package/dist/src/commands/mcp.js.map +1 -0
- package/dist/src/commands/review/cleanup.d.ts +7 -0
- package/dist/src/commands/review/cleanup.js +81 -0
- package/dist/src/commands/review/cleanup.js.map +1 -0
- package/dist/src/commands/review/deterministic.d.ts +7 -0
- package/dist/src/commands/review/deterministic.js +474 -0
- package/dist/src/commands/review/deterministic.js.map +1 -0
- package/dist/src/commands/review/fetch-pr.d.ts +7 -0
- package/dist/src/commands/review/fetch-pr.js +124 -0
- package/dist/src/commands/review/fetch-pr.js.map +1 -0
- package/dist/src/commands/review/lib/gh.d.ts +34 -0
- package/dist/src/commands/review/lib/gh.js +64 -0
- package/dist/src/commands/review/lib/gh.js.map +1 -0
- package/dist/src/commands/review/lib/git.d.ts +18 -0
- package/dist/src/commands/review/lib/git.js +41 -0
- package/dist/src/commands/review/lib/git.js.map +1 -0
- package/dist/src/commands/review/lib/paths.d.ts +23 -0
- package/dist/src/commands/review/lib/paths.js +37 -0
- package/dist/src/commands/review/lib/paths.js.map +1 -0
- package/dist/src/commands/review/load-rules.d.ts +7 -0
- package/dist/src/commands/review/load-rules.js +112 -0
- package/dist/src/commands/review/load-rules.js.map +1 -0
- package/dist/src/commands/review/pr-context.d.ts +7 -0
- package/dist/src/commands/review/pr-context.js +214 -0
- package/dist/src/commands/review/pr-context.js.map +1 -0
- package/dist/src/commands/review/presubmit.d.ts +7 -0
- package/dist/src/commands/review/presubmit.js +190 -0
- package/dist/src/commands/review/presubmit.js.map +1 -0
- package/dist/src/commands/review.d.ts +7 -0
- package/dist/src/commands/review.js +28 -0
- package/dist/src/commands/review.js.map +1 -0
- package/dist/src/commands/serve.d.ts +21 -0
- package/dist/src/commands/serve.js +214 -0
- package/dist/src/commands/serve.js.map +1 -0
- package/dist/src/commands/sp.d.ts +7 -0
- package/dist/src/commands/sp.js +62 -0
- package/dist/src/commands/sp.js.map +1 -0
- package/dist/src/config/auth.d.ts +10 -0
- package/dist/src/config/auth.js +183 -0
- package/dist/src/config/auth.js.map +1 -0
- package/dist/src/config/auth.test.d.ts +6 -0
- package/dist/src/config/auth.test.js +292 -0
- package/dist/src/config/auth.test.js.map +1 -0
- package/dist/src/config/config.d.ts +144 -0
- package/dist/src/config/config.js +1618 -0
- package/dist/src/config/config.js.map +1 -0
- package/dist/src/config/jsonSchemaArg.test.d.ts +6 -0
- package/dist/src/config/jsonSchemaArg.test.js +305 -0
- package/dist/src/config/jsonSchemaArg.test.js.map +1 -0
- package/dist/src/config/keyBindings.d.ts +89 -0
- package/dist/src/config/keyBindings.js +188 -0
- package/dist/src/config/keyBindings.js.map +1 -0
- package/dist/src/config/keyBindings.test.d.ts +6 -0
- package/dist/src/config/keyBindings.test.js +51 -0
- package/dist/src/config/keyBindings.test.js.map +1 -0
- package/dist/src/config/loadedSettingsAdapter.d.ts +15 -0
- package/dist/src/config/loadedSettingsAdapter.js +80 -0
- package/dist/src/config/loadedSettingsAdapter.js.map +1 -0
- package/dist/src/config/loadedSettingsAdapter.test.d.ts +6 -0
- package/dist/src/config/loadedSettingsAdapter.test.js +127 -0
- package/dist/src/config/loadedSettingsAdapter.test.js.map +1 -0
- package/dist/src/config/migration/index.d.ts +59 -0
- package/dist/src/config/migration/index.js +94 -0
- package/dist/src/config/migration/index.js.map +1 -0
- package/dist/src/config/migration/index.test.d.ts +6 -0
- package/dist/src/config/migration/index.test.js +295 -0
- package/dist/src/config/migration/index.test.js.map +1 -0
- package/dist/src/config/migration/scheduler.d.ts +51 -0
- package/dist/src/config/migration/scheduler.js +95 -0
- package/dist/src/config/migration/scheduler.js.map +1 -0
- package/dist/src/config/migration/scheduler.test.d.ts +6 -0
- package/dist/src/config/migration/scheduler.test.js +129 -0
- package/dist/src/config/migration/scheduler.test.js.map +1 -0
- package/dist/src/config/migration/types.d.ts +53 -0
- package/dist/src/config/migration/types.js +7 -0
- package/dist/src/config/migration/types.js.map +1 -0
- package/dist/src/config/migration/versions/v1-to-v2-shared.d.ts +27 -0
- package/dist/src/config/migration/versions/v1-to-v2-shared.js +174 -0
- package/dist/src/config/migration/versions/v1-to-v2-shared.js.map +1 -0
- package/dist/src/config/migration/versions/v1-to-v2.d.ts +81 -0
- package/dist/src/config/migration/versions/v1-to-v2.js +222 -0
- package/dist/src/config/migration/versions/v1-to-v2.js.map +1 -0
- package/dist/src/config/migration/versions/v1-to-v2.test.d.ts +6 -0
- package/dist/src/config/migration/versions/v1-to-v2.test.js +189 -0
- package/dist/src/config/migration/versions/v1-to-v2.test.js.map +1 -0
- package/dist/src/config/migration/versions/v2-to-v3.d.ts +61 -0
- package/dist/src/config/migration/versions/v2-to-v3.js +185 -0
- package/dist/src/config/migration/versions/v2-to-v3.js.map +1 -0
- package/dist/src/config/migration/versions/v2-to-v3.test.d.ts +6 -0
- package/dist/src/config/migration/versions/v2-to-v3.test.js +337 -0
- package/dist/src/config/migration/versions/v2-to-v3.test.js.map +1 -0
- package/dist/src/config/migration/versions/v3-to-v4.d.ts +34 -0
- package/dist/src/config/migration/versions/v3-to-v4.js +126 -0
- package/dist/src/config/migration/versions/v3-to-v4.js.map +1 -0
- package/dist/src/config/migration/versions/v3-to-v4.test.d.ts +6 -0
- package/dist/src/config/migration/versions/v3-to-v4.test.js +164 -0
- package/dist/src/config/migration/versions/v3-to-v4.test.js.map +1 -0
- package/dist/src/config/modelProvidersScope.d.ts +20 -0
- package/dist/src/config/modelProvidersScope.js +39 -0
- package/dist/src/config/modelProvidersScope.js.map +1 -0
- package/dist/src/config/modelProvidersScope.test.d.ts +6 -0
- package/dist/src/config/modelProvidersScope.test.js +66 -0
- package/dist/src/config/modelProvidersScope.test.js.map +1 -0
- package/dist/src/config/path-freshness.test.d.ts +6 -0
- package/dist/src/config/path-freshness.test.js +52 -0
- package/dist/src/config/path-freshness.test.js.map +1 -0
- package/dist/src/config/sandboxConfig.d.ts +13 -0
- package/dist/src/config/sandboxConfig.js +74 -0
- package/dist/src/config/sandboxConfig.js.map +1 -0
- package/dist/src/config/settings.d.ts +119 -0
- package/dist/src/config/settings.js +1015 -0
- package/dist/src/config/settings.js.map +1 -0
- package/dist/src/config/settingsSchema.d.ts +2207 -0
- package/dist/src/config/settingsSchema.js +2246 -0
- package/dist/src/config/settingsSchema.js.map +1 -0
- package/dist/src/config/settingsSchema.test.d.ts +6 -0
- package/dist/src/config/settingsSchema.test.js +232 -0
- package/dist/src/config/settingsSchema.test.js.map +1 -0
- package/dist/src/config/trustedFolders.d.ts +54 -0
- package/dist/src/config/trustedFolders.js +176 -0
- package/dist/src/config/trustedFolders.js.map +1 -0
- package/dist/src/config/trustedFolders.test.d.ts +6 -0
- package/dist/src/config/trustedFolders.test.js +354 -0
- package/dist/src/config/trustedFolders.test.js.map +1 -0
- package/dist/src/core/auth.d.ts +13 -0
- package/dist/src/core/auth.js +34 -0
- package/dist/src/core/auth.js.map +1 -0
- package/dist/src/core/auth.test.d.ts +6 -0
- package/dist/src/core/auth.test.js +47 -0
- package/dist/src/core/auth.test.js.map +1 -0
- package/dist/src/core/initializer.d.ts +21 -0
- package/dist/src/core/initializer.js +42 -0
- package/dist/src/core/initializer.js.map +1 -0
- package/dist/src/core/initializer.test.d.ts +6 -0
- package/dist/src/core/initializer.test.js +123 -0
- package/dist/src/core/initializer.test.js.map +1 -0
- package/dist/src/core/theme.d.ts +12 -0
- package/dist/src/core/theme.js +25 -0
- package/dist/src/core/theme.js.map +1 -0
- package/dist/src/core/theme.test.d.ts +6 -0
- package/dist/src/core/theme.test.js +57 -0
- package/dist/src/core/theme.test.js.map +1 -0
- package/dist/src/dualOutput/DualOutputBridge.d.ts +84 -0
- package/dist/src/dualOutput/DualOutputBridge.js +293 -0
- package/dist/src/dualOutput/DualOutputBridge.js.map +1 -0
- package/dist/src/dualOutput/DualOutputBridge.test.d.ts +6 -0
- package/dist/src/dualOutput/DualOutputBridge.test.js +157 -0
- package/dist/src/dualOutput/DualOutputBridge.test.js.map +1 -0
- package/dist/src/dualOutput/DualOutputContext.d.ts +19 -0
- package/dist/src/dualOutput/DualOutputContext.js +22 -0
- package/dist/src/dualOutput/DualOutputContext.js.map +1 -0
- package/dist/src/dualOutput/index.d.ts +7 -0
- package/dist/src/dualOutput/index.js +8 -0
- package/dist/src/dualOutput/index.js.map +1 -0
- package/dist/src/export/index.d.ts +6 -0
- package/dist/src/export/index.js +7 -0
- package/dist/src/export/index.js.map +1 -0
- package/dist/src/gemini.d.ts +13 -0
- package/dist/src/gemini.js +908 -0
- package/dist/src/gemini.js.map +1 -0
- package/dist/src/gemini.test.d.ts +6 -0
- package/dist/src/gemini.test.js +975 -0
- package/dist/src/gemini.test.js.map +1 -0
- package/dist/src/generated/git-commit.d.ts +7 -0
- package/dist/src/generated/git-commit.js +10 -0
- package/dist/src/generated/git-commit.js.map +1 -0
- package/dist/src/i18n/index.d.ts +27 -0
- package/dist/src/i18n/index.js +213 -0
- package/dist/src/i18n/index.js.map +1 -0
- package/dist/src/i18n/index.test.d.ts +6 -0
- package/dist/src/i18n/index.test.js +103 -0
- package/dist/src/i18n/index.test.js.map +1 -0
- package/dist/src/i18n/languages.d.ts +43 -0
- package/dist/src/i18n/languages.js +138 -0
- package/dist/src/i18n/languages.js.map +1 -0
- package/dist/src/i18n/locales/ca.js +3951 -0
- package/dist/src/i18n/locales/de.js +2018 -0
- package/dist/src/i18n/locales/en.js +2161 -0
- package/dist/src/i18n/locales/fr.js +2013 -0
- package/dist/src/i18n/locales/ja.js +1780 -0
- package/dist/src/i18n/locales/pt.js +2005 -0
- package/dist/src/i18n/locales/ru.js +1993 -0
- package/dist/src/i18n/locales/zh-TW.js +1729 -0
- package/dist/src/i18n/locales/zh.js +1929 -0
- package/dist/src/i18n/mustTranslateKeys.d.ts +12 -0
- package/dist/src/i18n/mustTranslateKeys.js +111 -0
- package/dist/src/i18n/mustTranslateKeys.js.map +1 -0
- package/dist/src/i18n/mustTranslateKeys.test.d.ts +6 -0
- package/dist/src/i18n/mustTranslateKeys.test.js +103 -0
- package/dist/src/i18n/mustTranslateKeys.test.js.map +1 -0
- package/dist/src/i18n/translationDict.d.ts +9 -0
- package/dist/src/i18n/translationDict.js +17 -0
- package/dist/src/i18n/translationDict.js.map +1 -0
- package/dist/src/nonInteractive/control/ControlContext.d.ts +71 -0
- package/dist/src/nonInteractive/control/ControlContext.js +36 -0
- package/dist/src/nonInteractive/control/ControlContext.js.map +1 -0
- package/dist/src/nonInteractive/control/ControlDispatcher.d.ts +116 -0
- package/dist/src/nonInteractive/control/ControlDispatcher.js +290 -0
- package/dist/src/nonInteractive/control/ControlDispatcher.js.map +1 -0
- package/dist/src/nonInteractive/control/ControlDispatcher.test.d.ts +6 -0
- package/dist/src/nonInteractive/control/ControlDispatcher.test.js +614 -0
- package/dist/src/nonInteractive/control/ControlDispatcher.test.js.map +1 -0
- package/dist/src/nonInteractive/control/ControlService.d.ts +79 -0
- package/dist/src/nonInteractive/control/ControlService.js +139 -0
- package/dist/src/nonInteractive/control/ControlService.js.map +1 -0
- package/dist/src/nonInteractive/control/controllers/baseController.d.ts +53 -0
- package/dist/src/nonInteractive/control/controllers/baseController.js +136 -0
- package/dist/src/nonInteractive/control/controllers/baseController.js.map +1 -0
- package/dist/src/nonInteractive/control/controllers/hookController.d.ts +25 -0
- package/dist/src/nonInteractive/control/controllers/hookController.js +40 -0
- package/dist/src/nonInteractive/control/controllers/hookController.js.map +1 -0
- package/dist/src/nonInteractive/control/controllers/permissionController.d.ts +57 -0
- package/dist/src/nonInteractive/control/controllers/permissionController.js +361 -0
- package/dist/src/nonInteractive/control/controllers/permissionController.js.map +1 -0
- package/dist/src/nonInteractive/control/controllers/permissionController.test.d.ts +6 -0
- package/dist/src/nonInteractive/control/controllers/permissionController.test.js +140 -0
- package/dist/src/nonInteractive/control/controllers/permissionController.test.js.map +1 -0
- package/dist/src/nonInteractive/control/controllers/sdkMcpController.d.ts +54 -0
- package/dist/src/nonInteractive/control/controllers/sdkMcpController.js +80 -0
- package/dist/src/nonInteractive/control/controllers/sdkMcpController.js.map +1 -0
- package/dist/src/nonInteractive/control/controllers/systemController.d.ts +67 -0
- package/dist/src/nonInteractive/control/controllers/systemController.js +326 -0
- package/dist/src/nonInteractive/control/controllers/systemController.js.map +1 -0
- package/dist/src/nonInteractive/control/controllers/systemController.test.d.ts +6 -0
- package/dist/src/nonInteractive/control/controllers/systemController.test.js +121 -0
- package/dist/src/nonInteractive/control/controllers/systemController.test.js.map +1 -0
- package/dist/src/nonInteractive/control/types/serviceAPIs.d.ts +105 -0
- package/dist/src/nonInteractive/control/types/serviceAPIs.js +7 -0
- package/dist/src/nonInteractive/control/types/serviceAPIs.js.map +1 -0
- package/dist/src/nonInteractive/io/BaseJsonOutputAdapter.d.ts +505 -0
- package/dist/src/nonInteractive/io/BaseJsonOutputAdapter.js +1041 -0
- package/dist/src/nonInteractive/io/BaseJsonOutputAdapter.js.map +1 -0
- package/dist/src/nonInteractive/io/BaseJsonOutputAdapter.test.d.ts +6 -0
- package/dist/src/nonInteractive/io/BaseJsonOutputAdapter.test.js +1304 -0
- package/dist/src/nonInteractive/io/BaseJsonOutputAdapter.test.js.map +1 -0
- package/dist/src/nonInteractive/io/JsonOutputAdapter.d.ts +29 -0
- package/dist/src/nonInteractive/io/JsonOutputAdapter.js +64 -0
- package/dist/src/nonInteractive/io/JsonOutputAdapter.js.map +1 -0
- package/dist/src/nonInteractive/io/JsonOutputAdapter.test.d.ts +6 -0
- package/dist/src/nonInteractive/io/JsonOutputAdapter.test.js +684 -0
- package/dist/src/nonInteractive/io/JsonOutputAdapter.test.js.map +1 -0
- package/dist/src/nonInteractive/io/StreamJsonInputReader.d.ts +16 -0
- package/dist/src/nonInteractive/io/StreamJsonInputReader.js +54 -0
- package/dist/src/nonInteractive/io/StreamJsonInputReader.js.map +1 -0
- package/dist/src/nonInteractive/io/StreamJsonInputReader.test.d.ts +6 -0
- package/dist/src/nonInteractive/io/StreamJsonInputReader.test.js +178 -0
- package/dist/src/nonInteractive/io/StreamJsonInputReader.test.js.map +1 -0
- package/dist/src/nonInteractive/io/StreamJsonOutputAdapter.d.ts +84 -0
- package/dist/src/nonInteractive/io/StreamJsonOutputAdapter.dualOutput.test.d.ts +6 -0
- package/dist/src/nonInteractive/io/StreamJsonOutputAdapter.dualOutput.test.js +118 -0
- package/dist/src/nonInteractive/io/StreamJsonOutputAdapter.dualOutput.test.js.map +1 -0
- package/dist/src/nonInteractive/io/StreamJsonOutputAdapter.js +227 -0
- package/dist/src/nonInteractive/io/StreamJsonOutputAdapter.js.map +1 -0
- package/dist/src/nonInteractive/io/StreamJsonOutputAdapter.test.d.ts +6 -0
- package/dist/src/nonInteractive/io/StreamJsonOutputAdapter.test.js +1046 -0
- package/dist/src/nonInteractive/io/StreamJsonOutputAdapter.test.js.map +1 -0
- package/dist/src/nonInteractive/io/index.d.ts +6 -0
- package/dist/src/nonInteractive/io/index.js +7 -0
- package/dist/src/nonInteractive/io/index.js.map +1 -0
- package/dist/src/nonInteractive/session.d.ts +8 -0
- package/dist/src/nonInteractive/session.js +664 -0
- package/dist/src/nonInteractive/session.js.map +1 -0
- package/dist/src/nonInteractive/session.test.d.ts +6 -0
- package/dist/src/nonInteractive/session.test.js +680 -0
- package/dist/src/nonInteractive/session.test.js.map +1 -0
- package/dist/src/nonInteractive/types.d.ts +415 -0
- package/dist/src/nonInteractive/types.js +77 -0
- package/dist/src/nonInteractive/types.js.map +1 -0
- package/dist/src/nonInteractiveCli.d.ts +33 -0
- package/dist/src/nonInteractiveCli.js +1058 -0
- package/dist/src/nonInteractiveCli.js.map +1 -0
- package/dist/src/nonInteractiveCliCommands.d.ts +59 -0
- package/dist/src/nonInteractiveCliCommands.js +326 -0
- package/dist/src/nonInteractiveCliCommands.js.map +1 -0
- package/dist/src/nonInteractiveCliCommands.test.d.ts +6 -0
- package/dist/src/nonInteractiveCliCommands.test.js +484 -0
- package/dist/src/nonInteractiveCliCommands.test.js.map +1 -0
- package/dist/src/patches/is-in-ci.d.ts +7 -0
- package/dist/src/patches/is-in-ci.js +15 -0
- package/dist/src/patches/is-in-ci.js.map +1 -0
- package/dist/src/remoteInput/RemoteInputContext.d.ts +8 -0
- package/dist/src/remoteInput/RemoteInputContext.js +9 -0
- package/dist/src/remoteInput/RemoteInputContext.js.map +1 -0
- package/dist/src/remoteInput/RemoteInputWatcher.d.ts +83 -0
- package/dist/src/remoteInput/RemoteInputWatcher.js +201 -0
- package/dist/src/remoteInput/RemoteInputWatcher.js.map +1 -0
- package/dist/src/remoteInput/RemoteInputWatcher.test.d.ts +6 -0
- package/dist/src/remoteInput/RemoteInputWatcher.test.js +100 -0
- package/dist/src/remoteInput/RemoteInputWatcher.test.js.map +1 -0
- package/dist/src/remoteInput/index.d.ts +7 -0
- package/dist/src/remoteInput/index.js +8 -0
- package/dist/src/remoteInput/index.js.map +1 -0
- package/dist/src/serve/auth/deviceFlow.d.ts +595 -0
- package/dist/src/serve/auth/deviceFlow.js +1243 -0
- package/dist/src/serve/auth/deviceFlow.js.map +1 -0
- package/dist/src/serve/auth/deviceFlow.test.d.ts +6 -0
- package/dist/src/serve/auth/deviceFlow.test.js +1314 -0
- package/dist/src/serve/auth/deviceFlow.test.js.map +1 -0
- package/dist/src/serve/auth/qwenDeviceFlowProvider.d.ts +30 -0
- package/dist/src/serve/auth/qwenDeviceFlowProvider.js +331 -0
- package/dist/src/serve/auth/qwenDeviceFlowProvider.js.map +1 -0
- package/dist/src/serve/auth/qwenDeviceFlowProvider.test.d.ts +6 -0
- package/dist/src/serve/auth/qwenDeviceFlowProvider.test.js +301 -0
- package/dist/src/serve/auth/qwenDeviceFlowProvider.test.js.map +1 -0
- package/dist/src/serve/auth.d.ts +101 -0
- package/dist/src/serve/auth.js +216 -0
- package/dist/src/serve/auth.js.map +1 -0
- package/dist/src/serve/capabilities.d.ts +196 -0
- package/dist/src/serve/capabilities.js +227 -0
- package/dist/src/serve/capabilities.js.map +1 -0
- package/dist/src/serve/daemonStatusProvider.d.ts +14 -0
- package/dist/src/serve/daemonStatusProvider.js +252 -0
- package/dist/src/serve/daemonStatusProvider.js.map +1 -0
- package/dist/src/serve/debugMode.d.ts +27 -0
- package/dist/src/serve/debugMode.js +33 -0
- package/dist/src/serve/debugMode.js.map +1 -0
- package/dist/src/serve/demo.d.ts +11 -0
- package/dist/src/serve/demo.js +640 -0
- package/dist/src/serve/demo.js.map +1 -0
- package/dist/src/serve/envSnapshot.d.ts +28 -0
- package/dist/src/serve/envSnapshot.js +199 -0
- package/dist/src/serve/envSnapshot.js.map +1 -0
- package/dist/src/serve/envSnapshot.test.d.ts +6 -0
- package/dist/src/serve/envSnapshot.test.js +181 -0
- package/dist/src/serve/envSnapshot.test.js.map +1 -0
- package/dist/src/serve/eventBus.d.ts +6 -0
- package/dist/src/serve/eventBus.js +15 -0
- package/dist/src/serve/eventBus.js.map +1 -0
- package/dist/src/serve/fs/audit.d.ts +144 -0
- package/dist/src/serve/fs/audit.js +193 -0
- package/dist/src/serve/fs/audit.js.map +1 -0
- package/dist/src/serve/fs/audit.test.d.ts +6 -0
- package/dist/src/serve/fs/audit.test.js +246 -0
- package/dist/src/serve/fs/audit.test.js.map +1 -0
- package/dist/src/serve/fs/contract.test.d.ts +6 -0
- package/dist/src/serve/fs/contract.test.js +211 -0
- package/dist/src/serve/fs/contract.test.js.map +1 -0
- package/dist/src/serve/fs/errors.d.ts +87 -0
- package/dist/src/serve/fs/errors.js +128 -0
- package/dist/src/serve/fs/errors.js.map +1 -0
- package/dist/src/serve/fs/errors.test.d.ts +6 -0
- package/dist/src/serve/fs/errors.test.js +152 -0
- package/dist/src/serve/fs/errors.test.js.map +1 -0
- package/dist/src/serve/fs/index.d.ts +10 -0
- package/dist/src/serve/fs/index.js +11 -0
- package/dist/src/serve/fs/index.js.map +1 -0
- package/dist/src/serve/fs/paths.d.ts +103 -0
- package/dist/src/serve/fs/paths.js +433 -0
- package/dist/src/serve/fs/paths.js.map +1 -0
- package/dist/src/serve/fs/paths.test.d.ts +6 -0
- package/dist/src/serve/fs/paths.test.js +309 -0
- package/dist/src/serve/fs/paths.test.js.map +1 -0
- package/dist/src/serve/fs/policy.d.ts +142 -0
- package/dist/src/serve/fs/policy.js +189 -0
- package/dist/src/serve/fs/policy.js.map +1 -0
- package/dist/src/serve/fs/policy.test.d.ts +6 -0
- package/dist/src/serve/fs/policy.test.js +193 -0
- package/dist/src/serve/fs/policy.test.js.map +1 -0
- package/dist/src/serve/fs/workspaceFileSystem.d.ts +157 -0
- package/dist/src/serve/fs/workspaceFileSystem.js +1377 -0
- package/dist/src/serve/fs/workspaceFileSystem.js.map +1 -0
- package/dist/src/serve/fs/workspaceFileSystem.test.d.ts +6 -0
- package/dist/src/serve/fs/workspaceFileSystem.test.js +880 -0
- package/dist/src/serve/fs/workspaceFileSystem.test.js.map +1 -0
- package/dist/src/serve/httpAcpBridge.d.ts +80 -0
- package/dist/src/serve/httpAcpBridge.js +3559 -0
- package/dist/src/serve/httpAcpBridge.js.map +1 -0
- package/dist/src/serve/httpAcpBridge.test.d.ts +6 -0
- package/dist/src/serve/httpAcpBridge.test.js +4987 -0
- package/dist/src/serve/httpAcpBridge.test.js.map +1 -0
- package/dist/src/serve/inMemoryChannel.d.ts +6 -0
- package/dist/src/serve/inMemoryChannel.js +14 -0
- package/dist/src/serve/inMemoryChannel.js.map +1 -0
- package/dist/src/serve/index.d.ts +15 -0
- package/dist/src/serve/index.js +16 -0
- package/dist/src/serve/index.js.map +1 -0
- package/dist/src/serve/loopbackBinds.d.ts +18 -0
- package/dist/src/serve/loopbackBinds.js +33 -0
- package/dist/src/serve/loopbackBinds.js.map +1 -0
- package/dist/src/serve/routes/workspaceFileRead.d.ts +90 -0
- package/dist/src/serve/routes/workspaceFileRead.js +458 -0
- package/dist/src/serve/routes/workspaceFileRead.js.map +1 -0
- package/dist/src/serve/routes/workspaceFileRead.test.d.ts +6 -0
- package/dist/src/serve/routes/workspaceFileRead.test.js +453 -0
- package/dist/src/serve/routes/workspaceFileRead.test.js.map +1 -0
- package/dist/src/serve/routes/workspaceFileWrite.d.ts +17 -0
- package/dist/src/serve/routes/workspaceFileWrite.js +224 -0
- package/dist/src/serve/routes/workspaceFileWrite.js.map +1 -0
- package/dist/src/serve/routes/workspaceFileWrite.test.d.ts +6 -0
- package/dist/src/serve/routes/workspaceFileWrite.test.js +223 -0
- package/dist/src/serve/routes/workspaceFileWrite.test.js.map +1 -0
- package/dist/src/serve/runQwenServe.d.ts +67 -0
- package/dist/src/serve/runQwenServe.js +616 -0
- package/dist/src/serve/runQwenServe.js.map +1 -0
- package/dist/src/serve/server.d.ts +125 -0
- package/dist/src/serve/server.js +2297 -0
- package/dist/src/serve/server.js.map +1 -0
- package/dist/src/serve/status.d.ts +6 -0
- package/dist/src/serve/status.js +13 -0
- package/dist/src/serve/status.js.map +1 -0
- package/dist/src/serve/types.d.ts +175 -0
- package/dist/src/serve/types.js +10 -0
- package/dist/src/serve/types.js.map +1 -0
- package/dist/src/serve/workspaceAgents.d.ts +47 -0
- package/dist/src/serve/workspaceAgents.js +1171 -0
- package/dist/src/serve/workspaceAgents.js.map +1 -0
- package/dist/src/serve/workspaceAgents.test.d.ts +6 -0
- package/dist/src/serve/workspaceAgents.test.js +823 -0
- package/dist/src/serve/workspaceAgents.test.js.map +1 -0
- package/dist/src/serve/workspaceMemory.d.ts +60 -0
- package/dist/src/serve/workspaceMemory.js +323 -0
- package/dist/src/serve/workspaceMemory.js.map +1 -0
- package/dist/src/serve/workspaceMemory.test.d.ts +6 -0
- package/dist/src/serve/workspaceMemory.test.js +418 -0
- package/dist/src/serve/workspaceMemory.test.js.map +1 -0
- package/dist/src/services/BuiltinCommandLoader.d.ts +24 -0
- package/dist/src/services/BuiltinCommandLoader.js +159 -0
- package/dist/src/services/BuiltinCommandLoader.js.map +1 -0
- package/dist/src/services/BuiltinCommandLoader.test.d.ts +6 -0
- package/dist/src/services/BuiltinCommandLoader.test.js +234 -0
- package/dist/src/services/BuiltinCommandLoader.test.js.map +1 -0
- package/dist/src/services/BundledSkillLoader.d.ts +17 -0
- package/dist/src/services/BundledSkillLoader.js +97 -0
- package/dist/src/services/BundledSkillLoader.js.map +1 -0
- package/dist/src/services/BundledSkillLoader.test.d.ts +6 -0
- package/dist/src/services/BundledSkillLoader.test.js +301 -0
- package/dist/src/services/BundledSkillLoader.test.js.map +1 -0
- package/dist/src/services/CommandService.d.ts +69 -0
- package/dist/src/services/CommandService.js +128 -0
- package/dist/src/services/CommandService.js.map +1 -0
- package/dist/src/services/CommandService.test.d.ts +6 -0
- package/dist/src/services/CommandService.test.js +263 -0
- package/dist/src/services/CommandService.test.js.map +1 -0
- package/dist/src/services/FileCommandLoader-extension.test.d.ts +6 -0
- package/dist/src/services/FileCommandLoader-extension.test.js +279 -0
- package/dist/src/services/FileCommandLoader-extension.test.js.map +1 -0
- package/dist/src/services/FileCommandLoader-markdown.test.d.ts +6 -0
- package/dist/src/services/FileCommandLoader-markdown.test.js +111 -0
- package/dist/src/services/FileCommandLoader-markdown.test.js.map +1 -0
- package/dist/src/services/FileCommandLoader.d.ts +64 -0
- package/dist/src/services/FileCommandLoader.js +259 -0
- package/dist/src/services/FileCommandLoader.js.map +1 -0
- package/dist/src/services/McpPromptLoader.d.ts +35 -0
- package/dist/src/services/McpPromptLoader.js +261 -0
- package/dist/src/services/McpPromptLoader.js.map +1 -0
- package/dist/src/services/McpPromptLoader.test.d.ts +6 -0
- package/dist/src/services/McpPromptLoader.test.js +341 -0
- package/dist/src/services/McpPromptLoader.test.js.map +1 -0
- package/dist/src/services/SkillCommandLoader.d.ts +23 -0
- package/dist/src/services/SkillCommandLoader.js +110 -0
- package/dist/src/services/SkillCommandLoader.js.map +1 -0
- package/dist/src/services/SkillCommandLoader.test.d.ts +6 -0
- package/dist/src/services/SkillCommandLoader.test.js +307 -0
- package/dist/src/services/SkillCommandLoader.test.js.map +1 -0
- package/dist/src/services/command-factory.d.ts +25 -0
- package/dist/src/services/command-factory.js +122 -0
- package/dist/src/services/command-factory.js.map +1 -0
- package/dist/src/services/command-factory.test.d.ts +6 -0
- package/dist/src/services/command-factory.test.js +31 -0
- package/dist/src/services/command-factory.test.js.map +1 -0
- package/dist/src/services/command-migration-tool.d.ts +39 -0
- package/dist/src/services/command-migration-tool.js +135 -0
- package/dist/src/services/command-migration-tool.js.map +1 -0
- package/dist/src/services/command-migration-tool.test.d.ts +6 -0
- package/dist/src/services/command-migration-tool.test.js +175 -0
- package/dist/src/services/command-migration-tool.test.js.map +1 -0
- package/dist/src/services/commandMetadata.d.ts +21 -0
- package/dist/src/services/commandMetadata.js +106 -0
- package/dist/src/services/commandMetadata.js.map +1 -0
- package/dist/src/services/commandMetadata.test.d.ts +6 -0
- package/dist/src/services/commandMetadata.test.js +216 -0
- package/dist/src/services/commandMetadata.test.js.map +1 -0
- package/dist/src/services/commandUtils.d.ts +36 -0
- package/dist/src/services/commandUtils.js +57 -0
- package/dist/src/services/commandUtils.js.map +1 -0
- package/dist/src/services/commandUtils.test.d.ts +6 -0
- package/dist/src/services/commandUtils.test.js +159 -0
- package/dist/src/services/commandUtils.test.js.map +1 -0
- package/dist/src/services/insight/generators/DataProcessor.d.ts +23 -0
- package/dist/src/services/insight/generators/DataProcessor.js +1001 -0
- package/dist/src/services/insight/generators/DataProcessor.js.map +1 -0
- package/dist/src/services/insight/generators/DataProcessor.test.d.ts +6 -0
- package/dist/src/services/insight/generators/DataProcessor.test.js +1210 -0
- package/dist/src/services/insight/generators/DataProcessor.test.js.map +1 -0
- package/dist/src/services/insight/generators/StaticInsightGenerator.d.ts +16 -0
- package/dist/src/services/insight/generators/StaticInsightGenerator.js +63 -0
- package/dist/src/services/insight/generators/StaticInsightGenerator.js.map +1 -0
- package/dist/src/services/insight/generators/StaticInsightGenerator.test.d.ts +6 -0
- package/dist/src/services/insight/generators/StaticInsightGenerator.test.js +60 -0
- package/dist/src/services/insight/generators/StaticInsightGenerator.test.js.map +1 -0
- package/dist/src/services/insight/generators/TemplateRenderer.d.ts +9 -0
- package/dist/src/services/insight/generators/TemplateRenderer.js +49 -0
- package/dist/src/services/insight/generators/TemplateRenderer.js.map +1 -0
- package/dist/src/services/insight/types/QualitativeInsightTypes.d.ts +74 -0
- package/dist/src/services/insight/types/QualitativeInsightTypes.js +2 -0
- package/dist/src/services/insight/types/QualitativeInsightTypes.js.map +1 -0
- package/dist/src/services/insight/types/StaticInsightTypes.d.ts +59 -0
- package/dist/src/services/insight/types/StaticInsightTypes.js +7 -0
- package/dist/src/services/insight/types/StaticInsightTypes.js.map +1 -0
- package/dist/src/services/markdown-command-parser.d.ts +52 -0
- package/dist/src/services/markdown-command-parser.js +60 -0
- package/dist/src/services/markdown-command-parser.js.map +1 -0
- package/dist/src/services/markdown-command-parser.test.d.ts +6 -0
- package/dist/src/services/markdown-command-parser.test.js +146 -0
- package/dist/src/services/markdown-command-parser.test.js.map +1 -0
- package/dist/src/services/notificationService.d.ts +19 -0
- package/dist/src/services/notificationService.js +64 -0
- package/dist/src/services/notificationService.js.map +1 -0
- package/dist/src/services/notificationService.test.d.ts +6 -0
- package/dist/src/services/notificationService.test.js +114 -0
- package/dist/src/services/notificationService.test.js.map +1 -0
- package/dist/src/services/prompt-processors/argumentProcessor.d.ts +16 -0
- package/dist/src/services/prompt-processors/argumentProcessor.js +21 -0
- package/dist/src/services/prompt-processors/argumentProcessor.js.map +1 -0
- package/dist/src/services/prompt-processors/atFileProcessor.d.ts +12 -0
- package/dist/src/services/prompt-processors/atFileProcessor.js +63 -0
- package/dist/src/services/prompt-processors/atFileProcessor.js.map +1 -0
- package/dist/src/services/prompt-processors/atFileProcessor.test.d.ts +6 -0
- package/dist/src/services/prompt-processors/atFileProcessor.test.js +174 -0
- package/dist/src/services/prompt-processors/atFileProcessor.test.js.map +1 -0
- package/dist/src/services/prompt-processors/injectionParser.d.ts +29 -0
- package/dist/src/services/prompt-processors/injectionParser.js +60 -0
- package/dist/src/services/prompt-processors/injectionParser.js.map +1 -0
- package/dist/src/services/prompt-processors/injectionParser.test.d.ts +6 -0
- package/dist/src/services/prompt-processors/injectionParser.test.js +189 -0
- package/dist/src/services/prompt-processors/injectionParser.test.js.map +1 -0
- package/dist/src/services/prompt-processors/shellProcessor.d.ts +27 -0
- package/dist/src/services/prompt-processors/shellProcessor.js +146 -0
- package/dist/src/services/prompt-processors/shellProcessor.js.map +1 -0
- package/dist/src/services/prompt-processors/types.d.ts +45 -0
- package/dist/src/services/prompt-processors/types.js +20 -0
- package/dist/src/services/prompt-processors/types.js.map +1 -0
- package/dist/src/services/test-commands/example.md +5 -0
- package/dist/src/services/tips/index.d.ts +10 -0
- package/dist/src/services/tips/index.js +21 -0
- package/dist/src/services/tips/index.js.map +1 -0
- package/dist/src/services/tips/tipHistory.d.ts +49 -0
- package/dist/src/services/tips/tipHistory.js +138 -0
- package/dist/src/services/tips/tipHistory.js.map +1 -0
- package/dist/src/services/tips/tipHistory.test.d.ts +6 -0
- package/dist/src/services/tips/tipHistory.test.js +102 -0
- package/dist/src/services/tips/tipHistory.test.js.map +1 -0
- package/dist/src/services/tips/tipRegistry.d.ts +32 -0
- package/dist/src/services/tips/tipRegistry.js +148 -0
- package/dist/src/services/tips/tipRegistry.js.map +1 -0
- package/dist/src/services/tips/tipRegistry.test.d.ts +6 -0
- package/dist/src/services/tips/tipRegistry.test.js +65 -0
- package/dist/src/services/tips/tipRegistry.test.js.map +1 -0
- package/dist/src/services/tips/tipScheduler.d.ts +21 -0
- package/dist/src/services/tips/tipScheduler.js +38 -0
- package/dist/src/services/tips/tipScheduler.js.map +1 -0
- package/dist/src/services/tips/tipScheduler.test.d.ts +6 -0
- package/dist/src/services/tips/tipScheduler.test.js +126 -0
- package/dist/src/services/tips/tipScheduler.test.js.map +1 -0
- package/dist/src/services/types.d.ts +22 -0
- package/dist/src/services/types.js +7 -0
- package/dist/src/services/types.js.map +1 -0
- package/dist/src/startup/worktreeStartup.d.ts +112 -0
- package/dist/src/startup/worktreeStartup.js +350 -0
- package/dist/src/startup/worktreeStartup.js.map +1 -0
- package/dist/src/startup/worktreeStartup.test.d.ts +6 -0
- package/dist/src/startup/worktreeStartup.test.js +332 -0
- package/dist/src/startup/worktreeStartup.test.js.map +1 -0
- package/dist/src/test-utils/customMatchers.d.ts +14 -0
- package/dist/src/test-utils/customMatchers.js +40 -0
- package/dist/src/test-utils/customMatchers.js.map +1 -0
- package/dist/src/test-utils/mockCommandContext.d.ts +18 -0
- package/dist/src/test-utils/mockCommandContext.js +107 -0
- package/dist/src/test-utils/mockCommandContext.js.map +1 -0
- package/dist/src/test-utils/mockCommandContext.test.d.ts +6 -0
- package/dist/src/test-utils/mockCommandContext.test.js +51 -0
- package/dist/src/test-utils/mockCommandContext.test.js.map +1 -0
- package/dist/src/test-utils/render.d.ts +14 -0
- package/dist/src/test-utils/render.js +15 -0
- package/dist/src/test-utils/render.js.map +1 -0
- package/dist/src/ui/App.d.ts +6 -0
- package/dist/src/ui/App.js +65 -0
- package/dist/src/ui/App.js.map +1 -0
- package/dist/src/ui/AppContainer.d.ts +24 -0
- package/dist/src/ui/AppContainer.js +2853 -0
- package/dist/src/ui/AppContainer.js.map +1 -0
- package/dist/src/ui/AppContainer.test.d.ts +6 -0
- package/dist/src/ui/AppContainer.test.js +2368 -0
- package/dist/src/ui/AppContainer.test.js.map +1 -0
- package/dist/src/ui/CommandFormatMigrationNudge.d.ts +14 -0
- package/dist/src/ui/CommandFormatMigrationNudge.js +44 -0
- package/dist/src/ui/CommandFormatMigrationNudge.js.map +1 -0
- package/dist/src/ui/FeedbackDialog.d.ts +9 -0
- package/dist/src/ui/FeedbackDialog.js +44 -0
- package/dist/src/ui/FeedbackDialog.js.map +1 -0
- package/dist/src/ui/IdeIntegrationNudge.d.ts +16 -0
- package/dist/src/ui/IdeIntegrationNudge.js +53 -0
- package/dist/src/ui/IdeIntegrationNudge.js.map +1 -0
- package/dist/src/ui/auth/AuthDialog.d.ts +7 -0
- package/dist/src/ui/auth/AuthDialog.js +214 -0
- package/dist/src/ui/auth/AuthDialog.js.map +1 -0
- package/dist/src/ui/auth/AuthDialog.test.d.ts +6 -0
- package/dist/src/ui/auth/AuthDialog.test.js +1029 -0
- package/dist/src/ui/auth/AuthDialog.test.js.map +1 -0
- package/dist/src/ui/auth/AuthInProgress.d.ts +11 -0
- package/dist/src/ui/auth/AuthInProgress.js +24 -0
- package/dist/src/ui/auth/AuthInProgress.js.map +1 -0
- package/dist/src/ui/auth/ProviderSetupSteps.d.ts +11 -0
- package/dist/src/ui/auth/ProviderSetupSteps.js +320 -0
- package/dist/src/ui/auth/ProviderSetupSteps.js.map +1 -0
- package/dist/src/ui/auth/ProviderSetupSteps.test.d.ts +6 -0
- package/dist/src/ui/auth/ProviderSetupSteps.test.js +322 -0
- package/dist/src/ui/auth/ProviderSetupSteps.test.js.map +1 -0
- package/dist/src/ui/auth/useAuth.d.ts +76 -0
- package/dist/src/ui/auth/useAuth.js +192 -0
- package/dist/src/ui/auth/useAuth.js.map +1 -0
- package/dist/src/ui/auth/useAuth.test.d.ts +6 -0
- package/dist/src/ui/auth/useAuth.test.js +267 -0
- package/dist/src/ui/auth/useAuth.test.js.map +1 -0
- package/dist/src/ui/auth/useProviderSetupFlow.d.ts +54 -0
- package/dist/src/ui/auth/useProviderSetupFlow.js +380 -0
- package/dist/src/ui/auth/useProviderSetupFlow.js.map +1 -0
- package/dist/src/ui/colors.d.ts +7 -0
- package/dist/src/ui/colors.js +60 -0
- package/dist/src/ui/colors.js.map +1 -0
- package/dist/src/ui/commands/aboutCommand.d.ts +7 -0
- package/dist/src/ui/commands/aboutCommand.js +69 -0
- package/dist/src/ui/commands/aboutCommand.js.map +1 -0
- package/dist/src/ui/commands/agentsCommand.d.ts +7 -0
- package/dist/src/ui/commands/agentsCommand.js +42 -0
- package/dist/src/ui/commands/agentsCommand.js.map +1 -0
- package/dist/src/ui/commands/approvalModeCommand.d.ts +7 -0
- package/dist/src/ui/commands/approvalModeCommand.js +89 -0
- package/dist/src/ui/commands/approvalModeCommand.js.map +1 -0
- package/dist/src/ui/commands/approvalModeCommand.test.d.ts +6 -0
- package/dist/src/ui/commands/approvalModeCommand.test.js +112 -0
- package/dist/src/ui/commands/approvalModeCommand.test.js.map +1 -0
- package/dist/src/ui/commands/arenaCommand.agentComplete.test.d.ts +6 -0
- package/dist/src/ui/commands/arenaCommand.agentComplete.test.js +118 -0
- package/dist/src/ui/commands/arenaCommand.agentComplete.test.js.map +1 -0
- package/dist/src/ui/commands/arenaCommand.d.ts +7 -0
- package/dist/src/ui/commands/arenaCommand.js +519 -0
- package/dist/src/ui/commands/arenaCommand.js.map +1 -0
- package/dist/src/ui/commands/arenaCommand.test.d.ts +6 -0
- package/dist/src/ui/commands/arenaCommand.test.js +352 -0
- package/dist/src/ui/commands/arenaCommand.test.js.map +1 -0
- package/dist/src/ui/commands/authCommand.d.ts +7 -0
- package/dist/src/ui/commands/authCommand.js +31 -0
- package/dist/src/ui/commands/authCommand.js.map +1 -0
- package/dist/src/ui/commands/branchCommand.d.ts +7 -0
- package/dist/src/ui/commands/branchCommand.js +49 -0
- package/dist/src/ui/commands/branchCommand.js.map +1 -0
- package/dist/src/ui/commands/branchCommand.test.d.ts +6 -0
- package/dist/src/ui/commands/branchCommand.test.js +57 -0
- package/dist/src/ui/commands/branchCommand.test.js.map +1 -0
- package/dist/src/ui/commands/btwCommand.d.ts +7 -0
- package/dist/src/ui/commands/btwCommand.js +164 -0
- package/dist/src/ui/commands/btwCommand.js.map +1 -0
- package/dist/src/ui/commands/btwCommand.test.d.ts +6 -0
- package/dist/src/ui/commands/btwCommand.test.js +338 -0
- package/dist/src/ui/commands/btwCommand.test.js.map +1 -0
- package/dist/src/ui/commands/bugCommand.d.ts +7 -0
- package/dist/src/ui/commands/bugCommand.js +54 -0
- package/dist/src/ui/commands/bugCommand.js.map +1 -0
- package/dist/src/ui/commands/clearCommand.d.ts +7 -0
- package/dist/src/ui/commands/clearCommand.js +122 -0
- package/dist/src/ui/commands/clearCommand.js.map +1 -0
- package/dist/src/ui/commands/compressCommand.d.ts +7 -0
- package/dist/src/ui/commands/compressCommand.js +178 -0
- package/dist/src/ui/commands/compressCommand.js.map +1 -0
- package/dist/src/ui/commands/contextCommand.d.ts +14 -0
- package/dist/src/ui/commands/contextCommand.js +443 -0
- package/dist/src/ui/commands/contextCommand.js.map +1 -0
- package/dist/src/ui/commands/contextCommand.test.d.ts +6 -0
- package/dist/src/ui/commands/contextCommand.test.js +184 -0
- package/dist/src/ui/commands/contextCommand.test.js.map +1 -0
- package/dist/src/ui/commands/copyCommand.d.ts +7 -0
- package/dist/src/ui/commands/copyCommand.js +374 -0
- package/dist/src/ui/commands/copyCommand.js.map +1 -0
- package/dist/src/ui/commands/deleteCommand.d.ts +7 -0
- package/dist/src/ui/commands/deleteCommand.js +19 -0
- package/dist/src/ui/commands/deleteCommand.js.map +1 -0
- package/dist/src/ui/commands/deleteCommand.test.d.ts +6 -0
- package/dist/src/ui/commands/deleteCommand.test.js +27 -0
- package/dist/src/ui/commands/deleteCommand.test.js.map +1 -0
- package/dist/src/ui/commands/diffCommand.d.ts +42 -0
- package/dist/src/ui/commands/diffCommand.js +206 -0
- package/dist/src/ui/commands/diffCommand.js.map +1 -0
- package/dist/src/ui/commands/diffCommand.test.d.ts +6 -0
- package/dist/src/ui/commands/diffCommand.test.js +482 -0
- package/dist/src/ui/commands/diffCommand.test.js.map +1 -0
- package/dist/src/ui/commands/directoryCommand.d.ts +13 -0
- package/dist/src/ui/commands/directoryCommand.js +252 -0
- package/dist/src/ui/commands/directoryCommand.js.map +1 -0
- package/dist/src/ui/commands/docsCommand.d.ts +7 -0
- package/dist/src/ui/commands/docsCommand.js +49 -0
- package/dist/src/ui/commands/docsCommand.js.map +1 -0
- package/dist/src/ui/commands/doctorCommand.d.ts +7 -0
- package/dist/src/ui/commands/doctorCommand.js +530 -0
- package/dist/src/ui/commands/doctorCommand.js.map +1 -0
- package/dist/src/ui/commands/doctorCommand.test.d.ts +6 -0
- package/dist/src/ui/commands/doctorCommand.test.js +804 -0
- package/dist/src/ui/commands/doctorCommand.test.js.map +1 -0
- package/dist/src/ui/commands/dreamCommand.d.ts +7 -0
- package/dist/src/ui/commands/dreamCommand.js +42 -0
- package/dist/src/ui/commands/dreamCommand.js.map +1 -0
- package/dist/src/ui/commands/dreamCommand.test.d.ts +6 -0
- package/dist/src/ui/commands/dreamCommand.test.js +39 -0
- package/dist/src/ui/commands/dreamCommand.test.js.map +1 -0
- package/dist/src/ui/commands/editorCommand.d.ts +7 -0
- package/dist/src/ui/commands/editorCommand.js +20 -0
- package/dist/src/ui/commands/editorCommand.js.map +1 -0
- package/dist/src/ui/commands/exportCommand.d.ts +10 -0
- package/dist/src/ui/commands/exportCommand.js +373 -0
- package/dist/src/ui/commands/exportCommand.js.map +1 -0
- package/dist/src/ui/commands/exportCommand.test.d.ts +6 -0
- package/dist/src/ui/commands/exportCommand.test.js +905 -0
- package/dist/src/ui/commands/exportCommand.test.js.map +1 -0
- package/dist/src/ui/commands/extensionsCommand.d.ts +10 -0
- package/dist/src/ui/commands/extensionsCommand.js +185 -0
- package/dist/src/ui/commands/extensionsCommand.js.map +1 -0
- package/dist/src/ui/commands/forgetCommand.d.ts +7 -0
- package/dist/src/ui/commands/forgetCommand.js +45 -0
- package/dist/src/ui/commands/forgetCommand.js.map +1 -0
- package/dist/src/ui/commands/forkCommand.d.ts +7 -0
- package/dist/src/ui/commands/forkCommand.js +163 -0
- package/dist/src/ui/commands/forkCommand.js.map +1 -0
- package/dist/src/ui/commands/forkCommand.test.d.ts +6 -0
- package/dist/src/ui/commands/forkCommand.test.js +229 -0
- package/dist/src/ui/commands/forkCommand.test.js.map +1 -0
- package/dist/src/ui/commands/goalCommand.d.ts +7 -0
- package/dist/src/ui/commands/goalCommand.js +181 -0
- package/dist/src/ui/commands/goalCommand.js.map +1 -0
- package/dist/src/ui/commands/goalCommand.test.d.ts +6 -0
- package/dist/src/ui/commands/goalCommand.test.js +328 -0
- package/dist/src/ui/commands/goalCommand.test.js.map +1 -0
- package/dist/src/ui/commands/helpCommand.d.ts +7 -0
- package/dist/src/ui/commands/helpCommand.js +21 -0
- package/dist/src/ui/commands/helpCommand.js.map +1 -0
- package/dist/src/ui/commands/hooksCommand.d.ts +7 -0
- package/dist/src/ui/commands/hooksCommand.js +153 -0
- package/dist/src/ui/commands/hooksCommand.js.map +1 -0
- package/dist/src/ui/commands/hooksCommand.test.d.ts +6 -0
- package/dist/src/ui/commands/hooksCommand.test.js +189 -0
- package/dist/src/ui/commands/hooksCommand.test.js.map +1 -0
- package/dist/src/ui/commands/ideCommand.d.ts +7 -0
- package/dist/src/ui/commands/ideCommand.js +256 -0
- package/dist/src/ui/commands/ideCommand.js.map +1 -0
- package/dist/src/ui/commands/initCommand.d.ts +7 -0
- package/dist/src/ui/commands/initCommand.js +119 -0
- package/dist/src/ui/commands/initCommand.js.map +1 -0
- package/dist/src/ui/commands/insightCommand.d.ts +7 -0
- package/dist/src/ui/commands/insightCommand.js +195 -0
- package/dist/src/ui/commands/insightCommand.js.map +1 -0
- package/dist/src/ui/commands/insightCommand.test.d.ts +6 -0
- package/dist/src/ui/commands/insightCommand.test.js +173 -0
- package/dist/src/ui/commands/insightCommand.test.js.map +1 -0
- package/dist/src/ui/commands/languageCommand.d.ts +7 -0
- package/dist/src/ui/commands/languageCommand.js +291 -0
- package/dist/src/ui/commands/languageCommand.js.map +1 -0
- package/dist/src/ui/commands/languageCommand.test.d.ts +6 -0
- package/dist/src/ui/commands/languageCommand.test.js +664 -0
- package/dist/src/ui/commands/languageCommand.test.js.map +1 -0
- package/dist/src/ui/commands/lspCommand.d.ts +7 -0
- package/dist/src/ui/commands/lspCommand.js +62 -0
- package/dist/src/ui/commands/lspCommand.js.map +1 -0
- package/dist/src/ui/commands/lspCommand.test.d.ts +6 -0
- package/dist/src/ui/commands/lspCommand.test.js +175 -0
- package/dist/src/ui/commands/lspCommand.test.js.map +1 -0
- package/dist/src/ui/commands/mcpCommand.d.ts +7 -0
- package/dist/src/ui/commands/mcpCommand.js +21 -0
- package/dist/src/ui/commands/mcpCommand.js.map +1 -0
- package/dist/src/ui/commands/memoryCommand.d.ts +7 -0
- package/dist/src/ui/commands/memoryCommand.js +21 -0
- package/dist/src/ui/commands/memoryCommand.js.map +1 -0
- package/dist/src/ui/commands/modelCommand.d.ts +7 -0
- package/dist/src/ui/commands/modelCommand.js +226 -0
- package/dist/src/ui/commands/modelCommand.js.map +1 -0
- package/dist/src/ui/commands/modelCommand.test.d.ts +6 -0
- package/dist/src/ui/commands/modelCommand.test.js +503 -0
- package/dist/src/ui/commands/modelCommand.test.js.map +1 -0
- package/dist/src/ui/commands/permissionsCommand.d.ts +7 -0
- package/dist/src/ui/commands/permissionsCommand.js +20 -0
- package/dist/src/ui/commands/permissionsCommand.js.map +1 -0
- package/dist/src/ui/commands/permissionsCommand.test.d.ts +6 -0
- package/dist/src/ui/commands/permissionsCommand.test.js +30 -0
- package/dist/src/ui/commands/permissionsCommand.test.js.map +1 -0
- package/dist/src/ui/commands/planCommand.d.ts +7 -0
- package/dist/src/ui/commands/planCommand.js +88 -0
- package/dist/src/ui/commands/planCommand.js.map +1 -0
- package/dist/src/ui/commands/planCommand.test.d.ts +6 -0
- package/dist/src/ui/commands/planCommand.test.js +113 -0
- package/dist/src/ui/commands/planCommand.test.js.map +1 -0
- package/dist/src/ui/commands/quitCommand.d.ts +7 -0
- package/dist/src/ui/commands/quitCommand.js +38 -0
- package/dist/src/ui/commands/quitCommand.js.map +1 -0
- package/dist/src/ui/commands/recapCommand.d.ts +7 -0
- package/dist/src/ui/commands/recapCommand.js +56 -0
- package/dist/src/ui/commands/recapCommand.js.map +1 -0
- package/dist/src/ui/commands/rememberCommand.d.ts +7 -0
- package/dist/src/ui/commands/rememberCommand.js +54 -0
- package/dist/src/ui/commands/rememberCommand.js.map +1 -0
- package/dist/src/ui/commands/renameCommand.d.ts +7 -0
- package/dist/src/ui/commands/renameCommand.js +208 -0
- package/dist/src/ui/commands/renameCommand.js.map +1 -0
- package/dist/src/ui/commands/renameCommand.test.d.ts +6 -0
- package/dist/src/ui/commands/renameCommand.test.js +414 -0
- package/dist/src/ui/commands/renameCommand.test.js.map +1 -0
- package/dist/src/ui/commands/restoreCommand.d.ts +8 -0
- package/dist/src/ui/commands/restoreCommand.js +159 -0
- package/dist/src/ui/commands/restoreCommand.js.map +1 -0
- package/dist/src/ui/commands/resumeCommand.d.ts +7 -0
- package/dist/src/ui/commands/resumeCommand.js +65 -0
- package/dist/src/ui/commands/resumeCommand.js.map +1 -0
- package/dist/src/ui/commands/resumeCommand.test.d.ts +6 -0
- package/dist/src/ui/commands/resumeCommand.test.js +135 -0
- package/dist/src/ui/commands/resumeCommand.test.js.map +1 -0
- package/dist/src/ui/commands/rewindCommand.d.ts +7 -0
- package/dist/src/ui/commands/rewindCommand.js +20 -0
- package/dist/src/ui/commands/rewindCommand.js.map +1 -0
- package/dist/src/ui/commands/settingsCommand.d.ts +7 -0
- package/dist/src/ui/commands/settingsCommand.js +20 -0
- package/dist/src/ui/commands/settingsCommand.js.map +1 -0
- package/dist/src/ui/commands/setupGithubCommand.d.ts +9 -0
- package/dist/src/ui/commands/setupGithubCommand.js +165 -0
- package/dist/src/ui/commands/setupGithubCommand.js.map +1 -0
- package/dist/src/ui/commands/setupGithubCommand.test.d.ts +6 -0
- package/dist/src/ui/commands/setupGithubCommand.test.js +164 -0
- package/dist/src/ui/commands/setupGithubCommand.test.js.map +1 -0
- package/dist/src/ui/commands/skillsCommand.d.ts +7 -0
- package/dist/src/ui/commands/skillsCommand.js +63 -0
- package/dist/src/ui/commands/skillsCommand.js.map +1 -0
- package/dist/src/ui/commands/skillsCommand.test.d.ts +6 -0
- package/dist/src/ui/commands/skillsCommand.test.js +136 -0
- package/dist/src/ui/commands/skillsCommand.test.js.map +1 -0
- package/dist/src/ui/commands/statsCommand.d.ts +7 -0
- package/dist/src/ui/commands/statsCommand.js +130 -0
- package/dist/src/ui/commands/statsCommand.js.map +1 -0
- package/dist/src/ui/commands/statuslineCommand.d.ts +7 -0
- package/dist/src/ui/commands/statuslineCommand.js +33 -0
- package/dist/src/ui/commands/statuslineCommand.js.map +1 -0
- package/dist/src/ui/commands/statuslineCommand.test.d.ts +6 -0
- package/dist/src/ui/commands/statuslineCommand.test.js +54 -0
- package/dist/src/ui/commands/statuslineCommand.test.js.map +1 -0
- package/dist/src/ui/commands/summaryCommand.d.ts +7 -0
- package/dist/src/ui/commands/summaryCommand.js +261 -0
- package/dist/src/ui/commands/summaryCommand.js.map +1 -0
- package/dist/src/ui/commands/tasksCommand.d.ts +7 -0
- package/dist/src/ui/commands/tasksCommand.js +222 -0
- package/dist/src/ui/commands/tasksCommand.js.map +1 -0
- package/dist/src/ui/commands/tasksCommand.test.d.ts +6 -0
- package/dist/src/ui/commands/tasksCommand.test.js +365 -0
- package/dist/src/ui/commands/tasksCommand.test.js.map +1 -0
- package/dist/src/ui/commands/terminalSetupCommand.d.ts +13 -0
- package/dist/src/ui/commands/terminalSetupCommand.js +48 -0
- package/dist/src/ui/commands/terminalSetupCommand.js.map +1 -0
- package/dist/src/ui/commands/themeCommand.d.ts +7 -0
- package/dist/src/ui/commands/themeCommand.js +20 -0
- package/dist/src/ui/commands/themeCommand.js.map +1 -0
- package/dist/src/ui/commands/toolsCommand.d.ts +7 -0
- package/dist/src/ui/commands/toolsCommand.js +45 -0
- package/dist/src/ui/commands/toolsCommand.js.map +1 -0
- package/dist/src/ui/commands/trustCommand.d.ts +7 -0
- package/dist/src/ui/commands/trustCommand.js +20 -0
- package/dist/src/ui/commands/trustCommand.js.map +1 -0
- package/dist/src/ui/commands/trustCommand.test.d.ts +6 -0
- package/dist/src/ui/commands/trustCommand.test.js +30 -0
- package/dist/src/ui/commands/trustCommand.test.js.map +1 -0
- package/dist/src/ui/commands/types.d.ts +298 -0
- package/dist/src/ui/commands/types.js +13 -0
- package/dist/src/ui/commands/types.js.map +1 -0
- package/dist/src/ui/commands/vimCommand.d.ts +7 -0
- package/dist/src/ui/commands/vimCommand.js +27 -0
- package/dist/src/ui/commands/vimCommand.js.map +1 -0
- package/dist/src/ui/components/AboutBox.d.ts +12 -0
- package/dist/src/ui/components/AboutBox.js +10 -0
- package/dist/src/ui/components/AboutBox.js.map +1 -0
- package/dist/src/ui/components/AnsiOutput.d.ts +20 -0
- package/dist/src/ui/components/AnsiOutput.js +27 -0
- package/dist/src/ui/components/AnsiOutput.js.map +1 -0
- package/dist/src/ui/components/AnsiOutput.test.d.ts +6 -0
- package/dist/src/ui/components/AnsiOutput.test.js +134 -0
- package/dist/src/ui/components/AnsiOutput.test.js.map +1 -0
- package/dist/src/ui/components/ApiKeyInput.d.ts +22 -0
- package/dist/src/ui/components/ApiKeyInput.js +35 -0
- package/dist/src/ui/components/ApiKeyInput.js.map +1 -0
- package/dist/src/ui/components/AppHeader.d.ts +10 -0
- package/dist/src/ui/components/AppHeader.js +49 -0
- package/dist/src/ui/components/AppHeader.js.map +1 -0
- package/dist/src/ui/components/AppHeader.test.d.ts +6 -0
- package/dist/src/ui/components/AppHeader.test.js +109 -0
- package/dist/src/ui/components/AppHeader.test.js.map +1 -0
- package/dist/src/ui/components/ApprovalModeDialog.d.ts +21 -0
- package/dist/src/ui/components/ApprovalModeDialog.js +109 -0
- package/dist/src/ui/components/ApprovalModeDialog.js.map +1 -0
- package/dist/src/ui/components/ApprovalModeDialog.test.d.ts +6 -0
- package/dist/src/ui/components/ApprovalModeDialog.test.js +63 -0
- package/dist/src/ui/components/ApprovalModeDialog.test.js.map +1 -0
- package/dist/src/ui/components/AsciiArt.d.ts +1 -0
- package/dist/src/ui/components/AsciiArt.js +54 -0
- package/dist/src/ui/components/AsciiArt.js.map +1 -0
- package/dist/src/ui/components/AutoAcceptIndicator.d.ts +12 -0
- package/dist/src/ui/components/AutoAcceptIndicator.js +37 -0
- package/dist/src/ui/components/AutoAcceptIndicator.js.map +1 -0
- package/dist/src/ui/components/BaseTextInput.d.ts +74 -0
- package/dist/src/ui/components/BaseTextInput.js +144 -0
- package/dist/src/ui/components/BaseTextInput.js.map +1 -0
- package/dist/src/ui/components/BaseTextInput.test.d.ts +6 -0
- package/dist/src/ui/components/BaseTextInput.test.js +78 -0
- package/dist/src/ui/components/BaseTextInput.test.js.map +1 -0
- package/dist/src/ui/components/Composer.d.ts +6 -0
- package/dist/src/ui/components/Composer.js +92 -0
- package/dist/src/ui/components/Composer.js.map +1 -0
- package/dist/src/ui/components/Composer.test.d.ts +6 -0
- package/dist/src/ui/components/Composer.test.js +344 -0
- package/dist/src/ui/components/Composer.test.js.map +1 -0
- package/dist/src/ui/components/ConsentPrompt.d.ts +14 -0
- package/dist/src/ui/components/ConsentPrompt.js +35 -0
- package/dist/src/ui/components/ConsentPrompt.js.map +1 -0
- package/dist/src/ui/components/ConsentPrompt.test.d.ts +6 -0
- package/dist/src/ui/components/ConsentPrompt.test.js +110 -0
- package/dist/src/ui/components/ConsentPrompt.test.js.map +1 -0
- package/dist/src/ui/components/ContextSummaryDisplay.d.ts +20 -0
- package/dist/src/ui/components/ContextSummaryDisplay.js +90 -0
- package/dist/src/ui/components/ContextSummaryDisplay.js.map +1 -0
- package/dist/src/ui/components/ContextUsageDisplay.d.ts +10 -0
- package/dist/src/ui/components/ContextUsageDisplay.js +33 -0
- package/dist/src/ui/components/ContextUsageDisplay.js.map +1 -0
- package/dist/src/ui/components/DebugModeNotification.d.ts +9 -0
- package/dist/src/ui/components/DebugModeNotification.js +23 -0
- package/dist/src/ui/components/DebugModeNotification.js.map +1 -0
- package/dist/src/ui/components/DebugProfiler.d.ts +6 -0
- package/dist/src/ui/components/DebugProfiler.js +27 -0
- package/dist/src/ui/components/DebugProfiler.js.map +1 -0
- package/dist/src/ui/components/DialogManager.d.ts +12 -0
- package/dist/src/ui/components/DialogManager.js +247 -0
- package/dist/src/ui/components/DialogManager.js.map +1 -0
- package/dist/src/ui/components/DiffDialog.d.ts +15 -0
- package/dist/src/ui/components/DiffDialog.js +412 -0
- package/dist/src/ui/components/DiffDialog.js.map +1 -0
- package/dist/src/ui/components/EditorSettingsDialog.d.ts +16 -0
- package/dist/src/ui/components/EditorSettingsDialog.js +76 -0
- package/dist/src/ui/components/EditorSettingsDialog.js.map +1 -0
- package/dist/src/ui/components/ExitWarning.d.ts +7 -0
- package/dist/src/ui/components/ExitWarning.js +9 -0
- package/dist/src/ui/components/ExitWarning.js.map +1 -0
- package/dist/src/ui/components/ExternalAuthProgress.d.ts +14 -0
- package/dist/src/ui/components/ExternalAuthProgress.js +14 -0
- package/dist/src/ui/components/ExternalAuthProgress.js.map +1 -0
- package/dist/src/ui/components/ExternalAuthProgress.test.d.ts +6 -0
- package/dist/src/ui/components/ExternalAuthProgress.test.js +20 -0
- package/dist/src/ui/components/ExternalAuthProgress.test.js.map +1 -0
- package/dist/src/ui/components/FolderTrustDialog.d.ts +17 -0
- package/dist/src/ui/components/FolderTrustDialog.js +58 -0
- package/dist/src/ui/components/FolderTrustDialog.js.map +1 -0
- package/dist/src/ui/components/FolderTrustDialog.test.d.ts +6 -0
- package/dist/src/ui/components/FolderTrustDialog.test.js +88 -0
- package/dist/src/ui/components/FolderTrustDialog.test.js.map +1 -0
- package/dist/src/ui/components/Footer.d.ts +7 -0
- package/dist/src/ui/components/Footer.js +104 -0
- package/dist/src/ui/components/Footer.js.map +1 -0
- package/dist/src/ui/components/GeminiRespondingSpinner.d.ts +22 -0
- package/dist/src/ui/components/GeminiRespondingSpinner.js +47 -0
- package/dist/src/ui/components/GeminiRespondingSpinner.js.map +1 -0
- package/dist/src/ui/components/GeminiRespondingSpinner.test.d.ts +6 -0
- package/dist/src/ui/components/GeminiRespondingSpinner.test.js +29 -0
- package/dist/src/ui/components/GeminiRespondingSpinner.test.js.map +1 -0
- package/dist/src/ui/components/GoalPill.d.ts +25 -0
- package/dist/src/ui/components/GoalPill.js +77 -0
- package/dist/src/ui/components/GoalPill.js.map +1 -0
- package/dist/src/ui/components/GoalPill.test.d.ts +6 -0
- package/dist/src/ui/components/GoalPill.test.js +56 -0
- package/dist/src/ui/components/GoalPill.test.js.map +1 -0
- package/dist/src/ui/components/Header.d.ts +62 -0
- package/dist/src/ui/components/Header.js +155 -0
- package/dist/src/ui/components/Header.js.map +1 -0
- package/dist/src/ui/components/Header.test.d.ts +6 -0
- package/dist/src/ui/components/Header.test.js +142 -0
- package/dist/src/ui/components/Header.test.js.map +1 -0
- package/dist/src/ui/components/Help.d.ts +18 -0
- package/dist/src/ui/components/Help.js +236 -0
- package/dist/src/ui/components/Help.js.map +1 -0
- package/dist/src/ui/components/Help.test.d.ts +6 -0
- package/dist/src/ui/components/Help.test.js +243 -0
- package/dist/src/ui/components/Help.test.js.map +1 -0
- package/dist/src/ui/components/HistoryItemDisplay.d.ts +39 -0
- package/dist/src/ui/components/HistoryItemDisplay.js +51 -0
- package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -0
- package/dist/src/ui/components/HistoryItemDisplay.test.d.ts +6 -0
- package/dist/src/ui/components/HistoryItemDisplay.test.js +197 -0
- package/dist/src/ui/components/HistoryItemDisplay.test.js.map +1 -0
- package/dist/src/ui/components/IdeTrustChangeDialog.d.ts +11 -0
- package/dist/src/ui/components/IdeTrustChangeDialog.js +34 -0
- package/dist/src/ui/components/IdeTrustChangeDialog.js.map +1 -0
- package/dist/src/ui/components/IdeTrustChangeDialog.test.d.ts +6 -0
- package/dist/src/ui/components/IdeTrustChangeDialog.test.js +53 -0
- package/dist/src/ui/components/IdeTrustChangeDialog.test.js.map +1 -0
- package/dist/src/ui/components/InputPrompt.d.ts +63 -0
- package/dist/src/ui/components/InputPrompt.js +1220 -0
- package/dist/src/ui/components/InputPrompt.js.map +1 -0
- package/dist/src/ui/components/KeyboardShortcuts.d.ts +7 -0
- package/dist/src/ui/components/KeyboardShortcuts.js +78 -0
- package/dist/src/ui/components/KeyboardShortcuts.js.map +1 -0
- package/dist/src/ui/components/LoadingIndicator.d.ts +31 -0
- package/dist/src/ui/components/LoadingIndicator.js +46 -0
- package/dist/src/ui/components/LoadingIndicator.js.map +1 -0
- package/dist/src/ui/components/LoadingIndicator.test.d.ts +6 -0
- package/dist/src/ui/components/LoadingIndicator.test.js +246 -0
- package/dist/src/ui/components/LoadingIndicator.test.js.map +1 -0
- package/dist/src/ui/components/LoopDetectionConfirmation.d.ts +13 -0
- package/dist/src/ui/components/LoopDetectionConfirmation.js +37 -0
- package/dist/src/ui/components/LoopDetectionConfirmation.js.map +1 -0
- package/dist/src/ui/components/LoopDetectionConfirmation.test.d.ts +6 -0
- package/dist/src/ui/components/LoopDetectionConfirmation.test.js +28 -0
- package/dist/src/ui/components/LoopDetectionConfirmation.test.js.map +1 -0
- package/dist/src/ui/components/MainContent.d.ts +6 -0
- package/dist/src/ui/components/MainContent.js +437 -0
- package/dist/src/ui/components/MainContent.js.map +1 -0
- package/dist/src/ui/components/MainContent.test.d.ts +6 -0
- package/dist/src/ui/components/MainContent.test.js +621 -0
- package/dist/src/ui/components/MainContent.test.js.map +1 -0
- package/dist/src/ui/components/MemoryDialog.d.ts +10 -0
- package/dist/src/ui/components/MemoryDialog.js +288 -0
- package/dist/src/ui/components/MemoryDialog.js.map +1 -0
- package/dist/src/ui/components/MemoryDialog.test.d.ts +6 -0
- package/dist/src/ui/components/MemoryDialog.test.js +165 -0
- package/dist/src/ui/components/MemoryDialog.test.js.map +1 -0
- package/dist/src/ui/components/MemoryUsageDisplay.d.ts +7 -0
- package/dist/src/ui/components/MemoryUsageDisplay.js +24 -0
- package/dist/src/ui/components/MemoryUsageDisplay.js.map +1 -0
- package/dist/src/ui/components/ModelDialog.d.ts +12 -0
- package/dist/src/ui/components/ModelDialog.js +390 -0
- package/dist/src/ui/components/ModelDialog.js.map +1 -0
- package/dist/src/ui/components/ModelDialog.test.d.ts +6 -0
- package/dist/src/ui/components/ModelDialog.test.js +489 -0
- package/dist/src/ui/components/ModelDialog.test.js.map +1 -0
- package/dist/src/ui/components/ModelStatsDisplay.d.ts +11 -0
- package/dist/src/ui/components/ModelStatsDisplay.js +61 -0
- package/dist/src/ui/components/ModelStatsDisplay.js.map +1 -0
- package/dist/src/ui/components/Notifications.d.ts +6 -0
- package/dist/src/ui/components/Notifications.js +20 -0
- package/dist/src/ui/components/Notifications.js.map +1 -0
- package/dist/src/ui/components/PermissionsDialog.d.ts +11 -0
- package/dist/src/ui/components/PermissionsDialog.js +547 -0
- package/dist/src/ui/components/PermissionsDialog.js.map +1 -0
- package/dist/src/ui/components/PlanSummaryDisplay.d.ts +14 -0
- package/dist/src/ui/components/PlanSummaryDisplay.js +10 -0
- package/dist/src/ui/components/PlanSummaryDisplay.js.map +1 -0
- package/dist/src/ui/components/PluginChoicePrompt.d.ts +18 -0
- package/dist/src/ui/components/PluginChoicePrompt.js +96 -0
- package/dist/src/ui/components/PluginChoicePrompt.js.map +1 -0
- package/dist/src/ui/components/PluginChoicePrompt.test.d.ts +6 -0
- package/dist/src/ui/components/PluginChoicePrompt.test.js +136 -0
- package/dist/src/ui/components/PluginChoicePrompt.test.js.map +1 -0
- package/dist/src/ui/components/PrepareLabel.d.ts +15 -0
- package/dist/src/ui/components/PrepareLabel.js +72 -0
- package/dist/src/ui/components/PrepareLabel.js.map +1 -0
- package/dist/src/ui/components/PrepareLabel.test.d.ts +6 -0
- package/dist/src/ui/components/PrepareLabel.test.js +71 -0
- package/dist/src/ui/components/PrepareLabel.test.js.map +1 -0
- package/dist/src/ui/components/ProviderUpdatePrompt.d.ts +12 -0
- package/dist/src/ui/components/ProviderUpdatePrompt.js +49 -0
- package/dist/src/ui/components/ProviderUpdatePrompt.js.map +1 -0
- package/dist/src/ui/components/QueuedMessageDisplay.d.ts +9 -0
- package/dist/src/ui/components/QueuedMessageDisplay.js +35 -0
- package/dist/src/ui/components/QueuedMessageDisplay.js.map +1 -0
- package/dist/src/ui/components/QueuedMessageDisplay.test.d.ts +6 -0
- package/dist/src/ui/components/QueuedMessageDisplay.test.js +76 -0
- package/dist/src/ui/components/QueuedMessageDisplay.test.js.map +1 -0
- package/dist/src/ui/components/QuittingDisplay.d.ts +6 -0
- package/dist/src/ui/components/QuittingDisplay.js +21 -0
- package/dist/src/ui/components/QuittingDisplay.js.map +1 -0
- package/dist/src/ui/components/QwenOAuthProgress.d.ts +16 -0
- package/dist/src/ui/components/QwenOAuthProgress.js +65 -0
- package/dist/src/ui/components/QwenOAuthProgress.js.map +1 -0
- package/dist/src/ui/components/QwenOAuthProgress.test.d.ts +6 -0
- package/dist/src/ui/components/QwenOAuthProgress.test.js +287 -0
- package/dist/src/ui/components/QwenOAuthProgress.test.js.map +1 -0
- package/dist/src/ui/components/RewindSelector.d.ts +22 -0
- package/dist/src/ui/components/RewindSelector.js +264 -0
- package/dist/src/ui/components/RewindSelector.js.map +1 -0
- package/dist/src/ui/components/RewindSelector.test.d.ts +6 -0
- package/dist/src/ui/components/RewindSelector.test.js +146 -0
- package/dist/src/ui/components/RewindSelector.test.js.map +1 -0
- package/dist/src/ui/components/SessionPicker.d.ts +55 -0
- package/dist/src/ui/components/SessionPicker.js +142 -0
- package/dist/src/ui/components/SessionPicker.js.map +1 -0
- package/dist/src/ui/components/SessionPreview.d.ts +20 -0
- package/dist/src/ui/components/SessionPreview.js +97 -0
- package/dist/src/ui/components/SessionPreview.js.map +1 -0
- package/dist/src/ui/components/SessionPreview.test.d.ts +1 -0
- package/dist/src/ui/components/SessionPreview.test.js +124 -0
- package/dist/src/ui/components/SessionPreview.test.js.map +1 -0
- package/dist/src/ui/components/SessionSummaryDisplay.d.ts +12 -0
- package/dist/src/ui/components/SessionSummaryDisplay.js +17 -0
- package/dist/src/ui/components/SessionSummaryDisplay.js.map +1 -0
- package/dist/src/ui/components/SettingInputPrompt.d.ts +15 -0
- package/dist/src/ui/components/SettingInputPrompt.js +63 -0
- package/dist/src/ui/components/SettingInputPrompt.js.map +1 -0
- package/dist/src/ui/components/SettingInputPrompt.test.d.ts +6 -0
- package/dist/src/ui/components/SettingInputPrompt.test.js +60 -0
- package/dist/src/ui/components/SettingInputPrompt.test.js.map +1 -0
- package/dist/src/ui/components/SettingsCorruptedDialog.d.ts +14 -0
- package/dist/src/ui/components/SettingsCorruptedDialog.js +44 -0
- package/dist/src/ui/components/SettingsCorruptedDialog.js.map +1 -0
- package/dist/src/ui/components/SettingsCorruptedDialog.test.d.ts +6 -0
- package/dist/src/ui/components/SettingsCorruptedDialog.test.js +162 -0
- package/dist/src/ui/components/SettingsCorruptedDialog.test.js.map +1 -0
- package/dist/src/ui/components/SettingsDialog.d.ts +18 -0
- package/dist/src/ui/components/SettingsDialog.js +658 -0
- package/dist/src/ui/components/SettingsDialog.js.map +1 -0
- package/dist/src/ui/components/SettingsDialog.test.d.ts +6 -0
- package/dist/src/ui/components/SettingsDialog.test.js +1127 -0
- package/dist/src/ui/components/SettingsDialog.test.js.map +1 -0
- package/dist/src/ui/components/ShellConfirmationDialog.d.ts +17 -0
- package/dist/src/ui/components/ShellConfirmationDialog.js +75 -0
- package/dist/src/ui/components/ShellConfirmationDialog.js.map +1 -0
- package/dist/src/ui/components/ShellConfirmationDialog.test.d.ts +6 -0
- package/dist/src/ui/components/ShellConfirmationDialog.test.js +167 -0
- package/dist/src/ui/components/ShellConfirmationDialog.test.js.map +1 -0
- package/dist/src/ui/components/ShellInputPrompt.d.ts +11 -0
- package/dist/src/ui/components/ShellInputPrompt.js +42 -0
- package/dist/src/ui/components/ShellInputPrompt.js.map +1 -0
- package/dist/src/ui/components/ShellModeIndicator.d.ts +7 -0
- package/dist/src/ui/components/ShellModeIndicator.js +5 -0
- package/dist/src/ui/components/ShellModeIndicator.js.map +1 -0
- package/dist/src/ui/components/ShowMoreLines.d.ts +10 -0
- package/dist/src/ui/components/ShowMoreLines.js +24 -0
- package/dist/src/ui/components/ShowMoreLines.js.map +1 -0
- package/dist/src/ui/components/StandaloneSessionPicker.d.ts +11 -0
- package/dist/src/ui/components/StandaloneSessionPicker.js +105 -0
- package/dist/src/ui/components/StandaloneSessionPicker.js.map +1 -0
- package/dist/src/ui/components/StandaloneSessionPicker.test.d.ts +6 -0
- package/dist/src/ui/components/StandaloneSessionPicker.test.js +667 -0
- package/dist/src/ui/components/StandaloneSessionPicker.test.js.map +1 -0
- package/dist/src/ui/components/StatsActivityTab.d.ts +14 -0
- package/dist/src/ui/components/StatsActivityTab.js +85 -0
- package/dist/src/ui/components/StatsActivityTab.js.map +1 -0
- package/dist/src/ui/components/StatsDialog.d.ts +12 -0
- package/dist/src/ui/components/StatsDialog.js +104 -0
- package/dist/src/ui/components/StatsDialog.js.map +1 -0
- package/dist/src/ui/components/StatsDisplay.d.ts +13 -0
- package/dist/src/ui/components/StatsDisplay.js +52 -0
- package/dist/src/ui/components/StatsDisplay.js.map +1 -0
- package/dist/src/ui/components/StatsEfficiencyTab.d.ts +11 -0
- package/dist/src/ui/components/StatsEfficiencyTab.js +99 -0
- package/dist/src/ui/components/StatsEfficiencyTab.js.map +1 -0
- package/dist/src/ui/components/StatsHeatmapView.d.ts +12 -0
- package/dist/src/ui/components/StatsHeatmapView.js +40 -0
- package/dist/src/ui/components/StatsHeatmapView.js.map +1 -0
- package/dist/src/ui/components/StatsSessionTab.d.ts +7 -0
- package/dist/src/ui/components/StatsSessionTab.js +40 -0
- package/dist/src/ui/components/StatsSessionTab.js.map +1 -0
- package/dist/src/ui/components/StatusLineDialog.d.ts +22 -0
- package/dist/src/ui/components/StatusLineDialog.js +140 -0
- package/dist/src/ui/components/StatusLineDialog.js.map +1 -0
- package/dist/src/ui/components/StatusLineDialog.test.d.ts +6 -0
- package/dist/src/ui/components/StatusLineDialog.test.js +180 -0
- package/dist/src/ui/components/StatusLineDialog.test.js.map +1 -0
- package/dist/src/ui/components/StickyTodoList.d.ts +14 -0
- package/dist/src/ui/components/StickyTodoList.js +45 -0
- package/dist/src/ui/components/StickyTodoList.js.map +1 -0
- package/dist/src/ui/components/StickyTodoList.test.d.ts +6 -0
- package/dist/src/ui/components/StickyTodoList.test.js +128 -0
- package/dist/src/ui/components/StickyTodoList.test.js.map +1 -0
- package/dist/src/ui/components/SuggestionsDisplay.d.ts +47 -0
- package/dist/src/ui/components/SuggestionsDisplay.js +43 -0
- package/dist/src/ui/components/SuggestionsDisplay.js.map +1 -0
- package/dist/src/ui/components/SuggestionsDisplay.test.d.ts +6 -0
- package/dist/src/ui/components/SuggestionsDisplay.test.js +39 -0
- package/dist/src/ui/components/SuggestionsDisplay.test.js.map +1 -0
- package/dist/src/ui/components/ThemeDialog.d.ts +20 -0
- package/dist/src/ui/components/ThemeDialog.js +137 -0
- package/dist/src/ui/components/ThemeDialog.js.map +1 -0
- package/dist/src/ui/components/ThemeDialog.test.d.ts +6 -0
- package/dist/src/ui/components/ThemeDialog.test.js +75 -0
- package/dist/src/ui/components/ThemeDialog.test.js.map +1 -0
- package/dist/src/ui/components/ThinkingDots.d.ts +11 -0
- package/dist/src/ui/components/ThinkingDots.js +47 -0
- package/dist/src/ui/components/ThinkingDots.js.map +1 -0
- package/dist/src/ui/components/ThinkingIndicator.d.ts +7 -0
- package/dist/src/ui/components/ThinkingIndicator.js +13 -0
- package/dist/src/ui/components/ThinkingIndicator.js.map +1 -0
- package/dist/src/ui/components/Tips.d.ts +6 -0
- package/dist/src/ui/components/Tips.js +37 -0
- package/dist/src/ui/components/Tips.js.map +1 -0
- package/dist/src/ui/components/Tips.test.d.ts +6 -0
- package/dist/src/ui/components/Tips.test.js +145 -0
- package/dist/src/ui/components/Tips.test.js.map +1 -0
- package/dist/src/ui/components/TodoDisplay.d.ts +16 -0
- package/dist/src/ui/components/TodoDisplay.js +27 -0
- package/dist/src/ui/components/TodoDisplay.js.map +1 -0
- package/dist/src/ui/components/TodoDisplay.test.d.ts +6 -0
- package/dist/src/ui/components/TodoDisplay.test.js +77 -0
- package/dist/src/ui/components/TodoDisplay.test.js.map +1 -0
- package/dist/src/ui/components/ToolStatsDisplay.d.ts +11 -0
- package/dist/src/ui/components/ToolStatsDisplay.js +42 -0
- package/dist/src/ui/components/ToolStatsDisplay.js.map +1 -0
- package/dist/src/ui/components/TrustDialog.d.ts +13 -0
- package/dist/src/ui/components/TrustDialog.js +48 -0
- package/dist/src/ui/components/TrustDialog.js.map +1 -0
- package/dist/src/ui/components/TrustDialog.test.d.ts +6 -0
- package/dist/src/ui/components/TrustDialog.test.js +154 -0
- package/dist/src/ui/components/TrustDialog.test.js.map +1 -0
- package/dist/src/ui/components/UpdateNotification.d.ts +10 -0
- package/dist/src/ui/components/UpdateNotification.js +10 -0
- package/dist/src/ui/components/UpdateNotification.js.map +1 -0
- package/dist/src/ui/components/WelcomeBackDialog.d.ts +13 -0
- package/dist/src/ui/components/WelcomeBackDialog.js +43 -0
- package/dist/src/ui/components/WelcomeBackDialog.js.map +1 -0
- package/dist/src/ui/components/WorktreeExitDialog.d.ts +26 -0
- package/dist/src/ui/components/WorktreeExitDialog.js +134 -0
- package/dist/src/ui/components/WorktreeExitDialog.js.map +1 -0
- package/dist/src/ui/components/WorktreeExitDialog.test.d.ts +6 -0
- package/dist/src/ui/components/WorktreeExitDialog.test.js +41 -0
- package/dist/src/ui/components/WorktreeExitDialog.test.js.map +1 -0
- package/dist/src/ui/components/agent-view/AgentChatContent.d.ts +27 -0
- package/dist/src/ui/components/agent-view/AgentChatContent.js +150 -0
- package/dist/src/ui/components/agent-view/AgentChatContent.js.map +1 -0
- package/dist/src/ui/components/agent-view/AgentChatView.d.ts +10 -0
- package/dist/src/ui/components/agent-view/AgentChatView.js +24 -0
- package/dist/src/ui/components/agent-view/AgentChatView.js.map +1 -0
- package/dist/src/ui/components/agent-view/AgentComposer.d.ts +10 -0
- package/dist/src/ui/components/agent-view/AgentComposer.js +183 -0
- package/dist/src/ui/components/agent-view/AgentComposer.js.map +1 -0
- package/dist/src/ui/components/agent-view/AgentFooter.d.ts +20 -0
- package/dist/src/ui/components/agent-view/AgentFooter.js +15 -0
- package/dist/src/ui/components/agent-view/AgentFooter.js.map +1 -0
- package/dist/src/ui/components/agent-view/AgentHeader.d.ts +19 -0
- package/dist/src/ui/components/agent-view/AgentHeader.js +13 -0
- package/dist/src/ui/components/agent-view/AgentHeader.js.map +1 -0
- package/dist/src/ui/components/agent-view/AgentTabBar.d.ts +6 -0
- package/dist/src/ui/components/agent-view/AgentTabBar.js +110 -0
- package/dist/src/ui/components/agent-view/AgentTabBar.js.map +1 -0
- package/dist/src/ui/components/agent-view/AgentTabBar.test.d.ts +6 -0
- package/dist/src/ui/components/agent-view/AgentTabBar.test.js +90 -0
- package/dist/src/ui/components/agent-view/AgentTabBar.test.js.map +1 -0
- package/dist/src/ui/components/agent-view/agentHistoryAdapter.d.ts +31 -0
- package/dist/src/ui/components/agent-view/agentHistoryAdapter.js +148 -0
- package/dist/src/ui/components/agent-view/agentHistoryAdapter.js.map +1 -0
- package/dist/src/ui/components/agent-view/agentHistoryAdapter.test.d.ts +6 -0
- package/dist/src/ui/components/agent-view/agentHistoryAdapter.test.js +318 -0
- package/dist/src/ui/components/agent-view/agentHistoryAdapter.test.js.map +1 -0
- package/dist/src/ui/components/agent-view/index.d.ts +11 -0
- package/dist/src/ui/components/agent-view/index.js +12 -0
- package/dist/src/ui/components/agent-view/index.js.map +1 -0
- package/dist/src/ui/components/approvalModeVisuals.d.ts +11 -0
- package/dist/src/ui/components/approvalModeVisuals.js +37 -0
- package/dist/src/ui/components/approvalModeVisuals.js.map +1 -0
- package/dist/src/ui/components/approvalModeVisuals.test.d.ts +6 -0
- package/dist/src/ui/components/approvalModeVisuals.test.js +32 -0
- package/dist/src/ui/components/approvalModeVisuals.test.js.map +1 -0
- package/dist/src/ui/components/arena/ArenaCards.d.ts +21 -0
- package/dist/src/ui/components/arena/ArenaCards.js +99 -0
- package/dist/src/ui/components/arena/ArenaCards.js.map +1 -0
- package/dist/src/ui/components/arena/ArenaCards.test.d.ts +6 -0
- package/dist/src/ui/components/arena/ArenaCards.test.js +128 -0
- package/dist/src/ui/components/arena/ArenaCards.test.js.map +1 -0
- package/dist/src/ui/components/arena/ArenaSelectDialog.d.ts +16 -0
- package/dist/src/ui/components/arena/ArenaSelectDialog.js +213 -0
- package/dist/src/ui/components/arena/ArenaSelectDialog.js.map +1 -0
- package/dist/src/ui/components/arena/ArenaSelectDialog.test.d.ts +6 -0
- package/dist/src/ui/components/arena/ArenaSelectDialog.test.js +149 -0
- package/dist/src/ui/components/arena/ArenaSelectDialog.test.js.map +1 -0
- package/dist/src/ui/components/arena/ArenaStartDialog.d.ts +12 -0
- package/dist/src/ui/components/arena/ArenaStartDialog.js +49 -0
- package/dist/src/ui/components/arena/ArenaStartDialog.js.map +1 -0
- package/dist/src/ui/components/arena/ArenaStatusDialog.d.ts +14 -0
- package/dist/src/ui/components/arena/ArenaStatusDialog.js +111 -0
- package/dist/src/ui/components/arena/ArenaStatusDialog.js.map +1 -0
- package/dist/src/ui/components/arena/ArenaStopDialog.d.ts +15 -0
- package/dist/src/ui/components/arena/ArenaStopDialog.js +113 -0
- package/dist/src/ui/components/arena/ArenaStopDialog.js.map +1 -0
- package/dist/src/ui/components/background-view/BackgroundTasksDialog.d.ts +17 -0
- package/dist/src/ui/components/background-view/BackgroundTasksDialog.js +614 -0
- package/dist/src/ui/components/background-view/BackgroundTasksDialog.js.map +1 -0
- package/dist/src/ui/components/background-view/BackgroundTasksDialog.test.d.ts +6 -0
- package/dist/src/ui/components/background-view/BackgroundTasksDialog.test.js +606 -0
- package/dist/src/ui/components/background-view/BackgroundTasksDialog.test.js.map +1 -0
- package/dist/src/ui/components/background-view/BackgroundTasksPill.d.ts +14 -0
- package/dist/src/ui/components/background-view/BackgroundTasksPill.js +94 -0
- package/dist/src/ui/components/background-view/BackgroundTasksPill.js.map +1 -0
- package/dist/src/ui/components/background-view/BackgroundTasksPill.test.d.ts +6 -0
- package/dist/src/ui/components/background-view/BackgroundTasksPill.test.js +158 -0
- package/dist/src/ui/components/background-view/BackgroundTasksPill.test.js.map +1 -0
- package/dist/src/ui/components/background-view/LiveAgentPanel.d.ts +43 -0
- package/dist/src/ui/components/background-view/LiveAgentPanel.js +361 -0
- package/dist/src/ui/components/background-view/LiveAgentPanel.js.map +1 -0
- package/dist/src/ui/components/background-view/LiveAgentPanel.test.d.ts +6 -0
- package/dist/src/ui/components/background-view/LiveAgentPanel.test.js +595 -0
- package/dist/src/ui/components/background-view/LiveAgentPanel.test.js.map +1 -0
- package/dist/src/ui/components/extensions/ExtensionsManagerDialog.d.ts +12 -0
- package/dist/src/ui/components/extensions/ExtensionsManagerDialog.js +337 -0
- package/dist/src/ui/components/extensions/ExtensionsManagerDialog.js.map +1 -0
- package/dist/src/ui/components/extensions/ExtensionsManagerDialog.test.d.ts +6 -0
- package/dist/src/ui/components/extensions/ExtensionsManagerDialog.test.js +90 -0
- package/dist/src/ui/components/extensions/ExtensionsManagerDialog.test.js.map +1 -0
- package/dist/src/ui/components/extensions/index.d.ts +8 -0
- package/dist/src/ui/components/extensions/index.js +8 -0
- package/dist/src/ui/components/extensions/index.js.map +1 -0
- package/dist/src/ui/components/extensions/steps/ActionSelectionStep.d.ts +15 -0
- package/dist/src/ui/components/extensions/steps/ActionSelectionStep.js +75 -0
- package/dist/src/ui/components/extensions/steps/ActionSelectionStep.js.map +1 -0
- package/dist/src/ui/components/extensions/steps/ActionSelectionStep.test.d.ts +6 -0
- package/dist/src/ui/components/extensions/steps/ActionSelectionStep.test.js +56 -0
- package/dist/src/ui/components/extensions/steps/ActionSelectionStep.test.js.map +1 -0
- package/dist/src/ui/components/extensions/steps/ExtensionDetailStep.d.ts +11 -0
- package/dist/src/ui/components/extensions/steps/ExtensionDetailStep.js +23 -0
- package/dist/src/ui/components/extensions/steps/ExtensionDetailStep.js.map +1 -0
- package/dist/src/ui/components/extensions/steps/ExtensionListStep.d.ts +13 -0
- package/dist/src/ui/components/extensions/steps/ExtensionListStep.js +105 -0
- package/dist/src/ui/components/extensions/steps/ExtensionListStep.js.map +1 -0
- package/dist/src/ui/components/extensions/steps/ExtensionListStep.test.d.ts +6 -0
- package/dist/src/ui/components/extensions/steps/ExtensionListStep.test.js +74 -0
- package/dist/src/ui/components/extensions/steps/ExtensionListStep.test.js.map +1 -0
- package/dist/src/ui/components/extensions/steps/ScopeSelectStep.d.ts +13 -0
- package/dist/src/ui/components/extensions/steps/ScopeSelectStep.js +40 -0
- package/dist/src/ui/components/extensions/steps/ScopeSelectStep.js.map +1 -0
- package/dist/src/ui/components/extensions/steps/UninstallConfirmStep.d.ts +13 -0
- package/dist/src/ui/components/extensions/steps/UninstallConfirmStep.js +38 -0
- package/dist/src/ui/components/extensions/steps/UninstallConfirmStep.js.map +1 -0
- package/dist/src/ui/components/extensions/steps/index.d.ts +10 -0
- package/dist/src/ui/components/extensions/steps/index.js +11 -0
- package/dist/src/ui/components/extensions/steps/index.js.map +1 -0
- package/dist/src/ui/components/extensions/types.d.ts +73 -0
- package/dist/src/ui/components/extensions/types.js +18 -0
- package/dist/src/ui/components/extensions/types.js.map +1 -0
- package/dist/src/ui/components/hooks/HandlerListBody.d.ts +12 -0
- package/dist/src/ui/components/hooks/HandlerListBody.js +54 -0
- package/dist/src/ui/components/hooks/HandlerListBody.js.map +1 -0
- package/dist/src/ui/components/hooks/HandlerListBody.test.d.ts +6 -0
- package/dist/src/ui/components/hooks/HandlerListBody.test.js +175 -0
- package/dist/src/ui/components/hooks/HandlerListBody.test.js.map +1 -0
- package/dist/src/ui/components/hooks/HookConfigDetailStep.d.ts +12 -0
- package/dist/src/ui/components/hooks/HookConfigDetailStep.js +48 -0
- package/dist/src/ui/components/hooks/HookConfigDetailStep.js.map +1 -0
- package/dist/src/ui/components/hooks/HookConfigDetailStep.test.d.ts +6 -0
- package/dist/src/ui/components/hooks/HookConfigDetailStep.test.js +236 -0
- package/dist/src/ui/components/hooks/HookConfigDetailStep.test.js.map +1 -0
- package/dist/src/ui/components/hooks/HookDetailStep.d.ts +12 -0
- package/dist/src/ui/components/hooks/HookDetailStep.js +11 -0
- package/dist/src/ui/components/hooks/HookDetailStep.js.map +1 -0
- package/dist/src/ui/components/hooks/HookDetailStep.test.d.ts +6 -0
- package/dist/src/ui/components/hooks/HookDetailStep.test.js +241 -0
- package/dist/src/ui/components/hooks/HookDetailStep.test.js.map +1 -0
- package/dist/src/ui/components/hooks/HookEventHandlerListStep.d.ts +12 -0
- package/dist/src/ui/components/hooks/HookEventHandlerListStep.js +18 -0
- package/dist/src/ui/components/hooks/HookEventHandlerListStep.js.map +1 -0
- package/dist/src/ui/components/hooks/HookEventHeader.d.ts +13 -0
- package/dist/src/ui/components/hooks/HookEventHeader.js +23 -0
- package/dist/src/ui/components/hooks/HookEventHeader.js.map +1 -0
- package/dist/src/ui/components/hooks/HookEventMatcherListStep.d.ts +12 -0
- package/dist/src/ui/components/hooks/HookEventMatcherListStep.js +28 -0
- package/dist/src/ui/components/hooks/HookEventMatcherListStep.js.map +1 -0
- package/dist/src/ui/components/hooks/HookMatcherDetailStep.d.ts +13 -0
- package/dist/src/ui/components/hooks/HookMatcherDetailStep.js +16 -0
- package/dist/src/ui/components/hooks/HookMatcherDetailStep.js.map +1 -0
- package/dist/src/ui/components/hooks/HookMatcherDetailStep.test.d.ts +6 -0
- package/dist/src/ui/components/hooks/HookMatcherDetailStep.test.js +154 -0
- package/dist/src/ui/components/hooks/HookMatcherDetailStep.test.js.map +1 -0
- package/dist/src/ui/components/hooks/HooksDisabledStep.d.ts +10 -0
- package/dist/src/ui/components/hooks/HooksDisabledStep.js +23 -0
- package/dist/src/ui/components/hooks/HooksDisabledStep.js.map +1 -0
- package/dist/src/ui/components/hooks/HooksDisabledStep.test.d.ts +6 -0
- package/dist/src/ui/components/hooks/HooksDisabledStep.test.js +86 -0
- package/dist/src/ui/components/hooks/HooksDisabledStep.test.js.map +1 -0
- package/dist/src/ui/components/hooks/HooksListStep.d.ts +12 -0
- package/dist/src/ui/components/hooks/HooksListStep.js +32 -0
- package/dist/src/ui/components/hooks/HooksListStep.js.map +1 -0
- package/dist/src/ui/components/hooks/HooksListStep.test.d.ts +6 -0
- package/dist/src/ui/components/hooks/HooksListStep.test.js +144 -0
- package/dist/src/ui/components/hooks/HooksListStep.test.js.map +1 -0
- package/dist/src/ui/components/hooks/HooksManagementDialog.d.ts +7 -0
- package/dist/src/ui/components/hooks/HooksManagementDialog.js +418 -0
- package/dist/src/ui/components/hooks/HooksManagementDialog.js.map +1 -0
- package/dist/src/ui/components/hooks/HooksManagementDialog.test.d.ts +6 -0
- package/dist/src/ui/components/hooks/HooksManagementDialog.test.js +305 -0
- package/dist/src/ui/components/hooks/HooksManagementDialog.test.js.map +1 -0
- package/dist/src/ui/components/hooks/constants.d.ts +26 -0
- package/dist/src/ui/components/hooks/constants.js +227 -0
- package/dist/src/ui/components/hooks/constants.js.map +1 -0
- package/dist/src/ui/components/hooks/constants.test.d.ts +6 -0
- package/dist/src/ui/components/hooks/constants.test.js +317 -0
- package/dist/src/ui/components/hooks/constants.test.js.map +1 -0
- package/dist/src/ui/components/hooks/index.d.ts +12 -0
- package/dist/src/ui/components/hooks/index.js +13 -0
- package/dist/src/ui/components/hooks/index.js.map +1 -0
- package/dist/src/ui/components/hooks/matcherGrouping.d.ts +9 -0
- package/dist/src/ui/components/hooks/matcherGrouping.js +35 -0
- package/dist/src/ui/components/hooks/matcherGrouping.js.map +1 -0
- package/dist/src/ui/components/hooks/matcherGrouping.test.d.ts +6 -0
- package/dist/src/ui/components/hooks/matcherGrouping.test.js +183 -0
- package/dist/src/ui/components/hooks/matcherGrouping.test.js.map +1 -0
- package/dist/src/ui/components/hooks/sourceLabels.d.ts +13 -0
- package/dist/src/ui/components/hooks/sourceLabels.js +35 -0
- package/dist/src/ui/components/hooks/sourceLabels.js.map +1 -0
- package/dist/src/ui/components/hooks/sourceLabels.test.d.ts +6 -0
- package/dist/src/ui/components/hooks/sourceLabels.test.js +81 -0
- package/dist/src/ui/components/hooks/sourceLabels.test.js.map +1 -0
- package/dist/src/ui/components/hooks/types.d.ts +42 -0
- package/dist/src/ui/components/hooks/types.js +13 -0
- package/dist/src/ui/components/hooks/types.js.map +1 -0
- package/dist/src/ui/components/mcp/MCPHealthPill.d.ts +24 -0
- package/dist/src/ui/components/mcp/MCPHealthPill.js +33 -0
- package/dist/src/ui/components/mcp/MCPHealthPill.js.map +1 -0
- package/dist/src/ui/components/mcp/MCPHealthPill.test.d.ts +6 -0
- package/dist/src/ui/components/mcp/MCPHealthPill.test.js +42 -0
- package/dist/src/ui/components/mcp/MCPHealthPill.test.js.map +1 -0
- package/dist/src/ui/components/mcp/MCPManagementDialog.d.ts +7 -0
- package/dist/src/ui/components/mcp/MCPManagementDialog.js +472 -0
- package/dist/src/ui/components/mcp/MCPManagementDialog.js.map +1 -0
- package/dist/src/ui/components/mcp/constants.d.ts +29 -0
- package/dist/src/ui/components/mcp/constants.js +34 -0
- package/dist/src/ui/components/mcp/constants.js.map +1 -0
- package/dist/src/ui/components/mcp/index.d.ts +12 -0
- package/dist/src/ui/components/mcp/index.js +15 -0
- package/dist/src/ui/components/mcp/index.js.map +1 -0
- package/dist/src/ui/components/mcp/steps/AuthenticateStep.d.ts +7 -0
- package/dist/src/ui/components/mcp/steps/AuthenticateStep.js +187 -0
- package/dist/src/ui/components/mcp/steps/AuthenticateStep.js.map +1 -0
- package/dist/src/ui/components/mcp/steps/DisableScopeSelectStep.d.ts +7 -0
- package/dist/src/ui/components/mcp/steps/DisableScopeSelectStep.js +44 -0
- package/dist/src/ui/components/mcp/steps/DisableScopeSelectStep.js.map +1 -0
- package/dist/src/ui/components/mcp/steps/ServerDetailStep.d.ts +7 -0
- package/dist/src/ui/components/mcp/steps/ServerDetailStep.js +108 -0
- package/dist/src/ui/components/mcp/steps/ServerDetailStep.js.map +1 -0
- package/dist/src/ui/components/mcp/steps/ServerListStep.d.ts +7 -0
- package/dist/src/ui/components/mcp/steps/ServerListStep.js +74 -0
- package/dist/src/ui/components/mcp/steps/ServerListStep.js.map +1 -0
- package/dist/src/ui/components/mcp/steps/ServerListStep.test.d.ts +6 -0
- package/dist/src/ui/components/mcp/steps/ServerListStep.test.js +60 -0
- package/dist/src/ui/components/mcp/steps/ServerListStep.test.js.map +1 -0
- package/dist/src/ui/components/mcp/steps/ToolDetailStep.d.ts +7 -0
- package/dist/src/ui/components/mcp/steps/ToolDetailStep.js +49 -0
- package/dist/src/ui/components/mcp/steps/ToolDetailStep.js.map +1 -0
- package/dist/src/ui/components/mcp/steps/ToolListStep.d.ts +7 -0
- package/dist/src/ui/components/mcp/steps/ToolListStep.js +80 -0
- package/dist/src/ui/components/mcp/steps/ToolListStep.js.map +1 -0
- package/dist/src/ui/components/mcp/steps/ToolListStep.test.d.ts +6 -0
- package/dist/src/ui/components/mcp/steps/ToolListStep.test.js +55 -0
- package/dist/src/ui/components/mcp/steps/ToolListStep.test.js.map +1 -0
- package/dist/src/ui/components/mcp/types.d.ts +177 -0
- package/dist/src/ui/components/mcp/types.js +17 -0
- package/dist/src/ui/components/mcp/types.js.map +1 -0
- package/dist/src/ui/components/mcp/utils.d.ts +40 -0
- package/dist/src/ui/components/mcp/utils.js +126 -0
- package/dist/src/ui/components/mcp/utils.js.map +1 -0
- package/dist/src/ui/components/mcp/utils.test.d.ts +6 -0
- package/dist/src/ui/components/mcp/utils.test.js +130 -0
- package/dist/src/ui/components/mcp/utils.test.js.map +1 -0
- package/dist/src/ui/components/messages/AskUserQuestionDialog.d.ts +14 -0
- package/dist/src/ui/components/messages/AskUserQuestionDialog.js +291 -0
- package/dist/src/ui/components/messages/AskUserQuestionDialog.js.map +1 -0
- package/dist/src/ui/components/messages/AskUserQuestionDialog.test.d.ts +6 -0
- package/dist/src/ui/components/messages/AskUserQuestionDialog.test.js +281 -0
- package/dist/src/ui/components/messages/AskUserQuestionDialog.test.js.map +1 -0
- package/dist/src/ui/components/messages/BtwMessage.d.ts +14 -0
- package/dist/src/ui/components/messages/BtwMessage.js +30 -0
- package/dist/src/ui/components/messages/BtwMessage.js.map +1 -0
- package/dist/src/ui/components/messages/BtwMessage.test.d.ts +6 -0
- package/dist/src/ui/components/messages/BtwMessage.test.js +60 -0
- package/dist/src/ui/components/messages/BtwMessage.test.js.map +1 -0
- package/dist/src/ui/components/messages/CompactToolGroupDisplay.d.ts +20 -0
- package/dist/src/ui/components/messages/CompactToolGroupDisplay.js +80 -0
- package/dist/src/ui/components/messages/CompactToolGroupDisplay.js.map +1 -0
- package/dist/src/ui/components/messages/CompactToolGroupDisplay.test.d.ts +6 -0
- package/dist/src/ui/components/messages/CompactToolGroupDisplay.test.js +139 -0
- package/dist/src/ui/components/messages/CompactToolGroupDisplay.test.js.map +1 -0
- package/dist/src/ui/components/messages/CompressionMessage.d.ts +10 -0
- package/dist/src/ui/components/messages/CompressionMessage.js +50 -0
- package/dist/src/ui/components/messages/CompressionMessage.js.map +1 -0
- package/dist/src/ui/components/messages/CompressionMessage.test.d.ts +6 -0
- package/dist/src/ui/components/messages/CompressionMessage.test.js +160 -0
- package/dist/src/ui/components/messages/CompressionMessage.test.js.map +1 -0
- package/dist/src/ui/components/messages/ConversationMessages.d.ts +46 -0
- package/dist/src/ui/components/messages/ConversationMessages.js +32 -0
- package/dist/src/ui/components/messages/ConversationMessages.js.map +1 -0
- package/dist/src/ui/components/messages/DiffRenderer.d.ts +19 -0
- package/dist/src/ui/components/messages/DiffRenderer.js +219 -0
- package/dist/src/ui/components/messages/DiffRenderer.js.map +1 -0
- package/dist/src/ui/components/messages/DiffRenderer.test.d.ts +6 -0
- package/dist/src/ui/components/messages/DiffRenderer.test.js +296 -0
- package/dist/src/ui/components/messages/DiffRenderer.test.js.map +1 -0
- package/dist/src/ui/components/messages/DiffStatsDisplay.d.ts +18 -0
- package/dist/src/ui/components/messages/DiffStatsDisplay.js +50 -0
- package/dist/src/ui/components/messages/DiffStatsDisplay.js.map +1 -0
- package/dist/src/ui/components/messages/DiffStatsDisplay.test.d.ts +6 -0
- package/dist/src/ui/components/messages/DiffStatsDisplay.test.js +165 -0
- package/dist/src/ui/components/messages/DiffStatsDisplay.test.js.map +1 -0
- package/dist/src/ui/components/messages/GoalStatusMessage.d.ts +16 -0
- package/dist/src/ui/components/messages/GoalStatusMessage.js +76 -0
- package/dist/src/ui/components/messages/GoalStatusMessage.js.map +1 -0
- package/dist/src/ui/components/messages/GoalStatusMessage.test.d.ts +6 -0
- package/dist/src/ui/components/messages/GoalStatusMessage.test.js +32 -0
- package/dist/src/ui/components/messages/GoalStatusMessage.test.js.map +1 -0
- package/dist/src/ui/components/messages/InlineParallelAgentsDisplay.d.ts +33 -0
- package/dist/src/ui/components/messages/InlineParallelAgentsDisplay.js +196 -0
- package/dist/src/ui/components/messages/InlineParallelAgentsDisplay.js.map +1 -0
- package/dist/src/ui/components/messages/InlineParallelAgentsDisplay.test.d.ts +6 -0
- package/dist/src/ui/components/messages/InlineParallelAgentsDisplay.test.js +219 -0
- package/dist/src/ui/components/messages/InlineParallelAgentsDisplay.test.js.map +1 -0
- package/dist/src/ui/components/messages/InsightProgressMessage.d.ts +12 -0
- package/dist/src/ui/components/messages/InsightProgressMessage.js +20 -0
- package/dist/src/ui/components/messages/InsightProgressMessage.js.map +1 -0
- package/dist/src/ui/components/messages/MemorySavedMessage.d.ts +18 -0
- package/dist/src/ui/components/messages/MemorySavedMessage.js +15 -0
- package/dist/src/ui/components/messages/MemorySavedMessage.js.map +1 -0
- package/dist/src/ui/components/messages/StatusMessages.d.ts +33 -0
- package/dist/src/ui/components/messages/StatusMessages.js +28 -0
- package/dist/src/ui/components/messages/StatusMessages.js.map +1 -0
- package/dist/src/ui/components/messages/StatusMessages.test.d.ts +6 -0
- package/dist/src/ui/components/messages/StatusMessages.test.js +21 -0
- package/dist/src/ui/components/messages/StatusMessages.test.js.map +1 -0
- package/dist/src/ui/components/messages/SummaryMessage.d.ts +11 -0
- package/dist/src/ui/components/messages/SummaryMessage.js +38 -0
- package/dist/src/ui/components/messages/SummaryMessage.js.map +1 -0
- package/dist/src/ui/components/messages/ToolConfirmationMessage.d.ts +16 -0
- package/dist/src/ui/components/messages/ToolConfirmationMessage.js +352 -0
- package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -0
- package/dist/src/ui/components/messages/ToolConfirmationMessage.test.d.ts +6 -0
- package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js +312 -0
- package/dist/src/ui/components/messages/ToolConfirmationMessage.test.js.map +1 -0
- package/dist/src/ui/components/messages/ToolGroupMessage.d.ts +58 -0
- package/dist/src/ui/components/messages/ToolGroupMessage.js +278 -0
- package/dist/src/ui/components/messages/ToolGroupMessage.js.map +1 -0
- package/dist/src/ui/components/messages/ToolGroupMessage.test.d.ts +6 -0
- package/dist/src/ui/components/messages/ToolGroupMessage.test.js +619 -0
- package/dist/src/ui/components/messages/ToolGroupMessage.test.js.map +1 -0
- package/dist/src/ui/components/messages/ToolMessage.d.ts +39 -0
- package/dist/src/ui/components/messages/ToolMessage.js +400 -0
- package/dist/src/ui/components/messages/ToolMessage.js.map +1 -0
- package/dist/src/ui/components/messages/ToolMessage.test.d.ts +6 -0
- package/dist/src/ui/components/messages/ToolMessage.test.js +575 -0
- package/dist/src/ui/components/messages/ToolMessage.test.js.map +1 -0
- package/dist/src/ui/components/shared/BaseSelectionList.d.ts +40 -0
- package/dist/src/ui/components/shared/BaseSelectionList.js +75 -0
- package/dist/src/ui/components/shared/BaseSelectionList.js.map +1 -0
- package/dist/src/ui/components/shared/BaseSelectionList.test.d.ts +6 -0
- package/dist/src/ui/components/shared/BaseSelectionList.test.js +376 -0
- package/dist/src/ui/components/shared/BaseSelectionList.test.js.map +1 -0
- package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.d.ts +37 -0
- package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.js +13 -0
- package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.js.map +1 -0
- package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.test.d.ts +6 -0
- package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.test.js +79 -0
- package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.test.js.map +1 -0
- package/dist/src/ui/components/shared/EnumSelector.d.ts +18 -0
- package/dist/src/ui/components/shared/EnumSelector.js +44 -0
- package/dist/src/ui/components/shared/EnumSelector.js.map +1 -0
- package/dist/src/ui/components/shared/EnumSelector.test.d.ts +6 -0
- package/dist/src/ui/components/shared/EnumSelector.test.js +70 -0
- package/dist/src/ui/components/shared/EnumSelector.test.js.map +1 -0
- package/dist/src/ui/components/shared/MaxSizedBox.d.ts +61 -0
- package/dist/src/ui/components/shared/MaxSizedBox.js +453 -0
- package/dist/src/ui/components/shared/MaxSizedBox.js.map +1 -0
- package/dist/src/ui/components/shared/MaxSizedBox.test.d.ts +6 -0
- package/dist/src/ui/components/shared/MaxSizedBox.test.js +154 -0
- package/dist/src/ui/components/shared/MaxSizedBox.test.js.map +1 -0
- package/dist/src/ui/components/shared/MultiSelect.d.ts +30 -0
- package/dist/src/ui/components/shared/MultiSelect.js +94 -0
- package/dist/src/ui/components/shared/MultiSelect.js.map +1 -0
- package/dist/src/ui/components/shared/RadioButtonSelect.d.ts +45 -0
- package/dist/src/ui/components/shared/RadioButtonSelect.js +21 -0
- package/dist/src/ui/components/shared/RadioButtonSelect.js.map +1 -0
- package/dist/src/ui/components/shared/RadioButtonSelect.test.d.ts +6 -0
- package/dist/src/ui/components/shared/RadioButtonSelect.test.js +134 -0
- package/dist/src/ui/components/shared/RadioButtonSelect.test.js.map +1 -0
- package/dist/src/ui/components/shared/ScopeSelector.d.ts +19 -0
- package/dist/src/ui/components/shared/ScopeSelector.js +16 -0
- package/dist/src/ui/components/shared/ScopeSelector.js.map +1 -0
- package/dist/src/ui/components/shared/ScrollableList.d.ts +19 -0
- package/dist/src/ui/components/shared/ScrollableList.js +97 -0
- package/dist/src/ui/components/shared/ScrollableList.js.map +1 -0
- package/dist/src/ui/components/shared/ScrollableList.test.d.ts +6 -0
- package/dist/src/ui/components/shared/ScrollableList.test.js +158 -0
- package/dist/src/ui/components/shared/ScrollableList.test.js.map +1 -0
- package/dist/src/ui/components/shared/StaticRender.d.ts +25 -0
- package/dist/src/ui/components/shared/StaticRender.js +25 -0
- package/dist/src/ui/components/shared/StaticRender.js.map +1 -0
- package/dist/src/ui/components/shared/TextInput.d.ts +25 -0
- package/dist/src/ui/components/shared/TextInput.js +163 -0
- package/dist/src/ui/components/shared/TextInput.js.map +1 -0
- package/dist/src/ui/components/shared/TextInput.test.d.ts +6 -0
- package/dist/src/ui/components/shared/TextInput.test.js +91 -0
- package/dist/src/ui/components/shared/TextInput.test.js.map +1 -0
- package/dist/src/ui/components/shared/ToolElapsedTime.d.ts +30 -0
- package/dist/src/ui/components/shared/ToolElapsedTime.js +43 -0
- package/dist/src/ui/components/shared/ToolElapsedTime.js.map +1 -0
- package/dist/src/ui/components/shared/ToolElapsedTime.test.d.ts +6 -0
- package/dist/src/ui/components/shared/ToolElapsedTime.test.js +63 -0
- package/dist/src/ui/components/shared/ToolElapsedTime.test.js.map +1 -0
- package/dist/src/ui/components/shared/ToolStatusIndicator.d.ts +14 -0
- package/dist/src/ui/components/shared/ToolStatusIndicator.js +13 -0
- package/dist/src/ui/components/shared/ToolStatusIndicator.js.map +1 -0
- package/dist/src/ui/components/shared/VirtualizedList.d.ts +49 -0
- package/dist/src/ui/components/shared/VirtualizedList.js +529 -0
- package/dist/src/ui/components/shared/VirtualizedList.js.map +1 -0
- package/dist/src/ui/components/shared/VirtualizedList.test.d.ts +6 -0
- package/dist/src/ui/components/shared/VirtualizedList.test.js +371 -0
- package/dist/src/ui/components/shared/VirtualizedList.test.js.map +1 -0
- package/dist/src/ui/components/shared/text-buffer-external-editor.test.d.ts +6 -0
- package/dist/src/ui/components/shared/text-buffer-external-editor.test.js +657 -0
- package/dist/src/ui/components/shared/text-buffer-external-editor.test.js.map +1 -0
- package/dist/src/ui/components/shared/text-buffer.d.ts +503 -0
- package/dist/src/ui/components/shared/text-buffer.js +2181 -0
- package/dist/src/ui/components/shared/text-buffer.js.map +1 -0
- package/dist/src/ui/components/shared/vim-buffer-actions.d.ts +74 -0
- package/dist/src/ui/components/shared/vim-buffer-actions.js +612 -0
- package/dist/src/ui/components/shared/vim-buffer-actions.js.map +1 -0
- package/dist/src/ui/components/skills/SkillsManagerDialog.d.ts +44 -0
- package/dist/src/ui/components/skills/SkillsManagerDialog.js +423 -0
- package/dist/src/ui/components/skills/SkillsManagerDialog.js.map +1 -0
- package/dist/src/ui/components/stats-helpers.d.ts +30 -0
- package/dist/src/ui/components/stats-helpers.js +79 -0
- package/dist/src/ui/components/stats-helpers.js.map +1 -0
- package/dist/src/ui/components/subagents/constants.d.ts +23 -0
- package/dist/src/ui/components/subagents/constants.js +67 -0
- package/dist/src/ui/components/subagents/constants.js.map +1 -0
- package/dist/src/ui/components/subagents/create/AgentCreationWizard.d.ts +15 -0
- package/dist/src/ui/components/subagents/create/AgentCreationWizard.js +173 -0
- package/dist/src/ui/components/subagents/create/AgentCreationWizard.js.map +1 -0
- package/dist/src/ui/components/subagents/create/ColorSelector.d.ts +15 -0
- package/dist/src/ui/components/subagents/create/ColorSelector.js +43 -0
- package/dist/src/ui/components/subagents/create/ColorSelector.js.map +1 -0
- package/dist/src/ui/components/subagents/create/CreationSummary.d.ts +10 -0
- package/dist/src/ui/components/subagents/create/CreationSummary.js +176 -0
- package/dist/src/ui/components/subagents/create/CreationSummary.js.map +1 -0
- package/dist/src/ui/components/subagents/create/DescriptionInput.d.ts +10 -0
- package/dist/src/ui/components/subagents/create/DescriptionInput.js +107 -0
- package/dist/src/ui/components/subagents/create/DescriptionInput.js.map +1 -0
- package/dist/src/ui/components/subagents/create/GenerationMethodSelector.d.ts +10 -0
- package/dist/src/ui/components/subagents/create/GenerationMethodSelector.js +39 -0
- package/dist/src/ui/components/subagents/create/GenerationMethodSelector.js.map +1 -0
- package/dist/src/ui/components/subagents/create/LocationSelector.d.ts +10 -0
- package/dist/src/ui/components/subagents/create/LocationSelector.js +39 -0
- package/dist/src/ui/components/subagents/create/LocationSelector.js.map +1 -0
- package/dist/src/ui/components/subagents/create/TextEntryStep.d.ts +26 -0
- package/dist/src/ui/components/subagents/create/TextEntryStep.js +28 -0
- package/dist/src/ui/components/subagents/create/TextEntryStep.js.map +1 -0
- package/dist/src/ui/components/subagents/create/ToolSelector.d.ts +16 -0
- package/dist/src/ui/components/subagents/create/ToolSelector.js +145 -0
- package/dist/src/ui/components/subagents/create/ToolSelector.js.map +1 -0
- package/dist/src/ui/components/subagents/index.d.ts +7 -0
- package/dist/src/ui/components/subagents/index.js +13 -0
- package/dist/src/ui/components/subagents/index.js.map +1 -0
- package/dist/src/ui/components/subagents/manage/ActionSelectionStep.d.ts +13 -0
- package/dist/src/ui/components/subagents/manage/ActionSelectionStep.js +73 -0
- package/dist/src/ui/components/subagents/manage/ActionSelectionStep.js.map +1 -0
- package/dist/src/ui/components/subagents/manage/AgentDeleteStep.d.ts +13 -0
- package/dist/src/ui/components/subagents/manage/AgentDeleteStep.js +38 -0
- package/dist/src/ui/components/subagents/manage/AgentDeleteStep.js.map +1 -0
- package/dist/src/ui/components/subagents/manage/AgentEditStep.d.ts +15 -0
- package/dist/src/ui/components/subagents/manage/AgentEditStep.js +76 -0
- package/dist/src/ui/components/subagents/manage/AgentEditStep.js.map +1 -0
- package/dist/src/ui/components/subagents/manage/AgentSelectionStep.d.ts +12 -0
- package/dist/src/ui/components/subagents/manage/AgentSelectionStep.js +342 -0
- package/dist/src/ui/components/subagents/manage/AgentSelectionStep.js.map +1 -0
- package/dist/src/ui/components/subagents/manage/AgentSelectionStep.test.d.ts +6 -0
- package/dist/src/ui/components/subagents/manage/AgentSelectionStep.test.js +56 -0
- package/dist/src/ui/components/subagents/manage/AgentSelectionStep.test.js.map +1 -0
- package/dist/src/ui/components/subagents/manage/AgentViewerStep.d.ts +11 -0
- package/dist/src/ui/components/subagents/manage/AgentViewerStep.js +20 -0
- package/dist/src/ui/components/subagents/manage/AgentViewerStep.js.map +1 -0
- package/dist/src/ui/components/subagents/manage/AgentsManagerDialog.d.ts +15 -0
- package/dist/src/ui/components/subagents/manage/AgentsManagerDialog.js +214 -0
- package/dist/src/ui/components/subagents/manage/AgentsManagerDialog.js.map +1 -0
- package/dist/src/ui/components/subagents/reducers.d.ts +14 -0
- package/dist/src/ui/components/subagents/reducers.js +162 -0
- package/dist/src/ui/components/subagents/reducers.js.map +1 -0
- package/dist/src/ui/components/subagents/types.d.ts +137 -0
- package/dist/src/ui/components/subagents/types.js +15 -0
- package/dist/src/ui/components/subagents/types.js.map +1 -0
- package/dist/src/ui/components/subagents/utils.d.ts +15 -0
- package/dist/src/ui/components/subagents/utils.js +79 -0
- package/dist/src/ui/components/subagents/utils.js.map +1 -0
- package/dist/src/ui/components/views/ContextUsage.d.ts +23 -0
- package/dist/src/ui/components/views/ContextUsage.js +130 -0
- package/dist/src/ui/components/views/ContextUsage.js.map +1 -0
- package/dist/src/ui/components/views/ContextUsage.test.d.ts +6 -0
- package/dist/src/ui/components/views/ContextUsage.test.js +76 -0
- package/dist/src/ui/components/views/ContextUsage.test.js.map +1 -0
- package/dist/src/ui/components/views/DoctorReport.d.ts +18 -0
- package/dist/src/ui/components/views/DoctorReport.js +45 -0
- package/dist/src/ui/components/views/DoctorReport.js.map +1 -0
- package/dist/src/ui/components/views/ExtensionsList.d.ts +6 -0
- package/dist/src/ui/components/views/ExtensionsList.js +49 -0
- package/dist/src/ui/components/views/ExtensionsList.js.map +1 -0
- package/dist/src/ui/components/views/ExtensionsList.test.d.ts +6 -0
- package/dist/src/ui/components/views/ExtensionsList.test.js +88 -0
- package/dist/src/ui/components/views/ExtensionsList.test.js.map +1 -0
- package/dist/src/ui/components/views/McpStatus.d.ts +27 -0
- package/dist/src/ui/components/views/McpStatus.js +90 -0
- package/dist/src/ui/components/views/McpStatus.js.map +1 -0
- package/dist/src/ui/components/views/McpStatus.test.d.ts +6 -0
- package/dist/src/ui/components/views/McpStatus.test.js +117 -0
- package/dist/src/ui/components/views/McpStatus.test.js.map +1 -0
- package/dist/src/ui/components/views/SkillsList.d.ts +12 -0
- package/dist/src/ui/components/views/SkillsList.js +7 -0
- package/dist/src/ui/components/views/SkillsList.js.map +1 -0
- package/dist/src/ui/components/views/ToolsList.d.ts +14 -0
- package/dist/src/ui/components/views/ToolsList.js +8 -0
- package/dist/src/ui/components/views/ToolsList.js.map +1 -0
- package/dist/src/ui/components/views/ToolsList.test.d.ts +6 -0
- package/dist/src/ui/components/views/ToolsList.test.js +45 -0
- package/dist/src/ui/components/views/ToolsList.test.js.map +1 -0
- package/dist/src/ui/constants.d.ts +18 -0
- package/dist/src/ui/constants.js +23 -0
- package/dist/src/ui/constants.js.map +1 -0
- package/dist/src/ui/contexts/AgentViewContext.d.ts +49 -0
- package/dist/src/ui/contexts/AgentViewContext.js +187 -0
- package/dist/src/ui/contexts/AgentViewContext.js.map +1 -0
- package/dist/src/ui/contexts/AppContext.d.ts +11 -0
- package/dist/src/ui/contexts/AppContext.js +15 -0
- package/dist/src/ui/contexts/AppContext.js.map +1 -0
- package/dist/src/ui/contexts/BackgroundTaskViewContext.d.ts +60 -0
- package/dist/src/ui/contexts/BackgroundTaskViewContext.js +238 -0
- package/dist/src/ui/contexts/BackgroundTaskViewContext.js.map +1 -0
- package/dist/src/ui/contexts/CompactModeContext.d.ts +13 -0
- package/dist/src/ui/contexts/CompactModeContext.js +13 -0
- package/dist/src/ui/contexts/CompactModeContext.js.map +1 -0
- package/dist/src/ui/contexts/ConfigContext.d.ts +9 -0
- package/dist/src/ui/contexts/ConfigContext.js +16 -0
- package/dist/src/ui/contexts/ConfigContext.js.map +1 -0
- package/dist/src/ui/contexts/KeypressContext.d.ts +40 -0
- package/dist/src/ui/contexts/KeypressContext.js +959 -0
- package/dist/src/ui/contexts/KeypressContext.js.map +1 -0
- package/dist/src/ui/contexts/KeypressContext.test.d.ts +6 -0
- package/dist/src/ui/contexts/KeypressContext.test.js +1360 -0
- package/dist/src/ui/contexts/KeypressContext.test.js.map +1 -0
- package/dist/src/ui/contexts/OverflowContext.d.ts +19 -0
- package/dist/src/ui/contexts/OverflowContext.js +38 -0
- package/dist/src/ui/contexts/OverflowContext.js.map +1 -0
- package/dist/src/ui/contexts/RenderModeContext.d.ts +14 -0
- package/dist/src/ui/contexts/RenderModeContext.js +15 -0
- package/dist/src/ui/contexts/RenderModeContext.js.map +1 -0
- package/dist/src/ui/contexts/SessionContext.d.ts +47 -0
- package/dist/src/ui/contexts/SessionContext.js +180 -0
- package/dist/src/ui/contexts/SessionContext.js.map +1 -0
- package/dist/src/ui/contexts/SettingsContext.d.ts +9 -0
- package/dist/src/ui/contexts/SettingsContext.js +15 -0
- package/dist/src/ui/contexts/SettingsContext.js.map +1 -0
- package/dist/src/ui/contexts/ShellFocusContext.d.ts +7 -0
- package/dist/src/ui/contexts/ShellFocusContext.js +9 -0
- package/dist/src/ui/contexts/ShellFocusContext.js.map +1 -0
- package/dist/src/ui/contexts/StreamingContext.d.ts +9 -0
- package/dist/src/ui/contexts/StreamingContext.js +15 -0
- package/dist/src/ui/contexts/StreamingContext.js.map +1 -0
- package/dist/src/ui/contexts/TerminalOutputContext.d.ts +12 -0
- package/dist/src/ui/contexts/TerminalOutputContext.js +11 -0
- package/dist/src/ui/contexts/TerminalOutputContext.js.map +1 -0
- package/dist/src/ui/contexts/UIActionsContext.d.ts +91 -0
- package/dist/src/ui/contexts/UIActionsContext.js +22 -0
- package/dist/src/ui/contexts/UIActionsContext.js.map +1 -0
- package/dist/src/ui/contexts/UIStateContext.d.ts +158 -0
- package/dist/src/ui/contexts/UIStateContext.js +20 -0
- package/dist/src/ui/contexts/UIStateContext.js.map +1 -0
- package/dist/src/ui/contexts/VimModeContext.d.ts +31 -0
- package/dist/src/ui/contexts/VimModeContext.js +60 -0
- package/dist/src/ui/contexts/VimModeContext.js.map +1 -0
- package/dist/src/ui/contexts/VimModeContext.test.d.ts +11 -0
- package/dist/src/ui/contexts/VimModeContext.test.js +99 -0
- package/dist/src/ui/contexts/VimModeContext.test.js.map +1 -0
- package/dist/src/ui/daemon/DaemonTuiAdapter.d.ts +101 -0
- package/dist/src/ui/daemon/DaemonTuiAdapter.js +695 -0
- package/dist/src/ui/daemon/DaemonTuiAdapter.js.map +1 -0
- package/dist/src/ui/daemon/DaemonTuiAdapter.test.d.ts +6 -0
- package/dist/src/ui/daemon/DaemonTuiAdapter.test.js +784 -0
- package/dist/src/ui/daemon/DaemonTuiAdapter.test.js.map +1 -0
- package/dist/src/ui/editors/editorSettingsManager.d.ts +19 -0
- package/dist/src/ui/editors/editorSettingsManager.js +48 -0
- package/dist/src/ui/editors/editorSettingsManager.js.map +1 -0
- package/dist/src/ui/hooks/atCommandProcessor.d.ts +33 -0
- package/dist/src/ui/hooks/atCommandProcessor.js +344 -0
- package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -0
- package/dist/src/ui/hooks/atCommandProcessor.test.d.ts +6 -0
- package/dist/src/ui/hooks/atCommandProcessor.test.js +871 -0
- package/dist/src/ui/hooks/atCommandProcessor.test.js.map +1 -0
- package/dist/src/ui/hooks/keyToAnsi.d.ts +15 -0
- package/dist/src/ui/hooks/keyToAnsi.js +67 -0
- package/dist/src/ui/hooks/keyToAnsi.js.map +1 -0
- package/dist/src/ui/hooks/shellCommandProcessor.d.ts +18 -0
- package/dist/src/ui/hooks/shellCommandProcessor.js +287 -0
- package/dist/src/ui/hooks/shellCommandProcessor.js.map +1 -0
- package/dist/src/ui/hooks/shellCommandProcessor.test.d.ts +6 -0
- package/dist/src/ui/hooks/shellCommandProcessor.test.js +509 -0
- package/dist/src/ui/hooks/shellCommandProcessor.test.js.map +1 -0
- package/dist/src/ui/hooks/slashCommandProcessor.d.ts +71 -0
- package/dist/src/ui/hooks/slashCommandProcessor.js +837 -0
- package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -0
- package/dist/src/ui/hooks/useAgentStreamingState.d.ts +29 -0
- package/dist/src/ui/hooks/useAgentStreamingState.js +109 -0
- package/dist/src/ui/hooks/useAgentStreamingState.js.map +1 -0
- package/dist/src/ui/hooks/useAgentsManagerDialog.d.ts +11 -0
- package/dist/src/ui/hooks/useAgentsManagerDialog.js +21 -0
- package/dist/src/ui/hooks/useAgentsManagerDialog.js.map +1 -0
- package/dist/src/ui/hooks/useAnimatedScrollbar.d.ts +37 -0
- package/dist/src/ui/hooks/useAnimatedScrollbar.js +44 -0
- package/dist/src/ui/hooks/useAnimatedScrollbar.js.map +1 -0
- package/dist/src/ui/hooks/useAnimatedScrollbar.test.d.ts +6 -0
- package/dist/src/ui/hooks/useAnimatedScrollbar.test.js +74 -0
- package/dist/src/ui/hooks/useAnimatedScrollbar.test.js.map +1 -0
- package/dist/src/ui/hooks/useAnimationFrame.d.ts +25 -0
- package/dist/src/ui/hooks/useAnimationFrame.js +86 -0
- package/dist/src/ui/hooks/useAnimationFrame.js.map +1 -0
- package/dist/src/ui/hooks/useApprovalModeCommand.d.ts +14 -0
- package/dist/src/ui/hooks/useApprovalModeCommand.js +33 -0
- package/dist/src/ui/hooks/useApprovalModeCommand.js.map +1 -0
- package/dist/src/ui/hooks/useArenaCommand.d.ts +13 -0
- package/dist/src/ui/hooks/useArenaCommand.js +21 -0
- package/dist/src/ui/hooks/useArenaCommand.js.map +1 -0
- package/dist/src/ui/hooks/useArenaInProcess.d.ts +14 -0
- package/dist/src/ui/hooks/useArenaInProcess.js +136 -0
- package/dist/src/ui/hooks/useArenaInProcess.js.map +1 -0
- package/dist/src/ui/hooks/useAtCompletion.d.ts +23 -0
- package/dist/src/ui/hooks/useAtCompletion.js +184 -0
- package/dist/src/ui/hooks/useAtCompletion.js.map +1 -0
- package/dist/src/ui/hooks/useAttentionNotifications.d.ts +22 -0
- package/dist/src/ui/hooks/useAttentionNotifications.js +89 -0
- package/dist/src/ui/hooks/useAttentionNotifications.js.map +1 -0
- package/dist/src/ui/hooks/useAttentionNotifications.test.d.ts +6 -0
- package/dist/src/ui/hooks/useAttentionNotifications.test.js +222 -0
- package/dist/src/ui/hooks/useAttentionNotifications.test.js.map +1 -0
- package/dist/src/ui/hooks/useAutoAcceptIndicator.d.ts +32 -0
- package/dist/src/ui/hooks/useAutoAcceptIndicator.js +124 -0
- package/dist/src/ui/hooks/useAutoAcceptIndicator.js.map +1 -0
- package/dist/src/ui/hooks/useAutoAcceptIndicator.test.d.ts +6 -0
- package/dist/src/ui/hooks/useAutoAcceptIndicator.test.js +379 -0
- package/dist/src/ui/hooks/useAutoAcceptIndicator.test.js.map +1 -0
- package/dist/src/ui/hooks/useAwaySummary.d.ts +35 -0
- package/dist/src/ui/hooks/useAwaySummary.js +141 -0
- package/dist/src/ui/hooks/useAwaySummary.js.map +1 -0
- package/dist/src/ui/hooks/useAwaySummary.test.d.ts +6 -0
- package/dist/src/ui/hooks/useAwaySummary.test.js +103 -0
- package/dist/src/ui/hooks/useAwaySummary.test.js.map +1 -0
- package/dist/src/ui/hooks/useBackgroundTaskView.d.ts +69 -0
- package/dist/src/ui/hooks/useBackgroundTaskView.js +217 -0
- package/dist/src/ui/hooks/useBackgroundTaskView.js.map +1 -0
- package/dist/src/ui/hooks/useBackgroundTaskView.test.d.ts +6 -0
- package/dist/src/ui/hooks/useBackgroundTaskView.test.js +455 -0
- package/dist/src/ui/hooks/useBackgroundTaskView.test.js.map +1 -0
- package/dist/src/ui/hooks/useBatchedScroll.d.ts +14 -0
- package/dist/src/ui/hooks/useBatchedScroll.js +25 -0
- package/dist/src/ui/hooks/useBatchedScroll.js.map +1 -0
- package/dist/src/ui/hooks/useBatchedScroll.test.d.ts +6 -0
- package/dist/src/ui/hooks/useBatchedScroll.test.js +42 -0
- package/dist/src/ui/hooks/useBatchedScroll.test.js.map +1 -0
- package/dist/src/ui/hooks/useBracketedPaste.d.ts +12 -0
- package/dist/src/ui/hooks/useBracketedPaste.js +32 -0
- package/dist/src/ui/hooks/useBracketedPaste.js.map +1 -0
- package/dist/src/ui/hooks/useBranchCommand.d.ts +33 -0
- package/dist/src/ui/hooks/useBranchCommand.js +230 -0
- package/dist/src/ui/hooks/useBranchCommand.js.map +1 -0
- package/dist/src/ui/hooks/useBranchCommand.test.d.ts +6 -0
- package/dist/src/ui/hooks/useBranchCommand.test.js +386 -0
- package/dist/src/ui/hooks/useBranchCommand.test.js.map +1 -0
- package/dist/src/ui/hooks/useCommandCompletion.d.ts +37 -0
- package/dist/src/ui/hooks/useCommandCompletion.js +227 -0
- package/dist/src/ui/hooks/useCommandCompletion.js.map +1 -0
- package/dist/src/ui/hooks/useCommandMigration.d.ts +16 -0
- package/dist/src/ui/hooks/useCommandMigration.js +40 -0
- package/dist/src/ui/hooks/useCommandMigration.js.map +1 -0
- package/dist/src/ui/hooks/useCompletion.d.ts +24 -0
- package/dist/src/ui/hooks/useCompletion.js +88 -0
- package/dist/src/ui/hooks/useCompletion.js.map +1 -0
- package/dist/src/ui/hooks/useConfigInitMessage.d.ts +6 -0
- package/dist/src/ui/hooks/useConfigInitMessage.js +45 -0
- package/dist/src/ui/hooks/useConfigInitMessage.js.map +1 -0
- package/dist/src/ui/hooks/useConfigInitMessage.test.d.ts +6 -0
- package/dist/src/ui/hooks/useConfigInitMessage.test.js +80 -0
- package/dist/src/ui/hooks/useConfigInitMessage.test.js.map +1 -0
- package/dist/src/ui/hooks/useContextualTips.d.ts +19 -0
- package/dist/src/ui/hooks/useContextualTips.js +65 -0
- package/dist/src/ui/hooks/useContextualTips.js.map +1 -0
- package/dist/src/ui/hooks/useDeleteCommand.d.ts +19 -0
- package/dist/src/ui/hooks/useDeleteCommand.js +167 -0
- package/dist/src/ui/hooks/useDeleteCommand.js.map +1 -0
- package/dist/src/ui/hooks/useDeleteCommand.test.d.ts +6 -0
- package/dist/src/ui/hooks/useDeleteCommand.test.js +391 -0
- package/dist/src/ui/hooks/useDeleteCommand.test.js.map +1 -0
- package/dist/src/ui/hooks/useDialogClose.d.ts +48 -0
- package/dist/src/ui/hooks/useDialogClose.js +102 -0
- package/dist/src/ui/hooks/useDialogClose.js.map +1 -0
- package/dist/src/ui/hooks/useDiffData.d.ts +32 -0
- package/dist/src/ui/hooks/useDiffData.js +72 -0
- package/dist/src/ui/hooks/useDiffData.js.map +1 -0
- package/dist/src/ui/hooks/useDoublePress.d.ts +18 -0
- package/dist/src/ui/hooks/useDoublePress.js +47 -0
- package/dist/src/ui/hooks/useDoublePress.js.map +1 -0
- package/dist/src/ui/hooks/useEditorSettings.d.ts +16 -0
- package/dist/src/ui/hooks/useEditorSettings.js +43 -0
- package/dist/src/ui/hooks/useEditorSettings.js.map +1 -0
- package/dist/src/ui/hooks/useEditorSettings.test.d.ts +6 -0
- package/dist/src/ui/hooks/useEditorSettings.test.js +164 -0
- package/dist/src/ui/hooks/useEditorSettings.test.js.map +1 -0
- package/dist/src/ui/hooks/useExportCompletion.d.ts +70 -0
- package/dist/src/ui/hooks/useExportCompletion.js +208 -0
- package/dist/src/ui/hooks/useExportCompletion.js.map +1 -0
- package/dist/src/ui/hooks/useExportCompletion.test.d.ts +6 -0
- package/dist/src/ui/hooks/useExportCompletion.test.js +190 -0
- package/dist/src/ui/hooks/useExportCompletion.test.js.map +1 -0
- package/dist/src/ui/hooks/useExtensionUpdates.d.ts +71 -0
- package/dist/src/ui/hooks/useExtensionUpdates.js +229 -0
- package/dist/src/ui/hooks/useExtensionUpdates.js.map +1 -0
- package/dist/src/ui/hooks/useExtensionUpdates.test.d.ts +6 -0
- package/dist/src/ui/hooks/useExtensionUpdates.test.js +455 -0
- package/dist/src/ui/hooks/useExtensionUpdates.test.js.map +1 -0
- package/dist/src/ui/hooks/useExtensionsManagerDialog.d.ts +12 -0
- package/dist/src/ui/hooks/useExtensionsManagerDialog.js +21 -0
- package/dist/src/ui/hooks/useExtensionsManagerDialog.js.map +1 -0
- package/dist/src/ui/hooks/useFeedbackDialog.d.ts +18 -0
- package/dist/src/ui/hooks/useFeedbackDialog.js +130 -0
- package/dist/src/ui/hooks/useFeedbackDialog.js.map +1 -0
- package/dist/src/ui/hooks/useFocus.d.ts +10 -0
- package/dist/src/ui/hooks/useFocus.js +51 -0
- package/dist/src/ui/hooks/useFocus.js.map +1 -0
- package/dist/src/ui/hooks/useFolderTrust.d.ts +13 -0
- package/dist/src/ui/hooks/useFolderTrust.js +60 -0
- package/dist/src/ui/hooks/useFolderTrust.js.map +1 -0
- package/dist/src/ui/hooks/useFollowupSuggestions.d.ts +53 -0
- package/dist/src/ui/hooks/useFollowupSuggestions.js +89 -0
- package/dist/src/ui/hooks/useFollowupSuggestions.js.map +1 -0
- package/dist/src/ui/hooks/useGeminiStream.d.ts +76 -0
- package/dist/src/ui/hooks/useGeminiStream.js +1899 -0
- package/dist/src/ui/hooks/useGeminiStream.js.map +1 -0
- package/dist/src/ui/hooks/useGitBranchName.d.ts +6 -0
- package/dist/src/ui/hooks/useGitBranchName.js +61 -0
- package/dist/src/ui/hooks/useGitBranchName.js.map +1 -0
- package/dist/src/ui/hooks/useGitBranchName.test.d.ts +6 -0
- package/dist/src/ui/hooks/useGitBranchName.test.js +192 -0
- package/dist/src/ui/hooks/useGitBranchName.test.js.map +1 -0
- package/dist/src/ui/hooks/useHistoryManager.d.ts +24 -0
- package/dist/src/ui/hooks/useHistoryManager.js +183 -0
- package/dist/src/ui/hooks/useHistoryManager.js.map +1 -0
- package/dist/src/ui/hooks/useHistoryManager.test.d.ts +6 -0
- package/dist/src/ui/hooks/useHistoryManager.test.js +495 -0
- package/dist/src/ui/hooks/useHistoryManager.test.js.map +1 -0
- package/dist/src/ui/hooks/useHooksDialog.d.ts +11 -0
- package/dist/src/ui/hooks/useHooksDialog.js +21 -0
- package/dist/src/ui/hooks/useHooksDialog.js.map +1 -0
- package/dist/src/ui/hooks/useIdeTrustListener.d.ts +16 -0
- package/dist/src/ui/hooks/useIdeTrustListener.js +65 -0
- package/dist/src/ui/hooks/useIdeTrustListener.js.map +1 -0
- package/dist/src/ui/hooks/useIdeTrustListener.test.d.ts +6 -0
- package/dist/src/ui/hooks/useIdeTrustListener.test.js +183 -0
- package/dist/src/ui/hooks/useIdeTrustListener.test.js.map +1 -0
- package/dist/src/ui/hooks/useInitializationAuthError.d.ts +22 -0
- package/dist/src/ui/hooks/useInitializationAuthError.js +40 -0
- package/dist/src/ui/hooks/useInitializationAuthError.js.map +1 -0
- package/dist/src/ui/hooks/useInputHistory.d.ts +20 -0
- package/dist/src/ui/hooks/useInputHistory.js +85 -0
- package/dist/src/ui/hooks/useInputHistory.js.map +1 -0
- package/dist/src/ui/hooks/useInputHistory.test.d.ts +6 -0
- package/dist/src/ui/hooks/useInputHistory.test.js +207 -0
- package/dist/src/ui/hooks/useInputHistory.test.js.map +1 -0
- package/dist/src/ui/hooks/useInputHistoryStore.d.ts +19 -0
- package/dist/src/ui/hooks/useInputHistoryStore.js +83 -0
- package/dist/src/ui/hooks/useInputHistoryStore.js.map +1 -0
- package/dist/src/ui/hooks/useInputHistoryStore.test.d.ts +6 -0
- package/dist/src/ui/hooks/useInputHistoryStore.test.js +231 -0
- package/dist/src/ui/hooks/useInputHistoryStore.test.js.map +1 -0
- package/dist/src/ui/hooks/useKeypress.d.ts +17 -0
- package/dist/src/ui/hooks/useKeypress.js +27 -0
- package/dist/src/ui/hooks/useKeypress.js.map +1 -0
- package/dist/src/ui/hooks/useKittyKeyboardProtocol.d.ts +15 -0
- package/dist/src/ui/hooks/useKittyKeyboardProtocol.js +20 -0
- package/dist/src/ui/hooks/useKittyKeyboardProtocol.js.map +1 -0
- package/dist/src/ui/hooks/useLaunchEditor.d.ts +5 -0
- package/dist/src/ui/hooks/useLaunchEditor.js +75 -0
- package/dist/src/ui/hooks/useLaunchEditor.js.map +1 -0
- package/dist/src/ui/hooks/useLoadingIndicator.d.ts +11 -0
- package/dist/src/ui/hooks/useLoadingIndicator.js +50 -0
- package/dist/src/ui/hooks/useLoadingIndicator.js.map +1 -0
- package/dist/src/ui/hooks/useLoadingIndicator.test.d.ts +6 -0
- package/dist/src/ui/hooks/useLoadingIndicator.test.js +172 -0
- package/dist/src/ui/hooks/useLoadingIndicator.test.js.map +1 -0
- package/dist/src/ui/hooks/useLogger.d.ts +11 -0
- package/dist/src/ui/hooks/useLogger.js +32 -0
- package/dist/src/ui/hooks/useLogger.js.map +1 -0
- package/dist/src/ui/hooks/useMCPHealth.d.ts +16 -0
- package/dist/src/ui/hooks/useMCPHealth.js +56 -0
- package/dist/src/ui/hooks/useMCPHealth.js.map +1 -0
- package/dist/src/ui/hooks/useMcpDialog.d.ts +11 -0
- package/dist/src/ui/hooks/useMcpDialog.js +21 -0
- package/dist/src/ui/hooks/useMcpDialog.js.map +1 -0
- package/dist/src/ui/hooks/useMemoryDialog.d.ts +11 -0
- package/dist/src/ui/hooks/useMemoryDialog.js +21 -0
- package/dist/src/ui/hooks/useMemoryDialog.js.map +1 -0
- package/dist/src/ui/hooks/useMemoryMonitor.d.ts +17 -0
- package/dist/src/ui/hooks/useMemoryMonitor.js +83 -0
- package/dist/src/ui/hooks/useMemoryMonitor.js.map +1 -0
- package/dist/src/ui/hooks/useMemoryMonitor.test.d.ts +6 -0
- package/dist/src/ui/hooks/useMemoryMonitor.test.js +153 -0
- package/dist/src/ui/hooks/useMemoryMonitor.test.js.map +1 -0
- package/dist/src/ui/hooks/useMessageQueue.d.ts +18 -0
- package/dist/src/ui/hooks/useMessageQueue.js +67 -0
- package/dist/src/ui/hooks/useMessageQueue.js.map +1 -0
- package/dist/src/ui/hooks/useMessageQueue.test.d.ts +6 -0
- package/dist/src/ui/hooks/useMessageQueue.test.js +219 -0
- package/dist/src/ui/hooks/useMessageQueue.test.js.map +1 -0
- package/dist/src/ui/hooks/useModelCommand.d.ts +15 -0
- package/dist/src/ui/hooks/useModelCommand.js +25 -0
- package/dist/src/ui/hooks/useModelCommand.js.map +1 -0
- package/dist/src/ui/hooks/useModelCommand.test.d.ts +6 -0
- package/dist/src/ui/hooks/useModelCommand.test.js +35 -0
- package/dist/src/ui/hooks/useModelCommand.test.js.map +1 -0
- package/dist/src/ui/hooks/useMouseEvents.d.ts +44 -0
- package/dist/src/ui/hooks/useMouseEvents.js +85 -0
- package/dist/src/ui/hooks/useMouseEvents.js.map +1 -0
- package/dist/src/ui/hooks/usePhraseCycler.d.ts +14 -0
- package/dist/src/ui/hooks/usePhraseCycler.js +70 -0
- package/dist/src/ui/hooks/usePhraseCycler.js.map +1 -0
- package/dist/src/ui/hooks/usePreferredEditor.d.ts +7 -0
- package/dist/src/ui/hooks/usePreferredEditor.js +25 -0
- package/dist/src/ui/hooks/usePreferredEditor.js.map +1 -0
- package/dist/src/ui/hooks/useProviderUpdates.d.ts +33 -0
- package/dist/src/ui/hooks/useProviderUpdates.js +215 -0
- package/dist/src/ui/hooks/useProviderUpdates.js.map +1 -0
- package/dist/src/ui/hooks/useProviderUpdates.test.d.ts +6 -0
- package/dist/src/ui/hooks/useProviderUpdates.test.js +293 -0
- package/dist/src/ui/hooks/useProviderUpdates.test.js.map +1 -0
- package/dist/src/ui/hooks/useQwenAuth.d.ts +20 -0
- package/dist/src/ui/hooks/useQwenAuth.js +74 -0
- package/dist/src/ui/hooks/useQwenAuth.js.map +1 -0
- package/dist/src/ui/hooks/useQwenAuth.test.d.ts +6 -0
- package/dist/src/ui/hooks/useQwenAuth.test.js +266 -0
- package/dist/src/ui/hooks/useQwenAuth.test.js.map +1 -0
- package/dist/src/ui/hooks/useReactToolScheduler.d.ts +33 -0
- package/dist/src/ui/hooks/useReactToolScheduler.js +236 -0
- package/dist/src/ui/hooks/useReactToolScheduler.js.map +1 -0
- package/dist/src/ui/hooks/useRefreshMemoryCommand.d.ts +6 -0
- package/dist/src/ui/hooks/useRefreshMemoryCommand.js +7 -0
- package/dist/src/ui/hooks/useRefreshMemoryCommand.js.map +1 -0
- package/dist/src/ui/hooks/useResumeCommand.d.ts +31 -0
- package/dist/src/ui/hooks/useResumeCommand.js +114 -0
- package/dist/src/ui/hooks/useResumeCommand.js.map +1 -0
- package/dist/src/ui/hooks/useResumeCommand.test.d.ts +6 -0
- package/dist/src/ui/hooks/useResumeCommand.test.js +349 -0
- package/dist/src/ui/hooks/useResumeCommand.test.js.map +1 -0
- package/dist/src/ui/hooks/useReverseSearchCompletion.d.ts +19 -0
- package/dist/src/ui/hooks/useReverseSearchCompletion.js +103 -0
- package/dist/src/ui/hooks/useReverseSearchCompletion.js.map +1 -0
- package/dist/src/ui/hooks/useReverseSearchCompletion.test.d.ts +6 -0
- package/dist/src/ui/hooks/useReverseSearchCompletion.test.js +163 -0
- package/dist/src/ui/hooks/useReverseSearchCompletion.test.js.map +1 -0
- package/dist/src/ui/hooks/useSelectionList.d.ts +41 -0
- package/dist/src/ui/hooks/useSelectionList.js +276 -0
- package/dist/src/ui/hooks/useSelectionList.js.map +1 -0
- package/dist/src/ui/hooks/useSelectionList.test.d.ts +6 -0
- package/dist/src/ui/hooks/useSelectionList.test.js +782 -0
- package/dist/src/ui/hooks/useSelectionList.test.js.map +1 -0
- package/dist/src/ui/hooks/useSessionPicker.d.ts +95 -0
- package/dist/src/ui/hooks/useSessionPicker.js +383 -0
- package/dist/src/ui/hooks/useSessionPicker.js.map +1 -0
- package/dist/src/ui/hooks/useSessionPicker.test.d.ts +6 -0
- package/dist/src/ui/hooks/useSessionPicker.test.js +94 -0
- package/dist/src/ui/hooks/useSessionPicker.test.js.map +1 -0
- package/dist/src/ui/hooks/useSessionSearchInput.d.ts +69 -0
- package/dist/src/ui/hooks/useSessionSearchInput.js +124 -0
- package/dist/src/ui/hooks/useSessionSearchInput.js.map +1 -0
- package/dist/src/ui/hooks/useSessionSearchInput.test.d.ts +6 -0
- package/dist/src/ui/hooks/useSessionSearchInput.test.js +342 -0
- package/dist/src/ui/hooks/useSessionSearchInput.test.js.map +1 -0
- package/dist/src/ui/hooks/useSettingsCommand.d.ts +10 -0
- package/dist/src/ui/hooks/useSettingsCommand.js +21 -0
- package/dist/src/ui/hooks/useSettingsCommand.js.map +1 -0
- package/dist/src/ui/hooks/useShellHistory.d.ts +14 -0
- package/dist/src/ui/hooks/useShellHistory.js +112 -0
- package/dist/src/ui/hooks/useShellHistory.js.map +1 -0
- package/dist/src/ui/hooks/useShellHistory.test.d.ts +6 -0
- package/dist/src/ui/hooks/useShellHistory.test.js +193 -0
- package/dist/src/ui/hooks/useShellHistory.test.js.map +1 -0
- package/dist/src/ui/hooks/useShowMemoryCommand.d.ts +9 -0
- package/dist/src/ui/hooks/useShowMemoryCommand.js +55 -0
- package/dist/src/ui/hooks/useShowMemoryCommand.js.map +1 -0
- package/dist/src/ui/hooks/useSkillsManagerDialog.d.ts +11 -0
- package/dist/src/ui/hooks/useSkillsManagerDialog.js +21 -0
- package/dist/src/ui/hooks/useSkillsManagerDialog.js.map +1 -0
- package/dist/src/ui/hooks/useSlashCompletion.d.ts +27 -0
- package/dist/src/ui/hooks/useSlashCompletion.integration.test.d.ts +6 -0
- package/dist/src/ui/hooks/useSlashCompletion.integration.test.js +84 -0
- package/dist/src/ui/hooks/useSlashCompletion.integration.test.js.map +1 -0
- package/dist/src/ui/hooks/useSlashCompletion.js +490 -0
- package/dist/src/ui/hooks/useSlashCompletion.js.map +1 -0
- package/dist/src/ui/hooks/useSlashCompletion.test.d.ts +9 -0
- package/dist/src/ui/hooks/useSlashCompletion.test.js +805 -0
- package/dist/src/ui/hooks/useSlashCompletion.test.js.map +1 -0
- package/dist/src/ui/hooks/useStateAndRef.d.ts +7 -0
- package/dist/src/ui/hooks/useStateAndRef.js +26 -0
- package/dist/src/ui/hooks/useStateAndRef.js.map +1 -0
- package/dist/src/ui/hooks/useStatsDialog.d.ts +11 -0
- package/dist/src/ui/hooks/useStatsDialog.js +13 -0
- package/dist/src/ui/hooks/useStatsDialog.js.map +1 -0
- package/dist/src/ui/hooks/useStatusLine.d.ts +84 -0
- package/dist/src/ui/hooks/useStatusLine.js +528 -0
- package/dist/src/ui/hooks/useStatusLine.js.map +1 -0
- package/dist/src/ui/hooks/useStatusLine.test.d.ts +6 -0
- package/dist/src/ui/hooks/useStatusLine.test.js +1039 -0
- package/dist/src/ui/hooks/useStatusLine.test.js.map +1 -0
- package/dist/src/ui/hooks/useSubagentCreateDialog.d.ts +10 -0
- package/dist/src/ui/hooks/useSubagentCreateDialog.js +21 -0
- package/dist/src/ui/hooks/useSubagentCreateDialog.js.map +1 -0
- package/dist/src/ui/hooks/useTerminalNotification.d.ts +32 -0
- package/dist/src/ui/hooks/useTerminalNotification.js +45 -0
- package/dist/src/ui/hooks/useTerminalNotification.js.map +1 -0
- package/dist/src/ui/hooks/useTerminalNotification.test.d.ts +6 -0
- package/dist/src/ui/hooks/useTerminalNotification.test.js +69 -0
- package/dist/src/ui/hooks/useTerminalNotification.test.js.map +1 -0
- package/dist/src/ui/hooks/useTerminalProgress.d.ts +12 -0
- package/dist/src/ui/hooks/useTerminalProgress.js +76 -0
- package/dist/src/ui/hooks/useTerminalProgress.js.map +1 -0
- package/dist/src/ui/hooks/useTerminalSize.d.ts +13 -0
- package/dist/src/ui/hooks/useTerminalSize.js +30 -0
- package/dist/src/ui/hooks/useTerminalSize.js.map +1 -0
- package/dist/src/ui/hooks/useThemeCommand.d.ts +15 -0
- package/dist/src/ui/hooks/useThemeCommand.js +85 -0
- package/dist/src/ui/hooks/useThemeCommand.js.map +1 -0
- package/dist/src/ui/hooks/useThemeCommand.test.d.ts +6 -0
- package/dist/src/ui/hooks/useThemeCommand.test.js +42 -0
- package/dist/src/ui/hooks/useThemeCommand.test.js.map +1 -0
- package/dist/src/ui/hooks/useTimer.d.ts +12 -0
- package/dist/src/ui/hooks/useTimer.js +58 -0
- package/dist/src/ui/hooks/useTimer.js.map +1 -0
- package/dist/src/ui/hooks/useTimer.test.d.ts +6 -0
- package/dist/src/ui/hooks/useTimer.test.js +90 -0
- package/dist/src/ui/hooks/useTimer.test.js.map +1 -0
- package/dist/src/ui/hooks/useTomlMigration.d.ts +1 -0
- package/dist/src/ui/hooks/useTomlMigration.js +2 -0
- package/dist/src/ui/hooks/useTomlMigration.js.map +1 -0
- package/dist/src/ui/hooks/useToolScheduler.test.d.ts +6 -0
- package/dist/src/ui/hooks/useToolScheduler.test.js +624 -0
- package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -0
- package/dist/src/ui/hooks/useTrustModify.d.ts +17 -0
- package/dist/src/ui/hooks/useTrustModify.js +78 -0
- package/dist/src/ui/hooks/useTrustModify.js.map +1 -0
- package/dist/src/ui/hooks/useTrustModify.test.d.ts +6 -0
- package/dist/src/ui/hooks/useTrustModify.test.js +182 -0
- package/dist/src/ui/hooks/useTrustModify.test.js.map +1 -0
- package/dist/src/ui/hooks/useTurnDiffs.d.ts +34 -0
- package/dist/src/ui/hooks/useTurnDiffs.js +130 -0
- package/dist/src/ui/hooks/useTurnDiffs.js.map +1 -0
- package/dist/src/ui/hooks/useTurnDiffs.test.d.ts +6 -0
- package/dist/src/ui/hooks/useTurnDiffs.test.js +164 -0
- package/dist/src/ui/hooks/useTurnDiffs.test.js.map +1 -0
- package/dist/src/ui/hooks/useWelcomeBack.d.ts +23 -0
- package/dist/src/ui/hooks/useWelcomeBack.js +99 -0
- package/dist/src/ui/hooks/useWelcomeBack.js.map +1 -0
- package/dist/src/ui/hooks/useWelcomeBack.test.d.ts +6 -0
- package/dist/src/ui/hooks/useWelcomeBack.test.js +94 -0
- package/dist/src/ui/hooks/useWelcomeBack.test.js.map +1 -0
- package/dist/src/ui/hooks/useWorktreeSession.d.ts +26 -0
- package/dist/src/ui/hooks/useWorktreeSession.js +92 -0
- package/dist/src/ui/hooks/useWorktreeSession.js.map +1 -0
- package/dist/src/ui/hooks/useWorktreeSession.test.d.ts +6 -0
- package/dist/src/ui/hooks/useWorktreeSession.test.js +84 -0
- package/dist/src/ui/hooks/useWorktreeSession.test.js.map +1 -0
- package/dist/src/ui/hooks/vim.d.ts +13 -0
- package/dist/src/ui/hooks/vim.js +1637 -0
- package/dist/src/ui/hooks/vim.js.map +1 -0
- package/dist/src/ui/hooks/vim.test.d.ts +6 -0
- package/dist/src/ui/hooks/vim.test.js +1975 -0
- package/dist/src/ui/hooks/vim.test.js.map +1 -0
- package/dist/src/ui/keyMatchers.d.ts +27 -0
- package/dist/src/ui/keyMatchers.js +71 -0
- package/dist/src/ui/keyMatchers.js.map +1 -0
- package/dist/src/ui/keyMatchers.test.d.ts +6 -0
- package/dist/src/ui/keyMatchers.test.js +421 -0
- package/dist/src/ui/keyMatchers.test.js.map +1 -0
- package/dist/src/ui/layouts/DefaultAppLayout.d.ts +7 -0
- package/dist/src/ui/layouts/DefaultAppLayout.js +49 -0
- package/dist/src/ui/layouts/DefaultAppLayout.js.map +1 -0
- package/dist/src/ui/layouts/DefaultAppLayout.test.d.ts +6 -0
- package/dist/src/ui/layouts/DefaultAppLayout.test.js +185 -0
- package/dist/src/ui/layouts/DefaultAppLayout.test.js.map +1 -0
- package/dist/src/ui/layouts/ScreenReaderAppLayout.d.ts +7 -0
- package/dist/src/ui/layouts/ScreenReaderAppLayout.js +27 -0
- package/dist/src/ui/layouts/ScreenReaderAppLayout.js.map +1 -0
- package/dist/src/ui/layouts/ScreenReaderAppLayout.test.d.ts +6 -0
- package/dist/src/ui/layouts/ScreenReaderAppLayout.test.js +135 -0
- package/dist/src/ui/layouts/ScreenReaderAppLayout.test.js.map +1 -0
- package/dist/src/ui/models/availableModels.d.ts +30 -0
- package/dist/src/ui/models/availableModels.js +103 -0
- package/dist/src/ui/models/availableModels.js.map +1 -0
- package/dist/src/ui/models/availableModels.test.d.ts +6 -0
- package/dist/src/ui/models/availableModels.test.js +142 -0
- package/dist/src/ui/models/availableModels.test.js.map +1 -0
- package/dist/src/ui/noninteractive/nonInteractiveUi.d.ts +12 -0
- package/dist/src/ui/noninteractive/nonInteractiveUi.js +33 -0
- package/dist/src/ui/noninteractive/nonInteractiveUi.js.map +1 -0
- package/dist/src/ui/semantic-colors.d.ts +7 -0
- package/dist/src/ui/semantic-colors.js +24 -0
- package/dist/src/ui/semantic-colors.js.map +1 -0
- package/dist/src/ui/state/extensions.d.ts +43 -0
- package/dist/src/ui/state/extensions.js +63 -0
- package/dist/src/ui/state/extensions.js.map +1 -0
- package/dist/src/ui/statusLinePresets.d.ts +79 -0
- package/dist/src/ui/statusLinePresets.js +310 -0
- package/dist/src/ui/statusLinePresets.js.map +1 -0
- package/dist/src/ui/statusLinePresets.test.d.ts +6 -0
- package/dist/src/ui/statusLinePresets.test.js +221 -0
- package/dist/src/ui/statusLinePresets.test.js.map +1 -0
- package/dist/src/ui/textConstants.d.ts +9 -0
- package/dist/src/ui/textConstants.js +10 -0
- package/dist/src/ui/textConstants.js.map +1 -0
- package/dist/src/ui/themes/ansi-light.d.ts +7 -0
- package/dist/src/ui/themes/ansi-light.js +144 -0
- package/dist/src/ui/themes/ansi-light.js.map +1 -0
- package/dist/src/ui/themes/ansi.d.ts +7 -0
- package/dist/src/ui/themes/ansi.js +154 -0
- package/dist/src/ui/themes/ansi.js.map +1 -0
- package/dist/src/ui/themes/atom-one-dark.d.ts +7 -0
- package/dist/src/ui/themes/atom-one-dark.js +140 -0
- package/dist/src/ui/themes/atom-one-dark.js.map +1 -0
- package/dist/src/ui/themes/ayu-light.d.ts +7 -0
- package/dist/src/ui/themes/ayu-light.js +132 -0
- package/dist/src/ui/themes/ayu-light.js.map +1 -0
- package/dist/src/ui/themes/ayu.d.ts +7 -0
- package/dist/src/ui/themes/ayu.js +106 -0
- package/dist/src/ui/themes/ayu.js.map +1 -0
- package/dist/src/ui/themes/color-utils.d.ts +21 -0
- package/dist/src/ui/themes/color-utils.js +223 -0
- package/dist/src/ui/themes/color-utils.js.map +1 -0
- package/dist/src/ui/themes/color-utils.test.d.ts +6 -0
- package/dist/src/ui/themes/color-utils.test.js +197 -0
- package/dist/src/ui/themes/color-utils.test.js.map +1 -0
- package/dist/src/ui/themes/default-light.d.ts +7 -0
- package/dist/src/ui/themes/default-light.js +100 -0
- package/dist/src/ui/themes/default-light.js.map +1 -0
- package/dist/src/ui/themes/default.d.ts +7 -0
- package/dist/src/ui/themes/default.js +143 -0
- package/dist/src/ui/themes/default.js.map +1 -0
- package/dist/src/ui/themes/detect-terminal-theme.d.ts +75 -0
- package/dist/src/ui/themes/detect-terminal-theme.js +228 -0
- package/dist/src/ui/themes/detect-terminal-theme.js.map +1 -0
- package/dist/src/ui/themes/detect-terminal-theme.test.d.ts +6 -0
- package/dist/src/ui/themes/detect-terminal-theme.test.js +269 -0
- package/dist/src/ui/themes/detect-terminal-theme.test.js.map +1 -0
- package/dist/src/ui/themes/dracula.d.ts +7 -0
- package/dist/src/ui/themes/dracula.js +117 -0
- package/dist/src/ui/themes/dracula.js.map +1 -0
- package/dist/src/ui/themes/github-dark.d.ts +7 -0
- package/dist/src/ui/themes/github-dark.js +140 -0
- package/dist/src/ui/themes/github-dark.js.map +1 -0
- package/dist/src/ui/themes/github-light.d.ts +7 -0
- package/dist/src/ui/themes/github-light.js +142 -0
- package/dist/src/ui/themes/github-light.js.map +1 -0
- package/dist/src/ui/themes/googlecode.d.ts +7 -0
- package/dist/src/ui/themes/googlecode.js +139 -0
- package/dist/src/ui/themes/googlecode.js.map +1 -0
- package/dist/src/ui/themes/no-color.d.ts +7 -0
- package/dist/src/ui/themes/no-color.js +120 -0
- package/dist/src/ui/themes/no-color.js.map +1 -0
- package/dist/src/ui/themes/qwen-dark.d.ts +7 -0
- package/dist/src/ui/themes/qwen-dark.js +107 -0
- package/dist/src/ui/themes/qwen-dark.js.map +1 -0
- package/dist/src/ui/themes/qwen-light.d.ts +7 -0
- package/dist/src/ui/themes/qwen-light.js +133 -0
- package/dist/src/ui/themes/qwen-light.js.map +1 -0
- package/dist/src/ui/themes/semantic-tokens.d.ts +40 -0
- package/dist/src/ui/themes/semantic-tokens.js +103 -0
- package/dist/src/ui/themes/semantic-tokens.js.map +1 -0
- package/dist/src/ui/themes/shades-of-purple.d.ts +11 -0
- package/dist/src/ui/themes/shades-of-purple.js +306 -0
- package/dist/src/ui/themes/shades-of-purple.js.map +1 -0
- package/dist/src/ui/themes/theme-manager.d.ts +91 -0
- package/dist/src/ui/themes/theme-manager.js +311 -0
- package/dist/src/ui/themes/theme-manager.js.map +1 -0
- package/dist/src/ui/themes/theme-manager.test.d.ts +6 -0
- package/dist/src/ui/themes/theme-manager.test.js +188 -0
- package/dist/src/ui/themes/theme-manager.test.js.map +1 -0
- package/dist/src/ui/themes/theme.d.ts +137 -0
- package/dist/src/ui/themes/theme.js +393 -0
- package/dist/src/ui/themes/theme.js.map +1 -0
- package/dist/src/ui/themes/xcode.d.ts +7 -0
- package/dist/src/ui/themes/xcode.js +147 -0
- package/dist/src/ui/themes/xcode.js.map +1 -0
- package/dist/src/ui/types.d.ts +620 -0
- package/dist/src/ui/types.js +77 -0
- package/dist/src/ui/types.js.map +1 -0
- package/dist/src/ui/utils/CodeColorizer.d.ts +18 -0
- package/dist/src/ui/utils/CodeColorizer.js +155 -0
- package/dist/src/ui/utils/CodeColorizer.js.map +1 -0
- package/dist/src/ui/utils/InlineMarkdownRenderer.d.ts +18 -0
- package/dist/src/ui/utils/InlineMarkdownRenderer.js +173 -0
- package/dist/src/ui/utils/InlineMarkdownRenderer.js.map +1 -0
- package/dist/src/ui/utils/InlineMarkdownRenderer.test.d.ts +6 -0
- package/dist/src/ui/utils/InlineMarkdownRenderer.test.js +303 -0
- package/dist/src/ui/utils/InlineMarkdownRenderer.test.js.map +1 -0
- package/dist/src/ui/utils/MarkdownDisplay.d.ts +25 -0
- package/dist/src/ui/utils/MarkdownDisplay.js +420 -0
- package/dist/src/ui/utils/MarkdownDisplay.js.map +1 -0
- package/dist/src/ui/utils/MarkdownDisplay.test.d.ts +6 -0
- package/dist/src/ui/utils/MarkdownDisplay.test.js +702 -0
- package/dist/src/ui/utils/MarkdownDisplay.test.js.map +1 -0
- package/dist/src/ui/utils/MermaidDiagram.d.ts +15 -0
- package/dist/src/ui/utils/MermaidDiagram.js +88 -0
- package/dist/src/ui/utils/MermaidDiagram.js.map +1 -0
- package/dist/src/ui/utils/MermaidDiagram.test.d.ts +6 -0
- package/dist/src/ui/utils/MermaidDiagram.test.js +90 -0
- package/dist/src/ui/utils/MermaidDiagram.test.js.map +1 -0
- package/dist/src/ui/utils/TableRenderer.d.ts +30 -0
- package/dist/src/ui/utils/TableRenderer.js +563 -0
- package/dist/src/ui/utils/TableRenderer.js.map +1 -0
- package/dist/src/ui/utils/TableRenderer.test.d.ts +6 -0
- package/dist/src/ui/utils/TableRenderer.test.js +568 -0
- package/dist/src/ui/utils/TableRenderer.test.js.map +1 -0
- package/dist/src/ui/utils/approvalModeDisplay.d.ts +8 -0
- package/dist/src/ui/utils/approvalModeDisplay.js +34 -0
- package/dist/src/ui/utils/approvalModeDisplay.js.map +1 -0
- package/dist/src/ui/utils/approvalModeDisplay.test.d.ts +6 -0
- package/dist/src/ui/utils/approvalModeDisplay.test.js +35 -0
- package/dist/src/ui/utils/approvalModeDisplay.test.js.map +1 -0
- package/dist/src/ui/utils/asciiCharts.d.ts +44 -0
- package/dist/src/ui/utils/asciiCharts.js +307 -0
- package/dist/src/ui/utils/asciiCharts.js.map +1 -0
- package/dist/src/ui/utils/asciiCharts.test.d.ts +6 -0
- package/dist/src/ui/utils/asciiCharts.test.js +208 -0
- package/dist/src/ui/utils/asciiCharts.test.js.map +1 -0
- package/dist/src/ui/utils/backgroundWorkUtils.d.ts +8 -0
- package/dist/src/ui/utils/backgroundWorkUtils.js +16 -0
- package/dist/src/ui/utils/backgroundWorkUtils.js.map +1 -0
- package/dist/src/ui/utils/backgroundWorkUtils.test.d.ts +6 -0
- package/dist/src/ui/utils/backgroundWorkUtils.test.js +85 -0
- package/dist/src/ui/utils/backgroundWorkUtils.test.js.map +1 -0
- package/dist/src/ui/utils/clipboardUtils.d.ts +28 -0
- package/dist/src/ui/utils/clipboardUtils.js +522 -0
- package/dist/src/ui/utils/clipboardUtils.js.map +1 -0
- package/dist/src/ui/utils/clipboardUtils.test.d.ts +6 -0
- package/dist/src/ui/utils/clipboardUtils.test.js +465 -0
- package/dist/src/ui/utils/clipboardUtils.test.js.map +1 -0
- package/dist/src/ui/utils/commandUtils.d.ts +112 -0
- package/dist/src/ui/utils/commandUtils.js +285 -0
- package/dist/src/ui/utils/commandUtils.js.map +1 -0
- package/dist/src/ui/utils/commandUtils.test.d.ts +6 -0
- package/dist/src/ui/utils/commandUtils.test.js +560 -0
- package/dist/src/ui/utils/commandUtils.test.js.map +1 -0
- package/dist/src/ui/utils/computeStats.d.ts +10 -0
- package/dist/src/ui/utils/computeStats.js +57 -0
- package/dist/src/ui/utils/computeStats.js.map +1 -0
- package/dist/src/ui/utils/customBanner.d.ts +35 -0
- package/dist/src/ui/utils/customBanner.js +361 -0
- package/dist/src/ui/utils/customBanner.js.map +1 -0
- package/dist/src/ui/utils/customBanner.test.d.ts +6 -0
- package/dist/src/ui/utils/customBanner.test.js +439 -0
- package/dist/src/ui/utils/customBanner.test.js.map +1 -0
- package/dist/src/ui/utils/displayUtils.d.ts +25 -0
- package/dist/src/ui/utils/displayUtils.js +46 -0
- package/dist/src/ui/utils/displayUtils.js.map +1 -0
- package/dist/src/ui/utils/displayUtils.test.d.ts +6 -0
- package/dist/src/ui/utils/displayUtils.test.js +61 -0
- package/dist/src/ui/utils/displayUtils.test.js.map +1 -0
- package/dist/src/ui/utils/export/collect.d.ts +16 -0
- package/dist/src/ui/utils/export/collect.js +509 -0
- package/dist/src/ui/utils/export/collect.js.map +1 -0
- package/dist/src/ui/utils/export/collect.test.d.ts +6 -0
- package/dist/src/ui/utils/export/collect.test.js +80 -0
- package/dist/src/ui/utils/export/collect.test.js.map +1 -0
- package/dist/src/ui/utils/export/formatters/html.d.ts +23 -0
- package/dist/src/ui/utils/export/formatters/html.js +65 -0
- package/dist/src/ui/utils/export/formatters/html.js.map +1 -0
- package/dist/src/ui/utils/export/formatters/json.d.ts +11 -0
- package/dist/src/ui/utils/export/formatters/json.js +13 -0
- package/dist/src/ui/utils/export/formatters/json.js.map +1 -0
- package/dist/src/ui/utils/export/formatters/jsonl.d.ts +11 -0
- package/dist/src/ui/utils/export/formatters/jsonl.js +69 -0
- package/dist/src/ui/utils/export/formatters/jsonl.js.map +1 -0
- package/dist/src/ui/utils/export/formatters/markdown.d.ts +10 -0
- package/dist/src/ui/utils/export/formatters/markdown.js +254 -0
- package/dist/src/ui/utils/export/formatters/markdown.js.map +1 -0
- package/dist/src/ui/utils/export/index.d.ts +13 -0
- package/dist/src/ui/utils/export/index.js +13 -0
- package/dist/src/ui/utils/export/index.js.map +1 -0
- package/dist/src/ui/utils/export/normalize.d.ts +12 -0
- package/dist/src/ui/utils/export/normalize.js +279 -0
- package/dist/src/ui/utils/export/normalize.js.map +1 -0
- package/dist/src/ui/utils/export/normalize.test.d.ts +6 -0
- package/dist/src/ui/utils/export/normalize.test.js +62 -0
- package/dist/src/ui/utils/export/normalize.test.js.map +1 -0
- package/dist/src/ui/utils/export/types.d.ts +93 -0
- package/dist/src/ui/utils/export/types.js +7 -0
- package/dist/src/ui/utils/export/types.js.map +1 -0
- package/dist/src/ui/utils/export/utils.d.ts +9 -0
- package/dist/src/ui/utils/export/utils.js +13 -0
- package/dist/src/ui/utils/export/utils.js.map +1 -0
- package/dist/src/ui/utils/formatters.d.ts +28 -0
- package/dist/src/ui/utils/formatters.js +100 -0
- package/dist/src/ui/utils/formatters.js.map +1 -0
- package/dist/src/ui/utils/formatters.test.d.ts +6 -0
- package/dist/src/ui/utils/formatters.test.js +141 -0
- package/dist/src/ui/utils/formatters.test.js.map +1 -0
- package/dist/src/ui/utils/gradientUtils.d.ts +6 -0
- package/dist/src/ui/utils/gradientUtils.js +11 -0
- package/dist/src/ui/utils/gradientUtils.js.map +1 -0
- package/dist/src/ui/utils/highlight.d.ts +12 -0
- package/dist/src/ui/utils/highlight.js +90 -0
- package/dist/src/ui/utils/highlight.js.map +1 -0
- package/dist/src/ui/utils/highlight.test.d.ts +6 -0
- package/dist/src/ui/utils/highlight.test.js +173 -0
- package/dist/src/ui/utils/highlight.test.js.map +1 -0
- package/dist/src/ui/utils/historyMapping.d.ts +44 -0
- package/dist/src/ui/utils/historyMapping.js +110 -0
- package/dist/src/ui/utils/historyMapping.js.map +1 -0
- package/dist/src/ui/utils/historyMapping.test.d.ts +6 -0
- package/dist/src/ui/utils/historyMapping.test.js +376 -0
- package/dist/src/ui/utils/historyMapping.test.js.map +1 -0
- package/dist/src/ui/utils/historyUtils.d.ts +34 -0
- package/dist/src/ui/utils/historyUtils.js +117 -0
- package/dist/src/ui/utils/historyUtils.js.map +1 -0
- package/dist/src/ui/utils/historyUtils.test.d.ts +6 -0
- package/dist/src/ui/utils/historyUtils.test.js +107 -0
- package/dist/src/ui/utils/historyUtils.test.js.map +1 -0
- package/dist/src/ui/utils/isNarrowWidth.d.ts +6 -0
- package/dist/src/ui/utils/isNarrowWidth.js +9 -0
- package/dist/src/ui/utils/isNarrowWidth.js.map +1 -0
- package/dist/src/ui/utils/kittyProtocolDetector.d.ts +19 -0
- package/dist/src/ui/utils/kittyProtocolDetector.js +115 -0
- package/dist/src/ui/utils/kittyProtocolDetector.js.map +1 -0
- package/dist/src/ui/utils/latexRenderer.d.ts +6 -0
- package/dist/src/ui/utils/latexRenderer.js +187 -0
- package/dist/src/ui/utils/latexRenderer.js.map +1 -0
- package/dist/src/ui/utils/latexRenderer.test.d.ts +6 -0
- package/dist/src/ui/utils/latexRenderer.test.js +27 -0
- package/dist/src/ui/utils/latexRenderer.test.js.map +1 -0
- package/dist/src/ui/utils/layoutUtils.d.ts +32 -0
- package/dist/src/ui/utils/layoutUtils.js +46 -0
- package/dist/src/ui/utils/layoutUtils.js.map +1 -0
- package/dist/src/ui/utils/layoutUtils.test.d.ts +6 -0
- package/dist/src/ui/utils/layoutUtils.test.js +30 -0
- package/dist/src/ui/utils/layoutUtils.test.js.map +1 -0
- package/dist/src/ui/utils/lowlightLoader.d.ts +43 -0
- package/dist/src/ui/utils/lowlightLoader.js +88 -0
- package/dist/src/ui/utils/lowlightLoader.js.map +1 -0
- package/dist/src/ui/utils/lowlightLoader.test.d.ts +6 -0
- package/dist/src/ui/utils/lowlightLoader.test.js +120 -0
- package/dist/src/ui/utils/lowlightLoader.test.js.map +1 -0
- package/dist/src/ui/utils/markdownUtilities.d.ts +6 -0
- package/dist/src/ui/utils/markdownUtilities.js +110 -0
- package/dist/src/ui/utils/markdownUtilities.js.map +1 -0
- package/dist/src/ui/utils/markdownUtilities.test.d.ts +6 -0
- package/dist/src/ui/utils/markdownUtilities.test.js +42 -0
- package/dist/src/ui/utils/markdownUtilities.test.js.map +1 -0
- package/dist/src/ui/utils/mergeCompactToolGroups.d.ts +62 -0
- package/dist/src/ui/utils/mergeCompactToolGroups.js +212 -0
- package/dist/src/ui/utils/mergeCompactToolGroups.js.map +1 -0
- package/dist/src/ui/utils/mergeCompactToolGroups.test.d.ts +6 -0
- package/dist/src/ui/utils/mergeCompactToolGroups.test.js +473 -0
- package/dist/src/ui/utils/mergeCompactToolGroups.test.js.map +1 -0
- package/dist/src/ui/utils/mermaidImageRenderer.d.ts +54 -0
- package/dist/src/ui/utils/mermaidImageRenderer.js +955 -0
- package/dist/src/ui/utils/mermaidImageRenderer.js.map +1 -0
- package/dist/src/ui/utils/mermaidImageRenderer.test.d.ts +6 -0
- package/dist/src/ui/utils/mermaidImageRenderer.test.js +528 -0
- package/dist/src/ui/utils/mermaidImageRenderer.test.js.map +1 -0
- package/dist/src/ui/utils/mermaidVisualRenderer.d.ts +12 -0
- package/dist/src/ui/utils/mermaidVisualRenderer.js +1097 -0
- package/dist/src/ui/utils/mermaidVisualRenderer.js.map +1 -0
- package/dist/src/ui/utils/mermaidVisualRenderer.test.d.ts +6 -0
- package/dist/src/ui/utils/mermaidVisualRenderer.test.js +69 -0
- package/dist/src/ui/utils/mermaidVisualRenderer.test.js.map +1 -0
- package/dist/src/ui/utils/modelsBySource.d.ts +47 -0
- package/dist/src/ui/utils/modelsBySource.js +89 -0
- package/dist/src/ui/utils/modelsBySource.js.map +1 -0
- package/dist/src/ui/utils/modelsBySource.test.d.ts +6 -0
- package/dist/src/ui/utils/modelsBySource.test.js +111 -0
- package/dist/src/ui/utils/modelsBySource.test.js.map +1 -0
- package/dist/src/ui/utils/mouse.d.ts +39 -0
- package/dist/src/ui/utils/mouse.js +169 -0
- package/dist/src/ui/utils/mouse.js.map +1 -0
- package/dist/src/ui/utils/mouse.test.d.ts +6 -0
- package/dist/src/ui/utils/mouse.test.js +117 -0
- package/dist/src/ui/utils/mouse.test.js.map +1 -0
- package/dist/src/ui/utils/osc8.d.ts +124 -0
- package/dist/src/ui/utils/osc8.js +463 -0
- package/dist/src/ui/utils/osc8.js.map +1 -0
- package/dist/src/ui/utils/osc8.test.d.ts +6 -0
- package/dist/src/ui/utils/osc8.test.js +494 -0
- package/dist/src/ui/utils/osc8.test.js.map +1 -0
- package/dist/src/ui/utils/platformConstants.d.ts +75 -0
- package/dist/src/ui/utils/platformConstants.js +78 -0
- package/dist/src/ui/utils/platformConstants.js.map +1 -0
- package/dist/src/ui/utils/restoreGoal.d.ts +47 -0
- package/dist/src/ui/utils/restoreGoal.js +124 -0
- package/dist/src/ui/utils/restoreGoal.js.map +1 -0
- package/dist/src/ui/utils/restoreGoal.test.d.ts +6 -0
- package/dist/src/ui/utils/restoreGoal.test.js +220 -0
- package/dist/src/ui/utils/restoreGoal.test.js.map +1 -0
- package/dist/src/ui/utils/resumeHistoryUtils.d.ts +22 -0
- package/dist/src/ui/utils/resumeHistoryUtils.js +410 -0
- package/dist/src/ui/utils/resumeHistoryUtils.js.map +1 -0
- package/dist/src/ui/utils/resumeHistoryUtils.test.d.ts +6 -0
- package/dist/src/ui/utils/resumeHistoryUtils.test.js +378 -0
- package/dist/src/ui/utils/resumeHistoryUtils.test.js.map +1 -0
- package/dist/src/ui/utils/sessionPickerUtils.d.ts +35 -0
- package/dist/src/ui/utils/sessionPickerUtils.js +69 -0
- package/dist/src/ui/utils/sessionPickerUtils.js.map +1 -0
- package/dist/src/ui/utils/sessionPickerUtils.test.d.ts +6 -0
- package/dist/src/ui/utils/sessionPickerUtils.test.js +79 -0
- package/dist/src/ui/utils/sessionPickerUtils.test.js.map +1 -0
- package/dist/src/ui/utils/statsDataService.d.ts +49 -0
- package/dist/src/ui/utils/statsDataService.js +221 -0
- package/dist/src/ui/utils/statsDataService.js.map +1 -0
- package/dist/src/ui/utils/statsDataService.test.d.ts +6 -0
- package/dist/src/ui/utils/statsDataService.test.js +406 -0
- package/dist/src/ui/utils/statsDataService.test.js.map +1 -0
- package/dist/src/ui/utils/synchronizedOutput.d.ts +16 -0
- package/dist/src/ui/utils/synchronizedOutput.js +88 -0
- package/dist/src/ui/utils/synchronizedOutput.js.map +1 -0
- package/dist/src/ui/utils/synchronizedOutput.test.d.ts +6 -0
- package/dist/src/ui/utils/synchronizedOutput.test.js +154 -0
- package/dist/src/ui/utils/synchronizedOutput.test.js.map +1 -0
- package/dist/src/ui/utils/terminalRedrawOptimizer.d.ts +21 -0
- package/dist/src/ui/utils/terminalRedrawOptimizer.js +108 -0
- package/dist/src/ui/utils/terminalRedrawOptimizer.js.map +1 -0
- package/dist/src/ui/utils/terminalRedrawOptimizer.test.d.ts +6 -0
- package/dist/src/ui/utils/terminalRedrawOptimizer.test.js +85 -0
- package/dist/src/ui/utils/terminalRedrawOptimizer.test.js.map +1 -0
- package/dist/src/ui/utils/terminalSetup.d.ts +30 -0
- package/dist/src/ui/utils/terminalSetup.js +310 -0
- package/dist/src/ui/utils/terminalSetup.js.map +1 -0
- package/dist/src/ui/utils/textUtils.d.ts +86 -0
- package/dist/src/ui/utils/textUtils.js +360 -0
- package/dist/src/ui/utils/textUtils.js.map +1 -0
- package/dist/src/ui/utils/textUtils.test.d.ts +6 -0
- package/dist/src/ui/utils/textUtils.test.js +269 -0
- package/dist/src/ui/utils/textUtils.test.js.map +1 -0
- package/dist/src/ui/utils/todoSnapshot.d.ts +13 -0
- package/dist/src/ui/utils/todoSnapshot.js +133 -0
- package/dist/src/ui/utils/todoSnapshot.js.map +1 -0
- package/dist/src/ui/utils/todoSnapshot.test.d.ts +6 -0
- package/dist/src/ui/utils/todoSnapshot.test.js +281 -0
- package/dist/src/ui/utils/todoSnapshot.test.js.map +1 -0
- package/dist/src/ui/utils/updateCheck.d.ts +12 -0
- package/dist/src/ui/utils/updateCheck.js +80 -0
- package/dist/src/ui/utils/updateCheck.js.map +1 -0
- package/dist/src/ui/utils/updateCheck.test.d.ts +6 -0
- package/dist/src/ui/utils/updateCheck.test.js +145 -0
- package/dist/src/ui/utils/updateCheck.test.js.map +1 -0
- package/dist/src/utils/acpModelUtils.d.ts +39 -0
- package/dist/src/utils/acpModelUtils.js +61 -0
- package/dist/src/utils/acpModelUtils.js.map +1 -0
- package/dist/src/utils/acpModelUtils.test.d.ts +6 -0
- package/dist/src/utils/acpModelUtils.test.js +31 -0
- package/dist/src/utils/acpModelUtils.test.js.map +1 -0
- package/dist/src/utils/apiPreconnect.d.ts +22 -0
- package/dist/src/utils/apiPreconnect.js +188 -0
- package/dist/src/utils/apiPreconnect.js.map +1 -0
- package/dist/src/utils/apiPreconnect.test.d.ts +6 -0
- package/dist/src/utils/apiPreconnect.test.js +252 -0
- package/dist/src/utils/apiPreconnect.test.js.map +1 -0
- package/dist/src/utils/checks.d.ts +19 -0
- package/dist/src/utils/checks.js +24 -0
- package/dist/src/utils/checks.js.map +1 -0
- package/dist/src/utils/cleanup.d.ts +23 -0
- package/dist/src/utils/cleanup.js +96 -0
- package/dist/src/utils/cleanup.js.map +1 -0
- package/dist/src/utils/commands.d.ts +20 -0
- package/dist/src/utils/commands.js +53 -0
- package/dist/src/utils/commands.js.map +1 -0
- package/dist/src/utils/commands.test.d.ts +6 -0
- package/dist/src/utils/commands.test.js +115 -0
- package/dist/src/utils/commands.test.js.map +1 -0
- package/dist/src/utils/commentJson.d.ts +25 -0
- package/dist/src/utils/commentJson.js +113 -0
- package/dist/src/utils/commentJson.js.map +1 -0
- package/dist/src/utils/commentJson.test.d.ts +6 -0
- package/dist/src/utils/commentJson.test.js +385 -0
- package/dist/src/utils/commentJson.test.js.map +1 -0
- package/dist/src/utils/costCalculator.d.ts +14 -0
- package/dist/src/utils/costCalculator.js +19 -0
- package/dist/src/utils/costCalculator.js.map +1 -0
- package/dist/src/utils/costCalculator.test.d.ts +6 -0
- package/dist/src/utils/costCalculator.test.js +177 -0
- package/dist/src/utils/costCalculator.test.js.map +1 -0
- package/dist/src/utils/cpuProfiler.d.ts +63 -0
- package/dist/src/utils/cpuProfiler.js +341 -0
- package/dist/src/utils/cpuProfiler.js.map +1 -0
- package/dist/src/utils/cpuProfiler.test.d.ts +6 -0
- package/dist/src/utils/cpuProfiler.test.js +293 -0
- package/dist/src/utils/cpuProfiler.test.js.map +1 -0
- package/dist/src/utils/deepMerge.d.ts +9 -0
- package/dist/src/utils/deepMerge.js +58 -0
- package/dist/src/utils/deepMerge.js.map +1 -0
- package/dist/src/utils/deepMerge.test.d.ts +6 -0
- package/dist/src/utils/deepMerge.test.js +143 -0
- package/dist/src/utils/deepMerge.test.js.map +1 -0
- package/dist/src/utils/dialogScopeUtils.d.ts +28 -0
- package/dist/src/utils/dialogScopeUtils.js +51 -0
- package/dist/src/utils/dialogScopeUtils.js.map +1 -0
- package/dist/src/utils/doctorChecks.d.ts +11 -0
- package/dist/src/utils/doctorChecks.js +351 -0
- package/dist/src/utils/doctorChecks.js.map +1 -0
- package/dist/src/utils/doctorChecks.test.d.ts +6 -0
- package/dist/src/utils/doctorChecks.test.js +280 -0
- package/dist/src/utils/doctorChecks.test.js.map +1 -0
- package/dist/src/utils/earlyInputCapture.d.ts +33 -0
- package/dist/src/utils/earlyInputCapture.js +311 -0
- package/dist/src/utils/earlyInputCapture.js.map +1 -0
- package/dist/src/utils/earlyInputCapture.test.d.ts +6 -0
- package/dist/src/utils/earlyInputCapture.test.js +274 -0
- package/dist/src/utils/earlyInputCapture.test.js.map +1 -0
- package/dist/src/utils/envVarResolver.d.ts +39 -0
- package/dist/src/utils/envVarResolver.js +100 -0
- package/dist/src/utils/envVarResolver.js.map +1 -0
- package/dist/src/utils/envVarResolver.test.d.ts +6 -0
- package/dist/src/utils/envVarResolver.test.js +221 -0
- package/dist/src/utils/envVarResolver.test.js.map +1 -0
- package/dist/src/utils/errors.d.ts +76 -0
- package/dist/src/utils/errors.js +237 -0
- package/dist/src/utils/errors.js.map +1 -0
- package/dist/src/utils/errors.test.d.ts +6 -0
- package/dist/src/utils/errors.test.js +536 -0
- package/dist/src/utils/errors.test.js.map +1 -0
- package/dist/src/utils/events.d.ts +13 -0
- package/dist/src/utils/events.js +15 -0
- package/dist/src/utils/events.js.map +1 -0
- package/dist/src/utils/gitUtils.d.ts +30 -0
- package/dist/src/utils/gitUtils.js +108 -0
- package/dist/src/utils/gitUtils.js.map +1 -0
- package/dist/src/utils/gitUtils.test.d.ts +6 -0
- package/dist/src/utils/gitUtils.test.js +172 -0
- package/dist/src/utils/gitUtils.test.js.map +1 -0
- package/dist/src/utils/handleAutoUpdate.d.ts +16 -0
- package/dist/src/utils/handleAutoUpdate.js +144 -0
- package/dist/src/utils/handleAutoUpdate.js.map +1 -0
- package/dist/src/utils/headlessSafetyWarnings.d.ts +21 -0
- package/dist/src/utils/headlessSafetyWarnings.js +45 -0
- package/dist/src/utils/headlessSafetyWarnings.js.map +1 -0
- package/dist/src/utils/headlessSafetyWarnings.test.d.ts +6 -0
- package/dist/src/utils/headlessSafetyWarnings.test.js +66 -0
- package/dist/src/utils/headlessSafetyWarnings.test.js.map +1 -0
- package/dist/src/utils/housekeeping/cleanup.d.ts +15 -0
- package/dist/src/utils/housekeeping/cleanup.js +69 -0
- package/dist/src/utils/housekeeping/cleanup.js.map +1 -0
- package/dist/src/utils/housekeeping/cleanup.test.d.ts +6 -0
- package/dist/src/utils/housekeeping/cleanup.test.js +166 -0
- package/dist/src/utils/housekeeping/cleanup.test.js.map +1 -0
- package/dist/src/utils/housekeeping/lastInteractionAt.d.ts +9 -0
- package/dist/src/utils/housekeeping/lastInteractionAt.js +22 -0
- package/dist/src/utils/housekeeping/lastInteractionAt.js.map +1 -0
- package/dist/src/utils/housekeeping/scheduler.d.ts +17 -0
- package/dist/src/utils/housekeeping/scheduler.js +130 -0
- package/dist/src/utils/housekeeping/scheduler.js.map +1 -0
- package/dist/src/utils/housekeeping/scheduler.test.d.ts +6 -0
- package/dist/src/utils/housekeeping/scheduler.test.js +190 -0
- package/dist/src/utils/housekeeping/scheduler.test.js.map +1 -0
- package/dist/src/utils/housekeeping/throttledOnce.d.ts +13 -0
- package/dist/src/utils/housekeeping/throttledOnce.js +110 -0
- package/dist/src/utils/housekeeping/throttledOnce.js.map +1 -0
- package/dist/src/utils/housekeeping/throttledOnce.test.d.ts +6 -0
- package/dist/src/utils/housekeeping/throttledOnce.test.js +94 -0
- package/dist/src/utils/housekeeping/throttledOnce.test.js.map +1 -0
- package/dist/src/utils/installationInfo.d.ts +26 -0
- package/dist/src/utils/installationInfo.js +266 -0
- package/dist/src/utils/installationInfo.js.map +1 -0
- package/dist/src/utils/installationInfo.test.d.ts +6 -0
- package/dist/src/utils/installationInfo.test.js +466 -0
- package/dist/src/utils/installationInfo.test.js.map +1 -0
- package/dist/src/utils/languageUtils.d.ts +40 -0
- package/dist/src/utils/languageUtils.js +163 -0
- package/dist/src/utils/languageUtils.js.map +1 -0
- package/dist/src/utils/languageUtils.test.d.ts +6 -0
- package/dist/src/utils/languageUtils.test.js +341 -0
- package/dist/src/utils/languageUtils.test.js.map +1 -0
- package/dist/src/utils/math.d.ts +13 -0
- package/dist/src/utils/math.js +14 -0
- package/dist/src/utils/math.js.map +1 -0
- package/dist/src/utils/memoryDiagnostics.d.ts +65 -0
- package/dist/src/utils/memoryDiagnostics.js +365 -0
- package/dist/src/utils/memoryDiagnostics.js.map +1 -0
- package/dist/src/utils/memoryDiagnostics.test.d.ts +6 -0
- package/dist/src/utils/memoryDiagnostics.test.js +641 -0
- package/dist/src/utils/memoryDiagnostics.test.js.map +1 -0
- package/dist/src/utils/modelConfigUtils.d.ts +55 -0
- package/dist/src/utils/modelConfigUtils.js +186 -0
- package/dist/src/utils/modelConfigUtils.js.map +1 -0
- package/dist/src/utils/modelConfigUtils.test.d.ts +6 -0
- package/dist/src/utils/modelConfigUtils.test.js +1247 -0
- package/dist/src/utils/modelConfigUtils.test.js.map +1 -0
- package/dist/src/utils/nonInteractiveHelpers.d.ts +101 -0
- package/dist/src/utils/nonInteractiveHelpers.js +479 -0
- package/dist/src/utils/nonInteractiveHelpers.js.map +1 -0
- package/dist/src/utils/nonInteractiveHelpers.test.d.ts +6 -0
- package/dist/src/utils/nonInteractiveHelpers.test.js +1038 -0
- package/dist/src/utils/nonInteractiveHelpers.test.js.map +1 -0
- package/dist/src/utils/osc.d.ts +91 -0
- package/dist/src/utils/osc.js +162 -0
- package/dist/src/utils/osc.js.map +1 -0
- package/dist/src/utils/osc.test.d.ts +6 -0
- package/dist/src/utils/osc.test.js +217 -0
- package/dist/src/utils/osc.test.js.map +1 -0
- package/dist/src/utils/package.d.ts +12 -0
- package/dist/src/utils/package.js +24 -0
- package/dist/src/utils/package.js.map +1 -0
- package/dist/src/utils/processUtils.d.ts +13 -0
- package/dist/src/utils/processUtils.js +18 -0
- package/dist/src/utils/processUtils.js.map +1 -0
- package/dist/src/utils/processUtils.test.d.ts +6 -0
- package/dist/src/utils/processUtils.test.js +20 -0
- package/dist/src/utils/processUtils.test.js.map +1 -0
- package/dist/src/utils/readStdin.d.ts +6 -0
- package/dist/src/utils/readStdin.js +60 -0
- package/dist/src/utils/readStdin.js.map +1 -0
- package/dist/src/utils/readStdin.test.d.ts +6 -0
- package/dist/src/utils/readStdin.test.js +88 -0
- package/dist/src/utils/readStdin.test.js.map +1 -0
- package/dist/src/utils/relaunch.d.ts +9 -0
- package/dist/src/utils/relaunch.js +68 -0
- package/dist/src/utils/relaunch.js.map +1 -0
- package/dist/src/utils/relaunch.test.d.ts +6 -0
- package/dist/src/utils/relaunch.test.js +291 -0
- package/dist/src/utils/relaunch.test.js.map +1 -0
- package/dist/src/utils/resolvePath.d.ts +6 -0
- package/dist/src/utils/resolvePath.js +21 -0
- package/dist/src/utils/resolvePath.js.map +1 -0
- package/dist/src/utils/runBudget.d.ts +116 -0
- package/dist/src/utils/runBudget.js +235 -0
- package/dist/src/utils/runBudget.js.map +1 -0
- package/dist/src/utils/runBudget.test.d.ts +6 -0
- package/dist/src/utils/runBudget.test.js +187 -0
- package/dist/src/utils/runBudget.test.js.map +1 -0
- package/dist/src/utils/sandbox-macos-permissive-closed.sb +33 -0
- package/dist/src/utils/sandbox-macos-permissive-open.sb +28 -0
- package/dist/src/utils/sandbox-macos-permissive-proxied.sb +38 -0
- package/dist/src/utils/sandbox-macos-restrictive-closed.sb +94 -0
- package/dist/src/utils/sandbox-macos-restrictive-open.sb +97 -0
- package/dist/src/utils/sandbox-macos-restrictive-proxied.sb +99 -0
- package/dist/src/utils/sandbox.d.ts +7 -0
- package/dist/src/utils/sandbox.js +788 -0
- package/dist/src/utils/sandbox.js.map +1 -0
- package/dist/src/utils/sessionPaths.d.ts +19 -0
- package/dist/src/utils/sessionPaths.js +141 -0
- package/dist/src/utils/sessionPaths.js.map +1 -0
- package/dist/src/utils/sessionPaths.test.d.ts +6 -0
- package/dist/src/utils/sessionPaths.test.js +249 -0
- package/dist/src/utils/sessionPaths.test.js.map +1 -0
- package/dist/src/utils/settingsUtils.d.ts +167 -0
- package/dist/src/utils/settingsUtils.js +532 -0
- package/dist/src/utils/settingsUtils.js.map +1 -0
- package/dist/src/utils/settingsUtils.test.d.ts +6 -0
- package/dist/src/utils/settingsUtils.test.js +849 -0
- package/dist/src/utils/settingsUtils.test.js.map +1 -0
- package/dist/src/utils/spawnWrapper.d.ts +7 -0
- package/dist/src/utils/spawnWrapper.js +8 -0
- package/dist/src/utils/spawnWrapper.js.map +1 -0
- package/dist/src/utils/standalone-update-verify.d.ts +12 -0
- package/dist/src/utils/standalone-update-verify.js +43 -0
- package/dist/src/utils/standalone-update-verify.js.map +1 -0
- package/dist/src/utils/standalone-update-verify.test.d.ts +6 -0
- package/dist/src/utils/standalone-update-verify.test.js +27 -0
- package/dist/src/utils/standalone-update-verify.test.js.map +1 -0
- package/dist/src/utils/standalone-update.d.ts +27 -0
- package/dist/src/utils/standalone-update.js +714 -0
- package/dist/src/utils/standalone-update.js.map +1 -0
- package/dist/src/utils/standalone-update.test.d.ts +6 -0
- package/dist/src/utils/standalone-update.test.js +301 -0
- package/dist/src/utils/standalone-update.test.js.map +1 -0
- package/dist/src/utils/startupProfiler.d.ts +90 -0
- package/dist/src/utils/startupProfiler.js +267 -0
- package/dist/src/utils/startupProfiler.js.map +1 -0
- package/dist/src/utils/startupProfiler.test.d.ts +1 -0
- package/dist/src/utils/startupProfiler.test.js +293 -0
- package/dist/src/utils/startupProfiler.test.js.map +1 -0
- package/dist/src/utils/startupWarnings.d.ts +6 -0
- package/dist/src/utils/startupWarnings.js +40 -0
- package/dist/src/utils/startupWarnings.js.map +1 -0
- package/dist/src/utils/stdioHelpers.d.ts +31 -0
- package/dist/src/utils/stdioHelpers.js +38 -0
- package/dist/src/utils/stdioHelpers.js.map +1 -0
- package/dist/src/utils/systemInfo.d.ts +78 -0
- package/dist/src/utils/systemInfo.js +208 -0
- package/dist/src/utils/systemInfo.js.map +1 -0
- package/dist/src/utils/systemInfo.test.d.ts +6 -0
- package/dist/src/utils/systemInfo.test.js +380 -0
- package/dist/src/utils/systemInfo.test.js.map +1 -0
- package/dist/src/utils/systemInfoFields.d.ts +18 -0
- package/dist/src/utils/systemInfoFields.js +102 -0
- package/dist/src/utils/systemInfoFields.js.map +1 -0
- package/dist/src/utils/systemInfoFields.test.d.ts +6 -0
- package/dist/src/utils/systemInfoFields.test.js +74 -0
- package/dist/src/utils/systemInfoFields.test.js.map +1 -0
- package/dist/src/utils/terminalSequence.d.ts +21 -0
- package/dist/src/utils/terminalSequence.js +124 -0
- package/dist/src/utils/terminalSequence.js.map +1 -0
- package/dist/src/utils/terminalSequence.test.d.ts +6 -0
- package/dist/src/utils/terminalSequence.test.js +132 -0
- package/dist/src/utils/terminalSequence.test.js.map +1 -0
- package/dist/src/utils/truncatedDiffPreview.d.ts +6 -0
- package/dist/src/utils/truncatedDiffPreview.js +18 -0
- package/dist/src/utils/truncatedDiffPreview.js.map +1 -0
- package/dist/src/utils/updateEventEmitter.d.ts +11 -0
- package/dist/src/utils/updateEventEmitter.js +12 -0
- package/dist/src/utils/updateEventEmitter.js.map +1 -0
- package/dist/src/utils/userPromptExpansionHook.d.ts +9 -0
- package/dist/src/utils/userPromptExpansionHook.js +30 -0
- package/dist/src/utils/userPromptExpansionHook.js.map +1 -0
- package/dist/src/utils/userPromptExpansionHook.test.d.ts +6 -0
- package/dist/src/utils/userPromptExpansionHook.test.js +69 -0
- package/dist/src/utils/userPromptExpansionHook.test.js.map +1 -0
- package/dist/src/utils/userStartupWarnings.d.ts +12 -0
- package/dist/src/utils/userStartupWarnings.js +74 -0
- package/dist/src/utils/userStartupWarnings.js.map +1 -0
- package/dist/src/utils/userStartupWarnings.test.d.ts +6 -0
- package/dist/src/utils/userStartupWarnings.test.js +88 -0
- package/dist/src/utils/userStartupWarnings.test.js.map +1 -0
- package/dist/src/utils/version.d.ts +6 -0
- package/dist/src/utils/version.js +11 -0
- package/dist/src/utils/version.js.map +1 -0
- package/dist/src/utils/warningHandler.d.ts +29 -0
- package/dist/src/utils/warningHandler.js +100 -0
- package/dist/src/utils/warningHandler.js.map +1 -0
- package/dist/src/utils/warningHandler.test.d.ts +6 -0
- package/dist/src/utils/warningHandler.test.js +185 -0
- package/dist/src/utils/warningHandler.test.js.map +1 -0
- package/dist/src/utils/windowTitle.d.ts +12 -0
- package/dist/src/utils/windowTitle.js +19 -0
- package/dist/src/utils/windowTitle.js.map +1 -0
- package/dist/src/utils/windowTitle.test.d.ts +6 -0
- package/dist/src/utils/windowTitle.test.js +49 -0
- package/dist/src/utils/windowTitle.test.js.map +1 -0
- package/dist/src/utils/writeWithBackup.d.ts +49 -0
- package/dist/src/utils/writeWithBackup.js +136 -0
- package/dist/src/utils/writeWithBackup.js.map +1 -0
- package/dist/src/utils/writeWithBackup.test.d.ts +6 -0
- package/dist/src/utils/writeWithBackup.test.js +177 -0
- package/dist/src/utils/writeWithBackup.test.js.map +1 -0
- package/dist/src/validateNonInterActiveAuth.d.ts +8 -0
- package/dist/src/validateNonInterActiveAuth.js +66 -0
- package/dist/src/validateNonInterActiveAuth.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +121 -0
|
@@ -0,0 +1,3646 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Qwen Team
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { APPROVAL_MODE_INFO, APPROVAL_MODES, AuthType, ALL_PROVIDERS, applyProviderInstallPlan, buildInstallPlan, clearCachedCredentialFile, createDebugLogger, findProviderById, getAllGeminiMdFilenames, getAutoMemoryRoot, getDefaultBaseUrlForProtocol, getDefaultModelIds, getScopedEnvContents, QwenOAuth2Event, qwenOAuth2Events, resolveBaseUrl, MCP_BUDGET_WARN_FRACTION, MCPServerConfig, SessionService, SESSION_TITLE_MAX_LENGTH, Storage, tokenLimit, getMCPDiscoveryState, getMCPServerStatus, MCPDiscoveryState, MCPServerStatus, resolveOwnsModel, ExtensionManager, ExtensionSettingScope, HookEventName, updateSetting, SessionEndReason, restoreWorktreeContext, } from '@tulex-cli/tulex-cli-core';
|
|
7
|
+
import { AgentSideConnection, RequestError, ndJsonStream, PROTOCOL_VERSION, } from '@agentclientprotocol/sdk';
|
|
8
|
+
import { buildAuthMethods, pickAuthMethodsForAuthRequired, } from './authMethods.js';
|
|
9
|
+
import { AcpFileSystemService } from './service/filesystem.js';
|
|
10
|
+
import { Readable, Writable } from 'node:stream';
|
|
11
|
+
import { pipeline } from 'node:stream/promises';
|
|
12
|
+
import * as fs from 'node:fs/promises';
|
|
13
|
+
import * as path from 'node:path';
|
|
14
|
+
import { createGunzip } from 'node:zlib';
|
|
15
|
+
import { loadSettings, SettingScope } from '../config/settings.js';
|
|
16
|
+
import { createLoadedSettingsAdapter } from '../config/loadedSettingsAdapter.js';
|
|
17
|
+
import { z } from 'zod';
|
|
18
|
+
import { buildDisabledSkillNamesProvider, loadCliConfig, } from '../config/config.js';
|
|
19
|
+
import { Session, buildAvailableCommandsSnapshot } from './session/Session.js';
|
|
20
|
+
import { HistoryReplayer } from './session/HistoryReplayer.js';
|
|
21
|
+
import { formatAcpModelId, parseAcpBaseModelId, } from '../utils/acpModelUtils.js';
|
|
22
|
+
import { updateOutputLanguageFile } from '../utils/languageUtils.js';
|
|
23
|
+
import { runWithAcpRuntimeOutputDir } from './runtimeOutputDirContext.js';
|
|
24
|
+
import { runExitCleanup } from '../utils/cleanup.js';
|
|
25
|
+
import { isWorkspaceTrusted } from '../config/trustedFolders.js';
|
|
26
|
+
import { ACP_PREFLIGHT_KINDS, STATUS_SCHEMA_VERSION, SERVE_CONTROL_EXT_METHODS, SERVE_STATUS_EXT_METHODS, mapDomainErrorToErrorKind, } from '../serve/status.js';
|
|
27
|
+
const debugLogger = createDebugLogger('ACP_AGENT');
|
|
28
|
+
/**
|
|
29
|
+
* Env-var candidates per auth method, used by `buildAuthPreflightCell` for
|
|
30
|
+
* a side-effect-free presence check. Mirrors `AUTH_ENV_MAPPINGS` from
|
|
31
|
+
* `core/src/models/constants.ts` (which isn't on the public package
|
|
32
|
+
* surface). Keep in sync if a new provider is added there. Any auth method
|
|
33
|
+
* not listed here surfaces as `status: 'unknown'` on the cell rather than
|
|
34
|
+
* a false `auth_env_error` — full validation happens at session start.
|
|
35
|
+
*
|
|
36
|
+
* Drift detection: `AUTH_PREFLIGHT_AUDITED_AUTH_TYPES` below lists every
|
|
37
|
+
* `AuthType` enum value that has been triaged for this map (either keyed
|
|
38
|
+
* here, or explicitly waived for non-env-based auth like qwen-oauth). The
|
|
39
|
+
* paired test `AUTH_PREFLIGHT_AUDITED_AUTH_TYPES covers every AuthType`
|
|
40
|
+
* walks the public enum and fails CI when core adds a new auth method
|
|
41
|
+
* without a deliberate decision here.
|
|
42
|
+
*/
|
|
43
|
+
export const AUTH_PREFLIGHT_ENV_KEYS = {
|
|
44
|
+
openai: ['OPENAI_API_KEY'],
|
|
45
|
+
anthropic: ['ANTHROPIC_API_KEY'],
|
|
46
|
+
gemini: ['GEMINI_API_KEY'],
|
|
47
|
+
'vertex-ai': ['GOOGLE_API_KEY'],
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Auth methods deliberately not env-keyed (e.g. OAuth-based, credential
|
|
51
|
+
* file). Listed here so the drift test recognizes them as triaged-but-
|
|
52
|
+
* waived rather than a missing entry.
|
|
53
|
+
*/
|
|
54
|
+
export const AUTH_PREFLIGHT_WAIVED_AUTH_TYPES = new Set([
|
|
55
|
+
'qwen-oauth',
|
|
56
|
+
]);
|
|
57
|
+
const PERMISSION_RULE_TYPES = ['allow', 'ask', 'deny'];
|
|
58
|
+
function readPermissionRuleSet(settings) {
|
|
59
|
+
const permissions = settings && typeof settings === 'object'
|
|
60
|
+
? settings.permissions
|
|
61
|
+
: undefined;
|
|
62
|
+
const readRules = (type) => {
|
|
63
|
+
const value = permissions?.[type];
|
|
64
|
+
return Array.isArray(value)
|
|
65
|
+
? value.filter((item) => typeof item === 'string')
|
|
66
|
+
: [];
|
|
67
|
+
};
|
|
68
|
+
return {
|
|
69
|
+
allow: readRules('allow'),
|
|
70
|
+
ask: readRules('ask'),
|
|
71
|
+
deny: readRules('deny'),
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
function normalizePermissionRules(value) {
|
|
75
|
+
if (!Array.isArray(value)) {
|
|
76
|
+
throw RequestError.invalidParams(undefined, 'rules must be an array');
|
|
77
|
+
}
|
|
78
|
+
return Array.from(new Set(value.map((item) => {
|
|
79
|
+
if (typeof item !== 'string' || !item.trim()) {
|
|
80
|
+
throw RequestError.invalidParams(undefined, 'rules must contain only non-empty strings');
|
|
81
|
+
}
|
|
82
|
+
return item.trim();
|
|
83
|
+
})));
|
|
84
|
+
}
|
|
85
|
+
const PROJECT_SKILL_DIRS = ['.qwen', '.agents'];
|
|
86
|
+
const SKILLS_DIR = 'skills';
|
|
87
|
+
const QWEN_CORE_SETTING_DEFINITIONS = {
|
|
88
|
+
'model.name': { type: 'string' },
|
|
89
|
+
fastModel: { type: 'string' },
|
|
90
|
+
'general.outputLanguage': { type: 'string' },
|
|
91
|
+
'general.language': { type: 'string' },
|
|
92
|
+
'tools.approvalMode': {
|
|
93
|
+
type: 'enum',
|
|
94
|
+
values: ['plan', 'default', 'auto-edit', 'auto', 'yolo'],
|
|
95
|
+
},
|
|
96
|
+
'general.vimMode': { type: 'boolean' },
|
|
97
|
+
'general.enableAutoUpdate': { type: 'boolean' },
|
|
98
|
+
'general.showSessionRecap': { type: 'boolean' },
|
|
99
|
+
'general.sessionRecapAwayThresholdMinutes': { type: 'number', min: 1 },
|
|
100
|
+
'general.terminalBell': { type: 'boolean' },
|
|
101
|
+
'general.gitCoAuthor.commit': { type: 'boolean' },
|
|
102
|
+
'general.gitCoAuthor.pr': { type: 'boolean' },
|
|
103
|
+
'general.defaultFileEncoding': {
|
|
104
|
+
type: 'enum',
|
|
105
|
+
values: ['utf-8', 'utf-8-bom'],
|
|
106
|
+
},
|
|
107
|
+
'context.fileFiltering.respectGitIgnore': { type: 'boolean' },
|
|
108
|
+
'context.fileFiltering.respectQwenIgnore': { type: 'boolean' },
|
|
109
|
+
'context.fileFiltering.enableFuzzySearch': { type: 'boolean' },
|
|
110
|
+
'memory.enableManagedAutoMemory': { type: 'boolean' },
|
|
111
|
+
'memory.enableManagedAutoDream': { type: 'boolean' },
|
|
112
|
+
'memory.enableAutoSkill': { type: 'boolean' },
|
|
113
|
+
disableAllHooks: { type: 'boolean' },
|
|
114
|
+
};
|
|
115
|
+
const QWEN_CORE_SETTING_KEYS = Object.keys(QWEN_CORE_SETTING_DEFINITIONS);
|
|
116
|
+
const QWEN_HOOK_EVENTS = Object.values(HookEventName);
|
|
117
|
+
const DEFAULT_QWEN_MEMORY_SETTINGS = {
|
|
118
|
+
enableManagedAutoMemory: true,
|
|
119
|
+
enableManagedAutoDream: true,
|
|
120
|
+
enableAutoSkill: true,
|
|
121
|
+
};
|
|
122
|
+
const QWEN_MEMORY_SETTING_KEYS = [
|
|
123
|
+
'enableManagedAutoMemory',
|
|
124
|
+
'enableManagedAutoDream',
|
|
125
|
+
'enableAutoSkill',
|
|
126
|
+
];
|
|
127
|
+
function normalizeQwenMemorySettings(value) {
|
|
128
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
129
|
+
return { ...DEFAULT_QWEN_MEMORY_SETTINGS };
|
|
130
|
+
}
|
|
131
|
+
const record = value;
|
|
132
|
+
return {
|
|
133
|
+
enableManagedAutoMemory: typeof record['enableManagedAutoMemory'] === 'boolean'
|
|
134
|
+
? record['enableManagedAutoMemory']
|
|
135
|
+
: DEFAULT_QWEN_MEMORY_SETTINGS.enableManagedAutoMemory,
|
|
136
|
+
enableManagedAutoDream: typeof record['enableManagedAutoDream'] === 'boolean'
|
|
137
|
+
? record['enableManagedAutoDream']
|
|
138
|
+
: DEFAULT_QWEN_MEMORY_SETTINGS.enableManagedAutoDream,
|
|
139
|
+
enableAutoSkill: typeof record['enableAutoSkill'] === 'boolean'
|
|
140
|
+
? record['enableAutoSkill']
|
|
141
|
+
: DEFAULT_QWEN_MEMORY_SETTINGS.enableAutoSkill,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
function toRecord(value) {
|
|
145
|
+
return !!value && typeof value === 'object' && !Array.isArray(value)
|
|
146
|
+
? value
|
|
147
|
+
: {};
|
|
148
|
+
}
|
|
149
|
+
function readOptionalString(value, fieldName) {
|
|
150
|
+
if (value === undefined || value === null)
|
|
151
|
+
return undefined;
|
|
152
|
+
if (typeof value !== 'string') {
|
|
153
|
+
throw RequestError.invalidParams(undefined, `Invalid ${fieldName}: expected string`);
|
|
154
|
+
}
|
|
155
|
+
const trimmed = value.trim();
|
|
156
|
+
return trimmed.length > 0 ? trimmed : undefined;
|
|
157
|
+
}
|
|
158
|
+
function readRequiredString(value, fieldName) {
|
|
159
|
+
const stringValue = readOptionalString(value, fieldName);
|
|
160
|
+
if (!stringValue) {
|
|
161
|
+
throw RequestError.invalidParams(undefined, `Invalid or missing ${fieldName}`);
|
|
162
|
+
}
|
|
163
|
+
return stringValue;
|
|
164
|
+
}
|
|
165
|
+
// Skill slugs are used to build filesystem paths under `<globalQwenDir>/skills`.
|
|
166
|
+
// The character allowlist below already excludes `/` and `\`, but `.` and `..`
|
|
167
|
+
// would still slip through and let `path.join` traverse out of the skills dir
|
|
168
|
+
// (e.g. slug `..` resolves to the global config dir). Reject them explicitly.
|
|
169
|
+
function validateSkillSlug(slug) {
|
|
170
|
+
if (!slug ||
|
|
171
|
+
slug === '.' ||
|
|
172
|
+
slug === '..' ||
|
|
173
|
+
slug.includes('/') ||
|
|
174
|
+
slug.includes(path.sep) ||
|
|
175
|
+
!/^[a-zA-Z0-9._-]+$/.test(slug)) {
|
|
176
|
+
throw RequestError.invalidParams(undefined, 'Invalid skill.slug');
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
function readSkillInstallRequest(params) {
|
|
180
|
+
const skillParams = toRecord(params['skill']);
|
|
181
|
+
const input = Object.keys(skillParams).length > 0 ? skillParams : params;
|
|
182
|
+
const slug = readRequiredString(input['slug'], 'skill.slug');
|
|
183
|
+
validateSkillSlug(slug);
|
|
184
|
+
const scope = readOptionalString(input['scope'], 'skill.scope') ?? 'global';
|
|
185
|
+
if (scope !== 'global') {
|
|
186
|
+
throw RequestError.invalidParams(undefined, 'Only global skill installation is supported');
|
|
187
|
+
}
|
|
188
|
+
const description = readOptionalString(input['description'], 'skill.description');
|
|
189
|
+
return {
|
|
190
|
+
id: readOptionalString(input['id'], 'skill.id') ?? slug,
|
|
191
|
+
slug,
|
|
192
|
+
name: readOptionalString(input['name'], 'skill.name') ?? slug,
|
|
193
|
+
...(description ? { description } : {}),
|
|
194
|
+
sourceUrl: readRequiredString(input['sourceUrl'], 'skill.sourceUrl'),
|
|
195
|
+
scope,
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
function readSkillSlugRequest(params) {
|
|
199
|
+
const skillParams = toRecord(params['skill']);
|
|
200
|
+
const input = Object.keys(skillParams).length > 0 ? skillParams : params;
|
|
201
|
+
const slug = readRequiredString(input['slug'], 'skill.slug');
|
|
202
|
+
validateSkillSlug(slug);
|
|
203
|
+
const scope = readOptionalString(input['scope'], 'skill.scope') ?? 'global';
|
|
204
|
+
if (scope !== 'global') {
|
|
205
|
+
throw RequestError.invalidParams(undefined, 'Only global skill management is supported');
|
|
206
|
+
}
|
|
207
|
+
return { slug, scope };
|
|
208
|
+
}
|
|
209
|
+
function readSkillSetEnabledRequest(params) {
|
|
210
|
+
const skillParams = toRecord(params['skill']);
|
|
211
|
+
const input = Object.keys(skillParams).length > 0 ? skillParams : params;
|
|
212
|
+
const slug = readRequiredString(input['slug'], 'skill.slug');
|
|
213
|
+
validateSkillSlug(slug);
|
|
214
|
+
const scope = readOptionalString(input['scope'], 'skill.scope') ?? 'global';
|
|
215
|
+
if (scope !== 'global' && scope !== 'project') {
|
|
216
|
+
throw RequestError.invalidParams(undefined, 'Only global or project skill management is supported');
|
|
217
|
+
}
|
|
218
|
+
if (typeof input['enabled'] !== 'boolean') {
|
|
219
|
+
throw RequestError.invalidParams(undefined, 'Invalid skill.enabled: expected boolean');
|
|
220
|
+
}
|
|
221
|
+
return {
|
|
222
|
+
slug,
|
|
223
|
+
scope,
|
|
224
|
+
enabled: input['enabled'],
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
function splitSkillMarkdown(content) {
|
|
228
|
+
const normalized = content.replace(/^\uFEFF/, '').replace(/\r\n?/g, '\n');
|
|
229
|
+
const match = normalized.match(/^---\n([\s\S]*?)\n---(?:\n|$)([\s\S]*)$/);
|
|
230
|
+
if (!match) {
|
|
231
|
+
throw RequestError.invalidParams(undefined, 'Invalid skill file: missing YAML frontmatter');
|
|
232
|
+
}
|
|
233
|
+
return {
|
|
234
|
+
frontmatter: match[1],
|
|
235
|
+
body: match[2],
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
function setSkillFrontmatterEnabled(content, enabled) {
|
|
239
|
+
const { frontmatter, body } = splitSkillMarkdown(content);
|
|
240
|
+
// Surgically add/remove only the top-level `disable-model-invocation:` line
|
|
241
|
+
// instead of round-tripping the whole frontmatter through a YAML
|
|
242
|
+
// parse/stringify. The minimal core YAML serializer drops comments and
|
|
243
|
+
// flattens nested structures (e.g. `hooks:`), so reserializing here would
|
|
244
|
+
// corrupt hooks-bearing skills and strip user comments. Working on the raw
|
|
245
|
+
// text leaves every other byte untouched.
|
|
246
|
+
const lines = frontmatter.split('\n');
|
|
247
|
+
const disabledLineIndex = lines.findIndex((line) => /^disable-model-invocation\s*:/.test(line));
|
|
248
|
+
if (enabled) {
|
|
249
|
+
if (disabledLineIndex !== -1) {
|
|
250
|
+
lines.splice(disabledLineIndex, 1);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
else if (disabledLineIndex !== -1) {
|
|
254
|
+
lines[disabledLineIndex] = 'disable-model-invocation: true';
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
let insertIndex = lines.length;
|
|
258
|
+
while (insertIndex > 0 && lines[insertIndex - 1].trim() === '') {
|
|
259
|
+
insertIndex -= 1;
|
|
260
|
+
}
|
|
261
|
+
lines.splice(insertIndex, 0, 'disable-model-invocation: true');
|
|
262
|
+
}
|
|
263
|
+
const nextFrontmatter = lines.join('\n');
|
|
264
|
+
return `---\n${nextFrontmatter}\n---\n${body}`;
|
|
265
|
+
}
|
|
266
|
+
// Skill downloads must come from the GitHub host set. Restricting the host
|
|
267
|
+
// here prevents the client-supplied `sourceUrl` from driving server-side
|
|
268
|
+
// fetches at internal/loopback/link-local endpoints (SSRF), e.g.
|
|
269
|
+
// `http://169.254.169.254/` cloud-metadata or `http://localhost:<port>/`.
|
|
270
|
+
const ALLOWED_SKILL_SOURCE_HOSTS = new Set([
|
|
271
|
+
'github.com',
|
|
272
|
+
'raw.githubusercontent.com',
|
|
273
|
+
'codeload.github.com',
|
|
274
|
+
'api.github.com',
|
|
275
|
+
]);
|
|
276
|
+
function assertAllowedSkillSourceUrl(sourceUrl) {
|
|
277
|
+
let parsed;
|
|
278
|
+
try {
|
|
279
|
+
parsed = new URL(sourceUrl);
|
|
280
|
+
}
|
|
281
|
+
catch {
|
|
282
|
+
throw RequestError.invalidParams(undefined, 'Skill sourceUrl must be a valid URL');
|
|
283
|
+
}
|
|
284
|
+
// Require HTTPS: a plaintext http: fetch of skill content (which can include
|
|
285
|
+
// executable hooks) is MITM-able by a network-position attacker, so the host
|
|
286
|
+
// allowlist alone is not sufficient. All supported GitHub hosts serve HTTPS.
|
|
287
|
+
if (parsed.protocol !== 'https:') {
|
|
288
|
+
throw RequestError.invalidParams(undefined, 'Skill sourceUrl must be an HTTPS URL');
|
|
289
|
+
}
|
|
290
|
+
if (!ALLOWED_SKILL_SOURCE_HOSTS.has(parsed.hostname)) {
|
|
291
|
+
throw RequestError.invalidParams(undefined, 'Skill sourceUrl host is not allowed (only github.com sources are supported)');
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
function parseGitHubBlobSkillUrl(sourceUrl) {
|
|
295
|
+
const parsed = new URL(sourceUrl);
|
|
296
|
+
// HTTPS-only, consistent with assertAllowedSkillSourceUrl (skill content can
|
|
297
|
+
// include executable hooks, so plaintext http: is MITM-able).
|
|
298
|
+
if (parsed.protocol !== 'https:') {
|
|
299
|
+
throw RequestError.invalidParams(undefined, 'Skill sourceUrl must be an HTTPS URL');
|
|
300
|
+
}
|
|
301
|
+
if (parsed.hostname !== 'github.com')
|
|
302
|
+
return null;
|
|
303
|
+
const parts = parsed.pathname.split('/').filter(Boolean);
|
|
304
|
+
if (parts.length < 5 || parts[2] !== 'blob')
|
|
305
|
+
return null;
|
|
306
|
+
const owner = parts[0];
|
|
307
|
+
const repo = parts[1];
|
|
308
|
+
const ref = parts[3];
|
|
309
|
+
const filePathParts = parts.slice(4);
|
|
310
|
+
if (!owner || !repo || !ref || filePathParts.length === 0)
|
|
311
|
+
return null;
|
|
312
|
+
return {
|
|
313
|
+
owner,
|
|
314
|
+
repo,
|
|
315
|
+
ref,
|
|
316
|
+
filePath: filePathParts.join('/'),
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
function toRawGitHubUrl(githubUrl) {
|
|
320
|
+
return `https://raw.githubusercontent.com/${githubUrl.owner}/${githubUrl.repo}/${githubUrl.ref}/${githubUrl.filePath}`;
|
|
321
|
+
}
|
|
322
|
+
function encodeGitHubPath(filePath) {
|
|
323
|
+
if (!filePath || filePath === '.')
|
|
324
|
+
return '';
|
|
325
|
+
return filePath.split('/').map(encodeURIComponent).join('/');
|
|
326
|
+
}
|
|
327
|
+
function readTarString(archive, offset, length) {
|
|
328
|
+
const bytes = archive.subarray(offset, offset + length);
|
|
329
|
+
const nul = bytes.indexOf(0);
|
|
330
|
+
const end = nul >= 0 ? nul : bytes.length;
|
|
331
|
+
return Buffer.from(bytes.subarray(0, end)).toString('utf8').trim();
|
|
332
|
+
}
|
|
333
|
+
function readTarSize(archive, offset) {
|
|
334
|
+
const raw = readTarString(archive, offset + 124, 12);
|
|
335
|
+
return raw ? Number.parseInt(raw, 8) : 0;
|
|
336
|
+
}
|
|
337
|
+
function isZeroTarBlock(archive, offset) {
|
|
338
|
+
for (let i = 0; i < 512; i += 1) {
|
|
339
|
+
if (archive[offset + i] !== 0)
|
|
340
|
+
return false;
|
|
341
|
+
}
|
|
342
|
+
return true;
|
|
343
|
+
}
|
|
344
|
+
function readTarPath(archive, offset) {
|
|
345
|
+
const name = readTarString(archive, offset, 100);
|
|
346
|
+
const prefix = readTarString(archive, offset + 345, 155);
|
|
347
|
+
return prefix ? `${prefix}/${name}` : name;
|
|
348
|
+
}
|
|
349
|
+
function stripArchiveRoot(filePath) {
|
|
350
|
+
const parts = filePath.split('/').filter(Boolean);
|
|
351
|
+
return parts.length > 1 ? parts.slice(1).join('/') : '';
|
|
352
|
+
}
|
|
353
|
+
// Bound the work done on untrusted skill archives so a malicious or oversized
|
|
354
|
+
// download cannot exhaust memory. Decompression is streamed (createGunzip) and
|
|
355
|
+
// aborted the moment the cumulative inflated size crosses the cap, so a
|
|
356
|
+
// decompression bomb can never fully inflate into memory.
|
|
357
|
+
const MAX_SKILL_DOWNLOAD_BYTES = 100 * 1024 * 1024; // 100 MB compressed
|
|
358
|
+
const MAX_SKILL_DECOMPRESSED_BYTES = 500 * 1024 * 1024; // 500 MB decompressed
|
|
359
|
+
// Bounds for the GitHub Contents-API directory walk (the archive path is
|
|
360
|
+
// already bounded by the byte caps above).
|
|
361
|
+
const MAX_SKILL_API_DIR_DEPTH = 16;
|
|
362
|
+
const MAX_SKILL_API_FILE_COUNT = 2000;
|
|
363
|
+
// Sentinel so the streaming decompression's size-limit abort can be told apart
|
|
364
|
+
// from a genuine gunzip/format error in the catch below.
|
|
365
|
+
class DecompressedSizeExceededError extends Error {
|
|
366
|
+
}
|
|
367
|
+
export async function extractFilesFromTarGz(archiveBytes, directoryPath,
|
|
368
|
+
// Limits are injectable so the size-guard branches can be exercised in tests
|
|
369
|
+
// without allocating the 100MB/500MB production thresholds.
|
|
370
|
+
limits = {}) {
|
|
371
|
+
const maxCompressedBytes = limits.maxCompressedBytes ?? MAX_SKILL_DOWNLOAD_BYTES;
|
|
372
|
+
const maxDecompressedBytes = limits.maxDecompressedBytes ?? MAX_SKILL_DECOMPRESSED_BYTES;
|
|
373
|
+
if (archiveBytes.length > maxCompressedBytes) {
|
|
374
|
+
throw RequestError.invalidParams(undefined, 'Skill archive exceeds the maximum allowed size');
|
|
375
|
+
}
|
|
376
|
+
let archive;
|
|
377
|
+
try {
|
|
378
|
+
// Stream the inflate so we can abort as soon as the cumulative output
|
|
379
|
+
// exceeds the cap, instead of materializing the entire decompressed buffer
|
|
380
|
+
// first (a ~1000:1 gzip ratio could otherwise inflate a small archive to
|
|
381
|
+
// many GB before any post-hoc length check fires).
|
|
382
|
+
const chunks = [];
|
|
383
|
+
let total = 0;
|
|
384
|
+
await pipeline(
|
|
385
|
+
// Wrap in an array so the whole archive is emitted as a single chunk;
|
|
386
|
+
// `Readable.from(uint8array)` would otherwise iterate it byte-by-byte.
|
|
387
|
+
Readable.from([Buffer.from(archiveBytes)]), createGunzip(), new Writable({
|
|
388
|
+
write(chunk, _enc, cb) {
|
|
389
|
+
total += chunk.length;
|
|
390
|
+
if (total > maxDecompressedBytes) {
|
|
391
|
+
cb(new DecompressedSizeExceededError());
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
394
|
+
chunks.push(chunk);
|
|
395
|
+
cb();
|
|
396
|
+
},
|
|
397
|
+
}));
|
|
398
|
+
archive = Buffer.concat(chunks);
|
|
399
|
+
}
|
|
400
|
+
catch (error) {
|
|
401
|
+
if (error instanceof DecompressedSizeExceededError) {
|
|
402
|
+
throw RequestError.invalidParams(undefined, 'Decompressed skill archive exceeds the maximum allowed size');
|
|
403
|
+
}
|
|
404
|
+
throw RequestError.invalidParams(undefined, `Failed to decompress skill archive: ${error instanceof Error ? error.message : String(error)}`);
|
|
405
|
+
}
|
|
406
|
+
const normalizedDirectory = directoryPath.replace(/^\/+|\/+$/g, '');
|
|
407
|
+
// Treat '.' (SKILL.md at the repository root) as the empty prefix; otherwise
|
|
408
|
+
// the prefix becomes './' and never matches the root-stripped archive paths
|
|
409
|
+
// (e.g. 'SKILL.md'), yielding zero extracted files.
|
|
410
|
+
const directoryPrefix = normalizedDirectory && normalizedDirectory !== '.'
|
|
411
|
+
? `${normalizedDirectory}/`
|
|
412
|
+
: '';
|
|
413
|
+
const files = [];
|
|
414
|
+
for (let offset = 0; offset + 512 <= archive.length;) {
|
|
415
|
+
if (isZeroTarBlock(archive, offset))
|
|
416
|
+
break;
|
|
417
|
+
const fullPath = readTarPath(archive, offset);
|
|
418
|
+
const typeFlag = String.fromCharCode(archive[offset + 156] || 0);
|
|
419
|
+
const size = readTarSize(archive, offset);
|
|
420
|
+
const dataOffset = offset + 512;
|
|
421
|
+
const nextOffset = dataOffset + Math.ceil(size / 512) * 512;
|
|
422
|
+
if (typeFlag === '0' || typeFlag === '\0') {
|
|
423
|
+
const repoPath = stripArchiveRoot(fullPath);
|
|
424
|
+
if (repoPath.startsWith(directoryPrefix)) {
|
|
425
|
+
const relativePath = repoPath.slice(directoryPrefix.length);
|
|
426
|
+
if (relativePath) {
|
|
427
|
+
files.push({
|
|
428
|
+
relativePath,
|
|
429
|
+
content: archive.subarray(dataOffset, dataOffset + size),
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
offset = nextOffset;
|
|
435
|
+
}
|
|
436
|
+
return files;
|
|
437
|
+
}
|
|
438
|
+
// GitHub host suffixes a download may legitimately redirect to (raw/codeload
|
|
439
|
+
// commonly 302 to their object CDN for geo/CDN routing). Redirects to anything
|
|
440
|
+
// outside these are rejected, preserving the SSRF guard while not breaking
|
|
441
|
+
// real downloads.
|
|
442
|
+
const ALLOWED_REDIRECT_HOST_SUFFIXES = [
|
|
443
|
+
'.githubusercontent.com',
|
|
444
|
+
'.github.com',
|
|
445
|
+
// Note: '.github.io' is intentionally excluded — *.github.io are
|
|
446
|
+
// user-controlled GitHub Pages sites, so allowing redirects there would
|
|
447
|
+
// reopen the SSRF/exfiltration surface this allowlist exists to close.
|
|
448
|
+
];
|
|
449
|
+
function isAllowedSkillFetchHost(hostname) {
|
|
450
|
+
if (ALLOWED_SKILL_SOURCE_HOSTS.has(hostname))
|
|
451
|
+
return true;
|
|
452
|
+
return ALLOWED_REDIRECT_HOST_SUFFIXES.some((suffix) => hostname.endsWith(suffix));
|
|
453
|
+
}
|
|
454
|
+
/**
|
|
455
|
+
* Fetch that follows redirects manually, validating every hop stays on an
|
|
456
|
+
* allowed GitHub host over HTTPS. This keeps the SSRF protection of
|
|
457
|
+
* `redirect: 'manual'` (a malicious repo cannot bounce the fetch to an internal
|
|
458
|
+
* endpoint) while still following GitHub's legitimate CDN redirects, which
|
|
459
|
+
* plain `redirect: 'manual'` would surface as a download failure.
|
|
460
|
+
*/
|
|
461
|
+
export async function fetchAllowedGitHub(url, init = {}, maxRedirects = 5) {
|
|
462
|
+
let current = url;
|
|
463
|
+
for (let hop = 0; hop <= maxRedirects; hop += 1) {
|
|
464
|
+
const response = await fetch(current, { ...init, redirect: 'manual' });
|
|
465
|
+
if (response.status < 300 || response.status >= 400) {
|
|
466
|
+
return response;
|
|
467
|
+
}
|
|
468
|
+
const location = response.headers?.get('location');
|
|
469
|
+
if (!location)
|
|
470
|
+
return response;
|
|
471
|
+
let next;
|
|
472
|
+
try {
|
|
473
|
+
next = new URL(location, current);
|
|
474
|
+
}
|
|
475
|
+
catch {
|
|
476
|
+
throw RequestError.invalidParams(undefined, 'Skill download redirected to an invalid URL');
|
|
477
|
+
}
|
|
478
|
+
if (next.protocol !== 'https:' || !isAllowedSkillFetchHost(next.hostname)) {
|
|
479
|
+
throw RequestError.invalidParams(undefined, 'Skill download redirected to a disallowed host');
|
|
480
|
+
}
|
|
481
|
+
current = next.toString();
|
|
482
|
+
}
|
|
483
|
+
throw RequestError.invalidParams(undefined, 'Skill download exceeded the maximum number of redirects');
|
|
484
|
+
}
|
|
485
|
+
// Read a response body while enforcing a hard byte cap against the *actual*
|
|
486
|
+
// streamed bytes. The Content-Length pre-checks at the call sites are advisory
|
|
487
|
+
// only — a server that omits the header (chunked transfer, CDN redirect) could
|
|
488
|
+
// otherwise stream an arbitrarily large body straight into memory via
|
|
489
|
+
// `arrayBuffer()`.
|
|
490
|
+
async function readBodyWithLimit(response, maxBytes) {
|
|
491
|
+
const body = response.body;
|
|
492
|
+
if (!body) {
|
|
493
|
+
const buf = new Uint8Array(await response.arrayBuffer());
|
|
494
|
+
if (buf.byteLength > maxBytes) {
|
|
495
|
+
throw RequestError.invalidParams(undefined, 'Skill download exceeds the maximum allowed size');
|
|
496
|
+
}
|
|
497
|
+
return buf;
|
|
498
|
+
}
|
|
499
|
+
const reader = body.getReader();
|
|
500
|
+
const chunks = [];
|
|
501
|
+
let total = 0;
|
|
502
|
+
for (;;) {
|
|
503
|
+
const { done, value } = await reader.read();
|
|
504
|
+
if (done)
|
|
505
|
+
break;
|
|
506
|
+
if (!value)
|
|
507
|
+
continue;
|
|
508
|
+
total += value.byteLength;
|
|
509
|
+
if (total > maxBytes) {
|
|
510
|
+
await reader.cancel();
|
|
511
|
+
throw RequestError.invalidParams(undefined, 'Skill download exceeds the maximum allowed size');
|
|
512
|
+
}
|
|
513
|
+
chunks.push(value);
|
|
514
|
+
}
|
|
515
|
+
const result = new Uint8Array(total);
|
|
516
|
+
let offset = 0;
|
|
517
|
+
for (const chunk of chunks) {
|
|
518
|
+
result.set(chunk, offset);
|
|
519
|
+
offset += chunk.byteLength;
|
|
520
|
+
}
|
|
521
|
+
return result;
|
|
522
|
+
}
|
|
523
|
+
async function fetchBytes(url) {
|
|
524
|
+
const response = await fetchAllowedGitHub(url);
|
|
525
|
+
if (!response.ok) {
|
|
526
|
+
throw RequestError.invalidParams(undefined, `Failed to download skill (${response.status})`);
|
|
527
|
+
}
|
|
528
|
+
const contentLength = response.headers?.get('content-length');
|
|
529
|
+
if (contentLength) {
|
|
530
|
+
const declaredSize = Number.parseInt(contentLength, 10);
|
|
531
|
+
if (Number.isFinite(declaredSize) &&
|
|
532
|
+
declaredSize > MAX_SKILL_DOWNLOAD_BYTES) {
|
|
533
|
+
throw RequestError.invalidParams(undefined, 'Skill download exceeds the maximum allowed size');
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
return readBodyWithLimit(response, MAX_SKILL_DOWNLOAD_BYTES);
|
|
537
|
+
}
|
|
538
|
+
async function downloadSingleSkillFile(sourceUrl) {
|
|
539
|
+
const githubUrl = parseGitHubBlobSkillUrl(sourceUrl);
|
|
540
|
+
const fetchUrl = githubUrl ? toRawGitHubUrl(githubUrl) : sourceUrl;
|
|
541
|
+
const content = await fetchBytes(fetchUrl);
|
|
542
|
+
return {
|
|
543
|
+
skillContent: Buffer.from(content).toString('utf8'),
|
|
544
|
+
files: [{ relativePath: 'SKILL.md', content }],
|
|
545
|
+
};
|
|
546
|
+
}
|
|
547
|
+
async function downloadGitHubSkillDirectoryFromArchive(githubUrl, directoryPath) {
|
|
548
|
+
const archiveUrl = `https://codeload.github.com/${githubUrl.owner}/${githubUrl.repo}/tar.gz/${encodeURIComponent(githubUrl.ref)}`;
|
|
549
|
+
const response = await fetchAllowedGitHub(archiveUrl, {
|
|
550
|
+
headers: {
|
|
551
|
+
'User-Agent': 'qwen-code',
|
|
552
|
+
},
|
|
553
|
+
});
|
|
554
|
+
if (!response.ok) {
|
|
555
|
+
throw RequestError.invalidParams(undefined, `Failed to download GitHub skill archive (${response.status})`);
|
|
556
|
+
}
|
|
557
|
+
// Reject oversized archives by declared Content-Length before buffering the
|
|
558
|
+
// whole body into memory, mirroring the guard in fetchBytes.
|
|
559
|
+
const contentLength = response.headers?.get('content-length');
|
|
560
|
+
if (contentLength) {
|
|
561
|
+
const declaredSize = Number.parseInt(contentLength, 10);
|
|
562
|
+
if (Number.isFinite(declaredSize) &&
|
|
563
|
+
declaredSize > MAX_SKILL_DOWNLOAD_BYTES) {
|
|
564
|
+
throw RequestError.invalidParams(undefined, 'Skill archive exceeds the maximum allowed size');
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
return extractFilesFromTarGz(await readBodyWithLimit(response, MAX_SKILL_DOWNLOAD_BYTES), directoryPath);
|
|
568
|
+
}
|
|
569
|
+
async function fetchGitHubDirectoryItems(githubUrl, directoryPath) {
|
|
570
|
+
const encodedPath = encodeGitHubPath(directoryPath);
|
|
571
|
+
const apiUrl = `https://api.github.com/repos/${githubUrl.owner}/${githubUrl.repo}/contents/${encodedPath}?ref=${encodeURIComponent(githubUrl.ref)}`;
|
|
572
|
+
const response = await fetchAllowedGitHub(apiUrl, {
|
|
573
|
+
headers: {
|
|
574
|
+
Accept: 'application/vnd.github+json',
|
|
575
|
+
'User-Agent': 'qwen-code',
|
|
576
|
+
},
|
|
577
|
+
});
|
|
578
|
+
if (!response.ok) {
|
|
579
|
+
throw RequestError.invalidParams(undefined, `Failed to list GitHub skill files (${response.status})`);
|
|
580
|
+
}
|
|
581
|
+
const data = await response.json();
|
|
582
|
+
if (!Array.isArray(data)) {
|
|
583
|
+
throw RequestError.invalidParams(undefined, 'GitHub skill URL must point to a directory-backed SKILL.md file');
|
|
584
|
+
}
|
|
585
|
+
return data;
|
|
586
|
+
}
|
|
587
|
+
async function downloadGitHubSkillDirectoryFromApi(githubUrl, directoryPath, relativeRoot = '',
|
|
588
|
+
// Bound the recursive API walk so a crafted repo (deeply nested dirs, huge
|
|
589
|
+
// file counts, or large cumulative size) can't exhaust memory/time. The
|
|
590
|
+
// archive fallback already enforces size caps; this gives the API path
|
|
591
|
+
// equivalent guards.
|
|
592
|
+
depth = 0, budget = { files: 0, bytes: 0 }) {
|
|
593
|
+
if (depth > MAX_SKILL_API_DIR_DEPTH) {
|
|
594
|
+
throw RequestError.invalidParams(undefined, 'Skill directory nesting exceeds the maximum allowed depth');
|
|
595
|
+
}
|
|
596
|
+
const items = await fetchGitHubDirectoryItems(githubUrl, directoryPath);
|
|
597
|
+
const files = [];
|
|
598
|
+
for (const item of items) {
|
|
599
|
+
const record = toRecord(item);
|
|
600
|
+
const name = readRequiredString(record['name'], 'github.name');
|
|
601
|
+
const itemPath = readRequiredString(record['path'], 'github.path');
|
|
602
|
+
const type = readRequiredString(record['type'], 'github.type');
|
|
603
|
+
const relativePath = relativeRoot
|
|
604
|
+
? path.posix.join(relativeRoot, name)
|
|
605
|
+
: name;
|
|
606
|
+
if (type === 'dir') {
|
|
607
|
+
files.push(...(await downloadGitHubSkillDirectoryFromApi(githubUrl, itemPath, relativePath, depth + 1, budget)));
|
|
608
|
+
continue;
|
|
609
|
+
}
|
|
610
|
+
if (type !== 'file')
|
|
611
|
+
continue;
|
|
612
|
+
budget.files += 1;
|
|
613
|
+
if (budget.files > MAX_SKILL_API_FILE_COUNT) {
|
|
614
|
+
throw RequestError.invalidParams(undefined, 'Skill directory contains too many files');
|
|
615
|
+
}
|
|
616
|
+
const downloadUrl = readRequiredString(record['download_url'], 'github.download_url');
|
|
617
|
+
// SSRF defense: the API-provided download_url is attacker-influenced, so
|
|
618
|
+
// run it through the same host allowlist + HTTPS check as the initial URL.
|
|
619
|
+
assertAllowedSkillSourceUrl(downloadUrl);
|
|
620
|
+
const content = await fetchBytes(downloadUrl);
|
|
621
|
+
budget.bytes += content.length;
|
|
622
|
+
if (budget.bytes > MAX_SKILL_DECOMPRESSED_BYTES) {
|
|
623
|
+
throw RequestError.invalidParams(undefined, 'Skill directory exceeds the maximum allowed size');
|
|
624
|
+
}
|
|
625
|
+
files.push({
|
|
626
|
+
relativePath,
|
|
627
|
+
content,
|
|
628
|
+
});
|
|
629
|
+
}
|
|
630
|
+
return files;
|
|
631
|
+
}
|
|
632
|
+
async function downloadGitHubSkillDirectory(githubUrl, directoryPath) {
|
|
633
|
+
const apiFiles = await downloadGitHubSkillDirectoryFromApi(githubUrl, directoryPath).catch((error) => {
|
|
634
|
+
debugLogger.warn('GitHub API directory listing failed, falling back to archive download:', error);
|
|
635
|
+
return null;
|
|
636
|
+
});
|
|
637
|
+
if (apiFiles)
|
|
638
|
+
return apiFiles;
|
|
639
|
+
return downloadGitHubSkillDirectoryFromArchive(githubUrl, directoryPath);
|
|
640
|
+
}
|
|
641
|
+
async function downloadSkill(sourceUrl) {
|
|
642
|
+
assertAllowedSkillSourceUrl(sourceUrl);
|
|
643
|
+
const githubUrl = parseGitHubBlobSkillUrl(sourceUrl);
|
|
644
|
+
if (!githubUrl || path.posix.basename(githubUrl.filePath) !== 'SKILL.md') {
|
|
645
|
+
return downloadSingleSkillFile(sourceUrl);
|
|
646
|
+
}
|
|
647
|
+
const skillDirectory = path.posix.dirname(githubUrl.filePath);
|
|
648
|
+
const files = await downloadGitHubSkillDirectory(githubUrl, skillDirectory);
|
|
649
|
+
const skillFile = files.find((file) => file.relativePath === 'SKILL.md');
|
|
650
|
+
if (!skillFile) {
|
|
651
|
+
throw RequestError.invalidParams(undefined, 'GitHub skill directory does not contain SKILL.md');
|
|
652
|
+
}
|
|
653
|
+
return {
|
|
654
|
+
skillContent: Buffer.from(skillFile.content).toString('utf8'),
|
|
655
|
+
files,
|
|
656
|
+
};
|
|
657
|
+
}
|
|
658
|
+
function resolveSkillInstallPath(skillDir, relativePath) {
|
|
659
|
+
const root = path.resolve(skillDir);
|
|
660
|
+
const target = path.resolve(skillDir, relativePath);
|
|
661
|
+
if (target !== root && !target.startsWith(root + path.sep)) {
|
|
662
|
+
throw RequestError.invalidParams(undefined, `Invalid skill file path: ${relativePath}`);
|
|
663
|
+
}
|
|
664
|
+
return target;
|
|
665
|
+
}
|
|
666
|
+
// Builds the per-skill directory and asserts (defense-in-depth, on top of
|
|
667
|
+
// validateSkillSlug) that it stays strictly under the managed skills root, so a
|
|
668
|
+
// crafted slug can never make install/delete operate on `<globalQwenDir>` itself.
|
|
669
|
+
function resolveManagedSkillDir(skillsBaseDir, slug) {
|
|
670
|
+
const root = path.resolve(skillsBaseDir);
|
|
671
|
+
const skillDir = path.resolve(skillsBaseDir, slug);
|
|
672
|
+
if (!skillDir.startsWith(root + path.sep)) {
|
|
673
|
+
throw RequestError.invalidParams(undefined, 'Invalid skill.slug');
|
|
674
|
+
}
|
|
675
|
+
return skillDir;
|
|
676
|
+
}
|
|
677
|
+
function readStringArray(value, fieldName) {
|
|
678
|
+
if (value === undefined || value === null)
|
|
679
|
+
return [];
|
|
680
|
+
if (!Array.isArray(value)) {
|
|
681
|
+
throw RequestError.invalidParams(undefined, `Invalid ${fieldName}: expected string[]`);
|
|
682
|
+
}
|
|
683
|
+
return Array.from(new Set(value
|
|
684
|
+
.map((item) => {
|
|
685
|
+
if (typeof item !== 'string') {
|
|
686
|
+
throw RequestError.invalidParams(undefined, `Invalid ${fieldName}: expected string[]`);
|
|
687
|
+
}
|
|
688
|
+
return item.trim();
|
|
689
|
+
})
|
|
690
|
+
.filter(Boolean)));
|
|
691
|
+
}
|
|
692
|
+
function readPositiveNumber(value, fieldName) {
|
|
693
|
+
if (value === undefined || value === null || value === '')
|
|
694
|
+
return undefined;
|
|
695
|
+
if (typeof value !== 'number' || !Number.isFinite(value) || value <= 0) {
|
|
696
|
+
throw RequestError.invalidParams(undefined, `Invalid ${fieldName}: expected positive number`);
|
|
697
|
+
}
|
|
698
|
+
return value;
|
|
699
|
+
}
|
|
700
|
+
function readProviderAdvancedConfig(value) {
|
|
701
|
+
if (value === undefined || value === null)
|
|
702
|
+
return undefined;
|
|
703
|
+
const record = toRecord(value);
|
|
704
|
+
if (record['enableThinking'] !== undefined &&
|
|
705
|
+
typeof record['enableThinking'] !== 'boolean') {
|
|
706
|
+
throw RequestError.invalidParams(undefined, 'Invalid advancedConfig.enableThinking: expected boolean');
|
|
707
|
+
}
|
|
708
|
+
const multimodalRecord = toRecord(record['multimodal']);
|
|
709
|
+
const multimodal = {};
|
|
710
|
+
for (const key of ['image', 'video', 'audio', 'pdf']) {
|
|
711
|
+
const flag = multimodalRecord[key];
|
|
712
|
+
if (flag !== undefined) {
|
|
713
|
+
if (typeof flag !== 'boolean') {
|
|
714
|
+
throw RequestError.invalidParams(undefined, `Invalid advancedConfig.multimodal.${key}: expected boolean`);
|
|
715
|
+
}
|
|
716
|
+
multimodal[key] = flag;
|
|
717
|
+
}
|
|
718
|
+
}
|
|
719
|
+
const contextWindowSize = readPositiveNumber(record['contextWindowSize'], 'advancedConfig.contextWindowSize');
|
|
720
|
+
const maxTokens = readPositiveNumber(record['maxTokens'], 'advancedConfig.maxTokens');
|
|
721
|
+
const advancedConfig = {
|
|
722
|
+
...(typeof record['enableThinking'] === 'boolean'
|
|
723
|
+
? { enableThinking: record['enableThinking'] }
|
|
724
|
+
: {}),
|
|
725
|
+
...(Object.keys(multimodal).length > 0 ? { multimodal } : {}),
|
|
726
|
+
...(contextWindowSize ? { contextWindowSize } : {}),
|
|
727
|
+
...(maxTokens ? { maxTokens } : {}),
|
|
728
|
+
};
|
|
729
|
+
return Object.keys(advancedConfig).length > 0 ? advancedConfig : undefined;
|
|
730
|
+
}
|
|
731
|
+
function resolveProviderDocumentationUrl(config, baseUrl) {
|
|
732
|
+
if (typeof config.documentationUrl === 'string') {
|
|
733
|
+
return config.documentationUrl;
|
|
734
|
+
}
|
|
735
|
+
if (typeof config.documentationUrl === 'function') {
|
|
736
|
+
try {
|
|
737
|
+
return config.documentationUrl(baseUrl);
|
|
738
|
+
}
|
|
739
|
+
catch {
|
|
740
|
+
return undefined;
|
|
741
|
+
}
|
|
742
|
+
}
|
|
743
|
+
return undefined;
|
|
744
|
+
}
|
|
745
|
+
function isProviderModelConfig(value) {
|
|
746
|
+
const record = toRecord(value);
|
|
747
|
+
return typeof record['id'] === 'string';
|
|
748
|
+
}
|
|
749
|
+
function readSettingsEnv(settings, envKey) {
|
|
750
|
+
if (!envKey)
|
|
751
|
+
return undefined;
|
|
752
|
+
const env = toRecord(settings.merged['env']);
|
|
753
|
+
const value = env[envKey];
|
|
754
|
+
return typeof value === 'string' && value.length > 0 ? value : undefined;
|
|
755
|
+
}
|
|
756
|
+
function readProviderModels(settings, protocol) {
|
|
757
|
+
const modelProviders = toRecord(settings.merged['modelProviders']);
|
|
758
|
+
const models = modelProviders[protocol];
|
|
759
|
+
return Array.isArray(models) ? models.filter(isProviderModelConfig) : [];
|
|
760
|
+
}
|
|
761
|
+
function findExistingProviderModels(config, settings) {
|
|
762
|
+
const ownsModel = resolveOwnsModel(config);
|
|
763
|
+
if (!ownsModel)
|
|
764
|
+
return undefined;
|
|
765
|
+
const protocols = config.protocolOptions?.length
|
|
766
|
+
? config.protocolOptions
|
|
767
|
+
: [config.protocol];
|
|
768
|
+
for (const protocol of protocols) {
|
|
769
|
+
const models = readProviderModels(settings, protocol).filter(ownsModel);
|
|
770
|
+
if (models.length > 0)
|
|
771
|
+
return { protocol, models };
|
|
772
|
+
}
|
|
773
|
+
return undefined;
|
|
774
|
+
}
|
|
775
|
+
function resolveProviderEnvKey(config, protocol, baseUrl) {
|
|
776
|
+
try {
|
|
777
|
+
return typeof config.envKey === 'function'
|
|
778
|
+
? config.envKey(protocol, baseUrl)
|
|
779
|
+
: config.envKey;
|
|
780
|
+
}
|
|
781
|
+
catch {
|
|
782
|
+
return undefined;
|
|
783
|
+
}
|
|
784
|
+
}
|
|
785
|
+
function readExistingAdvancedConfig(model) {
|
|
786
|
+
const generationConfig = toRecord(model?.generationConfig);
|
|
787
|
+
const extraBody = toRecord(generationConfig['extra_body']);
|
|
788
|
+
const advancedConfig = {};
|
|
789
|
+
if (typeof extraBody['enable_thinking'] === 'boolean') {
|
|
790
|
+
advancedConfig['enableThinking'] = extraBody['enable_thinking'];
|
|
791
|
+
}
|
|
792
|
+
if (typeof generationConfig['contextWindowSize'] === 'number') {
|
|
793
|
+
advancedConfig['contextWindowSize'] = generationConfig['contextWindowSize'];
|
|
794
|
+
}
|
|
795
|
+
return Object.keys(advancedConfig).length > 0 ? advancedConfig : undefined;
|
|
796
|
+
}
|
|
797
|
+
function readExistingProviderConfig(config, settings) {
|
|
798
|
+
const existing = findExistingProviderModels(config, settings);
|
|
799
|
+
const firstModel = existing?.models[0];
|
|
800
|
+
const protocol = existing?.protocol ?? config.protocol;
|
|
801
|
+
const baseUrl = typeof firstModel?.baseUrl === 'string'
|
|
802
|
+
? firstModel.baseUrl
|
|
803
|
+
: resolveBaseUrl(config);
|
|
804
|
+
const envKey = typeof firstModel?.envKey === 'string'
|
|
805
|
+
? firstModel.envKey
|
|
806
|
+
: resolveProviderEnvKey(config, protocol, baseUrl);
|
|
807
|
+
const apiKey = readSettingsEnv(settings, envKey);
|
|
808
|
+
const hasExistingConfig = !!apiKey || !!existing;
|
|
809
|
+
if (!hasExistingConfig)
|
|
810
|
+
return undefined;
|
|
811
|
+
const advancedConfig = readExistingAdvancedConfig(firstModel);
|
|
812
|
+
return {
|
|
813
|
+
protocol,
|
|
814
|
+
baseUrl,
|
|
815
|
+
// Never serialize the raw secret over the ACP wire. Expose only whether a
|
|
816
|
+
// key is stored; the client can omit `apiKey` on connect to keep it.
|
|
817
|
+
...(apiKey ? { hasApiKey: true } : {}),
|
|
818
|
+
...(existing ? { modelIds: existing.models.map((model) => model.id) } : {}),
|
|
819
|
+
...(advancedConfig ? { advancedConfig } : {}),
|
|
820
|
+
};
|
|
821
|
+
}
|
|
822
|
+
// Resolves the raw, stored API key for a provider for server-side use only
|
|
823
|
+
// (never serialized to the client). Used so `qwen/providers/connect` can keep
|
|
824
|
+
// the existing key when the client updates other fields without resubmitting it.
|
|
825
|
+
function resolveExistingProviderApiKey(config, settings) {
|
|
826
|
+
const existing = findExistingProviderModels(config, settings);
|
|
827
|
+
const firstModel = existing?.models[0];
|
|
828
|
+
const protocol = existing?.protocol ?? config.protocol;
|
|
829
|
+
const baseUrl = typeof firstModel?.baseUrl === 'string'
|
|
830
|
+
? firstModel.baseUrl
|
|
831
|
+
: resolveBaseUrl(config);
|
|
832
|
+
const envKey = typeof firstModel?.envKey === 'string'
|
|
833
|
+
? firstModel.envKey
|
|
834
|
+
: resolveProviderEnvKey(config, protocol, baseUrl);
|
|
835
|
+
return readSettingsEnv(settings, envKey);
|
|
836
|
+
}
|
|
837
|
+
function serializeProviderConfig(config, settings) {
|
|
838
|
+
const defaultProtocol = config.protocolOptions?.[0] ?? config.protocol;
|
|
839
|
+
const defaultBaseUrl = config.baseUrl === undefined
|
|
840
|
+
? getDefaultBaseUrlForProtocol(defaultProtocol)
|
|
841
|
+
: resolveBaseUrl(config);
|
|
842
|
+
const existingConfig = readExistingProviderConfig(config, settings);
|
|
843
|
+
return {
|
|
844
|
+
id: config.id,
|
|
845
|
+
label: config.label,
|
|
846
|
+
description: config.description,
|
|
847
|
+
protocol: config.protocol,
|
|
848
|
+
protocolOptions: config.protocolOptions ?? [],
|
|
849
|
+
baseUrl: config.baseUrl,
|
|
850
|
+
baseUrlPlaceholder: config.baseUrl === undefined ? defaultBaseUrl : undefined,
|
|
851
|
+
defaultModelIds: getDefaultModelIds(config),
|
|
852
|
+
models: config.models ?? [],
|
|
853
|
+
modelsEditable: config.modelsEditable === true || !config.models,
|
|
854
|
+
showAdvancedConfig: config.showAdvancedConfig === true,
|
|
855
|
+
apiKeyPlaceholder: config.apiKeyPlaceholder,
|
|
856
|
+
documentationUrl: resolveProviderDocumentationUrl(config, defaultBaseUrl),
|
|
857
|
+
uiGroup: config.uiGroup ?? 'third-party',
|
|
858
|
+
uiLabels: config.uiLabels,
|
|
859
|
+
...(existingConfig ? { existingConfig } : {}),
|
|
860
|
+
};
|
|
861
|
+
}
|
|
862
|
+
function readProviderSetupInputs(config, params, existingApiKey) {
|
|
863
|
+
const protocol = readOptionalString(params['protocol'], 'protocol');
|
|
864
|
+
if (protocol &&
|
|
865
|
+
protocol !== config.protocol &&
|
|
866
|
+
!config.protocolOptions?.includes(protocol)) {
|
|
867
|
+
throw RequestError.invalidParams(undefined, `Invalid protocol for provider "${config.id}"`);
|
|
868
|
+
}
|
|
869
|
+
let baseUrl = resolveBaseUrl(config, readOptionalString(params['baseUrl'], 'baseUrl')).trim();
|
|
870
|
+
if (!baseUrl && config.baseUrl === undefined) {
|
|
871
|
+
baseUrl = getDefaultBaseUrlForProtocol(protocol ?? config.protocol);
|
|
872
|
+
}
|
|
873
|
+
if (!baseUrl) {
|
|
874
|
+
throw RequestError.invalidParams(undefined, `Invalid or missing baseUrl for provider "${config.id}"`);
|
|
875
|
+
}
|
|
876
|
+
// `apiKey` is optional on update: when the client omits it (e.g. it only
|
|
877
|
+
// received `hasApiKey` from the list response), fall back to the stored key.
|
|
878
|
+
const apiKey = readOptionalString(params['apiKey'], 'apiKey') ?? existingApiKey;
|
|
879
|
+
if (!apiKey) {
|
|
880
|
+
throw RequestError.invalidParams(undefined, 'Invalid or missing apiKey');
|
|
881
|
+
}
|
|
882
|
+
const apiKeyError = config.validateApiKey?.(apiKey, baseUrl);
|
|
883
|
+
if (apiKeyError) {
|
|
884
|
+
throw RequestError.invalidParams(undefined, apiKeyError);
|
|
885
|
+
}
|
|
886
|
+
const defaultModelIds = getDefaultModelIds(config);
|
|
887
|
+
const modelIds = readStringArray(params['modelIds'], 'modelIds');
|
|
888
|
+
const resolvedModelIds = modelIds.length > 0 ? modelIds : defaultModelIds;
|
|
889
|
+
if (resolvedModelIds.length === 0) {
|
|
890
|
+
throw RequestError.invalidParams(undefined, `Invalid or missing modelIds for provider "${config.id}"`);
|
|
891
|
+
}
|
|
892
|
+
const advancedConfig = readProviderAdvancedConfig(params['advancedConfig']);
|
|
893
|
+
return {
|
|
894
|
+
...(protocol ? { protocol } : {}),
|
|
895
|
+
baseUrl,
|
|
896
|
+
apiKey,
|
|
897
|
+
modelIds: resolvedModelIds,
|
|
898
|
+
...(advancedConfig ? { advancedConfig } : {}),
|
|
899
|
+
};
|
|
900
|
+
}
|
|
901
|
+
function readProviderConnectScope(value) {
|
|
902
|
+
if (value === undefined)
|
|
903
|
+
return undefined;
|
|
904
|
+
if (value === 'user')
|
|
905
|
+
return SettingScope.User;
|
|
906
|
+
if (value === 'workspace')
|
|
907
|
+
return SettingScope.Workspace;
|
|
908
|
+
throw RequestError.invalidParams(undefined, 'Invalid scope for provider connect');
|
|
909
|
+
}
|
|
910
|
+
function getNestedSettingValue(source, key) {
|
|
911
|
+
let current = source;
|
|
912
|
+
for (const segment of key.split('.')) {
|
|
913
|
+
if (!current || typeof current !== 'object' || Array.isArray(current)) {
|
|
914
|
+
return undefined;
|
|
915
|
+
}
|
|
916
|
+
current = current[segment];
|
|
917
|
+
}
|
|
918
|
+
if (typeof current === 'string' ||
|
|
919
|
+
typeof current === 'number' ||
|
|
920
|
+
typeof current === 'boolean' ||
|
|
921
|
+
Array.isArray(current)) {
|
|
922
|
+
return current;
|
|
923
|
+
}
|
|
924
|
+
return undefined;
|
|
925
|
+
}
|
|
926
|
+
function readCoreSettingValues(source) {
|
|
927
|
+
const values = {};
|
|
928
|
+
for (const key of QWEN_CORE_SETTING_KEYS) {
|
|
929
|
+
const value = getNestedSettingValue(source, key);
|
|
930
|
+
if (value !== undefined) {
|
|
931
|
+
values[key] = value;
|
|
932
|
+
}
|
|
933
|
+
}
|
|
934
|
+
return values;
|
|
935
|
+
}
|
|
936
|
+
export function normalizeCoreSettingValue(key, value) {
|
|
937
|
+
const definition = QWEN_CORE_SETTING_DEFINITIONS[key];
|
|
938
|
+
switch (definition.type) {
|
|
939
|
+
case 'boolean':
|
|
940
|
+
if (typeof value !== 'boolean') {
|
|
941
|
+
throw RequestError.invalidParams(undefined, `${key} must be a boolean`);
|
|
942
|
+
}
|
|
943
|
+
return value;
|
|
944
|
+
case 'number':
|
|
945
|
+
if (typeof value !== 'number' || !Number.isFinite(value)) {
|
|
946
|
+
throw RequestError.invalidParams(undefined, `${key} must be a number`);
|
|
947
|
+
}
|
|
948
|
+
if (definition.min !== undefined && value < definition.min) {
|
|
949
|
+
throw RequestError.invalidParams(undefined, `${key} must be at least ${definition.min}`);
|
|
950
|
+
}
|
|
951
|
+
return value;
|
|
952
|
+
case 'enum': {
|
|
953
|
+
const values = definition.values;
|
|
954
|
+
if (typeof value !== 'string' || !values?.includes(value)) {
|
|
955
|
+
throw RequestError.invalidParams(undefined, `${key} must be one of ${values?.join(', ')}`);
|
|
956
|
+
}
|
|
957
|
+
return value;
|
|
958
|
+
}
|
|
959
|
+
case 'string': {
|
|
960
|
+
if (value === undefined)
|
|
961
|
+
return undefined;
|
|
962
|
+
if (typeof value !== 'string') {
|
|
963
|
+
throw RequestError.invalidParams(undefined, `${key} must be a string`);
|
|
964
|
+
}
|
|
965
|
+
// Strip control characters (incl. newlines) from string settings. Some
|
|
966
|
+
// are embedded verbatim into instruction files / prompts — e.g.
|
|
967
|
+
// general.outputLanguage is written into output-language.md, loaded as a
|
|
968
|
+
// system instruction — where an embedded newline could forge a new
|
|
969
|
+
// instruction line (persistent prompt injection).
|
|
970
|
+
// eslint-disable-next-line no-control-regex
|
|
971
|
+
const controlChars = /[\u0000-\u001f\u007f-\u009f\u2028\u2029]/g;
|
|
972
|
+
const sanitized = value.replace(controlChars, ' ').trim();
|
|
973
|
+
// An input that is entirely control/whitespace chars (e.g. '\n') trims to
|
|
974
|
+
// ''. For settings like model.name an empty string has different
|
|
975
|
+
// semantics from undefined (a literal empty value vs. falling back to the
|
|
976
|
+
// default), so collapse the empty result to undefined.
|
|
977
|
+
return sanitized || undefined;
|
|
978
|
+
}
|
|
979
|
+
default:
|
|
980
|
+
throw RequestError.invalidParams(undefined, `${key} has an unsupported setting type`);
|
|
981
|
+
}
|
|
982
|
+
}
|
|
983
|
+
function normalizeStringArray(value) {
|
|
984
|
+
if (value === undefined)
|
|
985
|
+
return undefined;
|
|
986
|
+
if (!Array.isArray(value)) {
|
|
987
|
+
throw RequestError.invalidParams(undefined, 'Expected an array of strings');
|
|
988
|
+
}
|
|
989
|
+
return value
|
|
990
|
+
.map((item) => (typeof item === 'string' ? item.trim() : ''))
|
|
991
|
+
.filter(Boolean);
|
|
992
|
+
}
|
|
993
|
+
function normalizeStringRecord(value) {
|
|
994
|
+
if (value === undefined)
|
|
995
|
+
return undefined;
|
|
996
|
+
const record = toRecord(value);
|
|
997
|
+
const result = {};
|
|
998
|
+
for (const [key, item] of Object.entries(record)) {
|
|
999
|
+
if (typeof item === 'string' && key.trim()) {
|
|
1000
|
+
result[key.trim()] = item;
|
|
1001
|
+
}
|
|
1002
|
+
}
|
|
1003
|
+
return result;
|
|
1004
|
+
}
|
|
1005
|
+
function normalizeOptionalNumber(value) {
|
|
1006
|
+
if (value === undefined || value === null || value === '')
|
|
1007
|
+
return undefined;
|
|
1008
|
+
const numberValue = typeof value === 'number' ? value : Number.parseInt(String(value), 10);
|
|
1009
|
+
if (!Number.isFinite(numberValue) || numberValue <= 0) {
|
|
1010
|
+
throw RequestError.invalidParams(undefined, 'Expected a positive number');
|
|
1011
|
+
}
|
|
1012
|
+
return numberValue;
|
|
1013
|
+
}
|
|
1014
|
+
function normalizeMcpServerConfig(value) {
|
|
1015
|
+
const input = toRecord(value);
|
|
1016
|
+
const transport = input['transport'];
|
|
1017
|
+
if (transport !== 'stdio' && transport !== 'http' && transport !== 'sse') {
|
|
1018
|
+
throw RequestError.invalidParams(undefined, 'MCP transport must be stdio, http, or sse');
|
|
1019
|
+
}
|
|
1020
|
+
const server = { transport };
|
|
1021
|
+
const description = input['description'];
|
|
1022
|
+
if (typeof description === 'string' && description.trim()) {
|
|
1023
|
+
server.description = description.trim();
|
|
1024
|
+
}
|
|
1025
|
+
const cwd = input['cwd'];
|
|
1026
|
+
if (typeof cwd === 'string' && cwd.trim())
|
|
1027
|
+
server.cwd = cwd.trim();
|
|
1028
|
+
const timeout = normalizeOptionalNumber(input['timeout']);
|
|
1029
|
+
if (timeout !== undefined)
|
|
1030
|
+
server.timeout = timeout;
|
|
1031
|
+
if (typeof input['trust'] === 'boolean')
|
|
1032
|
+
server.trust = input['trust'];
|
|
1033
|
+
server.includeTools = normalizeStringArray(input['includeTools']);
|
|
1034
|
+
server.excludeTools = normalizeStringArray(input['excludeTools']);
|
|
1035
|
+
if (transport === 'stdio') {
|
|
1036
|
+
const command = input['command'];
|
|
1037
|
+
if (typeof command !== 'string' || !command.trim()) {
|
|
1038
|
+
throw RequestError.invalidParams(undefined, 'Stdio MCP servers require a command');
|
|
1039
|
+
}
|
|
1040
|
+
server.command = command.trim();
|
|
1041
|
+
server.args = normalizeStringArray(input['args']);
|
|
1042
|
+
server.env = normalizeStringRecord(input['env']);
|
|
1043
|
+
return server;
|
|
1044
|
+
}
|
|
1045
|
+
const urlKey = transport === 'http' ? 'httpUrl' : 'url';
|
|
1046
|
+
const url = input[urlKey];
|
|
1047
|
+
if (typeof url !== 'string' || !url.trim()) {
|
|
1048
|
+
throw RequestError.invalidParams(undefined, `${transport.toUpperCase()} MCP servers require a URL`);
|
|
1049
|
+
}
|
|
1050
|
+
if (transport === 'http')
|
|
1051
|
+
server.httpUrl = url.trim();
|
|
1052
|
+
else
|
|
1053
|
+
server.url = url.trim();
|
|
1054
|
+
server.headers = normalizeStringRecord(input['headers']);
|
|
1055
|
+
return server;
|
|
1056
|
+
}
|
|
1057
|
+
function toStoredMcpServerConfig(server) {
|
|
1058
|
+
const result = {};
|
|
1059
|
+
for (const key of [
|
|
1060
|
+
'timeout',
|
|
1061
|
+
'trust',
|
|
1062
|
+
'description',
|
|
1063
|
+
'includeTools',
|
|
1064
|
+
'excludeTools',
|
|
1065
|
+
]) {
|
|
1066
|
+
if (server[key] !== undefined)
|
|
1067
|
+
result[key] = server[key];
|
|
1068
|
+
}
|
|
1069
|
+
if (server.transport === 'stdio') {
|
|
1070
|
+
result['command'] = server.command;
|
|
1071
|
+
if (server.args !== undefined)
|
|
1072
|
+
result['args'] = server.args;
|
|
1073
|
+
if (server.cwd !== undefined)
|
|
1074
|
+
result['cwd'] = server.cwd;
|
|
1075
|
+
if (server.env !== undefined)
|
|
1076
|
+
result['env'] = server.env;
|
|
1077
|
+
}
|
|
1078
|
+
else if (server.transport === 'http') {
|
|
1079
|
+
result['httpUrl'] = server.httpUrl;
|
|
1080
|
+
if (server.headers !== undefined)
|
|
1081
|
+
result['headers'] = server.headers;
|
|
1082
|
+
}
|
|
1083
|
+
else {
|
|
1084
|
+
result['url'] = server.url;
|
|
1085
|
+
if (server.headers !== undefined)
|
|
1086
|
+
result['headers'] = server.headers;
|
|
1087
|
+
}
|
|
1088
|
+
return result;
|
|
1089
|
+
}
|
|
1090
|
+
function toMcpServerConfig(value) {
|
|
1091
|
+
const server = toRecord(value);
|
|
1092
|
+
if (typeof server['httpUrl'] === 'string') {
|
|
1093
|
+
return {
|
|
1094
|
+
transport: 'http',
|
|
1095
|
+
httpUrl: server['httpUrl'],
|
|
1096
|
+
headers: normalizeStringRecord(server['headers']),
|
|
1097
|
+
timeout: normalizeOptionalNumber(server['timeout']),
|
|
1098
|
+
trust: typeof server['trust'] === 'boolean' ? server['trust'] : undefined,
|
|
1099
|
+
description: typeof server['description'] === 'string'
|
|
1100
|
+
? server['description']
|
|
1101
|
+
: undefined,
|
|
1102
|
+
includeTools: normalizeStringArray(server['includeTools']),
|
|
1103
|
+
excludeTools: normalizeStringArray(server['excludeTools']),
|
|
1104
|
+
extensionName: typeof server['extensionName'] === 'string'
|
|
1105
|
+
? server['extensionName']
|
|
1106
|
+
: undefined,
|
|
1107
|
+
};
|
|
1108
|
+
}
|
|
1109
|
+
if (typeof server['url'] === 'string') {
|
|
1110
|
+
return {
|
|
1111
|
+
transport: 'sse',
|
|
1112
|
+
url: server['url'],
|
|
1113
|
+
headers: normalizeStringRecord(server['headers']),
|
|
1114
|
+
timeout: normalizeOptionalNumber(server['timeout']),
|
|
1115
|
+
trust: typeof server['trust'] === 'boolean' ? server['trust'] : undefined,
|
|
1116
|
+
description: typeof server['description'] === 'string'
|
|
1117
|
+
? server['description']
|
|
1118
|
+
: undefined,
|
|
1119
|
+
includeTools: normalizeStringArray(server['includeTools']),
|
|
1120
|
+
excludeTools: normalizeStringArray(server['excludeTools']),
|
|
1121
|
+
extensionName: typeof server['extensionName'] === 'string'
|
|
1122
|
+
? server['extensionName']
|
|
1123
|
+
: undefined,
|
|
1124
|
+
};
|
|
1125
|
+
}
|
|
1126
|
+
if (typeof server['command'] === 'string') {
|
|
1127
|
+
return {
|
|
1128
|
+
transport: 'stdio',
|
|
1129
|
+
command: server['command'],
|
|
1130
|
+
args: normalizeStringArray(server['args']),
|
|
1131
|
+
cwd: typeof server['cwd'] === 'string' ? server['cwd'] : undefined,
|
|
1132
|
+
env: normalizeStringRecord(server['env']),
|
|
1133
|
+
timeout: normalizeOptionalNumber(server['timeout']),
|
|
1134
|
+
trust: typeof server['trust'] === 'boolean' ? server['trust'] : undefined,
|
|
1135
|
+
description: typeof server['description'] === 'string'
|
|
1136
|
+
? server['description']
|
|
1137
|
+
: undefined,
|
|
1138
|
+
includeTools: normalizeStringArray(server['includeTools']),
|
|
1139
|
+
excludeTools: normalizeStringArray(server['excludeTools']),
|
|
1140
|
+
extensionName: typeof server['extensionName'] === 'string'
|
|
1141
|
+
? server['extensionName']
|
|
1142
|
+
: undefined,
|
|
1143
|
+
};
|
|
1144
|
+
}
|
|
1145
|
+
return undefined;
|
|
1146
|
+
}
|
|
1147
|
+
// Placeholder substituted for MCP secret values in settings responses. Keys
|
|
1148
|
+
// are preserved so the client can show which env vars / headers are configured
|
|
1149
|
+
// without ever receiving the plaintext value. Clients must treat this sentinel
|
|
1150
|
+
// as "unchanged" and not echo it back through setMcpServer.
|
|
1151
|
+
const REDACTED_MCP_SECRET = '__redacted__';
|
|
1152
|
+
function redactMcpServerSecrets(server) {
|
|
1153
|
+
const redactValues = (record) => record
|
|
1154
|
+
? Object.fromEntries(Object.keys(record).map((key) => [key, REDACTED_MCP_SECRET]))
|
|
1155
|
+
: record;
|
|
1156
|
+
return {
|
|
1157
|
+
...server,
|
|
1158
|
+
env: redactValues(server.env),
|
|
1159
|
+
headers: redactValues(server.headers),
|
|
1160
|
+
};
|
|
1161
|
+
}
|
|
1162
|
+
/**
|
|
1163
|
+
* Reverse of redaction on write: when a client echoes back the
|
|
1164
|
+
* `__redacted__` sentinel (because it read the masked value via getCore and
|
|
1165
|
+
* re-submitted the whole config), restore the previously stored real value
|
|
1166
|
+
* instead of persisting the literal sentinel. Keys with no prior value are
|
|
1167
|
+
* dropped, since there is no secret to restore.
|
|
1168
|
+
*/
|
|
1169
|
+
function restoreRedactedMcpSecrets(server, existing) {
|
|
1170
|
+
const restore = (incoming, prior) => {
|
|
1171
|
+
if (!incoming)
|
|
1172
|
+
return incoming;
|
|
1173
|
+
const priorRecord = toRecord(prior);
|
|
1174
|
+
const result = {};
|
|
1175
|
+
for (const [key, value] of Object.entries(incoming)) {
|
|
1176
|
+
if (value !== REDACTED_MCP_SECRET) {
|
|
1177
|
+
result[key] = value;
|
|
1178
|
+
continue;
|
|
1179
|
+
}
|
|
1180
|
+
const priorValue = priorRecord[key];
|
|
1181
|
+
if (typeof priorValue === 'string') {
|
|
1182
|
+
result[key] = priorValue;
|
|
1183
|
+
}
|
|
1184
|
+
}
|
|
1185
|
+
return result;
|
|
1186
|
+
};
|
|
1187
|
+
return {
|
|
1188
|
+
...server,
|
|
1189
|
+
env: restore(server.env, existing['env']),
|
|
1190
|
+
headers: restore(server.headers, existing['headers']),
|
|
1191
|
+
};
|
|
1192
|
+
}
|
|
1193
|
+
function redactSecretRecord(record) {
|
|
1194
|
+
return record
|
|
1195
|
+
? Object.fromEntries(Object.keys(record).map((key) => [key, REDACTED_MCP_SECRET]))
|
|
1196
|
+
: record;
|
|
1197
|
+
}
|
|
1198
|
+
function restoreSecretRecord(incoming, prior) {
|
|
1199
|
+
if (!incoming)
|
|
1200
|
+
return incoming;
|
|
1201
|
+
const priorRecord = toRecord(prior);
|
|
1202
|
+
const result = {};
|
|
1203
|
+
for (const [key, value] of Object.entries(incoming)) {
|
|
1204
|
+
if (value !== REDACTED_MCP_SECRET) {
|
|
1205
|
+
result[key] = value;
|
|
1206
|
+
continue;
|
|
1207
|
+
}
|
|
1208
|
+
const priorValue = priorRecord[key];
|
|
1209
|
+
if (typeof priorValue === 'string')
|
|
1210
|
+
result[key] = priorValue;
|
|
1211
|
+
}
|
|
1212
|
+
return result;
|
|
1213
|
+
}
|
|
1214
|
+
// Hooks carry the same secret classes as MCP servers — command-hook `env`
|
|
1215
|
+
// (tokens passed to scripts) and http-hook `headers` (auth). Mask them in the
|
|
1216
|
+
// settings response and restore them on write, mirroring the MCP scheme.
|
|
1217
|
+
function redactHookSecrets(hook) {
|
|
1218
|
+
return {
|
|
1219
|
+
...hook,
|
|
1220
|
+
hooks: hook.hooks.map((config) => ({
|
|
1221
|
+
...config,
|
|
1222
|
+
...(config.env ? { env: redactSecretRecord(config.env) } : {}),
|
|
1223
|
+
...(config.headers
|
|
1224
|
+
? { headers: redactSecretRecord(config.headers) }
|
|
1225
|
+
: {}),
|
|
1226
|
+
})),
|
|
1227
|
+
};
|
|
1228
|
+
}
|
|
1229
|
+
function restoreRedactedHookSecrets(hook, prior) {
|
|
1230
|
+
const priorHooks = Array.isArray(prior['hooks'])
|
|
1231
|
+
? prior['hooks']
|
|
1232
|
+
: [];
|
|
1233
|
+
return {
|
|
1234
|
+
...hook,
|
|
1235
|
+
hooks: hook.hooks.map((config, i) => {
|
|
1236
|
+
const priorConfig = toRecord(priorHooks[i]);
|
|
1237
|
+
return {
|
|
1238
|
+
...config,
|
|
1239
|
+
...(config.env
|
|
1240
|
+
? { env: restoreSecretRecord(config.env, priorConfig['env']) }
|
|
1241
|
+
: {}),
|
|
1242
|
+
...(config.headers
|
|
1243
|
+
? {
|
|
1244
|
+
headers: restoreSecretRecord(config.headers, priorConfig['headers']),
|
|
1245
|
+
}
|
|
1246
|
+
: {}),
|
|
1247
|
+
};
|
|
1248
|
+
}),
|
|
1249
|
+
};
|
|
1250
|
+
}
|
|
1251
|
+
function readMcpServers(source, scope) {
|
|
1252
|
+
const servers = toRecord(source['mcpServers']);
|
|
1253
|
+
return Object.entries(servers)
|
|
1254
|
+
.map(([name, value]) => {
|
|
1255
|
+
try {
|
|
1256
|
+
const server = toMcpServerConfig(value);
|
|
1257
|
+
// Never expose stdio env or http/sse auth headers in plaintext in the
|
|
1258
|
+
// settings response — they routinely hold API keys / tokens.
|
|
1259
|
+
return server
|
|
1260
|
+
? { name, scope, server: redactMcpServerSecrets(server) }
|
|
1261
|
+
: undefined;
|
|
1262
|
+
}
|
|
1263
|
+
catch (error) {
|
|
1264
|
+
debugLogger.warn(`Skipping malformed MCP server config [${scope}:${name}]:`, error);
|
|
1265
|
+
return undefined;
|
|
1266
|
+
}
|
|
1267
|
+
})
|
|
1268
|
+
.filter((entry) => !!entry);
|
|
1269
|
+
}
|
|
1270
|
+
function isHookEvent(value) {
|
|
1271
|
+
return (typeof value === 'string' &&
|
|
1272
|
+
QWEN_HOOK_EVENTS.includes(value));
|
|
1273
|
+
}
|
|
1274
|
+
function normalizeHookConfig(value) {
|
|
1275
|
+
const input = toRecord(value);
|
|
1276
|
+
const type = input['type'];
|
|
1277
|
+
if (type !== 'command' && type !== 'http') {
|
|
1278
|
+
throw RequestError.invalidParams(undefined, 'Hook type must be command or http');
|
|
1279
|
+
}
|
|
1280
|
+
const config = { type };
|
|
1281
|
+
if (type === 'command') {
|
|
1282
|
+
const command = input['command'];
|
|
1283
|
+
if (typeof command !== 'string' || !command.trim()) {
|
|
1284
|
+
throw RequestError.invalidParams(undefined, 'Command hooks require a command');
|
|
1285
|
+
}
|
|
1286
|
+
config.command = command.trim();
|
|
1287
|
+
config.env = normalizeStringRecord(input['env']);
|
|
1288
|
+
if (typeof input['async'] === 'boolean')
|
|
1289
|
+
config.async = input['async'];
|
|
1290
|
+
const shell = input['shell'];
|
|
1291
|
+
if (shell === 'bash' || shell === 'powershell')
|
|
1292
|
+
config.shell = shell;
|
|
1293
|
+
}
|
|
1294
|
+
else {
|
|
1295
|
+
const url = input['url'];
|
|
1296
|
+
if (typeof url !== 'string' || !url.trim()) {
|
|
1297
|
+
throw RequestError.invalidParams(undefined, 'HTTP hooks require a URL');
|
|
1298
|
+
}
|
|
1299
|
+
config.url = url.trim();
|
|
1300
|
+
config.headers = normalizeStringRecord(input['headers']);
|
|
1301
|
+
config.allowedEnvVars = normalizeStringArray(input['allowedEnvVars']);
|
|
1302
|
+
if (typeof input['once'] === 'boolean')
|
|
1303
|
+
config.once = input['once'];
|
|
1304
|
+
}
|
|
1305
|
+
const timeout = normalizeOptionalNumber(input['timeout']);
|
|
1306
|
+
if (timeout !== undefined)
|
|
1307
|
+
config.timeout = timeout;
|
|
1308
|
+
for (const key of ['name', 'description', 'statusMessage']) {
|
|
1309
|
+
const item = input[key];
|
|
1310
|
+
if (typeof item === 'string' && item.trim()) {
|
|
1311
|
+
config[key] = item.trim();
|
|
1312
|
+
}
|
|
1313
|
+
}
|
|
1314
|
+
return config;
|
|
1315
|
+
}
|
|
1316
|
+
function normalizeHookDefinition(value) {
|
|
1317
|
+
const input = toRecord(value);
|
|
1318
|
+
const hooks = input['hooks'];
|
|
1319
|
+
if (!Array.isArray(hooks) || hooks.length === 0) {
|
|
1320
|
+
throw RequestError.invalidParams(undefined, 'Hook definition requires at least one hook');
|
|
1321
|
+
}
|
|
1322
|
+
const definition = {
|
|
1323
|
+
hooks: hooks.map(normalizeHookConfig),
|
|
1324
|
+
};
|
|
1325
|
+
if (typeof input['matcher'] === 'string') {
|
|
1326
|
+
definition.matcher = input['matcher'];
|
|
1327
|
+
}
|
|
1328
|
+
if (typeof input['sequential'] === 'boolean') {
|
|
1329
|
+
definition.sequential = input['sequential'];
|
|
1330
|
+
}
|
|
1331
|
+
return definition;
|
|
1332
|
+
}
|
|
1333
|
+
function readHooks(source, scope, extensionName) {
|
|
1334
|
+
const hooksRoot = toRecord(source['hooks']);
|
|
1335
|
+
const entries = [];
|
|
1336
|
+
for (const event of QWEN_HOOK_EVENTS) {
|
|
1337
|
+
const eventHooks = hooksRoot[event];
|
|
1338
|
+
if (!Array.isArray(eventHooks))
|
|
1339
|
+
continue;
|
|
1340
|
+
eventHooks.forEach((hookValue, index) => {
|
|
1341
|
+
try {
|
|
1342
|
+
entries.push({
|
|
1343
|
+
event,
|
|
1344
|
+
scope,
|
|
1345
|
+
index,
|
|
1346
|
+
hook: redactHookSecrets(normalizeHookDefinition(hookValue)),
|
|
1347
|
+
extensionName,
|
|
1348
|
+
});
|
|
1349
|
+
}
|
|
1350
|
+
catch (error) {
|
|
1351
|
+
debugLogger.warn(`Skipping malformed hook entry [${scope}:${event}:${index}]:`, error);
|
|
1352
|
+
}
|
|
1353
|
+
});
|
|
1354
|
+
}
|
|
1355
|
+
return entries;
|
|
1356
|
+
}
|
|
1357
|
+
function toSettingsScope(scope) {
|
|
1358
|
+
if (scope === 'workspace')
|
|
1359
|
+
return SettingScope.Workspace;
|
|
1360
|
+
if (scope === 'user')
|
|
1361
|
+
return SettingScope.User;
|
|
1362
|
+
throw RequestError.invalidParams(undefined, 'scope must be user or workspace');
|
|
1363
|
+
}
|
|
1364
|
+
function readScopeSettings(settings, scope) {
|
|
1365
|
+
return settings.forScope(toSettingsScope(scope)).settings;
|
|
1366
|
+
}
|
|
1367
|
+
async function resolvePreferredMemoryFile(dir, fallbackFilename) {
|
|
1368
|
+
for (const filename of getAllGeminiMdFilenames()) {
|
|
1369
|
+
const filePath = path.join(dir, filename);
|
|
1370
|
+
try {
|
|
1371
|
+
await fs.access(filePath);
|
|
1372
|
+
return filePath;
|
|
1373
|
+
}
|
|
1374
|
+
catch {
|
|
1375
|
+
// Try the next configured file name.
|
|
1376
|
+
}
|
|
1377
|
+
}
|
|
1378
|
+
return path.join(dir, fallbackFilename);
|
|
1379
|
+
}
|
|
1380
|
+
async function resolveQwenMemoryPaths(params) {
|
|
1381
|
+
const fallbackFilename = getAllGeminiMdFilenames()[0] ?? 'QWEN.md';
|
|
1382
|
+
const userMemoryFile = await resolvePreferredMemoryFile(Storage.getGlobalQwenDir(), fallbackFilename);
|
|
1383
|
+
const projectMemoryFile = await resolvePreferredMemoryFile(params.cwd, fallbackFilename);
|
|
1384
|
+
const autoMemoryDir = getAutoMemoryRoot(params.projectRoot);
|
|
1385
|
+
// Resolve-only: `getMemoryPaths` is a read query, so it must not create
|
|
1386
|
+
// files or directories as a side effect (the old code ran ensureMemoryFile
|
|
1387
|
+
// + fs.mkdir on every call, including against a client-controlled
|
|
1388
|
+
// projectRoot). Callers that write memory are responsible for ensuring the
|
|
1389
|
+
// target exists.
|
|
1390
|
+
return {
|
|
1391
|
+
userMemoryFile,
|
|
1392
|
+
projectMemoryFile,
|
|
1393
|
+
autoMemoryDir,
|
|
1394
|
+
};
|
|
1395
|
+
}
|
|
1396
|
+
export async function runAcpAgent(config, settings, argv) {
|
|
1397
|
+
// Initialize config to set up ACP bootstrap services (hooks, tools, MCP)
|
|
1398
|
+
// without creating a chat session. The real per-session Config will own
|
|
1399
|
+
// GeminiClient.initialize() and any SessionStart hook execution.
|
|
1400
|
+
await config.initialize({ skipGeminiInitialization: true });
|
|
1401
|
+
// ACP forwards session messages straight to the model; under progressive
|
|
1402
|
+
// MCP availability `initialize()` returns before MCP servers settle, so
|
|
1403
|
+
// we wait here to keep the first session's tool surface consistent with
|
|
1404
|
+
// the legacy synchronous behavior.
|
|
1405
|
+
await config.waitForMcpReady();
|
|
1406
|
+
// Surface MCP failures to stderr. ACP's stdout is the protocol channel
|
|
1407
|
+
// so info/log writes are already redirected to stderr below, but we
|
|
1408
|
+
// emit this BEFORE that redirection takes effect to keep the message
|
|
1409
|
+
// visible regardless of how the host process is wired.
|
|
1410
|
+
// Defensive against tests that pass a stubbed Config without
|
|
1411
|
+
// `getFailedMcpServerNames`.
|
|
1412
|
+
const failedMcpServers = typeof config.getFailedMcpServerNames === 'function'
|
|
1413
|
+
? config.getFailedMcpServerNames()
|
|
1414
|
+
: [];
|
|
1415
|
+
if (failedMcpServers.length > 0) {
|
|
1416
|
+
process.stderr.write(`Warning: MCP server(s) failed to start: ${failedMcpServers.join(', ')}. ` +
|
|
1417
|
+
`Continuing with built-in tools and any servers that did connect.\n`);
|
|
1418
|
+
}
|
|
1419
|
+
const stdout = Writable.toWeb(process.stdout);
|
|
1420
|
+
const stdin = Readable.toWeb(process.stdin);
|
|
1421
|
+
// Stdout is used to send messages to the client, so console.log/console.info
|
|
1422
|
+
// messages to stderr so that they don't interfere with ACP.
|
|
1423
|
+
console.log = console.error;
|
|
1424
|
+
console.info = console.error;
|
|
1425
|
+
console.debug = console.error;
|
|
1426
|
+
const stream = ndJsonStream(stdout, stdin);
|
|
1427
|
+
let agentInstance;
|
|
1428
|
+
const connection = new AgentSideConnection((conn) => {
|
|
1429
|
+
agentInstance = new QwenAgent(config, settings, argv, conn);
|
|
1430
|
+
return agentInstance;
|
|
1431
|
+
}, stream);
|
|
1432
|
+
// Handle SIGTERM/SIGINT for graceful shutdown.
|
|
1433
|
+
// Without this, signal handlers registered elsewhere in the CLI
|
|
1434
|
+
// (e.g., stdin raw mode restoration) override the default exit behavior,
|
|
1435
|
+
// causing the ACP process to ignore termination signals.
|
|
1436
|
+
let shuttingDown = false;
|
|
1437
|
+
let sessionEndFired = false;
|
|
1438
|
+
// Helper to fire SessionEnd hook once, preventing double-fire from both
|
|
1439
|
+
// shutdown handler path and connection.closed path.
|
|
1440
|
+
const fireSessionEndOnce = async (reason) => {
|
|
1441
|
+
if (sessionEndFired)
|
|
1442
|
+
return;
|
|
1443
|
+
sessionEndFired = true;
|
|
1444
|
+
const configs = new Set([config]);
|
|
1445
|
+
const sessions = agentInstance?.getActiveSessions();
|
|
1446
|
+
if (sessions) {
|
|
1447
|
+
for (const session of sessions) {
|
|
1448
|
+
const sessionConfig = session.getConfig?.();
|
|
1449
|
+
if (sessionConfig) {
|
|
1450
|
+
configs.add(sessionConfig);
|
|
1451
|
+
}
|
|
1452
|
+
}
|
|
1453
|
+
}
|
|
1454
|
+
for (const cfg of configs) {
|
|
1455
|
+
const hookSystem = cfg.getHookSystem?.();
|
|
1456
|
+
const hooksEnabled = !cfg.getDisableAllHooks?.();
|
|
1457
|
+
if (!hooksEnabled ||
|
|
1458
|
+
!hookSystem ||
|
|
1459
|
+
!cfg.hasHooksForEvent?.('SessionEnd')) {
|
|
1460
|
+
continue;
|
|
1461
|
+
}
|
|
1462
|
+
try {
|
|
1463
|
+
await hookSystem.fireSessionEndEvent(reason);
|
|
1464
|
+
}
|
|
1465
|
+
catch (err) {
|
|
1466
|
+
debugLogger.warn(`SessionEnd hook failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1467
|
+
}
|
|
1468
|
+
}
|
|
1469
|
+
};
|
|
1470
|
+
const shutdownHandler = async () => {
|
|
1471
|
+
if (shuttingDown)
|
|
1472
|
+
return;
|
|
1473
|
+
shuttingDown = true;
|
|
1474
|
+
debugLogger.debug('[ACP] Shutdown signal received, closing streams');
|
|
1475
|
+
// Fire SessionEnd hook for all active sessions (aligned with core path)
|
|
1476
|
+
await fireSessionEndOnce(SessionEndReason.Other);
|
|
1477
|
+
agentInstance?.disposeSessions();
|
|
1478
|
+
try {
|
|
1479
|
+
process.stdin.destroy();
|
|
1480
|
+
}
|
|
1481
|
+
catch {
|
|
1482
|
+
// stdin may already be closed
|
|
1483
|
+
}
|
|
1484
|
+
try {
|
|
1485
|
+
process.stdout.destroy();
|
|
1486
|
+
}
|
|
1487
|
+
catch {
|
|
1488
|
+
// stdout may already be closed
|
|
1489
|
+
}
|
|
1490
|
+
// Clean up child processes (MCP servers, etc.) and force exit.
|
|
1491
|
+
// Without this, orphan subprocesses keep the Node.js event loop alive
|
|
1492
|
+
// and the CLI process never terminates after the IDE disconnects.
|
|
1493
|
+
runExitCleanup()
|
|
1494
|
+
.catch((err) => {
|
|
1495
|
+
debugLogger.error('[ACP] Cleanup error:', err);
|
|
1496
|
+
})
|
|
1497
|
+
.finally(() => {
|
|
1498
|
+
process.exit(0);
|
|
1499
|
+
});
|
|
1500
|
+
};
|
|
1501
|
+
process.on('SIGTERM', shutdownHandler);
|
|
1502
|
+
process.on('SIGINT', shutdownHandler);
|
|
1503
|
+
await connection.closed;
|
|
1504
|
+
// Connection closed by IDE - fire SessionEnd hook (aligned with core path)
|
|
1505
|
+
await fireSessionEndOnce(SessionEndReason.PromptInputExit);
|
|
1506
|
+
agentInstance?.disposeSessions();
|
|
1507
|
+
process.off('SIGTERM', shutdownHandler);
|
|
1508
|
+
process.off('SIGINT', shutdownHandler);
|
|
1509
|
+
}
|
|
1510
|
+
export function toStdioServer(server) {
|
|
1511
|
+
if ('command' in server && 'args' in server && 'env' in server) {
|
|
1512
|
+
return server;
|
|
1513
|
+
}
|
|
1514
|
+
return undefined;
|
|
1515
|
+
}
|
|
1516
|
+
export function toSseServer(server) {
|
|
1517
|
+
if ('type' in server && server.type === 'sse') {
|
|
1518
|
+
return server;
|
|
1519
|
+
}
|
|
1520
|
+
return undefined;
|
|
1521
|
+
}
|
|
1522
|
+
export function toHttpServer(server) {
|
|
1523
|
+
if ('type' in server && server.type === 'http') {
|
|
1524
|
+
return server;
|
|
1525
|
+
}
|
|
1526
|
+
return undefined;
|
|
1527
|
+
}
|
|
1528
|
+
class QwenAgent {
|
|
1529
|
+
config;
|
|
1530
|
+
settings;
|
|
1531
|
+
argv;
|
|
1532
|
+
connection;
|
|
1533
|
+
sessions = new Map();
|
|
1534
|
+
clientCapabilities;
|
|
1535
|
+
getActiveSessions() {
|
|
1536
|
+
return [...this.sessions.values()];
|
|
1537
|
+
}
|
|
1538
|
+
disposeSessions() {
|
|
1539
|
+
for (const session of this.sessions.values()) {
|
|
1540
|
+
session.dispose();
|
|
1541
|
+
}
|
|
1542
|
+
this.sessions.clear();
|
|
1543
|
+
}
|
|
1544
|
+
constructor(config, settings, argv, connection) {
|
|
1545
|
+
this.config = config;
|
|
1546
|
+
this.settings = settings;
|
|
1547
|
+
this.argv = argv;
|
|
1548
|
+
this.connection = connection;
|
|
1549
|
+
}
|
|
1550
|
+
async initialize(args) {
|
|
1551
|
+
this.clientCapabilities = args.clientCapabilities;
|
|
1552
|
+
const authMethods = buildAuthMethods();
|
|
1553
|
+
const version = process.env['CLI_VERSION'] || process.version;
|
|
1554
|
+
return {
|
|
1555
|
+
protocolVersion: PROTOCOL_VERSION,
|
|
1556
|
+
agentInfo: {
|
|
1557
|
+
name: 'qwen-code',
|
|
1558
|
+
title: 'Qwen Code',
|
|
1559
|
+
version,
|
|
1560
|
+
},
|
|
1561
|
+
authMethods,
|
|
1562
|
+
agentCapabilities: {
|
|
1563
|
+
loadSession: true,
|
|
1564
|
+
promptCapabilities: {
|
|
1565
|
+
image: true,
|
|
1566
|
+
audio: true,
|
|
1567
|
+
embeddedContext: true,
|
|
1568
|
+
},
|
|
1569
|
+
sessionCapabilities: {
|
|
1570
|
+
list: {},
|
|
1571
|
+
resume: {},
|
|
1572
|
+
},
|
|
1573
|
+
mcpCapabilities: {
|
|
1574
|
+
sse: true,
|
|
1575
|
+
http: true,
|
|
1576
|
+
},
|
|
1577
|
+
},
|
|
1578
|
+
};
|
|
1579
|
+
}
|
|
1580
|
+
async authenticate({ methodId }) {
|
|
1581
|
+
const method = z.nativeEnum(AuthType).parse(methodId);
|
|
1582
|
+
let authUri;
|
|
1583
|
+
const authUriHandler = (deviceAuth) => {
|
|
1584
|
+
authUri = deviceAuth.verification_uri_complete;
|
|
1585
|
+
void this.connection.extNotification('authenticate/update', {
|
|
1586
|
+
_meta: { authUri },
|
|
1587
|
+
});
|
|
1588
|
+
};
|
|
1589
|
+
if (method === AuthType.QWEN_OAUTH) {
|
|
1590
|
+
qwenOAuth2Events.once(QwenOAuth2Event.AuthUri, authUriHandler);
|
|
1591
|
+
}
|
|
1592
|
+
await clearCachedCredentialFile();
|
|
1593
|
+
try {
|
|
1594
|
+
await this.config.refreshAuth(method);
|
|
1595
|
+
this.settings.setValue(SettingScope.User, 'security.auth.selectedType', method);
|
|
1596
|
+
}
|
|
1597
|
+
finally {
|
|
1598
|
+
if (method === AuthType.QWEN_OAUTH) {
|
|
1599
|
+
qwenOAuth2Events.off(QwenOAuth2Event.AuthUri, authUriHandler);
|
|
1600
|
+
}
|
|
1601
|
+
}
|
|
1602
|
+
}
|
|
1603
|
+
async newSession({ cwd, mcpServers, }) {
|
|
1604
|
+
const config = await this.newSessionConfig(cwd, mcpServers);
|
|
1605
|
+
await this.ensureAuthenticated(config);
|
|
1606
|
+
this.setupFileSystem(config);
|
|
1607
|
+
const session = await this.createAndStoreSession(config);
|
|
1608
|
+
const availableModels = this.buildAvailableModels(config);
|
|
1609
|
+
const modesData = this.buildModesData(config);
|
|
1610
|
+
const configOptions = this.buildConfigOptions(config);
|
|
1611
|
+
return {
|
|
1612
|
+
sessionId: session.getId(),
|
|
1613
|
+
models: availableModels,
|
|
1614
|
+
modes: modesData,
|
|
1615
|
+
configOptions,
|
|
1616
|
+
};
|
|
1617
|
+
}
|
|
1618
|
+
async loadSession(params) {
|
|
1619
|
+
const exists = await runWithAcpRuntimeOutputDir(this.settings, params.cwd, async () => {
|
|
1620
|
+
const sessionService = new SessionService(params.cwd);
|
|
1621
|
+
return sessionService.sessionExists(params.sessionId);
|
|
1622
|
+
});
|
|
1623
|
+
if (!exists) {
|
|
1624
|
+
throw RequestError.resourceNotFound(`session:${params.sessionId}`);
|
|
1625
|
+
}
|
|
1626
|
+
const config = await this.newSessionConfig(params.cwd,
|
|
1627
|
+
// `LoadSessionRequest.mcpServers` is required in today's ACP
|
|
1628
|
+
// schema, but mirror `unstable_resumeSession` and tolerate a
|
|
1629
|
+
// future loosening — `newSessionConfig` iterates the list, so
|
|
1630
|
+
// a `null`/`undefined` would otherwise throw `TypeError`.
|
|
1631
|
+
params.mcpServers ?? [], params.sessionId, true);
|
|
1632
|
+
await this.ensureAuthenticated(config);
|
|
1633
|
+
this.setupFileSystem(config);
|
|
1634
|
+
const sessionData = config.getResumedSessionData();
|
|
1635
|
+
const session = await this.createAndStoreSession(config, sessionData?.conversation);
|
|
1636
|
+
await this.#restoreWorktreeOnResume(config, session);
|
|
1637
|
+
const modesData = this.buildModesData(config);
|
|
1638
|
+
const availableModels = this.buildAvailableModels(config);
|
|
1639
|
+
const configOptions = this.buildConfigOptions(config);
|
|
1640
|
+
return {
|
|
1641
|
+
modes: modesData,
|
|
1642
|
+
models: availableModels,
|
|
1643
|
+
configOptions,
|
|
1644
|
+
};
|
|
1645
|
+
}
|
|
1646
|
+
async unstable_resumeSession(params) {
|
|
1647
|
+
const exists = await runWithAcpRuntimeOutputDir(this.settings, params.cwd, async () => {
|
|
1648
|
+
const sessionService = new SessionService(params.cwd);
|
|
1649
|
+
return sessionService.sessionExists(params.sessionId);
|
|
1650
|
+
});
|
|
1651
|
+
if (!exists) {
|
|
1652
|
+
throw RequestError.resourceNotFound(`session:${params.sessionId}`);
|
|
1653
|
+
}
|
|
1654
|
+
const config = await this.newSessionConfig(params.cwd, params.mcpServers ?? [], params.sessionId, true);
|
|
1655
|
+
await this.ensureAuthenticated(config);
|
|
1656
|
+
this.setupFileSystem(config);
|
|
1657
|
+
const session = await this.createAndStoreSession(config);
|
|
1658
|
+
await this.#restoreWorktreeOnResume(config, session);
|
|
1659
|
+
const modesData = this.buildModesData(config);
|
|
1660
|
+
const availableModels = this.buildAvailableModels(config);
|
|
1661
|
+
const configOptions = this.buildConfigOptions(config);
|
|
1662
|
+
return {
|
|
1663
|
+
modes: modesData,
|
|
1664
|
+
models: availableModels,
|
|
1665
|
+
configOptions,
|
|
1666
|
+
};
|
|
1667
|
+
}
|
|
1668
|
+
/**
|
|
1669
|
+
* Shared worktree restore for both ACP entry points (`loadSession` and
|
|
1670
|
+
* `unstable_resumeSession`). Reads the WorktreeSession sidecar, cleans
|
|
1671
|
+
* up stale ones, and queues the context reminder on the Session so the
|
|
1672
|
+
* next `#executePrompt` prepends it to the user's first prompt.
|
|
1673
|
+
*
|
|
1674
|
+
* Best-effort: failures don't block session load — worktree context
|
|
1675
|
+
* is a hint to the model, not a load-time correctness requirement.
|
|
1676
|
+
* (PR #4174 review #3259975... — parity between the two ACP entry
|
|
1677
|
+
* points.)
|
|
1678
|
+
*/
|
|
1679
|
+
async #restoreWorktreeOnResume(config, session) {
|
|
1680
|
+
try {
|
|
1681
|
+
const sessionPath = config
|
|
1682
|
+
.getSessionService()
|
|
1683
|
+
.getWorktreeSessionPath(config.getSessionId());
|
|
1684
|
+
const restored = await restoreWorktreeContext(sessionPath);
|
|
1685
|
+
if (restored.contextMessage) {
|
|
1686
|
+
session.pendingWorktreeNotice = restored.contextMessage;
|
|
1687
|
+
}
|
|
1688
|
+
}
|
|
1689
|
+
catch (error) {
|
|
1690
|
+
debugLogger.warn(`ACP worktree restore failed: ${error}`);
|
|
1691
|
+
}
|
|
1692
|
+
}
|
|
1693
|
+
async unstable_listSessions(params) {
|
|
1694
|
+
const cwd = params.cwd || process.cwd();
|
|
1695
|
+
const numericCursor = params.cursor ? Number(params.cursor) : undefined;
|
|
1696
|
+
// The ACP spec's ListSessionsRequest doesn't include a page-size field,
|
|
1697
|
+
// so the SDK's zod validator strips any top-level `size` the client sends
|
|
1698
|
+
// before it reaches this handler. Carry page size through `_meta.size`
|
|
1699
|
+
// (same pattern filesystem.ts uses for `_meta.bom` / `_meta.encoding`).
|
|
1700
|
+
const metaSize = params._meta?.['size'];
|
|
1701
|
+
const size = typeof metaSize === 'number' && metaSize > 0
|
|
1702
|
+
? Math.floor(metaSize)
|
|
1703
|
+
: undefined;
|
|
1704
|
+
const result = await runWithAcpRuntimeOutputDir(this.settings, cwd, () => {
|
|
1705
|
+
const sessionService = new SessionService(cwd);
|
|
1706
|
+
return sessionService.listSessions({
|
|
1707
|
+
cursor: Number.isNaN(numericCursor) ? undefined : numericCursor,
|
|
1708
|
+
size,
|
|
1709
|
+
});
|
|
1710
|
+
});
|
|
1711
|
+
const sessions = result.items.map((item) => ({
|
|
1712
|
+
_meta: {
|
|
1713
|
+
createdAt: item.startTime,
|
|
1714
|
+
startTime: item.startTime,
|
|
1715
|
+
preview: item.prompt,
|
|
1716
|
+
...(item.gitBranch ? { gitBranch: item.gitBranch } : {}),
|
|
1717
|
+
...(item.titleSource ? { titleSource: item.titleSource } : {}),
|
|
1718
|
+
},
|
|
1719
|
+
cwd: item.cwd,
|
|
1720
|
+
sessionId: item.sessionId,
|
|
1721
|
+
title: item.customTitle || item.prompt || '(session)',
|
|
1722
|
+
updatedAt: new Date(item.mtime).toISOString(),
|
|
1723
|
+
}));
|
|
1724
|
+
return {
|
|
1725
|
+
sessions,
|
|
1726
|
+
nextCursor: result.nextCursor != null ? String(result.nextCursor) : undefined,
|
|
1727
|
+
};
|
|
1728
|
+
}
|
|
1729
|
+
async setSessionMode(params) {
|
|
1730
|
+
const session = this.sessions.get(params.sessionId);
|
|
1731
|
+
if (!session) {
|
|
1732
|
+
throw RequestError.invalidParams(undefined, `Session not found for id: ${params.sessionId}`);
|
|
1733
|
+
}
|
|
1734
|
+
return session.setMode(params);
|
|
1735
|
+
}
|
|
1736
|
+
async unstable_setSessionModel(params) {
|
|
1737
|
+
const session = this.sessions.get(params.sessionId);
|
|
1738
|
+
if (!session) {
|
|
1739
|
+
throw RequestError.invalidParams(undefined, `Session not found for id: ${params.sessionId}`);
|
|
1740
|
+
}
|
|
1741
|
+
return await session.setModel(params);
|
|
1742
|
+
}
|
|
1743
|
+
async setSessionConfigOption(params) {
|
|
1744
|
+
const { sessionId, configId, value } = params;
|
|
1745
|
+
const session = this.sessions.get(sessionId);
|
|
1746
|
+
if (!session) {
|
|
1747
|
+
throw RequestError.invalidParams(undefined, `Session not found for id: ${sessionId}`);
|
|
1748
|
+
}
|
|
1749
|
+
switch (configId) {
|
|
1750
|
+
case 'mode': {
|
|
1751
|
+
await this.setSessionMode({
|
|
1752
|
+
sessionId,
|
|
1753
|
+
modeId: value,
|
|
1754
|
+
});
|
|
1755
|
+
break;
|
|
1756
|
+
}
|
|
1757
|
+
case 'model': {
|
|
1758
|
+
await session.setModel({
|
|
1759
|
+
sessionId,
|
|
1760
|
+
modelId: value,
|
|
1761
|
+
}, { persistDefault: false });
|
|
1762
|
+
break;
|
|
1763
|
+
}
|
|
1764
|
+
default:
|
|
1765
|
+
throw RequestError.invalidParams(undefined, `Unsupported configId: ${configId}`);
|
|
1766
|
+
}
|
|
1767
|
+
return {
|
|
1768
|
+
configOptions: this.buildConfigOptions(session.getConfig()),
|
|
1769
|
+
};
|
|
1770
|
+
}
|
|
1771
|
+
async prompt(params) {
|
|
1772
|
+
const session = this.sessions.get(params.sessionId);
|
|
1773
|
+
if (!session) {
|
|
1774
|
+
throw new Error(`Session not found: ${params.sessionId}`);
|
|
1775
|
+
}
|
|
1776
|
+
return session.prompt(params);
|
|
1777
|
+
}
|
|
1778
|
+
async cancel(params) {
|
|
1779
|
+
const session = this.sessions.get(params.sessionId);
|
|
1780
|
+
if (!session) {
|
|
1781
|
+
throw new Error(`Session not found: ${params.sessionId}`);
|
|
1782
|
+
}
|
|
1783
|
+
await session.cancelPendingPrompt();
|
|
1784
|
+
}
|
|
1785
|
+
loadPermissionSettings(cwd) {
|
|
1786
|
+
this.settings = loadSettings(cwd);
|
|
1787
|
+
return this.settings;
|
|
1788
|
+
}
|
|
1789
|
+
buildPermissionSettings(settings) {
|
|
1790
|
+
return {
|
|
1791
|
+
user: {
|
|
1792
|
+
path: settings.user.path,
|
|
1793
|
+
rules: readPermissionRuleSet(settings.user.settings),
|
|
1794
|
+
},
|
|
1795
|
+
workspace: {
|
|
1796
|
+
path: settings.workspace.path,
|
|
1797
|
+
rules: readPermissionRuleSet(settings.workspace.settings),
|
|
1798
|
+
},
|
|
1799
|
+
merged: readPermissionRuleSet(settings.merged),
|
|
1800
|
+
isTrusted: settings.isTrusted,
|
|
1801
|
+
};
|
|
1802
|
+
}
|
|
1803
|
+
async buildCoreSettings(settings, cwd) {
|
|
1804
|
+
const userSettings = settings.user.settings;
|
|
1805
|
+
const workspaceSettings = settings.workspace.settings;
|
|
1806
|
+
const mergedSettings = settings.merged;
|
|
1807
|
+
let extensions = [];
|
|
1808
|
+
try {
|
|
1809
|
+
const extensionManager = new ExtensionManager({
|
|
1810
|
+
workspaceDir: cwd,
|
|
1811
|
+
isWorkspaceTrusted: settings.isTrusted,
|
|
1812
|
+
});
|
|
1813
|
+
await extensionManager.refreshCache();
|
|
1814
|
+
extensions = extensionManager.getLoadedExtensions();
|
|
1815
|
+
}
|
|
1816
|
+
catch (error) {
|
|
1817
|
+
debugLogger.warn('Extension loading failed, continuing without extensions:', error);
|
|
1818
|
+
}
|
|
1819
|
+
const extensionEntries = await Promise.all(extensions.map(async (extension) => {
|
|
1820
|
+
const userEnv = await getScopedEnvContents(extension.config, extension.id, ExtensionSettingScope.USER);
|
|
1821
|
+
const workspaceEnv = await getScopedEnvContents(extension.config, extension.id, ExtensionSettingScope.WORKSPACE);
|
|
1822
|
+
const settingDefs = extension.settings ?? [];
|
|
1823
|
+
return {
|
|
1824
|
+
id: extension.id,
|
|
1825
|
+
name: extension.name,
|
|
1826
|
+
version: extension.version,
|
|
1827
|
+
isActive: extension.isActive,
|
|
1828
|
+
path: extension.path,
|
|
1829
|
+
commands: extension.commands ?? [],
|
|
1830
|
+
skills: (extension.skills ?? []).map((skill) => skill.name),
|
|
1831
|
+
mcpServers: Object.keys(extension.config.mcpServers ?? {}),
|
|
1832
|
+
settings: settingDefs.map((setting) => {
|
|
1833
|
+
const userValue = userEnv[setting.envVar];
|
|
1834
|
+
const workspaceValue = workspaceEnv[setting.envVar];
|
|
1835
|
+
const hasWorkspaceValue = workspaceValue !== undefined;
|
|
1836
|
+
const hasUserValue = userValue !== undefined;
|
|
1837
|
+
const effectiveValue = hasWorkspaceValue
|
|
1838
|
+
? workspaceValue
|
|
1839
|
+
: userValue;
|
|
1840
|
+
const effectiveScope = hasWorkspaceValue
|
|
1841
|
+
? 'workspace'
|
|
1842
|
+
: hasUserValue
|
|
1843
|
+
? 'user'
|
|
1844
|
+
: undefined;
|
|
1845
|
+
return {
|
|
1846
|
+
name: setting.name,
|
|
1847
|
+
description: setting.description,
|
|
1848
|
+
envVar: setting.envVar,
|
|
1849
|
+
sensitive: !!setting.sensitive,
|
|
1850
|
+
userValue: setting.sensitive ? undefined : userValue,
|
|
1851
|
+
workspaceValue: setting.sensitive ? undefined : workspaceValue,
|
|
1852
|
+
effectiveValue: setting.sensitive ? undefined : effectiveValue,
|
|
1853
|
+
effectiveScope,
|
|
1854
|
+
hasUserValue,
|
|
1855
|
+
hasWorkspaceValue,
|
|
1856
|
+
};
|
|
1857
|
+
}),
|
|
1858
|
+
};
|
|
1859
|
+
}));
|
|
1860
|
+
const activeExtensions = extensions.filter((extension) => extension.isActive);
|
|
1861
|
+
const extensionMcpServers = activeExtensions.flatMap((extension) => readMcpServers({ mcpServers: extension.config.mcpServers ?? {} }, 'extension').map((entry) => ({
|
|
1862
|
+
...entry,
|
|
1863
|
+
server: { ...entry.server, extensionName: extension.name },
|
|
1864
|
+
})));
|
|
1865
|
+
const extensionHooks = activeExtensions.flatMap((extension) => readHooks({ hooks: extension.hooks ?? {} }, 'extension', extension.name));
|
|
1866
|
+
// Build the merged MCP/hook lists from the user and workspace settings
|
|
1867
|
+
// separately so each entry keeps its real scope label. Reading
|
|
1868
|
+
// mergedSettings with a single 'workspace' label mislabeled user-scope
|
|
1869
|
+
// servers/hooks. MCP servers are keyed by name, so dedupe with workspace
|
|
1870
|
+
// overriding user (matching the merged/effective semantics); hooks stack
|
|
1871
|
+
// across scopes, so they are concatenated.
|
|
1872
|
+
const mergedMcpByName = new Map();
|
|
1873
|
+
for (const entry of readMcpServers(userSettings, 'user')) {
|
|
1874
|
+
mergedMcpByName.set(entry.name, entry);
|
|
1875
|
+
}
|
|
1876
|
+
if (settings.isTrusted) {
|
|
1877
|
+
for (const entry of readMcpServers(workspaceSettings, 'workspace')) {
|
|
1878
|
+
mergedMcpByName.set(entry.name, entry);
|
|
1879
|
+
}
|
|
1880
|
+
}
|
|
1881
|
+
const mergedHooks = [
|
|
1882
|
+
...readHooks(userSettings, 'user'),
|
|
1883
|
+
...(settings.isTrusted ? readHooks(workspaceSettings, 'workspace') : []),
|
|
1884
|
+
];
|
|
1885
|
+
return {
|
|
1886
|
+
user: {
|
|
1887
|
+
path: settings.user.path,
|
|
1888
|
+
values: readCoreSettingValues(userSettings),
|
|
1889
|
+
mcpServers: readMcpServers(userSettings, 'user'),
|
|
1890
|
+
hooks: readHooks(userSettings, 'user'),
|
|
1891
|
+
},
|
|
1892
|
+
workspace: {
|
|
1893
|
+
path: settings.workspace.path,
|
|
1894
|
+
values: readCoreSettingValues(workspaceSettings),
|
|
1895
|
+
mcpServers: readMcpServers(workspaceSettings, 'workspace'),
|
|
1896
|
+
hooks: readHooks(workspaceSettings, 'workspace'),
|
|
1897
|
+
},
|
|
1898
|
+
merged: {
|
|
1899
|
+
values: readCoreSettingValues(mergedSettings),
|
|
1900
|
+
mcpServers: [...mergedMcpByName.values(), ...extensionMcpServers],
|
|
1901
|
+
hooks: [...mergedHooks, ...extensionHooks],
|
|
1902
|
+
},
|
|
1903
|
+
extensions: extensionEntries,
|
|
1904
|
+
isTrusted: settings.isTrusted,
|
|
1905
|
+
};
|
|
1906
|
+
}
|
|
1907
|
+
syncLivePermissionManagers(before, after) {
|
|
1908
|
+
for (const ruleType of PERMISSION_RULE_TYPES) {
|
|
1909
|
+
const oldRules = new Set(before[ruleType]);
|
|
1910
|
+
const newRules = new Set(after[ruleType]);
|
|
1911
|
+
const removed = before[ruleType].filter((rule) => !newRules.has(rule));
|
|
1912
|
+
const added = after[ruleType].filter((rule) => !oldRules.has(rule));
|
|
1913
|
+
if (removed.length === 0 && added.length === 0)
|
|
1914
|
+
continue;
|
|
1915
|
+
for (const session of this.sessions.values()) {
|
|
1916
|
+
const pm = session.getConfig().getPermissionManager?.();
|
|
1917
|
+
if (!pm)
|
|
1918
|
+
continue;
|
|
1919
|
+
// Isolate per-session failures: a stale/broken permission manager for
|
|
1920
|
+
// one session must not abort syncing the rest (settings are already
|
|
1921
|
+
// persisted, so the in-memory sync is best-effort).
|
|
1922
|
+
try {
|
|
1923
|
+
for (const rule of removed) {
|
|
1924
|
+
pm.removePersistentRule(rule, ruleType);
|
|
1925
|
+
}
|
|
1926
|
+
for (const rule of added) {
|
|
1927
|
+
pm.addPersistentRule(rule, ruleType);
|
|
1928
|
+
}
|
|
1929
|
+
}
|
|
1930
|
+
catch (error) {
|
|
1931
|
+
debugLogger.warn(`Failed to sync permission rules to a live session: ${error instanceof Error ? error.message : String(error)}`);
|
|
1932
|
+
}
|
|
1933
|
+
}
|
|
1934
|
+
}
|
|
1935
|
+
}
|
|
1936
|
+
workspaceCwd(config) {
|
|
1937
|
+
return config.getTargetDir();
|
|
1938
|
+
}
|
|
1939
|
+
safeWorkspaceCwd(config) {
|
|
1940
|
+
try {
|
|
1941
|
+
return this.workspaceCwd(config);
|
|
1942
|
+
}
|
|
1943
|
+
catch {
|
|
1944
|
+
return '';
|
|
1945
|
+
}
|
|
1946
|
+
}
|
|
1947
|
+
mcpTransport(server) {
|
|
1948
|
+
if (server &&
|
|
1949
|
+
typeof server === 'object' &&
|
|
1950
|
+
'type' in server &&
|
|
1951
|
+
server.type === 'sdk') {
|
|
1952
|
+
return 'sdk';
|
|
1953
|
+
}
|
|
1954
|
+
if (server &&
|
|
1955
|
+
typeof server === 'object' &&
|
|
1956
|
+
typeof server.httpUrl === 'string') {
|
|
1957
|
+
return 'http';
|
|
1958
|
+
}
|
|
1959
|
+
if (server &&
|
|
1960
|
+
typeof server === 'object' &&
|
|
1961
|
+
typeof server.url === 'string') {
|
|
1962
|
+
return 'sse';
|
|
1963
|
+
}
|
|
1964
|
+
if (server &&
|
|
1965
|
+
typeof server === 'object' &&
|
|
1966
|
+
typeof server.tcp === 'string') {
|
|
1967
|
+
return 'websocket';
|
|
1968
|
+
}
|
|
1969
|
+
if (server &&
|
|
1970
|
+
typeof server === 'object' &&
|
|
1971
|
+
typeof server.command === 'string') {
|
|
1972
|
+
return 'stdio';
|
|
1973
|
+
}
|
|
1974
|
+
return 'unknown';
|
|
1975
|
+
}
|
|
1976
|
+
mcpStatus(status) {
|
|
1977
|
+
switch (status) {
|
|
1978
|
+
case MCPServerStatus.CONNECTED:
|
|
1979
|
+
return 'connected';
|
|
1980
|
+
case MCPServerStatus.CONNECTING:
|
|
1981
|
+
return 'connecting';
|
|
1982
|
+
case MCPServerStatus.DISCONNECTED:
|
|
1983
|
+
default:
|
|
1984
|
+
return 'disconnected';
|
|
1985
|
+
}
|
|
1986
|
+
}
|
|
1987
|
+
mcpCellStatus(status, disabled) {
|
|
1988
|
+
if (disabled)
|
|
1989
|
+
return 'disabled';
|
|
1990
|
+
switch (status) {
|
|
1991
|
+
case MCPServerStatus.CONNECTED:
|
|
1992
|
+
return 'ok';
|
|
1993
|
+
case MCPServerStatus.CONNECTING:
|
|
1994
|
+
return 'warning';
|
|
1995
|
+
case MCPServerStatus.DISCONNECTED:
|
|
1996
|
+
default:
|
|
1997
|
+
return 'error';
|
|
1998
|
+
}
|
|
1999
|
+
}
|
|
2000
|
+
discoveryState() {
|
|
2001
|
+
const state = getMCPDiscoveryState();
|
|
2002
|
+
switch (state) {
|
|
2003
|
+
case MCPDiscoveryState.IN_PROGRESS:
|
|
2004
|
+
return 'in_progress';
|
|
2005
|
+
case MCPDiscoveryState.COMPLETED:
|
|
2006
|
+
return 'completed';
|
|
2007
|
+
case MCPDiscoveryState.NOT_STARTED:
|
|
2008
|
+
default:
|
|
2009
|
+
return 'not_started';
|
|
2010
|
+
}
|
|
2011
|
+
}
|
|
2012
|
+
buildWorkspaceMcpStatus(config) {
|
|
2013
|
+
try {
|
|
2014
|
+
const workspaceCwd = this.workspaceCwd(config);
|
|
2015
|
+
const servers = config.getMcpServers() ?? {};
|
|
2016
|
+
// PR 14: pull live accounting + budget config from the child's
|
|
2017
|
+
// McpClientManager so the daemon's read-only route reflects the
|
|
2018
|
+
// single source of truth (not a daemon-side polled cache).
|
|
2019
|
+
// `getToolRegistry()` and `getMcpClientManager()` are best-effort
|
|
2020
|
+
// — older test stubs or partially-initialized configs may not
|
|
2021
|
+
// expose them; in that case we fall back to "no budget surface".
|
|
2022
|
+
let clientCount;
|
|
2023
|
+
let clientBudget;
|
|
2024
|
+
let budgetMode;
|
|
2025
|
+
let refusedSet = new Set();
|
|
2026
|
+
try {
|
|
2027
|
+
const manager = config.getToolRegistry()?.getMcpClientManager();
|
|
2028
|
+
if (manager) {
|
|
2029
|
+
const accounting = manager.getMcpClientAccounting();
|
|
2030
|
+
clientCount = accounting.total;
|
|
2031
|
+
clientBudget = manager.getMcpClientBudget();
|
|
2032
|
+
budgetMode = manager.getMcpBudgetMode();
|
|
2033
|
+
refusedSet = new Set(accounting.refusedServerNames);
|
|
2034
|
+
}
|
|
2035
|
+
}
|
|
2036
|
+
catch (err) {
|
|
2037
|
+
// Accounting failure must not crash the snapshot — the per-
|
|
2038
|
+
// server data is still useful even without budget overlay.
|
|
2039
|
+
// PR 14 fix (review #4247 wenshao S7a): bumped from
|
|
2040
|
+
// `debugLogger.debug` to stderr `process.stderr.write` so a
|
|
2041
|
+
// production daemon emits a visible warning when accounting
|
|
2042
|
+
// breaks. `debugLogger.debug` is gated on the operator
|
|
2043
|
+
// having set debug=true, which makes silent slot-leak / type-
|
|
2044
|
+
// mismatch failures invisible in real deployments.
|
|
2045
|
+
process.stderr.write(`qwen serve: getMcpClientAccounting failed: ` +
|
|
2046
|
+
`${err instanceof Error ? err.message : String(err)}\n`);
|
|
2047
|
+
}
|
|
2048
|
+
return {
|
|
2049
|
+
v: STATUS_SCHEMA_VERSION,
|
|
2050
|
+
workspaceCwd,
|
|
2051
|
+
initialized: true,
|
|
2052
|
+
discoveryState: this.discoveryState(),
|
|
2053
|
+
servers: Object.entries(servers).map(([name, server]) => {
|
|
2054
|
+
const disabled = config.isMcpServerDisabled(name);
|
|
2055
|
+
const rawStatus = getMCPServerStatus(name);
|
|
2056
|
+
const refusedByBudget = refusedSet.has(name);
|
|
2057
|
+
// PR 14 fix (review #4247): config-disable takes precedence
|
|
2058
|
+
// over budget-refusal. `lastRefusedServerNames` is a
|
|
2059
|
+
// per-discovery-pass snapshot; if an operator runs
|
|
2060
|
+
// `/mcp disable <name>` against a server that was refused
|
|
2061
|
+
// last pass, the entry stays in the refused list until the
|
|
2062
|
+
// next discovery pass clears it (`McpClientManager.removeServer`
|
|
2063
|
+
// now drops the entry too — see sibling fix). Either way,
|
|
2064
|
+
// a `disabled` cell should NEVER show `budget_exhausted` —
|
|
2065
|
+
// the operator's deliberate disable wins.
|
|
2066
|
+
const effectivelyRefused = refusedByBudget && !disabled;
|
|
2067
|
+
const out = {
|
|
2068
|
+
kind: 'mcp_server',
|
|
2069
|
+
// Refused-by-budget shadows the raw status: the rawStatus
|
|
2070
|
+
// is `DISCONNECTED` (we never tried to connect), but the
|
|
2071
|
+
// operator-facing severity is `error` with an explanatory
|
|
2072
|
+
// errorKind rather than the generic disconnected `error`.
|
|
2073
|
+
status: effectivelyRefused
|
|
2074
|
+
? 'error'
|
|
2075
|
+
: this.mcpCellStatus(rawStatus, disabled),
|
|
2076
|
+
name,
|
|
2077
|
+
mcpStatus: this.mcpStatus(rawStatus),
|
|
2078
|
+
transport: this.mcpTransport(server),
|
|
2079
|
+
disabled,
|
|
2080
|
+
};
|
|
2081
|
+
if (effectivelyRefused) {
|
|
2082
|
+
out.errorKind = 'budget_exhausted';
|
|
2083
|
+
out.disabledReason = 'budget';
|
|
2084
|
+
out.hint =
|
|
2085
|
+
'Raise --mcp-client-budget or remove servers from mcpServers config.';
|
|
2086
|
+
}
|
|
2087
|
+
else if (disabled) {
|
|
2088
|
+
out.disabledReason = 'config';
|
|
2089
|
+
}
|
|
2090
|
+
const description = server && typeof server === 'object'
|
|
2091
|
+
? server.description
|
|
2092
|
+
: undefined;
|
|
2093
|
+
const extensionName = server && typeof server === 'object'
|
|
2094
|
+
? server.extensionName
|
|
2095
|
+
: undefined;
|
|
2096
|
+
if (typeof description === 'string') {
|
|
2097
|
+
out.description = description;
|
|
2098
|
+
}
|
|
2099
|
+
if (typeof extensionName === 'string') {
|
|
2100
|
+
out.extensionName = extensionName;
|
|
2101
|
+
}
|
|
2102
|
+
return out;
|
|
2103
|
+
}),
|
|
2104
|
+
...(clientCount !== undefined ? { clientCount } : {}),
|
|
2105
|
+
...(clientBudget !== undefined ? { clientBudget } : {}),
|
|
2106
|
+
...(budgetMode !== undefined ? { budgetMode } : {}),
|
|
2107
|
+
...(budgetMode !== undefined
|
|
2108
|
+
? {
|
|
2109
|
+
// PR 14 fix (review #4247 wenshao R2-#6): filter out
|
|
2110
|
+
// servers that are now config-disabled so the
|
|
2111
|
+
// workspace cell matches the per-server cell
|
|
2112
|
+
// precedence (`effectivelyRefused = refusedByBudget
|
|
2113
|
+
// && !disabled` above). Pre-fix a server disabled
|
|
2114
|
+
// after being refused would render `disabled` on its
|
|
2115
|
+
// per-server row but `error: budget_exhausted` on the
|
|
2116
|
+
// workspace row — confusing for dashboards. Use
|
|
2117
|
+
// `Array.from(refusedSet).filter(...)` to apply the
|
|
2118
|
+
// same disabled gate the per-server loop applies.
|
|
2119
|
+
budgets: this.buildBudgetCells(clientCount ?? 0, clientBudget, budgetMode, Array.from(refusedSet).filter((n) => !config.isMcpServerDisabled(n)).length),
|
|
2120
|
+
}
|
|
2121
|
+
: {}),
|
|
2122
|
+
};
|
|
2123
|
+
}
|
|
2124
|
+
catch (error) {
|
|
2125
|
+
return {
|
|
2126
|
+
v: STATUS_SCHEMA_VERSION,
|
|
2127
|
+
workspaceCwd: this.safeWorkspaceCwd(config),
|
|
2128
|
+
initialized: true,
|
|
2129
|
+
servers: [],
|
|
2130
|
+
errors: [this.errorCell('mcp', error)],
|
|
2131
|
+
};
|
|
2132
|
+
}
|
|
2133
|
+
}
|
|
2134
|
+
/**
|
|
2135
|
+
* Build the MCP budget status cells exposed on `GET /workspace/mcp`
|
|
2136
|
+
* (PR 14). v1 emits one cell with `scope: 'session'` — each ACP
|
|
2137
|
+
* session has its own `McpClientManager`, so the budget enforces
|
|
2138
|
+
* per-session (snapshot reflects the bootstrap session's view).
|
|
2139
|
+
* Wave 5 PR 23 (shared MCP pool) will add `scope: 'workspace'`
|
|
2140
|
+
* for true per-workspace aggregation. Consumers MUST tolerate
|
|
2141
|
+
* additional entries with unrecognized scope values (drop, don't
|
|
2142
|
+
* fail).
|
|
2143
|
+
*
|
|
2144
|
+
* Cell `status` semantics:
|
|
2145
|
+
* - `error` — refusals happened this pass (only possible in enforce mode)
|
|
2146
|
+
* - `warning` — live count crossed 75% of budget (warn or enforce mode)
|
|
2147
|
+
* - `ok` — under threshold (or `off` mode)
|
|
2148
|
+
*
|
|
2149
|
+
* **`liveCount` vs `reservedSlots.size` (PR 14 review #4247 R9 #5)**:
|
|
2150
|
+
* `liveCount` here is `accounting.total` — only `MCPServerStatus.CONNECTED`
|
|
2151
|
+
* clients. Enforcement (`tryReserveSlot`) on the other hand uses
|
|
2152
|
+
* `reservedSlots.size` — all reserved names, including in-flight
|
|
2153
|
+
* connects and never-connected stale entries. The two diverge when
|
|
2154
|
+
* servers hold a slot during the connect handshake or after a
|
|
2155
|
+
* connect failure that didn't release (e.g. `'already_held'`
|
|
2156
|
+
* reconnect timeouts). The snapshot intentionally uses the live
|
|
2157
|
+
* count for **operator observability** — "how many MCP clients
|
|
2158
|
+
* are actually serving requests right now" — while enforcement
|
|
2159
|
+
* uses the reservation count to prevent capacity races across
|
|
2160
|
+
* `Promise.all` microtask boundaries. PR 14b's typed events
|
|
2161
|
+
* should consider exposing both for real-time pressure signals.
|
|
2162
|
+
*/
|
|
2163
|
+
buildBudgetCells(liveCount, budget, mode, refusedCount) {
|
|
2164
|
+
// PR 14 fix (review #4247): when no `--mcp-client-budget` is
|
|
2165
|
+
// configured the manager resolves to `mode: 'off'`. The protocol
|
|
2166
|
+
// docs and SDK type comments promise `budgets: []` for that case;
|
|
2167
|
+
// a synthetic `mcp_budget` cell carrying nothing actionable was
|
|
2168
|
+
// (a) protocol-noncompliant, (b) clutter — clients iterating
|
|
2169
|
+
// `budgets[]` to render rows would draw an "ok" budget row for
|
|
2170
|
+
// uncapped workspaces. Always return empty so the top-level
|
|
2171
|
+
// `budgetMode: 'off'` field is the sole signal that guardrails
|
|
2172
|
+
// are inactive.
|
|
2173
|
+
if (mode === 'off')
|
|
2174
|
+
return [];
|
|
2175
|
+
let status = 'ok';
|
|
2176
|
+
let errorKind;
|
|
2177
|
+
let hint;
|
|
2178
|
+
if (refusedCount > 0) {
|
|
2179
|
+
status = 'error';
|
|
2180
|
+
errorKind = 'budget_exhausted';
|
|
2181
|
+
hint =
|
|
2182
|
+
'Raise --mcp-client-budget or remove servers from mcpServers config.';
|
|
2183
|
+
}
|
|
2184
|
+
else if (budget !== undefined &&
|
|
2185
|
+
budget > 0 &&
|
|
2186
|
+
liveCount >= MCP_BUDGET_WARN_FRACTION * budget) {
|
|
2187
|
+
status = 'warning';
|
|
2188
|
+
hint = `Live MCP clients are above ${Math.round(MCP_BUDGET_WARN_FRACTION * 100)}% of the configured budget.`;
|
|
2189
|
+
}
|
|
2190
|
+
const cell = {
|
|
2191
|
+
kind: 'mcp_budget',
|
|
2192
|
+
// PR 14 v1: per-session, not per-workspace. Each ACP session has
|
|
2193
|
+
// its own `Config`/`McpClientManager` (via `newSessionConfig`)
|
|
2194
|
+
// and reads `QWEN_SERVE_MCP_CLIENT_BUDGET` independently.
|
|
2195
|
+
// Snapshot shows the bootstrap session's view. Wave 5 PR 23
|
|
2196
|
+
// shared MCP pool will graduate this to `'workspace'`.
|
|
2197
|
+
scope: 'session',
|
|
2198
|
+
status,
|
|
2199
|
+
liveCount,
|
|
2200
|
+
mode,
|
|
2201
|
+
refusedCount,
|
|
2202
|
+
};
|
|
2203
|
+
if (budget !== undefined)
|
|
2204
|
+
cell.budget = budget;
|
|
2205
|
+
if (errorKind)
|
|
2206
|
+
cell.errorKind = errorKind;
|
|
2207
|
+
if (hint)
|
|
2208
|
+
cell.hint = hint;
|
|
2209
|
+
return [cell];
|
|
2210
|
+
}
|
|
2211
|
+
errorCell(kind, error, errorKind) {
|
|
2212
|
+
const inferred = errorKind ?? mapDomainErrorToErrorKind(error);
|
|
2213
|
+
return {
|
|
2214
|
+
kind,
|
|
2215
|
+
status: 'error',
|
|
2216
|
+
error: error instanceof Error ? error.message : String(error),
|
|
2217
|
+
...(inferred ? { errorKind: inferred } : {}),
|
|
2218
|
+
};
|
|
2219
|
+
}
|
|
2220
|
+
async buildWorkspaceSkillsStatus(config) {
|
|
2221
|
+
const skillManager = config.getSkillManager();
|
|
2222
|
+
if (!skillManager) {
|
|
2223
|
+
return {
|
|
2224
|
+
v: STATUS_SCHEMA_VERSION,
|
|
2225
|
+
workspaceCwd: this.workspaceCwd(config),
|
|
2226
|
+
initialized: true,
|
|
2227
|
+
skills: [],
|
|
2228
|
+
};
|
|
2229
|
+
}
|
|
2230
|
+
try {
|
|
2231
|
+
const skills = await skillManager.listSkills();
|
|
2232
|
+
return {
|
|
2233
|
+
v: STATUS_SCHEMA_VERSION,
|
|
2234
|
+
workspaceCwd: this.workspaceCwd(config),
|
|
2235
|
+
initialized: true,
|
|
2236
|
+
skills: skills.map((skill) => {
|
|
2237
|
+
const modelInvocable = skill.disableModelInvocation !== true;
|
|
2238
|
+
return {
|
|
2239
|
+
kind: 'skill',
|
|
2240
|
+
status: modelInvocable ? 'ok' : 'disabled',
|
|
2241
|
+
name: skill.name,
|
|
2242
|
+
description: skill.description,
|
|
2243
|
+
level: skill.level,
|
|
2244
|
+
modelInvocable,
|
|
2245
|
+
...(skill.argumentHint ? { argumentHint: skill.argumentHint } : {}),
|
|
2246
|
+
...(skill.model ? { model: skill.model } : {}),
|
|
2247
|
+
...(skill.extensionName
|
|
2248
|
+
? { extensionName: skill.extensionName }
|
|
2249
|
+
: {}),
|
|
2250
|
+
};
|
|
2251
|
+
}),
|
|
2252
|
+
};
|
|
2253
|
+
}
|
|
2254
|
+
catch (error) {
|
|
2255
|
+
return {
|
|
2256
|
+
v: STATUS_SCHEMA_VERSION,
|
|
2257
|
+
workspaceCwd: this.workspaceCwd(config),
|
|
2258
|
+
initialized: true,
|
|
2259
|
+
skills: [],
|
|
2260
|
+
errors: [this.errorCell('skills', error)],
|
|
2261
|
+
};
|
|
2262
|
+
}
|
|
2263
|
+
}
|
|
2264
|
+
buildWorkspaceProvidersStatus(config) {
|
|
2265
|
+
try {
|
|
2266
|
+
const workspaceCwd = this.workspaceCwd(config);
|
|
2267
|
+
const currentAuthType = config.getAuthType?.();
|
|
2268
|
+
const activeRuntimeSnapshot = config.getActiveRuntimeModelSnapshot?.();
|
|
2269
|
+
const currentModelId = activeRuntimeSnapshot
|
|
2270
|
+
? activeRuntimeSnapshot.id
|
|
2271
|
+
: (config.getModel() || '').trim();
|
|
2272
|
+
const hasCurrentModel = currentModelId.length > 0;
|
|
2273
|
+
const currentAuth = activeRuntimeSnapshot?.authType ?? currentAuthType;
|
|
2274
|
+
const currentAcpModelId = hasCurrentModel && currentAuth
|
|
2275
|
+
? formatAcpModelId(currentModelId, currentAuth)
|
|
2276
|
+
: currentModelId || undefined;
|
|
2277
|
+
const providers = new Map();
|
|
2278
|
+
for (const model of config.getAllConfiguredModels()) {
|
|
2279
|
+
const authType = String(model.authType);
|
|
2280
|
+
let provider = providers.get(authType);
|
|
2281
|
+
if (!provider) {
|
|
2282
|
+
provider = {
|
|
2283
|
+
kind: 'model_provider',
|
|
2284
|
+
status: 'ok',
|
|
2285
|
+
authType,
|
|
2286
|
+
current: false,
|
|
2287
|
+
models: [],
|
|
2288
|
+
};
|
|
2289
|
+
providers.set(authType, provider);
|
|
2290
|
+
}
|
|
2291
|
+
const effectiveModelId = model.isRuntimeModel && model.runtimeSnapshotId
|
|
2292
|
+
? model.runtimeSnapshotId
|
|
2293
|
+
: model.id;
|
|
2294
|
+
const modelId = formatAcpModelId(effectiveModelId, model.authType);
|
|
2295
|
+
const isCurrent = currentAuth === model.authType &&
|
|
2296
|
+
hasCurrentModel &&
|
|
2297
|
+
(currentModelId === effectiveModelId ||
|
|
2298
|
+
currentModelId === model.id ||
|
|
2299
|
+
currentAcpModelId === modelId);
|
|
2300
|
+
const providerModel = {
|
|
2301
|
+
modelId,
|
|
2302
|
+
baseModelId: parseAcpBaseModelId(effectiveModelId),
|
|
2303
|
+
name: model.label,
|
|
2304
|
+
...(model.description !== undefined
|
|
2305
|
+
? { description: model.description }
|
|
2306
|
+
: {}),
|
|
2307
|
+
contextLimit: model.contextWindowSize ?? tokenLimit(effectiveModelId),
|
|
2308
|
+
isCurrent,
|
|
2309
|
+
isRuntime: model.isRuntimeModel === true,
|
|
2310
|
+
};
|
|
2311
|
+
provider.models.push(providerModel);
|
|
2312
|
+
if (isCurrent)
|
|
2313
|
+
provider.current = true;
|
|
2314
|
+
}
|
|
2315
|
+
return {
|
|
2316
|
+
v: STATUS_SCHEMA_VERSION,
|
|
2317
|
+
workspaceCwd,
|
|
2318
|
+
initialized: true,
|
|
2319
|
+
...(currentAuth || currentAcpModelId
|
|
2320
|
+
? {
|
|
2321
|
+
current: {
|
|
2322
|
+
...(currentAuth ? { authType: String(currentAuth) } : {}),
|
|
2323
|
+
...(currentAcpModelId ? { modelId: currentAcpModelId } : {}),
|
|
2324
|
+
},
|
|
2325
|
+
}
|
|
2326
|
+
: {}),
|
|
2327
|
+
providers: [...providers.values()],
|
|
2328
|
+
};
|
|
2329
|
+
}
|
|
2330
|
+
catch (error) {
|
|
2331
|
+
return {
|
|
2332
|
+
v: STATUS_SCHEMA_VERSION,
|
|
2333
|
+
workspaceCwd: this.safeWorkspaceCwd(config),
|
|
2334
|
+
initialized: true,
|
|
2335
|
+
providers: [],
|
|
2336
|
+
errors: [this.errorCell('providers', error)],
|
|
2337
|
+
};
|
|
2338
|
+
}
|
|
2339
|
+
}
|
|
2340
|
+
async buildAcpPreflightCells(config) {
|
|
2341
|
+
// Drive emission order from the shared `ACP_PREFLIGHT_KINDS` constant
|
|
2342
|
+
// (also consumed by `createIdleAcpPreflightCells` in `serve/status.ts`)
|
|
2343
|
+
// so the idle-placeholder list and the live builder cannot drift —
|
|
2344
|
+
// adding a new ACP kind in the constant flags any builder dispatch
|
|
2345
|
+
// gap as a TS exhaustiveness error in the switch below, instead of
|
|
2346
|
+
// silently dropping the cell from one path or the other.
|
|
2347
|
+
const builders = {
|
|
2348
|
+
auth: () => this.buildAuthPreflightCell(config),
|
|
2349
|
+
mcp_discovery: () => this.buildMcpDiscoveryPreflightCell(config),
|
|
2350
|
+
skills: () => this.buildSkillsPreflightCell(config),
|
|
2351
|
+
providers: () => this.buildProvidersPreflightCell(config),
|
|
2352
|
+
tool_registry: () => this.buildToolRegistryPreflightCell(config),
|
|
2353
|
+
egress: () => ({
|
|
2354
|
+
kind: 'egress',
|
|
2355
|
+
status: 'not_started',
|
|
2356
|
+
locality: 'acp',
|
|
2357
|
+
hint: 'egress probing lands in PR 14 (#4175)',
|
|
2358
|
+
}),
|
|
2359
|
+
};
|
|
2360
|
+
const cells = [];
|
|
2361
|
+
for (const kind of ACP_PREFLIGHT_KINDS) {
|
|
2362
|
+
cells.push(await builders[kind]());
|
|
2363
|
+
}
|
|
2364
|
+
return { cells };
|
|
2365
|
+
}
|
|
2366
|
+
acpCell(kind, spec) {
|
|
2367
|
+
return { kind, locality: 'acp', ...spec };
|
|
2368
|
+
}
|
|
2369
|
+
/**
|
|
2370
|
+
* Pure auth preflight check. Looks up the well-known env var keys for the
|
|
2371
|
+
* configured auth method (via `AUTH_ENV_MAPPINGS`) and reports whether at
|
|
2372
|
+
* least one is present.
|
|
2373
|
+
*
|
|
2374
|
+
* Deliberately does NOT call `validateAuthMethod` from `cli/config/auth.ts`:
|
|
2375
|
+
* that helper has side effects (reloads `.env` from disk via
|
|
2376
|
+
* `loadEnvironment`, writes `process.env['GOOGLE_GENAI_USE_VERTEXAI']` for
|
|
2377
|
+
* Vertex auth) which would let a read-only `GET /workspace/preflight`
|
|
2378
|
+
* mutate daemon state and produce torn snapshots when racing
|
|
2379
|
+
* `GET /workspace/env`. Full validation still happens at session start.
|
|
2380
|
+
*/
|
|
2381
|
+
buildAuthPreflightCell(config) {
|
|
2382
|
+
try {
|
|
2383
|
+
const authType = config.getAuthType?.();
|
|
2384
|
+
if (!authType) {
|
|
2385
|
+
return this.acpCell('auth', {
|
|
2386
|
+
status: 'warning',
|
|
2387
|
+
errorKind: 'auth_env_error',
|
|
2388
|
+
error: 'No auth method configured.',
|
|
2389
|
+
hint: 'Run `qwen` and complete the auth flow, or set a provider env var.',
|
|
2390
|
+
detail: { source: 'none', hasToken: false },
|
|
2391
|
+
});
|
|
2392
|
+
}
|
|
2393
|
+
const apiKeyVars = AUTH_PREFLIGHT_ENV_KEYS[String(authType)] ?? [];
|
|
2394
|
+
const presentVar = apiKeyVars.find((name) => Boolean(process.env[name]));
|
|
2395
|
+
const hasToken = Boolean(presentVar);
|
|
2396
|
+
// No env-var registration → either OAuth-style auth (qwen-oauth) or
|
|
2397
|
+
// a custom provider whose key is sourced from settings rather than
|
|
2398
|
+
// env. Surface as `unknown` (the SDK consumer can defer to the
|
|
2399
|
+
// `/session` boot for definitive validation) rather than a false
|
|
2400
|
+
// negative.
|
|
2401
|
+
if (apiKeyVars.length === 0) {
|
|
2402
|
+
return this.acpCell('auth', {
|
|
2403
|
+
status: 'unknown',
|
|
2404
|
+
hint: 'Auth credentials for this provider are not env-keyed; full validation runs at session start.',
|
|
2405
|
+
detail: {
|
|
2406
|
+
source: String(authType),
|
|
2407
|
+
hasToken: 'unknown',
|
|
2408
|
+
envVarCandidates: [],
|
|
2409
|
+
},
|
|
2410
|
+
});
|
|
2411
|
+
}
|
|
2412
|
+
return this.acpCell('auth', {
|
|
2413
|
+
status: hasToken ? 'ok' : 'warning',
|
|
2414
|
+
...(hasToken
|
|
2415
|
+
? {}
|
|
2416
|
+
: {
|
|
2417
|
+
errorKind: 'auth_env_error',
|
|
2418
|
+
error: `None of the env vars [${apiKeyVars.join(', ')}] is set for authType '${String(authType)}'.`,
|
|
2419
|
+
hint: `Set one of: ${apiKeyVars.join(' / ')}.`,
|
|
2420
|
+
}),
|
|
2421
|
+
detail: {
|
|
2422
|
+
source: String(authType),
|
|
2423
|
+
hasToken,
|
|
2424
|
+
envVarCandidates: apiKeyVars,
|
|
2425
|
+
...(presentVar ? { presentVar } : {}),
|
|
2426
|
+
},
|
|
2427
|
+
});
|
|
2428
|
+
}
|
|
2429
|
+
catch (err) {
|
|
2430
|
+
const errorKind = mapDomainErrorToErrorKind(err) ?? 'auth_env_error';
|
|
2431
|
+
return this.acpCell('auth', {
|
|
2432
|
+
status: 'error',
|
|
2433
|
+
error: err instanceof Error ? err.message : String(err),
|
|
2434
|
+
errorKind,
|
|
2435
|
+
});
|
|
2436
|
+
}
|
|
2437
|
+
}
|
|
2438
|
+
buildMcpDiscoveryPreflightCell(config) {
|
|
2439
|
+
try {
|
|
2440
|
+
const discovery = this.discoveryState();
|
|
2441
|
+
const servers = config.getMcpServers() ?? {};
|
|
2442
|
+
const total = Object.keys(servers).length;
|
|
2443
|
+
// Today `MCPServerStatus` is `{CONNECTED, CONNECTING, DISCONNECTED}`,
|
|
2444
|
+
// but a future state (e.g. `ERROR`, `NEEDS_AUTH`) could be added.
|
|
2445
|
+
// Bucketing it as `disconnected` would silently lose the distinction
|
|
2446
|
+
// between "credential failed" and "idle, will spawn on demand".
|
|
2447
|
+
// Track an explicit `unknown` count so unrecognized states surface in
|
|
2448
|
+
// the cell `detail` rather than disappearing.
|
|
2449
|
+
const counts = {
|
|
2450
|
+
connected: 0,
|
|
2451
|
+
connecting: 0,
|
|
2452
|
+
disconnected: 0,
|
|
2453
|
+
unknown: 0,
|
|
2454
|
+
};
|
|
2455
|
+
for (const name of Object.keys(servers)) {
|
|
2456
|
+
const raw = getMCPServerStatus(name);
|
|
2457
|
+
switch (raw) {
|
|
2458
|
+
case MCPServerStatus.CONNECTED:
|
|
2459
|
+
counts.connected += 1;
|
|
2460
|
+
break;
|
|
2461
|
+
case MCPServerStatus.CONNECTING:
|
|
2462
|
+
counts.connecting += 1;
|
|
2463
|
+
break;
|
|
2464
|
+
case MCPServerStatus.DISCONNECTED:
|
|
2465
|
+
counts.disconnected += 1;
|
|
2466
|
+
break;
|
|
2467
|
+
default:
|
|
2468
|
+
counts.unknown += 1;
|
|
2469
|
+
break;
|
|
2470
|
+
}
|
|
2471
|
+
}
|
|
2472
|
+
const detail = { discoveryState: discovery, total, ...counts };
|
|
2473
|
+
if (total === 0) {
|
|
2474
|
+
return this.acpCell('mcp_discovery', {
|
|
2475
|
+
status: 'ok',
|
|
2476
|
+
detail,
|
|
2477
|
+
hint: 'No MCP servers configured.',
|
|
2478
|
+
});
|
|
2479
|
+
}
|
|
2480
|
+
if (counts.unknown > 0) {
|
|
2481
|
+
return this.acpCell('mcp_discovery', {
|
|
2482
|
+
status: 'warning',
|
|
2483
|
+
errorKind: 'protocol_error',
|
|
2484
|
+
error: `${counts.unknown}/${total} MCP server(s) in an unrecognized state.`,
|
|
2485
|
+
detail,
|
|
2486
|
+
});
|
|
2487
|
+
}
|
|
2488
|
+
if (counts.disconnected > 0 && discovery === 'completed') {
|
|
2489
|
+
return this.acpCell('mcp_discovery', {
|
|
2490
|
+
status: 'error',
|
|
2491
|
+
errorKind: 'protocol_error',
|
|
2492
|
+
error: `${counts.disconnected}/${total} MCP server(s) disconnected after discovery.`,
|
|
2493
|
+
detail,
|
|
2494
|
+
});
|
|
2495
|
+
}
|
|
2496
|
+
if (counts.connecting > 0 || discovery === 'in_progress') {
|
|
2497
|
+
// No `errorKind`: this is a normal transitional state (just-spawned
|
|
2498
|
+
// MCP servers haven't completed their handshake yet), not an
|
|
2499
|
+
// `init_timeout`. The latter would push SDK consumers to render
|
|
2500
|
+
// timeout-specific remediation ("increase init timeout") when the
|
|
2501
|
+
// correct user action is simply "wait or retry shortly". A real
|
|
2502
|
+
// timeout surfaces via `BridgeTimeoutError` from the bridge's
|
|
2503
|
+
// `withTimeout`, mapped through `mapDomainErrorToErrorKind`.
|
|
2504
|
+
return this.acpCell('mcp_discovery', {
|
|
2505
|
+
status: 'warning',
|
|
2506
|
+
error: `${counts.connecting}/${total} MCP server(s) still connecting.`,
|
|
2507
|
+
detail,
|
|
2508
|
+
});
|
|
2509
|
+
}
|
|
2510
|
+
return this.acpCell('mcp_discovery', { status: 'ok', detail });
|
|
2511
|
+
}
|
|
2512
|
+
catch (err) {
|
|
2513
|
+
const errorKind = mapDomainErrorToErrorKind(err);
|
|
2514
|
+
return this.acpCell('mcp_discovery', {
|
|
2515
|
+
status: 'error',
|
|
2516
|
+
error: err instanceof Error ? err.message : String(err),
|
|
2517
|
+
...(errorKind ? { errorKind } : {}),
|
|
2518
|
+
});
|
|
2519
|
+
}
|
|
2520
|
+
}
|
|
2521
|
+
async buildSkillsPreflightCell(config) {
|
|
2522
|
+
// Whole body wrapped in try so a Config getter that throws
|
|
2523
|
+
// synchronously (mock-style or future Config refactor) doesn't escape
|
|
2524
|
+
// out of `buildAcpPreflightCells` and 500 the whole envelope.
|
|
2525
|
+
try {
|
|
2526
|
+
const skillManager = config.getSkillManager();
|
|
2527
|
+
if (!skillManager) {
|
|
2528
|
+
return this.acpCell('skills', {
|
|
2529
|
+
status: 'disabled',
|
|
2530
|
+
// `disabled` here is the structural state — Config has no
|
|
2531
|
+
// SkillManager attached. That can mean the user opted out OR a
|
|
2532
|
+
// mis-config silently dropped the manager; preflight cannot
|
|
2533
|
+
// distinguish the two without settings introspection. Hint
|
|
2534
|
+
// surfaces the ambiguity so operators investigate when
|
|
2535
|
+
// unexpected.
|
|
2536
|
+
hint: 'No SkillManager attached to Config; verify settings if you expected skills to load.',
|
|
2537
|
+
detail: { configured: false },
|
|
2538
|
+
});
|
|
2539
|
+
}
|
|
2540
|
+
const skills = await skillManager.listSkills();
|
|
2541
|
+
return this.acpCell('skills', {
|
|
2542
|
+
status: 'ok',
|
|
2543
|
+
detail: { count: skills.length },
|
|
2544
|
+
});
|
|
2545
|
+
}
|
|
2546
|
+
catch (err) {
|
|
2547
|
+
const errorKind = mapDomainErrorToErrorKind(err);
|
|
2548
|
+
return this.acpCell('skills', {
|
|
2549
|
+
status: 'error',
|
|
2550
|
+
error: err instanceof Error ? err.message : String(err),
|
|
2551
|
+
...(errorKind ? { errorKind } : {}),
|
|
2552
|
+
});
|
|
2553
|
+
}
|
|
2554
|
+
}
|
|
2555
|
+
buildProvidersPreflightCell(config) {
|
|
2556
|
+
try {
|
|
2557
|
+
const models = config.getAllConfiguredModels();
|
|
2558
|
+
const authType = config.getAuthType?.();
|
|
2559
|
+
if (models.length === 0) {
|
|
2560
|
+
// `authType` set but zero models = the next `POST /session` will
|
|
2561
|
+
// fail. Report `error`, not `warning`: the daemon literally cannot
|
|
2562
|
+
// serve a prompt in this state.
|
|
2563
|
+
return this.acpCell('providers', {
|
|
2564
|
+
status: authType ? 'error' : 'disabled',
|
|
2565
|
+
...(authType ? { errorKind: 'auth_env_error' } : {}),
|
|
2566
|
+
...(authType
|
|
2567
|
+
? {
|
|
2568
|
+
error: `No model configured for authType ${String(authType)}.`,
|
|
2569
|
+
}
|
|
2570
|
+
: {}),
|
|
2571
|
+
detail: { count: 0, authType: authType ? String(authType) : null },
|
|
2572
|
+
});
|
|
2573
|
+
}
|
|
2574
|
+
const authTypes = new Set(models.map((m) => String(m.authType)));
|
|
2575
|
+
return this.acpCell('providers', {
|
|
2576
|
+
status: 'ok',
|
|
2577
|
+
detail: {
|
|
2578
|
+
count: models.length,
|
|
2579
|
+
providers: [...authTypes],
|
|
2580
|
+
},
|
|
2581
|
+
});
|
|
2582
|
+
}
|
|
2583
|
+
catch (err) {
|
|
2584
|
+
const errorKind = mapDomainErrorToErrorKind(err) ?? 'auth_env_error';
|
|
2585
|
+
return this.acpCell('providers', {
|
|
2586
|
+
status: 'error',
|
|
2587
|
+
error: err instanceof Error ? err.message : String(err),
|
|
2588
|
+
errorKind,
|
|
2589
|
+
});
|
|
2590
|
+
}
|
|
2591
|
+
}
|
|
2592
|
+
buildToolRegistryPreflightCell(config) {
|
|
2593
|
+
try {
|
|
2594
|
+
const registry = config.getToolRegistry();
|
|
2595
|
+
if (!registry) {
|
|
2596
|
+
return this.acpCell('tool_registry', {
|
|
2597
|
+
status: 'error',
|
|
2598
|
+
errorKind: 'protocol_error',
|
|
2599
|
+
error: 'Tool registry is not initialized.',
|
|
2600
|
+
});
|
|
2601
|
+
}
|
|
2602
|
+
const tools = registry.getAllTools();
|
|
2603
|
+
return this.acpCell('tool_registry', {
|
|
2604
|
+
status: 'ok',
|
|
2605
|
+
detail: { count: tools.length },
|
|
2606
|
+
});
|
|
2607
|
+
}
|
|
2608
|
+
catch (err) {
|
|
2609
|
+
const errorKind = mapDomainErrorToErrorKind(err) ?? 'protocol_error';
|
|
2610
|
+
return this.acpCell('tool_registry', {
|
|
2611
|
+
status: 'error',
|
|
2612
|
+
error: err instanceof Error ? err.message : String(err),
|
|
2613
|
+
errorKind,
|
|
2614
|
+
});
|
|
2615
|
+
}
|
|
2616
|
+
}
|
|
2617
|
+
sessionOrThrow(sessionId) {
|
|
2618
|
+
const session = this.sessions.get(sessionId);
|
|
2619
|
+
if (!session) {
|
|
2620
|
+
throw RequestError.invalidParams(undefined, `Session not found for id: ${sessionId}`);
|
|
2621
|
+
}
|
|
2622
|
+
return session;
|
|
2623
|
+
}
|
|
2624
|
+
buildSessionContextStatus(sessionId) {
|
|
2625
|
+
const session = this.sessionOrThrow(sessionId);
|
|
2626
|
+
const config = session.getConfig();
|
|
2627
|
+
return {
|
|
2628
|
+
v: STATUS_SCHEMA_VERSION,
|
|
2629
|
+
sessionId,
|
|
2630
|
+
workspaceCwd: this.workspaceCwd(config),
|
|
2631
|
+
state: {
|
|
2632
|
+
models: this.buildAvailableModels(config),
|
|
2633
|
+
modes: this.buildModesData(config),
|
|
2634
|
+
configOptions: this.buildConfigOptions(config),
|
|
2635
|
+
},
|
|
2636
|
+
};
|
|
2637
|
+
}
|
|
2638
|
+
async buildSessionSupportedCommandsStatus(sessionId) {
|
|
2639
|
+
const session = this.sessionOrThrow(sessionId);
|
|
2640
|
+
const { availableCommands, availableSkills } = await buildAvailableCommandsSnapshot(session.getConfig());
|
|
2641
|
+
return {
|
|
2642
|
+
v: STATUS_SCHEMA_VERSION,
|
|
2643
|
+
sessionId,
|
|
2644
|
+
availableCommands,
|
|
2645
|
+
availableSkills: availableSkills ?? [],
|
|
2646
|
+
};
|
|
2647
|
+
}
|
|
2648
|
+
async installSkillFromUrl(request) {
|
|
2649
|
+
const skillManager = this.config.getSkillManager();
|
|
2650
|
+
if (!skillManager) {
|
|
2651
|
+
throw RequestError.invalidParams(undefined, 'SkillManager is not available');
|
|
2652
|
+
}
|
|
2653
|
+
const download = await downloadSkill(request.sourceUrl);
|
|
2654
|
+
const skillsBaseDir = path.join(Storage.getGlobalQwenDir(), 'skills');
|
|
2655
|
+
const skillDir = resolveManagedSkillDir(skillsBaseDir, request.slug);
|
|
2656
|
+
const skillFile = path.join(skillDir, 'SKILL.md');
|
|
2657
|
+
const parsed = skillManager.parseSkillContent(download.skillContent, skillFile, 'user');
|
|
2658
|
+
if (parsed.name !== request.slug) {
|
|
2659
|
+
throw RequestError.invalidParams(undefined, `Skill name "${parsed.name}" does not match requested slug "${request.slug}"`);
|
|
2660
|
+
}
|
|
2661
|
+
// Install atomically: stage all files in a sibling temp directory, then
|
|
2662
|
+
// swap it in with a single rename. A mid-write failure (disk full,
|
|
2663
|
+
// permission error) therefore leaves the previously installed skill
|
|
2664
|
+
// intact instead of deleting it up front and ending up with a partial
|
|
2665
|
+
// install. Removing the old dir before writing also dropped orphaned
|
|
2666
|
+
// files from older versions; the rename preserves that property.
|
|
2667
|
+
const stagingDir = `${skillDir}.installing-${process.pid}-${Date.now()}`;
|
|
2668
|
+
try {
|
|
2669
|
+
await fs.rm(stagingDir, { recursive: true, force: true });
|
|
2670
|
+
for (const file of download.files) {
|
|
2671
|
+
const targetPath = resolveSkillInstallPath(stagingDir, file.relativePath);
|
|
2672
|
+
await fs.mkdir(path.dirname(targetPath), { recursive: true });
|
|
2673
|
+
await fs.writeFile(targetPath, file.content);
|
|
2674
|
+
}
|
|
2675
|
+
// stagingDir is a sibling of skillDir (same filesystem), so the rename
|
|
2676
|
+
// is atomic; the only gap is between the rm and rename, during which
|
|
2677
|
+
// the fully-staged copy still exists for recovery.
|
|
2678
|
+
await fs.rm(skillDir, { recursive: true, force: true });
|
|
2679
|
+
await fs.rename(stagingDir, skillDir);
|
|
2680
|
+
}
|
|
2681
|
+
catch (error) {
|
|
2682
|
+
await fs.rm(stagingDir, { recursive: true, force: true }).catch(() => { });
|
|
2683
|
+
throw error;
|
|
2684
|
+
}
|
|
2685
|
+
await skillManager.refreshCache();
|
|
2686
|
+
return {
|
|
2687
|
+
id: request.id,
|
|
2688
|
+
slug: parsed.name,
|
|
2689
|
+
installed: true,
|
|
2690
|
+
installedPath: skillFile,
|
|
2691
|
+
sourceUrl: request.sourceUrl,
|
|
2692
|
+
};
|
|
2693
|
+
}
|
|
2694
|
+
async deleteGlobalSkill(request) {
|
|
2695
|
+
const skillManager = this.config.getSkillManager();
|
|
2696
|
+
if (!skillManager) {
|
|
2697
|
+
throw RequestError.invalidParams(undefined, 'SkillManager is not available');
|
|
2698
|
+
}
|
|
2699
|
+
const { skillDir, skillFile, content } = await this.readManagedSkillFile(request.slug, 'global', skillManager);
|
|
2700
|
+
const parsed = skillManager.parseSkillContent(content, skillFile, 'user');
|
|
2701
|
+
if (parsed.name !== request.slug) {
|
|
2702
|
+
throw RequestError.invalidParams(undefined, `Skill name "${parsed.name}" does not match requested slug "${request.slug}"`);
|
|
2703
|
+
}
|
|
2704
|
+
// Guard the recursive delete: readManagedSkillFile's generic fallback can
|
|
2705
|
+
// resolve skillDir from listSkills() to an arbitrary path. Only ever remove
|
|
2706
|
+
// the directory that directly contains the SKILL.md we just validated, and
|
|
2707
|
+
// never a filesystem root or the global Qwen dir itself, so a malformed
|
|
2708
|
+
// skill entry can't trigger a destructive rm of a shared/parent directory.
|
|
2709
|
+
const resolvedSkillDir = path.resolve(skillDir);
|
|
2710
|
+
const resolvedSkillFile = path.resolve(skillFile);
|
|
2711
|
+
const globalDir = path.resolve(Storage.getGlobalQwenDir());
|
|
2712
|
+
const isDedicatedSkillDir = resolvedSkillFile === path.join(resolvedSkillDir, 'SKILL.md');
|
|
2713
|
+
if (!isDedicatedSkillDir ||
|
|
2714
|
+
resolvedSkillDir === path.parse(resolvedSkillDir).root ||
|
|
2715
|
+
resolvedSkillDir === globalDir) {
|
|
2716
|
+
throw RequestError.invalidParams(undefined, `Refusing to delete unexpected skill directory: ${skillDir}`);
|
|
2717
|
+
}
|
|
2718
|
+
await fs.rm(skillDir, { recursive: true, force: true });
|
|
2719
|
+
await skillManager.refreshCache();
|
|
2720
|
+
return {
|
|
2721
|
+
slug: request.slug,
|
|
2722
|
+
deleted: true,
|
|
2723
|
+
};
|
|
2724
|
+
}
|
|
2725
|
+
async readManagedSkillFile(slug, scope, skillManager, cwd) {
|
|
2726
|
+
if (scope === 'global') {
|
|
2727
|
+
const qwenSkillDir = resolveManagedSkillDir(path.join(Storage.getGlobalQwenDir(), 'skills'), slug);
|
|
2728
|
+
const qwenSkillFile = path.join(qwenSkillDir, 'SKILL.md');
|
|
2729
|
+
const qwenContent = await fs
|
|
2730
|
+
.readFile(qwenSkillFile, 'utf8')
|
|
2731
|
+
.catch(() => undefined);
|
|
2732
|
+
if (qwenContent !== undefined) {
|
|
2733
|
+
return {
|
|
2734
|
+
skillDir: qwenSkillDir,
|
|
2735
|
+
skillFile: qwenSkillFile,
|
|
2736
|
+
content: qwenContent,
|
|
2737
|
+
};
|
|
2738
|
+
}
|
|
2739
|
+
}
|
|
2740
|
+
if (scope === 'project' && cwd?.trim()) {
|
|
2741
|
+
const projectSkill = await this.findProjectSkillFileFromCwd(slug, cwd, skillManager);
|
|
2742
|
+
if (projectSkill)
|
|
2743
|
+
return projectSkill;
|
|
2744
|
+
}
|
|
2745
|
+
const level = scope === 'project' ? 'project' : 'user';
|
|
2746
|
+
const skill = (await skillManager.listSkills({ level })).find((candidate) => candidate.name === slug);
|
|
2747
|
+
const skillFile = skill?.filePath;
|
|
2748
|
+
if (!skillFile) {
|
|
2749
|
+
throw RequestError.invalidParams(undefined, `${scope === 'project' ? 'Project' : 'Global'} skill not found: ${slug}`);
|
|
2750
|
+
}
|
|
2751
|
+
const content = await fs.readFile(skillFile, 'utf8').catch(() => {
|
|
2752
|
+
throw RequestError.invalidParams(undefined, `${scope === 'project' ? 'Project' : 'Global'} skill not found: ${slug}`);
|
|
2753
|
+
});
|
|
2754
|
+
return {
|
|
2755
|
+
skillDir: path.dirname(skillFile),
|
|
2756
|
+
skillFile,
|
|
2757
|
+
content,
|
|
2758
|
+
};
|
|
2759
|
+
}
|
|
2760
|
+
async findProjectSkillFileFromCwd(slug, cwd, skillManager) {
|
|
2761
|
+
const projectRoot = path.resolve(cwd);
|
|
2762
|
+
for (const configDir of PROJECT_SKILL_DIRS) {
|
|
2763
|
+
const baseDir = path.join(projectRoot, configDir, SKILLS_DIR);
|
|
2764
|
+
const skills = await skillManager.loadSkillsFromDir(baseDir, 'project');
|
|
2765
|
+
const skill = skills.find((candidate) => candidate.name === slug);
|
|
2766
|
+
const skillFile = skill?.filePath;
|
|
2767
|
+
if (!skillFile)
|
|
2768
|
+
continue;
|
|
2769
|
+
const content = await fs.readFile(skillFile, 'utf8').catch(() => {
|
|
2770
|
+
throw RequestError.invalidParams(undefined, `Project skill not found: ${slug}`);
|
|
2771
|
+
});
|
|
2772
|
+
return {
|
|
2773
|
+
skillDir: path.dirname(skillFile),
|
|
2774
|
+
skillFile,
|
|
2775
|
+
content,
|
|
2776
|
+
};
|
|
2777
|
+
}
|
|
2778
|
+
return undefined;
|
|
2779
|
+
}
|
|
2780
|
+
async setGlobalSkillEnabled(request, cwd) {
|
|
2781
|
+
const skillManager = this.config.getSkillManager();
|
|
2782
|
+
if (!skillManager) {
|
|
2783
|
+
throw RequestError.invalidParams(undefined, 'SkillManager is not available');
|
|
2784
|
+
}
|
|
2785
|
+
const { skillFile, content } = await this.readManagedSkillFile(request.slug, request.scope, skillManager, cwd);
|
|
2786
|
+
const level = request.scope === 'project' ? 'project' : 'user';
|
|
2787
|
+
const parsed = skillManager.parseSkillContent(content, skillFile, level);
|
|
2788
|
+
if (parsed.name !== request.slug) {
|
|
2789
|
+
throw RequestError.invalidParams(undefined, `Skill name "${parsed.name}" does not match requested slug "${request.slug}"`);
|
|
2790
|
+
}
|
|
2791
|
+
const nextContent = setSkillFrontmatterEnabled(content, request.enabled);
|
|
2792
|
+
skillManager.parseSkillContent(nextContent, skillFile, level);
|
|
2793
|
+
// Defense-in-depth (consistent with deleteGlobalSkill): readManagedSkillFile's
|
|
2794
|
+
// generic fallback can resolve skillFile from listSkills() to an arbitrary
|
|
2795
|
+
// path. We only ever write back to the SKILL.md manifest we just read and
|
|
2796
|
+
// whose parsed name matched the slug, so refuse to write anything else.
|
|
2797
|
+
if (path.basename(skillFile) !== 'SKILL.md') {
|
|
2798
|
+
throw RequestError.invalidParams(undefined, `Refusing to write to unexpected skill file: ${skillFile}`);
|
|
2799
|
+
}
|
|
2800
|
+
await fs.writeFile(skillFile, nextContent, 'utf8');
|
|
2801
|
+
await skillManager.refreshCache();
|
|
2802
|
+
return {
|
|
2803
|
+
slug: request.slug,
|
|
2804
|
+
enabled: request.enabled,
|
|
2805
|
+
installedPath: skillFile,
|
|
2806
|
+
};
|
|
2807
|
+
}
|
|
2808
|
+
async extMethod(method, params) {
|
|
2809
|
+
const requestedCwd = typeof params['cwd'] === 'string' ? params['cwd'] : undefined;
|
|
2810
|
+
const cwd = requestedCwd || process.cwd();
|
|
2811
|
+
const SESSION_ID_RE = /^[0-9a-fA-F-]{32,36}$/;
|
|
2812
|
+
switch (method) {
|
|
2813
|
+
case 'qwen/providers/list': {
|
|
2814
|
+
return {
|
|
2815
|
+
providers: ALL_PROVIDERS.map((provider) => serializeProviderConfig(provider, this.settings)),
|
|
2816
|
+
};
|
|
2817
|
+
}
|
|
2818
|
+
case 'qwen/providers/connect': {
|
|
2819
|
+
const providerId = readRequiredString(params['providerId'], 'providerId');
|
|
2820
|
+
const providerConfig = findProviderById(providerId);
|
|
2821
|
+
if (!providerConfig) {
|
|
2822
|
+
throw RequestError.invalidParams(undefined, `Unknown provider: ${providerId}`);
|
|
2823
|
+
}
|
|
2824
|
+
const inputs = readProviderSetupInputs(providerConfig, params, resolveExistingProviderApiKey(providerConfig, this.settings));
|
|
2825
|
+
const persistScope = readProviderConnectScope(params['scope']);
|
|
2826
|
+
const plan = buildInstallPlan(providerConfig, inputs);
|
|
2827
|
+
await applyProviderInstallPlan(plan, {
|
|
2828
|
+
settings: createLoadedSettingsAdapter(this.settings, persistScope),
|
|
2829
|
+
reloadModelProviders: (modelProviders) => this.config.reloadModelProvidersConfig(modelProviders),
|
|
2830
|
+
syncAuthState: (authType, modelId) => this.config
|
|
2831
|
+
.getModelsConfig()
|
|
2832
|
+
.syncAfterAuthRefresh(authType, modelId),
|
|
2833
|
+
refreshAuth: (authType) => this.config.refreshAuth(authType),
|
|
2834
|
+
});
|
|
2835
|
+
return {
|
|
2836
|
+
success: true,
|
|
2837
|
+
providerId: providerConfig.id,
|
|
2838
|
+
providerLabel: providerConfig.label,
|
|
2839
|
+
authType: plan.authType,
|
|
2840
|
+
modelId: plan.modelSelection?.modelId,
|
|
2841
|
+
};
|
|
2842
|
+
}
|
|
2843
|
+
case 'qwen/skills/install': {
|
|
2844
|
+
return this.installSkillFromUrl(readSkillInstallRequest(params));
|
|
2845
|
+
}
|
|
2846
|
+
case 'qwen/skills/delete': {
|
|
2847
|
+
return this.deleteGlobalSkill(readSkillSlugRequest(params));
|
|
2848
|
+
}
|
|
2849
|
+
case 'qwen/skills/setEnabled': {
|
|
2850
|
+
return this.setGlobalSkillEnabled(readSkillSetEnabledRequest(params), requestedCwd);
|
|
2851
|
+
}
|
|
2852
|
+
case 'qwen/settings/getMemory': {
|
|
2853
|
+
const settings = loadSettings(cwd);
|
|
2854
|
+
this.settings = settings;
|
|
2855
|
+
return {
|
|
2856
|
+
settings: normalizeQwenMemorySettings(settings.merged.memory),
|
|
2857
|
+
};
|
|
2858
|
+
}
|
|
2859
|
+
case 'qwen/settings/setMemory': {
|
|
2860
|
+
const updates = toRecord(params['updates']);
|
|
2861
|
+
// Mutate a freshly loaded settings object and adopt it, mirroring the
|
|
2862
|
+
// other settings mutation handlers, instead of writing through the
|
|
2863
|
+
// possibly-stale cached `this.settings` and reading it back.
|
|
2864
|
+
const settings = loadSettings(cwd);
|
|
2865
|
+
for (const key of QWEN_MEMORY_SETTING_KEYS) {
|
|
2866
|
+
if (updates[key] === undefined)
|
|
2867
|
+
continue;
|
|
2868
|
+
if (typeof updates[key] !== 'boolean') {
|
|
2869
|
+
throw RequestError.invalidParams(undefined, `Invalid memory setting '${key}': expected boolean`);
|
|
2870
|
+
}
|
|
2871
|
+
settings.setValue(SettingScope.User, `memory.${key}`, updates[key]);
|
|
2872
|
+
}
|
|
2873
|
+
this.settings = settings;
|
|
2874
|
+
return {
|
|
2875
|
+
settings: normalizeQwenMemorySettings(settings.merged.memory),
|
|
2876
|
+
};
|
|
2877
|
+
}
|
|
2878
|
+
case 'qwen/settings/getPath': {
|
|
2879
|
+
return { path: this.settings.user.path };
|
|
2880
|
+
}
|
|
2881
|
+
case 'qwen/settings/getMemoryPaths': {
|
|
2882
|
+
const projectRoot = typeof params['projectRoot'] === 'string'
|
|
2883
|
+
? params['projectRoot']
|
|
2884
|
+
: cwd;
|
|
2885
|
+
return {
|
|
2886
|
+
paths: await resolveQwenMemoryPaths({ cwd, projectRoot }),
|
|
2887
|
+
};
|
|
2888
|
+
}
|
|
2889
|
+
case SERVE_STATUS_EXT_METHODS.workspaceMcp:
|
|
2890
|
+
return this.buildWorkspaceMcpStatus(this.config);
|
|
2891
|
+
case SERVE_STATUS_EXT_METHODS.workspaceSkills:
|
|
2892
|
+
return (await this.buildWorkspaceSkillsStatus(this.config));
|
|
2893
|
+
case SERVE_STATUS_EXT_METHODS.workspaceProviders:
|
|
2894
|
+
return this.buildWorkspaceProvidersStatus(this.config);
|
|
2895
|
+
case SERVE_STATUS_EXT_METHODS.workspacePreflight:
|
|
2896
|
+
return (await this.buildAcpPreflightCells(this.config));
|
|
2897
|
+
case SERVE_STATUS_EXT_METHODS.sessionContext: {
|
|
2898
|
+
const sessionId = params['sessionId'];
|
|
2899
|
+
if (typeof sessionId !== 'string' || sessionId.length === 0) {
|
|
2900
|
+
throw RequestError.invalidParams(undefined, 'Invalid or missing sessionId');
|
|
2901
|
+
}
|
|
2902
|
+
return this.buildSessionContextStatus(sessionId);
|
|
2903
|
+
}
|
|
2904
|
+
case SERVE_STATUS_EXT_METHODS.sessionSupportedCommands: {
|
|
2905
|
+
const sessionId = params['sessionId'];
|
|
2906
|
+
if (typeof sessionId !== 'string' || sessionId.length === 0) {
|
|
2907
|
+
throw RequestError.invalidParams(undefined, 'Invalid or missing sessionId');
|
|
2908
|
+
}
|
|
2909
|
+
return (await this.buildSessionSupportedCommandsStatus(sessionId));
|
|
2910
|
+
}
|
|
2911
|
+
case SERVE_CONTROL_EXT_METHODS.workspaceMcpRestart: {
|
|
2912
|
+
// #4175 Wave 4 PR 17. Single-server MCP restart with budget
|
|
2913
|
+
// pre-check from PR 14 v1's accounting snapshot. Soft skips
|
|
2914
|
+
// (in_flight, disabled, budget_would_exceed) come back as
|
|
2915
|
+
// structured 200 responses; hard errors (server not in
|
|
2916
|
+
// config, manager unavailable, post-discover not connected)
|
|
2917
|
+
// propagate as JSON-RPC errors with structured `data` that
|
|
2918
|
+
// the bridge translates to typed HTTP responses.
|
|
2919
|
+
const serverName = params['serverName'];
|
|
2920
|
+
if (typeof serverName !== 'string' || serverName.length === 0) {
|
|
2921
|
+
throw RequestError.invalidParams(undefined, 'Invalid or missing serverName');
|
|
2922
|
+
}
|
|
2923
|
+
const servers = this.config.getMcpServers() ?? {};
|
|
2924
|
+
if (!Object.prototype.hasOwnProperty.call(servers, serverName)) {
|
|
2925
|
+
// #4282 gpt-5.5 C5 fold-in: the bridge looks for
|
|
2926
|
+
// `data.errorKind: 'mcp_server_not_found'` to map this back
|
|
2927
|
+
// to a typed `McpServerNotFoundError` and a stable HTTP 404
|
|
2928
|
+
// — without the structured payload the bridge can't
|
|
2929
|
+
// distinguish this from a generic JSON-RPC error and the
|
|
2930
|
+
// route falls through to 500.
|
|
2931
|
+
throw new RequestError(-32004, `MCP server not configured: ${JSON.stringify(serverName)}`, { errorKind: 'mcp_server_not_found', serverName });
|
|
2932
|
+
}
|
|
2933
|
+
if (this.config.isMcpServerDisabled(serverName)) {
|
|
2934
|
+
return {
|
|
2935
|
+
serverName,
|
|
2936
|
+
restarted: false,
|
|
2937
|
+
skipped: true,
|
|
2938
|
+
reason: 'disabled',
|
|
2939
|
+
};
|
|
2940
|
+
}
|
|
2941
|
+
const manager = this.config.getToolRegistry()?.getMcpClientManager();
|
|
2942
|
+
if (!manager) {
|
|
2943
|
+
throw RequestError.internalError(undefined, 'McpClientManager unavailable on this Config');
|
|
2944
|
+
}
|
|
2945
|
+
if (manager.isServerDiscovering(serverName)) {
|
|
2946
|
+
return {
|
|
2947
|
+
serverName,
|
|
2948
|
+
restarted: false,
|
|
2949
|
+
skipped: true,
|
|
2950
|
+
reason: 'in_flight',
|
|
2951
|
+
};
|
|
2952
|
+
}
|
|
2953
|
+
const accounting = manager.getMcpClientAccounting();
|
|
2954
|
+
const budget = manager.getMcpClientBudget();
|
|
2955
|
+
const mode = manager.getMcpBudgetMode();
|
|
2956
|
+
// #4282 gpt-5.5 C3 fold-in: enforce-mode capacity is reserved
|
|
2957
|
+
// by `tryReserveSlot` via `reservedSlots` (which counts
|
|
2958
|
+
// configured + in-flight + disconnected slot holders), not by
|
|
2959
|
+
// `total` (which only counts CONNECTED clients). Comparing
|
|
2960
|
+
// `total` to budget under-counted reservations and let a
|
|
2961
|
+
// restart proceed past capacity; the manager would then
|
|
2962
|
+
// refuse internally and return void, while this handler
|
|
2963
|
+
// reported `restarted: true`. Mirror the manager's policy
|
|
2964
|
+
// by checking `reservedSlots.length` for servers that don't
|
|
2965
|
+
// already hold a reservation.
|
|
2966
|
+
if (mode === 'enforce' &&
|
|
2967
|
+
budget !== undefined &&
|
|
2968
|
+
!accounting.reservedSlots.includes(serverName) &&
|
|
2969
|
+
accounting.reservedSlots.length >= budget) {
|
|
2970
|
+
return {
|
|
2971
|
+
serverName,
|
|
2972
|
+
restarted: false,
|
|
2973
|
+
skipped: true,
|
|
2974
|
+
reason: 'budget_would_exceed',
|
|
2975
|
+
};
|
|
2976
|
+
}
|
|
2977
|
+
const start = Date.now();
|
|
2978
|
+
await manager.discoverMcpToolsForServer(serverName, this.config);
|
|
2979
|
+
// #4282 gpt-5.5 C4 fold-in: `discoverMcpToolsForServer`
|
|
2980
|
+
// catches reconnect/discovery errors internally (logs and
|
|
2981
|
+
// resolves void) so a broken MCP server would otherwise
|
|
2982
|
+
// surface as `restarted: true`. Verify the live status from
|
|
2983
|
+
// the per-server status map; anything other than CONNECTED
|
|
2984
|
+
// means the restart didn't take effect.
|
|
2985
|
+
const postStatus = getMCPServerStatus(serverName);
|
|
2986
|
+
if (postStatus !== MCPServerStatus.CONNECTED) {
|
|
2987
|
+
throw new RequestError(-32099, `MCP server ${JSON.stringify(serverName)} did not reach a ` +
|
|
2988
|
+
`connected state after restart (status: ${postStatus}).`, {
|
|
2989
|
+
errorKind: 'mcp_restart_failed',
|
|
2990
|
+
serverName,
|
|
2991
|
+
mcpStatus: postStatus,
|
|
2992
|
+
});
|
|
2993
|
+
}
|
|
2994
|
+
return {
|
|
2995
|
+
serverName,
|
|
2996
|
+
restarted: true,
|
|
2997
|
+
durationMs: Date.now() - start,
|
|
2998
|
+
};
|
|
2999
|
+
}
|
|
3000
|
+
case SERVE_CONTROL_EXT_METHODS.sessionApprovalMode: {
|
|
3001
|
+
// #4175 Wave 4 PR 17: remote callers change a live session's
|
|
3002
|
+
// approval mode via this ACP extMethod. `Config.setApprovalMode`
|
|
3003
|
+
// throws `TrustGateError` for privileged modes in an untrusted
|
|
3004
|
+
// folder; we let it propagate — the bridge's mapping helper
|
|
3005
|
+
// converts the name to `errorKind: 'auth_env_error'` on the
|
|
3006
|
+
// wire so the SDK consumer gets a structured failure.
|
|
3007
|
+
const sessionId = params['sessionId'];
|
|
3008
|
+
const mode = params['mode'];
|
|
3009
|
+
if (typeof sessionId !== 'string' || sessionId.length === 0) {
|
|
3010
|
+
throw RequestError.invalidParams(undefined, 'Invalid or missing sessionId');
|
|
3011
|
+
}
|
|
3012
|
+
if (typeof mode !== 'string' ||
|
|
3013
|
+
!APPROVAL_MODES.includes(mode)) {
|
|
3014
|
+
throw RequestError.invalidParams(undefined, `Invalid approval mode; allowed: ${APPROVAL_MODES.join(', ')}`);
|
|
3015
|
+
}
|
|
3016
|
+
const session = this.sessionOrThrow(sessionId);
|
|
3017
|
+
const config = session.getConfig();
|
|
3018
|
+
const previous = config.getApprovalMode();
|
|
3019
|
+
try {
|
|
3020
|
+
config.setApprovalMode(mode);
|
|
3021
|
+
}
|
|
3022
|
+
catch (err) {
|
|
3023
|
+
// `TrustGateError` is the core's structured rejection for
|
|
3024
|
+
// untrusted-folder + privileged-mode. We re-raise it as a
|
|
3025
|
+
// JSON-RPC error whose `data.errorKind` is the literal the
|
|
3026
|
+
// bridge looks for to reconstruct a typed `TrustGateError` on
|
|
3027
|
+
// the daemon side (JSON-RPC strips the class name across the
|
|
3028
|
+
// wire). Other errors propagate unchanged.
|
|
3029
|
+
if (err instanceof Error && err.name === 'TrustGateError') {
|
|
3030
|
+
throw new RequestError(-32003, err.message, {
|
|
3031
|
+
errorKind: 'trust_gate',
|
|
3032
|
+
});
|
|
3033
|
+
}
|
|
3034
|
+
throw err;
|
|
3035
|
+
}
|
|
3036
|
+
const current = config.getApprovalMode();
|
|
3037
|
+
return { previous, current };
|
|
3038
|
+
}
|
|
3039
|
+
case 'deleteSession': {
|
|
3040
|
+
const sessionId = params['sessionId'];
|
|
3041
|
+
if (!sessionId || !SESSION_ID_RE.test(sessionId)) {
|
|
3042
|
+
throw RequestError.invalidParams(undefined, 'Invalid or missing sessionId');
|
|
3043
|
+
}
|
|
3044
|
+
const success = await runWithAcpRuntimeOutputDir(this.settings, cwd, async () => {
|
|
3045
|
+
const sessionService = new SessionService(cwd);
|
|
3046
|
+
return sessionService.removeSession(sessionId);
|
|
3047
|
+
});
|
|
3048
|
+
return { success };
|
|
3049
|
+
}
|
|
3050
|
+
case 'renameSession': {
|
|
3051
|
+
const sessionId = params['sessionId'];
|
|
3052
|
+
const title = params['title'];
|
|
3053
|
+
if (!sessionId || !SESSION_ID_RE.test(sessionId)) {
|
|
3054
|
+
throw RequestError.invalidParams(undefined, 'Invalid or missing sessionId');
|
|
3055
|
+
}
|
|
3056
|
+
if (!title || typeof title !== 'string') {
|
|
3057
|
+
throw RequestError.invalidParams(undefined, 'Invalid or missing title');
|
|
3058
|
+
}
|
|
3059
|
+
if (title.length > SESSION_TITLE_MAX_LENGTH) {
|
|
3060
|
+
throw RequestError.invalidParams(undefined, `Title too long (max ${SESSION_TITLE_MAX_LENGTH} chars)`);
|
|
3061
|
+
}
|
|
3062
|
+
// When the target session is currently live in this process, route
|
|
3063
|
+
// through its ChatRecordingService so the in-memory `currentCustomTitle`
|
|
3064
|
+
// stays in sync. Writing directly to disk via SessionService here
|
|
3065
|
+
// would leave the live recording's cache stale; the next title
|
|
3066
|
+
// re-anchor (every 32KB of writes) or finalize() would re-emit the
|
|
3067
|
+
// old title and silently revert the rename. The disk-only path
|
|
3068
|
+
// remains for the dead-session case (e.g., another client renaming
|
|
3069
|
+
// a session that isn't active in this process).
|
|
3070
|
+
const liveRecording = this.sessions
|
|
3071
|
+
.get(sessionId)
|
|
3072
|
+
?.getConfig()
|
|
3073
|
+
.getChatRecordingService();
|
|
3074
|
+
if (liveRecording) {
|
|
3075
|
+
const ok = liveRecording.recordCustomTitle(title, 'manual');
|
|
3076
|
+
await liveRecording.flush();
|
|
3077
|
+
return { success: ok };
|
|
3078
|
+
}
|
|
3079
|
+
const success = await runWithAcpRuntimeOutputDir(this.settings, cwd, async () => {
|
|
3080
|
+
const sessionService = new SessionService(cwd);
|
|
3081
|
+
return sessionService.renameSession(sessionId, title);
|
|
3082
|
+
});
|
|
3083
|
+
return { success };
|
|
3084
|
+
}
|
|
3085
|
+
case 'rewindSession': {
|
|
3086
|
+
const sessionId = params['sessionId'];
|
|
3087
|
+
const targetTurnIndex = params['targetTurnIndex'];
|
|
3088
|
+
if (!sessionId || !SESSION_ID_RE.test(sessionId)) {
|
|
3089
|
+
throw RequestError.invalidParams(undefined, 'Invalid or missing sessionId');
|
|
3090
|
+
}
|
|
3091
|
+
if (!Number.isInteger(targetTurnIndex) ||
|
|
3092
|
+
targetTurnIndex < 0) {
|
|
3093
|
+
throw RequestError.invalidParams(undefined, 'Invalid or missing targetTurnIndex');
|
|
3094
|
+
}
|
|
3095
|
+
const session = this.sessions.get(sessionId);
|
|
3096
|
+
if (!session) {
|
|
3097
|
+
throw RequestError.invalidParams(undefined, `Session not found for id: ${sessionId}`);
|
|
3098
|
+
}
|
|
3099
|
+
const historyBeforeRewind = session.captureHistorySnapshot();
|
|
3100
|
+
return {
|
|
3101
|
+
success: true,
|
|
3102
|
+
historyBeforeRewind,
|
|
3103
|
+
...session.rewindToTurn(targetTurnIndex),
|
|
3104
|
+
};
|
|
3105
|
+
}
|
|
3106
|
+
case 'qwen/session/loadUpdates': {
|
|
3107
|
+
const sessionId = params['sessionId'];
|
|
3108
|
+
if (!sessionId || !SESSION_ID_RE.test(sessionId)) {
|
|
3109
|
+
throw RequestError.invalidParams(undefined, 'Invalid or missing sessionId');
|
|
3110
|
+
}
|
|
3111
|
+
const sessionData = await runWithAcpRuntimeOutputDir(this.settings, cwd, async () => {
|
|
3112
|
+
const sessionService = new SessionService(cwd);
|
|
3113
|
+
return sessionService.loadSession(sessionId);
|
|
3114
|
+
});
|
|
3115
|
+
if (!sessionData?.conversation) {
|
|
3116
|
+
return { updates: [] };
|
|
3117
|
+
}
|
|
3118
|
+
const updates = [];
|
|
3119
|
+
const replayContext = {
|
|
3120
|
+
sessionId,
|
|
3121
|
+
config: this.config,
|
|
3122
|
+
sendUpdate: async (update) => {
|
|
3123
|
+
updates.push(update);
|
|
3124
|
+
},
|
|
3125
|
+
};
|
|
3126
|
+
let replayError;
|
|
3127
|
+
try {
|
|
3128
|
+
await new HistoryReplayer(replayContext).replay(sessionData.conversation.messages);
|
|
3129
|
+
}
|
|
3130
|
+
catch (error) {
|
|
3131
|
+
replayError = error instanceof Error ? error.message : String(error);
|
|
3132
|
+
debugLogger.warn('[loadUpdates] History replay failed for session %s (partial updates: %d):', sessionId, updates.length, error);
|
|
3133
|
+
}
|
|
3134
|
+
const updatesWithTopLevelTimestamps = updates.map((update) => {
|
|
3135
|
+
const record = update;
|
|
3136
|
+
const meta = record['_meta'];
|
|
3137
|
+
const timestamp = meta && typeof meta === 'object' && !Array.isArray(meta)
|
|
3138
|
+
? meta['timestamp']
|
|
3139
|
+
: undefined;
|
|
3140
|
+
return typeof timestamp === 'number' || typeof timestamp === 'string'
|
|
3141
|
+
? { ...record, timestamp }
|
|
3142
|
+
: record;
|
|
3143
|
+
});
|
|
3144
|
+
return {
|
|
3145
|
+
updates: updatesWithTopLevelTimestamps,
|
|
3146
|
+
startTime: sessionData.conversation.startTime,
|
|
3147
|
+
lastUpdated: sessionData.conversation.lastUpdated,
|
|
3148
|
+
// Signal to the client that replay aborted partway so it doesn't
|
|
3149
|
+
// render a truncated replay as the full conversation.
|
|
3150
|
+
...(replayError !== undefined ? { partial: true, replayError } : {}),
|
|
3151
|
+
};
|
|
3152
|
+
}
|
|
3153
|
+
case 'restoreSessionHistory': {
|
|
3154
|
+
const sessionId = params['sessionId'];
|
|
3155
|
+
const history = params['history'];
|
|
3156
|
+
if (!sessionId || !SESSION_ID_RE.test(sessionId)) {
|
|
3157
|
+
throw RequestError.invalidParams(undefined, 'Invalid or missing sessionId');
|
|
3158
|
+
}
|
|
3159
|
+
if (!Array.isArray(history)) {
|
|
3160
|
+
throw RequestError.invalidParams(undefined, 'Invalid or missing history');
|
|
3161
|
+
}
|
|
3162
|
+
const session = this.sessions.get(sessionId);
|
|
3163
|
+
if (!session) {
|
|
3164
|
+
throw RequestError.invalidParams(undefined, `Session not found for id: ${sessionId}`);
|
|
3165
|
+
}
|
|
3166
|
+
session.restoreHistory(history);
|
|
3167
|
+
return { success: true };
|
|
3168
|
+
}
|
|
3169
|
+
case 'getAccountInfo': {
|
|
3170
|
+
const sessionId = params['sessionId'];
|
|
3171
|
+
const session = sessionId ? this.sessions.get(sessionId) : undefined;
|
|
3172
|
+
const config = session ? session.getConfig() : this.config;
|
|
3173
|
+
const cfg = config.getContentGeneratorConfig();
|
|
3174
|
+
return {
|
|
3175
|
+
authType: cfg?.authType ?? config.getAuthType() ?? null,
|
|
3176
|
+
model: cfg?.model ?? config.getModel() ?? null,
|
|
3177
|
+
baseUrl: cfg?.baseUrl ?? null,
|
|
3178
|
+
apiKeyEnvKey: cfg?.apiKeyEnvKey ?? null,
|
|
3179
|
+
};
|
|
3180
|
+
}
|
|
3181
|
+
case 'qwen/settings/getCore': {
|
|
3182
|
+
const settings = loadSettings(cwd);
|
|
3183
|
+
this.settings = settings;
|
|
3184
|
+
return this.buildCoreSettings(settings, cwd);
|
|
3185
|
+
}
|
|
3186
|
+
case 'qwen/settings/setCoreValue': {
|
|
3187
|
+
const key = params['key'];
|
|
3188
|
+
if (typeof key !== 'string' ||
|
|
3189
|
+
!QWEN_CORE_SETTING_KEYS.includes(key)) {
|
|
3190
|
+
throw RequestError.invalidParams(undefined, 'Unsupported Qwen setting key');
|
|
3191
|
+
}
|
|
3192
|
+
const settings = loadSettings(cwd);
|
|
3193
|
+
const settingKey = key;
|
|
3194
|
+
const normalizedValue = normalizeCoreSettingValue(settingKey, params['value']);
|
|
3195
|
+
const scope = toSettingsScope(params['scope']);
|
|
3196
|
+
settings.setValue(scope, key, normalizedValue);
|
|
3197
|
+
if (settingKey === 'general.outputLanguage' &&
|
|
3198
|
+
typeof normalizedValue === 'string' &&
|
|
3199
|
+
scope === SettingScope.User) {
|
|
3200
|
+
// output-language.md is a single global instruction file. Only a
|
|
3201
|
+
// user-scoped change should rewrite it; a workspace-scoped change is
|
|
3202
|
+
// persisted to the workspace settings file and must not clobber the
|
|
3203
|
+
// global file (which would silently affect every other workspace and
|
|
3204
|
+
// session).
|
|
3205
|
+
updateOutputLanguageFile(normalizedValue);
|
|
3206
|
+
}
|
|
3207
|
+
// `setValue` already persisted to disk and recomputed the in-memory
|
|
3208
|
+
// merged view, so reloading from disk here is redundant I/O.
|
|
3209
|
+
this.settings = settings;
|
|
3210
|
+
return this.buildCoreSettings(settings, cwd);
|
|
3211
|
+
}
|
|
3212
|
+
case 'qwen/settings/setMcpServer': {
|
|
3213
|
+
const name = params['name'];
|
|
3214
|
+
if (typeof name !== 'string' || !name.trim()) {
|
|
3215
|
+
throw RequestError.invalidParams(undefined, 'MCP server name is required');
|
|
3216
|
+
}
|
|
3217
|
+
const settings = loadSettings(cwd);
|
|
3218
|
+
const settingScope = toSettingsScope(params['scope']);
|
|
3219
|
+
const scope = settingScope === SettingScope.Workspace ? 'workspace' : 'user';
|
|
3220
|
+
const existing = readScopeSettings(settings, scope);
|
|
3221
|
+
const existingServers = toRecord(existing['mcpServers']);
|
|
3222
|
+
const mcpServers = {
|
|
3223
|
+
...existingServers,
|
|
3224
|
+
[name.trim()]: toStoredMcpServerConfig(restoreRedactedMcpSecrets(normalizeMcpServerConfig(params['server']), toRecord(existingServers[name.trim()]))),
|
|
3225
|
+
};
|
|
3226
|
+
settings.setValue(settingScope, 'mcpServers', mcpServers);
|
|
3227
|
+
// `setValue` already persisted to disk and recomputed the in-memory
|
|
3228
|
+
// merged view, so reloading from disk here is redundant I/O.
|
|
3229
|
+
this.settings = settings;
|
|
3230
|
+
return this.buildCoreSettings(settings, cwd);
|
|
3231
|
+
}
|
|
3232
|
+
case 'qwen/settings/removeMcpServer': {
|
|
3233
|
+
const name = params['name'];
|
|
3234
|
+
if (typeof name !== 'string' || !name.trim()) {
|
|
3235
|
+
throw RequestError.invalidParams(undefined, 'MCP server name is required');
|
|
3236
|
+
}
|
|
3237
|
+
const settings = loadSettings(cwd);
|
|
3238
|
+
const settingScope = toSettingsScope(params['scope']);
|
|
3239
|
+
const scope = settingScope === SettingScope.Workspace ? 'workspace' : 'user';
|
|
3240
|
+
const existing = readScopeSettings(settings, scope);
|
|
3241
|
+
const mcpServers = { ...toRecord(existing['mcpServers']) };
|
|
3242
|
+
delete mcpServers[name.trim()];
|
|
3243
|
+
settings.setValue(settingScope, 'mcpServers', mcpServers);
|
|
3244
|
+
// `setValue` already persisted to disk and recomputed the in-memory
|
|
3245
|
+
// merged view, so reloading from disk here is redundant I/O.
|
|
3246
|
+
this.settings = settings;
|
|
3247
|
+
return this.buildCoreSettings(settings, cwd);
|
|
3248
|
+
}
|
|
3249
|
+
case 'qwen/settings/setHook': {
|
|
3250
|
+
const event = params['event'];
|
|
3251
|
+
if (!isHookEvent(event)) {
|
|
3252
|
+
throw RequestError.invalidParams(undefined, 'Invalid hook event');
|
|
3253
|
+
}
|
|
3254
|
+
const settings = loadSettings(cwd);
|
|
3255
|
+
const settingScope = toSettingsScope(params['scope']);
|
|
3256
|
+
const scope = settingScope === SettingScope.Workspace ? 'workspace' : 'user';
|
|
3257
|
+
const existing = readScopeSettings(settings, scope);
|
|
3258
|
+
const hooksRoot = { ...toRecord(existing['hooks']) };
|
|
3259
|
+
const eventHooks = Array.isArray(hooksRoot[event])
|
|
3260
|
+
? [...hooksRoot[event]]
|
|
3261
|
+
: [];
|
|
3262
|
+
const incomingHook = normalizeHookDefinition(params['hook']);
|
|
3263
|
+
const index = params['index'];
|
|
3264
|
+
// Only replace when the index points at an existing entry. An
|
|
3265
|
+
// out-of-range index would create sparse-array holes that serialize to
|
|
3266
|
+
// `null` in settings.json and corrupt hook loading, so treat it (and a
|
|
3267
|
+
// missing/negative index) as an append.
|
|
3268
|
+
const isReplace = typeof index === 'number' &&
|
|
3269
|
+
Number.isInteger(index) &&
|
|
3270
|
+
index >= 0 &&
|
|
3271
|
+
index < eventHooks.length;
|
|
3272
|
+
// Restore any `__redacted__` env/header values the client echoed back
|
|
3273
|
+
// from getCore against the hook being replaced, so masking on read
|
|
3274
|
+
// never persists the sentinel over a real secret.
|
|
3275
|
+
const hook = restoreRedactedHookSecrets(incomingHook, isReplace ? toRecord(eventHooks[index]) : {});
|
|
3276
|
+
if (isReplace) {
|
|
3277
|
+
eventHooks[index] = hook;
|
|
3278
|
+
}
|
|
3279
|
+
else {
|
|
3280
|
+
// Missing/negative/non-integer index → append. (A non-integer like
|
|
3281
|
+
// 1.5 would otherwise create a sparse, non-integer array property
|
|
3282
|
+
// that JSON.stringify silently drops, corrupting the hook list.)
|
|
3283
|
+
eventHooks.push(hook);
|
|
3284
|
+
}
|
|
3285
|
+
hooksRoot[event] = eventHooks;
|
|
3286
|
+
settings.setValue(settingScope, 'hooks', hooksRoot);
|
|
3287
|
+
// `setValue` already persisted to disk and recomputed the in-memory
|
|
3288
|
+
// merged view, so reloading from disk here is redundant I/O.
|
|
3289
|
+
this.settings = settings;
|
|
3290
|
+
return this.buildCoreSettings(settings, cwd);
|
|
3291
|
+
}
|
|
3292
|
+
case 'qwen/settings/removeHook': {
|
|
3293
|
+
const event = params['event'];
|
|
3294
|
+
if (!isHookEvent(event)) {
|
|
3295
|
+
throw RequestError.invalidParams(undefined, 'Invalid hook event');
|
|
3296
|
+
}
|
|
3297
|
+
const index = params['index'];
|
|
3298
|
+
if (typeof index !== 'number' ||
|
|
3299
|
+
!Number.isInteger(index) ||
|
|
3300
|
+
index < 0) {
|
|
3301
|
+
throw RequestError.invalidParams(undefined, 'Invalid hook index');
|
|
3302
|
+
}
|
|
3303
|
+
const settings = loadSettings(cwd);
|
|
3304
|
+
const settingScope = toSettingsScope(params['scope']);
|
|
3305
|
+
const scope = settingScope === SettingScope.Workspace ? 'workspace' : 'user';
|
|
3306
|
+
const existing = readScopeSettings(settings, scope);
|
|
3307
|
+
const hooksRoot = { ...toRecord(existing['hooks']) };
|
|
3308
|
+
const eventHooks = Array.isArray(hooksRoot[event])
|
|
3309
|
+
? [...hooksRoot[event]]
|
|
3310
|
+
: [];
|
|
3311
|
+
if (index >= eventHooks.length) {
|
|
3312
|
+
throw RequestError.invalidParams(undefined, `Hook index ${index} out of range (event has ${eventHooks.length} hooks)`);
|
|
3313
|
+
}
|
|
3314
|
+
eventHooks.splice(index, 1);
|
|
3315
|
+
hooksRoot[event] = eventHooks;
|
|
3316
|
+
settings.setValue(settingScope, 'hooks', hooksRoot);
|
|
3317
|
+
// `setValue` already persisted to disk and recomputed the in-memory
|
|
3318
|
+
// merged view, so reloading from disk here is redundant I/O.
|
|
3319
|
+
this.settings = settings;
|
|
3320
|
+
return this.buildCoreSettings(settings, cwd);
|
|
3321
|
+
}
|
|
3322
|
+
case 'qwen/settings/setExtensionSetting': {
|
|
3323
|
+
const extensionId = params['extensionId'];
|
|
3324
|
+
const settingKey = params['settingKey'];
|
|
3325
|
+
const value = params['value'];
|
|
3326
|
+
if (typeof extensionId !== 'string' || !extensionId) {
|
|
3327
|
+
throw RequestError.invalidParams(undefined, 'extensionId is required');
|
|
3328
|
+
}
|
|
3329
|
+
if (typeof settingKey !== 'string' || !settingKey) {
|
|
3330
|
+
throw RequestError.invalidParams(undefined, 'settingKey is required');
|
|
3331
|
+
}
|
|
3332
|
+
if (typeof value !== 'string') {
|
|
3333
|
+
throw RequestError.invalidParams(undefined, 'value must be a string');
|
|
3334
|
+
}
|
|
3335
|
+
const settings = loadSettings(cwd);
|
|
3336
|
+
const extensionManager = new ExtensionManager({
|
|
3337
|
+
workspaceDir: cwd,
|
|
3338
|
+
isWorkspaceTrusted: !!isWorkspaceTrusted(settings.merged),
|
|
3339
|
+
});
|
|
3340
|
+
await extensionManager.refreshCache();
|
|
3341
|
+
const extension = extensionManager
|
|
3342
|
+
.getLoadedExtensions()
|
|
3343
|
+
.find((item) => item.id === extensionId || item.name === extensionId);
|
|
3344
|
+
if (!extension) {
|
|
3345
|
+
throw RequestError.invalidParams(undefined, 'Extension not found');
|
|
3346
|
+
}
|
|
3347
|
+
const extScope = toSettingsScope(params['scope']) === SettingScope.Workspace
|
|
3348
|
+
? ExtensionSettingScope.WORKSPACE
|
|
3349
|
+
: ExtensionSettingScope.USER;
|
|
3350
|
+
await updateSetting(extension.config, extension.id, settingKey, async () => value, extScope);
|
|
3351
|
+
// Unlike the sibling core-setting handlers, this persists through
|
|
3352
|
+
// `updateSetting` (extension settings store), not `settings.setValue`,
|
|
3353
|
+
// so `settings` here is just the snapshot loaded above and is reused to
|
|
3354
|
+
// build the response.
|
|
3355
|
+
this.settings = settings;
|
|
3356
|
+
return this.buildCoreSettings(settings, cwd);
|
|
3357
|
+
}
|
|
3358
|
+
case 'qwen/permissions/getSettings': {
|
|
3359
|
+
const settings = this.loadPermissionSettings(cwd);
|
|
3360
|
+
return this.buildPermissionSettings(settings);
|
|
3361
|
+
}
|
|
3362
|
+
case 'qwen/permissions/setRules': {
|
|
3363
|
+
const scope = params['scope'];
|
|
3364
|
+
const ruleType = params['ruleType'];
|
|
3365
|
+
if (scope !== 'user' && scope !== 'workspace') {
|
|
3366
|
+
throw RequestError.invalidParams(undefined, 'scope must be "user" or "workspace"');
|
|
3367
|
+
}
|
|
3368
|
+
if (ruleType !== 'allow' && ruleType !== 'ask' && ruleType !== 'deny') {
|
|
3369
|
+
throw RequestError.invalidParams(undefined, 'ruleType must be "allow", "ask", or "deny"');
|
|
3370
|
+
}
|
|
3371
|
+
const settings = this.loadPermissionSettings(cwd);
|
|
3372
|
+
const before = readPermissionRuleSet(settings.merged);
|
|
3373
|
+
const rules = normalizePermissionRules(params['rules']);
|
|
3374
|
+
const settingScope = scope === 'workspace' ? SettingScope.Workspace : SettingScope.User;
|
|
3375
|
+
settings.setValue(settingScope, `permissions.${ruleType}`, rules);
|
|
3376
|
+
// `setValue` already recomputed the in-memory merged view, so read the
|
|
3377
|
+
// "after" state from the same instance instead of reloading from disk
|
|
3378
|
+
// (avoids redundant I/O and a concurrency window where another handler
|
|
3379
|
+
// could mutate settings between the two loads).
|
|
3380
|
+
const after = readPermissionRuleSet(settings.merged);
|
|
3381
|
+
this.syncLivePermissionManagers(before, after);
|
|
3382
|
+
return this.buildPermissionSettings(settings);
|
|
3383
|
+
}
|
|
3384
|
+
default:
|
|
3385
|
+
throw RequestError.methodNotFound(method);
|
|
3386
|
+
}
|
|
3387
|
+
}
|
|
3388
|
+
// --- private helpers ---
|
|
3389
|
+
async newSessionConfig(cwd, mcpServers, sessionId, resume) {
|
|
3390
|
+
this.settings = loadSettings(cwd);
|
|
3391
|
+
const mergedMcpServers = { ...this.settings.merged.mcpServers };
|
|
3392
|
+
for (const server of mcpServers) {
|
|
3393
|
+
const stdioServer = toStdioServer(server);
|
|
3394
|
+
if (stdioServer) {
|
|
3395
|
+
const env = {};
|
|
3396
|
+
for (const { name: envName, value } of stdioServer.env) {
|
|
3397
|
+
env[envName] = value;
|
|
3398
|
+
}
|
|
3399
|
+
mergedMcpServers[stdioServer.name] = new MCPServerConfig(stdioServer.command, stdioServer.args, env, cwd);
|
|
3400
|
+
continue;
|
|
3401
|
+
}
|
|
3402
|
+
const sseServer = toSseServer(server);
|
|
3403
|
+
if (sseServer) {
|
|
3404
|
+
const headers = {};
|
|
3405
|
+
for (const { name: headerName, value } of sseServer.headers) {
|
|
3406
|
+
headers[headerName] = value;
|
|
3407
|
+
}
|
|
3408
|
+
mergedMcpServers[sseServer.name] = new MCPServerConfig(undefined, undefined, undefined, undefined, sseServer.url, undefined, Object.keys(headers).length > 0 ? headers : undefined);
|
|
3409
|
+
continue;
|
|
3410
|
+
}
|
|
3411
|
+
const httpServer = toHttpServer(server);
|
|
3412
|
+
if (httpServer) {
|
|
3413
|
+
const headers = {};
|
|
3414
|
+
for (const { name: headerName, value } of httpServer.headers) {
|
|
3415
|
+
headers[headerName] = value;
|
|
3416
|
+
}
|
|
3417
|
+
mergedMcpServers[httpServer.name] = new MCPServerConfig(undefined, undefined, undefined, undefined, undefined, httpServer.url, Object.keys(headers).length > 0 ? headers : undefined);
|
|
3418
|
+
continue;
|
|
3419
|
+
}
|
|
3420
|
+
}
|
|
3421
|
+
const settings = { ...this.settings.merged, mcpServers: mergedMcpServers };
|
|
3422
|
+
const argvForSession = {
|
|
3423
|
+
...this.argv,
|
|
3424
|
+
...(resume ? { resume: sessionId } : { sessionId }),
|
|
3425
|
+
continue: false,
|
|
3426
|
+
};
|
|
3427
|
+
const config = await loadCliConfig(settings, argvForSession, cwd, [],
|
|
3428
|
+
// Pass separated hooks for proper source attribution
|
|
3429
|
+
{
|
|
3430
|
+
userHooks: this.settings.getUserHooks(),
|
|
3431
|
+
projectHooks: this.settings.getProjectHooks(),
|
|
3432
|
+
},
|
|
3433
|
+
// CRITICAL: close over `this.settings` (LoadedSettings instance), NOT
|
|
3434
|
+
// over the local `settings` snapshot built above. `LoadedSettings.
|
|
3435
|
+
// setValue` replaces `_merged`, so a closure over the snapshot would
|
|
3436
|
+
// never see workspace toggles applied during the session. ACP/Zed
|
|
3437
|
+
// sessions otherwise leak persisted disabled skills into the first
|
|
3438
|
+
// <available_skills> at cold start.
|
|
3439
|
+
buildDisabledSkillNamesProvider(this.settings));
|
|
3440
|
+
// PR 14b fix #2 (codex review round 1): register the MCP guardrail
|
|
3441
|
+
// budget-event callback BEFORE `config.initialize()`. Pre-fix the
|
|
3442
|
+
// registration ran AFTER initialize, which (a) missed end-of-pass
|
|
3443
|
+
// events under `QWEN_CODE_LEGACY_MCP_BLOCKING=1` (synchronous
|
|
3444
|
+
// discovery completes inside initialize, before our setter runs)
|
|
3445
|
+
// and (b) raced against background-discovery completion under the
|
|
3446
|
+
// default progressive mode. `Config.setMcpBudgetEventCallback`
|
|
3447
|
+
// stashes the callback and `createToolRegistry` applies it to the
|
|
3448
|
+
// manager BEFORE `discoverAllTools` / `startMcpDiscoveryInBackground`
|
|
3449
|
+
// fires, closing both windows.
|
|
3450
|
+
//
|
|
3451
|
+
// sessionId source: `config.getSessionId()` reads the Config's own
|
|
3452
|
+
// session id (auto-assigned via `randomUUID()` in the Config
|
|
3453
|
+
// constructor when no override is passed — see `config.ts:849`),
|
|
3454
|
+
// so the value is available immediately after `loadCliConfig`
|
|
3455
|
+
// returns. The closure pins it for the manager's whole lifetime.
|
|
3456
|
+
//
|
|
3457
|
+
// Defensive `typeof` checks tolerate stub Configs / ToolRegistries
|
|
3458
|
+
// in older tests (older fixtures may omit `setMcpBudgetEventCallback`
|
|
3459
|
+
// or `getSessionId`).
|
|
3460
|
+
const wiredSessionId = typeof config.getSessionId === 'function'
|
|
3461
|
+
? config.getSessionId()
|
|
3462
|
+
: undefined;
|
|
3463
|
+
if (typeof config.setMcpBudgetEventCallback === 'function' &&
|
|
3464
|
+
wiredSessionId !== undefined) {
|
|
3465
|
+
const sid = wiredSessionId;
|
|
3466
|
+
config.setMcpBudgetEventCallback((event) => {
|
|
3467
|
+
// Fire-and-forget: `extNotification` returns Promise<void> but
|
|
3468
|
+
// the manager's call site doesn't await. `.catch` suppresses
|
|
3469
|
+
// unhandled rejections — a mid-flight ACP disconnect would
|
|
3470
|
+
// otherwise crash the child. Snapshot still carries the state
|
|
3471
|
+
// for clients that reconnect.
|
|
3472
|
+
//
|
|
3473
|
+
// PR 14b fix (codex round 3 — DeepSeek): pre-fix the catch
|
|
3474
|
+
// handler was `() => {}`, silently dropping every error
|
|
3475
|
+
// including "real" ones (serialization bugs, protocol
|
|
3476
|
+
// violations) — operators had no debug trail. Now logs at
|
|
3477
|
+
// `debug` level: ACP channel closure during shutdown is the
|
|
3478
|
+
// expected case and would spam at higher levels, but `debug`
|
|
3479
|
+
// is opt-in so when an oncall engineer DOES turn it on for
|
|
3480
|
+
// an MCP guardrail incident, they see exactly which event
|
|
3481
|
+
// dropped and why.
|
|
3482
|
+
void this.connection
|
|
3483
|
+
.extNotification('qwen/notify/session/mcp-budget-event', {
|
|
3484
|
+
v: 1,
|
|
3485
|
+
sessionId: sid,
|
|
3486
|
+
...event,
|
|
3487
|
+
})
|
|
3488
|
+
.catch((err) => {
|
|
3489
|
+
debugLogger.debug(`MCP budget extNotification dropped ` +
|
|
3490
|
+
`(session=${sid}, kind=${event.kind}): ` +
|
|
3491
|
+
`${err instanceof Error ? err.message : String(err)}`);
|
|
3492
|
+
});
|
|
3493
|
+
});
|
|
3494
|
+
}
|
|
3495
|
+
await config.initialize();
|
|
3496
|
+
// Same reasoning as the top-level runAcpAgent path: ACP feeds session
|
|
3497
|
+
// messages to the model immediately, so we cannot return a Config whose
|
|
3498
|
+
// MCP discovery is still in flight.
|
|
3499
|
+
await config.waitForMcpReady();
|
|
3500
|
+
// Surface MCP failures to stderr — mirrors `runAcpAgent` (lines 95-107)
|
|
3501
|
+
// and the other non-interactive entry points (`gemini.tsx`,
|
|
3502
|
+
// `session.ts`). Without this, per-session ACP configs that lose MCP
|
|
3503
|
+
// servers fall back to built-in-tools-only with no user-visible
|
|
3504
|
+
// indication. Defensive against tests that pass a stubbed Config
|
|
3505
|
+
// without `getFailedMcpServerNames`.
|
|
3506
|
+
const failedMcpServers = typeof config.getFailedMcpServerNames === 'function'
|
|
3507
|
+
? config.getFailedMcpServerNames()
|
|
3508
|
+
: [];
|
|
3509
|
+
if (failedMcpServers.length > 0) {
|
|
3510
|
+
process.stderr.write(`Warning: MCP server(s) failed to start: ${failedMcpServers.join(', ')}. ` +
|
|
3511
|
+
`Continuing with built-in tools and any servers that did connect.\n`);
|
|
3512
|
+
}
|
|
3513
|
+
return config;
|
|
3514
|
+
}
|
|
3515
|
+
async ensureAuthenticated(config) {
|
|
3516
|
+
const selectedType = config.getModelsConfig().getCurrentAuthType();
|
|
3517
|
+
if (!selectedType) {
|
|
3518
|
+
throw RequestError.authRequired({ authMethods: pickAuthMethodsForAuthRequired() }, 'Use Qwen Code CLI to authenticate first.');
|
|
3519
|
+
}
|
|
3520
|
+
try {
|
|
3521
|
+
await config.refreshAuth(selectedType, true);
|
|
3522
|
+
}
|
|
3523
|
+
catch (e) {
|
|
3524
|
+
debugLogger.error(`Authentication failed: ${e}`);
|
|
3525
|
+
throw RequestError.authRequired({
|
|
3526
|
+
authMethods: pickAuthMethodsForAuthRequired(selectedType),
|
|
3527
|
+
}, 'Authentication failed: ' + e.message);
|
|
3528
|
+
}
|
|
3529
|
+
}
|
|
3530
|
+
setupFileSystem(config) {
|
|
3531
|
+
if (!this.clientCapabilities?.fs)
|
|
3532
|
+
return;
|
|
3533
|
+
const acpFileSystemService = new AcpFileSystemService(this.connection, config.getSessionId(), this.clientCapabilities.fs, config.getFileSystemService());
|
|
3534
|
+
config.setFileSystemService(acpFileSystemService);
|
|
3535
|
+
}
|
|
3536
|
+
async createAndStoreSession(config, conversation) {
|
|
3537
|
+
const sessionId = config.getSessionId();
|
|
3538
|
+
const geminiClient = config.getGeminiClient();
|
|
3539
|
+
const needsInitialize = !geminiClient.isInitialized();
|
|
3540
|
+
if (needsInitialize) {
|
|
3541
|
+
await geminiClient.initialize();
|
|
3542
|
+
}
|
|
3543
|
+
this.sessions.get(sessionId)?.dispose();
|
|
3544
|
+
const session = new Session(sessionId, config, this.connection, this.settings);
|
|
3545
|
+
this.sessions.set(sessionId, session);
|
|
3546
|
+
setTimeout(async () => {
|
|
3547
|
+
await session.sendAvailableCommandsUpdate();
|
|
3548
|
+
}, 0);
|
|
3549
|
+
if (conversation && conversation.messages) {
|
|
3550
|
+
await session.replayHistory(conversation.messages);
|
|
3551
|
+
}
|
|
3552
|
+
// Install rewriter AFTER history replay to avoid rewriting historical messages
|
|
3553
|
+
session.installRewriter();
|
|
3554
|
+
return session;
|
|
3555
|
+
}
|
|
3556
|
+
buildAvailableModels(config) {
|
|
3557
|
+
const rawCurrentModelId = (config.getModel() ||
|
|
3558
|
+
this.config.getModel() ||
|
|
3559
|
+
'').trim();
|
|
3560
|
+
const currentAuthType = config.getAuthType();
|
|
3561
|
+
const allConfiguredModels = config.getAllConfiguredModels();
|
|
3562
|
+
const activeRuntimeSnapshot = config.getActiveRuntimeModelSnapshot?.();
|
|
3563
|
+
const currentModelId = activeRuntimeSnapshot
|
|
3564
|
+
? formatAcpModelId(activeRuntimeSnapshot.id, activeRuntimeSnapshot.authType)
|
|
3565
|
+
: this.formatCurrentModelId(rawCurrentModelId, currentAuthType);
|
|
3566
|
+
const mappedAvailableModels = allConfiguredModels.map((model) => {
|
|
3567
|
+
const effectiveModelId = model.isRuntimeModel && model.runtimeSnapshotId
|
|
3568
|
+
? model.runtimeSnapshotId
|
|
3569
|
+
: model.id;
|
|
3570
|
+
return {
|
|
3571
|
+
modelId: formatAcpModelId(effectiveModelId, model.authType),
|
|
3572
|
+
name: model.label,
|
|
3573
|
+
description: model.description ?? null,
|
|
3574
|
+
_meta: {
|
|
3575
|
+
contextLimit: model.contextWindowSize ?? tokenLimit(model.id),
|
|
3576
|
+
},
|
|
3577
|
+
};
|
|
3578
|
+
});
|
|
3579
|
+
return {
|
|
3580
|
+
currentModelId,
|
|
3581
|
+
availableModels: mappedAvailableModels,
|
|
3582
|
+
};
|
|
3583
|
+
}
|
|
3584
|
+
buildModesData(config) {
|
|
3585
|
+
const currentApprovalMode = config.getApprovalMode();
|
|
3586
|
+
const availableModes = APPROVAL_MODES.map((mode) => ({
|
|
3587
|
+
id: mode,
|
|
3588
|
+
name: APPROVAL_MODE_INFO[mode].name,
|
|
3589
|
+
description: APPROVAL_MODE_INFO[mode].description,
|
|
3590
|
+
}));
|
|
3591
|
+
return {
|
|
3592
|
+
currentModeId: currentApprovalMode,
|
|
3593
|
+
availableModes,
|
|
3594
|
+
};
|
|
3595
|
+
}
|
|
3596
|
+
buildConfigOptions(config) {
|
|
3597
|
+
const currentApprovalMode = config.getApprovalMode();
|
|
3598
|
+
const allConfiguredModels = config.getAllConfiguredModels();
|
|
3599
|
+
const rawCurrentModelId = (config.getModel() || '').trim();
|
|
3600
|
+
const currentAuthType = config.getAuthType?.();
|
|
3601
|
+
const activeRuntimeSnapshot = config.getActiveRuntimeModelSnapshot?.();
|
|
3602
|
+
const currentModelId = activeRuntimeSnapshot
|
|
3603
|
+
? formatAcpModelId(activeRuntimeSnapshot.id, activeRuntimeSnapshot.authType)
|
|
3604
|
+
: this.formatCurrentModelId(rawCurrentModelId, currentAuthType);
|
|
3605
|
+
const modeOptions = APPROVAL_MODES.map((mode) => ({
|
|
3606
|
+
value: mode,
|
|
3607
|
+
name: APPROVAL_MODE_INFO[mode].name,
|
|
3608
|
+
description: APPROVAL_MODE_INFO[mode].description,
|
|
3609
|
+
}));
|
|
3610
|
+
const modeConfigOption = {
|
|
3611
|
+
id: 'mode',
|
|
3612
|
+
name: 'Mode',
|
|
3613
|
+
description: 'Session permission mode',
|
|
3614
|
+
category: 'mode',
|
|
3615
|
+
type: 'select',
|
|
3616
|
+
currentValue: currentApprovalMode,
|
|
3617
|
+
options: modeOptions,
|
|
3618
|
+
};
|
|
3619
|
+
const modelOptions = allConfiguredModels.map((model) => {
|
|
3620
|
+
const effectiveModelId = model.isRuntimeModel && model.runtimeSnapshotId
|
|
3621
|
+
? model.runtimeSnapshotId
|
|
3622
|
+
: model.id;
|
|
3623
|
+
return {
|
|
3624
|
+
value: formatAcpModelId(effectiveModelId, model.authType),
|
|
3625
|
+
name: model.label,
|
|
3626
|
+
description: model.description ?? '',
|
|
3627
|
+
};
|
|
3628
|
+
});
|
|
3629
|
+
const modelConfigOption = {
|
|
3630
|
+
id: 'model',
|
|
3631
|
+
name: 'Model',
|
|
3632
|
+
description: 'AI model to use',
|
|
3633
|
+
category: 'model',
|
|
3634
|
+
type: 'select',
|
|
3635
|
+
currentValue: currentModelId,
|
|
3636
|
+
options: modelOptions,
|
|
3637
|
+
};
|
|
3638
|
+
return [modeConfigOption, modelConfigOption];
|
|
3639
|
+
}
|
|
3640
|
+
formatCurrentModelId(baseModelId, authType) {
|
|
3641
|
+
if (!baseModelId)
|
|
3642
|
+
return baseModelId;
|
|
3643
|
+
return authType ? formatAcpModelId(baseModelId, authType) : baseModelId;
|
|
3644
|
+
}
|
|
3645
|
+
}
|
|
3646
|
+
//# sourceMappingURL=acpAgent.js.map
|