@cjhyy/code-shell-core 0.5.0-rc.1 → 0.6.0-rc.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 +13 -10
- package/dist/agent/agent-definition-registry.d.ts +21 -3
- package/dist/agent/agent-definition-registry.js +49 -18
- package/dist/agent/agent-definition.d.ts +32 -0
- package/dist/agent/agent-definition.js +49 -4
- package/dist/arena/arena.js +11 -12
- package/dist/arena/context/context-tools.js +47 -6
- package/dist/arena/context/within-root.d.ts +7 -0
- package/dist/arena/context/within-root.js +15 -0
- package/dist/arena/iterate/phases/argue.js +8 -2
- package/dist/arena/iterate/phases/revise.js +1 -1
- package/dist/arena/iterate/phases/tournament.js +3 -3
- package/dist/arena/ledger.js +9 -1
- package/dist/arena/phases/adjudication.js +1 -4
- package/dist/arena/phases/build-consensus.js +1 -4
- package/dist/arena/phases/cross-review.js +2 -8
- package/dist/arena/phases/debate-rounds.js +1 -4
- package/dist/arena/phases/participant-research.js +1 -4
- package/dist/arena/phases/planning-detail-expansion.js +8 -10
- package/dist/arena/planner.js +0 -1
- package/dist/arena/providers/docs.d.ts +1 -0
- package/dist/arena/providers/docs.js +5 -2
- package/dist/arena/providers/repo.d.ts +1 -0
- package/dist/arena/providers/repo.js +5 -2
- package/dist/arena/strategies/utils.d.ts +1 -4
- package/dist/arena/strategies/utils.js +7 -51
- package/dist/arena/transitions.d.ts +7 -2
- package/dist/arena/transitions.js +9 -4
- package/dist/arena/types.d.ts +8 -2
- package/dist/automation/cron-expr.d.ts +41 -0
- package/dist/automation/cron-expr.js +169 -0
- package/dist/automation/index.d.ts +41 -0
- package/dist/automation/index.js +39 -0
- package/dist/automation/runner.d.ts +84 -0
- package/dist/automation/runner.js +92 -0
- package/dist/automation/scheduler.d.ts +194 -0
- package/dist/automation/scheduler.js +623 -0
- package/dist/automation/store.d.ts +39 -0
- package/dist/automation/store.js +122 -0
- package/dist/automation/write-policy.d.ts +34 -0
- package/dist/automation/write-policy.js +113 -0
- package/dist/automation/write-run.d.ts +51 -0
- package/dist/automation/write-run.js +38 -0
- package/dist/capability-control/disabled-lists.d.ts +25 -0
- package/dist/capability-control/disabled-lists.js +57 -0
- package/dist/capability-control/index.d.ts +5 -0
- package/dist/capability-control/index.js +3 -0
- package/dist/capability-control/overlay.d.ts +64 -0
- package/dist/capability-control/overlay.js +116 -0
- package/dist/capability-control/project.d.ts +65 -0
- package/dist/capability-control/project.js +147 -0
- package/dist/capability-control/service.d.ts +70 -0
- package/dist/capability-control/service.js +147 -0
- package/dist/capability-control/types.d.ts +62 -0
- package/dist/capability-control/types.js +17 -0
- package/dist/cc-orchestrator/agent-adapter.d.ts +50 -0
- package/dist/cc-orchestrator/agent-adapter.js +133 -0
- package/dist/cc-orchestrator/cc-capability.d.ts +19 -0
- package/dist/cc-orchestrator/cc-capability.js +53 -0
- package/dist/cc-orchestrator/codex-session-discovery.d.ts +24 -0
- package/dist/cc-orchestrator/codex-session-discovery.js +191 -0
- package/dist/cc-orchestrator/codex-session-history.d.ts +25 -0
- package/dist/cc-orchestrator/codex-session-history.js +187 -0
- package/dist/cc-orchestrator/external-agent-changes.d.ts +19 -0
- package/dist/cc-orchestrator/external-agent-changes.js +214 -0
- package/dist/cc-orchestrator/external-agent-driver.d.ts +18 -0
- package/dist/cc-orchestrator/external-agent-driver.js +69 -0
- package/dist/cc-orchestrator/index.d.ts +8 -0
- package/dist/cc-orchestrator/index.js +8 -0
- package/dist/cc-orchestrator/relevance-judge.d.ts +15 -0
- package/dist/cc-orchestrator/relevance-judge.js +29 -0
- package/dist/cc-orchestrator/session-discovery.d.ts +46 -0
- package/dist/cc-orchestrator/session-discovery.js +125 -0
- package/dist/cc-orchestrator/session-history.d.ts +19 -0
- package/dist/cc-orchestrator/session-history.js +67 -0
- package/dist/cli/agent-server-stdio.d.ts +26 -1
- package/dist/cli/agent-server-stdio.js +221 -28
- package/dist/cli/agent-server-tcp.d.ts +20 -0
- package/dist/cli/agent-server-tcp.js +134 -0
- package/dist/cli/graceful-shutdown.d.ts +27 -0
- package/dist/cli/graceful-shutdown.js +30 -0
- package/dist/context/compaction.d.ts +56 -0
- package/dist/context/compaction.js +209 -15
- package/dist/context/manager.d.ts +0 -20
- package/dist/context/manager.js +25 -41
- package/dist/cost-tracker.js +5 -61
- package/dist/credentials/cipher.d.ts +49 -0
- package/dist/credentials/cipher.js +45 -0
- package/dist/credentials/cookie-jar.d.ts +24 -0
- package/dist/credentials/cookie-jar.js +40 -0
- package/dist/credentials/index.d.ts +7 -0
- package/dist/credentials/index.js +5 -0
- package/dist/credentials/inject-credential-tool.d.ts +20 -0
- package/dist/credentials/inject-credential-tool.js +130 -0
- package/dist/credentials/store.d.ts +72 -0
- package/dist/credentials/store.js +184 -0
- package/dist/credentials/types.d.ts +56 -0
- package/dist/credentials/use-credential-tool.d.ts +29 -0
- package/dist/credentials/use-credential-tool.js +205 -0
- package/dist/credentials/use-gate.d.ts +56 -0
- package/dist/credentials/use-gate.js +52 -0
- package/dist/cron/cron-runtime.d.ts +2 -0
- package/dist/cron/cron-runtime.js +2 -0
- package/dist/cron/cron-store.d.ts +2 -0
- package/dist/cron/cron-store.js +2 -0
- package/dist/cron/scheduler.d.ts +5 -32
- package/dist/cron/scheduler.js +5 -113
- package/dist/data/model-metadata.d.ts +77 -0
- package/dist/data/model-metadata.js +56 -0
- package/dist/data/model-metadata.json +216 -0
- package/dist/data/openrouter-models.d.ts +18 -7
- package/dist/data/openrouter-models.js +35 -8
- package/dist/data/openrouter-sync.js +1 -1
- package/dist/engine/aux-key.d.ts +10 -0
- package/dist/engine/aux-key.js +11 -0
- package/dist/engine/dynamic-tool-defs.d.ts +19 -0
- package/dist/engine/dynamic-tool-defs.js +36 -0
- package/dist/engine/engine.d.ts +431 -108
- package/dist/engine/engine.js +1630 -279
- package/dist/engine/friendly-error.d.ts +18 -0
- package/dist/engine/friendly-error.js +63 -0
- package/dist/engine/goal.d.ts +187 -0
- package/dist/engine/goal.js +196 -0
- package/dist/engine/image-compression.d.ts +81 -0
- package/dist/engine/image-compression.js +186 -0
- package/dist/engine/image-policy.d.ts +165 -0
- package/dist/engine/image-policy.js +189 -0
- package/dist/engine/model-connections-pool.d.ts +17 -0
- package/dist/engine/model-connections-pool.js +66 -0
- package/dist/engine/model-facade.d.ts +10 -0
- package/dist/engine/model-facade.js +25 -0
- package/dist/engine/patch-orphaned-tools.js +3 -0
- package/dist/engine/reactive-threshold.d.ts +13 -0
- package/dist/engine/reactive-threshold.js +17 -0
- package/dist/engine/resolve-llm-config.d.ts +16 -0
- package/dist/engine/resolve-llm-config.js +44 -0
- package/dist/engine/runtime.js +9 -1
- package/dist/engine/sandbox-cache-key.d.ts +10 -0
- package/dist/engine/sandbox-cache-key.js +9 -0
- package/dist/engine/sandbox-config.d.ts +31 -0
- package/dist/engine/sandbox-config.js +38 -0
- package/dist/engine/session-title.d.ts +13 -0
- package/dist/engine/session-title.js +34 -0
- package/dist/engine/session-usage.d.ts +19 -0
- package/dist/engine/session-usage.js +25 -0
- package/dist/engine/steer-queue.d.ts +32 -0
- package/dist/engine/steer-queue.js +26 -0
- package/dist/engine/streaming-tool-queue.d.ts +12 -0
- package/dist/engine/streaming-tool-queue.js +50 -10
- package/dist/engine/turn-loop.d.ts +94 -9
- package/dist/engine/turn-loop.js +775 -342
- package/dist/engine/types.d.ts +175 -0
- package/dist/engine/types.js +13 -0
- package/dist/external-agents/config.d.ts +2 -0
- package/dist/external-agents/config.js +15 -0
- package/dist/external-agents/types.d.ts +31 -0
- package/dist/external-agents/types.js +1 -0
- package/dist/git/parse-log.d.ts +13 -0
- package/dist/git/parse-log.js +21 -0
- package/dist/git/utils.d.ts +8 -6
- package/dist/git/utils.js +62 -26
- package/dist/git/worktree.d.ts +48 -0
- package/dist/git/worktree.js +111 -20
- package/dist/hooks/events.d.ts +23 -1
- package/dist/hooks/goal-stop-hook.d.ts +58 -0
- package/dist/hooks/goal-stop-hook.js +279 -0
- package/dist/hooks/hook-output.d.ts +33 -0
- package/dist/hooks/hook-output.js +79 -0
- package/dist/hooks/registry.d.ts +15 -0
- package/dist/hooks/registry.js +57 -1
- package/dist/hooks/shell-runner.d.ts +2 -0
- package/dist/hooks/shell-runner.js +48 -18
- package/dist/index.d.ts +79 -11
- package/dist/index.js +89 -6
- package/dist/llm/capabilities/param-specs.d.ts +14 -0
- package/dist/llm/capabilities/param-specs.js +62 -0
- package/dist/llm/capabilities/reasoning-control.d.ts +24 -0
- package/dist/llm/capabilities/reasoning-control.js +38 -0
- package/dist/llm/capabilities/rules.js +37 -3
- package/dist/llm/capabilities/types.d.ts +32 -2
- package/dist/llm/clamp-max-tokens.d.ts +11 -0
- package/dist/llm/clamp-max-tokens.js +17 -0
- package/dist/llm/client-base.d.ts +69 -5
- package/dist/llm/client-base.js +185 -25
- package/dist/llm/client-factory.d.ts +3 -3
- package/dist/llm/client-factory.js +2 -2
- package/dist/llm/model-cache.js +4 -2
- package/dist/llm/model-pool.d.ts +29 -11
- package/dist/llm/model-pool.js +36 -20
- package/dist/llm/provider-auth.d.ts +41 -0
- package/dist/llm/provider-auth.js +76 -0
- package/dist/llm/provider-catalog.d.ts +6 -2
- package/dist/llm/providers/anthropic.d.ts +32 -2
- package/dist/llm/providers/anthropic.js +207 -18
- package/dist/llm/providers/openai.d.ts +47 -2
- package/dist/llm/providers/openai.js +478 -71
- package/dist/llm/reasoning-setting.d.ts +51 -0
- package/dist/llm/reasoning-setting.js +40 -0
- package/dist/llm/stop-reason.d.ts +13 -0
- package/dist/llm/stop-reason.js +21 -0
- package/dist/llm/stream-watchdog.js +5 -1
- package/dist/llm/strip-vision.d.ts +32 -0
- package/dist/llm/strip-vision.js +94 -0
- package/dist/llm/token-counter.js +9 -2
- package/dist/llm/types.d.ts +9 -6
- package/dist/logging/logger.js +18 -4
- package/dist/logging/sanitize-messages.d.ts +10 -0
- package/dist/logging/sanitize-messages.js +112 -0
- package/dist/lsp/client.js +28 -8
- package/dist/lsp/manager.d.ts +1 -1
- package/dist/lsp/manager.js +42 -11
- package/dist/lsp/root-path.d.ts +9 -0
- package/dist/lsp/root-path.js +12 -0
- package/dist/model-catalog/builtin.d.ts +12 -0
- package/dist/model-catalog/builtin.js +407 -0
- package/dist/model-catalog/gen-connections.d.ts +20 -0
- package/dist/model-catalog/gen-connections.js +28 -0
- package/dist/model-catalog/index.d.ts +41 -0
- package/dist/model-catalog/index.js +90 -0
- package/dist/model-catalog/params.d.ts +20 -0
- package/dist/model-catalog/params.js +45 -0
- package/dist/model-catalog/resolve.d.ts +48 -0
- package/dist/model-catalog/resolve.js +33 -0
- package/dist/model-catalog/save-entry.d.ts +32 -0
- package/dist/model-catalog/save-entry.js +104 -0
- package/dist/model-catalog/types.d.ts +561 -0
- package/dist/model-catalog/types.js +93 -0
- package/dist/model-catalog/upsert.d.ts +9 -0
- package/dist/model-catalog/upsert.js +8 -0
- package/dist/onboarding.d.ts +12 -82
- package/dist/onboarding.js +75 -333
- package/dist/plugins/gitOps.d.ts +53 -0
- package/dist/plugins/gitOps.js +130 -5
- package/dist/plugins/installer/checkUpdate.d.ts +16 -0
- package/dist/plugins/installer/checkUpdate.js +32 -0
- package/dist/plugins/installer/codex/convertAgents.d.ts +7 -0
- package/dist/plugins/installer/codex/convertAgents.js +55 -0
- package/dist/plugins/installer/codex/convertCommands.d.ts +19 -0
- package/dist/plugins/installer/codex/convertCommands.js +46 -0
- package/dist/plugins/installer/codex/convertMcp.d.ts +11 -0
- package/dist/plugins/installer/codex/convertMcp.js +85 -0
- package/dist/plugins/installer/codex/convertSkills.d.ts +12 -0
- package/dist/plugins/installer/codex/convertSkills.js +33 -0
- package/dist/plugins/installer/detectFormat.d.ts +2 -0
- package/dist/plugins/installer/detectFormat.js +6 -0
- package/dist/plugins/installer/install.d.ts +7 -0
- package/dist/plugins/installer/install.js +123 -0
- package/dist/plugins/installer/installFromArchive.d.ts +43 -0
- package/dist/plugins/installer/installFromArchive.js +134 -0
- package/dist/plugins/installer/installFromSource.d.ts +13 -0
- package/dist/plugins/installer/installFromSource.js +51 -0
- package/dist/plugins/installer/list.d.ts +9 -0
- package/dist/plugins/installer/list.js +30 -0
- package/dist/plugins/installer/loadPluginAgents.d.ts +3 -0
- package/dist/plugins/installer/loadPluginAgents.js +27 -0
- package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
- package/dist/plugins/installer/loadPluginMcp.js +107 -0
- package/dist/plugins/installer/parseSource.d.ts +20 -0
- package/dist/plugins/installer/parseSource.js +74 -0
- package/dist/plugins/installer/paths.d.ts +5 -0
- package/dist/plugins/installer/paths.js +25 -0
- package/dist/plugins/installer/pruneDisabled.d.ts +24 -0
- package/dist/plugins/installer/pruneDisabled.js +73 -0
- package/dist/plugins/installer/types.d.ts +52 -0
- package/dist/plugins/installer/types.js +28 -0
- package/dist/plugins/installer/uninstall.d.ts +2 -0
- package/dist/plugins/installer/uninstall.js +18 -0
- package/dist/plugins/installer/unzip.d.ts +14 -0
- package/dist/plugins/installer/unzip.js +82 -0
- package/dist/plugins/installer/update.d.ts +28 -0
- package/dist/plugins/installer/update.js +97 -0
- package/dist/plugins/loadPluginHooks.d.ts +54 -1
- package/dist/plugins/loadPluginHooks.js +83 -1
- package/dist/plugins/marketplaceManager.d.ts +15 -1
- package/dist/plugins/marketplaceManager.js +58 -4
- package/dist/plugins/pluginCommandHook.js +34 -14
- package/dist/plugins/pluginContent.d.ts +30 -0
- package/dist/plugins/pluginContent.js +83 -0
- package/dist/plugins/pluginInstaller.d.ts +34 -0
- package/dist/plugins/pluginInstaller.js +168 -35
- package/dist/plugins/schemas.js +41 -6
- package/dist/plugins/types.d.ts +10 -0
- package/dist/preset/index.d.ts +7 -1
- package/dist/preset/index.js +112 -6
- package/dist/product/types.d.ts +1 -1
- package/dist/prompt/composer.d.ts +31 -0
- package/dist/prompt/composer.js +95 -25
- package/dist/prompt/instruction-scanner.js +5 -3
- package/dist/prompt/section-loader.js +1 -0
- package/dist/prompt/sections/base.md +1 -0
- package/dist/prompt/sections/browser.md +10 -0
- package/dist/prompt/sections/coding.md +4 -0
- package/dist/prompt/sections/orchestration.md +8 -0
- package/dist/protocol/chat-session-manager.d.ts +15 -2
- package/dist/protocol/chat-session-manager.js +46 -0
- package/dist/protocol/chat-session.d.ts +82 -0
- package/dist/protocol/chat-session.js +121 -1
- package/dist/protocol/client.d.ts +27 -0
- package/dist/protocol/client.js +38 -0
- package/dist/protocol/redact.d.ts +50 -0
- package/dist/protocol/redact.js +71 -0
- package/dist/protocol/server.d.ts +153 -2
- package/dist/protocol/server.js +807 -39
- package/dist/protocol/tcp-transport.d.ts +45 -0
- package/dist/protocol/tcp-transport.js +74 -0
- package/dist/protocol/transport.js +3 -2
- package/dist/protocol/types.d.ts +69 -0
- package/dist/protocol/types.js +22 -0
- package/dist/quota/credentials.d.ts +3 -0
- package/dist/quota/credentials.js +80 -0
- package/dist/quota/index.d.ts +36 -0
- package/dist/quota/index.js +155 -0
- package/dist/quota/types.d.ts +48 -0
- package/dist/quota/types.js +13 -0
- package/dist/remote/bridge.d.ts +11 -2
- package/dist/remote/bridge.js +61 -33
- package/dist/review/review-prompt.d.ts +28 -0
- package/dist/review/review-prompt.js +81 -0
- package/dist/run/ArtifactTracker.js +5 -4
- package/dist/run/EngineRunner.d.ts +27 -1
- package/dist/run/EngineRunner.js +46 -8
- package/dist/run/FileRunStore.js +40 -11
- package/dist/run/RunApprovalBackend.js +25 -5
- package/dist/run/RunLock.d.ts +28 -2
- package/dist/run/RunLock.js +49 -7
- package/dist/run/RunManager.d.ts +12 -0
- package/dist/run/RunManager.js +86 -3
- package/dist/run/RunQueue.d.ts +1 -0
- package/dist/run/RunQueue.js +8 -2
- package/dist/run/factory.d.ts +8 -1
- package/dist/run/factory.js +1 -0
- package/dist/run/index.d.ts +2 -2
- package/dist/run/index.js +1 -1
- package/dist/run/redirect-target.d.ts +7 -0
- package/dist/run/redirect-target.js +13 -0
- package/dist/run/types.js +1 -1
- package/dist/runtime/background-shell.d.ts +139 -0
- package/dist/runtime/background-shell.js +495 -0
- package/dist/runtime/output-clean.d.ts +24 -0
- package/dist/runtime/output-clean.js +41 -0
- package/dist/runtime/ring-file.d.ts +64 -0
- package/dist/runtime/ring-file.js +174 -0
- package/dist/runtime/safe-spawn.js +15 -34
- package/dist/runtime/spawn-common.d.ts +148 -0
- package/dist/runtime/spawn-common.js +303 -0
- package/dist/runtime/truncate-output.d.ts +22 -0
- package/dist/runtime/truncate-output.js +49 -0
- package/dist/runtime/utf8-cut.d.ts +11 -0
- package/dist/runtime/utf8-cut.js +23 -0
- package/dist/services/auto-dream.d.ts +4 -0
- package/dist/services/auto-dream.js +26 -26
- package/dist/services/browser-open.d.ts +13 -0
- package/dist/services/browser-open.js +16 -0
- package/dist/services/diagnostics.d.ts +1 -2
- package/dist/services/diagnostics.js +12 -7
- package/dist/services/dream-consolidation.d.ts +57 -0
- package/dist/services/dream-consolidation.js +151 -0
- package/dist/services/extract-memories.d.ts +14 -1
- package/dist/services/extract-memories.js +45 -6
- package/dist/services/memory-orchestrator.d.ts +21 -0
- package/dist/services/memory-orchestrator.js +125 -32
- package/dist/services/notifier.d.ts +8 -0
- package/dist/services/notifier.js +39 -25
- package/dist/services/oauth.js +5 -7
- package/dist/services/session-memory-sort.d.ts +8 -0
- package/dist/services/session-memory-sort.js +9 -0
- package/dist/services/session-memory.js +30 -19
- package/dist/session/file-history.d.ts +124 -1
- package/dist/session/file-history.js +232 -9
- package/dist/session/memory.d.ts +116 -2
- package/dist/session/memory.js +250 -28
- package/dist/session/session-manager.d.ts +63 -1
- package/dist/session/session-manager.js +186 -5
- package/dist/session/simple-diff.d.ts +23 -0
- package/dist/session/simple-diff.js +84 -0
- package/dist/session/transcript.d.ts +25 -1
- package/dist/session/transcript.js +35 -2
- package/dist/session/undo-target.d.ts +67 -0
- package/dist/session/undo-target.js +144 -0
- package/dist/settings/disk-defaults.d.ts +42 -0
- package/dist/settings/disk-defaults.js +33 -0
- package/dist/settings/feature-flags.d.ts +64 -0
- package/dist/settings/feature-flags.js +61 -0
- package/dist/settings/manager.d.ts +101 -1
- package/dist/settings/manager.js +345 -15
- package/dist/settings/migrate-config.d.ts +45 -0
- package/dist/settings/migrate-config.js +125 -0
- package/dist/settings/personalization.d.ts +19 -0
- package/dist/settings/personalization.js +7 -0
- package/dist/settings/schema-export.d.ts +25 -0
- package/dist/settings/schema-export.js +38 -0
- package/dist/settings/schema.d.ts +1827 -396
- package/dist/settings/schema.js +361 -81
- package/dist/skills/scanner.d.ts +9 -0
- package/dist/skills/scanner.js +30 -2
- package/dist/stt/resolve-transcribe.d.ts +31 -0
- package/dist/stt/resolve-transcribe.js +108 -0
- package/dist/stt/transcribe.d.ts +51 -0
- package/dist/stt/transcribe.js +65 -0
- package/dist/tool-system/browser-bridge.d.ts +226 -0
- package/dist/tool-system/browser-bridge.js +163 -0
- package/dist/tool-system/builtin/add-marketplace.d.ts +12 -0
- package/dist/tool-system/builtin/add-marketplace.js +76 -0
- package/dist/tool-system/builtin/agent-heartbeat.d.ts +49 -0
- package/dist/tool-system/builtin/agent-heartbeat.js +89 -0
- package/dist/tool-system/builtin/agent-notifications.d.ts +12 -3
- package/dist/tool-system/builtin/agent-notifications.js +9 -3
- package/dist/tool-system/builtin/agent-output-file.d.ts +38 -0
- package/dist/tool-system/builtin/agent-output-file.js +72 -0
- package/dist/tool-system/builtin/agent-registry.d.ts +23 -0
- package/dist/tool-system/builtin/agent-registry.js +16 -4
- package/dist/tool-system/builtin/agent.d.ts +50 -11
- package/dist/tool-system/builtin/agent.js +576 -73
- package/dist/tool-system/builtin/apply-patch/applier.js +66 -8
- package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +10 -0
- package/dist/tool-system/builtin/apply-patch/backup-targets.js +30 -0
- package/dist/tool-system/builtin/apply-patch/index.js +7 -3
- package/dist/tool-system/builtin/arena.js +6 -7
- package/dist/tool-system/builtin/background-jobs.d.ts +76 -0
- package/dist/tool-system/builtin/background-jobs.js +124 -0
- package/dist/tool-system/builtin/background-shell-tools.d.ts +20 -0
- package/dist/tool-system/builtin/background-shell-tools.js +108 -0
- package/dist/tool-system/builtin/background-work.d.ts +67 -0
- package/dist/tool-system/builtin/background-work.js +86 -0
- package/dist/tool-system/builtin/bash-output-style.d.ts +32 -0
- package/dist/tool-system/builtin/bash-output-style.js +40 -0
- package/dist/tool-system/builtin/bash.d.ts +5 -2
- package/dist/tool-system/builtin/bash.js +98 -62
- package/dist/tool-system/builtin/browser-tools.d.ts +33 -0
- package/dist/tool-system/builtin/browser-tools.js +312 -0
- package/dist/tool-system/builtin/cancel-goal.d.ts +31 -0
- package/dist/tool-system/builtin/cancel-goal.js +64 -0
- package/dist/tool-system/builtin/check-quota.d.ts +15 -0
- package/dist/tool-system/builtin/check-quota.js +34 -0
- package/dist/tool-system/builtin/complete-goal.d.ts +25 -0
- package/dist/tool-system/builtin/complete-goal.js +45 -0
- package/dist/tool-system/builtin/config.js +7 -0
- package/dist/tool-system/builtin/cron.d.ts +7 -0
- package/dist/tool-system/builtin/cron.js +105 -9
- package/dist/tool-system/builtin/drive-claude-code.d.ts +30 -0
- package/dist/tool-system/builtin/drive-claude-code.js +157 -0
- package/dist/tool-system/builtin/edit-model-catalog.d.ts +3 -0
- package/dist/tool-system/builtin/edit-model-catalog.js +94 -0
- package/dist/tool-system/builtin/edit.d.ts +2 -1
- package/dist/tool-system/builtin/edit.js +21 -12
- package/dist/tool-system/builtin/eol.d.ts +29 -0
- package/dist/tool-system/builtin/eol.js +37 -0
- package/dist/tool-system/builtin/file-cache.d.ts +6 -0
- package/dist/tool-system/builtin/file-cache.js +8 -0
- package/dist/tool-system/builtin/generate-image.d.ts +60 -0
- package/dist/tool-system/builtin/generate-image.js +374 -0
- package/dist/tool-system/builtin/generate-video.d.ts +55 -0
- package/dist/tool-system/builtin/generate-video.js +361 -0
- package/dist/tool-system/builtin/grep.js +6 -2
- package/dist/tool-system/builtin/image-providers.d.ts +86 -0
- package/dist/tool-system/builtin/image-providers.js +190 -0
- package/dist/tool-system/builtin/image-uploader.d.ts +33 -0
- package/dist/tool-system/builtin/image-uploader.js +74 -0
- package/dist/tool-system/builtin/index.d.ts +24 -1
- package/dist/tool-system/builtin/index.js +310 -25
- package/dist/tool-system/builtin/mcp-tools.js +23 -3
- package/dist/tool-system/builtin/memory.js +45 -7
- package/dist/tool-system/builtin/notebook-edit.d.ts +2 -1
- package/dist/tool-system/builtin/notebook-edit.js +1 -1
- package/dist/tool-system/builtin/powershell.js +4 -1
- package/dist/tool-system/builtin/read.d.ts +2 -1
- package/dist/tool-system/builtin/read.js +11 -3
- package/dist/tool-system/builtin/repl.js +4 -1
- package/dist/tool-system/builtin/skill.js +9 -0
- package/dist/tool-system/builtin/sleep.js +12 -5
- package/dist/tool-system/builtin/task.js +4 -1
- package/dist/tool-system/builtin/tool-search.js +25 -7
- package/dist/tool-system/builtin/update-automation-memory.d.ts +24 -0
- package/dist/tool-system/builtin/update-automation-memory.js +60 -0
- package/dist/tool-system/builtin/video-providers.d.ts +154 -0
- package/dist/tool-system/builtin/video-providers.js +235 -0
- package/dist/tool-system/builtin/view-image.d.ts +18 -0
- package/dist/tool-system/builtin/view-image.js +96 -0
- package/dist/tool-system/builtin/web-fetch.js +12 -2
- package/dist/tool-system/builtin/web-search.d.ts +4 -1
- package/dist/tool-system/builtin/web-search.js +57 -10
- package/dist/tool-system/builtin/worktree.d.ts +2 -1
- package/dist/tool-system/builtin/worktree.js +31 -4
- package/dist/tool-system/builtin/write.d.ts +2 -1
- package/dist/tool-system/builtin/write.js +1 -1
- package/dist/tool-system/context.d.ts +166 -6
- package/dist/tool-system/executor.d.ts +3 -2
- package/dist/tool-system/executor.js +197 -119
- package/dist/tool-system/investigation-guard.d.ts +4 -1
- package/dist/tool-system/investigation-guard.js +20 -4
- package/dist/tool-system/mcp-manager.d.ts +78 -16
- package/dist/tool-system/mcp-manager.js +357 -28
- package/dist/tool-system/path-policy.d.ts +99 -0
- package/dist/tool-system/path-policy.js +578 -0
- package/dist/tool-system/permission.d.ts +36 -1
- package/dist/tool-system/permission.js +322 -117
- package/dist/tool-system/plan-mode-allowlist.d.ts +32 -0
- package/dist/tool-system/plan-mode-allowlist.js +65 -0
- package/dist/tool-system/registry.d.ts +1 -0
- package/dist/tool-system/registry.js +26 -1
- package/dist/tool-system/sandbox/index.d.ts +8 -0
- package/dist/tool-system/sandbox/index.js +7 -2
- package/dist/tool-system/validate-tool-metadata.d.ts +36 -0
- package/dist/tool-system/validate-tool-metadata.js +63 -0
- package/dist/tool-system/validation.d.ts +10 -0
- package/dist/tool-system/validation.js +16 -3
- package/dist/types.d.ts +301 -15
- package/dist/updater.js +20 -9
- package/dist/utils/envUtils.d.ts +0 -9
- package/dist/utils/envUtils.js +3 -28
- package/dist/utils/exec.d.ts +40 -0
- package/dist/utils/exec.js +144 -0
- package/dist/utils/format.js +4 -2
- package/dist/utils/json.d.ts +12 -0
- package/dist/utils/json.js +92 -0
- package/dist/utils/lockfile.js +9 -2
- package/dist/utils/theme.d.ts +7 -1
- package/dist/utils/theme.js +5 -3
- package/dist/utils/toolDisplay.js +0 -1
- package/package.json +14 -7
- package/dist/agent/coordinator.d.ts +0 -49
- package/dist/agent/coordinator.js +0 -77
- package/dist/settings/manager.test.js +0 -73
- package/dist/tool-system/builtin/remote-trigger.d.ts +0 -6
- package/dist/tool-system/builtin/remote-trigger.js +0 -54
- package/dist/tool-system/builtin/send-message.d.ts +0 -6
- package/dist/tool-system/builtin/send-message.js +0 -47
- /package/dist/{settings/manager.test.d.ts → credentials/types.js} +0 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure projection functions: each turns one loader's output + the relevant
|
|
3
|
+
* slice of current settings into CapabilityDescriptor[]. No I/O, no state —
|
|
4
|
+
* the CapabilityService feeds them and composes the results.
|
|
5
|
+
*
|
|
6
|
+
* See docs/superpowers/specs/2026-05-29-capability-control-design.md
|
|
7
|
+
*/
|
|
8
|
+
import type { RegisteredTool, MCPServerConfig } from "../types.js";
|
|
9
|
+
import type { SkillDefinition } from "../skills/scanner.js";
|
|
10
|
+
import type { AgentDefinition } from "../agent/agent-definition.js";
|
|
11
|
+
import type { CapabilityDescriptor } from "./types.js";
|
|
12
|
+
/**
|
|
13
|
+
* Builtin tools. A tool's switch lives in the denylist when it ships in the
|
|
14
|
+
* preset default set (turning it off = adding to agent.disabledBuiltinTools),
|
|
15
|
+
* and in the allowlist otherwise (turning it on = adding to
|
|
16
|
+
* agent.enabledBuiltinTools). This mirrors resolveBuiltinToolNames, whose
|
|
17
|
+
* effective set is `preset.builtinTools ∪ enabled − disabled`.
|
|
18
|
+
*/
|
|
19
|
+
export declare function projectBuiltin(input: {
|
|
20
|
+
tools: RegisteredTool[];
|
|
21
|
+
presetDefaults: string[];
|
|
22
|
+
effective: string[];
|
|
23
|
+
}): CapabilityDescriptor[];
|
|
24
|
+
/**
|
|
25
|
+
* MCP, projected per server (not per tool). Every configured server gets a
|
|
26
|
+
* descriptor — including unconnected ones — driven by the mcpServers config;
|
|
27
|
+
* tool counts come from the registry's connected mcp tools (0 if none).
|
|
28
|
+
*/
|
|
29
|
+
export declare function projectMcp(input: {
|
|
30
|
+
mcpServers: Record<string, MCPServerConfig>;
|
|
31
|
+
mcpTools: RegisteredTool[];
|
|
32
|
+
}): CapabilityDescriptor[];
|
|
33
|
+
/**
|
|
34
|
+
* Project/user skills. The caller MUST pass the FULL skill set (scanSkills
|
|
35
|
+
* with empty opts), because scanSkills filters disabled entries out — passing
|
|
36
|
+
* a filtered set would drop disabled skills from the list, leaving the UI no
|
|
37
|
+
* way to re-enable them. Plugin-sourced skills are excluded here; they surface
|
|
38
|
+
* under their plugin via projectPlugins.
|
|
39
|
+
*/
|
|
40
|
+
export declare function projectSkills(input: {
|
|
41
|
+
skills: SkillDefinition[];
|
|
42
|
+
disabledSkills: string[];
|
|
43
|
+
}): CapabilityDescriptor[];
|
|
44
|
+
/**
|
|
45
|
+
* Project/user sub-agent roles, projected per role. Like projectSkills, the
|
|
46
|
+
* caller MUST pass the FULL agent set (loaded WITHOUT the disabled filter), so
|
|
47
|
+
* disabled roles still appear in the list and can be re-enabled. Plugin-sourced
|
|
48
|
+
* agents are excluded — they ride their plugin's switch via projectPlugins, and
|
|
49
|
+
* disabledAgents only governs user/project roles. Toggling writes the top-level
|
|
50
|
+
* `disabledAgents` denylist (same key the 子代理 tab uses), so the two stay in
|
|
51
|
+
* sync; the project overlay layers on via capabilityOverrides.agents.
|
|
52
|
+
*/
|
|
53
|
+
export declare function projectAgents(input: {
|
|
54
|
+
agents: AgentDefinition[];
|
|
55
|
+
disabledAgents: string[];
|
|
56
|
+
}): CapabilityDescriptor[];
|
|
57
|
+
/**
|
|
58
|
+
* Installed plugins, projected per plugin. Install keys are `<plugin>@<market>`;
|
|
59
|
+
* the bare plugin name is the substring before the last `@` and matches the
|
|
60
|
+
* `plugin:` prefix that disabledPlugins controls.
|
|
61
|
+
*/
|
|
62
|
+
export declare function projectPlugins(input: {
|
|
63
|
+
installed: Record<string, unknown>;
|
|
64
|
+
disabledPlugins: string[];
|
|
65
|
+
}): CapabilityDescriptor[];
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure projection functions: each turns one loader's output + the relevant
|
|
3
|
+
* slice of current settings into CapabilityDescriptor[]. No I/O, no state —
|
|
4
|
+
* the CapabilityService feeds them and composes the results.
|
|
5
|
+
*
|
|
6
|
+
* See docs/superpowers/specs/2026-05-29-capability-control-design.md
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Builtin tools. A tool's switch lives in the denylist when it ships in the
|
|
10
|
+
* preset default set (turning it off = adding to agent.disabledBuiltinTools),
|
|
11
|
+
* and in the allowlist otherwise (turning it on = adding to
|
|
12
|
+
* agent.enabledBuiltinTools). This mirrors resolveBuiltinToolNames, whose
|
|
13
|
+
* effective set is `preset.builtinTools ∪ enabled − disabled`.
|
|
14
|
+
*/
|
|
15
|
+
export function projectBuiltin(input) {
|
|
16
|
+
const defaults = new Set(input.presetDefaults);
|
|
17
|
+
const on = new Set(input.effective);
|
|
18
|
+
return input.tools.map((t) => {
|
|
19
|
+
const inPreset = defaults.has(t.name);
|
|
20
|
+
return {
|
|
21
|
+
id: `builtin:${t.name}`,
|
|
22
|
+
kind: "builtin",
|
|
23
|
+
name: t.name,
|
|
24
|
+
description: t.description,
|
|
25
|
+
enabled: on.has(t.name),
|
|
26
|
+
control: inPreset
|
|
27
|
+
? {
|
|
28
|
+
settingsKey: "agent.disabledBuiltinTools",
|
|
29
|
+
mode: "denylist",
|
|
30
|
+
token: t.name,
|
|
31
|
+
}
|
|
32
|
+
: {
|
|
33
|
+
settingsKey: "agent.enabledBuiltinTools",
|
|
34
|
+
mode: "allowlist",
|
|
35
|
+
token: t.name,
|
|
36
|
+
},
|
|
37
|
+
origin: { isReadOnly: t.isReadOnly },
|
|
38
|
+
};
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* MCP, projected per server (not per tool). Every configured server gets a
|
|
43
|
+
* descriptor — including unconnected ones — driven by the mcpServers config;
|
|
44
|
+
* tool counts come from the registry's connected mcp tools (0 if none).
|
|
45
|
+
*/
|
|
46
|
+
export function projectMcp(input) {
|
|
47
|
+
const counts = new Map();
|
|
48
|
+
for (const t of input.mcpTools) {
|
|
49
|
+
if (t.source !== "mcp" || !t.serverName)
|
|
50
|
+
continue;
|
|
51
|
+
counts.set(t.serverName, (counts.get(t.serverName) ?? 0) + 1);
|
|
52
|
+
}
|
|
53
|
+
return Object.entries(input.mcpServers).map(([serverName, cfg]) => {
|
|
54
|
+
const toolCount = counts.get(serverName) ?? 0;
|
|
55
|
+
return {
|
|
56
|
+
id: `mcp:${serverName}`,
|
|
57
|
+
kind: "mcp",
|
|
58
|
+
name: serverName,
|
|
59
|
+
description: `${toolCount} tools`,
|
|
60
|
+
enabled: cfg.enabled !== false,
|
|
61
|
+
control: {
|
|
62
|
+
settingsKey: "mcpServers",
|
|
63
|
+
mode: "record-flag",
|
|
64
|
+
token: serverName,
|
|
65
|
+
},
|
|
66
|
+
origin: { serverName, toolCount },
|
|
67
|
+
};
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Project/user skills. The caller MUST pass the FULL skill set (scanSkills
|
|
72
|
+
* with empty opts), because scanSkills filters disabled entries out — passing
|
|
73
|
+
* a filtered set would drop disabled skills from the list, leaving the UI no
|
|
74
|
+
* way to re-enable them. Plugin-sourced skills are excluded here; they surface
|
|
75
|
+
* under their plugin via projectPlugins.
|
|
76
|
+
*/
|
|
77
|
+
export function projectSkills(input) {
|
|
78
|
+
const disabled = new Set(input.disabledSkills);
|
|
79
|
+
return input.skills
|
|
80
|
+
.filter((s) => s.source === "project" || s.source === "user")
|
|
81
|
+
.map((s) => ({
|
|
82
|
+
id: `skill:${s.name}`,
|
|
83
|
+
kind: "skill",
|
|
84
|
+
name: s.name,
|
|
85
|
+
description: s.description,
|
|
86
|
+
enabled: !disabled.has(s.name),
|
|
87
|
+
control: {
|
|
88
|
+
settingsKey: "disabledSkills",
|
|
89
|
+
mode: "denylist",
|
|
90
|
+
token: s.name,
|
|
91
|
+
},
|
|
92
|
+
origin: { filePath: s.filePath },
|
|
93
|
+
}));
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Project/user sub-agent roles, projected per role. Like projectSkills, the
|
|
97
|
+
* caller MUST pass the FULL agent set (loaded WITHOUT the disabled filter), so
|
|
98
|
+
* disabled roles still appear in the list and can be re-enabled. Plugin-sourced
|
|
99
|
+
* agents are excluded — they ride their plugin's switch via projectPlugins, and
|
|
100
|
+
* disabledAgents only governs user/project roles. Toggling writes the top-level
|
|
101
|
+
* `disabledAgents` denylist (same key the 子代理 tab uses), so the two stay in
|
|
102
|
+
* sync; the project overlay layers on via capabilityOverrides.agents.
|
|
103
|
+
*/
|
|
104
|
+
export function projectAgents(input) {
|
|
105
|
+
const disabled = new Set(input.disabledAgents);
|
|
106
|
+
return input.agents
|
|
107
|
+
.filter((a) => a.source === "project" || a.source === "user")
|
|
108
|
+
.map((a) => ({
|
|
109
|
+
id: `agent:${a.name}`,
|
|
110
|
+
kind: "agent",
|
|
111
|
+
name: a.name,
|
|
112
|
+
description: a.description,
|
|
113
|
+
enabled: !disabled.has(a.name),
|
|
114
|
+
control: {
|
|
115
|
+
settingsKey: "disabledAgents",
|
|
116
|
+
mode: "denylist",
|
|
117
|
+
token: a.name,
|
|
118
|
+
},
|
|
119
|
+
origin: { filePath: a.filePath },
|
|
120
|
+
}));
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Installed plugins, projected per plugin. Install keys are `<plugin>@<market>`;
|
|
124
|
+
* the bare plugin name is the substring before the last `@` and matches the
|
|
125
|
+
* `plugin:` prefix that disabledPlugins controls.
|
|
126
|
+
*/
|
|
127
|
+
export function projectPlugins(input) {
|
|
128
|
+
const disabled = new Set(input.disabledPlugins);
|
|
129
|
+
const names = new Set();
|
|
130
|
+
for (const key of Object.keys(input.installed)) {
|
|
131
|
+
const at = key.lastIndexOf("@");
|
|
132
|
+
names.add(at > 0 ? key.slice(0, at) : key);
|
|
133
|
+
}
|
|
134
|
+
return [...names].map((name) => ({
|
|
135
|
+
id: `plugin:${name}`,
|
|
136
|
+
kind: "plugin",
|
|
137
|
+
name,
|
|
138
|
+
description: "",
|
|
139
|
+
enabled: !disabled.has(name),
|
|
140
|
+
control: {
|
|
141
|
+
settingsKey: "disabledPlugins",
|
|
142
|
+
mode: "denylist",
|
|
143
|
+
token: name,
|
|
144
|
+
},
|
|
145
|
+
origin: { pluginName: name },
|
|
146
|
+
}));
|
|
147
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CapabilityService — the single control-layer entry point.
|
|
3
|
+
*
|
|
4
|
+
* - list(): composes the four projections into one CapabilityDescriptor[].
|
|
5
|
+
* - setEnabled(id, on): reads the target descriptor's inlined `control` and
|
|
6
|
+
* routes the write to the right settings key. It never branches on `kind`.
|
|
7
|
+
*
|
|
8
|
+
* Dependencies are injected (not imported) so the service is unit-testable
|
|
9
|
+
* without touching disk: the engine / desktop wiring supplies the real
|
|
10
|
+
* ToolRegistry, SettingsManager, and loaders.
|
|
11
|
+
*
|
|
12
|
+
* See docs/superpowers/specs/2026-05-29-capability-control-design.md
|
|
13
|
+
*/
|
|
14
|
+
import type { ToolRegistry } from "../tool-system/registry.js";
|
|
15
|
+
import type { SettingsManager } from "../settings/manager.js";
|
|
16
|
+
import type { SkillDefinition } from "../skills/scanner.js";
|
|
17
|
+
import type { AgentDefinition } from "../agent/agent-definition.js";
|
|
18
|
+
import type { InstalledPluginsV2 } from "../plugins/types.js";
|
|
19
|
+
import type { CapabilityDescriptor, WriteScope, CapabilityOverrideState } from "./types.js";
|
|
20
|
+
export interface CapabilityServiceDeps {
|
|
21
|
+
registry: Pick<ToolRegistry, "listToolsDetailed">;
|
|
22
|
+
settings: Pick<SettingsManager, "get" | "saveUserSetting" | "saveProjectSetting" | "deleteProjectSetting" | "getForScope">;
|
|
23
|
+
cwd: string;
|
|
24
|
+
scanSkills: (cwd: string, opts?: {
|
|
25
|
+
disabledSkills?: string[];
|
|
26
|
+
disabledPlugins?: string[];
|
|
27
|
+
}) => SkillDefinition[];
|
|
28
|
+
/** Full agent role set for `cwd` (user + project), loaded WITHOUT the
|
|
29
|
+
* disabled filter so disabled roles still list and can be re-enabled. */
|
|
30
|
+
scanAgents: (cwd: string) => AgentDefinition[];
|
|
31
|
+
readInstalledPlugins: () => InstalledPluginsV2;
|
|
32
|
+
resolveBuiltinToolNames: (o?: {
|
|
33
|
+
preset?: string;
|
|
34
|
+
enabledBuiltinTools?: string[];
|
|
35
|
+
disabledBuiltinTools?: string[];
|
|
36
|
+
}) => string[];
|
|
37
|
+
}
|
|
38
|
+
export declare class CapabilityService {
|
|
39
|
+
private readonly deps;
|
|
40
|
+
constructor(deps: CapabilityServiceDeps);
|
|
41
|
+
/**
|
|
42
|
+
* List capability descriptors. With no `cwd` this is the user/global view
|
|
43
|
+
* (enabled === global baseline). With a `cwd` it's that project's view:
|
|
44
|
+
* each descriptor gains globalEnabled / projectOverride / effectiveSource
|
|
45
|
+
* and `enabled` reflects the tri-state overlay (spec §6.1).
|
|
46
|
+
*/
|
|
47
|
+
list(cwd?: string): CapabilityDescriptor[];
|
|
48
|
+
/**
|
|
49
|
+
* Toggle a capability. Default scope is "user" (back-compat: old callers
|
|
50
|
+
* pass no opts → global write, unchanged). scope:"project" maps on/off to a
|
|
51
|
+
* tri-state override and writes capabilityOverrides (requires cwd).
|
|
52
|
+
*/
|
|
53
|
+
setEnabled(id: string, on: boolean, opts?: {
|
|
54
|
+
scope?: WriteScope;
|
|
55
|
+
cwd?: string;
|
|
56
|
+
}): void;
|
|
57
|
+
/**
|
|
58
|
+
* Write a project tri-state override. "inherit" deletes the key (we never
|
|
59
|
+
* persist the literal). All capability kinds — including builtin, which
|
|
60
|
+
* writes to capabilityOverrides.builtin.<token> — now support project
|
|
61
|
+
* overrides; only a kind with no bucket (bucketForKind returns undefined)
|
|
62
|
+
* is rejected.
|
|
63
|
+
*/
|
|
64
|
+
setOverride(id: string, state: CapabilityOverrideState, opts: {
|
|
65
|
+
scope: "project";
|
|
66
|
+
cwd: string;
|
|
67
|
+
}): void;
|
|
68
|
+
/** Existing global write path — unchanged behavior, refactored out of setEnabled. */
|
|
69
|
+
private writeUserScope;
|
|
70
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CapabilityService — the single control-layer entry point.
|
|
3
|
+
*
|
|
4
|
+
* - list(): composes the four projections into one CapabilityDescriptor[].
|
|
5
|
+
* - setEnabled(id, on): reads the target descriptor's inlined `control` and
|
|
6
|
+
* routes the write to the right settings key. It never branches on `kind`.
|
|
7
|
+
*
|
|
8
|
+
* Dependencies are injected (not imported) so the service is unit-testable
|
|
9
|
+
* without touching disk: the engine / desktop wiring supplies the real
|
|
10
|
+
* ToolRegistry, SettingsManager, and loaders.
|
|
11
|
+
*
|
|
12
|
+
* See docs/superpowers/specs/2026-05-29-capability-control-design.md
|
|
13
|
+
*/
|
|
14
|
+
import { CapabilityNotFoundError } from "./types.js";
|
|
15
|
+
import { projectBuiltin, projectMcp, projectSkills, projectPlugins, projectAgents, } from "./project.js";
|
|
16
|
+
import { applyOverride, bucketForKind, overrideTokenForId, overrideFor, } from "./overlay.js";
|
|
17
|
+
export class CapabilityService {
|
|
18
|
+
deps;
|
|
19
|
+
constructor(deps) {
|
|
20
|
+
this.deps = deps;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* List capability descriptors. With no `cwd` this is the user/global view
|
|
24
|
+
* (enabled === global baseline). With a `cwd` it's that project's view:
|
|
25
|
+
* each descriptor gains globalEnabled / projectOverride / effectiveSource
|
|
26
|
+
* and `enabled` reflects the tri-state overlay (spec §6.1).
|
|
27
|
+
*/
|
|
28
|
+
list(cwd) {
|
|
29
|
+
const s = this.deps.settings.get();
|
|
30
|
+
const agent = (s.agent ?? {});
|
|
31
|
+
const tools = this.deps.registry.listToolsDetailed();
|
|
32
|
+
const preset = agent.preset;
|
|
33
|
+
const base = [
|
|
34
|
+
...projectBuiltin({
|
|
35
|
+
tools: tools.filter((t) => t.source === "builtin"),
|
|
36
|
+
presetDefaults: this.deps.resolveBuiltinToolNames({ preset }),
|
|
37
|
+
effective: this.deps.resolveBuiltinToolNames({
|
|
38
|
+
preset,
|
|
39
|
+
enabledBuiltinTools: agent.enabledBuiltinTools ?? [],
|
|
40
|
+
disabledBuiltinTools: agent.disabledBuiltinTools ?? [],
|
|
41
|
+
}),
|
|
42
|
+
}),
|
|
43
|
+
...projectMcp({
|
|
44
|
+
mcpServers: s.mcpServers ?? {},
|
|
45
|
+
mcpTools: tools.filter((t) => t.source === "mcp"),
|
|
46
|
+
}),
|
|
47
|
+
...projectSkills({
|
|
48
|
+
skills: this.deps.scanSkills(this.deps.cwd, {}),
|
|
49
|
+
disabledSkills: s.disabledSkills ?? [],
|
|
50
|
+
}),
|
|
51
|
+
...projectPlugins({
|
|
52
|
+
installed: this.deps.readInstalledPlugins().plugins,
|
|
53
|
+
disabledPlugins: s.disabledPlugins ?? [],
|
|
54
|
+
}),
|
|
55
|
+
...projectAgents({
|
|
56
|
+
agents: this.deps.scanAgents(this.deps.cwd),
|
|
57
|
+
disabledAgents: s.disabledAgents ?? [],
|
|
58
|
+
}),
|
|
59
|
+
];
|
|
60
|
+
const overrides = cwd
|
|
61
|
+
? this.deps.settings.getForScope("project", cwd).capabilityOverrides
|
|
62
|
+
: undefined;
|
|
63
|
+
return base.map((d) => {
|
|
64
|
+
const globalEnabled = d.enabled;
|
|
65
|
+
const token = overrideTokenForId(d.id);
|
|
66
|
+
const ov = cwd ? overrideFor(overrides, d.kind, token) : undefined;
|
|
67
|
+
const enabled = applyOverride(globalEnabled, ov);
|
|
68
|
+
return {
|
|
69
|
+
...d,
|
|
70
|
+
enabled,
|
|
71
|
+
globalEnabled,
|
|
72
|
+
projectOverride: ov,
|
|
73
|
+
effectiveSource: ov ? "project" : cwd ? "default" : "user",
|
|
74
|
+
};
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Toggle a capability. Default scope is "user" (back-compat: old callers
|
|
79
|
+
* pass no opts → global write, unchanged). scope:"project" maps on/off to a
|
|
80
|
+
* tri-state override and writes capabilityOverrides (requires cwd).
|
|
81
|
+
*/
|
|
82
|
+
setEnabled(id, on, opts) {
|
|
83
|
+
if (opts?.scope === "project") {
|
|
84
|
+
this.setOverride(id, on ? "on" : "off", {
|
|
85
|
+
scope: "project",
|
|
86
|
+
cwd: opts.cwd ?? this.deps.cwd,
|
|
87
|
+
});
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
this.writeUserScope(id, on);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Write a project tri-state override. "inherit" deletes the key (we never
|
|
94
|
+
* persist the literal). All capability kinds — including builtin, which
|
|
95
|
+
* writes to capabilityOverrides.builtin.<token> — now support project
|
|
96
|
+
* overrides; only a kind with no bucket (bucketForKind returns undefined)
|
|
97
|
+
* is rejected.
|
|
98
|
+
*/
|
|
99
|
+
setOverride(id, state, opts) {
|
|
100
|
+
const descriptor = this.list().find((c) => c.id === id);
|
|
101
|
+
if (!descriptor)
|
|
102
|
+
throw new CapabilityNotFoundError(id);
|
|
103
|
+
const bucket = bucketForKind(descriptor.kind);
|
|
104
|
+
if (!bucket)
|
|
105
|
+
throw new Error(`Capability kind '${descriptor.kind}' has no project override`);
|
|
106
|
+
if (!opts.cwd)
|
|
107
|
+
throw new Error("project override requires cwd");
|
|
108
|
+
const token = overrideTokenForId(id);
|
|
109
|
+
const path = `capabilityOverrides.${bucket}.${token}`;
|
|
110
|
+
if (state === "inherit")
|
|
111
|
+
this.deps.settings.deleteProjectSetting(path, opts.cwd);
|
|
112
|
+
else
|
|
113
|
+
this.deps.settings.saveProjectSetting(path, state, opts.cwd);
|
|
114
|
+
}
|
|
115
|
+
/** Existing global write path — unchanged behavior, refactored out of setEnabled. */
|
|
116
|
+
writeUserScope(id, on) {
|
|
117
|
+
const descriptor = this.list().find((c) => c.id === id);
|
|
118
|
+
if (!descriptor)
|
|
119
|
+
throw new CapabilityNotFoundError(id);
|
|
120
|
+
const { settingsKey, mode, token } = descriptor.control;
|
|
121
|
+
const s = this.deps.settings.get();
|
|
122
|
+
if (mode === "record-flag") {
|
|
123
|
+
const servers = { ...(s.mcpServers ?? {}) };
|
|
124
|
+
// Never conjure a server that was never configured.
|
|
125
|
+
if (!servers[token])
|
|
126
|
+
return;
|
|
127
|
+
servers[token] = { ...servers[token], enabled: on };
|
|
128
|
+
this.deps.settings.saveUserSetting("mcpServers", servers);
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
const arr = new Set(readArray(s, settingsKey));
|
|
132
|
+
// denylist: present ⇒ OFF, so we want it present when turning off.
|
|
133
|
+
const wantPresent = mode === "allowlist" ? on : !on;
|
|
134
|
+
if (wantPresent)
|
|
135
|
+
arr.add(token);
|
|
136
|
+
else
|
|
137
|
+
arr.delete(token);
|
|
138
|
+
this.deps.settings.saveUserSetting(settingsKey, [...arr]);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/** Read an array at a dotted settings path (e.g. agent.disabledBuiltinTools). */
|
|
142
|
+
function readArray(s, key) {
|
|
143
|
+
let cur = s;
|
|
144
|
+
for (const part of key.split("."))
|
|
145
|
+
cur = cur?.[part];
|
|
146
|
+
return Array.isArray(cur) ? cur : [];
|
|
147
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capability-control descriptor types.
|
|
3
|
+
*
|
|
4
|
+
* A read-only projection layer over the four extension-capability loaders
|
|
5
|
+
* (builtin tools, MCP servers, skills, plugins). A CapabilityDescriptor is a
|
|
6
|
+
* computed view, never a source of truth — the truth stays in the loaders +
|
|
7
|
+
* settings. Each descriptor carries an inlined `control` describing how to
|
|
8
|
+
* toggle it, so the switch router never has to branch on `kind`.
|
|
9
|
+
*
|
|
10
|
+
* See docs/superpowers/specs/2026-05-29-capability-control-design.md
|
|
11
|
+
*/
|
|
12
|
+
/** A uniform, read-only projection of one extension capability. */
|
|
13
|
+
export interface CapabilityDescriptor {
|
|
14
|
+
/** Globally unique; the source prefix isolates the namespace. */
|
|
15
|
+
id: string;
|
|
16
|
+
kind: "builtin" | "mcp" | "skill" | "plugin" | "agent";
|
|
17
|
+
/** Display name: builtin=tool, mcp=server, skill=skill, plugin=plugin, agent=role. */
|
|
18
|
+
name: string;
|
|
19
|
+
/** One-line description pulled from the underlying metadata. */
|
|
20
|
+
description: string;
|
|
21
|
+
/** Computed from preset defaults + the relevant switch config. */
|
|
22
|
+
enabled: boolean;
|
|
23
|
+
/** Which settings key the switch writes, and how. */
|
|
24
|
+
control: CapabilityControl;
|
|
25
|
+
/** user/global baseline enablement, before any project overlay. */
|
|
26
|
+
globalEnabled?: boolean;
|
|
27
|
+
/** Project overlay state in a project-scope view. Absent === inherit. */
|
|
28
|
+
projectOverride?: "on" | "off";
|
|
29
|
+
/** Where the effective `enabled` value came from. */
|
|
30
|
+
effectiveSource?: "user" | "project" | "default";
|
|
31
|
+
/** Source details for UI grouping / navigation. */
|
|
32
|
+
origin?: {
|
|
33
|
+
serverName?: string;
|
|
34
|
+
pluginName?: string;
|
|
35
|
+
filePath?: string;
|
|
36
|
+
toolCount?: number;
|
|
37
|
+
isReadOnly?: boolean;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/** Describes which settings key the switch writes and the write semantics. */
|
|
41
|
+
export interface CapabilityControl {
|
|
42
|
+
settingsKey: "agent.enabledBuiltinTools" | "agent.disabledBuiltinTools" | "mcpServers" | "disabledSkills" | "disabledPlugins" | "disabledAgents";
|
|
43
|
+
/**
|
|
44
|
+
* - "denylist" → off = token present in array (disabled*); on = removed
|
|
45
|
+
* - "allowlist" → on = token present in array (enabled*); off = removed
|
|
46
|
+
* - "record-flag" → flip mcpServers[token].enabled
|
|
47
|
+
*/
|
|
48
|
+
mode: "denylist" | "allowlist" | "record-flag";
|
|
49
|
+
/** Identifier written into the array, or used as the record key. */
|
|
50
|
+
token: string;
|
|
51
|
+
}
|
|
52
|
+
export declare class CapabilityNotFoundError extends Error {
|
|
53
|
+
constructor(id: string);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Which settings file a capability write targets. Distinct from
|
|
57
|
+
* SettingsManager's disk-READ scope ("isolated" | "project" | "full"): this is
|
|
58
|
+
* the WRITE scope — user → global settings, project → capabilityOverrides.
|
|
59
|
+
*/
|
|
60
|
+
export type WriteScope = "user" | "project";
|
|
61
|
+
/** Tri-state project override as seen by callers. */
|
|
62
|
+
export type CapabilityOverrideState = "inherit" | "on" | "off";
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capability-control descriptor types.
|
|
3
|
+
*
|
|
4
|
+
* A read-only projection layer over the four extension-capability loaders
|
|
5
|
+
* (builtin tools, MCP servers, skills, plugins). A CapabilityDescriptor is a
|
|
6
|
+
* computed view, never a source of truth — the truth stays in the loaders +
|
|
7
|
+
* settings. Each descriptor carries an inlined `control` describing how to
|
|
8
|
+
* toggle it, so the switch router never has to branch on `kind`.
|
|
9
|
+
*
|
|
10
|
+
* See docs/superpowers/specs/2026-05-29-capability-control-design.md
|
|
11
|
+
*/
|
|
12
|
+
export class CapabilityNotFoundError extends Error {
|
|
13
|
+
constructor(id) {
|
|
14
|
+
super(`Capability not found: ${id}`);
|
|
15
|
+
this.name = "CapabilityNotFoundError";
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export type PermissionMode = "default" | "acceptEdits" | "bypassPermissions";
|
|
2
|
+
export interface BuildArgsOpts {
|
|
3
|
+
prompt: string;
|
|
4
|
+
resumeSessionId?: string;
|
|
5
|
+
permissionMode: PermissionMode;
|
|
6
|
+
cwd: string;
|
|
7
|
+
}
|
|
8
|
+
export interface ParsedResult {
|
|
9
|
+
sessionId: string;
|
|
10
|
+
finalText: string;
|
|
11
|
+
isError: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface AgentAdapter {
|
|
14
|
+
/** Display name, e.g. "claude" / "codex". */
|
|
15
|
+
kind: string;
|
|
16
|
+
/** Build the CLI argv (command itself excluded). */
|
|
17
|
+
buildArgs(opts: BuildArgsOpts): string[];
|
|
18
|
+
/** Reduce collected stream-json output lines to {sessionId, finalText, isError}. */
|
|
19
|
+
parseResult(lines: string[]): ParsedResult;
|
|
20
|
+
/**
|
|
21
|
+
* When true, the prompt is fed over stdin instead of being passed in argv.
|
|
22
|
+
* claude takes the prompt as `-p <prompt>` (argv) so leaves this unset; codex
|
|
23
|
+
* `exec` reads the prompt from stdin (its argv ends with a bare `-`).
|
|
24
|
+
*/
|
|
25
|
+
promptViaStdin?: boolean;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Soft cost-guard appended to a driven CC's system prompt. Workflow fans out a
|
|
29
|
+
* fleet of agents and is the main token sink; we ask CC to surface intent and
|
|
30
|
+
* get a go-ahead before running one, so a human can intervene (rooms) and the
|
|
31
|
+
* model stays cost-aware even where Workflow isn't hard-disabled. Shared so the
|
|
32
|
+
* room's resident process can reuse the exact same wording.
|
|
33
|
+
*/
|
|
34
|
+
export declare const CC_COST_GUARD_PROMPT: string;
|
|
35
|
+
export declare const claudeAdapter: AgentAdapter;
|
|
36
|
+
/**
|
|
37
|
+
* Drives the OpenAI Codex CLI via `codex exec`. Mirrors claudeAdapter but for
|
|
38
|
+
* codex's different surface:
|
|
39
|
+
* - prompt is fed over STDIN (argv ends with a bare `-`), not argv → promptViaStdin
|
|
40
|
+
* - permission is a spawn-time SANDBOX choice, not a per-tool approval loop:
|
|
41
|
+
* default → --sandbox read-only (codex can read, not write)
|
|
42
|
+
* acceptEdits → --sandbox workspace-write (codex can write the workspace)
|
|
43
|
+
* bypassPermissions → --dangerously-bypass-approvals-and-sandbox (full auto)
|
|
44
|
+
* (Matches the only model codex supports — same choice the `wand` tool makes;
|
|
45
|
+
* codex has no `--permission-prompt-tool stdio` equivalent.)
|
|
46
|
+
* - JSONL event shape differs: session id is `thread.started`.thread_id, the
|
|
47
|
+
* final answer is the last `item.completed` of item.type "agent_message", and
|
|
48
|
+
* failure is `turn.failed` / `error` events (no `is_error` flag).
|
|
49
|
+
*/
|
|
50
|
+
export declare const codexAdapter: AgentAdapter;
|