@cjhyy/code-shell-core 0.7.0 → 0.8.0
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 +20 -5
- package/dist/context/compaction.d.ts +39 -3
- package/dist/context/compaction.js +151 -39
- package/dist/context/manager.d.ts +20 -4
- package/dist/context/manager.js +42 -7
- package/dist/context/token-counter.js +5 -3
- package/dist/context/tool-result-storage.d.ts +6 -0
- package/dist/context/tool-result-storage.js +25 -4
- package/dist/credentials/access.d.ts +13 -2
- package/dist/credentials/access.js +99 -4
- package/dist/credentials/index.d.ts +3 -2
- package/dist/credentials/index.js +2 -1
- package/dist/credentials/oauth.d.ts +9 -1
- package/dist/credentials/oauth.js +80 -1
- package/dist/credentials/store.d.ts +16 -2
- package/dist/credentials/store.js +33 -11
- package/dist/credentials/types.d.ts +62 -1
- package/dist/credentials/types.js +16 -1
- 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 +272 -184
- package/dist/engine/engine.js +1869 -1864
- 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/session-title.d.ts +2 -1
- package/dist/engine/session-title.js +4 -1
- 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 +67 -10
- package/dist/engine/turn-loop.js +538 -97
- package/dist/engine/types.d.ts +35 -4
- package/dist/engine/types.js +1 -1
- package/dist/{engine/goal.d.ts → goal/lifecycle.d.ts} +80 -6
- package/dist/goal/lifecycle.js +482 -0
- package/dist/hooks/events.d.ts +26 -9
- package/dist/hooks/events.js +0 -3
- package/dist/hooks/goal-stop-hook.d.ts +28 -29
- package/dist/hooks/goal-stop-hook.js +344 -144
- package/dist/hooks/registry.js +4 -1
- package/dist/hooks/shell-runner.d.ts +12 -1
- package/dist/hooks/shell-runner.js +160 -9
- package/dist/index.d.ts +51 -110
- 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 +37 -125
- 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 +72 -10
- 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/llm/types.d.ts +12 -5
- 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 +10 -4
- package/dist/plugins/pluginCommandHook.js +133 -18
- 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 +77 -3
- package/dist/protocol/chat-session-manager.js +194 -18
- package/dist/protocol/chat-session.d.ts +72 -9
- package/dist/protocol/chat-session.js +151 -16
- package/dist/protocol/client.d.ts +37 -4
- package/dist/protocol/client.js +118 -6
- 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 +152 -14
- package/dist/protocol/server.js +1574 -229
- package/dist/protocol/types.d.ts +182 -32
- package/dist/protocol/types.js +18 -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.d.ts +3 -0
- package/dist/services/dream-consolidation.js +14 -2
- package/dist/services/index.d.ts +1 -1
- package/dist/services/index.js +1 -1
- package/dist/services/memory-orchestrator.js +6 -2
- package/dist/services/oauth.d.ts +34 -10
- package/dist/services/oauth.js +236 -98
- 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 +208 -25
- package/dist/session/session-manager.js +1232 -116
- package/dist/session/session-message.d.ts +22 -0
- package/dist/session/session-message.js +1 -0
- package/dist/session/transcript.d.ts +76 -6
- package/dist/session/transcript.js +278 -7
- 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 +279 -34
- package/dist/tool-system/builtin/background-jobs.d.ts +63 -7
- package/dist/tool-system/builtin/background-jobs.js +111 -15
- package/dist/tool-system/builtin/background-work.d.ts +12 -1
- package/dist/tool-system/builtin/background-work.js +12 -1
- package/dist/tool-system/builtin/bash.d.ts +3 -5
- package/dist/tool-system/builtin/bash.js +14 -6
- package/dist/tool-system/builtin/browser-tools.d.ts +8 -5
- 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.d.ts +2 -1
- package/dist/tool-system/builtin/edit.js +14 -10
- 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.d.ts +4 -0
- package/dist/tool-system/builtin/generate-video.js +164 -28
- package/dist/tool-system/builtin/glob.d.ts +2 -1
- package/dist/tool-system/builtin/glob.js +28 -3
- package/dist/tool-system/builtin/grep.d.ts +1 -0
- package/dist/tool-system/builtin/grep.js +82 -17
- package/dist/tool-system/builtin/image-uploader.js +7 -1
- package/dist/tool-system/builtin/index.d.ts +57 -18
- package/dist/tool-system/builtin/index.js +280 -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/video-providers.d.ts +12 -15
- package/dist/tool-system/builtin/video-providers.js +1 -0
- package/dist/tool-system/builtin/view-image.d.ts +2 -2
- package/dist/tool-system/builtin/web-fetch.js +60 -15
- package/dist/tool-system/builtin/web-search.js +1 -3
- package/dist/tool-system/builtin/write.d.ts +2 -1
- package/dist/tool-system/builtin/write.js +14 -4
- 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 +94 -24
- package/dist/tool-system/executor.js +99 -58
- 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 +17 -1
- package/dist/tool-system/mcp-manager.js +72 -7
- 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.d.ts +19 -0
- package/dist/tool-system/path-policy.js +62 -1
- package/dist/tool-system/permission.d.ts +69 -3
- package/dist/tool-system/permission.js +429 -30
- package/dist/tool-system/registry.d.ts +15 -3
- package/dist/tool-system/registry.js +82 -40
- 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 +201 -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 -43
- package/dist/arena/arena.js +0 -333
- 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 -24
- package/dist/arena/phases/adjudication.js +0 -141
- package/dist/arena/phases/build-consensus.d.ts +0 -29
- package/dist/arena/phases/build-consensus.js +0 -83
- 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 -45
- package/dist/arena/phases/cross-review.js +0 -218
- package/dist/arena/phases/debate-rounds.d.ts +0 -27
- package/dist/arena/phases/debate-rounds.js +0 -159
- package/dist/arena/phases/participant-research.d.ts +0 -38
- package/dist/arena/phases/participant-research.js +0 -314
- package/dist/arena/phases/planning-detail-expansion.d.ts +0 -38
- package/dist/arena/phases/planning-detail-expansion.js +0 -119
- package/dist/arena/planner.d.ts +0 -27
- package/dist/arena/planner.js +0 -311
- 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 -514
- 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 -69
- package/dist/git/worktree/crud.js +0 -206
- 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 -51
- 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 -42
- package/dist/git/worktree/query.js +0 -121
- 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 -415
- 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 -345
- /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
|
@@ -2,22 +2,26 @@
|
|
|
2
2
|
* Unified tool registry — built-in tools + MCP tools.
|
|
3
3
|
*/
|
|
4
4
|
import { ConfigError, ToolNotFoundError, ToolExecutionError, ToolTimeoutError, } from "../exceptions.js";
|
|
5
|
-
import { BUILTIN_TOOLS } from "./builtin/index.js";
|
|
5
|
+
import { BUILTIN_TOOLS, toToolExecutionResult, } from "./builtin/index.js";
|
|
6
6
|
import { validateToolMetadata } from "./validate-tool-metadata.js";
|
|
7
7
|
/**
|
|
8
8
|
* Default execution timeout for any tool that does not declare its own
|
|
9
9
|
* timeoutMs at registration time. Tools that need to run longer (Agent,
|
|
10
|
-
*
|
|
10
|
+
* Bash, or custom capability tools) should set timeoutMs explicitly.
|
|
11
11
|
*/
|
|
12
12
|
export const DEFAULT_TOOL_TIMEOUT_MS = 120_000;
|
|
13
13
|
export class ToolRegistry {
|
|
14
14
|
tools = new Map();
|
|
15
15
|
builtinExecutors = new Map();
|
|
16
|
+
availabilityGuards = new Map();
|
|
16
17
|
constructor(options = {}) {
|
|
17
|
-
this.registerBuiltins(options.builtinTools);
|
|
18
|
+
this.registerBuiltins(options.builtinTools, options.toolCatalog ?? BUILTIN_TOOLS);
|
|
18
19
|
}
|
|
19
|
-
registerBuiltins(selectedBuiltinTools) {
|
|
20
|
-
const availableNames = new Set(
|
|
20
|
+
registerBuiltins(selectedBuiltinTools, toolCatalog) {
|
|
21
|
+
const availableNames = new Set(toolCatalog.map((tool) => tool.definition.name));
|
|
22
|
+
if (availableNames.size !== toolCatalog.length) {
|
|
23
|
+
throw new ConfigError("Tool catalog contains duplicate names");
|
|
24
|
+
}
|
|
21
25
|
const selectedNames = selectedBuiltinTools ? new Set(selectedBuiltinTools) : null;
|
|
22
26
|
if (selectedNames) {
|
|
23
27
|
const unknown = [...selectedNames].filter((name) => !availableNames.has(name));
|
|
@@ -27,7 +31,7 @@ export class ToolRegistry {
|
|
|
27
31
|
});
|
|
28
32
|
}
|
|
29
33
|
}
|
|
30
|
-
for (const tool of
|
|
34
|
+
for (const tool of toolCatalog) {
|
|
31
35
|
if (selectedNames && !selectedNames.has(tool.definition.name)) {
|
|
32
36
|
continue;
|
|
33
37
|
}
|
|
@@ -36,24 +40,36 @@ export class ToolRegistry {
|
|
|
36
40
|
validateToolMetadata(tool.definition);
|
|
37
41
|
this.tools.set(tool.definition.name, tool.definition);
|
|
38
42
|
this.builtinExecutors.set(tool.definition.name, tool.execute);
|
|
43
|
+
if (tool.exposure.availability) {
|
|
44
|
+
this.availabilityGuards.set(tool.definition.name, tool.exposure.availability);
|
|
45
|
+
}
|
|
39
46
|
}
|
|
40
47
|
}
|
|
41
48
|
registerTool(tool, executor) {
|
|
42
49
|
validateToolMetadata(tool);
|
|
43
50
|
this.tools.set(tool.name, tool);
|
|
44
51
|
if (executor) {
|
|
45
|
-
this.builtinExecutors.set(tool.name, executor);
|
|
52
|
+
this.builtinExecutors.set(tool.name, async (args, ctx) => toToolExecutionResult(await executor(args, ctx)));
|
|
46
53
|
}
|
|
47
54
|
}
|
|
55
|
+
/** Create an engine-local registry view without sharing mutable maps. */
|
|
56
|
+
fork() {
|
|
57
|
+
const fork = new ToolRegistry({ builtinTools: [] });
|
|
58
|
+
fork.tools = new Map(this.tools);
|
|
59
|
+
fork.builtinExecutors = new Map(this.builtinExecutors);
|
|
60
|
+
return fork;
|
|
61
|
+
}
|
|
48
62
|
unregisterTool(name) {
|
|
49
63
|
this.tools.delete(name);
|
|
50
64
|
this.builtinExecutors.delete(name);
|
|
65
|
+
this.availabilityGuards.delete(name);
|
|
51
66
|
}
|
|
52
67
|
getToolDefinitions() {
|
|
53
68
|
return [...this.tools.values()].map((t) => ({
|
|
54
69
|
name: t.name,
|
|
55
70
|
description: t.description,
|
|
56
71
|
inputSchema: t.inputSchema,
|
|
72
|
+
sensitiveResult: t.sensitiveResult,
|
|
57
73
|
}));
|
|
58
74
|
}
|
|
59
75
|
getTool(name) {
|
|
@@ -62,6 +78,15 @@ export class ToolRegistry {
|
|
|
62
78
|
hasTool(name) {
|
|
63
79
|
return this.tools.has(name);
|
|
64
80
|
}
|
|
81
|
+
/** Test/harness introspection: definitions without implementations are valid
|
|
82
|
+
* for some dynamic registrations, but every builtin catalog entry must have
|
|
83
|
+
* an executor. */
|
|
84
|
+
hasExecutor(name) {
|
|
85
|
+
return this.builtinExecutors.has(name);
|
|
86
|
+
}
|
|
87
|
+
getAvailabilityGuard(name) {
|
|
88
|
+
return this.availabilityGuards.get(name);
|
|
89
|
+
}
|
|
65
90
|
async executeTool(name, args, options) {
|
|
66
91
|
const tool = this.tools.get(name);
|
|
67
92
|
if (!tool) {
|
|
@@ -73,7 +98,7 @@ export class ToolRegistry {
|
|
|
73
98
|
}
|
|
74
99
|
// Tool timeout precedence:
|
|
75
100
|
// options.timeoutMs (per-call override) > tool.timeoutMs (declared at registration) > default 120s.
|
|
76
|
-
// To run longer, declare timeoutMs on the tool (e.g. Agent
|
|
101
|
+
// To run longer, declare timeoutMs on the tool (e.g. Agent: 30min, Bash: 1h).
|
|
77
102
|
const timeout = options?.timeoutMs ?? tool.timeoutMs ?? DEFAULT_TOOL_TIMEOUT_MS;
|
|
78
103
|
const parentSignal = options?.signal;
|
|
79
104
|
const id = `tool_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
|
|
@@ -88,61 +113,78 @@ export class ToolRegistry {
|
|
|
88
113
|
}
|
|
89
114
|
// Create a child AbortController that aborts on timeout OR parent abort
|
|
90
115
|
const childController = new AbortController();
|
|
116
|
+
let timedOut = false;
|
|
91
117
|
const timerId = timeout > 0
|
|
92
|
-
? setTimeout(() =>
|
|
118
|
+
? setTimeout(() => {
|
|
119
|
+
timedOut = true;
|
|
120
|
+
childController.abort(new ToolTimeoutError(name, timeout));
|
|
121
|
+
}, timeout)
|
|
93
122
|
: undefined;
|
|
94
123
|
// Cascade parent abort to child
|
|
95
124
|
const onParentAbort = () => childController.abort(parentSignal?.reason);
|
|
96
125
|
parentSignal?.addEventListener("abort", onParentAbort, { once: true });
|
|
126
|
+
if (parentSignal?.aborted)
|
|
127
|
+
onParentAbort();
|
|
97
128
|
// Inject the abort signal into args so tools (like Agent) can use it
|
|
98
129
|
const argsWithSignal = { ...args, __signal: childController.signal };
|
|
99
130
|
// Build per-call ctx: caller's ctx (if any) + this call's signal
|
|
100
131
|
const ctx = options?.ctx
|
|
101
132
|
? { ...options.ctx, signal: childController.signal }
|
|
102
133
|
: undefined;
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
134
|
+
let onChildAbort;
|
|
135
|
+
const aborted = new Promise((_, reject) => {
|
|
136
|
+
onChildAbort = () => {
|
|
137
|
+
const reason = childController.signal.reason;
|
|
138
|
+
reject(reason instanceof Error
|
|
139
|
+
? reason
|
|
140
|
+
: Object.assign(new Error("Tool aborted"), { name: "AbortError" }));
|
|
141
|
+
};
|
|
142
|
+
childController.signal.addEventListener("abort", onChildAbort, { once: true });
|
|
143
|
+
if (childController.signal.aborted)
|
|
144
|
+
onChildAbort();
|
|
145
|
+
});
|
|
146
|
+
const cleanup = () => {
|
|
113
147
|
clearTimeout(timerId);
|
|
114
148
|
parentSignal?.removeEventListener("abort", onParentAbort);
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
149
|
+
if (onChildAbort)
|
|
150
|
+
childController.signal.removeEventListener("abort", onChildAbort);
|
|
151
|
+
};
|
|
152
|
+
try {
|
|
153
|
+
const rawResult = await Promise.race([executor(argsWithSignal, ctx), aborted]);
|
|
154
|
+
const result = toToolExecutionResult(rawResult);
|
|
155
|
+
if (childController.signal.aborted) {
|
|
156
|
+
throw childController.signal.reason instanceof Error
|
|
157
|
+
? childController.signal.reason
|
|
158
|
+
: Object.assign(new Error("Tool aborted"), { name: "AbortError" });
|
|
159
|
+
}
|
|
160
|
+
cleanup();
|
|
161
|
+
if (!result.ok) {
|
|
162
|
+
return {
|
|
163
|
+
id,
|
|
164
|
+
toolName: name,
|
|
165
|
+
error: result.error,
|
|
166
|
+
isError: true,
|
|
167
|
+
sandbox: result.sandbox,
|
|
168
|
+
};
|
|
120
169
|
}
|
|
121
|
-
// 结构化返回:图片块(view_image)或沙箱标记(Bash 等)。两者互斥,
|
|
122
|
-
// 各取所有,缺的字段为 undefined。
|
|
123
|
-
const contentBlocks = "contentBlocks" in result ? result.contentBlocks : undefined;
|
|
124
|
-
const sandbox = "sandbox" in result ? result.sandbox : undefined;
|
|
125
|
-
const sensitive = "sensitive" in result ? result.sensitive : undefined;
|
|
126
|
-
const displayResult = "displayResult" in result ? result.displayResult : undefined;
|
|
127
|
-
const transcriptResult = "transcriptResult" in result ? result.transcriptResult : undefined;
|
|
128
170
|
return {
|
|
129
171
|
id,
|
|
130
172
|
toolName: name,
|
|
131
|
-
result: result.result ?? (contentBlocks ? "(image)" : ""),
|
|
132
|
-
contentBlocks,
|
|
133
|
-
sandbox,
|
|
134
|
-
sensitive,
|
|
135
|
-
displayResult,
|
|
136
|
-
transcriptResult,
|
|
173
|
+
result: result.result ?? (result.contentBlocks ? "(image)" : ""),
|
|
174
|
+
contentBlocks: result.contentBlocks,
|
|
175
|
+
sandbox: result.sandbox,
|
|
176
|
+
sensitive: result.sensitive,
|
|
177
|
+
displayResult: result.displayResult,
|
|
178
|
+
transcriptResult: result.transcriptResult,
|
|
179
|
+
isError: false,
|
|
137
180
|
};
|
|
138
181
|
}
|
|
139
182
|
catch (err) {
|
|
140
|
-
|
|
141
|
-
parentSignal?.removeEventListener("abort", onParentAbort);
|
|
183
|
+
cleanup();
|
|
142
184
|
// Always return error as ToolResult, never throw
|
|
143
185
|
let errorMsg;
|
|
144
186
|
const isAbort = err?.name === "AbortError" || parentSignal?.aborted === true;
|
|
145
|
-
if (err instanceof ToolTimeoutError) {
|
|
187
|
+
if (timedOut || err instanceof ToolTimeoutError) {
|
|
146
188
|
errorMsg = `Tool timed out after ${timeout}ms: ${name}`;
|
|
147
189
|
}
|
|
148
190
|
else if (isAbort) {
|
|
@@ -26,7 +26,8 @@ import { SandboxUnavailableError } from "../../exceptions.js";
|
|
|
26
26
|
export function detectSandboxCapabilities() {
|
|
27
27
|
return {
|
|
28
28
|
seatbelt: process.platform === "darwin" && binaryExists("/usr/bin/sandbox-exec"),
|
|
29
|
-
bwrap: process.platform === "linux" &&
|
|
29
|
+
bwrap: process.platform === "linux" &&
|
|
30
|
+
(binaryExists("/usr/bin/bwrap") || binaryExists("/usr/local/bin/bwrap")),
|
|
30
31
|
};
|
|
31
32
|
}
|
|
32
33
|
function binaryExists(path) {
|
|
@@ -119,13 +120,7 @@ export function defaultSandboxConfig(mode = "auto") {
|
|
|
119
120
|
return {
|
|
120
121
|
mode,
|
|
121
122
|
writableRoots: ["${workspace}", ...tmpRoots],
|
|
122
|
-
deniedReads: [
|
|
123
|
-
"~/.ssh",
|
|
124
|
-
"~/.aws",
|
|
125
|
-
"~/.config/gcloud",
|
|
126
|
-
"~/.code-shell",
|
|
127
|
-
"~/.claude",
|
|
128
|
-
],
|
|
123
|
+
deniedReads: ["~/.ssh", "~/.aws", "~/.config/gcloud", "~/.code-shell", "~/.claude"],
|
|
129
124
|
network: "allow",
|
|
130
125
|
};
|
|
131
126
|
}
|
|
@@ -54,12 +54,8 @@ export function createSeatbeltBackend(config) {
|
|
|
54
54
|
};
|
|
55
55
|
}
|
|
56
56
|
function buildProfile(config) {
|
|
57
|
-
const writeAllows = config.writableRoots
|
|
58
|
-
|
|
59
|
-
.join("\n");
|
|
60
|
-
const readDenies = config.deniedReads
|
|
61
|
-
.map((p) => ` (subpath ${quote(p)})`)
|
|
62
|
-
.join("\n");
|
|
57
|
+
const writeAllows = config.writableRoots.map((p) => ` (subpath ${quote(p)})`).join("\n");
|
|
58
|
+
const readDenies = config.deniedReads.map((p) => ` (subpath ${quote(p)})`).join("\n");
|
|
63
59
|
const networkClause = config.network === "deny" ? "(deny network-outbound)" : "(allow network*)";
|
|
64
60
|
// SBPL evaluation note: when a broad `(allow file-read*)` and a specific
|
|
65
61
|
// `(deny file-read* (subpath …))` both match, the more specific subpath
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session-scoped tool host for external Agent Runtimes.
|
|
3
|
+
*
|
|
4
|
+
* An external runtime (Codex, Claude Code) drives its own agent loop and its own
|
|
5
|
+
* native tools. When it wants a CODESHELL tool it comes back in over MCP, and
|
|
6
|
+
* this is what it reaches: a narrow, per-business-session surface that exposes an
|
|
7
|
+
* explicitly allowlisted subset of the registry.
|
|
8
|
+
*
|
|
9
|
+
* The single rule that matters: **every call goes through
|
|
10
|
+
* `ToolExecutor.executeSingle()`**. `ToolRegistry` is not a security boundary —
|
|
11
|
+
* calling it directly would skip visibility, plan mode, argument validation, path
|
|
12
|
+
* policy, permission, sandbox, hooks, and result redaction. The MCP transport,
|
|
13
|
+
* the model's chosen tool name, and its arguments are all untrusted; the business
|
|
14
|
+
* session context is bound here by the host, out of band.
|
|
15
|
+
*
|
|
16
|
+
* Deliberately domain-agnostic: no Claude/Codex/Electron/coding literals. The
|
|
17
|
+
* runtime adapters live in the coding capability and talk to this through the
|
|
18
|
+
* `SessionToolHost` interface.
|
|
19
|
+
*/
|
|
20
|
+
import type { PermissionMode, ToolDefinition, ToolResult } from "../types.js";
|
|
21
|
+
import type { ToolContext } from "./context.js";
|
|
22
|
+
import { ToolRegistry } from "./registry.js";
|
|
23
|
+
import { type ApprovalBackend } from "./permission.js";
|
|
24
|
+
import { HookRegistry } from "../hooks/registry.js";
|
|
25
|
+
import { type ToolVisibilityInputs } from "../engine/run-tooling.js";
|
|
26
|
+
/**
|
|
27
|
+
* Permission modes an external session may use.
|
|
28
|
+
*
|
|
29
|
+
* `bypassPermissions` and `dontAsk` are excluded at the type level because they
|
|
30
|
+
* short-circuit `PermissionClassifier` entirely (it returns allow / deny before
|
|
31
|
+
* consulting any rule). Under either one, "the call went through ToolExecutor"
|
|
32
|
+
* becomes true but meaningless. The external runtime's OWN permission mode is a
|
|
33
|
+
* separate thing and is unaffected by this — it governs that runtime's native
|
|
34
|
+
* tools, not CodeShell's.
|
|
35
|
+
*/
|
|
36
|
+
export type ExternalSessionPermissionMode = Exclude<PermissionMode, "bypassPermissions" | "dontAsk">;
|
|
37
|
+
/**
|
|
38
|
+
* Which tools an external runtime may see and call.
|
|
39
|
+
*
|
|
40
|
+
* Allowlist only — no "everything in the registry", no prefix matching. A tool
|
|
41
|
+
* that is not named here does not exist as far as the runtime is concerned, and
|
|
42
|
+
* naming it anyway is an error rather than a silent no-op.
|
|
43
|
+
*/
|
|
44
|
+
export interface ExternalToolExposurePolicy {
|
|
45
|
+
mode: "allowlist";
|
|
46
|
+
toolNames: ReadonlySet<string>;
|
|
47
|
+
/**
|
|
48
|
+
* Optional per-tool argument narrowing, for tools that multiplex several
|
|
49
|
+
* operations behind one name (e.g. a Panel tool with list/open/tools/invoke).
|
|
50
|
+
* Each value is a regex source matched against the whole argument value —
|
|
51
|
+
* patterns are anchored for you, see {@link matchesWholeValue}.
|
|
52
|
+
*
|
|
53
|
+
* This binds on `execute()`, not just `listTools()`: describing a limit only in
|
|
54
|
+
* the advertised schema would leave it advisory, and the arguments come from
|
|
55
|
+
* the model.
|
|
56
|
+
*
|
|
57
|
+
* **Scope, stated plainly:** this constrains only the keys it names. Keys the
|
|
58
|
+
* pattern does not mention pass through untouched, so it is a good fit for
|
|
59
|
+
* "which action may run" and a poor one for "what may that action do".
|
|
60
|
+
* Restricting a nested payload (e.g. the arguments a Panel tool forwards to a
|
|
61
|
+
* Panel App) is the tool's own schema validation, not this. Do not treat an
|
|
62
|
+
* `argsPatterns` entry as a sandbox for everything a tool might accept.
|
|
63
|
+
*/
|
|
64
|
+
argsPatterns?: ReadonlyMap<string, Readonly<Record<string, string>>>;
|
|
65
|
+
}
|
|
66
|
+
export interface SessionToolHost {
|
|
67
|
+
readonly businessSessionId: string;
|
|
68
|
+
/**
|
|
69
|
+
* The assembled session ToolContext.
|
|
70
|
+
*
|
|
71
|
+
* Exposed read-only so a host can inspect what the executor will actually see
|
|
72
|
+
* — most usefully `toolVisibility` (absent means ToolExecutor SKIPS its
|
|
73
|
+
* availability guard) and `allowedToolNames`. Do not mutate it; narrow the
|
|
74
|
+
* exposure policy instead.
|
|
75
|
+
*/
|
|
76
|
+
readonly toolContext: ToolContext;
|
|
77
|
+
listTools(): readonly ToolDefinition[];
|
|
78
|
+
execute(call: {
|
|
79
|
+
id: string;
|
|
80
|
+
name: string;
|
|
81
|
+
input: unknown;
|
|
82
|
+
}, signal?: AbortSignal): Promise<ToolResult>;
|
|
83
|
+
dispose(): Promise<void>;
|
|
84
|
+
}
|
|
85
|
+
export interface CreateSessionToolHostOptions {
|
|
86
|
+
businessSessionId: string;
|
|
87
|
+
cwd: string;
|
|
88
|
+
registry: ToolRegistry;
|
|
89
|
+
permissionMode: ExternalSessionPermissionMode;
|
|
90
|
+
/**
|
|
91
|
+
* The agent preset's permission rules (e.g.
|
|
92
|
+
* `BUILTIN_AGENT_PRESETS.general.defaultPermissionRules`).
|
|
93
|
+
*
|
|
94
|
+
* Only the PRESET layer is supplied here. The rest of the stack — the standing
|
|
95
|
+
* memory-scope carve-outs, mode-derived rules, and the user's own
|
|
96
|
+
* `settings.permissions.rules` — is composed internally by
|
|
97
|
+
* {@link composePermissionRules}, the same function the Native Engine uses.
|
|
98
|
+
*
|
|
99
|
+
* That composition is deliberately not left to the caller. An earlier revision
|
|
100
|
+
* took a finished rule array, which turned an equivalence guarantee into an
|
|
101
|
+
* unenforceable obligation: nothing checked that a caller reproduced
|
|
102
|
+
* `PermissionController.build()`, and the easy mistake — omitting
|
|
103
|
+
* `settings.permissions.rules` — meant a user's explicit "deny this tool" bound
|
|
104
|
+
* the Native Engine but not the external runtime.
|
|
105
|
+
*/
|
|
106
|
+
presetRules: readonly import("../types.js").PermissionRule[];
|
|
107
|
+
/** Settings scope used to resolve the user's own permission rules. */
|
|
108
|
+
settingsScope?: import("../settings/manager.js").SettingsScope;
|
|
109
|
+
/**
|
|
110
|
+
* Whether the project at `cwd` has been trusted by the user.
|
|
111
|
+
*
|
|
112
|
+
* **Required, and there is no default** — `permissions` is the first entry in
|
|
113
|
+
* `DANGEROUS_PROJECT_FIELDS`, so an untrusted project's
|
|
114
|
+
* `settings.permissions.rules` are stripped precisely to stop a cloned repo
|
|
115
|
+
* self-authorizing. Every protocol-layer caller resolves this explicitly and
|
|
116
|
+
* defaults it to `false`; an optional field defaulting to "trusted" here would
|
|
117
|
+
* let a hostile repo grant an external runtime tools the user never trusted,
|
|
118
|
+
* without the approval backend ever being consulted.
|
|
119
|
+
*
|
|
120
|
+
* Optional-plus-unsafe-default is the exact shape of the bug this whole
|
|
121
|
+
* options object has now been bitten by twice. Hence: required.
|
|
122
|
+
*/
|
|
123
|
+
projectTrusted: boolean;
|
|
124
|
+
planMode: boolean;
|
|
125
|
+
exposure: ExternalToolExposurePolicy;
|
|
126
|
+
/**
|
|
127
|
+
* Availability-guard inputs. Required, not optional: `ToolExecutor` SKIPS its
|
|
128
|
+
* visibility gate when `toolCtx.toolVisibility` is absent, so omitting this
|
|
129
|
+
* would not merely under-expose tools — it would make host-gated tools
|
|
130
|
+
* callable in a context their guard was written to exclude.
|
|
131
|
+
*/
|
|
132
|
+
visibility: ToolVisibilityInputs;
|
|
133
|
+
approvalBackend?: ApprovalBackend;
|
|
134
|
+
hooks?: HookRegistry;
|
|
135
|
+
/** Extra ToolContext seams the host supplies (panels, browser, askUser, …). */
|
|
136
|
+
contextOverrides?: Partial<ToolContext>;
|
|
137
|
+
signal?: AbortSignal;
|
|
138
|
+
}
|
|
139
|
+
export declare function createSessionToolHost(options: CreateSessionToolHostOptions): SessionToolHost;
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { ToolExecutor } from "./executor.js";
|
|
2
|
+
import { PermissionClassifier } from "./permission.js";
|
|
3
|
+
import { HookRegistry } from "../hooks/registry.js";
|
|
4
|
+
import { buildToolVisibility } from "../engine/run-tooling.js";
|
|
5
|
+
import { composePermissionRules } from "../engine/permission-controller.js";
|
|
6
|
+
const FORBIDDEN_MODES = new Set(["bypassPermissions", "dontAsk"]);
|
|
7
|
+
/**
|
|
8
|
+
* Whole-string match for an exposure pattern.
|
|
9
|
+
*
|
|
10
|
+
* Patterns are ANCHORED here rather than trusting the author to write `^…$`.
|
|
11
|
+
* An unanchored `action: "list"` would also admit `"invoke_list"` — a silent
|
|
12
|
+
* widening of a rule whose entire purpose is to narrow. Anchoring in one place
|
|
13
|
+
* makes the safe reading the only reading; an author who deliberately writes
|
|
14
|
+
* `^(list|open)$` gets the same result either way.
|
|
15
|
+
*/
|
|
16
|
+
function matchesWholeValue(source, value) {
|
|
17
|
+
let re;
|
|
18
|
+
try {
|
|
19
|
+
re = new RegExp(`^(?:${source})$`, "u");
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
// A malformed pattern must not silently permit everything.
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
return re.test(value);
|
|
26
|
+
}
|
|
27
|
+
function argsMatch(patterns, input) {
|
|
28
|
+
if (!patterns)
|
|
29
|
+
return true;
|
|
30
|
+
for (const [key, source] of Object.entries(patterns)) {
|
|
31
|
+
// Read own properties only: a model-supplied JSON body cannot smuggle a
|
|
32
|
+
// match through the prototype chain.
|
|
33
|
+
const value = Object.prototype.hasOwnProperty.call(input, key) ? input[key] : undefined;
|
|
34
|
+
// Only primitives are comparable. Objects/arrays are rejected rather than
|
|
35
|
+
// stringified — `String(["list"])` is `"list"`, which would let an array
|
|
36
|
+
// satisfy a scalar pattern.
|
|
37
|
+
if (typeof value !== "string" && typeof value !== "number" && typeof value !== "boolean") {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
if (!matchesWholeValue(source, String(value)))
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
export function createSessionToolHost(options) {
|
|
46
|
+
if (FORBIDDEN_MODES.has(options.permissionMode)) {
|
|
47
|
+
throw new Error(`SessionToolHost refuses permission mode '${options.permissionMode}': it short-circuits ` +
|
|
48
|
+
`PermissionClassifier, so CodeShell tool authorization would not actually run. ` +
|
|
49
|
+
`An external runtime's own permission mode is separate and unaffected.`);
|
|
50
|
+
}
|
|
51
|
+
const { registry, exposure } = options;
|
|
52
|
+
const hooks = options.hooks ?? new HookRegistry();
|
|
53
|
+
// Composed HERE, by the same function the Native Engine uses, so the two paths
|
|
54
|
+
// cannot drift. In particular this is what pulls in the user's own
|
|
55
|
+
// `settings.permissions.rules` — a deny the user wrote must bind an external
|
|
56
|
+
// runtime exactly as it binds the Native Engine.
|
|
57
|
+
const permission = new PermissionClassifier(composePermissionRules({
|
|
58
|
+
mode: options.permissionMode,
|
|
59
|
+
cwd: options.cwd,
|
|
60
|
+
presetRules: options.presetRules,
|
|
61
|
+
projectTrusted: options.projectTrusted,
|
|
62
|
+
...(options.settingsScope ? { settingsScope: options.settingsScope } : {}),
|
|
63
|
+
}), options.permissionMode, options.approvalBackend);
|
|
64
|
+
// Every in-flight call is chained to this, so dispose() can actually stop work
|
|
65
|
+
// that is mid-execution or parked on an approval prompt (§13.4).
|
|
66
|
+
const lifetime = new AbortController();
|
|
67
|
+
const sessionSignal = options.signal
|
|
68
|
+
? AbortSignal.any([options.signal, lifetime.signal])
|
|
69
|
+
: lifetime.signal;
|
|
70
|
+
const toolCtx = {
|
|
71
|
+
cwd: options.cwd,
|
|
72
|
+
toolRegistry: registry,
|
|
73
|
+
// The COMBINED signal, not just the caller's: a tool that cooperates with
|
|
74
|
+
// ctx.signal must observe session disposal too.
|
|
75
|
+
signal: sessionSignal,
|
|
76
|
+
// Caller-supplied host seams (panels, browser, askUser, …) come FIRST so the
|
|
77
|
+
// security-relevant fields below always win. Spreading them last would let a
|
|
78
|
+
// caller — or a careless refactor — set `toolVisibility: undefined` (which
|
|
79
|
+
// makes ToolExecutor skip its availability guard entirely), widen
|
|
80
|
+
// `allowedToolNames`, or re-introduce a permission mode the throw above
|
|
81
|
+
// just rejected.
|
|
82
|
+
...options.contextOverrides,
|
|
83
|
+
sessionId: options.businessSessionId,
|
|
84
|
+
planMode: options.planMode,
|
|
85
|
+
permissionMode: options.permissionMode,
|
|
86
|
+
toolVisibility: buildToolVisibility(options.visibility),
|
|
87
|
+
// Belt and braces with the exposure check in execute(): the executor
|
|
88
|
+
// enforces this too, so a future refactor that loses one still fails closed.
|
|
89
|
+
allowedToolNames: new Set(exposure.toolNames),
|
|
90
|
+
};
|
|
91
|
+
const executor = new ToolExecutor(registry, permission, hooks);
|
|
92
|
+
executor.setContext(toolCtx);
|
|
93
|
+
executor.setSignal(sessionSignal);
|
|
94
|
+
let disposed = false;
|
|
95
|
+
const failClosed = (id, name, error) => ({
|
|
96
|
+
id,
|
|
97
|
+
toolName: name,
|
|
98
|
+
error,
|
|
99
|
+
isError: true,
|
|
100
|
+
});
|
|
101
|
+
return {
|
|
102
|
+
businessSessionId: options.businessSessionId,
|
|
103
|
+
toolContext: toolCtx,
|
|
104
|
+
listTools() {
|
|
105
|
+
if (disposed)
|
|
106
|
+
return [];
|
|
107
|
+
return registry
|
|
108
|
+
.getToolDefinitions()
|
|
109
|
+
.filter((definition) => exposure.toolNames.has(definition.name));
|
|
110
|
+
},
|
|
111
|
+
async execute(call, callSignal) {
|
|
112
|
+
if (disposed) {
|
|
113
|
+
return failClosed(call.id, call.name, "This tool session has been closed.");
|
|
114
|
+
}
|
|
115
|
+
if (!exposure.toolNames.has(call.name)) {
|
|
116
|
+
// Fail closed on a KNOWN-but-unexposed name too. Not listing a tool is a
|
|
117
|
+
// boundary, not a hint to the model.
|
|
118
|
+
return failClosed(call.id, call.name, `Tool ${call.name} is not exposed to this session. Do NOT retry this tool call.`);
|
|
119
|
+
}
|
|
120
|
+
const input = call.input && typeof call.input === "object" && !Array.isArray(call.input)
|
|
121
|
+
? call.input
|
|
122
|
+
: {};
|
|
123
|
+
if (!argsMatch(exposure.argsPatterns?.get(call.name), input)) {
|
|
124
|
+
return failClosed(call.id, call.name, `Tool ${call.name} was called with arguments outside the scope exposed to this ` +
|
|
125
|
+
`session. Do NOT retry this tool call with the same arguments.`);
|
|
126
|
+
}
|
|
127
|
+
// `sessionSignal` folds in the session lifetime and the caller-supplied
|
|
128
|
+
// signal; `callSignal` is the optional per-call one (an MCP cancellation).
|
|
129
|
+
if (sessionSignal.aborted || callSignal?.aborted) {
|
|
130
|
+
return failClosed(call.id, call.name, `Tool aborted before execution: ${call.name}`);
|
|
131
|
+
}
|
|
132
|
+
// Forward the per-call signal rather than only checking it at entry: an MCP
|
|
133
|
+
// cancellation arriving mid-flight has to actually stop the work.
|
|
134
|
+
//
|
|
135
|
+
// A `ToolExecutor` holds exactly one signal, and swapping it per call would
|
|
136
|
+
// race with concurrent calls carrying different signals. So a call that
|
|
137
|
+
// brings its own signal gets its own executor — cheap (it is a thin wrapper
|
|
138
|
+
// over the shared registry/permission/hooks) and free of shared mutable
|
|
139
|
+
// state. Calls without one use the shared executor unchanged.
|
|
140
|
+
if (!callSignal) {
|
|
141
|
+
// The one authorized path. Everything above only NARROWS what may reach it.
|
|
142
|
+
return await executor.executeSingle({
|
|
143
|
+
id: call.id,
|
|
144
|
+
toolName: call.name,
|
|
145
|
+
args: input,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
const scoped = new ToolExecutor(registry, permission, hooks);
|
|
149
|
+
scoped.setContext(toolCtx);
|
|
150
|
+
scoped.setSignal(AbortSignal.any([sessionSignal, callSignal]));
|
|
151
|
+
return await scoped.executeSingle({
|
|
152
|
+
id: call.id,
|
|
153
|
+
toolName: call.name,
|
|
154
|
+
args: input,
|
|
155
|
+
});
|
|
156
|
+
},
|
|
157
|
+
async dispose() {
|
|
158
|
+
// Order matters (§13.4): stop accepting new calls, THEN abort in-flight
|
|
159
|
+
// ones. Marking disposed without aborting would let a call that is already
|
|
160
|
+
// running — or parked on an approval prompt — continue and complete after
|
|
161
|
+
// the session is gone.
|
|
162
|
+
disposed = true;
|
|
163
|
+
lifetime.abort();
|
|
164
|
+
executor.setContext(undefined);
|
|
165
|
+
},
|
|
166
|
+
};
|
|
167
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { BuiltinTool } from "../builtin/index.js";
|
|
2
|
+
import type { ToolContext } from "../context.js";
|
|
3
|
+
import { ToolRegistry } from "../registry.js";
|
|
4
|
+
import type { ToolResult } from "../../types.js";
|
|
5
|
+
export interface FakeToolContextOptions {
|
|
6
|
+
cwd?: string;
|
|
7
|
+
sessionId?: string;
|
|
8
|
+
signal?: AbortSignal;
|
|
9
|
+
/** Shallow overrides for tool-family-specific host bridges. */
|
|
10
|
+
overrides?: Partial<ToolContext>;
|
|
11
|
+
}
|
|
12
|
+
export interface ToolRegistryHarnessOptions extends FakeToolContextOptions {
|
|
13
|
+
builtinTools?: readonly string[];
|
|
14
|
+
toolCatalog?: readonly BuiltinTool[];
|
|
15
|
+
registry?: ToolRegistry;
|
|
16
|
+
timeoutMs?: number;
|
|
17
|
+
}
|
|
18
|
+
export interface ToolRegistryHarness {
|
|
19
|
+
registry: ToolRegistry;
|
|
20
|
+
context: ToolContext;
|
|
21
|
+
execute(name: string, args?: Record<string, unknown>): Promise<ToolResult>;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Shared fake ToolContext for builtin integration tests. It intentionally
|
|
25
|
+
* supplies only stable harness defaults; tests opt into browser/workspace/MCP/
|
|
26
|
+
* sub-agent behavior through `overrides`, so missing host seams fail visibly.
|
|
27
|
+
*/
|
|
28
|
+
export declare function createFakeToolContext(registry: ToolRegistry, options?: FakeToolContextOptions): ToolContext;
|
|
29
|
+
/** Build a real ToolRegistry and execute through its timeout/signal/result
|
|
30
|
+
* protocol while keeping host dependencies deterministic and injectable. */
|
|
31
|
+
export declare function createToolRegistryHarness(options?: ToolRegistryHarnessOptions): ToolRegistryHarness;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { resolve } from "node:path";
|
|
2
|
+
import { ToolRegistry } from "../registry.js";
|
|
3
|
+
/**
|
|
4
|
+
* Shared fake ToolContext for builtin integration tests. It intentionally
|
|
5
|
+
* supplies only stable harness defaults; tests opt into browser/workspace/MCP/
|
|
6
|
+
* sub-agent behavior through `overrides`, so missing host seams fail visibly.
|
|
7
|
+
*/
|
|
8
|
+
export function createFakeToolContext(registry, options = {}) {
|
|
9
|
+
const cwd = resolve(options.cwd ?? process.cwd());
|
|
10
|
+
const context = {
|
|
11
|
+
cwd,
|
|
12
|
+
setCwd(next) {
|
|
13
|
+
context.cwd = resolve(next);
|
|
14
|
+
},
|
|
15
|
+
llmConfig: {},
|
|
16
|
+
toolRegistry: registry,
|
|
17
|
+
planMode: false,
|
|
18
|
+
sessionId: options.sessionId ?? "tool-harness-session",
|
|
19
|
+
signal: options.signal,
|
|
20
|
+
allowBackgroundShells: false,
|
|
21
|
+
toolVisibility: { hasGoal: true },
|
|
22
|
+
engine: {
|
|
23
|
+
getPlanMode: () => context.planMode,
|
|
24
|
+
setPlanMode: (enabled) => {
|
|
25
|
+
context.planMode = enabled;
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
askUser: async () => "harness-answer",
|
|
29
|
+
...options.overrides,
|
|
30
|
+
};
|
|
31
|
+
return context;
|
|
32
|
+
}
|
|
33
|
+
/** Build a real ToolRegistry and execute through its timeout/signal/result
|
|
34
|
+
* protocol while keeping host dependencies deterministic and injectable. */
|
|
35
|
+
export function createToolRegistryHarness(options = {}) {
|
|
36
|
+
const registryOptions = {
|
|
37
|
+
...(options.builtinTools ? { builtinTools: options.builtinTools } : {}),
|
|
38
|
+
...(options.toolCatalog ? { toolCatalog: options.toolCatalog } : {}),
|
|
39
|
+
};
|
|
40
|
+
const registry = options.registry ?? new ToolRegistry(registryOptions);
|
|
41
|
+
const context = createFakeToolContext(registry, options);
|
|
42
|
+
return {
|
|
43
|
+
registry,
|
|
44
|
+
context,
|
|
45
|
+
execute: async (name, args = {}) => await registry.executeTool(name, args, {
|
|
46
|
+
ctx: context,
|
|
47
|
+
signal: options.signal,
|
|
48
|
+
timeoutMs: options.timeoutMs ?? 5_000,
|
|
49
|
+
}),
|
|
50
|
+
};
|
|
51
|
+
}
|