@cjhyy/code-shell-core 0.5.0-rc.1 → 0.6.0-rc.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 +13 -10
- package/dist/agent/agent-definition-registry.d.ts +21 -3
- package/dist/agent/agent-definition-registry.js +49 -18
- package/dist/agent/agent-definition.d.ts +32 -0
- package/dist/agent/agent-definition.js +49 -4
- package/dist/arena/arena.js +11 -12
- package/dist/arena/context/context-tools.js +47 -6
- package/dist/arena/context/within-root.d.ts +7 -0
- package/dist/arena/context/within-root.js +15 -0
- package/dist/arena/iterate/phases/argue.js +8 -2
- package/dist/arena/iterate/phases/revise.js +1 -1
- package/dist/arena/iterate/phases/tournament.js +3 -3
- package/dist/arena/ledger.js +9 -1
- package/dist/arena/phases/adjudication.js +1 -4
- package/dist/arena/phases/build-consensus.js +1 -4
- package/dist/arena/phases/cross-review.js +2 -8
- package/dist/arena/phases/debate-rounds.js +1 -4
- package/dist/arena/phases/participant-research.js +1 -4
- package/dist/arena/phases/planning-detail-expansion.js +8 -10
- package/dist/arena/planner.js +0 -1
- package/dist/arena/providers/docs.d.ts +1 -0
- package/dist/arena/providers/docs.js +5 -2
- package/dist/arena/providers/repo.d.ts +1 -0
- package/dist/arena/providers/repo.js +5 -2
- package/dist/arena/strategies/utils.d.ts +1 -4
- package/dist/arena/strategies/utils.js +7 -51
- package/dist/arena/transitions.d.ts +7 -2
- package/dist/arena/transitions.js +9 -4
- package/dist/arena/types.d.ts +8 -2
- package/dist/automation/cron-expr.d.ts +41 -0
- package/dist/automation/cron-expr.js +169 -0
- package/dist/automation/index.d.ts +41 -0
- package/dist/automation/index.js +39 -0
- package/dist/automation/runner.d.ts +84 -0
- package/dist/automation/runner.js +92 -0
- package/dist/automation/scheduler.d.ts +194 -0
- package/dist/automation/scheduler.js +623 -0
- package/dist/automation/store.d.ts +39 -0
- package/dist/automation/store.js +122 -0
- package/dist/automation/write-policy.d.ts +34 -0
- package/dist/automation/write-policy.js +113 -0
- package/dist/automation/write-run.d.ts +51 -0
- package/dist/automation/write-run.js +38 -0
- package/dist/capability-control/disabled-lists.d.ts +25 -0
- package/dist/capability-control/disabled-lists.js +57 -0
- package/dist/capability-control/index.d.ts +5 -0
- package/dist/capability-control/index.js +3 -0
- package/dist/capability-control/overlay.d.ts +64 -0
- package/dist/capability-control/overlay.js +116 -0
- package/dist/capability-control/project.d.ts +65 -0
- package/dist/capability-control/project.js +147 -0
- package/dist/capability-control/service.d.ts +70 -0
- package/dist/capability-control/service.js +147 -0
- package/dist/capability-control/types.d.ts +62 -0
- package/dist/capability-control/types.js +17 -0
- package/dist/cc-orchestrator/agent-adapter.d.ts +50 -0
- package/dist/cc-orchestrator/agent-adapter.js +133 -0
- package/dist/cc-orchestrator/cc-capability.d.ts +19 -0
- package/dist/cc-orchestrator/cc-capability.js +53 -0
- package/dist/cc-orchestrator/codex-session-discovery.d.ts +24 -0
- package/dist/cc-orchestrator/codex-session-discovery.js +191 -0
- package/dist/cc-orchestrator/codex-session-history.d.ts +25 -0
- package/dist/cc-orchestrator/codex-session-history.js +187 -0
- package/dist/cc-orchestrator/external-agent-changes.d.ts +19 -0
- package/dist/cc-orchestrator/external-agent-changes.js +214 -0
- package/dist/cc-orchestrator/external-agent-driver.d.ts +18 -0
- package/dist/cc-orchestrator/external-agent-driver.js +69 -0
- package/dist/cc-orchestrator/index.d.ts +8 -0
- package/dist/cc-orchestrator/index.js +8 -0
- package/dist/cc-orchestrator/relevance-judge.d.ts +15 -0
- package/dist/cc-orchestrator/relevance-judge.js +29 -0
- package/dist/cc-orchestrator/session-discovery.d.ts +46 -0
- package/dist/cc-orchestrator/session-discovery.js +125 -0
- package/dist/cc-orchestrator/session-history.d.ts +19 -0
- package/dist/cc-orchestrator/session-history.js +67 -0
- package/dist/cli/agent-server-stdio.d.ts +26 -1
- package/dist/cli/agent-server-stdio.js +221 -28
- package/dist/cli/agent-server-tcp.d.ts +20 -0
- package/dist/cli/agent-server-tcp.js +134 -0
- package/dist/cli/graceful-shutdown.d.ts +27 -0
- package/dist/cli/graceful-shutdown.js +30 -0
- package/dist/context/compaction.d.ts +56 -0
- package/dist/context/compaction.js +209 -15
- package/dist/context/manager.d.ts +0 -20
- package/dist/context/manager.js +25 -41
- package/dist/cost-tracker.js +5 -61
- package/dist/credentials/cipher.d.ts +49 -0
- package/dist/credentials/cipher.js +45 -0
- package/dist/credentials/cookie-jar.d.ts +24 -0
- package/dist/credentials/cookie-jar.js +40 -0
- package/dist/credentials/index.d.ts +7 -0
- package/dist/credentials/index.js +5 -0
- package/dist/credentials/inject-credential-tool.d.ts +20 -0
- package/dist/credentials/inject-credential-tool.js +130 -0
- package/dist/credentials/store.d.ts +72 -0
- package/dist/credentials/store.js +184 -0
- package/dist/credentials/types.d.ts +56 -0
- package/dist/credentials/use-credential-tool.d.ts +29 -0
- package/dist/credentials/use-credential-tool.js +205 -0
- package/dist/credentials/use-gate.d.ts +56 -0
- package/dist/credentials/use-gate.js +52 -0
- package/dist/cron/cron-runtime.d.ts +2 -0
- package/dist/cron/cron-runtime.js +2 -0
- package/dist/cron/cron-store.d.ts +2 -0
- package/dist/cron/cron-store.js +2 -0
- package/dist/cron/scheduler.d.ts +5 -32
- package/dist/cron/scheduler.js +5 -113
- package/dist/data/model-metadata.d.ts +77 -0
- package/dist/data/model-metadata.js +56 -0
- package/dist/data/model-metadata.json +216 -0
- package/dist/data/openrouter-models.d.ts +18 -7
- package/dist/data/openrouter-models.js +35 -8
- package/dist/data/openrouter-sync.js +1 -1
- package/dist/engine/aux-key.d.ts +10 -0
- package/dist/engine/aux-key.js +11 -0
- package/dist/engine/dynamic-tool-defs.d.ts +19 -0
- package/dist/engine/dynamic-tool-defs.js +36 -0
- package/dist/engine/engine.d.ts +431 -108
- package/dist/engine/engine.js +1630 -279
- package/dist/engine/friendly-error.d.ts +18 -0
- package/dist/engine/friendly-error.js +63 -0
- package/dist/engine/goal.d.ts +187 -0
- package/dist/engine/goal.js +196 -0
- package/dist/engine/image-compression.d.ts +81 -0
- package/dist/engine/image-compression.js +186 -0
- package/dist/engine/image-policy.d.ts +165 -0
- package/dist/engine/image-policy.js +189 -0
- package/dist/engine/model-connections-pool.d.ts +17 -0
- package/dist/engine/model-connections-pool.js +66 -0
- package/dist/engine/model-facade.d.ts +10 -0
- package/dist/engine/model-facade.js +25 -0
- package/dist/engine/patch-orphaned-tools.js +3 -0
- package/dist/engine/reactive-threshold.d.ts +13 -0
- package/dist/engine/reactive-threshold.js +17 -0
- package/dist/engine/resolve-llm-config.d.ts +16 -0
- package/dist/engine/resolve-llm-config.js +44 -0
- package/dist/engine/runtime.js +9 -1
- package/dist/engine/sandbox-cache-key.d.ts +10 -0
- package/dist/engine/sandbox-cache-key.js +9 -0
- package/dist/engine/sandbox-config.d.ts +31 -0
- package/dist/engine/sandbox-config.js +38 -0
- package/dist/engine/session-title.d.ts +13 -0
- package/dist/engine/session-title.js +34 -0
- package/dist/engine/session-usage.d.ts +19 -0
- package/dist/engine/session-usage.js +25 -0
- package/dist/engine/steer-queue.d.ts +32 -0
- package/dist/engine/steer-queue.js +26 -0
- package/dist/engine/streaming-tool-queue.d.ts +12 -0
- package/dist/engine/streaming-tool-queue.js +50 -10
- package/dist/engine/turn-loop.d.ts +94 -9
- package/dist/engine/turn-loop.js +775 -342
- package/dist/engine/types.d.ts +175 -0
- package/dist/engine/types.js +13 -0
- package/dist/external-agents/config.d.ts +2 -0
- package/dist/external-agents/config.js +15 -0
- package/dist/external-agents/types.d.ts +31 -0
- package/dist/external-agents/types.js +1 -0
- package/dist/git/parse-log.d.ts +13 -0
- package/dist/git/parse-log.js +21 -0
- package/dist/git/utils.d.ts +8 -6
- package/dist/git/utils.js +62 -26
- package/dist/git/worktree.d.ts +48 -0
- package/dist/git/worktree.js +111 -20
- package/dist/hooks/events.d.ts +23 -1
- package/dist/hooks/goal-stop-hook.d.ts +58 -0
- package/dist/hooks/goal-stop-hook.js +279 -0
- package/dist/hooks/hook-output.d.ts +33 -0
- package/dist/hooks/hook-output.js +79 -0
- package/dist/hooks/registry.d.ts +15 -0
- package/dist/hooks/registry.js +57 -1
- package/dist/hooks/shell-runner.d.ts +2 -0
- package/dist/hooks/shell-runner.js +48 -18
- package/dist/index.d.ts +79 -11
- package/dist/index.js +89 -6
- package/dist/llm/capabilities/param-specs.d.ts +14 -0
- package/dist/llm/capabilities/param-specs.js +62 -0
- package/dist/llm/capabilities/reasoning-control.d.ts +24 -0
- package/dist/llm/capabilities/reasoning-control.js +38 -0
- package/dist/llm/capabilities/rules.js +37 -3
- package/dist/llm/capabilities/types.d.ts +32 -2
- package/dist/llm/clamp-max-tokens.d.ts +11 -0
- package/dist/llm/clamp-max-tokens.js +17 -0
- package/dist/llm/client-base.d.ts +69 -5
- package/dist/llm/client-base.js +185 -25
- package/dist/llm/client-factory.d.ts +3 -3
- package/dist/llm/client-factory.js +2 -2
- package/dist/llm/model-cache.js +4 -2
- package/dist/llm/model-pool.d.ts +29 -11
- package/dist/llm/model-pool.js +36 -20
- package/dist/llm/provider-auth.d.ts +41 -0
- package/dist/llm/provider-auth.js +76 -0
- package/dist/llm/provider-catalog.d.ts +6 -2
- package/dist/llm/providers/anthropic.d.ts +32 -2
- package/dist/llm/providers/anthropic.js +207 -18
- package/dist/llm/providers/openai.d.ts +47 -2
- package/dist/llm/providers/openai.js +478 -71
- package/dist/llm/reasoning-setting.d.ts +51 -0
- package/dist/llm/reasoning-setting.js +40 -0
- package/dist/llm/stop-reason.d.ts +13 -0
- package/dist/llm/stop-reason.js +21 -0
- package/dist/llm/stream-watchdog.js +5 -1
- package/dist/llm/strip-vision.d.ts +32 -0
- package/dist/llm/strip-vision.js +94 -0
- package/dist/llm/token-counter.js +9 -2
- package/dist/llm/types.d.ts +9 -6
- package/dist/logging/logger.js +18 -4
- package/dist/logging/sanitize-messages.d.ts +10 -0
- package/dist/logging/sanitize-messages.js +112 -0
- package/dist/lsp/client.js +28 -8
- package/dist/lsp/manager.d.ts +1 -1
- package/dist/lsp/manager.js +42 -11
- package/dist/lsp/root-path.d.ts +9 -0
- package/dist/lsp/root-path.js +12 -0
- package/dist/model-catalog/builtin.d.ts +12 -0
- package/dist/model-catalog/builtin.js +407 -0
- package/dist/model-catalog/gen-connections.d.ts +20 -0
- package/dist/model-catalog/gen-connections.js +28 -0
- package/dist/model-catalog/index.d.ts +41 -0
- package/dist/model-catalog/index.js +90 -0
- package/dist/model-catalog/params.d.ts +20 -0
- package/dist/model-catalog/params.js +45 -0
- package/dist/model-catalog/resolve.d.ts +48 -0
- package/dist/model-catalog/resolve.js +33 -0
- package/dist/model-catalog/save-entry.d.ts +32 -0
- package/dist/model-catalog/save-entry.js +104 -0
- package/dist/model-catalog/types.d.ts +561 -0
- package/dist/model-catalog/types.js +93 -0
- package/dist/model-catalog/upsert.d.ts +9 -0
- package/dist/model-catalog/upsert.js +8 -0
- package/dist/onboarding.d.ts +12 -82
- package/dist/onboarding.js +75 -333
- package/dist/plugins/gitOps.d.ts +53 -0
- package/dist/plugins/gitOps.js +130 -5
- package/dist/plugins/installer/checkUpdate.d.ts +16 -0
- package/dist/plugins/installer/checkUpdate.js +32 -0
- package/dist/plugins/installer/codex/convertAgents.d.ts +7 -0
- package/dist/plugins/installer/codex/convertAgents.js +55 -0
- package/dist/plugins/installer/codex/convertCommands.d.ts +19 -0
- package/dist/plugins/installer/codex/convertCommands.js +46 -0
- package/dist/plugins/installer/codex/convertMcp.d.ts +11 -0
- package/dist/plugins/installer/codex/convertMcp.js +85 -0
- package/dist/plugins/installer/codex/convertSkills.d.ts +12 -0
- package/dist/plugins/installer/codex/convertSkills.js +33 -0
- package/dist/plugins/installer/detectFormat.d.ts +2 -0
- package/dist/plugins/installer/detectFormat.js +6 -0
- package/dist/plugins/installer/install.d.ts +7 -0
- package/dist/plugins/installer/install.js +123 -0
- package/dist/plugins/installer/installFromArchive.d.ts +43 -0
- package/dist/plugins/installer/installFromArchive.js +134 -0
- package/dist/plugins/installer/installFromSource.d.ts +13 -0
- package/dist/plugins/installer/installFromSource.js +51 -0
- package/dist/plugins/installer/list.d.ts +9 -0
- package/dist/plugins/installer/list.js +30 -0
- package/dist/plugins/installer/loadPluginAgents.d.ts +3 -0
- package/dist/plugins/installer/loadPluginAgents.js +27 -0
- package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
- package/dist/plugins/installer/loadPluginMcp.js +107 -0
- package/dist/plugins/installer/parseSource.d.ts +20 -0
- package/dist/plugins/installer/parseSource.js +74 -0
- package/dist/plugins/installer/paths.d.ts +5 -0
- package/dist/plugins/installer/paths.js +25 -0
- package/dist/plugins/installer/pruneDisabled.d.ts +24 -0
- package/dist/plugins/installer/pruneDisabled.js +73 -0
- package/dist/plugins/installer/types.d.ts +52 -0
- package/dist/plugins/installer/types.js +28 -0
- package/dist/plugins/installer/uninstall.d.ts +2 -0
- package/dist/plugins/installer/uninstall.js +18 -0
- package/dist/plugins/installer/unzip.d.ts +14 -0
- package/dist/plugins/installer/unzip.js +82 -0
- package/dist/plugins/installer/update.d.ts +28 -0
- package/dist/plugins/installer/update.js +97 -0
- package/dist/plugins/loadPluginHooks.d.ts +54 -1
- package/dist/plugins/loadPluginHooks.js +83 -1
- package/dist/plugins/marketplaceManager.d.ts +15 -1
- package/dist/plugins/marketplaceManager.js +58 -4
- package/dist/plugins/pluginCommandHook.js +34 -14
- package/dist/plugins/pluginContent.d.ts +30 -0
- package/dist/plugins/pluginContent.js +83 -0
- package/dist/plugins/pluginInstaller.d.ts +34 -0
- package/dist/plugins/pluginInstaller.js +168 -35
- package/dist/plugins/schemas.js +41 -6
- package/dist/plugins/types.d.ts +10 -0
- package/dist/preset/index.d.ts +7 -1
- package/dist/preset/index.js +112 -6
- package/dist/product/types.d.ts +1 -1
- package/dist/prompt/composer.d.ts +31 -0
- package/dist/prompt/composer.js +95 -25
- package/dist/prompt/instruction-scanner.js +5 -3
- package/dist/prompt/section-loader.js +1 -0
- package/dist/prompt/sections/base.md +1 -0
- package/dist/prompt/sections/browser.md +10 -0
- package/dist/prompt/sections/coding.md +4 -0
- package/dist/prompt/sections/orchestration.md +8 -0
- package/dist/protocol/chat-session-manager.d.ts +15 -2
- package/dist/protocol/chat-session-manager.js +46 -0
- package/dist/protocol/chat-session.d.ts +82 -0
- package/dist/protocol/chat-session.js +121 -1
- package/dist/protocol/client.d.ts +27 -0
- package/dist/protocol/client.js +38 -0
- package/dist/protocol/redact.d.ts +50 -0
- package/dist/protocol/redact.js +71 -0
- package/dist/protocol/server.d.ts +153 -2
- package/dist/protocol/server.js +807 -39
- package/dist/protocol/tcp-transport.d.ts +45 -0
- package/dist/protocol/tcp-transport.js +74 -0
- package/dist/protocol/transport.js +3 -2
- package/dist/protocol/types.d.ts +69 -0
- package/dist/protocol/types.js +22 -0
- package/dist/quota/credentials.d.ts +3 -0
- package/dist/quota/credentials.js +80 -0
- package/dist/quota/index.d.ts +36 -0
- package/dist/quota/index.js +155 -0
- package/dist/quota/types.d.ts +48 -0
- package/dist/quota/types.js +13 -0
- package/dist/remote/bridge.d.ts +11 -2
- package/dist/remote/bridge.js +61 -33
- package/dist/review/review-prompt.d.ts +28 -0
- package/dist/review/review-prompt.js +81 -0
- package/dist/run/ArtifactTracker.js +5 -4
- package/dist/run/EngineRunner.d.ts +27 -1
- package/dist/run/EngineRunner.js +46 -8
- package/dist/run/FileRunStore.js +40 -11
- package/dist/run/RunApprovalBackend.js +25 -5
- package/dist/run/RunLock.d.ts +28 -2
- package/dist/run/RunLock.js +49 -7
- package/dist/run/RunManager.d.ts +12 -0
- package/dist/run/RunManager.js +86 -3
- package/dist/run/RunQueue.d.ts +1 -0
- package/dist/run/RunQueue.js +8 -2
- package/dist/run/factory.d.ts +8 -1
- package/dist/run/factory.js +1 -0
- package/dist/run/index.d.ts +2 -2
- package/dist/run/index.js +1 -1
- package/dist/run/redirect-target.d.ts +7 -0
- package/dist/run/redirect-target.js +13 -0
- package/dist/run/types.js +1 -1
- package/dist/runtime/background-shell.d.ts +139 -0
- package/dist/runtime/background-shell.js +495 -0
- package/dist/runtime/output-clean.d.ts +24 -0
- package/dist/runtime/output-clean.js +41 -0
- package/dist/runtime/ring-file.d.ts +64 -0
- package/dist/runtime/ring-file.js +174 -0
- package/dist/runtime/safe-spawn.js +15 -34
- package/dist/runtime/spawn-common.d.ts +148 -0
- package/dist/runtime/spawn-common.js +303 -0
- package/dist/runtime/truncate-output.d.ts +22 -0
- package/dist/runtime/truncate-output.js +49 -0
- package/dist/runtime/utf8-cut.d.ts +11 -0
- package/dist/runtime/utf8-cut.js +23 -0
- package/dist/services/auto-dream.d.ts +4 -0
- package/dist/services/auto-dream.js +26 -26
- package/dist/services/browser-open.d.ts +13 -0
- package/dist/services/browser-open.js +16 -0
- package/dist/services/diagnostics.d.ts +1 -2
- package/dist/services/diagnostics.js +12 -7
- package/dist/services/dream-consolidation.d.ts +57 -0
- package/dist/services/dream-consolidation.js +151 -0
- package/dist/services/extract-memories.d.ts +14 -1
- package/dist/services/extract-memories.js +45 -6
- package/dist/services/memory-orchestrator.d.ts +21 -0
- package/dist/services/memory-orchestrator.js +125 -32
- package/dist/services/notifier.d.ts +8 -0
- package/dist/services/notifier.js +39 -25
- package/dist/services/oauth.js +5 -7
- package/dist/services/session-memory-sort.d.ts +8 -0
- package/dist/services/session-memory-sort.js +9 -0
- package/dist/services/session-memory.js +30 -19
- package/dist/session/file-history.d.ts +124 -1
- package/dist/session/file-history.js +232 -9
- package/dist/session/memory.d.ts +116 -2
- package/dist/session/memory.js +250 -28
- package/dist/session/session-manager.d.ts +63 -1
- package/dist/session/session-manager.js +186 -5
- package/dist/session/simple-diff.d.ts +23 -0
- package/dist/session/simple-diff.js +84 -0
- package/dist/session/transcript.d.ts +25 -1
- package/dist/session/transcript.js +35 -2
- package/dist/session/undo-target.d.ts +67 -0
- package/dist/session/undo-target.js +144 -0
- package/dist/settings/disk-defaults.d.ts +42 -0
- package/dist/settings/disk-defaults.js +33 -0
- package/dist/settings/feature-flags.d.ts +64 -0
- package/dist/settings/feature-flags.js +61 -0
- package/dist/settings/manager.d.ts +101 -1
- package/dist/settings/manager.js +345 -15
- package/dist/settings/migrate-config.d.ts +45 -0
- package/dist/settings/migrate-config.js +125 -0
- package/dist/settings/personalization.d.ts +19 -0
- package/dist/settings/personalization.js +7 -0
- package/dist/settings/schema-export.d.ts +25 -0
- package/dist/settings/schema-export.js +38 -0
- package/dist/settings/schema.d.ts +1827 -396
- package/dist/settings/schema.js +361 -81
- package/dist/skills/scanner.d.ts +9 -0
- package/dist/skills/scanner.js +30 -2
- package/dist/stt/resolve-transcribe.d.ts +31 -0
- package/dist/stt/resolve-transcribe.js +108 -0
- package/dist/stt/transcribe.d.ts +51 -0
- package/dist/stt/transcribe.js +65 -0
- package/dist/tool-system/browser-bridge.d.ts +226 -0
- package/dist/tool-system/browser-bridge.js +163 -0
- package/dist/tool-system/builtin/add-marketplace.d.ts +12 -0
- package/dist/tool-system/builtin/add-marketplace.js +76 -0
- package/dist/tool-system/builtin/agent-heartbeat.d.ts +49 -0
- package/dist/tool-system/builtin/agent-heartbeat.js +89 -0
- package/dist/tool-system/builtin/agent-notifications.d.ts +12 -3
- package/dist/tool-system/builtin/agent-notifications.js +9 -3
- package/dist/tool-system/builtin/agent-output-file.d.ts +38 -0
- package/dist/tool-system/builtin/agent-output-file.js +72 -0
- package/dist/tool-system/builtin/agent-registry.d.ts +23 -0
- package/dist/tool-system/builtin/agent-registry.js +16 -4
- package/dist/tool-system/builtin/agent.d.ts +50 -11
- package/dist/tool-system/builtin/agent.js +576 -73
- package/dist/tool-system/builtin/apply-patch/applier.js +66 -8
- package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +10 -0
- package/dist/tool-system/builtin/apply-patch/backup-targets.js +30 -0
- package/dist/tool-system/builtin/apply-patch/index.js +7 -3
- package/dist/tool-system/builtin/arena.js +6 -7
- package/dist/tool-system/builtin/background-jobs.d.ts +76 -0
- package/dist/tool-system/builtin/background-jobs.js +124 -0
- package/dist/tool-system/builtin/background-shell-tools.d.ts +20 -0
- package/dist/tool-system/builtin/background-shell-tools.js +108 -0
- package/dist/tool-system/builtin/background-work.d.ts +67 -0
- package/dist/tool-system/builtin/background-work.js +86 -0
- package/dist/tool-system/builtin/bash-output-style.d.ts +32 -0
- package/dist/tool-system/builtin/bash-output-style.js +40 -0
- package/dist/tool-system/builtin/bash.d.ts +5 -2
- package/dist/tool-system/builtin/bash.js +98 -62
- package/dist/tool-system/builtin/browser-tools.d.ts +33 -0
- package/dist/tool-system/builtin/browser-tools.js +312 -0
- package/dist/tool-system/builtin/cancel-goal.d.ts +31 -0
- package/dist/tool-system/builtin/cancel-goal.js +64 -0
- package/dist/tool-system/builtin/check-quota.d.ts +15 -0
- package/dist/tool-system/builtin/check-quota.js +34 -0
- package/dist/tool-system/builtin/complete-goal.d.ts +25 -0
- package/dist/tool-system/builtin/complete-goal.js +45 -0
- package/dist/tool-system/builtin/config.js +7 -0
- package/dist/tool-system/builtin/cron.d.ts +7 -0
- package/dist/tool-system/builtin/cron.js +105 -9
- package/dist/tool-system/builtin/drive-claude-code.d.ts +30 -0
- package/dist/tool-system/builtin/drive-claude-code.js +157 -0
- package/dist/tool-system/builtin/edit-model-catalog.d.ts +3 -0
- package/dist/tool-system/builtin/edit-model-catalog.js +94 -0
- package/dist/tool-system/builtin/edit.d.ts +2 -1
- package/dist/tool-system/builtin/edit.js +21 -12
- package/dist/tool-system/builtin/eol.d.ts +29 -0
- package/dist/tool-system/builtin/eol.js +37 -0
- package/dist/tool-system/builtin/file-cache.d.ts +6 -0
- package/dist/tool-system/builtin/file-cache.js +8 -0
- package/dist/tool-system/builtin/generate-image.d.ts +60 -0
- package/dist/tool-system/builtin/generate-image.js +374 -0
- package/dist/tool-system/builtin/generate-video.d.ts +55 -0
- package/dist/tool-system/builtin/generate-video.js +361 -0
- package/dist/tool-system/builtin/grep.js +6 -2
- package/dist/tool-system/builtin/image-providers.d.ts +86 -0
- package/dist/tool-system/builtin/image-providers.js +190 -0
- package/dist/tool-system/builtin/image-uploader.d.ts +33 -0
- package/dist/tool-system/builtin/image-uploader.js +74 -0
- package/dist/tool-system/builtin/index.d.ts +24 -1
- package/dist/tool-system/builtin/index.js +310 -25
- package/dist/tool-system/builtin/mcp-tools.js +23 -3
- package/dist/tool-system/builtin/memory.js +45 -7
- package/dist/tool-system/builtin/notebook-edit.d.ts +2 -1
- package/dist/tool-system/builtin/notebook-edit.js +1 -1
- package/dist/tool-system/builtin/powershell.js +4 -1
- package/dist/tool-system/builtin/read.d.ts +2 -1
- package/dist/tool-system/builtin/read.js +11 -3
- package/dist/tool-system/builtin/repl.js +4 -1
- package/dist/tool-system/builtin/skill.js +9 -0
- package/dist/tool-system/builtin/sleep.js +12 -5
- package/dist/tool-system/builtin/task.js +4 -1
- package/dist/tool-system/builtin/tool-search.js +25 -7
- package/dist/tool-system/builtin/update-automation-memory.d.ts +24 -0
- package/dist/tool-system/builtin/update-automation-memory.js +60 -0
- package/dist/tool-system/builtin/video-providers.d.ts +154 -0
- package/dist/tool-system/builtin/video-providers.js +235 -0
- package/dist/tool-system/builtin/view-image.d.ts +18 -0
- package/dist/tool-system/builtin/view-image.js +96 -0
- package/dist/tool-system/builtin/web-fetch.js +12 -2
- package/dist/tool-system/builtin/web-search.d.ts +4 -1
- package/dist/tool-system/builtin/web-search.js +57 -10
- package/dist/tool-system/builtin/worktree.d.ts +2 -1
- package/dist/tool-system/builtin/worktree.js +31 -4
- package/dist/tool-system/builtin/write.d.ts +2 -1
- package/dist/tool-system/builtin/write.js +1 -1
- package/dist/tool-system/context.d.ts +166 -6
- package/dist/tool-system/executor.d.ts +3 -2
- package/dist/tool-system/executor.js +197 -119
- package/dist/tool-system/investigation-guard.d.ts +4 -1
- package/dist/tool-system/investigation-guard.js +20 -4
- package/dist/tool-system/mcp-manager.d.ts +78 -16
- package/dist/tool-system/mcp-manager.js +357 -28
- package/dist/tool-system/path-policy.d.ts +99 -0
- package/dist/tool-system/path-policy.js +578 -0
- package/dist/tool-system/permission.d.ts +36 -1
- package/dist/tool-system/permission.js +322 -117
- package/dist/tool-system/plan-mode-allowlist.d.ts +32 -0
- package/dist/tool-system/plan-mode-allowlist.js +65 -0
- package/dist/tool-system/registry.d.ts +1 -0
- package/dist/tool-system/registry.js +26 -1
- package/dist/tool-system/sandbox/index.d.ts +8 -0
- package/dist/tool-system/sandbox/index.js +7 -2
- package/dist/tool-system/validate-tool-metadata.d.ts +36 -0
- package/dist/tool-system/validate-tool-metadata.js +63 -0
- package/dist/tool-system/validation.d.ts +10 -0
- package/dist/tool-system/validation.js +16 -3
- package/dist/types.d.ts +301 -15
- package/dist/updater.js +20 -9
- package/dist/utils/envUtils.d.ts +0 -9
- package/dist/utils/envUtils.js +3 -28
- package/dist/utils/exec.d.ts +40 -0
- package/dist/utils/exec.js +144 -0
- package/dist/utils/format.js +4 -2
- package/dist/utils/json.d.ts +12 -0
- package/dist/utils/json.js +92 -0
- package/dist/utils/lockfile.js +9 -2
- package/dist/utils/theme.d.ts +7 -1
- package/dist/utils/theme.js +5 -3
- package/dist/utils/toolDisplay.js +0 -1
- package/package.json +14 -7
- package/dist/agent/coordinator.d.ts +0 -49
- package/dist/agent/coordinator.js +0 -77
- package/dist/settings/manager.test.js +0 -73
- package/dist/tool-system/builtin/remote-trigger.d.ts +0 -6
- package/dist/tool-system/builtin/remote-trigger.js +0 -54
- package/dist/tool-system/builtin/send-message.d.ts +0 -6
- package/dist/tool-system/builtin/send-message.js +0 -47
- /package/dist/{settings/manager.test.d.ts → credentials/types.js} +0 -0
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isAbortError } from "../llm/client-base.js";
|
|
1
2
|
/**
|
|
2
3
|
* One ChatSession per UI chat tab. Owns a single Engine, an AbortController
|
|
3
4
|
* for the active turn, and a FIFO queue so a fast second send waits for the
|
|
@@ -19,6 +20,30 @@ export class ChatSession {
|
|
|
19
20
|
active = null;
|
|
20
21
|
controller = null;
|
|
21
22
|
defaultOnStream;
|
|
23
|
+
/**
|
|
24
|
+
* Model-pool key requested via requestModelSwitch while a turn was in
|
|
25
|
+
* flight. Applied at the next run boundary (before the next turn starts) so
|
|
26
|
+
* we never swap the model out from under a running LLM client — the bug the
|
|
27
|
+
* session-isolation research flagged. null = nothing pending.
|
|
28
|
+
*/
|
|
29
|
+
pendingModel = null;
|
|
30
|
+
/**
|
|
31
|
+
* Set by cancel() so the in-flight turn's abort error resolves as a clean
|
|
32
|
+
* "cancelled" result instead of rejecting (which the RPC layer would surface
|
|
33
|
+
* as a scary red Error in the UI for what was a user-initiated Stop). The
|
|
34
|
+
* onboarding flow cancels + immediately re-runs the same task; without this
|
|
35
|
+
* the cancelled first run popped "Error: Request cancelled".
|
|
36
|
+
*/
|
|
37
|
+
cancelledActive = false;
|
|
38
|
+
/**
|
|
39
|
+
* Sticky flag: the user cancelled (Stop) and has not started a new turn
|
|
40
|
+
* since. cancel() leaves the session idle (active=null), so isBusy() can't
|
|
41
|
+
* distinguish "naturally idle" from "user just stopped me". A background-job
|
|
42
|
+
* completion that lands in this window must NOT auto-resume the session —
|
|
43
|
+
* that would defeat the Stop. Cleared the moment a real turn is enqueued
|
|
44
|
+
* (the user is engaging again) so normal wakeups resume working afterward.
|
|
45
|
+
*/
|
|
46
|
+
cancelledSinceLastTurn = false;
|
|
22
47
|
constructor(opts) {
|
|
23
48
|
this.id = opts.id;
|
|
24
49
|
this.engine = opts.engine;
|
|
@@ -26,11 +51,24 @@ export class ChatSession {
|
|
|
26
51
|
}
|
|
27
52
|
enqueueTurn(task, opts) {
|
|
28
53
|
this.lastActivityAt = Date.now();
|
|
54
|
+
// The user (or a wakeup the guard already let through) is starting a turn —
|
|
55
|
+
// clear the post-Stop suppression so future background-job completions
|
|
56
|
+
// wake the session again.
|
|
57
|
+
this.cancelledSinceLastTurn = false;
|
|
29
58
|
return new Promise((resolve, reject) => {
|
|
30
59
|
this.queue.push({ task, opts, resolve, reject });
|
|
31
60
|
this.pump();
|
|
32
61
|
});
|
|
33
62
|
}
|
|
63
|
+
/**
|
|
64
|
+
* True when the user hit Stop and hasn't started a new turn since. The server
|
|
65
|
+
* consults this before auto-waking an idle session on a background-job
|
|
66
|
+
* completion, so a download finishing right after Stop doesn't restart the
|
|
67
|
+
* agent the user just halted.
|
|
68
|
+
*/
|
|
69
|
+
wasCancelledSinceLastTurn() {
|
|
70
|
+
return this.cancelledSinceLastTurn;
|
|
71
|
+
}
|
|
34
72
|
/**
|
|
35
73
|
* Abort the in-flight turn and drain queued turns.
|
|
36
74
|
*
|
|
@@ -40,6 +78,12 @@ export class ChatSession {
|
|
|
40
78
|
* are always rejected regardless.
|
|
41
79
|
*/
|
|
42
80
|
cancel() {
|
|
81
|
+
// Mark the in-flight turn as user-cancelled so pump()'s catch resolves it
|
|
82
|
+
// as a clean aborted result rather than rejecting (→ UI Error).
|
|
83
|
+
if (this.active)
|
|
84
|
+
this.cancelledActive = true;
|
|
85
|
+
// Suppress auto-wakeup until the user engages again (see the field doc).
|
|
86
|
+
this.cancelledSinceLastTurn = true;
|
|
43
87
|
this.controller?.abort();
|
|
44
88
|
// Drain queued turns as cancelled
|
|
45
89
|
const drained = this.queue.splice(0);
|
|
@@ -50,6 +94,55 @@ export class ChatSession {
|
|
|
50
94
|
isBusy() {
|
|
51
95
|
return this.active !== null;
|
|
52
96
|
}
|
|
97
|
+
/**
|
|
98
|
+
* Extend the in-flight goal run's turn/budget ceilings (TODO 3.1). Delegates
|
|
99
|
+
* to the engine, which forwards to the active TurnLoop. Returns null when no
|
|
100
|
+
* run is active (or the run has no extendable loop). Mirrors the cancel()
|
|
101
|
+
* mid-run control path.
|
|
102
|
+
*/
|
|
103
|
+
extendGoalRun(opts) {
|
|
104
|
+
return this.engine.extendGoalRun(opts);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Read this session's persisted active goal (state.activeGoal), or undefined
|
|
108
|
+
* when none. Cheap — reads only state.json. The host calls this on session
|
|
109
|
+
* load to re-surface the goal block + Cancel button after a reload.
|
|
110
|
+
*/
|
|
111
|
+
getGoal() {
|
|
112
|
+
return this.engine.getGoal(this.id);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Clear this session's persisted active goal (CC /goal clear). Works idle or
|
|
116
|
+
* mid-run. Returns true if a goal was actually cleared.
|
|
117
|
+
*/
|
|
118
|
+
clearGoal() {
|
|
119
|
+
return this.engine.clearGoal(this.id);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Switch this session's active model (per-session, not worker-global).
|
|
123
|
+
* Applies immediately when idle; defers to the next run boundary when a
|
|
124
|
+
* turn is in flight so a hot switch never mutates the model under a
|
|
125
|
+
* running LLM client.
|
|
126
|
+
*/
|
|
127
|
+
requestModelSwitch(key) {
|
|
128
|
+
if (this.isBusy()) {
|
|
129
|
+
this.pendingModel = key;
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
this.applyModelSwitch(key);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Perform the actual model switch for this session: rotate the engine's model
|
|
136
|
+
* and reset the session's cumulative usage on disk — a different model has a
|
|
137
|
+
* different prompt cache, so the old cache-hit stats no longer apply. The
|
|
138
|
+
* renderer zeroes its own cumulative display when it issues the switch (it's
|
|
139
|
+
* renderer-initiated), so no stream event is needed here. Shared by the idle
|
|
140
|
+
* path and the deferred run-boundary path.
|
|
141
|
+
*/
|
|
142
|
+
applyModelSwitch(key) {
|
|
143
|
+
this.engine.switchModel(key);
|
|
144
|
+
this.engine.resetSessionUsage(this.id);
|
|
145
|
+
}
|
|
53
146
|
queueDepth() {
|
|
54
147
|
return this.queue.length;
|
|
55
148
|
}
|
|
@@ -60,6 +153,7 @@ export class ChatSession {
|
|
|
60
153
|
if (!next)
|
|
61
154
|
return;
|
|
62
155
|
this.active = next;
|
|
156
|
+
this.cancelledActive = false;
|
|
63
157
|
this.controller = new AbortController();
|
|
64
158
|
try {
|
|
65
159
|
const onStream = next.opts.onStream ?? this.defaultOnStream;
|
|
@@ -68,16 +162,42 @@ export class ChatSession {
|
|
|
68
162
|
sessionId: this.id,
|
|
69
163
|
signal: this.controller.signal,
|
|
70
164
|
onStream,
|
|
165
|
+
goal: next.opts.goal,
|
|
166
|
+
injected: next.opts.injected,
|
|
71
167
|
});
|
|
72
168
|
this.lastActivityAt = Date.now();
|
|
73
169
|
next.resolve(result);
|
|
74
170
|
}
|
|
75
171
|
catch (err) {
|
|
76
|
-
|
|
172
|
+
// A user-initiated cancel (Stop, or the onboarding cancel+rerun flow)
|
|
173
|
+
// aborts the in-flight run. That's not a failure — resolve it as a clean
|
|
174
|
+
// aborted result so the RPC layer doesn't surface "Error: Request
|
|
175
|
+
// cancelled" in the UI. Only abort errors on a cancelled turn are
|
|
176
|
+
// swallowed this way; a genuine error still rejects.
|
|
177
|
+
if (this.cancelledActive && (isAbortError(err) || this.controller?.signal.aborted)) {
|
|
178
|
+
next.resolve({
|
|
179
|
+
text: "",
|
|
180
|
+
reason: "aborted_streaming",
|
|
181
|
+
sessionId: this.id,
|
|
182
|
+
turnCount: 0,
|
|
183
|
+
usage: { promptTokens: 0, completionTokens: 0, totalTokens: 0 },
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
next.reject(err);
|
|
188
|
+
}
|
|
77
189
|
}
|
|
78
190
|
finally {
|
|
79
191
|
this.active = null;
|
|
80
192
|
this.controller = null;
|
|
193
|
+
this.cancelledActive = false;
|
|
194
|
+
// Run boundary: apply any model switch that was deferred because it was
|
|
195
|
+
// requested mid-run. Done here (not in pump) so it still applies when
|
|
196
|
+
// no further turn is queued.
|
|
197
|
+
if (this.pendingModel !== null) {
|
|
198
|
+
this.applyModelSwitch(this.pendingModel);
|
|
199
|
+
this.pendingModel = null;
|
|
200
|
+
}
|
|
81
201
|
// Drain the next turn if one is waiting.
|
|
82
202
|
if (this.queue.length > 0)
|
|
83
203
|
void this.pump();
|
|
@@ -64,6 +64,33 @@ export declare class AgentClient {
|
|
|
64
64
|
* Legacy form: cancel(reason?)
|
|
65
65
|
*/
|
|
66
66
|
cancel(sessionId?: string, reason?: string): Promise<void>;
|
|
67
|
+
/**
|
|
68
|
+
* Clear a session's persisted active goal (CC `/goal clear`). Returns whether
|
|
69
|
+
* a goal was actually cleared (false = there was none).
|
|
70
|
+
*/
|
|
71
|
+
goalClear(sessionId?: string): Promise<boolean>;
|
|
72
|
+
/**
|
|
73
|
+
* Read a session's persisted active goal objective, or null when there's
|
|
74
|
+
* none. The host calls this on session load to re-surface the goal block +
|
|
75
|
+
* Cancel button after a reload (a persistent goal isn't replayed from the
|
|
76
|
+
* transcript, so the live stream never re-announces it).
|
|
77
|
+
*/
|
|
78
|
+
goalGet(sessionId: string): Promise<string | null>;
|
|
79
|
+
/**
|
|
80
|
+
* Steer an in-flight run: queue a user message spliced in at the next
|
|
81
|
+
* turn-loop step (不打断 — does not abort the current step). `id` is a stable
|
|
82
|
+
* host-side handle that rides through to the steer_injected event and lets
|
|
83
|
+
* unsteer() revoke a still-pending entry. Mirrors the server's handleSteer +
|
|
84
|
+
* the desktop preload's steer(); without it the SDK can't reach the method
|
|
85
|
+
* (request() is private) — the protocol was asymmetric after the steer merge.
|
|
86
|
+
*/
|
|
87
|
+
steer(sessionId: string, text: string, id?: string): Promise<void>;
|
|
88
|
+
/**
|
|
89
|
+
* Revoke a still-pending steer entry by id (before the loop consumes it).
|
|
90
|
+
* Returns false when the loop already consumed it (not an error — it will
|
|
91
|
+
* arrive as a normal user bubble).
|
|
92
|
+
*/
|
|
93
|
+
unsteer(sessionId: string, id: string): Promise<boolean>;
|
|
67
94
|
/**
|
|
68
95
|
* Update runtime configuration on the server.
|
|
69
96
|
*/
|
package/dist/protocol/client.js
CHANGED
|
@@ -99,6 +99,44 @@ export class AgentClient {
|
|
|
99
99
|
async cancel(sessionId, reason) {
|
|
100
100
|
await this.request(Methods.Cancel, { sessionId, reason });
|
|
101
101
|
}
|
|
102
|
+
/**
|
|
103
|
+
* Clear a session's persisted active goal (CC `/goal clear`). Returns whether
|
|
104
|
+
* a goal was actually cleared (false = there was none).
|
|
105
|
+
*/
|
|
106
|
+
async goalClear(sessionId) {
|
|
107
|
+
const res = (await this.request(Methods.GoalClear, { sessionId }));
|
|
108
|
+
return res?.cleared === true;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Read a session's persisted active goal objective, or null when there's
|
|
112
|
+
* none. The host calls this on session load to re-surface the goal block +
|
|
113
|
+
* Cancel button after a reload (a persistent goal isn't replayed from the
|
|
114
|
+
* transcript, so the live stream never re-announces it).
|
|
115
|
+
*/
|
|
116
|
+
async goalGet(sessionId) {
|
|
117
|
+
const res = (await this.request(Methods.GoalGet, { sessionId }));
|
|
118
|
+
return res?.goal ?? null;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Steer an in-flight run: queue a user message spliced in at the next
|
|
122
|
+
* turn-loop step (不打断 — does not abort the current step). `id` is a stable
|
|
123
|
+
* host-side handle that rides through to the steer_injected event and lets
|
|
124
|
+
* unsteer() revoke a still-pending entry. Mirrors the server's handleSteer +
|
|
125
|
+
* the desktop preload's steer(); without it the SDK can't reach the method
|
|
126
|
+
* (request() is private) — the protocol was asymmetric after the steer merge.
|
|
127
|
+
*/
|
|
128
|
+
async steer(sessionId, text, id) {
|
|
129
|
+
await this.request(Methods.Steer, { sessionId, text, id });
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Revoke a still-pending steer entry by id (before the loop consumes it).
|
|
133
|
+
* Returns false when the loop already consumed it (not an error — it will
|
|
134
|
+
* arrive as a normal user bubble).
|
|
135
|
+
*/
|
|
136
|
+
async unsteer(sessionId, id) {
|
|
137
|
+
const res = (await this.request(Methods.Unsteer, { sessionId, id }));
|
|
138
|
+
return res?.removed === true;
|
|
139
|
+
}
|
|
102
140
|
/**
|
|
103
141
|
* Update runtime configuration on the server.
|
|
104
142
|
*/
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/** Produce a short preview (`sk-…abcd`) so UIs can render presence without revealing the secret. */
|
|
2
|
+
export declare function makeApiKeyPreview(apiKey: string | undefined | null): string | undefined;
|
|
3
|
+
/**
|
|
4
|
+
* Return true when a dotted setting key path points at a secret field.
|
|
5
|
+
* Used to decide whether `config_get`'s response should redact the value.
|
|
6
|
+
*/
|
|
7
|
+
export declare function isSecretKeyPath(key: string): boolean;
|
|
8
|
+
/**
|
|
9
|
+
* Redact a single value returned by config_get.
|
|
10
|
+
*
|
|
11
|
+
* Two-stage rule:
|
|
12
|
+
* 1. If the caller-supplied key path itself looks secret
|
|
13
|
+
* ("llm.apiKey", "headers.authorization", …) → collapse to "[redacted]".
|
|
14
|
+
* 2. Otherwise, if the value is an object/array (e.g. config_get("llm") or
|
|
15
|
+
* config_get("providers")), walk it with the shared secret redactor
|
|
16
|
+
* from logging/sanitize-messages so nested apiKey / token / Bearer
|
|
17
|
+
* fields don't slip through verbatim. Primitives pass unchanged.
|
|
18
|
+
*
|
|
19
|
+
* Pre-fix this only inspected the top-level key string, so
|
|
20
|
+
* config_get("providers") returned an array of provider objects with raw
|
|
21
|
+
* apiKey values intact. That defeated the purpose of the boundary.
|
|
22
|
+
*/
|
|
23
|
+
export declare function maskSecretValue<T>(key: string, value: T): T | "[redacted]";
|
|
24
|
+
/**
|
|
25
|
+
* Shape of the LLM block returned to clients. We deliberately omit `apiKey`
|
|
26
|
+
* and surface presence/preview instead. Callers that need the raw key already
|
|
27
|
+
* have it server-side; clients should never see it.
|
|
28
|
+
*/
|
|
29
|
+
export interface RedactedLlmConfig {
|
|
30
|
+
provider?: string;
|
|
31
|
+
model?: string;
|
|
32
|
+
baseUrl?: string;
|
|
33
|
+
maxTokens?: number;
|
|
34
|
+
/** True when an apiKey is configured. */
|
|
35
|
+
hasApiKey: boolean;
|
|
36
|
+
/** Short preview when an apiKey is configured; omitted otherwise. */
|
|
37
|
+
apiKeyPreview?: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Rewrite the LLM section of a config snapshot for transport. We only forward
|
|
41
|
+
* fields the client legitimately needs to render status; secrets become
|
|
42
|
+
* derived flags.
|
|
43
|
+
*/
|
|
44
|
+
export declare function redactLlmConfig(llm: {
|
|
45
|
+
provider?: string;
|
|
46
|
+
model?: string;
|
|
47
|
+
apiKey?: string;
|
|
48
|
+
baseUrl?: string;
|
|
49
|
+
maxTokens?: number;
|
|
50
|
+
}): RedactedLlmConfig;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { redactSecrets } from "../logging/sanitize-messages.js";
|
|
2
|
+
/**
|
|
3
|
+
* Redaction helpers for protocol query responses.
|
|
4
|
+
*
|
|
5
|
+
* The protocol exposes config snapshots to any connected client. Raw API keys,
|
|
6
|
+
* provider credentials, and authorization headers must never leave this
|
|
7
|
+
* boundary verbatim — the client can use derived fields (`hasApiKey`,
|
|
8
|
+
* `apiKeyPreview`) to render provider/model status without holding the secret.
|
|
9
|
+
*
|
|
10
|
+
* Two entry points:
|
|
11
|
+
* - redactConfigForResponse: rewrites the LLM section of the config-query
|
|
12
|
+
* payload, removing `apiKey` and adding derived presence/preview fields.
|
|
13
|
+
* - maskSecretValue: scrubs a single (key, value) pair returned by
|
|
14
|
+
* config_get, where the client picks the key — including `llm.apiKey`.
|
|
15
|
+
*/
|
|
16
|
+
/** Match dotted/camel/snake variants of obviously secret keys. */
|
|
17
|
+
const SECRET_KEY_RE = /(^|[._-])(api[_-]?key|authorization|x[_-]api[_-]key|bearer[_-]?token|access[_-]?token|refresh[_-]?token|secret|password|client[_-]?secret)($|[._-])/i;
|
|
18
|
+
/** Produce a short preview (`sk-…abcd`) so UIs can render presence without revealing the secret. */
|
|
19
|
+
export function makeApiKeyPreview(apiKey) {
|
|
20
|
+
if (typeof apiKey !== "string" || apiKey.length === 0)
|
|
21
|
+
return undefined;
|
|
22
|
+
if (apiKey.length <= 8)
|
|
23
|
+
return "…";
|
|
24
|
+
return `${apiKey.slice(0, 3)}…${apiKey.slice(-4)}`;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Return true when a dotted setting key path points at a secret field.
|
|
28
|
+
* Used to decide whether `config_get`'s response should redact the value.
|
|
29
|
+
*/
|
|
30
|
+
export function isSecretKeyPath(key) {
|
|
31
|
+
return SECRET_KEY_RE.test(key);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Redact a single value returned by config_get.
|
|
35
|
+
*
|
|
36
|
+
* Two-stage rule:
|
|
37
|
+
* 1. If the caller-supplied key path itself looks secret
|
|
38
|
+
* ("llm.apiKey", "headers.authorization", …) → collapse to "[redacted]".
|
|
39
|
+
* 2. Otherwise, if the value is an object/array (e.g. config_get("llm") or
|
|
40
|
+
* config_get("providers")), walk it with the shared secret redactor
|
|
41
|
+
* from logging/sanitize-messages so nested apiKey / token / Bearer
|
|
42
|
+
* fields don't slip through verbatim. Primitives pass unchanged.
|
|
43
|
+
*
|
|
44
|
+
* Pre-fix this only inspected the top-level key string, so
|
|
45
|
+
* config_get("providers") returned an array of provider objects with raw
|
|
46
|
+
* apiKey values intact. That defeated the purpose of the boundary.
|
|
47
|
+
*/
|
|
48
|
+
export function maskSecretValue(key, value) {
|
|
49
|
+
if (isSecretKeyPath(key))
|
|
50
|
+
return "[redacted]";
|
|
51
|
+
if (value && typeof value === "object") {
|
|
52
|
+
return redactSecrets(value);
|
|
53
|
+
}
|
|
54
|
+
return value;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Rewrite the LLM section of a config snapshot for transport. We only forward
|
|
58
|
+
* fields the client legitimately needs to render status; secrets become
|
|
59
|
+
* derived flags.
|
|
60
|
+
*/
|
|
61
|
+
export function redactLlmConfig(llm) {
|
|
62
|
+
const preview = makeApiKeyPreview(llm.apiKey);
|
|
63
|
+
return {
|
|
64
|
+
provider: llm.provider,
|
|
65
|
+
model: llm.model,
|
|
66
|
+
baseUrl: llm.baseUrl,
|
|
67
|
+
maxTokens: llm.maxTokens,
|
|
68
|
+
hasApiKey: typeof llm.apiKey === "string" && llm.apiKey.length > 0,
|
|
69
|
+
...(preview ? { apiKeyPreview: preview } : {}),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import type { Transport } from "./transport.js";
|
|
17
17
|
import type { Engine } from "../engine/engine.js";
|
|
18
|
+
import type { ValidatedSettings } from "../settings/schema.js";
|
|
18
19
|
import type { ChatSessionManager } from "./chat-session-manager.js";
|
|
19
20
|
export interface AgentServerOptions {
|
|
20
21
|
/**
|
|
@@ -29,11 +30,52 @@ export interface AgentServerOptions {
|
|
|
29
30
|
*/
|
|
30
31
|
engine?: Engine;
|
|
31
32
|
transport: Transport;
|
|
33
|
+
/**
|
|
34
|
+
* Reads fresh settings from disk for config hot-reload (layer 2). MUST be
|
|
35
|
+
* the SAME closure the engineFactory uses for new sessions (e.g.
|
|
36
|
+
* agent-server-stdio's `freshSettings`) so a reloaded running session and a
|
|
37
|
+
* newly-created session converge on identical disk config — no divergence.
|
|
38
|
+
* When absent, `configure({ reloadSettings })` returns an explicit error.
|
|
39
|
+
*/
|
|
40
|
+
settingsReader?: () => ValidatedSettings;
|
|
41
|
+
/**
|
|
42
|
+
* Disk-only active-goal reader, used by agent/goalGet when the session is NOT
|
|
43
|
+
* live in chatManager. In worker (chatManager) mode there is no legacyEngine
|
|
44
|
+
* to fall back to, and a reopened-after-restart session isn't a live
|
|
45
|
+
* ChatSession yet (one is only created on agent/run), so chatManager.get()
|
|
46
|
+
* misses — without this the handler returned goal:null even though state.json
|
|
47
|
+
* still held the goal, and the UI's goal block never re-surfaced ("goal 还在
|
|
48
|
+
* 但页面不显示"). Wire it to SessionManager.readActiveGoal. Optional: legacy
|
|
49
|
+
* mode already reads disk via the engine, and tests that don't exercise the
|
|
50
|
+
* reopened-session path can omit it.
|
|
51
|
+
*/
|
|
52
|
+
readActiveGoalFromDisk?: (sessionId: string) => import("../engine/goal.js").GoalConfig | undefined;
|
|
32
53
|
}
|
|
33
54
|
export declare class AgentServer {
|
|
34
55
|
private readonly chatManager;
|
|
35
56
|
private readonly legacyEngine;
|
|
57
|
+
private globalQueryEngine;
|
|
36
58
|
private transport;
|
|
59
|
+
/** Fresh-disk settings reader for config hot-reload; null when not wired. */
|
|
60
|
+
private readonly settingsReader;
|
|
61
|
+
/** Disk-only active-goal reader for agent/goalGet on a non-live session. */
|
|
62
|
+
private readonly readActiveGoalFromDisk;
|
|
63
|
+
/**
|
|
64
|
+
* Monotonic config-reload version, bumped per reloadSettings request so each
|
|
65
|
+
* Engine.refreshRuntimeConfig can drop out-of-order (stale) deliveries (Q5).
|
|
66
|
+
*/
|
|
67
|
+
private configVersion;
|
|
68
|
+
/**
|
|
69
|
+
* JSON of the last disk-default patch broadcast to ALL live sessions (#6).
|
|
70
|
+
* When a new reloadSettings request produces a byte-identical patch we SKIP
|
|
71
|
+
* the entire forEachSession broadcast — every session's refreshRuntimeConfig
|
|
72
|
+
* would otherwise unconditionally reloadHooks() (invalidate + full disk
|
|
73
|
+
* re-read + hook teardown/re-register) per call, and the personalization UI
|
|
74
|
+
* auto-saves on a 600ms debounce, so identical re-saves caused K× hook churn
|
|
75
|
+
* per keystroke-pause. A genuine change still differs in JSON → propagates.
|
|
76
|
+
* null until the first broadcast.
|
|
77
|
+
*/
|
|
78
|
+
private lastBroadcastPatch;
|
|
37
79
|
private running;
|
|
38
80
|
private abortController;
|
|
39
81
|
/** Pending approval requests: requestId → resolve function (legacy path) */
|
|
@@ -50,16 +92,89 @@ export declare class AgentServer {
|
|
|
50
92
|
*/
|
|
51
93
|
private bgAgentBusUnsubscribe;
|
|
52
94
|
constructor(options: AgentServerOptions);
|
|
95
|
+
/**
|
|
96
|
+
* Wake an IDLE chatManager session that has pending background-completion
|
|
97
|
+
* notifications, by enqueueing one turn whose task is the drained
|
|
98
|
+
* notification(s). The model then sees the completion and continues; the
|
|
99
|
+
* session's persisted goal (if any) is judged on that turn.
|
|
100
|
+
*
|
|
101
|
+
* Guards:
|
|
102
|
+
* - chatManager path only (the legacy single-engine / headless path drives
|
|
103
|
+
* its own loop and has no idle-session-resume concept).
|
|
104
|
+
* - Session must exist AND be idle. If it's busy, we do nothing: the in-flight
|
|
105
|
+
* run's end-of-turn `drainAll` already collects every pending notification,
|
|
106
|
+
* so a second run would be redundant — and `enqueueTurn` while busy would
|
|
107
|
+
* queue a spurious extra turn.
|
|
108
|
+
* - We `drainAll` exactly here and feed the items into the woken turn. This
|
|
109
|
+
* also merges a burst of near-simultaneous completions into one wakeup:
|
|
110
|
+
* the first drains all currently-pending items; subsequent bus events for
|
|
111
|
+
* the same session find it busy (or find an empty queue) and no-op.
|
|
112
|
+
*
|
|
113
|
+
* INVARIANT (the burst-merge correctness depends on it): the merge only
|
|
114
|
+
* holds because (a) the bus fans out to subscribers SYNCHRONOUSLY, and (b)
|
|
115
|
+
* `enqueueTurn` sets the session's `active` (→ isBusy()===true) SYNCHRONOUSLY
|
|
116
|
+
* before its first await. So when bus events #2..N arrive — still on the same
|
|
117
|
+
* synchronous fan-out as #1 — they already see the session as busy and no-op.
|
|
118
|
+
* If either path is ever made async (e.g. an await is added inside
|
|
119
|
+
* enqueueTurn before `active` is set, or the bus starts deferring delivery),
|
|
120
|
+
* this degrades into N concurrent wakeups for N completions. Keep both
|
|
121
|
+
* synchronous, or replace this comment's assumption with an explicit
|
|
122
|
+
* "wakeup in flight" guard flag.
|
|
123
|
+
*/
|
|
124
|
+
private maybeWakeIdleSession;
|
|
53
125
|
private handleRequest;
|
|
54
126
|
private handleRun;
|
|
55
127
|
private handleRunMulti;
|
|
56
128
|
private handleRunLegacy;
|
|
57
129
|
private handleApprove;
|
|
58
130
|
private handleCancel;
|
|
131
|
+
/**
|
|
132
|
+
* Extend a running goal's turn/budget ceilings mid-run (TODO 3.1). Routed to
|
|
133
|
+
* a specific session (multi-session path). Returns the resulting effective
|
|
134
|
+
* limits, or an error if no session / no active run.
|
|
135
|
+
*/
|
|
136
|
+
private handleGoalExtend;
|
|
137
|
+
/**
|
|
138
|
+
* Clear a session's persisted active goal (CC /goal clear). Routes to the
|
|
139
|
+
* named session, falling back to the legacy single engine (mirrors
|
|
140
|
+
* handleGoalExtend / handleCancel's dual path). Returns { ok, cleared }.
|
|
141
|
+
*/
|
|
142
|
+
private handleGoalClear;
|
|
143
|
+
/**
|
|
144
|
+
* Read a session's persisted active goal so the host can re-surface the goal
|
|
145
|
+
* block + Cancel button on session load. A persistent goal lives only in
|
|
146
|
+
* state.activeGoal and is never replayed from the transcript, so a reloaded
|
|
147
|
+
* (or disk-rebuilt) session has no other way to learn it. Prefers a live
|
|
148
|
+
* chatManager session, else falls through to a disk read (readActiveGoalFromDisk
|
|
149
|
+
* in worker mode, or the legacy engine's disk read in single-engine mode) — the
|
|
150
|
+
* bug case is an aborted/reloaded session that is NOT live. Returns { ok, goal } where goal
|
|
151
|
+
* is the objective string, or null when there's no goal / unknown session.
|
|
152
|
+
* Never errors on "no goal" — null is the normal "nothing to show" answer.
|
|
153
|
+
*/
|
|
154
|
+
private handleGoalGet;
|
|
155
|
+
/**
|
|
156
|
+
* Query/control a session's background shells for the desktop UI panel (TODO
|
|
157
|
+
* 3.2). Reads the singleton BackgroundShellManager directly (shells outlive
|
|
158
|
+
* the run that spawned them, so we don't need a live ChatSession). Actions:
|
|
159
|
+
* - (default) list → the session's shells
|
|
160
|
+
* - output → full retained output of one shell
|
|
161
|
+
* - kill → terminate one shell's process group
|
|
162
|
+
* All scoped by sessionId (manager enforces ownership on output/kill).
|
|
163
|
+
*/
|
|
164
|
+
private handleBackgroundShells;
|
|
165
|
+
/**
|
|
166
|
+
* BackgroundWork — unified, list-only view of a session's background work
|
|
167
|
+
* across all three registries (shells + sub-agents + jobs) for the desktop
|
|
168
|
+
* background panel. Per-shell output/kill still flow through BackgroundShells
|
|
169
|
+
* (by shellId); this just answers "what's running in the background right now".
|
|
170
|
+
*/
|
|
171
|
+
private handleBackgroundWork;
|
|
59
172
|
private handleCloseSession;
|
|
60
173
|
private handleConfigure;
|
|
61
174
|
private handleQuery;
|
|
62
175
|
private handleInject;
|
|
176
|
+
private handleSteer;
|
|
177
|
+
private handleUnsteer;
|
|
63
178
|
/**
|
|
64
179
|
* Ask the client to approve a tool operation (legacy single-engine path).
|
|
65
180
|
*/
|
|
@@ -67,14 +182,50 @@ export declare class AgentServer {
|
|
|
67
182
|
/**
|
|
68
183
|
* Ask the client to answer a question from the agent (legacy single-engine path).
|
|
69
184
|
*/
|
|
185
|
+
/**
|
|
186
|
+
* Per-session AskUserQuestion for the chatManager path. Mirrors
|
|
187
|
+
* requestAskUserFromClient but resolves via the SESSION's pendingApprovals
|
|
188
|
+
* (the chatManager approve handler looks there, keyed by sessionId+requestId)
|
|
189
|
+
* and tags the notify with sessionId so the renderer routes the question to
|
|
190
|
+
* the right chat tab.
|
|
191
|
+
*/
|
|
192
|
+
private requestAskUserForSession;
|
|
193
|
+
/**
|
|
194
|
+
* Build a BrowserBridge whose every method routes a browser action to the
|
|
195
|
+
* client over the session's pendingApprovals channel (same as askUser). The
|
|
196
|
+
* client (Electron main) drives the webview via CDP and replies with a JSON
|
|
197
|
+
* result string we parse back into the typed result. On timeout / malformed
|
|
198
|
+
* reply we degrade to a safe error result rather than throwing.
|
|
199
|
+
*/
|
|
200
|
+
private makeBrowserBridge;
|
|
201
|
+
private requestBrowserActionForSession;
|
|
202
|
+
/**
|
|
203
|
+
* Ask the client (Electron main) to inject a cookie credential into the
|
|
204
|
+
* built-in browser. Same pendingApprovals channel as browser actions; main
|
|
205
|
+
* calls restoreCookiesToBrowser and replies with a JSON result string we
|
|
206
|
+
* parse into { ok, count?, error? }. Degrades to ok:false on timeout/malformed.
|
|
207
|
+
*/
|
|
208
|
+
private requestCredentialInjectForSession;
|
|
70
209
|
private requestAskUserFromClient;
|
|
71
210
|
private notify;
|
|
72
211
|
/**
|
|
73
|
-
* Get any available engine — used for global query ops when
|
|
74
|
-
* present but no legacyEngine was supplied.
|
|
212
|
+
* Get any available engine — used for global query/configure ops when
|
|
213
|
+
* chatManager is present but no legacyEngine was supplied. Prefer a live chat
|
|
214
|
+
* session; before the first user turn, lazily build a detached engine through
|
|
215
|
+
* the manager's factory so global UI surfaces (/login, model manager, model
|
|
216
|
+
* selector) can query models/providers without requiring a chat session first.
|
|
75
217
|
*/
|
|
76
218
|
private anyEngine;
|
|
77
219
|
close(): void;
|
|
78
220
|
private clearApprovalTimer;
|
|
221
|
+
/**
|
|
222
|
+
* Resolve all of a chat session's pending approvals as cancelled and clear
|
|
223
|
+
* the matching server-side approval timers. Used by handleCancel's
|
|
224
|
+
* per-session path so a Stop while a tool is awaiting approval doesn't leave
|
|
225
|
+
* the tool hanging until APPROVAL_TIMEOUT_MS (and leak the timer). Each
|
|
226
|
+
* requestId in the session map has a same-keyed entry in this.approvalTimers
|
|
227
|
+
* (see requestAskUserForSession / makeBrowserBridge).
|
|
228
|
+
*/
|
|
229
|
+
private cancelSessionApprovals;
|
|
79
230
|
private clearAllApprovalTimers;
|
|
80
231
|
}
|