@cjhyy/code-shell-core 0.7.1 → 0.8.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 +36 -23
- package/dist/agent/agent-definition-registry.d.ts +2 -2
- package/dist/agent/agent-definition-registry.js +47 -10
- package/dist/agent/agent-definition.d.ts +5 -0
- package/dist/agent/agent-definition.js +14 -0
- package/dist/automation/index.d.ts +7 -4
- package/dist/automation/index.js +4 -2
- package/dist/automation/runner.js +3 -1
- package/dist/automation/scheduler.d.ts +57 -1
- package/dist/automation/scheduler.js +123 -23
- package/dist/automation/store.d.ts +6 -2
- package/dist/automation/store.js +7 -3
- package/dist/capabilities/index.d.ts +109 -0
- package/dist/capabilities/index.js +80 -0
- package/dist/capability-control/disabled-lists.d.ts +2 -1
- package/dist/capability-control/disabled-lists.js +3 -5
- package/dist/capability-control/overlay.d.ts +14 -1
- package/dist/capability-control/overlay.js +40 -0
- package/dist/capability-control/service.js +6 -4
- package/dist/cli/agent-server-stdio.d.ts +1 -1
- package/dist/cli/agent-server-stdio.js +66 -6
- package/dist/cli/agent-server-tcp.js +7 -3
- package/dist/context/compaction.d.ts +39 -3
- package/dist/context/compaction.js +151 -39
- package/dist/context/manager.d.ts +17 -1
- package/dist/context/manager.js +36 -1
- package/dist/credentials/access.d.ts +3 -1
- package/dist/credentials/access.js +24 -3
- package/dist/credentials/index.d.ts +1 -1
- package/dist/credentials/index.js +1 -1
- package/dist/credentials/oauth.d.ts +4 -1
- package/dist/credentials/oauth.js +14 -0
- package/dist/credentials/store.d.ts +15 -1
- package/dist/credentials/store.js +17 -4
- package/dist/credentials/types.d.ts +24 -0
- package/dist/credentials/use-credential-tool.js +15 -1
- package/dist/engine/auxiliary-pipeline.d.ts +40 -0
- package/dist/engine/auxiliary-pipeline.js +181 -0
- package/dist/{settings → engine}/disk-defaults.d.ts +2 -2
- package/dist/{settings → engine}/disk-defaults.js +5 -2
- package/dist/engine/dynamic-tool-defs.d.ts +4 -0
- package/dist/engine/dynamic-tool-defs.js +4 -0
- package/dist/engine/engine.d.ts +254 -195
- package/dist/engine/engine.js +1812 -2041
- package/dist/engine/file-history-hook.d.ts +11 -0
- package/dist/engine/file-history-hook.js +31 -0
- package/dist/engine/goal-judge-context.d.ts +9 -0
- package/dist/engine/goal-judge-context.js +234 -0
- package/dist/engine/injected-context-cache.d.ts +6 -0
- package/dist/engine/injected-context-cache.js +13 -0
- package/dist/engine/input-attachments.d.ts +1 -1
- package/dist/engine/model-facade.d.ts +3 -3
- package/dist/engine/model-facade.js +15 -14
- package/dist/engine/permission-controller.d.ts +55 -0
- package/dist/engine/permission-controller.js +148 -0
- package/dist/engine/prompt-cache-diagnostics.d.ts +58 -0
- package/dist/engine/prompt-cache-diagnostics.js +178 -0
- package/dist/engine/run-accounting.d.ts +41 -0
- package/dist/engine/run-accounting.js +126 -0
- package/dist/engine/run-context.d.ts +44 -0
- package/dist/engine/run-context.js +88 -0
- package/dist/engine/run-environment.d.ts +30 -0
- package/dist/engine/run-environment.js +77 -0
- package/dist/engine/run-finalize.d.ts +58 -0
- package/dist/engine/run-finalize.js +245 -0
- package/dist/engine/run-goal.d.ts +58 -0
- package/dist/engine/run-goal.js +188 -0
- package/dist/engine/run-image-input.d.ts +1 -1
- package/dist/engine/run-image-input.js +5 -3
- package/dist/engine/run-session-open.d.ts +41 -0
- package/dist/engine/run-session-open.js +186 -0
- package/dist/engine/run-setup.d.ts +42 -0
- package/dist/engine/run-setup.js +58 -0
- package/dist/engine/run-tooling.d.ts +125 -0
- package/dist/engine/run-tooling.js +283 -0
- package/dist/engine/run-types.d.ts +139 -0
- package/dist/engine/run-types.js +12 -0
- package/dist/engine/run-workspace.d.ts +50 -0
- package/dist/engine/run-workspace.js +114 -0
- package/dist/engine/steer-queue.d.ts +1 -1
- package/dist/engine/subagent-spawner.d.ts +32 -0
- package/dist/engine/subagent-spawner.js +287 -0
- package/dist/engine/tool-summary.d.ts +2 -2
- package/dist/engine/tool-summary.js +2 -2
- package/dist/engine/turn-loop.d.ts +49 -10
- package/dist/engine/turn-loop.js +370 -104
- package/dist/engine/types.d.ts +30 -3
- package/dist/engine/types.js +1 -1
- package/dist/{engine/goal.d.ts → goal/lifecycle.d.ts} +76 -4
- package/dist/goal/lifecycle.js +482 -0
- package/dist/hooks/events.d.ts +24 -10
- package/dist/hooks/goal-stop-hook.d.ts +17 -28
- package/dist/hooks/goal-stop-hook.js +110 -465
- package/dist/hooks/registry.js +1 -1
- package/dist/index.d.ts +48 -108
- package/dist/index.extension.d.ts +51 -0
- package/dist/index.extension.js +39 -0
- package/dist/index.internal.d.ts +86 -0
- package/dist/index.internal.js +92 -0
- package/dist/index.js +34 -123
- package/dist/links/cli.d.ts +48 -0
- package/dist/links/cli.js +617 -0
- package/dist/links/http.d.ts +40 -0
- package/dist/links/http.js +166 -0
- package/dist/links/index.d.ts +4 -0
- package/dist/links/index.js +3 -0
- package/dist/links/link-action-tool.d.ts +5 -0
- package/dist/links/link-action-tool.js +241 -0
- package/dist/links/providers.d.ts +8 -0
- package/dist/links/providers.js +665 -0
- package/dist/links/types.d.ts +44 -0
- package/dist/llm/client-base.d.ts +7 -0
- package/dist/llm/client-base.js +60 -0
- package/dist/llm/model-pool.d.ts +1 -1
- package/dist/llm/model-pool.js +1 -1
- package/dist/llm/providers/anthropic.d.ts +1 -0
- package/dist/llm/providers/anthropic.js +9 -0
- package/dist/llm/providers/openai.d.ts +1 -0
- package/dist/llm/providers/openai.js +17 -0
- package/dist/model-catalog/index.js +15 -2
- package/dist/model-catalog/resolve.d.ts +13 -1
- package/dist/model-catalog/resolve.js +37 -2
- package/dist/model-catalog/types.d.ts +74 -48
- package/dist/model-catalog/types.js +16 -5
- package/dist/model-catalog/upsert.d.ts +3 -1
- package/dist/model-catalog/upsert.js +9 -0
- package/dist/onboarding.d.ts +0 -1
- package/dist/onboarding.js +1 -22
- package/dist/panel-apps/bindings.d.ts +24 -0
- package/dist/panel-apps/bindings.js +69 -0
- package/dist/panel-apps/github-archive.d.ts +21 -0
- package/dist/panel-apps/github-archive.js +98 -0
- package/dist/panel-apps/index.d.ts +4 -0
- package/dist/panel-apps/index.js +4 -0
- package/dist/panel-apps/installer.d.ts +68 -0
- package/dist/panel-apps/installer.js +622 -0
- package/dist/panel-apps/manifest.d.ts +364 -0
- package/dist/panel-apps/manifest.js +189 -0
- package/dist/panel-apps/paths.d.ts +13 -0
- package/dist/panel-apps/paths.js +38 -0
- package/dist/panel-apps/registry.d.ts +51 -0
- package/dist/panel-apps/registry.js +99 -0
- package/dist/panel-apps/runtime.d.ts +80 -0
- package/dist/panel-apps/runtime.js +154 -0
- package/dist/plugins/gitOps.js +8 -1
- package/dist/plugins/installedPlugins.d.ts +2 -1
- package/dist/plugins/installedPlugins.js +146 -8
- package/dist/plugins/installer/codex/convertAgents.d.ts +4 -1
- package/dist/plugins/installer/codex/convertAgents.js +62 -8
- package/dist/plugins/installer/codex/convertCommands.d.ts +5 -5
- package/dist/plugins/installer/codex/convertCommands.js +35 -12
- package/dist/plugins/installer/codex/convertHooks.d.ts +10 -0
- package/dist/plugins/installer/codex/convertHooks.js +82 -0
- package/dist/plugins/installer/codex/convertSkills.js +41 -6
- package/dist/plugins/installer/install.d.ts +7 -1
- package/dist/plugins/installer/install.js +21 -87
- package/dist/plugins/installer/installFromArchive.d.ts +26 -4
- package/dist/plugins/installer/installFromArchive.js +44 -27
- package/dist/plugins/installer/installFromNpm.d.ts +31 -0
- package/dist/plugins/installer/installFromNpm.js +273 -0
- package/dist/plugins/installer/loadPluginAgents.js +17 -4
- package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
- package/dist/plugins/installer/loadPluginMcp.js +245 -35
- package/dist/plugins/installer/normalizeManifest.d.ts +13 -0
- package/dist/plugins/installer/normalizeManifest.js +306 -0
- package/dist/plugins/installer/npmTar.d.ts +13 -0
- package/dist/plugins/installer/npmTar.js +321 -0
- package/dist/plugins/installer/parseSource.d.ts +11 -0
- package/dist/plugins/installer/parseSource.js +48 -0
- package/dist/plugins/installer/preview.d.ts +101 -0
- package/dist/plugins/installer/preview.js +336 -0
- package/dist/plugins/installer/projectPluginSource.d.ts +14 -0
- package/dist/plugins/installer/projectPluginSource.js +140 -0
- package/dist/plugins/installer/types.d.ts +775 -0
- package/dist/plugins/installer/types.js +100 -0
- package/dist/plugins/installer/unzip.d.ts +11 -0
- package/dist/plugins/installer/unzip.js +123 -9
- package/dist/plugins/installer/update.d.ts +2 -2
- package/dist/plugins/installer/update.js +43 -4
- package/dist/plugins/loadPluginHooks.d.ts +19 -2
- package/dist/plugins/loadPluginHooks.js +97 -86
- package/dist/plugins/pluginAutomationTemplates.d.ts +18 -0
- package/dist/plugins/pluginAutomationTemplates.js +50 -0
- package/dist/plugins/pluginCatalog.d.ts +45 -0
- package/dist/plugins/pluginCatalog.js +87 -0
- package/dist/plugins/pluginCommandHook.d.ts +6 -0
- package/dist/plugins/pluginCommandHook.js +25 -8
- package/dist/plugins/pluginCommandsLoader.d.ts +19 -0
- package/dist/plugins/pluginCommandsLoader.js +181 -7
- package/dist/plugins/pluginContent.d.ts +10 -1
- package/dist/plugins/pluginContent.js +87 -30
- package/dist/plugins/pluginHookApproval.d.ts +30 -0
- package/dist/plugins/pluginHookApproval.js +160 -0
- package/dist/plugins/pluginHookIntegrity.d.ts +69 -0
- package/dist/plugins/pluginHookIntegrity.js +361 -0
- package/dist/plugins/pluginInstaller.js +71 -12
- package/dist/plugins/pluginMcpApproval.d.ts +19 -0
- package/dist/plugins/pluginMcpApproval.js +110 -0
- package/dist/plugins/pluginMcpIntegrity.d.ts +21 -0
- package/dist/plugins/pluginMcpIntegrity.js +74 -0
- package/dist/plugins/types.d.ts +30 -0
- package/dist/plugins/varRewrite.d.ts +9 -5
- package/dist/plugins/varRewrite.js +26 -17
- package/dist/preset/index.d.ts +11 -8
- package/dist/preset/index.js +62 -203
- package/dist/product/define.js +9 -3
- package/dist/product/types.d.ts +0 -2
- package/dist/profile/activation.d.ts +36 -0
- package/dist/profile/activation.js +57 -0
- package/dist/profile/catalog-store.d.ts +77 -0
- package/dist/profile/catalog-store.js +346 -0
- package/dist/profile/catalog.d.ts +54 -0
- package/dist/profile/catalog.js +152 -0
- package/dist/profile/index.d.ts +7 -0
- package/dist/profile/index.js +7 -0
- package/dist/profile/requirements.d.ts +76 -0
- package/dist/profile/requirements.js +117 -0
- package/dist/profile/resolve.d.ts +11 -0
- package/dist/profile/resolve.js +41 -0
- package/dist/profile/store.d.ts +17 -0
- package/dist/profile/store.js +167 -0
- package/dist/profile/types.d.ts +321 -0
- package/dist/profile/types.js +104 -0
- package/dist/prompt/composer.d.ts +46 -7
- package/dist/prompt/composer.js +78 -48
- package/dist/prompt/instruction-scanner.d.ts +6 -5
- package/dist/prompt/instruction-scanner.js +8 -23
- package/dist/prompt/section-loader.d.ts +2 -2
- package/dist/prompt/section-loader.js +7 -4
- package/dist/prompt/sections/browser.md +10 -9
- package/dist/prompt/sections/harness-base.md +9 -0
- package/dist/protocol/chat-session-manager.d.ts +64 -1
- package/dist/protocol/chat-session-manager.js +104 -0
- package/dist/protocol/chat-session.d.ts +61 -10
- package/dist/protocol/chat-session.js +135 -25
- package/dist/protocol/client.d.ts +33 -3
- package/dist/protocol/client.js +96 -5
- package/dist/protocol/index.d.ts +2 -2
- package/dist/protocol/index.js +2 -2
- package/dist/protocol/mobile-remote-types.d.ts +406 -0
- package/dist/protocol/mobile-remote-types.js +1 -0
- package/dist/protocol/server.d.ts +127 -3
- package/dist/protocol/server.js +1309 -182
- package/dist/protocol/types.d.ts +152 -34
- package/dist/protocol/types.js +16 -0
- package/dist/run/ArtifactTracker.d.ts +6 -1
- package/dist/run/ArtifactTracker.js +29 -21
- package/dist/run/EngineRunner.d.ts +2 -0
- package/dist/run/EngineRunner.js +1 -0
- package/dist/run/RunManager.d.ts +26 -0
- package/dist/run/RunManager.js +82 -11
- package/dist/run/factory.d.ts +3 -0
- package/dist/run/factory.js +2 -0
- package/dist/runtime/safe-spawn.d.ts +6 -0
- package/dist/runtime/safe-spawn.js +8 -13
- package/dist/services/auto-dream.d.ts +13 -1
- package/dist/services/auto-dream.js +56 -8
- package/dist/services/dream-consolidation.js +10 -1
- package/dist/services/memory-orchestrator.js +6 -2
- package/dist/services/oauth.js +4 -1
- package/dist/services/session-memory.d.ts +4 -4
- package/dist/services/session-memory.js +13 -10
- package/dist/session/memory.d.ts +26 -7
- package/dist/session/memory.js +79 -21
- package/dist/session/session-manager.d.ts +182 -28
- package/dist/session/session-manager.js +910 -130
- package/dist/session/session-message.d.ts +22 -0
- package/dist/session/session-message.js +1 -0
- package/dist/session/transcript.d.ts +46 -5
- package/dist/session/transcript.js +159 -3
- package/dist/settings/feature-flags.d.ts +40 -0
- package/dist/settings/feature-flags.js +40 -0
- package/dist/settings/manager.d.ts +39 -1
- package/dist/settings/manager.js +102 -41
- package/dist/settings/migrate-config.js +4 -2
- package/dist/settings/schema.d.ts +511 -177
- package/dist/settings/schema.js +98 -25
- package/dist/skills/scanner.d.ts +6 -2
- package/dist/skills/scanner.js +160 -9
- package/dist/sources/adapter.d.ts +14 -0
- package/dist/sources/adapter.js +7 -0
- package/dist/sources/adapters/local-files.d.ts +10 -0
- package/dist/sources/adapters/local-files.js +127 -0
- package/dist/sources/adapters/mcp-resource.d.ts +17 -0
- package/dist/sources/adapters/mcp-resource.js +41 -0
- package/dist/sources/adapters/mock.d.ts +3 -0
- package/dist/sources/adapters/mock.js +29 -0
- package/dist/sources/binding.d.ts +6 -0
- package/dist/sources/binding.js +24 -0
- package/dist/sources/catalog.d.ts +6 -0
- package/dist/sources/catalog.js +64 -0
- package/dist/sources/context-summary.d.ts +8 -0
- package/dist/sources/context-summary.js +13 -0
- package/dist/sources/credential-status.d.ts +2 -0
- package/dist/sources/credential-status.js +13 -0
- package/dist/sources/index.d.ts +10 -0
- package/dist/sources/index.js +10 -0
- package/dist/sources/resolve.d.ts +28 -0
- package/dist/sources/resolve.js +47 -0
- package/dist/sources/truncate-utf8.d.ts +7 -0
- package/dist/sources/truncate-utf8.js +18 -0
- package/dist/sources/types.d.ts +71 -0
- package/dist/sources/types.js +26 -0
- package/dist/testing/fetch-stub.d.ts +32 -0
- package/dist/testing/fetch-stub.js +24 -0
- package/dist/themes/image.d.ts +18 -0
- package/dist/themes/image.js +117 -0
- package/dist/themes/index.d.ts +4 -0
- package/dist/themes/index.js +4 -0
- package/dist/themes/installer.d.ts +50 -0
- package/dist/themes/installer.js +290 -0
- package/dist/themes/manifest.d.ts +102 -0
- package/dist/themes/manifest.js +86 -0
- package/dist/themes/paths.d.ts +14 -0
- package/dist/themes/paths.js +33 -0
- package/dist/tool-system/browser-bridge.d.ts +53 -11
- package/dist/tool-system/browser-bridge.js +8 -9
- package/dist/tool-system/builtin/agent-heartbeat.d.ts +2 -2
- package/dist/tool-system/builtin/agent-heartbeat.js +20 -6
- package/dist/tool-system/builtin/agent-notifications.d.ts +127 -72
- package/dist/tool-system/builtin/agent-notifications.js +291 -101
- package/dist/tool-system/builtin/agent-output-file.js +1 -3
- package/dist/tool-system/builtin/agent-progress.d.ts +6 -0
- package/dist/tool-system/builtin/agent-progress.js +83 -0
- package/dist/tool-system/builtin/agent-registry.d.ts +38 -2
- package/dist/tool-system/builtin/agent-registry.js +178 -9
- package/dist/tool-system/builtin/agent-transcript-translator.js +1 -1
- package/dist/tool-system/builtin/agent.d.ts +2 -0
- package/dist/tool-system/builtin/agent.js +274 -33
- package/dist/tool-system/builtin/background-jobs.d.ts +55 -2
- package/dist/tool-system/builtin/background-jobs.js +96 -4
- package/dist/tool-system/builtin/background-work.d.ts +6 -0
- package/dist/tool-system/builtin/background-work.js +8 -1
- package/dist/tool-system/builtin/bash.js +5 -2
- package/dist/tool-system/builtin/browser-tools.d.ts +6 -3
- package/dist/tool-system/builtin/browser-tools.js +89 -23
- package/dist/tool-system/builtin/edit-model-catalog.d.ts +6 -0
- package/dist/tool-system/builtin/edit-model-catalog.js +172 -12
- package/dist/tool-system/builtin/edit.js +2 -6
- package/dist/tool-system/builtin/file-cache.d.ts +2 -0
- package/dist/tool-system/builtin/file-cache.js +4 -0
- package/dist/tool-system/builtin/generate-image.js +17 -10
- package/dist/tool-system/builtin/generate-video.js +26 -7
- package/dist/tool-system/builtin/grep.js +2 -2
- package/dist/tool-system/builtin/image-uploader.js +7 -1
- package/dist/tool-system/builtin/index.d.ts +32 -7
- package/dist/tool-system/builtin/index.js +237 -167
- package/dist/tool-system/builtin/memory.d.ts +6 -0
- package/dist/tool-system/builtin/memory.js +36 -15
- package/dist/tool-system/builtin/panel.d.ts +9 -0
- package/dist/tool-system/builtin/panel.js +314 -0
- package/dist/tool-system/builtin/read.js +5 -1
- package/dist/tool-system/builtin/send-message-to-session.d.ts +6 -0
- package/dist/tool-system/builtin/send-message-to-session.js +67 -0
- package/dist/tool-system/builtin/sources.d.ts +8 -0
- package/dist/tool-system/builtin/sources.js +137 -0
- package/dist/tool-system/builtin/tool-search.js +7 -2
- package/dist/tool-system/builtin/update-automation-memory.js +2 -0
- package/dist/tool-system/builtin/web-fetch.js +17 -13
- package/dist/tool-system/builtin/web-search.js +1 -3
- package/dist/tool-system/capability-module.d.ts +93 -0
- package/dist/tool-system/capability-module.js +53 -0
- package/dist/tool-system/context.d.ts +77 -19
- package/dist/tool-system/executor.js +75 -50
- package/dist/tool-system/external-tool-exposure.d.ts +60 -0
- package/dist/tool-system/external-tool-exposure.js +304 -0
- package/dist/tool-system/mcp-manager.d.ts +11 -1
- package/dist/tool-system/mcp-manager.js +19 -4
- package/dist/tool-system/mcp-tool-policy.d.ts +9 -0
- package/dist/tool-system/mcp-tool-policy.js +34 -0
- package/dist/tool-system/panel-bridge.d.ts +53 -0
- package/dist/tool-system/panel-bridge.js +1 -0
- package/dist/tool-system/path-policy.js +99 -2
- package/dist/tool-system/permission.d.ts +26 -0
- package/dist/tool-system/permission.js +46 -0
- package/dist/tool-system/registry.d.ts +12 -1
- package/dist/tool-system/registry.js +31 -7
- package/dist/tool-system/sandbox/index.js +3 -8
- package/dist/tool-system/sandbox/seatbelt.js +2 -6
- package/dist/tool-system/session-tool-host.d.ts +139 -0
- package/dist/tool-system/session-tool-host.js +167 -0
- package/dist/tool-system/testing/tool-registry-harness.d.ts +31 -0
- package/dist/tool-system/testing/tool-registry-harness.js +51 -0
- package/dist/tool-system/validation.d.ts +14 -7
- package/dist/tool-system/validation.js +701 -7
- package/dist/types.d.ts +186 -20
- package/dist/{cc-orchestrator → utils}/cwd-normalize.d.ts +1 -0
- package/dist/{cc-orchestrator → utils}/cwd-normalize.js +1 -0
- package/dist/utils/file-mutex.d.ts +65 -0
- package/dist/utils/file-mutex.js +145 -0
- package/dist/utils/json.d.ts +2 -4
- package/dist/utils/json.js +2 -4
- package/dist/utils/lockfile.d.ts +30 -1
- package/dist/utils/lockfile.js +2 -2
- package/dist/utils/secret-scrubber.d.ts +8 -0
- package/dist/utils/secret-scrubber.js +227 -0
- package/dist/utils/toolDisplay.js +1 -1
- package/package.json +20 -5
- package/THIRD_PARTY_NOTICES.md +0 -206
- package/dist/arena/arena.d.ts +0 -45
- package/dist/arena/arena.js +0 -362
- package/dist/arena/context/context-tools.d.ts +0 -16
- package/dist/arena/context/context-tools.js +0 -272
- package/dist/arena/context/within-root.d.ts +0 -7
- package/dist/arena/context/within-root.js +0 -15
- package/dist/arena/detect-mode.d.ts +0 -20
- package/dist/arena/detect-mode.js +0 -78
- package/dist/arena/digest-builder.d.ts +0 -25
- package/dist/arena/digest-builder.js +0 -120
- package/dist/arena/index.d.ts +0 -29
- package/dist/arena/index.js +0 -29
- package/dist/arena/iterate/convergence.d.ts +0 -25
- package/dist/arena/iterate/convergence.js +0 -103
- package/dist/arena/iterate/formats/index.d.ts +0 -22
- package/dist/arena/iterate/formats/index.js +0 -283
- package/dist/arena/iterate/index.d.ts +0 -11
- package/dist/arena/iterate/index.js +0 -9
- package/dist/arena/iterate/iterative-arena.d.ts +0 -23
- package/dist/arena/iterate/iterative-arena.js +0 -237
- package/dist/arena/iterate/parse.d.ts +0 -42
- package/dist/arena/iterate/parse.js +0 -123
- package/dist/arena/iterate/phases/argue.d.ts +0 -22
- package/dist/arena/iterate/phases/argue.js +0 -165
- package/dist/arena/iterate/phases/revise.d.ts +0 -16
- package/dist/arena/iterate/phases/revise.js +0 -62
- package/dist/arena/iterate/phases/tournament.d.ts +0 -34
- package/dist/arena/iterate/phases/tournament.js +0 -113
- package/dist/arena/iterate/tools/web-tools.d.ts +0 -13
- package/dist/arena/iterate/tools/web-tools.js +0 -54
- package/dist/arena/iterate/types.d.ts +0 -152
- package/dist/arena/iterate/types.js +0 -8
- package/dist/arena/ledger.d.ts +0 -47
- package/dist/arena/ledger.js +0 -159
- package/dist/arena/lenses/architecture.d.ts +0 -5
- package/dist/arena/lenses/architecture.js +0 -22
- package/dist/arena/lenses/engineering.d.ts +0 -5
- package/dist/arena/lenses/engineering.js +0 -22
- package/dist/arena/lenses/general.d.ts +0 -5
- package/dist/arena/lenses/general.js +0 -20
- package/dist/arena/lenses/index.d.ts +0 -16
- package/dist/arena/lenses/index.js +0 -47
- package/dist/arena/lenses/product.d.ts +0 -5
- package/dist/arena/lenses/product.js +0 -22
- package/dist/arena/model-presets.d.ts +0 -23
- package/dist/arena/model-presets.js +0 -44
- package/dist/arena/phases/adjudication.d.ts +0 -25
- package/dist/arena/phases/adjudication.js +0 -142
- package/dist/arena/phases/build-consensus.d.ts +0 -30
- package/dist/arena/phases/build-consensus.js +0 -85
- package/dist/arena/phases/claim-registry.d.ts +0 -26
- package/dist/arena/phases/claim-registry.js +0 -60
- package/dist/arena/phases/cross-review.d.ts +0 -47
- package/dist/arena/phases/cross-review.js +0 -224
- package/dist/arena/phases/debate-rounds.d.ts +0 -28
- package/dist/arena/phases/debate-rounds.js +0 -161
- package/dist/arena/phases/participant-research.d.ts +0 -39
- package/dist/arena/phases/participant-research.js +0 -316
- package/dist/arena/phases/planning-detail-expansion.d.ts +0 -39
- package/dist/arena/phases/planning-detail-expansion.js +0 -120
- package/dist/arena/planner.d.ts +0 -28
- package/dist/arena/planner.js +0 -312
- package/dist/arena/providers/docs.d.ts +0 -7
- package/dist/arena/providers/docs.js +0 -111
- package/dist/arena/providers/git.d.ts +0 -8
- package/dist/arena/providers/git.js +0 -174
- package/dist/arena/providers/index.d.ts +0 -32
- package/dist/arena/providers/index.js +0 -132
- package/dist/arena/providers/none.d.ts +0 -7
- package/dist/arena/providers/none.js +0 -11
- package/dist/arena/providers/repo.d.ts +0 -7
- package/dist/arena/providers/repo.js +0 -258
- package/dist/arena/render/session.d.ts +0 -17
- package/dist/arena/render/session.js +0 -190
- package/dist/arena/render/terminal.d.ts +0 -34
- package/dist/arena/render/terminal.js +0 -286
- package/dist/arena/strategies/discussion.d.ts +0 -25
- package/dist/arena/strategies/discussion.js +0 -143
- package/dist/arena/strategies/index.d.ts +0 -15
- package/dist/arena/strategies/index.js +0 -28
- package/dist/arena/strategies/language-wrapper.d.ts +0 -17
- package/dist/arena/strategies/language-wrapper.js +0 -102
- package/dist/arena/strategies/lens-wrapper.d.ts +0 -16
- package/dist/arena/strategies/lens-wrapper.js +0 -236
- package/dist/arena/strategies/planning.d.ts +0 -30
- package/dist/arena/strategies/planning.js +0 -225
- package/dist/arena/strategies/review.d.ts +0 -26
- package/dist/arena/strategies/review.js +0 -168
- package/dist/arena/strategies/utils.d.ts +0 -36
- package/dist/arena/strategies/utils.js +0 -603
- package/dist/arena/tools/selector.d.ts +0 -17
- package/dist/arena/tools/selector.js +0 -61
- package/dist/arena/transitions.d.ts +0 -53
- package/dist/arena/transitions.js +0 -97
- package/dist/arena/types.d.ts +0 -518
- package/dist/arena/types.js +0 -27
- package/dist/cc-orchestrator/agent-adapter.d.ts +0 -54
- package/dist/cc-orchestrator/agent-adapter.js +0 -143
- package/dist/cc-orchestrator/cc-capability.d.ts +0 -19
- package/dist/cc-orchestrator/cc-capability.js +0 -53
- package/dist/cc-orchestrator/codex-session-discovery.d.ts +0 -24
- package/dist/cc-orchestrator/codex-session-discovery.js +0 -191
- package/dist/cc-orchestrator/codex-session-history.d.ts +0 -38
- package/dist/cc-orchestrator/codex-session-history.js +0 -247
- package/dist/cc-orchestrator/external-agent-bindings.d.ts +0 -27
- package/dist/cc-orchestrator/external-agent-bindings.js +0 -150
- package/dist/cc-orchestrator/external-agent-changes.d.ts +0 -19
- package/dist/cc-orchestrator/external-agent-changes.js +0 -231
- package/dist/cc-orchestrator/external-agent-driver.d.ts +0 -19
- package/dist/cc-orchestrator/external-agent-driver.js +0 -284
- package/dist/cc-orchestrator/external-agent-session-store.d.ts +0 -23
- package/dist/cc-orchestrator/external-agent-session-store.js +0 -146
- package/dist/cc-orchestrator/index.d.ts +0 -8
- package/dist/cc-orchestrator/index.js +0 -8
- package/dist/cc-orchestrator/relevance-judge.d.ts +0 -15
- package/dist/cc-orchestrator/relevance-judge.js +0 -29
- package/dist/cc-orchestrator/session-discovery.d.ts +0 -46
- package/dist/cc-orchestrator/session-discovery.js +0 -125
- package/dist/cc-orchestrator/session-history.d.ts +0 -54
- package/dist/cc-orchestrator/session-history.js +0 -150
- package/dist/cron/cron-runtime.d.ts +0 -2
- package/dist/cron/cron-runtime.js +0 -2
- package/dist/cron/cron-store.d.ts +0 -2
- package/dist/cron/cron-store.js +0 -2
- package/dist/cron/scheduler.d.ts +0 -7
- package/dist/cron/scheduler.js +0 -7
- package/dist/engine/goal.js +0 -206
- package/dist/external-agents/config.d.ts +0 -2
- package/dist/external-agents/config.js +0 -15
- package/dist/external-agents/types.d.ts +0 -31
- package/dist/git/parse-log.d.ts +0 -13
- package/dist/git/parse-log.js +0 -21
- package/dist/git/utils.d.ts +0 -49
- package/dist/git/utils.js +0 -161
- package/dist/git/worktree/crud.d.ts +0 -72
- package/dist/git/worktree/crud.js +0 -235
- package/dist/git/worktree/diff.d.ts +0 -14
- package/dist/git/worktree/diff.js +0 -82
- package/dist/git/worktree/git-exec.d.ts +0 -7
- package/dist/git/worktree/git-exec.js +0 -87
- package/dist/git/worktree/index.d.ts +0 -5
- package/dist/git/worktree/index.js +0 -5
- package/dist/git/worktree/query.d.ts +0 -43
- package/dist/git/worktree/query.js +0 -128
- package/dist/git/worktree/slug.d.ts +0 -11
- package/dist/git/worktree/slug.js +0 -58
- package/dist/git/worktree.d.ts +0 -1
- package/dist/git/worktree.js +0 -5
- package/dist/lsp/client.d.ts +0 -41
- package/dist/lsp/client.js +0 -186
- package/dist/lsp/manager.d.ts +0 -40
- package/dist/lsp/manager.js +0 -155
- package/dist/lsp/root-path.d.ts +0 -9
- package/dist/lsp/root-path.js +0 -12
- package/dist/lsp/servers.d.ts +0 -16
- package/dist/lsp/servers.js +0 -60
- package/dist/prompt/sections/coding.md +0 -35
- package/dist/quota/credentials.d.ts +0 -3
- package/dist/quota/credentials.js +0 -80
- package/dist/quota/index.d.ts +0 -36
- package/dist/quota/index.js +0 -155
- package/dist/quota/types.d.ts +0 -48
- package/dist/quota/types.js +0 -13
- package/dist/review/review-prompt.d.ts +0 -28
- package/dist/review/review-prompt.js +0 -81
- package/dist/state.d.ts +0 -160
- package/dist/state.js +0 -267
- package/dist/tool-system/builtin/apply-patch/applier.d.ts +0 -26
- package/dist/tool-system/builtin/apply-patch/applier.js +0 -308
- package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +0 -10
- package/dist/tool-system/builtin/apply-patch/backup-targets.js +0 -30
- package/dist/tool-system/builtin/apply-patch/index.d.ts +0 -20
- package/dist/tool-system/builtin/apply-patch/index.js +0 -105
- package/dist/tool-system/builtin/apply-patch/parser.d.ts +0 -17
- package/dist/tool-system/builtin/apply-patch/parser.js +0 -212
- package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +0 -18
- package/dist/tool-system/builtin/apply-patch/seek-sequence.js +0 -123
- package/dist/tool-system/builtin/apply-patch/types.d.ts +0 -49
- package/dist/tool-system/builtin/apply-patch/types.js +0 -13
- package/dist/tool-system/builtin/arena.d.ts +0 -31
- package/dist/tool-system/builtin/arena.js +0 -416
- package/dist/tool-system/builtin/brief.d.ts +0 -6
- package/dist/tool-system/builtin/brief.js +0 -41
- package/dist/tool-system/builtin/check-quota.d.ts +0 -15
- package/dist/tool-system/builtin/check-quota.js +0 -34
- package/dist/tool-system/builtin/drive-claude-code.d.ts +0 -51
- package/dist/tool-system/builtin/drive-claude-code.js +0 -698
- package/dist/tool-system/builtin/lsp.d.ts +0 -7
- package/dist/tool-system/builtin/lsp.js +0 -144
- package/dist/tool-system/builtin/notebook-edit.d.ts +0 -7
- package/dist/tool-system/builtin/notebook-edit.js +0 -127
- package/dist/tool-system/builtin/worktree.d.ts +0 -11
- package/dist/tool-system/builtin/worktree.js +0 -363
- /package/dist/{external-agents → links}/types.js +0 -0
- /package/dist/{engine/session-usage.d.ts → session/usage.d.ts} +0 -0
- /package/dist/{engine/session-usage.js → session/usage.js} +0 -0
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { setMaxListeners } from "node:events";
|
|
5
5
|
import { resolve as resolvePath, isAbsolute as isAbsolutePath } from "node:path";
|
|
6
|
+
import { isMcpToolNameAllowed, isRegisteredMcpToolAllowed } from "./mcp-tool-policy.js";
|
|
6
7
|
import { classifyBashCommand } from "./permission.js";
|
|
7
8
|
import { ToolNotFoundError } from "../exceptions.js";
|
|
8
9
|
import { logger as rootLogger, getCurrentSid } from "../logging/logger.js";
|
|
@@ -10,8 +11,6 @@ import { recordToolCall, recordToolResult } from "../logging/session-recorder.js
|
|
|
10
11
|
import { validateToolArgs } from "./validation.js";
|
|
11
12
|
import { PLAN_MODE_ALLOWED_TOOLS } from "./plan-mode-allowlist.js";
|
|
12
13
|
import { attachFinalWritePathSnapshot, enforcePathPolicyWithApproval, } from "./path-policy.js";
|
|
13
|
-
import { parsePatch } from "./builtin/apply-patch/parser.js";
|
|
14
|
-
import { BUILTIN_TOOL_GUARDS } from "./builtin/index.js";
|
|
15
14
|
import { COMPLETE_GOAL_TOOL_NAME } from "./builtin/complete-goal.js";
|
|
16
15
|
import { CANCEL_GOAL_TOOL_NAME } from "./builtin/cancel-goal.js";
|
|
17
16
|
import { toolResultDisplayText } from "./tool-result-redaction.js";
|
|
@@ -119,6 +118,14 @@ export class ToolExecutor {
|
|
|
119
118
|
isError: true,
|
|
120
119
|
};
|
|
121
120
|
}
|
|
121
|
+
if (this.toolCtx?.allowedToolNames && !this.toolCtx.allowedToolNames.has(call.toolName)) {
|
|
122
|
+
return {
|
|
123
|
+
id: call.id,
|
|
124
|
+
toolName: call.toolName,
|
|
125
|
+
error: `Tool ${call.toolName} is not allowed by this run profile. Do NOT retry this tool call.`,
|
|
126
|
+
isError: true,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
122
129
|
// 0. Capability override: a builtin the project marked `off` is HIDDEN from
|
|
123
130
|
// the model's tool list (engine.ts applyBuiltinOverrideVisibility), but the
|
|
124
131
|
// model can still NAME it (hallucination, or a remembered earlier turn). The
|
|
@@ -142,7 +149,7 @@ export class ToolExecutor {
|
|
|
142
149
|
isError: true,
|
|
143
150
|
};
|
|
144
151
|
}
|
|
145
|
-
const visibilityGuard =
|
|
152
|
+
const visibilityGuard = this.registry.getAvailabilityGuard(call.toolName);
|
|
146
153
|
if (visibilityGuard &&
|
|
147
154
|
this.toolCtx?.toolVisibility &&
|
|
148
155
|
!visibilityGuard(this.toolCtx.toolVisibility)) {
|
|
@@ -167,6 +174,19 @@ export class ToolExecutor {
|
|
|
167
174
|
isError: true,
|
|
168
175
|
};
|
|
169
176
|
}
|
|
177
|
+
if (reg?.source === "mcp" &&
|
|
178
|
+
!isRegisteredMcpToolAllowed({
|
|
179
|
+
source: "mcp",
|
|
180
|
+
serverName: reg.serverName,
|
|
181
|
+
mcpToolName: reg.mcpToolName,
|
|
182
|
+
}, this.toolCtx.mcpToolPolicies)) {
|
|
183
|
+
return {
|
|
184
|
+
id: call.id,
|
|
185
|
+
toolName: call.toolName,
|
|
186
|
+
error: `MCP tool "${reg.mcpToolName ?? call.toolName}" is disabled by this project's tool policy. Do NOT retry this tool call.`,
|
|
187
|
+
isError: true,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
170
190
|
// The generic MCP builtins (MCPTool / ReadMcpResource) take the target
|
|
171
191
|
// server as an ARGUMENT and call MCPManager directly, so the source==="mcp"
|
|
172
192
|
// check above can't see them — without this a session could invoke a tool
|
|
@@ -184,6 +204,17 @@ export class ToolExecutor {
|
|
|
184
204
|
isError: true,
|
|
185
205
|
};
|
|
186
206
|
}
|
|
207
|
+
if (call.toolName === "MCPTool") {
|
|
208
|
+
const tool = String(call.args.tool ?? "");
|
|
209
|
+
if (!isMcpToolNameAllowed(this.toolCtx.mcpToolPolicies, server, tool)) {
|
|
210
|
+
return {
|
|
211
|
+
id: call.id,
|
|
212
|
+
toolName: call.toolName,
|
|
213
|
+
error: `MCP tool "${tool}" is disabled by this project's tool policy. Do NOT retry this tool call.`,
|
|
214
|
+
isError: true,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
}
|
|
187
218
|
}
|
|
188
219
|
else if (call.toolName === "ListMcpResources") {
|
|
189
220
|
const server = String(call.args.server ?? "");
|
|
@@ -520,6 +551,20 @@ export class ToolExecutor {
|
|
|
520
551
|
return op.default;
|
|
521
552
|
}
|
|
522
553
|
async enforceDeclaredPathPolicy(tool, args) {
|
|
554
|
+
if (tool?.pathResolver) {
|
|
555
|
+
let targets;
|
|
556
|
+
try {
|
|
557
|
+
targets = tool.pathResolver.resolve(args, this.toolCtx?.cwd ?? process.cwd());
|
|
558
|
+
}
|
|
559
|
+
catch (err) {
|
|
560
|
+
return `Error: ${err instanceof Error ? err.message : String(err)}`;
|
|
561
|
+
}
|
|
562
|
+
for (const target of targets) {
|
|
563
|
+
const blocked = await enforcePathPolicyWithApproval(target, tool.pathResolver.operation, this.toolCtx);
|
|
564
|
+
if (blocked)
|
|
565
|
+
return blocked;
|
|
566
|
+
}
|
|
567
|
+
}
|
|
523
568
|
const policies = tool?.pathPolicy;
|
|
524
569
|
if (!policies?.length)
|
|
525
570
|
return null;
|
|
@@ -537,55 +582,35 @@ export class ToolExecutor {
|
|
|
537
582
|
return null;
|
|
538
583
|
}
|
|
539
584
|
resolvePathPolicyTargets(policy, args) {
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
// "outside workspace" and over-prompts. Absolute paths pass through.
|
|
548
|
-
const cwd = this.toolCtx?.cwd ?? process.cwd();
|
|
549
|
-
return [isAbsolutePath(raw) ? raw : resolvePath(cwd, raw)];
|
|
550
|
-
}
|
|
551
|
-
// Array path args (e.g. GenerateImage `referenceImages`, GenerateVideo
|
|
552
|
-
// `images`): enforce EVERY element. Without this an array yielded zero
|
|
553
|
-
// targets, so out-of-workspace reads bypassed the path-policy "ask" gate
|
|
554
|
-
// that Read/Write enforce. http(s) URLs aren't file reads → skip them.
|
|
555
|
-
// Relative paths resolve against ctx.cwd (the workspace) before
|
|
556
|
-
// classification, like the apply_patch branch — otherwise classifyPath's
|
|
557
|
-
// process.cwd()-based resolution would mis-place an in-workspace relative
|
|
558
|
-
// path as "outside" and over-prompt. Non-string / empty elements skipped.
|
|
559
|
-
if (Array.isArray(raw)) {
|
|
560
|
-
const cwd = this.toolCtx?.cwd ?? process.cwd();
|
|
561
|
-
const paths = raw
|
|
562
|
-
.filter((v) => typeof v === "string" && v.length > 0)
|
|
563
|
-
.filter((v) => !/^https?:\/\//i.test(v))
|
|
564
|
-
.map((v) => (isAbsolutePath(v) ? v : resolvePath(cwd, v)));
|
|
565
|
-
if (paths.length > 0)
|
|
566
|
-
return paths;
|
|
567
|
-
}
|
|
568
|
-
if (policy.defaultToCwd && this.toolCtx?.cwd)
|
|
569
|
-
return [this.toolCtx.cwd];
|
|
570
|
-
return [];
|
|
571
|
-
}
|
|
572
|
-
const rawPatch = args[policy.arg];
|
|
573
|
-
if (typeof rawPatch !== "string" || rawPatch.length === 0)
|
|
574
|
-
return [];
|
|
575
|
-
try {
|
|
576
|
-
const parsed = parsePatch(rawPatch, "lenient");
|
|
585
|
+
const raw = args[policy.arg];
|
|
586
|
+
if (typeof raw === "string" && raw.length > 0) {
|
|
587
|
+
// Resolve a RELATIVE single-string path arg against ctx.cwd before
|
|
588
|
+
// classification, mirroring the array branch below and the apply_patch
|
|
589
|
+
// branch — otherwise classifyPath's process.cwd()-based resolution
|
|
590
|
+
// mis-places an in-workspace relative path (e.g. Read "src/x.ts") as
|
|
591
|
+
// "outside workspace" and over-prompts. Absolute paths pass through.
|
|
577
592
|
const cwd = this.toolCtx?.cwd ?? process.cwd();
|
|
578
|
-
|
|
579
|
-
for (const hunk of parsed.hunks) {
|
|
580
|
-
targets.push(resolvePath(cwd, hunk.path));
|
|
581
|
-
if (hunk.kind === "update" && hunk.movePath) {
|
|
582
|
-
targets.push(resolvePath(cwd, hunk.movePath));
|
|
583
|
-
}
|
|
584
|
-
}
|
|
585
|
-
return targets;
|
|
593
|
+
return [isAbsolutePath(raw) ? raw : resolvePath(cwd, raw)];
|
|
586
594
|
}
|
|
587
|
-
|
|
588
|
-
|
|
595
|
+
// Array path args (e.g. GenerateImage `referenceImages`, GenerateVideo
|
|
596
|
+
// `images`): enforce EVERY element. Without this an array yielded zero
|
|
597
|
+
// targets, so out-of-workspace reads bypassed the path-policy "ask" gate
|
|
598
|
+
// that Read/Write enforce. http(s) URLs aren't file reads → skip them.
|
|
599
|
+
// Relative paths resolve against ctx.cwd (the workspace) before
|
|
600
|
+
// classification, like the apply_patch branch — otherwise classifyPath's
|
|
601
|
+
// process.cwd()-based resolution would mis-place an in-workspace relative
|
|
602
|
+
// path as "outside" and over-prompt. Non-string / empty elements skipped.
|
|
603
|
+
if (Array.isArray(raw)) {
|
|
604
|
+
const cwd = this.toolCtx?.cwd ?? process.cwd();
|
|
605
|
+
const paths = raw
|
|
606
|
+
.filter((v) => typeof v === "string" && v.length > 0)
|
|
607
|
+
.filter((v) => !/^https?:\/\//i.test(v))
|
|
608
|
+
.map((v) => (isAbsolutePath(v) ? v : resolvePath(cwd, v)));
|
|
609
|
+
if (paths.length > 0)
|
|
610
|
+
return paths;
|
|
589
611
|
}
|
|
612
|
+
if (policy.defaultToCwd && this.toolCtx?.cwd)
|
|
613
|
+
return [this.toolCtx.cwd];
|
|
614
|
+
return [];
|
|
590
615
|
}
|
|
591
616
|
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Host Tool allowlist for external Agent Runtimes.
|
|
3
|
+
*
|
|
4
|
+
* This is a policy artifact, not plumbing. It exists as one reviewable file —
|
|
5
|
+
* rather than scattered through the Claude/Codex adapters — because the design
|
|
6
|
+
* (§9.1) requires each entry to have been risk-reviewed individually, and a
|
|
7
|
+
* reviewer needs to see the whole surface at once.
|
|
8
|
+
*
|
|
9
|
+
* Two rules shape everything here:
|
|
10
|
+
*
|
|
11
|
+
* 1. **Allowlist only.** No "everything in the registry", no prefix matching.
|
|
12
|
+
* A tool absent from this file does not exist for an external runtime.
|
|
13
|
+
* Widening it is an edit to this file, which is the point: it leaves a diff.
|
|
14
|
+
* 2. **Host-loopback tools are special** (§9.3). `Panel`, `Browser`,
|
|
15
|
+
* `SwitchSessionWorkspace` and `InjectCredential` reach back out to a
|
|
16
|
+
* specific Desktop renderer window to do their work. Passing `ToolExecutor`
|
|
17
|
+
* does NOT make them callable — owner routing decides that, and it lives
|
|
18
|
+
* outside the executor. Any such tool needs its owner story argued before it
|
|
19
|
+
* can be listed.
|
|
20
|
+
*
|
|
21
|
+
* ## Why this is much wider than the original phase-one list
|
|
22
|
+
*
|
|
23
|
+
* The first cut exposed exactly one tool (`Panel`). That was not the product of
|
|
24
|
+
* a risk judgement so much as of an ordering: tools were held back until each
|
|
25
|
+
* had an argument written, and only one did. The result was a runtime that
|
|
26
|
+
* could list panels and nothing else — no skills, no memory, no file access —
|
|
27
|
+
* which is not a usable Agent Runtime, and made the feature's real state easy
|
|
28
|
+
* to overstate.
|
|
29
|
+
*
|
|
30
|
+
* The widening below was an explicit product-owner decision. The governing
|
|
31
|
+
* principle it rests on: **every tool here still executes through
|
|
32
|
+
* `ToolExecutor`**, so path policy, project trust, the user's permission rules
|
|
33
|
+
* and the approval UI all still apply. An external runtime holding `Bash` from
|
|
34
|
+
* this list is strictly more governed than the same model calling its own
|
|
35
|
+
* built-in shell, which answers only to the runtime's sandbox. Exposure moves
|
|
36
|
+
* capability from an unobservable authorization domain into the user's.
|
|
37
|
+
*
|
|
38
|
+
* That argument does not extend to everything, and four tools remain excluded
|
|
39
|
+
* for structural reasons rather than caution — see the block below them.
|
|
40
|
+
* `InjectCredential` is the highest-risk entry and depends on an in-tool
|
|
41
|
+
* approval that must stay mandatory; if that ever changes, it goes back out.
|
|
42
|
+
*/
|
|
43
|
+
import type { ExternalToolExposurePolicy } from "./session-tool-host.js";
|
|
44
|
+
/** Why a tool is in (or out of) the first-phase allowlist. */
|
|
45
|
+
export interface ExposureRationale {
|
|
46
|
+
tool: string;
|
|
47
|
+
/** `self-contained` completes in-process; `host-loopback` calls back to a window. */
|
|
48
|
+
kind: "self-contained" | "host-loopback";
|
|
49
|
+
status: "exposed" | "deferred" | "excluded";
|
|
50
|
+
reason: string;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* The audit trail behind {@link FIRST_PHASE_EXPOSURE}. Kept as data so the
|
|
54
|
+
* "excluded" decisions are visible too — a bare allowlist tells a reviewer what
|
|
55
|
+
* was included but not what was considered and rejected, which is the more
|
|
56
|
+
* useful half when judging whether the surface is sound.
|
|
57
|
+
*/
|
|
58
|
+
export declare const FIRST_PHASE_EXPOSURE_RATIONALE: readonly ExposureRationale[];
|
|
59
|
+
/** The phase-one policy. Pass to `createSessionToolHost({ exposure })`. */
|
|
60
|
+
export declare const FIRST_PHASE_EXPOSURE: ExternalToolExposurePolicy;
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The audit trail behind {@link FIRST_PHASE_EXPOSURE}. Kept as data so the
|
|
3
|
+
* "excluded" decisions are visible too — a bare allowlist tells a reviewer what
|
|
4
|
+
* was included but not what was considered and rejected, which is the more
|
|
5
|
+
* useful half when judging whether the surface is sound.
|
|
6
|
+
*/
|
|
7
|
+
export const FIRST_PHASE_EXPOSURE_RATIONALE = [
|
|
8
|
+
{
|
|
9
|
+
tool: "Panel",
|
|
10
|
+
kind: "host-loopback",
|
|
11
|
+
status: "exposed",
|
|
12
|
+
reason: "Only list/open/tools. These are read-or-focus, and they have a broadcast " +
|
|
13
|
+
"fallback, so they work without an owning window. invoke stays out for now " +
|
|
14
|
+
"for a DIFFERENT reason than originally recorded: the owner claim it was " +
|
|
15
|
+
"waiting on now exists and is wired (ExternalRuntimeService claims before " +
|
|
16
|
+
"the runtime starts), so the blocker is no longer technical. What is still " +
|
|
17
|
+
"missing is a per-Panel-App risk review — invoke runs third-party Panel App " +
|
|
18
|
+
"code with whatever arguments the model supplies, and argsPatterns cannot " +
|
|
19
|
+
"constrain a nested payload. Enabling it is a policy decision, not a wiring " +
|
|
20
|
+
"one, and it belongs to whoever reviews the first Panel App to be trusted.",
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
// NOTE the names: there is no tool called "Browser". The registry exposes
|
|
24
|
+
// three separate browser tools, and an allowlist entry for a name that does
|
|
25
|
+
// not exist is silently inert — it neither grants nor denies anything,
|
|
26
|
+
// which is the worst of both (a reviewer reads it as covered).
|
|
27
|
+
tool: "browser_navigate",
|
|
28
|
+
kind: "host-loopback",
|
|
29
|
+
status: "exposed",
|
|
30
|
+
reason: "The browser capability the runtime genuinely lacks — the differentiator, " +
|
|
31
|
+
"not a duplicate — and the owner argument it was waiting on is the same one " +
|
|
32
|
+
"Panel now has: ExternalRuntimeService registers the session and claims the " +
|
|
33
|
+
"owning window before the runtime starts. Stays under ToolExecutor plus the " +
|
|
34
|
+
"user's permission rules; without an owning window it fails closed on " +
|
|
35
|
+
"routing rather than broadcasting.",
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
tool: "browser_observe",
|
|
39
|
+
kind: "host-loopback",
|
|
40
|
+
status: "exposed",
|
|
41
|
+
reason: "Reads page content. Same owner story as browser_navigate, no mutation.",
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
tool: "browser_act",
|
|
45
|
+
kind: "host-loopback",
|
|
46
|
+
status: "exposed",
|
|
47
|
+
reason: "Click / type / interact — the mutating third of the browser surface, and " +
|
|
48
|
+
"the one that combines with InjectCredential to act as the logged-in user. " +
|
|
49
|
+
"Exposed on the product owner's call, under the same ToolExecutor rules as " +
|
|
50
|
+
"every other entry here.",
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
tool: "InjectCredential",
|
|
54
|
+
kind: "host-loopback",
|
|
55
|
+
status: "exposed",
|
|
56
|
+
reason: "Injects saved cookie credentials into the built-in browser to restore a " +
|
|
57
|
+
"login. This is the single highest-risk entry in this file and the one " +
|
|
58
|
+
"reviewers should look at first: it hands a live session cookie to a page, " +
|
|
59
|
+
"and a model that can also drive the Browser can then act as the logged-in " +
|
|
60
|
+
"user. §12.4 excluded credential-bearing tools outright; that blanket rule " +
|
|
61
|
+
"is relaxed here on the product owner's explicit call because credential " +
|
|
62
|
+
"restore is what makes browser automation usable at all. The mitigation is " +
|
|
63
|
+
"NOT the allowlist — it is the tool's own in-tool approval, which stays " +
|
|
64
|
+
"mandatory (see builtin/index.ts) and is never auto-approved for an " +
|
|
65
|
+
"external runtime. If that approval is ever made skippable, this entry must " +
|
|
66
|
+
"go back to excluded.",
|
|
67
|
+
},
|
|
68
|
+
// ── Still excluded, and for a different KIND of reason ───────────
|
|
69
|
+
// The four below are not held back out of caution — widening the allowlist
|
|
70
|
+
// does not make them work. Each is excluded by a structural property that
|
|
71
|
+
// would have to be designed away first, so listing them would produce a tool
|
|
72
|
+
// that is advertised and then fails or misbehaves.
|
|
73
|
+
{
|
|
74
|
+
tool: "Agent",
|
|
75
|
+
kind: "self-contained",
|
|
76
|
+
status: "excluded",
|
|
77
|
+
reason: "Can spawn another agent, so an external runtime could recurse into itself, " +
|
|
78
|
+
"nest approvals, and escape concurrency/budget limits (§12.5). Unlike Bash " +
|
|
79
|
+
"or Browser, this is not a permission question: the recursion has no owner " +
|
|
80
|
+
"and no budget to charge, so exposing it would need a nesting model first.",
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
tool: "DriveAgent",
|
|
84
|
+
kind: "self-contained",
|
|
85
|
+
status: "excluded",
|
|
86
|
+
reason: "Same recursion hazard as Agent (§12.5).",
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
tool: "EnterPlanMode",
|
|
90
|
+
kind: "self-contained",
|
|
91
|
+
status: "excluded",
|
|
92
|
+
reason: "Engine state-machine tool. Exposing it lets the runtime and the Native " +
|
|
93
|
+
"Engine drive each other's plan state (§12.3) — and an external runtime has " +
|
|
94
|
+
"no Engine plan state of its own to enter, so the call has no coherent " +
|
|
95
|
+
"meaning on this path.",
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
tool: "ExitPlanMode",
|
|
99
|
+
kind: "self-contained",
|
|
100
|
+
status: "excluded",
|
|
101
|
+
reason: "Engine state-machine tool; same reason as EnterPlanMode.",
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
tool: "Read",
|
|
105
|
+
kind: "self-contained",
|
|
106
|
+
status: "exposed",
|
|
107
|
+
reason: "Overlaps a tool the runtime already has, which was the original reason to " +
|
|
108
|
+
"exclude it. That reasoning was wrong about which risk matters: the runtime's " +
|
|
109
|
+
"OWN Read answers to the runtime's sandbox, while this one answers to " +
|
|
110
|
+
"ToolExecutor — path policy, project trust and the user's permission rules. " +
|
|
111
|
+
"Exposing it means the model has a reachable path that IS governed by " +
|
|
112
|
+
"CodeShell, which is the point of augmented mode. Naming overlap is a " +
|
|
113
|
+
"presentation problem (the MCP server prefixes its tools); sandbox " +
|
|
114
|
+
"divergence is a security one.",
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
tool: "Bash",
|
|
118
|
+
kind: "self-contained",
|
|
119
|
+
status: "exposed",
|
|
120
|
+
reason: "Same argument as Read, and it is the tool where it matters most: the " +
|
|
121
|
+
"runtime's own shell runs under the runtime's approval policy, which the " +
|
|
122
|
+
"user did not configure and cannot see. Routing a shell call through " +
|
|
123
|
+
"ToolExecutor puts it under the user's own permission rules and the " +
|
|
124
|
+
"approval UI. Note this does NOT remove the runtime's own shell — it adds a " +
|
|
125
|
+
"governed alternative.",
|
|
126
|
+
},
|
|
127
|
+
// ── Skills, memory and planning ──────────────────────────────────
|
|
128
|
+
// These are the reason someone runs a model inside CodeShell rather than in a
|
|
129
|
+
// bare terminal. A runtime that cannot reach them is a stranger in the app: it
|
|
130
|
+
// cannot load the user's skills, cannot recall anything, and forgets the
|
|
131
|
+
// session the moment it ends. Phase one excluded them by omission rather than
|
|
132
|
+
// by argument — no rationale entry existed at all, which is how a surface ends
|
|
133
|
+
// up shipping at 1 tool out of 48 without anyone deciding that.
|
|
134
|
+
{
|
|
135
|
+
tool: "Skill",
|
|
136
|
+
kind: "self-contained",
|
|
137
|
+
status: "exposed",
|
|
138
|
+
reason: "Loads a SKILL.md body and returns it as the tool result — it reads from " +
|
|
139
|
+
"the scanner, never the disk directly, and executes nothing itself. A skill " +
|
|
140
|
+
"body may TELL the model to run commands, but those become ordinary tool " +
|
|
141
|
+
"calls that face the same authorization as any other. Withholding Skill " +
|
|
142
|
+
"does not withhold that capability; it only withholds the user's own " +
|
|
143
|
+
"curated instructions.",
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
tool: "MemoryRead",
|
|
147
|
+
kind: "self-contained",
|
|
148
|
+
status: "exposed",
|
|
149
|
+
reason: "Reads the user's memory store. No side effects.",
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
tool: "MemoryList",
|
|
153
|
+
kind: "self-contained",
|
|
154
|
+
status: "exposed",
|
|
155
|
+
reason: "Enumerates memory entries. No side effects.",
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
tool: "MemorySave",
|
|
159
|
+
kind: "self-contained",
|
|
160
|
+
status: "exposed",
|
|
161
|
+
reason: "Writes to the memory store, so it is a mutation — but a scoped one, into " +
|
|
162
|
+
"a store the user can read and edit, and it carries the same permission " +
|
|
163
|
+
"rules as on the native path.",
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
tool: "MemoryDelete",
|
|
167
|
+
kind: "self-contained",
|
|
168
|
+
status: "exposed",
|
|
169
|
+
reason: "Mutation, same store and same rules as MemorySave.",
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
tool: "TodoWrite",
|
|
173
|
+
kind: "self-contained",
|
|
174
|
+
status: "exposed",
|
|
175
|
+
reason: "Session-scoped task list. Visible to the user, trivially reversible.",
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
tool: "Glob",
|
|
179
|
+
kind: "self-contained",
|
|
180
|
+
status: "exposed",
|
|
181
|
+
reason: "Path search under the same path policy as Read.",
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
tool: "Grep",
|
|
185
|
+
kind: "self-contained",
|
|
186
|
+
status: "exposed",
|
|
187
|
+
reason: "Content search under the same path policy as Read.",
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
tool: "Write",
|
|
191
|
+
kind: "self-contained",
|
|
192
|
+
status: "exposed",
|
|
193
|
+
reason: "File mutation governed by ToolExecutor. Same argument as Bash.",
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
tool: "Edit",
|
|
197
|
+
kind: "self-contained",
|
|
198
|
+
status: "exposed",
|
|
199
|
+
reason: "File mutation governed by ToolExecutor. Same argument as Bash.",
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
tool: "WebSearch",
|
|
203
|
+
kind: "self-contained",
|
|
204
|
+
status: "exposed",
|
|
205
|
+
reason: "Read-only network lookup; already available to the model by other means.",
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
tool: "WebFetch",
|
|
209
|
+
kind: "self-contained",
|
|
210
|
+
status: "exposed",
|
|
211
|
+
reason: "Read-only fetch, subject to the same URL handling as the native path.",
|
|
212
|
+
},
|
|
213
|
+
];
|
|
214
|
+
/**
|
|
215
|
+
* Action-level narrowing for tools that multiplex several operations behind one
|
|
216
|
+
* name. Anchored automatically — see `matchesWholeValue`.
|
|
217
|
+
*
|
|
218
|
+
* This is a second, independent layer from the tool's own
|
|
219
|
+
* `defaultPermissionRules`: those decide allow/ask for a call that IS permitted,
|
|
220
|
+
* while this decides whether the action is reachable from an external runtime at
|
|
221
|
+
* all. Both are narrowed to read-only actions in phase one, and `Panel.invoke`
|
|
222
|
+
* additionally fails closed on owner routing — three independent barriers, by
|
|
223
|
+
* design.
|
|
224
|
+
*/
|
|
225
|
+
const FIRST_PHASE_ARGS_PATTERNS = new Map([
|
|
226
|
+
// Panel.invoke remains the one action-level restriction. It runs third-party
|
|
227
|
+
// Panel App code with whatever arguments the model supplies, and argsPatterns
|
|
228
|
+
// cannot constrain a nested payload — so unlike every tool widened above, the
|
|
229
|
+
// authorization layer genuinely cannot see what is being authorized. Enabling
|
|
230
|
+
// it belongs to whoever reviews the first Panel App to be trusted.
|
|
231
|
+
["Panel", { action: "list|open|tools" }],
|
|
232
|
+
]);
|
|
233
|
+
/**
|
|
234
|
+
* `ReadonlySet` / `ReadonlyMap` are compile-time only — the underlying `Set` and
|
|
235
|
+
* `Map` stay mutable at runtime, and this policy is a process-wide singleton read
|
|
236
|
+
* live on every `execute()`. Without this, one `argsPatterns.delete("Panel")`
|
|
237
|
+
* anywhere in the process would re-enable `Panel.invoke` for every already-running
|
|
238
|
+
* host: exactly the capability held back pending the §9.3.2 owner claim.
|
|
239
|
+
*/
|
|
240
|
+
function reject() {
|
|
241
|
+
throw new TypeError("The external tool exposure policy is frozen and cannot be widened.");
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Hand out a plain object implementing the read half of `Set`, not a real `Set`.
|
|
245
|
+
*
|
|
246
|
+
* Shadowing `add`/`delete`/`clear` on a `Set` is not enough: the prototype method
|
|
247
|
+
* is still reachable (`Set.prototype.add.call(policySet, "Bash")`), and `delete
|
|
248
|
+
* s.add` un-shadows it. Returning a non-`Set` object removes the mutators
|
|
249
|
+
* entirely — there is no `Set` internal slot to target — and `Object.freeze`
|
|
250
|
+
* stops the read methods from being swapped out.
|
|
251
|
+
*/
|
|
252
|
+
function frozenSet(values) {
|
|
253
|
+
const inner = new Set(values);
|
|
254
|
+
const view = Object.freeze({
|
|
255
|
+
has: (value) => inner.has(value),
|
|
256
|
+
get size() {
|
|
257
|
+
return inner.size;
|
|
258
|
+
},
|
|
259
|
+
keys: () => inner.keys(),
|
|
260
|
+
values: () => inner.values(),
|
|
261
|
+
entries: () => inner.entries(),
|
|
262
|
+
// Pass the VIEW as the third argument, never `inner`. Set.prototype.forEach
|
|
263
|
+
// hands the callback the collection itself, so forwarding `inner` would leak
|
|
264
|
+
// a live mutable handle to the very object this wrapper exists to protect —
|
|
265
|
+
// `policy.forEach((_a, _b, s) => s.add("Bash"))` would widen it in one line,
|
|
266
|
+
// through the public frozen API, with no prototype tricks at all.
|
|
267
|
+
forEach: (fn, thisArg) => inner.forEach((a, b) => fn.call(thisArg, a, b, view)),
|
|
268
|
+
[Symbol.iterator]: () => inner[Symbol.iterator](),
|
|
269
|
+
add: reject,
|
|
270
|
+
delete: reject,
|
|
271
|
+
clear: reject,
|
|
272
|
+
});
|
|
273
|
+
return view;
|
|
274
|
+
}
|
|
275
|
+
/** Same reasoning as {@link frozenSet}, for the args-pattern map. */
|
|
276
|
+
function frozenMap(entries) {
|
|
277
|
+
const inner = new Map(entries);
|
|
278
|
+
const view = Object.freeze({
|
|
279
|
+
get: (key) => inner.get(key),
|
|
280
|
+
has: (key) => inner.has(key),
|
|
281
|
+
get size() {
|
|
282
|
+
return inner.size;
|
|
283
|
+
},
|
|
284
|
+
keys: () => inner.keys(),
|
|
285
|
+
values: () => inner.values(),
|
|
286
|
+
entries: () => inner.entries(),
|
|
287
|
+
// See frozenSet.forEach — arg 3 must be the view, not `inner`.
|
|
288
|
+
forEach: (fn, thisArg) => inner.forEach((v, k) => fn.call(thisArg, v, k, view)),
|
|
289
|
+
[Symbol.iterator]: () => inner[Symbol.iterator](),
|
|
290
|
+
set: reject,
|
|
291
|
+
delete: reject,
|
|
292
|
+
clear: reject,
|
|
293
|
+
});
|
|
294
|
+
return view;
|
|
295
|
+
}
|
|
296
|
+
/** The phase-one policy. Pass to `createSessionToolHost({ exposure })`. */
|
|
297
|
+
export const FIRST_PHASE_EXPOSURE = Object.freeze({
|
|
298
|
+
mode: "allowlist",
|
|
299
|
+
toolNames: frozenSet(FIRST_PHASE_EXPOSURE_RATIONALE.filter((entry) => entry.status === "exposed").map((entry) => entry.tool)),
|
|
300
|
+
argsPatterns: frozenMap([...FIRST_PHASE_ARGS_PATTERNS].map(([tool, patterns]) => [
|
|
301
|
+
tool,
|
|
302
|
+
Object.freeze({ ...patterns }),
|
|
303
|
+
])),
|
|
304
|
+
});
|
|
@@ -79,6 +79,16 @@ export declare function spillMcpImage(serverName: string, toolName: string, base
|
|
|
79
79
|
export declare function wrapMcpOutput(serverName: string, toolName: string, body: string): string;
|
|
80
80
|
export declare function stripInternalToolArgs(args: Record<string, unknown>): Record<string, unknown>;
|
|
81
81
|
export declare function buildRegisteredTool(serverName: string, tool: McpTool): RegisteredTool;
|
|
82
|
+
/**
|
|
83
|
+
* Per-server outcome of a connectAll() sweep (see the optional onServerEvent
|
|
84
|
+
* parameter). The engine forwards these onto the `notification` hook so hosts
|
|
85
|
+
* and plugins can surface MCP availability without polling.
|
|
86
|
+
*/
|
|
87
|
+
export interface McpServerLifecycleEvent {
|
|
88
|
+
type: "mcp_server_connected" | "mcp_server_failed";
|
|
89
|
+
server: string;
|
|
90
|
+
error?: string;
|
|
91
|
+
}
|
|
82
92
|
export declare class MCPManager {
|
|
83
93
|
private readonly toolRegistry;
|
|
84
94
|
private static instance;
|
|
@@ -104,7 +114,7 @@ export declare class MCPManager {
|
|
|
104
114
|
/**
|
|
105
115
|
* Connect to all configured MCP servers and register their tools.
|
|
106
116
|
*/
|
|
107
|
-
connectAll(servers: Record<string, MCPServerConfig>, owner?: unknown): Promise<void>;
|
|
117
|
+
connectAll(servers: Record<string, MCPServerConfig>, owner?: unknown, onServerEvent?: (event: McpServerLifecycleEvent) => void): Promise<void>;
|
|
108
118
|
reconcile(servers: Record<string, MCPServerConfig>, owner?: unknown): Promise<void>;
|
|
109
119
|
/**
|
|
110
120
|
* Remove one owner from the shared desired-server pool and disconnect servers
|
|
@@ -174,6 +174,9 @@ export function createMcpAuthenticatedFetch(serverName, config, access = getCred
|
|
|
174
174
|
}
|
|
175
175
|
token = (await access.resolveOAuthAccess({ id: credentialId, scope: "full" })).accessToken;
|
|
176
176
|
}
|
|
177
|
+
// The SDK and Bun can contribute distinct undici-compatible Request types.
|
|
178
|
+
// Normalize once at the adapter boundary instead of leaking that ambient
|
|
179
|
+
// declaration mismatch through the authentication/replay logic.
|
|
177
180
|
const source = new Request(input, init);
|
|
178
181
|
let replayable = true;
|
|
179
182
|
try {
|
|
@@ -184,12 +187,14 @@ export function createMcpAuthenticatedFetch(serverName, config, access = getCred
|
|
|
184
187
|
}
|
|
185
188
|
const send = async (accessToken) => {
|
|
186
189
|
const request = replayable ? source.clone() : source;
|
|
187
|
-
const requestHeaders = new Headers(request.headers);
|
|
190
|
+
const requestHeaders = new Headers(Array.from(request.headers.entries()));
|
|
188
191
|
for (const [name, value] of Object.entries(headers))
|
|
189
192
|
requestHeaders.set(name, value);
|
|
190
193
|
if (accessToken)
|
|
191
194
|
requestHeaders.set("Authorization", `Bearer ${accessToken}`);
|
|
192
|
-
return baseFetch(new Request(request, {
|
|
195
|
+
return baseFetch(new Request(request, {
|
|
196
|
+
headers: Array.from(requestHeaders.entries()),
|
|
197
|
+
}));
|
|
193
198
|
};
|
|
194
199
|
const first = await send(token);
|
|
195
200
|
if (first.status !== 401 || !isOAuth || !credentialId || !replayable || source.signal.aborted) {
|
|
@@ -345,6 +350,7 @@ export function buildRegisteredTool(serverName, tool) {
|
|
|
345
350
|
},
|
|
346
351
|
source: "mcp",
|
|
347
352
|
serverName,
|
|
353
|
+
mcpToolName: tool.name,
|
|
348
354
|
permissionDefault: "ask",
|
|
349
355
|
isConcurrencySafe: readOnly,
|
|
350
356
|
isReadOnly: readOnly,
|
|
@@ -383,7 +389,7 @@ export class MCPManager {
|
|
|
383
389
|
/**
|
|
384
390
|
* Connect to all configured MCP servers and register their tools.
|
|
385
391
|
*/
|
|
386
|
-
async connectAll(servers, owner) {
|
|
392
|
+
async connectAll(servers, owner, onServerEvent) {
|
|
387
393
|
const enabledNames = this.enabledServerNames(servers);
|
|
388
394
|
// Register this owner's desired set up front (see reconcile's shared-pool
|
|
389
395
|
// note) so a later reconcile from ANOTHER session can't disconnect servers
|
|
@@ -410,12 +416,21 @@ export class MCPManager {
|
|
|
410
416
|
const results = await Promise.allSettled(entries.map(([name, config]) => this.connect(name, config)));
|
|
411
417
|
for (let i = 0; i < results.length; i++) {
|
|
412
418
|
const result = results[i];
|
|
419
|
+
const server = entries[i][0];
|
|
413
420
|
if (result.status === "rejected") {
|
|
414
421
|
logger.warn("mcp.connect_failed", {
|
|
415
|
-
server
|
|
422
|
+
server,
|
|
416
423
|
error: result.reason.message,
|
|
417
424
|
});
|
|
418
425
|
}
|
|
426
|
+
try {
|
|
427
|
+
onServerEvent?.(result.status === "rejected"
|
|
428
|
+
? { type: "mcp_server_failed", server, error: result.reason.message }
|
|
429
|
+
: { type: "mcp_server_connected", server });
|
|
430
|
+
}
|
|
431
|
+
catch {
|
|
432
|
+
/* observers must not affect connection handling */
|
|
433
|
+
}
|
|
419
434
|
}
|
|
420
435
|
}
|
|
421
436
|
async reconcile(servers, owner) {
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { MCPServerConfig, RegisteredTool } from "../types.js";
|
|
2
|
+
export interface McpToolPolicy {
|
|
3
|
+
/** Undefined means every tool is eligible before the denylist is applied. */
|
|
4
|
+
allowedTools?: ReadonlySet<string>;
|
|
5
|
+
disabledTools: ReadonlySet<string>;
|
|
6
|
+
}
|
|
7
|
+
export declare function buildMcpToolPolicies(servers: Record<string, MCPServerConfig>): ReadonlyMap<string, McpToolPolicy>;
|
|
8
|
+
export declare function isMcpToolNameAllowed(policies: ReadonlyMap<string, McpToolPolicy> | undefined, serverName: string, toolName: string): boolean;
|
|
9
|
+
export declare function isRegisteredMcpToolAllowed(tool: Pick<RegisteredTool, "source" | "serverName" | "mcpToolName">, policies: ReadonlyMap<string, McpToolPolicy> | undefined): boolean;
|