@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
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export function buildMcpToolPolicies(servers) {
|
|
2
|
+
const policies = new Map();
|
|
3
|
+
for (const [serverName, config] of Object.entries(servers)) {
|
|
4
|
+
if (config.enabled === false)
|
|
5
|
+
continue;
|
|
6
|
+
if (config.allowedTools === undefined && config.disabledTools === undefined)
|
|
7
|
+
continue;
|
|
8
|
+
policies.set(serverName, {
|
|
9
|
+
allowedTools: config.allowedTools === undefined ? undefined : new Set(config.allowedTools),
|
|
10
|
+
disabledTools: new Set(config.disabledTools ?? []),
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
return policies;
|
|
14
|
+
}
|
|
15
|
+
export function isMcpToolNameAllowed(policies, serverName, toolName) {
|
|
16
|
+
const policy = policies?.get(serverName);
|
|
17
|
+
if (!policy)
|
|
18
|
+
return true;
|
|
19
|
+
if (policy.allowedTools && !policy.allowedTools.has(toolName))
|
|
20
|
+
return false;
|
|
21
|
+
return !policy.disabledTools.has(toolName);
|
|
22
|
+
}
|
|
23
|
+
export function isRegisteredMcpToolAllowed(tool, policies) {
|
|
24
|
+
if (tool.source !== "mcp")
|
|
25
|
+
return true;
|
|
26
|
+
const policy = policies?.get(tool.serverName ?? "");
|
|
27
|
+
if (!policy)
|
|
28
|
+
return true;
|
|
29
|
+
// Restricted servers fail closed for registry entries created by an older
|
|
30
|
+
// or third-party adapter that did not preserve the original MCP tool name.
|
|
31
|
+
if (!tool.mcpToolName)
|
|
32
|
+
return false;
|
|
33
|
+
return isMcpToolNameAllowed(policies, tool.serverName ?? "", tool.mcpToolName);
|
|
34
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/** One panel the active host can present to the user. */
|
|
2
|
+
export interface AgentPanelDescriptor {
|
|
3
|
+
id: string;
|
|
4
|
+
title: string;
|
|
5
|
+
source: "builtin" | "builtin-panel-app" | "panel-app";
|
|
6
|
+
}
|
|
7
|
+
export interface PanelOpenResult {
|
|
8
|
+
ok: boolean;
|
|
9
|
+
panelId: string;
|
|
10
|
+
detail?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface AgentPanelToolDescriptor {
|
|
13
|
+
name: string;
|
|
14
|
+
description: string;
|
|
15
|
+
inputSchema: Record<string, unknown>;
|
|
16
|
+
readOnly: boolean;
|
|
17
|
+
}
|
|
18
|
+
export interface PanelInvokeResult {
|
|
19
|
+
ok: boolean;
|
|
20
|
+
panelId: string;
|
|
21
|
+
toolName: string;
|
|
22
|
+
result?: unknown;
|
|
23
|
+
detail?: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* A discovery result that can distinguish "the host has none" from "the request
|
|
27
|
+
* never completed".
|
|
28
|
+
*
|
|
29
|
+
* `list` / `tools` used to return a bare array, so every failure — a user Stop, a
|
|
30
|
+
* closed session, a timeout — collapsed to `[]`, which the Panel tool then
|
|
31
|
+
* reported as the factual claim "(no panels available)". That is worse than a
|
|
32
|
+
* refusal: it tells the model panel hosting is unavailable, so it stops trying.
|
|
33
|
+
* `failed` carries the reason instead, and an absent `failed` means the empty
|
|
34
|
+
* list is real.
|
|
35
|
+
*/
|
|
36
|
+
export interface PanelDiscoveryResult<T> {
|
|
37
|
+
items: T[];
|
|
38
|
+
/** Present only when the request did not complete; `items` is then empty. */
|
|
39
|
+
failed?: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* UI-agnostic bridge used by agent tools to discover and focus host panels.
|
|
43
|
+
*
|
|
44
|
+
* Core never imports a renderer. Desktop implements this through its protocol
|
|
45
|
+
* host; headless/TUI engines leave it undefined. Plugin-contributed tools may
|
|
46
|
+
* use the same bridge to open their own panel by stable registry id.
|
|
47
|
+
*/
|
|
48
|
+
export interface PanelHostBridge {
|
|
49
|
+
list(): Promise<PanelDiscoveryResult<AgentPanelDescriptor>>;
|
|
50
|
+
open(panelId: string): Promise<PanelOpenResult>;
|
|
51
|
+
tools?(panelId: string): Promise<PanelDiscoveryResult<AgentPanelToolDescriptor>>;
|
|
52
|
+
invoke?(panelId: string, toolName: string, args: Record<string, unknown>): Promise<PanelInvokeResult>;
|
|
53
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -29,11 +29,12 @@
|
|
|
29
29
|
* approval round-trip; it is not an authority to write anywhere on disk.
|
|
30
30
|
* Callers must consult classifyPath before honoring acceptEdits.
|
|
31
31
|
*/
|
|
32
|
-
import { constants, realpathSync, existsSync, readFileSync, writeFileSync, mkdirSync, renameSync, } from "node:fs";
|
|
32
|
+
import { constants, realpathSync, existsSync, readFileSync, writeFileSync, mkdirSync, renameSync, statSync, } from "node:fs";
|
|
33
33
|
import { open } from "node:fs/promises";
|
|
34
34
|
import { homedir } from "node:os";
|
|
35
35
|
import { randomUUID } from "node:crypto";
|
|
36
|
-
import { dirname, isAbsolute, join, resolve as resolvePath, sep } from "node:path";
|
|
36
|
+
import { dirname, isAbsolute, join, relative, resolve as resolvePath, sep } from "node:path";
|
|
37
|
+
import { readInstalledPlugins } from "../plugins/installedPlugins.js";
|
|
37
38
|
const FINAL_WRITE_PATH_SNAPSHOT = Symbol("codeshell.finalWritePathSnapshot");
|
|
38
39
|
/**
|
|
39
40
|
* Default sensitive path patterns. These are evaluated AFTER home-expansion
|
|
@@ -392,6 +393,88 @@ function isInsideDir(child, parent) {
|
|
|
392
393
|
const p = par.endsWith(sep) ? par : par + sep;
|
|
393
394
|
return c === par || c.startsWith(p);
|
|
394
395
|
}
|
|
396
|
+
function configuredUserHome() {
|
|
397
|
+
return process.env.HOME ?? homedir();
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* Whether `resolved` belongs to one concrete Skill tree rooted below
|
|
401
|
+
* `<skillsRoot>/<skill>/`.
|
|
402
|
+
*
|
|
403
|
+
* Both the root and manifest are realpathed, so a reference symlink cannot
|
|
404
|
+
* turn this read-only exception into access outside the managed Skill tree.
|
|
405
|
+
*/
|
|
406
|
+
function isSkillTreeResource(resolved, skillsRoot) {
|
|
407
|
+
try {
|
|
408
|
+
const realSkillsRoot = realpathSync(skillsRoot);
|
|
409
|
+
if (!isInsideDir(resolved, realSkillsRoot))
|
|
410
|
+
return false;
|
|
411
|
+
const rel = relative(realSkillsRoot, resolved);
|
|
412
|
+
const skillName = rel.split(sep).filter(Boolean)[0];
|
|
413
|
+
if (!skillName || skillName === "..")
|
|
414
|
+
return false;
|
|
415
|
+
const skillRoot = realpathSync(join(realSkillsRoot, skillName));
|
|
416
|
+
if (!isInsideDir(skillRoot, realSkillsRoot))
|
|
417
|
+
return false;
|
|
418
|
+
const manifest = realpathSync(join(skillRoot, "SKILL.md"));
|
|
419
|
+
if (!isInsideDir(manifest, skillRoot) || !statSync(manifest).isFile())
|
|
420
|
+
return false;
|
|
421
|
+
return isInsideDir(resolved, skillRoot);
|
|
422
|
+
}
|
|
423
|
+
catch {
|
|
424
|
+
return false;
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
/**
|
|
428
|
+
* Skill instructions routinely link to sibling references/scripts/assets.
|
|
429
|
+
* The Skill builtin can already read the registered SKILL.md, so asking again
|
|
430
|
+
* for every referenced file is both inconsistent and capable of wedging a
|
|
431
|
+
* headless run.
|
|
432
|
+
*
|
|
433
|
+
* Keep the exception narrow:
|
|
434
|
+
* - read-only (the caller checks the operation);
|
|
435
|
+
* - user Skills, or an installed plugin recorded in the V2 registry;
|
|
436
|
+
* - plugin installs must realpath beneath the managed plugin cache;
|
|
437
|
+
* - the target must remain inside a directory containing a real SKILL.md.
|
|
438
|
+
*/
|
|
439
|
+
function isRegisteredSkillResourceRead(resolved) {
|
|
440
|
+
let codeShellRoot;
|
|
441
|
+
try {
|
|
442
|
+
codeShellRoot = realpathSync(join(configuredUserHome(), ".code-shell"));
|
|
443
|
+
}
|
|
444
|
+
catch {
|
|
445
|
+
return false;
|
|
446
|
+
}
|
|
447
|
+
if (!isInsideDir(resolved, codeShellRoot))
|
|
448
|
+
return false;
|
|
449
|
+
if (isSkillTreeResource(resolved, join(codeShellRoot, "skills")))
|
|
450
|
+
return true;
|
|
451
|
+
let cacheRoot;
|
|
452
|
+
try {
|
|
453
|
+
cacheRoot = realpathSync(join(codeShellRoot, "plugins", "cache"));
|
|
454
|
+
}
|
|
455
|
+
catch {
|
|
456
|
+
return false;
|
|
457
|
+
}
|
|
458
|
+
const installed = readInstalledPlugins();
|
|
459
|
+
for (const entries of Object.values(installed.plugins)) {
|
|
460
|
+
for (const entry of entries) {
|
|
461
|
+
try {
|
|
462
|
+
const installRoot = realpathSync(entry.installPath);
|
|
463
|
+
if (installRoot === cacheRoot || !isInsideDir(installRoot, cacheRoot))
|
|
464
|
+
continue;
|
|
465
|
+
const skillsRoot = realpathSync(join(installRoot, "skills"));
|
|
466
|
+
if (!isInsideDir(skillsRoot, installRoot))
|
|
467
|
+
continue;
|
|
468
|
+
if (isSkillTreeResource(resolved, skillsRoot))
|
|
469
|
+
return true;
|
|
470
|
+
}
|
|
471
|
+
catch {
|
|
472
|
+
// A stale/tampered registry entry must never broaden read authority.
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
return false;
|
|
477
|
+
}
|
|
395
478
|
/**
|
|
396
479
|
* Returns the matching sensitive-dir entry (with the user's home prefix) if
|
|
397
480
|
* `resolved` lives underneath any sensitive directory, else undefined.
|
|
@@ -476,6 +559,20 @@ export function classifyPath(rawPath, opts) {
|
|
|
476
559
|
const sensitiveFile = matchSensitiveFile(resolved);
|
|
477
560
|
const sensitiveLabel = sensitiveDir ?? sensitiveFile;
|
|
478
561
|
const insideWorkspace = isInsideDir(resolved, workspace);
|
|
562
|
+
// Registered Skill resources are managed runtime inputs. Their SKILL.md is
|
|
563
|
+
// already readable through the Skill builtin; allow its contained reference
|
|
564
|
+
// files through the ordinary Read tool as well. A credential-shaped basename
|
|
565
|
+
// (.env, token.txt, key files, ...) deliberately keeps the sensitive-file
|
|
566
|
+
// gate even inside a Skill tree.
|
|
567
|
+
if (opts.operation === "read" &&
|
|
568
|
+
!sensitiveFile &&
|
|
569
|
+
isRegisteredSkillResourceRead(resolved)) {
|
|
570
|
+
return {
|
|
571
|
+
decision: "allow",
|
|
572
|
+
reason: "registered Skill resource read",
|
|
573
|
+
resolvedPath: resolved,
|
|
574
|
+
};
|
|
575
|
+
}
|
|
479
576
|
// Sensitive: write is always denied, read always asks. Workspace placement
|
|
480
577
|
// doesn't soften the rule — an `.env` in the project still asks on read.
|
|
481
578
|
if (sensitiveLabel) {
|
|
@@ -6,6 +6,19 @@ import { logger as rootPermLogger } from "../logging/logger.js";
|
|
|
6
6
|
export interface ApprovalBackend {
|
|
7
7
|
requestApproval(request: ApprovalRequest): Promise<ApprovalResult>;
|
|
8
8
|
}
|
|
9
|
+
/**
|
|
10
|
+
* Interactive-approval lifecycle observation (see
|
|
11
|
+
* PermissionClassifier.setApprovalEventListener). "requested" fires right
|
|
12
|
+
* before the backend prompt is awaited; "resolved" fires after the user (or
|
|
13
|
+
* backend policy) answered, with the outcome.
|
|
14
|
+
*/
|
|
15
|
+
export interface ApprovalLifecycleEvent {
|
|
16
|
+
phase: "requested" | "resolved";
|
|
17
|
+
toolName: string;
|
|
18
|
+
riskLevel: "low" | "medium" | "high";
|
|
19
|
+
approved?: boolean;
|
|
20
|
+
sessionId?: string;
|
|
21
|
+
}
|
|
9
22
|
export interface ApprovalRouteTarget {
|
|
10
23
|
connectionId: string;
|
|
11
24
|
sessionId: string;
|
|
@@ -185,8 +198,21 @@ export declare class PermissionClassifier {
|
|
|
185
198
|
* tests and ad-hoc usages still write log lines.
|
|
186
199
|
*/
|
|
187
200
|
private log;
|
|
201
|
+
private approvalStateListener?;
|
|
202
|
+
private approvalEventListener?;
|
|
203
|
+
private activeApprovalCount;
|
|
188
204
|
constructor(rules: PermissionRule[], defaultMode?: PermissionMode, approvalBackend?: ApprovalBackend);
|
|
189
205
|
setLogger(log: typeof rootPermLogger): void;
|
|
206
|
+
setApprovalStateListener(listener: ((waiting: boolean, toolName: string) => void) | undefined): void;
|
|
207
|
+
/**
|
|
208
|
+
* Observe interactive-approval lifecycle (requested → resolved). The engine
|
|
209
|
+
* wires this to the `notification` hook so plugins / settings hooks can
|
|
210
|
+
* react to "waiting for the user's decision" moments (system notification,
|
|
211
|
+
* IM ping, …). Listener errors are swallowed — observation must never
|
|
212
|
+
* affect the approval outcome.
|
|
213
|
+
*/
|
|
214
|
+
setApprovalEventListener(listener: ((event: ApprovalLifecycleEvent) => void) | undefined): void;
|
|
215
|
+
private emitApprovalEvent;
|
|
190
216
|
/** Replace mode + backend in place so live tool execution sees the change. */
|
|
191
217
|
reconfigure(mode: PermissionMode, approvalBackend: ApprovalBackend, rules?: PermissionRule[]): void;
|
|
192
218
|
getMode(): PermissionMode;
|
|
@@ -1237,6 +1237,9 @@ export class PermissionClassifier {
|
|
|
1237
1237
|
* tests and ad-hoc usages still write log lines.
|
|
1238
1238
|
*/
|
|
1239
1239
|
log = rootPermLogger;
|
|
1240
|
+
approvalStateListener;
|
|
1241
|
+
approvalEventListener;
|
|
1242
|
+
activeApprovalCount = 0;
|
|
1240
1243
|
constructor(rules, defaultMode = "default", approvalBackend = new HeadlessApprovalBackend("deny-all")) {
|
|
1241
1244
|
this.rules = rules;
|
|
1242
1245
|
this.defaultMode = defaultMode;
|
|
@@ -1245,6 +1248,27 @@ export class PermissionClassifier {
|
|
|
1245
1248
|
setLogger(log) {
|
|
1246
1249
|
this.log = log;
|
|
1247
1250
|
}
|
|
1251
|
+
setApprovalStateListener(listener) {
|
|
1252
|
+
this.approvalStateListener = listener;
|
|
1253
|
+
}
|
|
1254
|
+
/**
|
|
1255
|
+
* Observe interactive-approval lifecycle (requested → resolved). The engine
|
|
1256
|
+
* wires this to the `notification` hook so plugins / settings hooks can
|
|
1257
|
+
* react to "waiting for the user's decision" moments (system notification,
|
|
1258
|
+
* IM ping, …). Listener errors are swallowed — observation must never
|
|
1259
|
+
* affect the approval outcome.
|
|
1260
|
+
*/
|
|
1261
|
+
setApprovalEventListener(listener) {
|
|
1262
|
+
this.approvalEventListener = listener;
|
|
1263
|
+
}
|
|
1264
|
+
emitApprovalEvent(event) {
|
|
1265
|
+
try {
|
|
1266
|
+
this.approvalEventListener?.(event);
|
|
1267
|
+
}
|
|
1268
|
+
catch {
|
|
1269
|
+
/* observers must not affect approval flow */
|
|
1270
|
+
}
|
|
1271
|
+
}
|
|
1248
1272
|
/** Replace mode + backend in place so live tool execution sees the change. */
|
|
1249
1273
|
reconfigure(mode, approvalBackend, rules) {
|
|
1250
1274
|
this.defaultMode = mode;
|
|
@@ -1330,6 +1354,14 @@ export class PermissionClassifier {
|
|
|
1330
1354
|
riskLevel,
|
|
1331
1355
|
});
|
|
1332
1356
|
let result;
|
|
1357
|
+
this.activeApprovalCount++;
|
|
1358
|
+
this.approvalStateListener?.(true, toolName);
|
|
1359
|
+
this.emitApprovalEvent({
|
|
1360
|
+
phase: "requested",
|
|
1361
|
+
toolName,
|
|
1362
|
+
riskLevel,
|
|
1363
|
+
...(opts?.sessionId ? { sessionId: opts.sessionId } : {}),
|
|
1364
|
+
});
|
|
1333
1365
|
try {
|
|
1334
1366
|
const baseDescription = this.describeToolCall(toolName, args);
|
|
1335
1367
|
const description = reason ? `${baseDescription}\n\nReason:\n${reason}` : baseDescription;
|
|
@@ -1345,12 +1377,24 @@ export class PermissionClassifier {
|
|
|
1345
1377
|
span.fail(err, { tool: toolName });
|
|
1346
1378
|
throw err;
|
|
1347
1379
|
}
|
|
1380
|
+
finally {
|
|
1381
|
+
this.activeApprovalCount = Math.max(0, this.activeApprovalCount - 1);
|
|
1382
|
+
if (this.activeApprovalCount === 0)
|
|
1383
|
+
this.approvalStateListener?.(false, toolName);
|
|
1384
|
+
}
|
|
1348
1385
|
if (result.approved) {
|
|
1349
1386
|
this.denialTracker.recordSuccess(toolName);
|
|
1350
1387
|
}
|
|
1351
1388
|
else {
|
|
1352
1389
|
this.denialTracker.record(toolName);
|
|
1353
1390
|
}
|
|
1391
|
+
this.emitApprovalEvent({
|
|
1392
|
+
phase: "resolved",
|
|
1393
|
+
toolName,
|
|
1394
|
+
riskLevel,
|
|
1395
|
+
approved: result.approved,
|
|
1396
|
+
...(opts?.sessionId ? { sessionId: opts.sessionId } : {}),
|
|
1397
|
+
});
|
|
1354
1398
|
span.end({
|
|
1355
1399
|
tool: toolName,
|
|
1356
1400
|
approved: result.approved,
|
|
@@ -1385,6 +1429,8 @@ export class PermissionClassifier {
|
|
|
1385
1429
|
return "medium";
|
|
1386
1430
|
if (toolName === "Bash")
|
|
1387
1431
|
return "medium";
|
|
1432
|
+
if (toolName === "Panel")
|
|
1433
|
+
return args.action === "invoke" ? "medium" : "low";
|
|
1388
1434
|
// Only genuinely read-only built-ins are "low" (the sole tier
|
|
1389
1435
|
// AutoApprovalBackend approves with no delegate). Everything else —
|
|
1390
1436
|
// crucially every MCP tool, which can delete records, send messages, or
|
|
@@ -2,27 +2,38 @@
|
|
|
2
2
|
* Unified tool registry — built-in tools + MCP tools.
|
|
3
3
|
*/
|
|
4
4
|
import type { RegisteredTool, ToolDefinition, ToolResult } from "../types.js";
|
|
5
|
+
import { type BuiltinTool, type BuiltinToolGuard } from "./builtin/index.js";
|
|
5
6
|
import type { ToolContext } from "./context.js";
|
|
6
7
|
/**
|
|
7
8
|
* Default execution timeout for any tool that does not declare its own
|
|
8
9
|
* timeoutMs at registration time. Tools that need to run longer (Agent,
|
|
9
|
-
*
|
|
10
|
+
* Bash, or custom capability tools) should set timeoutMs explicitly.
|
|
10
11
|
*/
|
|
11
12
|
export declare const DEFAULT_TOOL_TIMEOUT_MS = 120000;
|
|
12
13
|
export interface ToolRegistryOptions {
|
|
13
14
|
builtinTools?: readonly string[];
|
|
15
|
+
/** Core catalog plus any tools contributed by host capability packages. */
|
|
16
|
+
toolCatalog?: readonly BuiltinTool[];
|
|
14
17
|
}
|
|
15
18
|
type ToolImplementation = (args: Record<string, unknown>, ctx?: ToolContext) => Promise<unknown>;
|
|
16
19
|
export declare class ToolRegistry {
|
|
17
20
|
private tools;
|
|
18
21
|
private builtinExecutors;
|
|
22
|
+
private availabilityGuards;
|
|
19
23
|
constructor(options?: ToolRegistryOptions);
|
|
20
24
|
private registerBuiltins;
|
|
21
25
|
registerTool(tool: RegisteredTool, executor?: ToolImplementation): void;
|
|
26
|
+
/** Create an engine-local registry view without sharing mutable maps. */
|
|
27
|
+
fork(): ToolRegistry;
|
|
22
28
|
unregisterTool(name: string): void;
|
|
23
29
|
getToolDefinitions(): ToolDefinition[];
|
|
24
30
|
getTool(name: string): RegisteredTool | undefined;
|
|
25
31
|
hasTool(name: string): boolean;
|
|
32
|
+
/** Test/harness introspection: definitions without implementations are valid
|
|
33
|
+
* for some dynamic registrations, but every builtin catalog entry must have
|
|
34
|
+
* an executor. */
|
|
35
|
+
hasExecutor(name: string): boolean;
|
|
36
|
+
getAvailabilityGuard(name: string): BuiltinToolGuard | undefined;
|
|
26
37
|
executeTool(name: string, args: Record<string, unknown>, options?: {
|
|
27
38
|
timeoutMs?: number;
|
|
28
39
|
signal?: AbortSignal;
|
|
@@ -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, toToolExecutionResult } 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,6 +40,9 @@ 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) {
|
|
@@ -45,9 +52,17 @@ export class ToolRegistry {
|
|
|
45
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) => ({
|
|
@@ -63,6 +78,15 @@ export class ToolRegistry {
|
|
|
63
78
|
hasTool(name) {
|
|
64
79
|
return this.tools.has(name);
|
|
65
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
|
+
}
|
|
66
90
|
async executeTool(name, args, options) {
|
|
67
91
|
const tool = this.tools.get(name);
|
|
68
92
|
if (!tool) {
|
|
@@ -74,7 +98,7 @@ export class ToolRegistry {
|
|
|
74
98
|
}
|
|
75
99
|
// Tool timeout precedence:
|
|
76
100
|
// options.timeoutMs (per-call override) > tool.timeoutMs (declared at registration) > default 120s.
|
|
77
|
-
// 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).
|
|
78
102
|
const timeout = options?.timeoutMs ?? tool.timeoutMs ?? DEFAULT_TOOL_TIMEOUT_MS;
|
|
79
103
|
const parentSignal = options?.signal;
|
|
80
104
|
const id = `tool_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
|
|
@@ -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;
|