@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
|
@@ -18,11 +18,39 @@ import type { ToolRegistry } from "./registry.js";
|
|
|
18
18
|
import type { AgentPresetName } from "../preset/index.js";
|
|
19
19
|
import type { SandboxBackend } from "./sandbox/index.js";
|
|
20
20
|
import type { HookRegistry } from "../hooks/registry.js";
|
|
21
|
-
|
|
21
|
+
/**
|
|
22
|
+
* Narrow view of the owning Engine that tools are allowed to call back into.
|
|
23
|
+
* Defined here (in the low-level tool-system) rather than importing the
|
|
24
|
+
* concrete `Engine` type so tool-system does NOT depend on the top-level
|
|
25
|
+
* engine module — that import created a tool-system ↔ engine cycle. The Engine
|
|
26
|
+
* class satisfies this structurally (no `implements` needed); this interface
|
|
27
|
+
* lists exactly the members tools use today (see plan.ts / worktree.ts).
|
|
28
|
+
*/
|
|
29
|
+
export interface ToolRuntimeHost {
|
|
30
|
+
/** Whether the owning Engine is currently in plan mode. */
|
|
31
|
+
readonly planMode: boolean;
|
|
32
|
+
/** Toggle plan mode (EnterPlanMode / ExitPlanMode tools). */
|
|
33
|
+
setPlanMode(value: boolean): void;
|
|
34
|
+
/** Per-worktree setup scripts, or undefined for sub-agents / no cwd. */
|
|
35
|
+
readWorktreeSetupScripts(cwd?: string): {
|
|
36
|
+
default?: string;
|
|
37
|
+
macos?: string;
|
|
38
|
+
linux?: string;
|
|
39
|
+
windows?: string;
|
|
40
|
+
} | undefined;
|
|
41
|
+
}
|
|
22
42
|
/** One choice in a multiple-choice AskUserQuestion. */
|
|
23
43
|
export interface AskUserChoice {
|
|
24
44
|
label: string;
|
|
25
45
|
description: string;
|
|
46
|
+
/**
|
|
47
|
+
* Optional semantic hint for how the UI colors this choice and its resolved
|
|
48
|
+
* echo — `ok` (affirmative / allow → green ✓), `danger` (negative / deny →
|
|
49
|
+
* red ✕), `neutral` (no coloring). Only set by trusted first-party callers
|
|
50
|
+
* with fixed option sets (e.g. the credential-use gate); the LLM-facing
|
|
51
|
+
* AskUserQuestion tool strips it so model-authored prompts stay neutral.
|
|
52
|
+
*/
|
|
53
|
+
tone?: "ok" | "danger" | "neutral";
|
|
26
54
|
}
|
|
27
55
|
/**
|
|
28
56
|
* Optional rendering hints / multiple-choice options carried alongside the
|
|
@@ -35,6 +63,14 @@ export interface AskUserOptions {
|
|
|
35
63
|
options?: AskUserChoice[];
|
|
36
64
|
/** Allow the user to pick more than one option. Defaults to false. */
|
|
37
65
|
multiSelect?: boolean;
|
|
66
|
+
/**
|
|
67
|
+
* When true, the UI must offer ONLY the given `options` — no "其它…"
|
|
68
|
+
* free-text escape hatch. Used by closed-set decisions (e.g. a path-permission
|
|
69
|
+
* 允许本次/拒绝 prompt) where the answer is interpreted by an exact label
|
|
70
|
+
* match, so a free-typed answer like "允许" would never match and silently
|
|
71
|
+
* deny. Ignored unless `options` is non-empty.
|
|
72
|
+
*/
|
|
73
|
+
optionsOnly?: boolean;
|
|
38
74
|
}
|
|
39
75
|
/**
|
|
40
76
|
* Function the host UI / server uses to ask the user a question.
|
|
@@ -76,16 +112,48 @@ export interface SubAgentSpawnRequest {
|
|
|
76
112
|
* Undefined → child inherits the parent's full tool set (current behavior).
|
|
77
113
|
*/
|
|
78
114
|
toolAllowlist?: string[];
|
|
115
|
+
/**
|
|
116
|
+
* Optional skill-name allowlist for the child (hard isolation). When set,
|
|
117
|
+
* the child only sees/invokes these skills in its system prompt and Skill
|
|
118
|
+
* tool. Undefined → child inherits the parent's full skill pool.
|
|
119
|
+
*/
|
|
120
|
+
skillAllowlist?: string[];
|
|
79
121
|
/**
|
|
80
122
|
* Optional per-call system prompt appended to the child Engine's prompt
|
|
81
123
|
* (the role definition's Markdown body). Undefined → child inherits only
|
|
82
124
|
* the parent's appendSystemPrompt (current behavior).
|
|
83
125
|
*/
|
|
84
126
|
appendSystemPrompt?: string;
|
|
127
|
+
/** True for read-only reviewer/researcher children; tunes investigation guard reminders. */
|
|
128
|
+
readOnlySession?: boolean;
|
|
129
|
+
/**
|
|
130
|
+
* Resume an existing child session instead of cold-starting a new one.
|
|
131
|
+
* When set, the child Engine runs with `sessionId: resumeSessionId`, which
|
|
132
|
+
* loads that session's full transcript (all prior tool calls + results) and
|
|
133
|
+
* appends this turn's prompt — i.e. transcript replay, the CC model. When
|
|
134
|
+
* omitted, the child cold-starts under its own `agentId` as the session id
|
|
135
|
+
* (so `agentId === childSid`, enabling later resume with no extra mapping).
|
|
136
|
+
* See AgentSendInput in builtin/agent.ts.
|
|
137
|
+
*/
|
|
138
|
+
resumeSessionId?: string;
|
|
85
139
|
}
|
|
86
140
|
export interface SubAgentSpawner {
|
|
87
|
-
/**
|
|
88
|
-
|
|
141
|
+
/**
|
|
142
|
+
* Run a sub-agent synchronously. Returns its text output and the child's
|
|
143
|
+
* session id. The session id equals the request's `agentId` on a cold start
|
|
144
|
+
* (or `resumeSessionId` when resuming), so the parent can address follow-up
|
|
145
|
+
* input at the same session via AgentSendInput (transcript replay).
|
|
146
|
+
*/
|
|
147
|
+
spawn(req: SubAgentSpawnRequest): Promise<{
|
|
148
|
+
text: string;
|
|
149
|
+
sessionId: string;
|
|
150
|
+
}>;
|
|
151
|
+
/**
|
|
152
|
+
* Whether a child session id exists on disk. Lets AgentSendInput resume an
|
|
153
|
+
* agent across a process restart (when the in-memory registry is empty but
|
|
154
|
+
* the session transcript is still persisted). Optional for legacy callers.
|
|
155
|
+
*/
|
|
156
|
+
sessionExists?(sessionId: string): boolean;
|
|
89
157
|
/** Stream callback to forward sub-agent events back to the parent UI. */
|
|
90
158
|
parentStream?: StreamCallback;
|
|
91
159
|
/** Static config used to describe what the spawned engine looks like. */
|
|
@@ -154,9 +222,18 @@ export interface ToolContext {
|
|
|
154
222
|
/** Whether the owning Engine is currently in plan mode. Replaces the
|
|
155
223
|
* removed module-level `isInPlanMode()` singleton. */
|
|
156
224
|
planMode: boolean;
|
|
157
|
-
/**
|
|
158
|
-
*
|
|
159
|
-
|
|
225
|
+
/**
|
|
226
|
+
* The owning Engine's permission mode. Path policy reads this so that
|
|
227
|
+
* `bypassPermissions` (the user's "完全访问") skips the path-approval prompt
|
|
228
|
+
* entirely — matching the tool-permission backend and CC, where bypass
|
|
229
|
+
* skips ALL checks including path validation. Undefined → treat as
|
|
230
|
+
* "default" (always enforce). */
|
|
231
|
+
permissionMode?: string;
|
|
232
|
+
/** The Engine that built this context, as the narrow {@link ToolRuntimeHost}
|
|
233
|
+
* view. Lets tools call back into the engine (e.g. ctx.engine.setPlanMode)
|
|
234
|
+
* without a module-level singleton — and without tool-system depending on
|
|
235
|
+
* the concrete Engine type (which would re-introduce the import cycle). */
|
|
236
|
+
engine: ToolRuntimeHost;
|
|
160
237
|
/**
|
|
161
238
|
* sessionId of the Engine.run() turn this context was built for. Tools
|
|
162
239
|
* that emit session-scoped side effects (today: background-agent
|
|
@@ -181,7 +258,90 @@ export interface ToolContext {
|
|
|
181
258
|
* `settings.disabledPlugins` by Engine.run().
|
|
182
259
|
*/
|
|
183
260
|
disabledPlugins?: string[];
|
|
261
|
+
/**
|
|
262
|
+
* Sub-agent skill allowlist (hard isolation). When set, this sub-agent may
|
|
263
|
+
* only see/invoke skills in this list — applied on top of the disabled
|
|
264
|
+
* lists. Undefined → inherit the parent's full pool (current behavior).
|
|
265
|
+
* Comes from the agent role definition's `skills:` frontmatter, threaded
|
|
266
|
+
* through SubAgentSpawnRequest.skillAllowlist into the child Engine.
|
|
267
|
+
*/
|
|
268
|
+
skillAllowlist?: string[];
|
|
269
|
+
/**
|
|
270
|
+
* Background-shell manager (Bash run_in_background + BashOutput / KillShell
|
|
271
|
+
* / ListShells). Undefined → the tools fall back to the process-local
|
|
272
|
+
* `backgroundShellManager` singleton. Threaded explicitly so tests (and
|
|
273
|
+
* any future per-engine isolation) can inject their own instance.
|
|
274
|
+
*/
|
|
275
|
+
backgroundShells?: import("../runtime/background-shell.js").BackgroundShellManager;
|
|
276
|
+
/**
|
|
277
|
+
* False in unattended automation/cron runs — `Bash(run_in_background=true)`
|
|
278
|
+
* is rejected and the three background-shell tools are stripped (design
|
|
279
|
+
* §5.5): no one is watching to reap a long-lived dev server. Defaults to
|
|
280
|
+
* true (interactive sessions allow it).
|
|
281
|
+
*/
|
|
282
|
+
allowBackgroundShells?: boolean;
|
|
283
|
+
/**
|
|
284
|
+
* Builtin tool names the project's capabilityOverrides marked `off` for
|
|
285
|
+
* this cwd. Engine.run() already HIDES these from the LLM-visible tool
|
|
286
|
+
* list, but the model can still NAME a hidden builtin (hallucinated, or
|
|
287
|
+
* remembered from an earlier turn when it was visible). The executor reads
|
|
288
|
+
* this set and rejects such a call — turning `off` into a real execution
|
|
289
|
+
* gate, not just a prompt-visibility filter. Empty/undefined for
|
|
290
|
+
* sub-agents and no-cwd contexts (same as readBuiltinOverride).
|
|
291
|
+
*/
|
|
292
|
+
disabledBuiltins?: Set<string>;
|
|
293
|
+
/**
|
|
294
|
+
* MCP servers THIS session's merged config enables (keys of
|
|
295
|
+
* config.mcpServers, enabled!==false). The pool + registry are
|
|
296
|
+
* worker-shared (B1), so tools registered by another project's session live
|
|
297
|
+
* in the same registry — the engine hides them from this session's tool
|
|
298
|
+
* list and the executor rejects calls to them via this set. Undefined =
|
|
299
|
+
* no gating (sub-agents / tests whose registries carry no MCP tools).
|
|
300
|
+
*/
|
|
301
|
+
allowedMcpServers?: Set<string>;
|
|
302
|
+
/**
|
|
303
|
+
* The engine's settings scope, so tools that read disk config directly (e.g.
|
|
304
|
+
* the credential tools) can honor host-isolation instead of always merging
|
|
305
|
+
* the host user's ~/.code-shell. "full" = host app (user + project); "project"
|
|
306
|
+
* / "isolated" = must not surface host user credentials or autoApprove.
|
|
307
|
+
* Undefined = legacy/no-cwd → treated as "full" by consumers for compat.
|
|
308
|
+
*/
|
|
309
|
+
settingsScope?: import("../settings/manager.js").SettingsScope;
|
|
310
|
+
/**
|
|
311
|
+
* Project-scoped extra environment variables (the user's
|
|
312
|
+
* `localEnvironment.env` KEY=VALUE pairs for this cwd). Layered on top of
|
|
313
|
+
* the shell env that the Bash tool and background shells build, so a project
|
|
314
|
+
* can inject e.g. `DATABASE_URL` / `NODE_ENV` into every command it runs.
|
|
315
|
+
* Unlike the sandbox allowlist, these bypass the deny regex — the user put
|
|
316
|
+
* them in project settings deliberately. Undefined for sub-agents and
|
|
317
|
+
* no-cwd contexts (populated from settings by Engine.buildToolContext()).
|
|
318
|
+
*/
|
|
319
|
+
shellEnv?: Record<string, string>;
|
|
320
|
+
/**
|
|
321
|
+
* Browser automation bridge (browser_snapshot / click / type / navigate /
|
|
322
|
+
* scroll). The renderer implements it on top of the webview's CDP
|
|
323
|
+
* (Accessibility.getFullAXTree + Input.dispatchMouseEvent). Undefined →
|
|
324
|
+
* headless / no browser panel → the browser tools degrade with a clear error.
|
|
325
|
+
* See tool-system/browser-bridge.ts and the MVP spec
|
|
326
|
+
* docs/superpowers/specs/2026-06-16-browser-automation-mvp.md.
|
|
327
|
+
*/
|
|
328
|
+
browser?: import("./browser-bridge.js").BrowserBridge;
|
|
329
|
+
/**
|
|
330
|
+
* Inject a stored cookie credential into the built-in browser (restore its
|
|
331
|
+
* login state so the AI can drive the page as that account). The host
|
|
332
|
+
* (desktop main) implements it on top of `restoreCookiesToBrowser`. Undefined
|
|
333
|
+
* → headless / no browser → the InjectCredential tool degrades with a clear
|
|
334
|
+
* error. Mirrors the askUser cross-process callback shape. The credentialId
|
|
335
|
+
* names a `type:"cookie"` credential; result counts cookies written.
|
|
336
|
+
*/
|
|
337
|
+
injectCredentialToBrowser?: InjectCredentialFn;
|
|
184
338
|
}
|
|
339
|
+
/** Inject a cookie credential into the built-in browser (host-implemented). */
|
|
340
|
+
export type InjectCredentialFn = (credentialId: string) => Promise<{
|
|
341
|
+
ok: boolean;
|
|
342
|
+
count?: number;
|
|
343
|
+
error?: string;
|
|
344
|
+
}>;
|
|
185
345
|
/**
|
|
186
346
|
* Per-Engine container that produces a fresh ToolContext on demand.
|
|
187
347
|
* Engine creates one of these in run() and passes it to ToolExecutor.
|
|
@@ -39,8 +39,9 @@ export declare class ToolExecutor {
|
|
|
39
39
|
/** Check if a tool is safe for concurrent execution (read-only). */
|
|
40
40
|
isConcurrencySafe(toolName: string): boolean;
|
|
41
41
|
executeSingle(callIn: ToolCall): Promise<ToolResult>;
|
|
42
|
-
private
|
|
43
|
-
|
|
42
|
+
private resolvePolicyOperation;
|
|
43
|
+
private enforceDeclaredPathPolicy;
|
|
44
|
+
private resolvePathPolicyTargets;
|
|
44
45
|
/**
|
|
45
46
|
* Convert tool results into Message entries for the transcript.
|
|
46
47
|
*/
|
|
@@ -2,9 +2,15 @@
|
|
|
2
2
|
* Tool executor — orchestrates permission checks, hooks, and execution.
|
|
3
3
|
*/
|
|
4
4
|
import { setMaxListeners } from "node:events";
|
|
5
|
+
import { resolve as resolvePath, isAbsolute as isAbsolutePath } from "node:path";
|
|
6
|
+
import { classifyBashCommand } from "./permission.js";
|
|
7
|
+
import { ToolNotFoundError } from "../exceptions.js";
|
|
5
8
|
import { logger as rootLogger, getCurrentSid } from "../logging/logger.js";
|
|
6
9
|
import { recordToolCall, recordToolResult } from "../logging/session-recorder.js";
|
|
7
10
|
import { validateToolArgs } from "./validation.js";
|
|
11
|
+
import { PLAN_MODE_ALLOWED_TOOLS } from "./plan-mode-allowlist.js";
|
|
12
|
+
import { enforcePathPolicyWithApproval } from "./path-policy.js";
|
|
13
|
+
import { parsePatch } from "./builtin/apply-patch/parser.js";
|
|
8
14
|
// A1 hardening: hooks must never promote a non-`allow` classifier
|
|
9
15
|
// decision to `allow`. They may otherwise adjust the decision freely
|
|
10
16
|
// (e.g. tighten `allow` to `deny`/`ask`, or relax `deny` to `ask` to
|
|
@@ -83,33 +89,107 @@ export class ToolExecutor {
|
|
|
83
89
|
// Local `call` so we can rewrite args via pre_tool_use updatedInput
|
|
84
90
|
// without mutating the caller's object.
|
|
85
91
|
let call = callIn;
|
|
86
|
-
// 0.
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
92
|
+
// 0. Abort fast-path: if the run signal is already aborted, return a
|
|
93
|
+
// synthetic error result WITHOUT running pre_tool_use hooks, the
|
|
94
|
+
// permission classifier, or the handler. registry.executeTool also checks
|
|
95
|
+
// abort, but only after this method has paid for all the per-tool
|
|
96
|
+
// hook/permission round-trips. For an aborted sub-agent whose turn queued
|
|
97
|
+
// a batch of tools (e.g. 10 Reads), this collapses the whole batch
|
|
98
|
+
// instantly instead of round-tripping each one — part of the sub-agent
|
|
99
|
+
// leak fix that keeps an aborted child from burning work post-abort.
|
|
100
|
+
if (this.signal?.aborted) {
|
|
101
|
+
return {
|
|
102
|
+
id: call.id,
|
|
103
|
+
toolName: call.toolName,
|
|
104
|
+
error: `Tool aborted before execution: ${call.toolName}`,
|
|
105
|
+
isError: true,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
// 0. Capability override: a builtin the project marked `off` is HIDDEN from
|
|
109
|
+
// the model's tool list (engine.ts applyBuiltinOverrideVisibility), but the
|
|
110
|
+
// model can still NAME it (hallucination, or a remembered earlier turn). The
|
|
111
|
+
// registry still holds the tool, so without a gate here it would execute.
|
|
112
|
+
// Reject it the same way plan mode rejects a disallowed tool — return an
|
|
113
|
+
// error result, never run the handler.
|
|
114
|
+
if (this.toolCtx?.disabledBuiltins?.has(call.toolName)) {
|
|
115
|
+
return {
|
|
116
|
+
id: call.id,
|
|
117
|
+
toolName: call.toolName,
|
|
118
|
+
error: `Tool ${call.toolName} is disabled by this project's capability override and cannot be used. Do NOT retry this tool call.`,
|
|
119
|
+
isError: true,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
// Same gate for MCP tools: the registry is worker-shared, so it can hold
|
|
123
|
+
// tools from servers OTHER sessions enabled. Visibility filtering hides
|
|
124
|
+
// them from this session's tool list; this rejects a direct call anyway.
|
|
125
|
+
if (this.toolCtx?.allowedMcpServers) {
|
|
126
|
+
const allowed = this.toolCtx.allowedMcpServers;
|
|
127
|
+
const reg = this.registry.getTool(call.toolName);
|
|
128
|
+
if (reg?.source === "mcp" && !allowed.has(reg.serverName ?? "")) {
|
|
129
|
+
return {
|
|
130
|
+
id: call.id,
|
|
131
|
+
toolName: call.toolName,
|
|
132
|
+
error: `Tool ${call.toolName} belongs to an MCP server that is not enabled for this project. Do NOT retry this tool call.`,
|
|
133
|
+
isError: true,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
// The generic MCP builtins (MCPTool / ReadMcpResource) take the target
|
|
137
|
+
// server as an ARGUMENT and call MCPManager directly, so the source==="mcp"
|
|
138
|
+
// check above can't see them — without this a session could invoke a tool
|
|
139
|
+
// or read a resource on a server only ANOTHER session enabled. Gate on the
|
|
140
|
+
// server arg. ListMcpResources has an optional server filter and would
|
|
141
|
+
// otherwise enumerate every connected server's resources, so we inject the
|
|
142
|
+
// allowlist for it to filter by (see mcp-tools.ts).
|
|
143
|
+
if (call.toolName === "MCPTool" || call.toolName === "ReadMcpResource") {
|
|
144
|
+
const server = String(call.args.server ?? "");
|
|
145
|
+
if (!allowed.has(server)) {
|
|
146
|
+
return {
|
|
147
|
+
id: call.id,
|
|
148
|
+
toolName: call.toolName,
|
|
149
|
+
error: `MCP server "${server}" is not enabled for this project. Do NOT retry this tool call.`,
|
|
150
|
+
isError: true,
|
|
151
|
+
};
|
|
104
152
|
}
|
|
105
|
-
|
|
153
|
+
}
|
|
154
|
+
else if (call.toolName === "ListMcpResources") {
|
|
155
|
+
const server = String(call.args.server ?? "");
|
|
156
|
+
if (server && !allowed.has(server)) {
|
|
106
157
|
return {
|
|
107
158
|
id: call.id,
|
|
108
159
|
toolName: call.toolName,
|
|
109
|
-
error: `
|
|
160
|
+
error: `MCP server "${server}" is not enabled for this project. Do NOT retry this tool call.`,
|
|
110
161
|
isError: true,
|
|
111
162
|
};
|
|
112
163
|
}
|
|
164
|
+
call.args.__allowedMcpServers = allowed;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// 0. Plan mode: only allow read-only tools — no file writes at all
|
|
168
|
+
if (this.toolCtx?.planMode) {
|
|
169
|
+
// Shared with engine.ts's tool-visibility filter so the set the model
|
|
170
|
+
// SEES and the set the executor RUNS can't drift (they had).
|
|
171
|
+
// Bash is in the allow-list so the model can SEE it for read-only probing,
|
|
172
|
+
// but membership alone must NOT grant write access: a Bash command that
|
|
173
|
+
// modifies files (echo >, sed -i, mv, ...) has to be blocked here too, or it
|
|
174
|
+
// would slip past plan mode into the normal permission flow (where the user
|
|
175
|
+
// could approve it) AND leave no diff, since it never touches Write/Edit.
|
|
176
|
+
const allowed = PLAN_MODE_ALLOWED_TOOLS.has(call.toolName);
|
|
177
|
+
// Defer to the canonical shell classifier (the same one the permission
|
|
178
|
+
// flow uses) instead of a second hand-rolled allowlist that drifted and
|
|
179
|
+
// let find -delete / awk system() / process substitution / git difftool
|
|
180
|
+
// through. Plan mode is strictly read-only, so ONLY "safe-read" passes —
|
|
181
|
+
// safe-write (mkdir/touch/cp), unsafe, and dangerous are all blocked.
|
|
182
|
+
const bashWrite = call.toolName === "Bash" &&
|
|
183
|
+
classifyBashCommand(String(call.args.command ?? "")) !== "safe-read";
|
|
184
|
+
if (!allowed || bashWrite) {
|
|
185
|
+
return {
|
|
186
|
+
id: call.id,
|
|
187
|
+
toolName: call.toolName,
|
|
188
|
+
error: allowed && bashWrite
|
|
189
|
+
? `Plan mode is read-only: this Bash command writes or modifies files, which is not allowed while planning. To carry it out, first call ExitPlanMode (after the user approves your plan), then run it. Do NOT retry this command in plan mode.`
|
|
190
|
+
: `Plan mode: ${call.toolName} is blocked. Only read-only tools (Read, Glob, Grep, WebSearch, WebFetch, Bash read-only) are allowed. You MUST output your plan as text in the conversation instead. Do NOT retry this tool call.`,
|
|
191
|
+
isError: true,
|
|
192
|
+
};
|
|
113
193
|
}
|
|
114
194
|
}
|
|
115
195
|
// 0.5. Validate tool args
|
|
@@ -162,6 +242,19 @@ export class ToolExecutor {
|
|
|
162
242
|
toolCallId: call.id,
|
|
163
243
|
});
|
|
164
244
|
}
|
|
245
|
+
// 0.65. Centralized file path policy. Tool handlers declare their file
|
|
246
|
+
// path surface on RegisteredTool.pathPolicy; the executor enforces it
|
|
247
|
+
// after hooks have had a chance to rewrite args, but before permission
|
|
248
|
+
// classification or the handler can touch the filesystem.
|
|
249
|
+
const pathPolicyError = await this.enforceDeclaredPathPolicy(toolDef, call.args);
|
|
250
|
+
if (pathPolicyError) {
|
|
251
|
+
return {
|
|
252
|
+
id: call.id,
|
|
253
|
+
toolName: call.toolName,
|
|
254
|
+
error: pathPolicyError,
|
|
255
|
+
isError: true,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
165
258
|
// A1 hardening: pre_tool_use can no longer pre-approve a tool via
|
|
166
259
|
// `decision === "allow"`. Hooks may relax `allow` and may force
|
|
167
260
|
// `ask`/`deny`, but they cannot promote a `deny`/`ask` decision to
|
|
@@ -301,6 +394,18 @@ export class ToolExecutor {
|
|
|
301
394
|
durationMs: Date.now() - toolStartedAt,
|
|
302
395
|
error: err instanceof Error ? err.stack ?? err.message : String(err),
|
|
303
396
|
});
|
|
397
|
+
// A model calling a tool that isn't in the registry (hallucinated name,
|
|
398
|
+
// or a builtin missing from the active preset's whitelist) must not kill
|
|
399
|
+
// the turn. Feed it back as a normal tool error so the model can retry
|
|
400
|
+
// or pick a different tool — same path as permission denials above.
|
|
401
|
+
if (err instanceof ToolNotFoundError) {
|
|
402
|
+
return {
|
|
403
|
+
id: call.id,
|
|
404
|
+
toolName: call.toolName,
|
|
405
|
+
error: `Tool not found: ${call.toolName}. It is not available in this session — do not call it again; use a different tool.`,
|
|
406
|
+
isError: true,
|
|
407
|
+
};
|
|
408
|
+
}
|
|
304
409
|
throw err;
|
|
305
410
|
}
|
|
306
411
|
result.id = call.id;
|
|
@@ -366,112 +471,85 @@ export class ToolExecutor {
|
|
|
366
471
|
}
|
|
367
472
|
return result;
|
|
368
473
|
}
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
"
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
"type",
|
|
395
|
-
"env",
|
|
396
|
-
"printenv",
|
|
397
|
-
"grep",
|
|
398
|
-
"rg",
|
|
399
|
-
"ag",
|
|
400
|
-
"awk",
|
|
401
|
-
"less",
|
|
402
|
-
"more",
|
|
403
|
-
"sort",
|
|
404
|
-
"uniq",
|
|
405
|
-
"diff",
|
|
406
|
-
"readlink",
|
|
407
|
-
"realpath",
|
|
408
|
-
"basename",
|
|
409
|
-
"dirname",
|
|
410
|
-
"date",
|
|
411
|
-
"whoami",
|
|
412
|
-
"uname",
|
|
413
|
-
"hostname",
|
|
414
|
-
"id",
|
|
415
|
-
"groups",
|
|
416
|
-
"locale",
|
|
417
|
-
"uptime",
|
|
418
|
-
]);
|
|
419
|
-
// Whitelisted read-only git/tool subcommands.
|
|
420
|
-
// Deliberately exclude `node -e`, `python -c`, `sed -n`, etc. — those can
|
|
421
|
-
// execute arbitrary code even though they "look read-only".
|
|
422
|
-
const readOnlyPrefixes = [
|
|
423
|
-
"git log",
|
|
424
|
-
"git status",
|
|
425
|
-
"git diff",
|
|
426
|
-
"git branch",
|
|
427
|
-
"git show",
|
|
428
|
-
"git blame",
|
|
429
|
-
"git remote",
|
|
430
|
-
"git tag",
|
|
431
|
-
"git stash list",
|
|
432
|
-
"git rev-parse",
|
|
433
|
-
"npx tsc --noEmit",
|
|
434
|
-
];
|
|
435
|
-
if (readOnlyCommands.has(baseCmd))
|
|
436
|
-
return true;
|
|
437
|
-
if (readOnlyPrefixes.some((p) => cmd.startsWith(p)))
|
|
438
|
-
return true;
|
|
439
|
-
// Allow piped commands if all parts are read-only. Redirections were
|
|
440
|
-
// already rejected above, so a bare `|` here is a real pipeline.
|
|
441
|
-
if (cmd.includes("|")) {
|
|
442
|
-
const parts = cmd.split("|").map((p) => p.trim());
|
|
443
|
-
return parts.every((part) => {
|
|
444
|
-
const partBase = part.replace(/^(\w+=\S+\s+)*/, "").split(/\s/)[0];
|
|
445
|
-
return readOnlyCommands.has(partBase);
|
|
446
|
-
});
|
|
474
|
+
resolvePolicyOperation(op, args) {
|
|
475
|
+
if (op === "read" || op === "write")
|
|
476
|
+
return op;
|
|
477
|
+
const raw = args[op.fromArg];
|
|
478
|
+
const value = typeof raw === "string" ? raw : String(raw ?? "");
|
|
479
|
+
if (op.readValues?.includes(value))
|
|
480
|
+
return "read";
|
|
481
|
+
if (op.writeValues?.includes(value))
|
|
482
|
+
return "write";
|
|
483
|
+
return op.default;
|
|
484
|
+
}
|
|
485
|
+
async enforceDeclaredPathPolicy(tool, args) {
|
|
486
|
+
const policies = tool?.pathPolicy;
|
|
487
|
+
if (!policies?.length)
|
|
488
|
+
return null;
|
|
489
|
+
for (const policy of policies) {
|
|
490
|
+
const targets = this.resolvePathPolicyTargets(policy, args);
|
|
491
|
+
if (typeof targets === "string")
|
|
492
|
+
return targets;
|
|
493
|
+
const operation = this.resolvePolicyOperation(policy.operation, args);
|
|
494
|
+
for (const target of targets) {
|
|
495
|
+
const blocked = await enforcePathPolicyWithApproval(target, operation, this.toolCtx);
|
|
496
|
+
if (blocked)
|
|
497
|
+
return blocked;
|
|
498
|
+
}
|
|
447
499
|
}
|
|
448
|
-
return
|
|
500
|
+
return null;
|
|
449
501
|
}
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
502
|
+
resolvePathPolicyTargets(policy, args) {
|
|
503
|
+
if (policy.kind === "arg") {
|
|
504
|
+
const raw = args[policy.arg];
|
|
505
|
+
if (typeof raw === "string" && raw.length > 0) {
|
|
506
|
+
// Resolve a RELATIVE single-string path arg against ctx.cwd before
|
|
507
|
+
// classification, mirroring the array branch below and the apply_patch
|
|
508
|
+
// branch — otherwise classifyPath's process.cwd()-based resolution
|
|
509
|
+
// mis-places an in-workspace relative path (e.g. Read "src/x.ts") as
|
|
510
|
+
// "outside workspace" and over-prompts. Absolute paths pass through.
|
|
511
|
+
const cwd = this.toolCtx?.cwd ?? process.cwd();
|
|
512
|
+
return [isAbsolutePath(raw) ? raw : resolvePath(cwd, raw)];
|
|
459
513
|
}
|
|
460
|
-
|
|
461
|
-
|
|
514
|
+
// Array path args (e.g. GenerateImage `referenceImages`, GenerateVideo
|
|
515
|
+
// `images`): enforce EVERY element. Without this an array yielded zero
|
|
516
|
+
// targets, so out-of-workspace reads bypassed the path-policy "ask" gate
|
|
517
|
+
// that Read/Write enforce. http(s) URLs aren't file reads → skip them.
|
|
518
|
+
// Relative paths resolve against ctx.cwd (the workspace) before
|
|
519
|
+
// classification, like the apply_patch branch — otherwise classifyPath's
|
|
520
|
+
// process.cwd()-based resolution would mis-place an in-workspace relative
|
|
521
|
+
// path as "outside" and over-prompt. Non-string / empty elements skipped.
|
|
522
|
+
if (Array.isArray(raw)) {
|
|
523
|
+
const cwd = this.toolCtx?.cwd ?? process.cwd();
|
|
524
|
+
const paths = raw
|
|
525
|
+
.filter((v) => typeof v === "string" && v.length > 0)
|
|
526
|
+
.filter((v) => !/^https?:\/\//i.test(v))
|
|
527
|
+
.map((v) => (isAbsolutePath(v) ? v : resolvePath(cwd, v)));
|
|
528
|
+
if (paths.length > 0)
|
|
529
|
+
return paths;
|
|
462
530
|
}
|
|
531
|
+
if (policy.defaultToCwd && this.toolCtx?.cwd)
|
|
532
|
+
return [this.toolCtx.cwd];
|
|
533
|
+
return [];
|
|
463
534
|
}
|
|
464
|
-
|
|
465
|
-
if (
|
|
466
|
-
|
|
467
|
-
|
|
535
|
+
const rawPatch = args[policy.arg];
|
|
536
|
+
if (typeof rawPatch !== "string" || rawPatch.length === 0)
|
|
537
|
+
return [];
|
|
538
|
+
try {
|
|
539
|
+
const parsed = parsePatch(rawPatch, "lenient");
|
|
540
|
+
const cwd = this.toolCtx?.cwd ?? process.cwd();
|
|
541
|
+
const targets = [];
|
|
542
|
+
for (const hunk of parsed.hunks) {
|
|
543
|
+
targets.push(resolvePath(cwd, hunk.path));
|
|
544
|
+
if (hunk.kind === "update" && hunk.movePath) {
|
|
545
|
+
targets.push(resolvePath(cwd, hunk.movePath));
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
return targets;
|
|
468
549
|
}
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
const result = await this.executeSingle(call);
|
|
472
|
-
results.push(result);
|
|
550
|
+
catch (err) {
|
|
551
|
+
return `Error: ${err.message}`;
|
|
473
552
|
}
|
|
474
|
-
return results;
|
|
475
553
|
}
|
|
476
554
|
/**
|
|
477
555
|
* Convert tool results into Message entries for the transcript.
|
|
@@ -21,6 +21,7 @@ export interface GuardDecision {
|
|
|
21
21
|
block?: string;
|
|
22
22
|
prepend?: string;
|
|
23
23
|
}
|
|
24
|
+
export type InvestigationGuardPolicy = "normal" | "soft" | "read-only-review";
|
|
24
25
|
export declare class InvestigationGuard {
|
|
25
26
|
private readHistory;
|
|
26
27
|
private consecutiveReads;
|
|
@@ -35,8 +36,10 @@ export declare class InvestigationGuard {
|
|
|
35
36
|
* be killed by the guard — it should still get the signal to change
|
|
36
37
|
* strategy, but the tool call goes through.
|
|
37
38
|
*/
|
|
38
|
-
private
|
|
39
|
+
private policy;
|
|
40
|
+
private readOnlyReviewBudgetReminderShown;
|
|
39
41
|
setSoftMode(soft: boolean): void;
|
|
42
|
+
setPolicy(policy: InvestigationGuardPolicy): void;
|
|
40
43
|
preToolCheck(call: ToolCall): GuardDecision | undefined;
|
|
41
44
|
noteText(text: string | undefined): void;
|
|
42
45
|
noteToolResult(_call: ToolCall, _result: ToolResult): void;
|