@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
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The audit trail behind {@link FIRST_PHASE_EXPOSURE}. Kept as data so the
|
|
3
|
+
* "excluded" decisions are visible too — a bare allowlist tells a reviewer what
|
|
4
|
+
* was included but not what was considered and rejected, which is the more
|
|
5
|
+
* useful half when judging whether the surface is sound.
|
|
6
|
+
*/
|
|
7
|
+
export const FIRST_PHASE_EXPOSURE_RATIONALE = [
|
|
8
|
+
{
|
|
9
|
+
tool: "Panel",
|
|
10
|
+
kind: "host-loopback",
|
|
11
|
+
status: "exposed",
|
|
12
|
+
reason: "Only list/open/tools. These are read-or-focus, and they have a broadcast " +
|
|
13
|
+
"fallback, so they work without an owning window. invoke stays out for now " +
|
|
14
|
+
"for a DIFFERENT reason than originally recorded: the owner claim it was " +
|
|
15
|
+
"waiting on now exists and is wired (ExternalRuntimeService claims before " +
|
|
16
|
+
"the runtime starts), so the blocker is no longer technical. What is still " +
|
|
17
|
+
"missing is a per-Panel-App risk review — invoke runs third-party Panel App " +
|
|
18
|
+
"code with whatever arguments the model supplies, and argsPatterns cannot " +
|
|
19
|
+
"constrain a nested payload. Enabling it is a policy decision, not a wiring " +
|
|
20
|
+
"one, and it belongs to whoever reviews the first Panel App to be trusted.",
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
// NOTE the names: there is no tool called "Browser". The registry exposes
|
|
24
|
+
// three separate browser tools, and an allowlist entry for a name that does
|
|
25
|
+
// not exist is silently inert — it neither grants nor denies anything,
|
|
26
|
+
// which is the worst of both (a reviewer reads it as covered).
|
|
27
|
+
tool: "browser_navigate",
|
|
28
|
+
kind: "host-loopback",
|
|
29
|
+
status: "exposed",
|
|
30
|
+
reason: "The browser capability the runtime genuinely lacks — the differentiator, " +
|
|
31
|
+
"not a duplicate — and the owner argument it was waiting on is the same one " +
|
|
32
|
+
"Panel now has: ExternalRuntimeService registers the session and claims the " +
|
|
33
|
+
"owning window before the runtime starts. Stays under ToolExecutor plus the " +
|
|
34
|
+
"user's permission rules; without an owning window it fails closed on " +
|
|
35
|
+
"routing rather than broadcasting.",
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
tool: "browser_observe",
|
|
39
|
+
kind: "host-loopback",
|
|
40
|
+
status: "exposed",
|
|
41
|
+
reason: "Reads page content. Same owner story as browser_navigate, no mutation.",
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
tool: "browser_act",
|
|
45
|
+
kind: "host-loopback",
|
|
46
|
+
status: "exposed",
|
|
47
|
+
reason: "Click / type / interact — the mutating third of the browser surface, and " +
|
|
48
|
+
"the one that combines with InjectCredential to act as the logged-in user. " +
|
|
49
|
+
"Exposed on the product owner's call, under the same ToolExecutor rules as " +
|
|
50
|
+
"every other entry here.",
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
tool: "InjectCredential",
|
|
54
|
+
kind: "host-loopback",
|
|
55
|
+
status: "exposed",
|
|
56
|
+
reason: "Injects saved cookie credentials into the built-in browser to restore a " +
|
|
57
|
+
"login. This is the single highest-risk entry in this file and the one " +
|
|
58
|
+
"reviewers should look at first: it hands a live session cookie to a page, " +
|
|
59
|
+
"and a model that can also drive the Browser can then act as the logged-in " +
|
|
60
|
+
"user. §12.4 excluded credential-bearing tools outright; that blanket rule " +
|
|
61
|
+
"is relaxed here on the product owner's explicit call because credential " +
|
|
62
|
+
"restore is what makes browser automation usable at all. The mitigation is " +
|
|
63
|
+
"NOT the allowlist — it is the tool's own in-tool approval, which stays " +
|
|
64
|
+
"mandatory (see builtin/index.ts) and is never auto-approved for an " +
|
|
65
|
+
"external runtime. If that approval is ever made skippable, this entry must " +
|
|
66
|
+
"go back to excluded.",
|
|
67
|
+
},
|
|
68
|
+
// ── Still excluded, and for a different KIND of reason ───────────
|
|
69
|
+
// The four below are not held back out of caution — widening the allowlist
|
|
70
|
+
// does not make them work. Each is excluded by a structural property that
|
|
71
|
+
// would have to be designed away first, so listing them would produce a tool
|
|
72
|
+
// that is advertised and then fails or misbehaves.
|
|
73
|
+
{
|
|
74
|
+
tool: "Agent",
|
|
75
|
+
kind: "self-contained",
|
|
76
|
+
status: "excluded",
|
|
77
|
+
reason: "Can spawn another agent, so an external runtime could recurse into itself, " +
|
|
78
|
+
"nest approvals, and escape concurrency/budget limits (§12.5). Unlike Bash " +
|
|
79
|
+
"or Browser, this is not a permission question: the recursion has no owner " +
|
|
80
|
+
"and no budget to charge, so exposing it would need a nesting model first.",
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
tool: "DriveAgent",
|
|
84
|
+
kind: "self-contained",
|
|
85
|
+
status: "excluded",
|
|
86
|
+
reason: "Same recursion hazard as Agent (§12.5).",
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
tool: "EnterPlanMode",
|
|
90
|
+
kind: "self-contained",
|
|
91
|
+
status: "excluded",
|
|
92
|
+
reason: "Engine state-machine tool. Exposing it lets the runtime and the Native " +
|
|
93
|
+
"Engine drive each other's plan state (§12.3) — and an external runtime has " +
|
|
94
|
+
"no Engine plan state of its own to enter, so the call has no coherent " +
|
|
95
|
+
"meaning on this path.",
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
tool: "ExitPlanMode",
|
|
99
|
+
kind: "self-contained",
|
|
100
|
+
status: "excluded",
|
|
101
|
+
reason: "Engine state-machine tool; same reason as EnterPlanMode.",
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
tool: "Read",
|
|
105
|
+
kind: "self-contained",
|
|
106
|
+
status: "exposed",
|
|
107
|
+
reason: "Overlaps a tool the runtime already has, which was the original reason to " +
|
|
108
|
+
"exclude it. That reasoning was wrong about which risk matters: the runtime's " +
|
|
109
|
+
"OWN Read answers to the runtime's sandbox, while this one answers to " +
|
|
110
|
+
"ToolExecutor — path policy, project trust and the user's permission rules. " +
|
|
111
|
+
"Exposing it means the model has a reachable path that IS governed by " +
|
|
112
|
+
"CodeShell, which is the point of augmented mode. Naming overlap is a " +
|
|
113
|
+
"presentation problem (the MCP server prefixes its tools); sandbox " +
|
|
114
|
+
"divergence is a security one.",
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
tool: "Bash",
|
|
118
|
+
kind: "self-contained",
|
|
119
|
+
status: "exposed",
|
|
120
|
+
reason: "Same argument as Read, and it is the tool where it matters most: the " +
|
|
121
|
+
"runtime's own shell runs under the runtime's approval policy, which the " +
|
|
122
|
+
"user did not configure and cannot see. Routing a shell call through " +
|
|
123
|
+
"ToolExecutor puts it under the user's own permission rules and the " +
|
|
124
|
+
"approval UI. Note this does NOT remove the runtime's own shell — it adds a " +
|
|
125
|
+
"governed alternative.",
|
|
126
|
+
},
|
|
127
|
+
// ── Skills, memory and planning ──────────────────────────────────
|
|
128
|
+
// These are the reason someone runs a model inside CodeShell rather than in a
|
|
129
|
+
// bare terminal. A runtime that cannot reach them is a stranger in the app: it
|
|
130
|
+
// cannot load the user's skills, cannot recall anything, and forgets the
|
|
131
|
+
// session the moment it ends. Phase one excluded them by omission rather than
|
|
132
|
+
// by argument — no rationale entry existed at all, which is how a surface ends
|
|
133
|
+
// up shipping at 1 tool out of 48 without anyone deciding that.
|
|
134
|
+
{
|
|
135
|
+
tool: "Skill",
|
|
136
|
+
kind: "self-contained",
|
|
137
|
+
status: "exposed",
|
|
138
|
+
reason: "Loads a SKILL.md body and returns it as the tool result — it reads from " +
|
|
139
|
+
"the scanner, never the disk directly, and executes nothing itself. A skill " +
|
|
140
|
+
"body may TELL the model to run commands, but those become ordinary tool " +
|
|
141
|
+
"calls that face the same authorization as any other. Withholding Skill " +
|
|
142
|
+
"does not withhold that capability; it only withholds the user's own " +
|
|
143
|
+
"curated instructions.",
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
tool: "MemoryRead",
|
|
147
|
+
kind: "self-contained",
|
|
148
|
+
status: "exposed",
|
|
149
|
+
reason: "Reads the user's memory store. No side effects.",
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
tool: "MemoryList",
|
|
153
|
+
kind: "self-contained",
|
|
154
|
+
status: "exposed",
|
|
155
|
+
reason: "Enumerates memory entries. No side effects.",
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
tool: "MemorySave",
|
|
159
|
+
kind: "self-contained",
|
|
160
|
+
status: "exposed",
|
|
161
|
+
reason: "Writes to the memory store, so it is a mutation — but a scoped one, into " +
|
|
162
|
+
"a store the user can read and edit, and it carries the same permission " +
|
|
163
|
+
"rules as on the native path.",
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
tool: "MemoryDelete",
|
|
167
|
+
kind: "self-contained",
|
|
168
|
+
status: "exposed",
|
|
169
|
+
reason: "Mutation, same store and same rules as MemorySave.",
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
tool: "TodoWrite",
|
|
173
|
+
kind: "self-contained",
|
|
174
|
+
status: "exposed",
|
|
175
|
+
reason: "Session-scoped task list. Visible to the user, trivially reversible.",
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
tool: "Glob",
|
|
179
|
+
kind: "self-contained",
|
|
180
|
+
status: "exposed",
|
|
181
|
+
reason: "Path search under the same path policy as Read.",
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
tool: "Grep",
|
|
185
|
+
kind: "self-contained",
|
|
186
|
+
status: "exposed",
|
|
187
|
+
reason: "Content search under the same path policy as Read.",
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
tool: "Write",
|
|
191
|
+
kind: "self-contained",
|
|
192
|
+
status: "exposed",
|
|
193
|
+
reason: "File mutation governed by ToolExecutor. Same argument as Bash.",
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
tool: "Edit",
|
|
197
|
+
kind: "self-contained",
|
|
198
|
+
status: "exposed",
|
|
199
|
+
reason: "File mutation governed by ToolExecutor. Same argument as Bash.",
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
tool: "WebSearch",
|
|
203
|
+
kind: "self-contained",
|
|
204
|
+
status: "exposed",
|
|
205
|
+
reason: "Read-only network lookup; already available to the model by other means.",
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
tool: "WebFetch",
|
|
209
|
+
kind: "self-contained",
|
|
210
|
+
status: "exposed",
|
|
211
|
+
reason: "Read-only fetch, subject to the same URL handling as the native path.",
|
|
212
|
+
},
|
|
213
|
+
];
|
|
214
|
+
/**
|
|
215
|
+
* Action-level narrowing for tools that multiplex several operations behind one
|
|
216
|
+
* name. Anchored automatically — see `matchesWholeValue`.
|
|
217
|
+
*
|
|
218
|
+
* This is a second, independent layer from the tool's own
|
|
219
|
+
* `defaultPermissionRules`: those decide allow/ask for a call that IS permitted,
|
|
220
|
+
* while this decides whether the action is reachable from an external runtime at
|
|
221
|
+
* all. Both are narrowed to read-only actions in phase one, and `Panel.invoke`
|
|
222
|
+
* additionally fails closed on owner routing — three independent barriers, by
|
|
223
|
+
* design.
|
|
224
|
+
*/
|
|
225
|
+
const FIRST_PHASE_ARGS_PATTERNS = new Map([
|
|
226
|
+
// Panel.invoke remains the one action-level restriction. It runs third-party
|
|
227
|
+
// Panel App code with whatever arguments the model supplies, and argsPatterns
|
|
228
|
+
// cannot constrain a nested payload — so unlike every tool widened above, the
|
|
229
|
+
// authorization layer genuinely cannot see what is being authorized. Enabling
|
|
230
|
+
// it belongs to whoever reviews the first Panel App to be trusted.
|
|
231
|
+
["Panel", { action: "list|open|tools" }],
|
|
232
|
+
]);
|
|
233
|
+
/**
|
|
234
|
+
* `ReadonlySet` / `ReadonlyMap` are compile-time only — the underlying `Set` and
|
|
235
|
+
* `Map` stay mutable at runtime, and this policy is a process-wide singleton read
|
|
236
|
+
* live on every `execute()`. Without this, one `argsPatterns.delete("Panel")`
|
|
237
|
+
* anywhere in the process would re-enable `Panel.invoke` for every already-running
|
|
238
|
+
* host: exactly the capability held back pending the §9.3.2 owner claim.
|
|
239
|
+
*/
|
|
240
|
+
function reject() {
|
|
241
|
+
throw new TypeError("The external tool exposure policy is frozen and cannot be widened.");
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Hand out a plain object implementing the read half of `Set`, not a real `Set`.
|
|
245
|
+
*
|
|
246
|
+
* Shadowing `add`/`delete`/`clear` on a `Set` is not enough: the prototype method
|
|
247
|
+
* is still reachable (`Set.prototype.add.call(policySet, "Bash")`), and `delete
|
|
248
|
+
* s.add` un-shadows it. Returning a non-`Set` object removes the mutators
|
|
249
|
+
* entirely — there is no `Set` internal slot to target — and `Object.freeze`
|
|
250
|
+
* stops the read methods from being swapped out.
|
|
251
|
+
*/
|
|
252
|
+
function frozenSet(values) {
|
|
253
|
+
const inner = new Set(values);
|
|
254
|
+
const view = Object.freeze({
|
|
255
|
+
has: (value) => inner.has(value),
|
|
256
|
+
get size() {
|
|
257
|
+
return inner.size;
|
|
258
|
+
},
|
|
259
|
+
keys: () => inner.keys(),
|
|
260
|
+
values: () => inner.values(),
|
|
261
|
+
entries: () => inner.entries(),
|
|
262
|
+
// Pass the VIEW as the third argument, never `inner`. Set.prototype.forEach
|
|
263
|
+
// hands the callback the collection itself, so forwarding `inner` would leak
|
|
264
|
+
// a live mutable handle to the very object this wrapper exists to protect —
|
|
265
|
+
// `policy.forEach((_a, _b, s) => s.add("Bash"))` would widen it in one line,
|
|
266
|
+
// through the public frozen API, with no prototype tricks at all.
|
|
267
|
+
forEach: (fn, thisArg) => inner.forEach((a, b) => fn.call(thisArg, a, b, view)),
|
|
268
|
+
[Symbol.iterator]: () => inner[Symbol.iterator](),
|
|
269
|
+
add: reject,
|
|
270
|
+
delete: reject,
|
|
271
|
+
clear: reject,
|
|
272
|
+
});
|
|
273
|
+
return view;
|
|
274
|
+
}
|
|
275
|
+
/** Same reasoning as {@link frozenSet}, for the args-pattern map. */
|
|
276
|
+
function frozenMap(entries) {
|
|
277
|
+
const inner = new Map(entries);
|
|
278
|
+
const view = Object.freeze({
|
|
279
|
+
get: (key) => inner.get(key),
|
|
280
|
+
has: (key) => inner.has(key),
|
|
281
|
+
get size() {
|
|
282
|
+
return inner.size;
|
|
283
|
+
},
|
|
284
|
+
keys: () => inner.keys(),
|
|
285
|
+
values: () => inner.values(),
|
|
286
|
+
entries: () => inner.entries(),
|
|
287
|
+
// See frozenSet.forEach — arg 3 must be the view, not `inner`.
|
|
288
|
+
forEach: (fn, thisArg) => inner.forEach((v, k) => fn.call(thisArg, v, k, view)),
|
|
289
|
+
[Symbol.iterator]: () => inner[Symbol.iterator](),
|
|
290
|
+
set: reject,
|
|
291
|
+
delete: reject,
|
|
292
|
+
clear: reject,
|
|
293
|
+
});
|
|
294
|
+
return view;
|
|
295
|
+
}
|
|
296
|
+
/** The phase-one policy. Pass to `createSessionToolHost({ exposure })`. */
|
|
297
|
+
export const FIRST_PHASE_EXPOSURE = Object.freeze({
|
|
298
|
+
mode: "allowlist",
|
|
299
|
+
toolNames: frozenSet(FIRST_PHASE_EXPOSURE_RATIONALE.filter((entry) => entry.status === "exposed").map((entry) => entry.tool)),
|
|
300
|
+
argsPatterns: frozenMap([...FIRST_PHASE_ARGS_PATTERNS].map(([tool, patterns]) => [
|
|
301
|
+
tool,
|
|
302
|
+
Object.freeze({ ...patterns }),
|
|
303
|
+
])),
|
|
304
|
+
});
|
|
@@ -48,6 +48,12 @@ export declare function buildStdioEnv(serverName: string, config: MCPServerConfi
|
|
|
48
48
|
export declare function buildHttpHeaders(serverName: string, config: MCPServerConfig, resolveCredential?: (id: string) => HttpCredentialResolverResult, options?: BuildHttpHeadersOptions): Record<string, string>;
|
|
49
49
|
export declare function bearerTokenFromMcpCredential(serverName: string, credentialId: string, credential: ResolvedMcpCredential, options?: BuildHttpHeadersOptions): string;
|
|
50
50
|
export declare function buildHttpHeadersWithCredentialAccess(serverName: string, config: MCPServerConfig, access?: Pick<CredentialAccess, "resolveValue"> & Partial<Pick<CredentialAccess, "resolveMeta">>, options?: BuildHttpHeadersOptions): Promise<Record<string, string>>;
|
|
51
|
+
/**
|
|
52
|
+
* Fetch adapter for long-lived HTTP MCP transports. OAuth access tokens are
|
|
53
|
+
* resolved for every request, refreshed by the host inside the skew window,
|
|
54
|
+
* and force-refreshed once after a replayable 401.
|
|
55
|
+
*/
|
|
56
|
+
export declare function createMcpAuthenticatedFetch(serverName: string, config: MCPServerConfig, access?: CredentialAccess, baseFetch?: typeof fetch): typeof fetch;
|
|
51
57
|
/**
|
|
52
58
|
* Infer the transport when the config doesn't name one: a url-only entry is
|
|
53
59
|
* HTTP, everything else stdio. This is the CC `.mcp.json` convention —
|
|
@@ -73,6 +79,16 @@ export declare function spillMcpImage(serverName: string, toolName: string, base
|
|
|
73
79
|
export declare function wrapMcpOutput(serverName: string, toolName: string, body: string): string;
|
|
74
80
|
export declare function stripInternalToolArgs(args: Record<string, unknown>): Record<string, unknown>;
|
|
75
81
|
export declare function buildRegisteredTool(serverName: string, tool: McpTool): RegisteredTool;
|
|
82
|
+
/**
|
|
83
|
+
* Per-server outcome of a connectAll() sweep (see the optional onServerEvent
|
|
84
|
+
* parameter). The engine forwards these onto the `notification` hook so hosts
|
|
85
|
+
* and plugins can surface MCP availability without polling.
|
|
86
|
+
*/
|
|
87
|
+
export interface McpServerLifecycleEvent {
|
|
88
|
+
type: "mcp_server_connected" | "mcp_server_failed";
|
|
89
|
+
server: string;
|
|
90
|
+
error?: string;
|
|
91
|
+
}
|
|
76
92
|
export declare class MCPManager {
|
|
77
93
|
private readonly toolRegistry;
|
|
78
94
|
private static instance;
|
|
@@ -98,7 +114,7 @@ export declare class MCPManager {
|
|
|
98
114
|
/**
|
|
99
115
|
* Connect to all configured MCP servers and register their tools.
|
|
100
116
|
*/
|
|
101
|
-
connectAll(servers: Record<string, MCPServerConfig>, owner?: unknown): Promise<void>;
|
|
117
|
+
connectAll(servers: Record<string, MCPServerConfig>, owner?: unknown, onServerEvent?: (event: McpServerLifecycleEvent) => void): Promise<void>;
|
|
102
118
|
reconcile(servers: Record<string, MCPServerConfig>, owner?: unknown): Promise<void>;
|
|
103
119
|
/**
|
|
104
120
|
* Remove one owner from the shared desired-server pool and disconnect servers
|
|
@@ -11,6 +11,7 @@ import { getCredentialAccess } from "../credentials/access.js";
|
|
|
11
11
|
import { buildOAuthRefreshRequest, oauthCredentialStatus, parseOAuthCredentialSecret, } from "../credentials/oauth.js";
|
|
12
12
|
import { ENV_ALLOWLIST } from "../runtime/spawn-common.js";
|
|
13
13
|
import { mkdir, readdir, unlink, writeFile } from "node:fs/promises";
|
|
14
|
+
import { randomUUID } from "node:crypto";
|
|
14
15
|
import { join } from "node:path";
|
|
15
16
|
import { diagnoseMcpStdioMissingCommand, previewPath } from "./mcp-stdio-diagnostics.js";
|
|
16
17
|
import { codeShellHome } from "../session/session-manager.js";
|
|
@@ -153,6 +154,60 @@ export async function buildHttpHeadersWithCredentialAccess(serverName, config, a
|
|
|
153
154
|
});
|
|
154
155
|
return buildHttpHeaders(serverName, config, (id) => id === config.credentialRef ? { secret, type: meta?.type, label: meta?.label } : undefined, options);
|
|
155
156
|
}
|
|
157
|
+
/**
|
|
158
|
+
* Fetch adapter for long-lived HTTP MCP transports. OAuth access tokens are
|
|
159
|
+
* resolved for every request, refreshed by the host inside the skew window,
|
|
160
|
+
* and force-refreshed once after a replayable 401.
|
|
161
|
+
*/
|
|
162
|
+
export function createMcpAuthenticatedFetch(serverName, config, access = getCredentialAccess(), baseFetch = fetch) {
|
|
163
|
+
return (async (input, init) => {
|
|
164
|
+
const credentialId = config.credentialRef;
|
|
165
|
+
const meta = credentialId ? access.resolveMeta(undefined, credentialId, "full") : undefined;
|
|
166
|
+
const isOAuth = meta?.type === "oauth";
|
|
167
|
+
const headers = isOAuth
|
|
168
|
+
? buildHttpHeaders(serverName, { ...config, credentialRef: undefined })
|
|
169
|
+
: await buildHttpHeadersWithCredentialAccess(serverName, config, access);
|
|
170
|
+
let token;
|
|
171
|
+
if (isOAuth) {
|
|
172
|
+
if (!access.resolveOAuthAccess) {
|
|
173
|
+
throw new Error(`MCP server "${serverName}": oauth credential "${credentialId}" requires host OAuth access`);
|
|
174
|
+
}
|
|
175
|
+
token = (await access.resolveOAuthAccess({ id: credentialId, scope: "full" })).accessToken;
|
|
176
|
+
}
|
|
177
|
+
// The SDK and Bun can contribute distinct undici-compatible Request types.
|
|
178
|
+
// Normalize once at the adapter boundary instead of leaking that ambient
|
|
179
|
+
// declaration mismatch through the authentication/replay logic.
|
|
180
|
+
const source = new Request(input, init);
|
|
181
|
+
let replayable = true;
|
|
182
|
+
try {
|
|
183
|
+
source.clone();
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
replayable = false;
|
|
187
|
+
}
|
|
188
|
+
const send = async (accessToken) => {
|
|
189
|
+
const request = replayable ? source.clone() : source;
|
|
190
|
+
const requestHeaders = new Headers(Array.from(request.headers.entries()));
|
|
191
|
+
for (const [name, value] of Object.entries(headers))
|
|
192
|
+
requestHeaders.set(name, value);
|
|
193
|
+
if (accessToken)
|
|
194
|
+
requestHeaders.set("Authorization", `Bearer ${accessToken}`);
|
|
195
|
+
return baseFetch(new Request(request, {
|
|
196
|
+
headers: Array.from(requestHeaders.entries()),
|
|
197
|
+
}));
|
|
198
|
+
};
|
|
199
|
+
const first = await send(token);
|
|
200
|
+
if (first.status !== 401 || !isOAuth || !credentialId || !replayable || source.signal.aborted) {
|
|
201
|
+
return first;
|
|
202
|
+
}
|
|
203
|
+
const refreshed = await access.resolveOAuthAccess({
|
|
204
|
+
id: credentialId,
|
|
205
|
+
scope: "full",
|
|
206
|
+
forceRefresh: true,
|
|
207
|
+
});
|
|
208
|
+
return send(refreshed.accessToken);
|
|
209
|
+
});
|
|
210
|
+
}
|
|
156
211
|
/**
|
|
157
212
|
* Infer the transport when the config doesn't name one: a url-only entry is
|
|
158
213
|
* HTTP, everything else stdio. This is the CC `.mcp.json` convention —
|
|
@@ -186,9 +241,7 @@ const MAX_MCP_IMAGE_SPILLS_PER_TOOL = 50;
|
|
|
186
241
|
const MAX_MCP_IMAGE_BYTES = 8 * 1024 * 1024;
|
|
187
242
|
function spillTimestamp(filename, prefix) {
|
|
188
243
|
const suffix = filename.slice(prefix.length);
|
|
189
|
-
const
|
|
190
|
-
const raw = dot === -1 ? suffix : suffix.slice(0, dot);
|
|
191
|
-
const timestamp = Number(raw);
|
|
244
|
+
const timestamp = Number(/^\d+/.exec(suffix)?.[0]);
|
|
192
245
|
return Number.isFinite(timestamp) ? timestamp : 0;
|
|
193
246
|
}
|
|
194
247
|
async function pruneMcpImageSpills(baseDir, prefix) {
|
|
@@ -232,7 +285,7 @@ export async function spillMcpImage(serverName, toolName, base64, mimeType, opts
|
|
|
232
285
|
const safeServer = serverName.replace(/[^\w.-]+/g, "_");
|
|
233
286
|
const safeTool = toolName.replace(/[^\w.-]+/g, "_");
|
|
234
287
|
const prefix = `${safeServer}-${safeTool}-`;
|
|
235
|
-
const filename = `${prefix}${now()}.${ext}`;
|
|
288
|
+
const filename = `${prefix}${now()}-${randomUUID().slice(0, 8)}.${ext}`;
|
|
236
289
|
const filePath = join(baseDir, filename);
|
|
237
290
|
try {
|
|
238
291
|
await mkdir(baseDir, { recursive: true });
|
|
@@ -297,6 +350,7 @@ export function buildRegisteredTool(serverName, tool) {
|
|
|
297
350
|
},
|
|
298
351
|
source: "mcp",
|
|
299
352
|
serverName,
|
|
353
|
+
mcpToolName: tool.name,
|
|
300
354
|
permissionDefault: "ask",
|
|
301
355
|
isConcurrencySafe: readOnly,
|
|
302
356
|
isReadOnly: readOnly,
|
|
@@ -335,7 +389,7 @@ export class MCPManager {
|
|
|
335
389
|
/**
|
|
336
390
|
* Connect to all configured MCP servers and register their tools.
|
|
337
391
|
*/
|
|
338
|
-
async connectAll(servers, owner) {
|
|
392
|
+
async connectAll(servers, owner, onServerEvent) {
|
|
339
393
|
const enabledNames = this.enabledServerNames(servers);
|
|
340
394
|
// Register this owner's desired set up front (see reconcile's shared-pool
|
|
341
395
|
// note) so a later reconcile from ANOTHER session can't disconnect servers
|
|
@@ -362,12 +416,21 @@ export class MCPManager {
|
|
|
362
416
|
const results = await Promise.allSettled(entries.map(([name, config]) => this.connect(name, config)));
|
|
363
417
|
for (let i = 0; i < results.length; i++) {
|
|
364
418
|
const result = results[i];
|
|
419
|
+
const server = entries[i][0];
|
|
365
420
|
if (result.status === "rejected") {
|
|
366
421
|
logger.warn("mcp.connect_failed", {
|
|
367
|
-
server
|
|
422
|
+
server,
|
|
368
423
|
error: result.reason.message,
|
|
369
424
|
});
|
|
370
425
|
}
|
|
426
|
+
try {
|
|
427
|
+
onServerEvent?.(result.status === "rejected"
|
|
428
|
+
? { type: "mcp_server_failed", server, error: result.reason.message }
|
|
429
|
+
: { type: "mcp_server_connected", server });
|
|
430
|
+
}
|
|
431
|
+
catch {
|
|
432
|
+
/* observers must not affect connection handling */
|
|
433
|
+
}
|
|
371
434
|
}
|
|
372
435
|
}
|
|
373
436
|
async reconcile(servers, owner) {
|
|
@@ -472,9 +535,11 @@ export class MCPManager {
|
|
|
472
535
|
// credentialRef resolves against user-scope credential access. The shared
|
|
473
536
|
// MCPManager pool has no per-session cwd, and MCP-referenced credentials
|
|
474
537
|
// (e.g. a Figma token) remain user-global by design.
|
|
475
|
-
const
|
|
538
|
+
const access = getCredentialAccess();
|
|
539
|
+
const headers = buildHttpHeaders(name, { ...config, credentialRef: undefined });
|
|
476
540
|
transport = new StreamableHTTPClientTransport(new URL(config.url), {
|
|
477
541
|
requestInit: Object.keys(headers).length ? { headers } : undefined,
|
|
542
|
+
fetch: createMcpAuthenticatedFetch(name, config, access),
|
|
478
543
|
});
|
|
479
544
|
}
|
|
480
545
|
else {
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { MCPServerConfig, RegisteredTool } from "../types.js";
|
|
2
|
+
export interface McpToolPolicy {
|
|
3
|
+
/** Undefined means every tool is eligible before the denylist is applied. */
|
|
4
|
+
allowedTools?: ReadonlySet<string>;
|
|
5
|
+
disabledTools: ReadonlySet<string>;
|
|
6
|
+
}
|
|
7
|
+
export declare function buildMcpToolPolicies(servers: Record<string, MCPServerConfig>): ReadonlyMap<string, McpToolPolicy>;
|
|
8
|
+
export declare function isMcpToolNameAllowed(policies: ReadonlyMap<string, McpToolPolicy> | undefined, serverName: string, toolName: string): boolean;
|
|
9
|
+
export declare function isRegisteredMcpToolAllowed(tool: Pick<RegisteredTool, "source" | "serverName" | "mcpToolName">, policies: ReadonlyMap<string, McpToolPolicy> | undefined): boolean;
|
|
@@ -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 {};
|
|
@@ -49,11 +49,30 @@ export interface ClassifyOptions {
|
|
|
49
49
|
/** "read" or "write" — different defaults for sensitive paths. */
|
|
50
50
|
operation: PathOperation;
|
|
51
51
|
}
|
|
52
|
+
export interface FinalWritePathSnapshot {
|
|
53
|
+
resolvedPath: string;
|
|
54
|
+
workspacePath: string;
|
|
55
|
+
insideWorkspace: boolean;
|
|
56
|
+
}
|
|
52
57
|
export type PathApprovalScope = "once" | "session" | "project";
|
|
53
58
|
/** Test seam: clear the in-memory session grants. */
|
|
54
59
|
export declare function _resetSessionPathGrants(): void;
|
|
55
60
|
export declare function openSessionPathApprovals(sessionId: string): void;
|
|
56
61
|
export declare function clearSessionPathApprovals(sessionId: string): void;
|
|
62
|
+
/**
|
|
63
|
+
* Capture the concrete target approved by the executor's first path-policy
|
|
64
|
+
* pass. The snapshot is carried on the internal args object via a symbol, so
|
|
65
|
+
* it cannot collide with an LLM-supplied schema property or leak into logs.
|
|
66
|
+
*/
|
|
67
|
+
export declare function attachFinalWritePathSnapshot(args: Record<string, unknown>, filePath: string, workspaceRoot: string): Record<string, unknown>;
|
|
68
|
+
export declare function getFinalWritePathSnapshot(args: Record<string, unknown>, filePath: string, workspaceRoot: string): FinalWritePathSnapshot;
|
|
69
|
+
export declare function revalidateFinalWritePath(filePath: string, workspaceRoot: string, approved: FinalWritePathSnapshot): {
|
|
70
|
+
resolvedPath: string;
|
|
71
|
+
} | {
|
|
72
|
+
error: string;
|
|
73
|
+
};
|
|
74
|
+
/** Open the already-revalidated final path without following its last segment. */
|
|
75
|
+
export declare function writeFileNoFollow(filePath: string, content: string): Promise<void>;
|
|
57
76
|
/**
|
|
58
77
|
* Classify a file path against the workspace + sensitive-path policy.
|
|
59
78
|
*
|