@cjhyy/code-shell-core 0.5.0-rc.2 → 0.6.0-rc.10
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 +3 -0
- package/dist/agent/agent-definition-registry.js +3 -1
- package/dist/agent/agent-definition.d.ts +15 -0
- package/dist/agent/agent-definition.js +27 -3
- package/dist/arena/context/context-tools.js +47 -4
- package/dist/arena/ledger.js +9 -1
- package/dist/arena/strategies/utils.d.ts +1 -4
- package/dist/arena/strategies/utils.js +7 -84
- package/dist/automation/cron-expr.d.ts +10 -0
- package/dist/automation/cron-expr.js +23 -5
- package/dist/automation/runner.d.ts +21 -4
- package/dist/automation/runner.js +48 -12
- package/dist/automation/scheduler.d.ts +38 -0
- package/dist/automation/scheduler.js +89 -12
- package/dist/automation/store.js +5 -2
- package/dist/capability-control/disabled-lists.d.ts +25 -0
- package/dist/capability-control/disabled-lists.js +57 -0
- package/dist/capability-control/overlay.d.ts +15 -0
- package/dist/capability-control/overlay.js +27 -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 +15 -1
- package/dist/cli/agent-server-stdio.js +115 -17
- package/dist/cli/agent-server-tcp.js +40 -26
- package/dist/context/compaction.d.ts +86 -0
- package/dist/context/compaction.js +279 -0
- package/dist/context/manager.d.ts +18 -0
- package/dist/context/manager.js +181 -48
- package/dist/context/token-counter.js +13 -0
- 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/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/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 +280 -141
- package/dist/engine/engine.js +1193 -245
- package/dist/engine/friendly-error.d.ts +18 -0
- package/dist/engine/friendly-error.js +63 -0
- package/dist/engine/goal.d.ts +145 -0
- package/dist/engine/goal.js +144 -0
- package/dist/engine/image-policy.d.ts +13 -0
- package/dist/engine/image-policy.js +24 -0
- package/dist/engine/model-connections-pool.d.ts +17 -0
- package/dist/engine/model-connections-pool.js +67 -0
- package/dist/engine/model-facade.d.ts +10 -0
- package/dist/engine/model-facade.js +15 -0
- package/dist/engine/patch-orphaned-tools.js +3 -0
- package/dist/engine/query.js +2 -0
- package/dist/engine/resolve-llm-config.d.ts +16 -0
- package/dist/engine/resolve-llm-config.js +44 -0
- package/dist/engine/runtime.d.ts +2 -0
- package/dist/engine/runtime.js +27 -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-usage.d.ts +31 -0
- package/dist/engine/session-usage.js +81 -0
- package/dist/engine/steer-queue.d.ts +33 -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 -4
- package/dist/engine/turn-loop.js +432 -54
- 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/utils.d.ts +12 -0
- package/dist/git/utils.js +38 -6
- package/dist/git/worktree.d.ts +48 -0
- package/dist/git/worktree.js +86 -10
- package/dist/hooks/goal-stop-hook.d.ts +28 -0
- package/dist/hooks/goal-stop-hook.js +186 -9
- package/dist/hooks/registry.d.ts +8 -0
- package/dist/hooks/registry.js +19 -0
- package/dist/hooks/shell-runner.js +10 -21
- package/dist/index.d.ts +51 -7
- package/dist/index.js +62 -5
- package/dist/llm/capabilities/param-specs.d.ts +14 -0
- package/dist/llm/capabilities/param-specs.js +62 -0
- package/dist/llm/capabilities/rules.js +5 -1
- package/dist/llm/capabilities/types.d.ts +10 -0
- package/dist/llm/client-base.d.ts +28 -1
- package/dist/llm/client-base.js +119 -13
- package/dist/llm/model-cache.js +4 -2
- package/dist/llm/model-pool.d.ts +21 -0
- package/dist/llm/model-pool.js +21 -1
- package/dist/llm/provider-auth.d.ts +41 -0
- package/dist/llm/provider-auth.js +76 -0
- package/dist/llm/provider-catalog.d.ts +4 -0
- package/dist/llm/providers/anthropic.js +64 -14
- package/dist/llm/providers/openai.d.ts +36 -0
- package/dist/llm/providers/openai.js +257 -51
- package/dist/llm/reasoning-setting.d.ts +3 -3
- package/dist/llm/reasoning-setting.js +9 -1
- package/dist/llm/stream-watchdog.js +5 -1
- package/dist/llm/token-counter.js +9 -2
- package/dist/llm/types.d.ts +4 -0
- package/dist/logging/sanitize-messages.js +22 -0
- package/dist/lsp/manager.d.ts +1 -1
- package/dist/lsp/manager.js +40 -10
- package/dist/model-catalog/builtin.d.ts +12 -0
- package/dist/model-catalog/builtin.js +412 -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 +61 -326
- package/dist/plugins/gitOps.d.ts +19 -0
- package/dist/plugins/gitOps.js +73 -4
- package/dist/plugins/installer/checkUpdate.d.ts +16 -0
- package/dist/plugins/installer/checkUpdate.js +32 -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 +5 -2
- package/dist/plugins/installer/codex/convertMcp.js +45 -5
- package/dist/plugins/installer/install.js +25 -1
- package/dist/plugins/installer/installFromArchive.d.ts +43 -0
- package/dist/plugins/installer/installFromArchive.js +134 -0
- package/dist/plugins/installer/installFromSource.js +8 -2
- package/dist/plugins/installer/loadPluginAgents.js +6 -2
- package/dist/plugins/installer/loadPluginMcp.d.ts +9 -2
- package/dist/plugins/installer/loadPluginMcp.js +35 -2
- package/dist/plugins/installer/pruneDisabled.d.ts +24 -0
- package/dist/plugins/installer/pruneDisabled.js +73 -0
- package/dist/plugins/installer/types.d.ts +5 -2
- package/dist/plugins/installer/types.js +1 -0
- package/dist/plugins/installer/uninstall.js +4 -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 +14 -0
- package/dist/plugins/installer/update.js +53 -21
- package/dist/plugins/loadPluginHooks.d.ts +47 -1
- package/dist/plugins/loadPluginHooks.js +73 -1
- package/dist/plugins/marketplaceManager.d.ts +7 -0
- package/dist/plugins/marketplaceManager.js +20 -0
- package/dist/plugins/pluginCommandHook.js +4 -18
- package/dist/plugins/pluginContent.d.ts +30 -0
- package/dist/plugins/pluginContent.js +83 -0
- package/dist/plugins/pluginInstaller.d.ts +13 -0
- package/dist/plugins/pluginInstaller.js +42 -8
- package/dist/plugins/schemas.js +1 -0
- package/dist/plugins/types.d.ts +6 -0
- package/dist/preset/index.d.ts +11 -1
- package/dist/preset/index.js +115 -6
- package/dist/product/types.d.ts +1 -1
- package/dist/prompt/composer.d.ts +32 -0
- package/dist/prompt/composer.js +75 -21
- package/dist/prompt/instruction-scanner.js +5 -3
- package/dist/prompt/section-loader.js +1 -0
- package/dist/prompt/sections/base.md +2 -0
- package/dist/prompt/sections/browser.md +10 -0
- package/dist/prompt/sections/coding.md +4 -0
- package/dist/protocol/chat-session-manager.d.ts +9 -2
- package/dist/protocol/chat-session-manager.js +38 -0
- package/dist/protocol/chat-session.d.ts +69 -1
- package/dist/protocol/chat-session.js +102 -4
- package/dist/protocol/client.d.ts +31 -0
- package/dist/protocol/client.js +44 -0
- package/dist/protocol/server.d.ts +120 -7
- package/dist/protocol/server.js +753 -51
- package/dist/protocol/transport.js +3 -2
- package/dist/protocol/types.d.ts +60 -0
- package/dist/protocol/types.js +16 -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/review/review-prompt.d.ts +28 -0
- package/dist/review/review-prompt.js +81 -0
- package/dist/run/FileRunStore.js +8 -3
- package/dist/run/RunApprovalBackend.js +25 -5
- package/dist/run/RunManager.d.ts +12 -0
- package/dist/run/RunManager.js +35 -0
- package/dist/run/factory.d.ts +1 -1
- package/dist/runtime/background-shell.d.ts +139 -0
- package/dist/runtime/background-shell.js +509 -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 +98 -39
- package/dist/runtime/spawn-common.d.ts +159 -0
- package/dist/runtime/spawn-common.js +404 -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/diagnostics.d.ts +1 -2
- package/dist/services/diagnostics.js +12 -7
- 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 -50
- package/dist/services/session-memory.js +24 -12
- package/dist/session/file-history.d.ts +124 -1
- package/dist/session/file-history.js +222 -6
- package/dist/session/memory.d.ts +116 -2
- package/dist/session/memory.js +250 -28
- package/dist/session/session-manager.d.ts +40 -0
- package/dist/session/session-manager.js +119 -3
- package/dist/session/simple-diff.d.ts +23 -0
- package/dist/session/simple-diff.js +84 -0
- package/dist/session/transcript.d.ts +29 -1
- package/dist/session/transcript.js +56 -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 +9 -2
- package/dist/settings/disk-defaults.js +11 -2
- package/dist/settings/feature-flags.d.ts +64 -0
- package/dist/settings/feature-flags.js +61 -0
- package/dist/settings/manager.d.ts +68 -1
- package/dist/settings/manager.js +266 -29
- package/dist/settings/migrate-config.d.ts +45 -0
- package/dist/settings/migrate-config.js +125 -0
- package/dist/settings/schema-export.d.ts +25 -0
- package/dist/settings/schema-export.js +38 -0
- package/dist/settings/schema.d.ts +1186 -771
- package/dist/settings/schema.js +268 -97
- 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/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 +12 -0
- package/dist/tool-system/builtin/agent-registry.js +8 -0
- package/dist/tool-system/builtin/agent.d.ts +21 -1
- package/dist/tool-system/builtin/agent.js +489 -42
- 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 +0 -15
- 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 +101 -64
- 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/config.js +7 -0
- package/dist/tool-system/builtin/cron.d.ts +7 -0
- package/dist/tool-system/builtin/cron.js +64 -4
- 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 +104 -0
- package/dist/tool-system/builtin/edit.js +20 -16
- 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 +35 -0
- package/dist/tool-system/builtin/generate-image.js +278 -50
- package/dist/tool-system/builtin/generate-video.d.ts +55 -0
- package/dist/tool-system/builtin/generate-video.js +364 -0
- package/dist/tool-system/builtin/glob.js +0 -7
- package/dist/tool-system/builtin/grep.d.ts +9 -0
- package/dist/tool-system/builtin/grep.js +106 -11
- 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 +10 -2
- package/dist/tool-system/builtin/index.js +251 -27
- 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.js +0 -7
- package/dist/tool-system/builtin/powershell.js +8 -2
- package/dist/tool-system/builtin/read.js +10 -10
- 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 +8 -2
- package/dist/tool-system/builtin/tool-search.js +25 -7
- 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/web-fetch.js +12 -2
- package/dist/tool-system/builtin/web-search.js +21 -7
- 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.js +0 -6
- package/dist/tool-system/context.d.ts +164 -6
- package/dist/tool-system/executor.d.ts +3 -1
- package/dist/tool-system/executor.js +197 -90
- package/dist/tool-system/investigation-guard.js +1 -1
- package/dist/tool-system/mcp-manager.d.ts +42 -4
- package/dist/tool-system/mcp-manager.js +203 -20
- package/dist/tool-system/mcp-stdio-diagnostics.d.ts +9 -0
- package/dist/tool-system/mcp-stdio-diagnostics.js +93 -0
- package/dist/tool-system/path-policy.d.ts +5 -0
- package/dist/tool-system/path-policy.js +307 -8
- package/dist/tool-system/permission.d.ts +39 -2
- package/dist/tool-system/permission.js +283 -70
- package/dist/tool-system/plan-mode-allowlist.d.ts +13 -2
- package/dist/tool-system/plan-mode-allowlist.js +24 -2
- package/dist/tool-system/registry.d.ts +1 -0
- package/dist/tool-system/registry.js +16 -2
- package/dist/tool-system/sandbox/index.d.ts +8 -0
- package/dist/tool-system/sandbox/index.js +7 -2
- package/dist/tool-system/sandbox/off.js +7 -1
- package/dist/tool-system/validate-tool-metadata.d.ts +36 -0
- package/dist/tool-system/validate-tool-metadata.js +63 -0
- package/dist/types.d.ts +252 -7
- 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 +48 -0
- package/dist/utils/exec.js +154 -0
- package/dist/utils/json.d.ts +12 -0
- package/dist/utils/json.js +92 -0
- package/dist/utils/theme.d.ts +1 -1
- package/dist/utils/theme.js +1 -1
- package/dist/utils/toolDisplay.js +0 -1
- package/package.json +13 -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
|
@@ -2,10 +2,18 @@
|
|
|
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";
|
|
8
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";
|
|
14
|
+
import { BUILTIN_TOOL_GUARDS } from "./builtin/index.js";
|
|
15
|
+
import { COMPLETE_GOAL_TOOL_NAME } from "./builtin/complete-goal.js";
|
|
16
|
+
import { CANCEL_GOAL_TOOL_NAME } from "./builtin/cancel-goal.js";
|
|
9
17
|
// A1 hardening: hooks must never promote a non-`allow` classifier
|
|
10
18
|
// decision to `allow`. They may otherwise adjust the decision freely
|
|
11
19
|
// (e.g. tighten `allow` to `deny`/`ask`, or relax `deny` to `ask` to
|
|
@@ -114,22 +122,95 @@ export class ToolExecutor {
|
|
|
114
122
|
isError: true,
|
|
115
123
|
};
|
|
116
124
|
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
125
|
+
if ((call.toolName === COMPLETE_GOAL_TOOL_NAME || call.toolName === CANCEL_GOAL_TOOL_NAME) &&
|
|
126
|
+
this.toolCtx?.toolVisibility?.hasGoal !== true) {
|
|
127
|
+
return {
|
|
128
|
+
id: call.id,
|
|
129
|
+
toolName: call.toolName,
|
|
130
|
+
error: `Tool ${call.toolName} is only available while an active goal is present. Do NOT retry this tool call unless a goal is active.`,
|
|
131
|
+
isError: true,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
const visibilityGuard = BUILTIN_TOOL_GUARDS.get(call.toolName);
|
|
135
|
+
if (visibilityGuard && this.toolCtx?.toolVisibility && !visibilityGuard(this.toolCtx.toolVisibility)) {
|
|
136
|
+
return {
|
|
137
|
+
id: call.id,
|
|
138
|
+
toolName: call.toolName,
|
|
139
|
+
error: `Tool ${call.toolName} is not available in the current session context. Do NOT retry this tool call unless the relevant context changes.`,
|
|
140
|
+
isError: true,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
// Same gate for MCP tools: the registry is worker-shared, so it can hold
|
|
144
|
+
// tools from servers OTHER sessions enabled. Visibility filtering hides
|
|
145
|
+
// them from this session's tool list; this rejects a direct call anyway.
|
|
146
|
+
if (this.toolCtx?.allowedMcpServers) {
|
|
147
|
+
const allowed = this.toolCtx.allowedMcpServers;
|
|
148
|
+
const reg = this.registry.getTool(call.toolName);
|
|
149
|
+
if (reg?.source === "mcp" && !allowed.has(reg.serverName ?? "")) {
|
|
150
|
+
return {
|
|
151
|
+
id: call.id,
|
|
152
|
+
toolName: call.toolName,
|
|
153
|
+
error: `Tool ${call.toolName} belongs to an MCP server that is not enabled for this project. Do NOT retry this tool call.`,
|
|
154
|
+
isError: true,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
// The generic MCP builtins (MCPTool / ReadMcpResource) take the target
|
|
158
|
+
// server as an ARGUMENT and call MCPManager directly, so the source==="mcp"
|
|
159
|
+
// check above can't see them — without this a session could invoke a tool
|
|
160
|
+
// or read a resource on a server only ANOTHER session enabled. Gate on the
|
|
161
|
+
// server arg. ListMcpResources has an optional server filter and would
|
|
162
|
+
// otherwise enumerate every connected server's resources, so we inject the
|
|
163
|
+
// allowlist for it to filter by (see mcp-tools.ts).
|
|
164
|
+
if (call.toolName === "MCPTool" || call.toolName === "ReadMcpResource") {
|
|
165
|
+
const server = String(call.args.server ?? "");
|
|
166
|
+
if (!allowed.has(server)) {
|
|
167
|
+
return {
|
|
168
|
+
id: call.id,
|
|
169
|
+
toolName: call.toolName,
|
|
170
|
+
error: `MCP server "${server}" is not enabled for this project. Do NOT retry this tool call.`,
|
|
171
|
+
isError: true,
|
|
172
|
+
};
|
|
124
173
|
}
|
|
125
|
-
|
|
174
|
+
}
|
|
175
|
+
else if (call.toolName === "ListMcpResources") {
|
|
176
|
+
const server = String(call.args.server ?? "");
|
|
177
|
+
if (server && !allowed.has(server)) {
|
|
126
178
|
return {
|
|
127
179
|
id: call.id,
|
|
128
180
|
toolName: call.toolName,
|
|
129
|
-
error: `
|
|
181
|
+
error: `MCP server "${server}" is not enabled for this project. Do NOT retry this tool call.`,
|
|
130
182
|
isError: true,
|
|
131
183
|
};
|
|
132
184
|
}
|
|
185
|
+
call.args.__allowedMcpServers = allowed;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// 0. Plan mode: only allow read-only tools — no file writes at all
|
|
189
|
+
if (this.toolCtx?.planMode) {
|
|
190
|
+
// Shared with engine.ts's tool-visibility filter so the set the model
|
|
191
|
+
// SEES and the set the executor RUNS can't drift (they had).
|
|
192
|
+
// Bash is in the allow-list so the model can SEE it for read-only probing,
|
|
193
|
+
// but membership alone must NOT grant write access: a Bash command that
|
|
194
|
+
// modifies files (echo >, sed -i, mv, ...) has to be blocked here too, or it
|
|
195
|
+
// would slip past plan mode into the normal permission flow (where the user
|
|
196
|
+
// could approve it) AND leave no diff, since it never touches Write/Edit.
|
|
197
|
+
const allowed = PLAN_MODE_ALLOWED_TOOLS.has(call.toolName);
|
|
198
|
+
// Defer to the canonical shell classifier (the same one the permission
|
|
199
|
+
// flow uses) instead of a second hand-rolled allowlist that drifted and
|
|
200
|
+
// let find -delete / awk system() / process substitution / git difftool
|
|
201
|
+
// through. Plan mode is strictly read-only, so ONLY "safe-read" passes —
|
|
202
|
+
// safe-write (mkdir/touch/cp), unsafe, and dangerous are all blocked.
|
|
203
|
+
const bashWrite = call.toolName === "Bash" &&
|
|
204
|
+
classifyBashCommand(String(call.args.command ?? "")) !== "safe-read";
|
|
205
|
+
if (!allowed || bashWrite) {
|
|
206
|
+
return {
|
|
207
|
+
id: call.id,
|
|
208
|
+
toolName: call.toolName,
|
|
209
|
+
error: allowed && bashWrite
|
|
210
|
+
? `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.`
|
|
211
|
+
: `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.`,
|
|
212
|
+
isError: true,
|
|
213
|
+
};
|
|
133
214
|
}
|
|
134
215
|
}
|
|
135
216
|
// 0.5. Validate tool args
|
|
@@ -182,6 +263,19 @@ export class ToolExecutor {
|
|
|
182
263
|
toolCallId: call.id,
|
|
183
264
|
});
|
|
184
265
|
}
|
|
266
|
+
// 0.65. Centralized file path policy. Tool handlers declare their file
|
|
267
|
+
// path surface on RegisteredTool.pathPolicy; the executor enforces it
|
|
268
|
+
// after hooks have had a chance to rewrite args, but before permission
|
|
269
|
+
// classification or the handler can touch the filesystem.
|
|
270
|
+
const pathPolicyError = await this.enforceDeclaredPathPolicy(toolDef, call.args);
|
|
271
|
+
if (pathPolicyError) {
|
|
272
|
+
return {
|
|
273
|
+
id: call.id,
|
|
274
|
+
toolName: call.toolName,
|
|
275
|
+
error: pathPolicyError,
|
|
276
|
+
isError: true,
|
|
277
|
+
};
|
|
278
|
+
}
|
|
185
279
|
// A1 hardening: pre_tool_use can no longer pre-approve a tool via
|
|
186
280
|
// `decision === "allow"`. Hooks may relax `allow` and may force
|
|
187
281
|
// `ask`/`deny`, but they cannot promote a `deny`/`ask` decision to
|
|
@@ -201,7 +295,7 @@ export class ToolExecutor {
|
|
|
201
295
|
// the hook and the user together have decided.
|
|
202
296
|
if (hookResult.decision === "ask") {
|
|
203
297
|
const reason = hookResult.messages?.join("\n") ?? undefined;
|
|
204
|
-
const approved = await this.permission.handleAsk(call.toolName, call.args, reason);
|
|
298
|
+
const approved = await this.permission.handleAsk(call.toolName, call.args, reason, { sessionId: this.toolCtx?.sessionId });
|
|
205
299
|
if (!approved) {
|
|
206
300
|
return {
|
|
207
301
|
id: call.id,
|
|
@@ -274,7 +368,9 @@ export class ToolExecutor {
|
|
|
274
368
|
}
|
|
275
369
|
if (decision === "ask") {
|
|
276
370
|
const reason = permHook.messages?.join("\n");
|
|
277
|
-
const approved = await this.permission.handleAsk(call.toolName, call.args, reason
|
|
371
|
+
const approved = await this.permission.handleAsk(call.toolName, call.args, reason, {
|
|
372
|
+
sessionId: this.toolCtx?.sessionId,
|
|
373
|
+
});
|
|
278
374
|
if (!approved) {
|
|
279
375
|
return {
|
|
280
376
|
id: call.id,
|
|
@@ -321,6 +417,18 @@ export class ToolExecutor {
|
|
|
321
417
|
durationMs: Date.now() - toolStartedAt,
|
|
322
418
|
error: err instanceof Error ? err.stack ?? err.message : String(err),
|
|
323
419
|
});
|
|
420
|
+
// A model calling a tool that isn't in the registry (hallucinated name,
|
|
421
|
+
// or a builtin missing from the active preset's whitelist) must not kill
|
|
422
|
+
// the turn. Feed it back as a normal tool error so the model can retry
|
|
423
|
+
// or pick a different tool — same path as permission denials above.
|
|
424
|
+
if (err instanceof ToolNotFoundError) {
|
|
425
|
+
return {
|
|
426
|
+
id: call.id,
|
|
427
|
+
toolName: call.toolName,
|
|
428
|
+
error: `Tool not found: ${call.toolName}. It is not available in this session — do not call it again; use a different tool.`,
|
|
429
|
+
isError: true,
|
|
430
|
+
};
|
|
431
|
+
}
|
|
324
432
|
throw err;
|
|
325
433
|
}
|
|
326
434
|
result.id = call.id;
|
|
@@ -386,86 +494,85 @@ export class ToolExecutor {
|
|
|
386
494
|
}
|
|
387
495
|
return result;
|
|
388
496
|
}
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
"
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
"
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
"
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
"
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
return
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
}
|
|
497
|
+
resolvePolicyOperation(op, args) {
|
|
498
|
+
if (op === "read" || op === "write")
|
|
499
|
+
return op;
|
|
500
|
+
const raw = args[op.fromArg];
|
|
501
|
+
const value = typeof raw === "string" ? raw : String(raw ?? "");
|
|
502
|
+
if (op.readValues?.includes(value))
|
|
503
|
+
return "read";
|
|
504
|
+
if (op.writeValues?.includes(value))
|
|
505
|
+
return "write";
|
|
506
|
+
return op.default;
|
|
507
|
+
}
|
|
508
|
+
async enforceDeclaredPathPolicy(tool, args) {
|
|
509
|
+
const policies = tool?.pathPolicy;
|
|
510
|
+
if (!policies?.length)
|
|
511
|
+
return null;
|
|
512
|
+
for (const policy of policies) {
|
|
513
|
+
const targets = this.resolvePathPolicyTargets(policy, args);
|
|
514
|
+
if (typeof targets === "string")
|
|
515
|
+
return targets;
|
|
516
|
+
const operation = this.resolvePolicyOperation(policy.operation, args);
|
|
517
|
+
for (const target of targets) {
|
|
518
|
+
const blocked = await enforcePathPolicyWithApproval(target, operation, this.toolCtx);
|
|
519
|
+
if (blocked)
|
|
520
|
+
return blocked;
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
return null;
|
|
524
|
+
}
|
|
525
|
+
resolvePathPolicyTargets(policy, args) {
|
|
526
|
+
if (policy.kind === "arg") {
|
|
527
|
+
const raw = args[policy.arg];
|
|
528
|
+
if (typeof raw === "string" && raw.length > 0) {
|
|
529
|
+
// Resolve a RELATIVE single-string path arg against ctx.cwd before
|
|
530
|
+
// classification, mirroring the array branch below and the apply_patch
|
|
531
|
+
// branch — otherwise classifyPath's process.cwd()-based resolution
|
|
532
|
+
// mis-places an in-workspace relative path (e.g. Read "src/x.ts") as
|
|
533
|
+
// "outside workspace" and over-prompts. Absolute paths pass through.
|
|
534
|
+
const cwd = this.toolCtx?.cwd ?? process.cwd();
|
|
535
|
+
return [isAbsolutePath(raw) ? raw : resolvePath(cwd, raw)];
|
|
536
|
+
}
|
|
537
|
+
// Array path args (e.g. GenerateImage `referenceImages`, GenerateVideo
|
|
538
|
+
// `images`): enforce EVERY element. Without this an array yielded zero
|
|
539
|
+
// targets, so out-of-workspace reads bypassed the path-policy "ask" gate
|
|
540
|
+
// that Read/Write enforce. http(s) URLs aren't file reads → skip them.
|
|
541
|
+
// Relative paths resolve against ctx.cwd (the workspace) before
|
|
542
|
+
// classification, like the apply_patch branch — otherwise classifyPath's
|
|
543
|
+
// process.cwd()-based resolution would mis-place an in-workspace relative
|
|
544
|
+
// path as "outside" and over-prompt. Non-string / empty elements skipped.
|
|
545
|
+
if (Array.isArray(raw)) {
|
|
546
|
+
const cwd = this.toolCtx?.cwd ?? process.cwd();
|
|
547
|
+
const paths = raw
|
|
548
|
+
.filter((v) => typeof v === "string" && v.length > 0)
|
|
549
|
+
.filter((v) => !/^https?:\/\//i.test(v))
|
|
550
|
+
.map((v) => (isAbsolutePath(v) ? v : resolvePath(cwd, v)));
|
|
551
|
+
if (paths.length > 0)
|
|
552
|
+
return paths;
|
|
553
|
+
}
|
|
554
|
+
if (policy.defaultToCwd && this.toolCtx?.cwd)
|
|
555
|
+
return [this.toolCtx.cwd];
|
|
556
|
+
return [];
|
|
557
|
+
}
|
|
558
|
+
const rawPatch = args[policy.arg];
|
|
559
|
+
if (typeof rawPatch !== "string" || rawPatch.length === 0)
|
|
560
|
+
return [];
|
|
561
|
+
try {
|
|
562
|
+
const parsed = parsePatch(rawPatch, "lenient");
|
|
563
|
+
const cwd = this.toolCtx?.cwd ?? process.cwd();
|
|
564
|
+
const targets = [];
|
|
565
|
+
for (const hunk of parsed.hunks) {
|
|
566
|
+
targets.push(resolvePath(cwd, hunk.path));
|
|
567
|
+
if (hunk.kind === "update" && hunk.movePath) {
|
|
568
|
+
targets.push(resolvePath(cwd, hunk.movePath));
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
return targets;
|
|
572
|
+
}
|
|
573
|
+
catch (err) {
|
|
574
|
+
return `Error: ${err.message}`;
|
|
467
575
|
}
|
|
468
|
-
return false;
|
|
469
576
|
}
|
|
470
577
|
/**
|
|
471
578
|
* Convert tool results into Message entries for the transcript.
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
*
|
|
17
17
|
* Everything decays naturally on any write/Bash/AskUser tool (state reset).
|
|
18
18
|
*/
|
|
19
|
-
|
|
19
|
+
import { READ_ONLY_TOOLS } from "./plan-mode-allowlist.js";
|
|
20
20
|
const READ_BUDGET = 3;
|
|
21
21
|
const SILENT_TURN_BUDGET = 3;
|
|
22
22
|
const DEDUPE_OFFSET_BUCKET = 50;
|
|
@@ -6,6 +6,36 @@
|
|
|
6
6
|
import type { Tool as McpTool } from "@modelcontextprotocol/sdk/types.js";
|
|
7
7
|
import type { MCPServerConfig, RegisteredTool } from "../types.js";
|
|
8
8
|
import { ToolRegistry } from "./registry.js";
|
|
9
|
+
/**
|
|
10
|
+
* Read a required secret from `process.env` by NAME (Codex-style env-secret
|
|
11
|
+
* handling — the value is never persisted in MCP config). A referenced env var
|
|
12
|
+
* that is undefined OR empty string is treated as missing so the connection
|
|
13
|
+
* fails with a clear, actionable error naming the server, the config field,
|
|
14
|
+
* and the env var.
|
|
15
|
+
*/
|
|
16
|
+
export declare function readRequiredEnv(serverName: string, field: string, envName: string): string;
|
|
17
|
+
/**
|
|
18
|
+
* Build the spawned stdio server's environment. Priority (lowest → highest):
|
|
19
|
+
* a minimal inherited allowlist < forwarded `envVars` (read from process.env by
|
|
20
|
+
* name) < explicit plaintext `config.env`. Returns `undefined` when neither
|
|
21
|
+
* `env` nor `envVars` is present, preserving the old "inherit nothing extra"
|
|
22
|
+
* behavior (transport gets `env: undefined`). Pure + exported for unit testing.
|
|
23
|
+
*/
|
|
24
|
+
export declare function buildStdioEnv(serverName: string, config: MCPServerConfig): Record<string, string> | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* Build the HTTP transport's request headers. Static `config.headers` form the
|
|
27
|
+
* base; env-sourced secrets (`bearerTokenEnvVar`, `envHeaders`) layer on top
|
|
28
|
+
* and win on conflict. Pure + exported for unit testing.
|
|
29
|
+
*/
|
|
30
|
+
export declare function buildHttpHeaders(serverName: string, config: MCPServerConfig, resolveCredential?: (id: string) => string | undefined): Record<string, string>;
|
|
31
|
+
/**
|
|
32
|
+
* Infer the transport when the config doesn't name one: a url-only entry is
|
|
33
|
+
* HTTP, everything else stdio. This is the CC `.mcp.json` convention —
|
|
34
|
+
* plugin-bundled servers commonly write just `{ "url": "..." }`, and the old
|
|
35
|
+
* blind `?? "stdio"` default then failed them with "command is required for
|
|
36
|
+
* stdio transport" despite a perfectly good url. Pure + exported for testing.
|
|
37
|
+
*/
|
|
38
|
+
export declare function inferTransportType(config: MCPServerConfig): NonNullable<MCPServerConfig["transport"]>;
|
|
9
39
|
/**
|
|
10
40
|
* Persist an MCP-returned image to disk and return the textual
|
|
11
41
|
* reference the LLM should see. Images larger than
|
|
@@ -27,6 +57,8 @@ export declare class MCPManager {
|
|
|
27
57
|
private readonly toolRegistry;
|
|
28
58
|
private static instance;
|
|
29
59
|
private connections;
|
|
60
|
+
private registeredToolsByServer;
|
|
61
|
+
private desiredServerNames;
|
|
30
62
|
/**
|
|
31
63
|
* In-flight connect()s keyed by server name. When the broadcast config
|
|
32
64
|
* reload (server.ts forEachSession → every session's refreshRuntimeConfig)
|
|
@@ -39,12 +71,17 @@ export declare class MCPManager {
|
|
|
39
71
|
* connect can be retried later.
|
|
40
72
|
*/
|
|
41
73
|
private connecting;
|
|
74
|
+
/** Per-owner (engine) desired server sets — see reconcile()'s shared-pool note. */
|
|
75
|
+
private desiredByOwner;
|
|
42
76
|
constructor(toolRegistry: ToolRegistry);
|
|
43
77
|
static getInstance(): MCPManager;
|
|
44
78
|
/**
|
|
45
79
|
* Connect to all configured MCP servers and register their tools.
|
|
46
80
|
*/
|
|
47
|
-
connectAll(servers: Record<string, MCPServerConfig
|
|
81
|
+
connectAll(servers: Record<string, MCPServerConfig>, owner?: unknown): Promise<void>;
|
|
82
|
+
reconcile(servers: Record<string, MCPServerConfig>, owner?: unknown): Promise<void>;
|
|
83
|
+
/** Union of every registered owner's desired set; null when none registered. */
|
|
84
|
+
private unionDesired;
|
|
48
85
|
/**
|
|
49
86
|
* Connect to a single MCP server.
|
|
50
87
|
*
|
|
@@ -68,6 +105,7 @@ export declare class MCPManager {
|
|
|
68
105
|
* Disconnect all MCP servers.
|
|
69
106
|
*/
|
|
70
107
|
disconnectAll(): Promise<void>;
|
|
108
|
+
disconnect(name: string): Promise<void>;
|
|
71
109
|
/**
|
|
72
110
|
* List connected servers.
|
|
73
111
|
*/
|
|
@@ -75,11 +113,11 @@ export declare class MCPManager {
|
|
|
75
113
|
/**
|
|
76
114
|
* Call a tool on a specific MCP server.
|
|
77
115
|
*/
|
|
78
|
-
callTool(serverName: string, toolName: string, args: Record<string, unknown
|
|
116
|
+
callTool(serverName: string, toolName: string, args: Record<string, unknown>, signal?: AbortSignal): Promise<unknown>;
|
|
79
117
|
/**
|
|
80
118
|
* List resources from MCP servers.
|
|
81
119
|
*/
|
|
82
|
-
listResources(serverName?: string): Promise<Array<{
|
|
120
|
+
listResources(serverName?: string, signal?: AbortSignal): Promise<Array<{
|
|
83
121
|
uri: string;
|
|
84
122
|
name: string;
|
|
85
123
|
description?: string;
|
|
@@ -87,5 +125,5 @@ export declare class MCPManager {
|
|
|
87
125
|
/**
|
|
88
126
|
* Read a resource from an MCP server.
|
|
89
127
|
*/
|
|
90
|
-
readResource(serverName: string, uri: string): Promise<string>;
|
|
128
|
+
readResource(serverName: string, uri: string, signal?: AbortSignal): Promise<string>;
|
|
91
129
|
}
|