@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
|
@@ -5,17 +5,46 @@
|
|
|
5
5
|
* actually installs (feedback#15). Read-only; reuses the same parsers the
|
|
6
6
|
* loaders use so the inventory can't drift from what actually loads.
|
|
7
7
|
*/
|
|
8
|
-
import {
|
|
9
|
-
import { join } from "node:path";
|
|
8
|
+
import { readdirSync, readFileSync, realpathSync, statSync } from "node:fs";
|
|
9
|
+
import { isAbsolute, join, relative, sep } from "node:path";
|
|
10
10
|
import { parseFrontmatter } from "../skills/frontmatter.js";
|
|
11
11
|
import { listPluginHooks } from "./loadPluginHooks.js";
|
|
12
|
-
import {
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
import { reviewPluginHooks } from "./pluginHookApproval.js";
|
|
13
|
+
import { readPluginMcp } from "./installer/loadPluginMcp.js";
|
|
14
|
+
import { CANONICAL_PLUGIN_MANIFEST_FILE, CanonicalPluginManifest, } from "./installer/types.js";
|
|
15
|
+
import { pluginAutomationTemplateRevision } from "./pluginCatalog.js";
|
|
16
|
+
function resolveContainedPath(root, candidate) {
|
|
17
|
+
try {
|
|
18
|
+
const realRoot = realpathSync(root);
|
|
19
|
+
const realCandidate = realpathSync(candidate);
|
|
20
|
+
const rel = relative(realRoot, realCandidate);
|
|
21
|
+
if (rel === ".." || rel.startsWith(`..${sep}`) || isAbsolute(rel))
|
|
22
|
+
return null;
|
|
23
|
+
return realCandidate;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function listMdNames(installPath, dirName) {
|
|
30
|
+
const dir = resolveContainedPath(installPath, join(installPath, dirName));
|
|
31
|
+
if (!dir)
|
|
15
32
|
return [];
|
|
16
33
|
try {
|
|
17
34
|
return readdirSync(dir)
|
|
18
|
-
.filter((
|
|
35
|
+
.filter((file) => {
|
|
36
|
+
if (!file.endsWith(".md"))
|
|
37
|
+
return false;
|
|
38
|
+
const target = resolveContainedPath(dir, join(dir, file));
|
|
39
|
+
if (!target)
|
|
40
|
+
return false;
|
|
41
|
+
try {
|
|
42
|
+
return statSync(target).isFile();
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
})
|
|
19
48
|
.map((f) => f.replace(/\.md$/, ""))
|
|
20
49
|
.sort();
|
|
21
50
|
}
|
|
@@ -24,15 +53,18 @@ function listMdNames(dir) {
|
|
|
24
53
|
}
|
|
25
54
|
}
|
|
26
55
|
function listSkills(installPath) {
|
|
27
|
-
const dir = join(installPath, "skills");
|
|
28
|
-
if (!
|
|
56
|
+
const dir = resolveContainedPath(installPath, join(installPath, "skills"));
|
|
57
|
+
if (!dir)
|
|
29
58
|
return [];
|
|
30
59
|
const out = [];
|
|
31
60
|
try {
|
|
32
61
|
for (const entry of readdirSync(dir).sort()) {
|
|
33
|
-
const skillMd = join(dir, entry, "SKILL.md");
|
|
34
62
|
try {
|
|
35
|
-
|
|
63
|
+
const skillDir = resolveContainedPath(dir, join(dir, entry));
|
|
64
|
+
if (!skillDir || !statSync(skillDir).isDirectory())
|
|
65
|
+
continue;
|
|
66
|
+
const skillMd = resolveContainedPath(skillDir, join(skillDir, "SKILL.md"));
|
|
67
|
+
if (!skillMd || !statSync(skillMd).isFile())
|
|
36
68
|
continue;
|
|
37
69
|
const { frontmatter } = parseFrontmatter(readFileSync(skillMd, "utf-8"));
|
|
38
70
|
const desc = typeof frontmatter.description === "string" ? frontmatter.description : undefined;
|
|
@@ -54,30 +86,55 @@ function listSkills(installPath) {
|
|
|
54
86
|
* scanners the runtime loaders use (filtered to this plugin) so naming —
|
|
55
87
|
* e.g. MCP's `<plugin>:<server>` record keys — matches what users see live.
|
|
56
88
|
*/
|
|
57
|
-
export function describePluginContent(pluginName, installPath) {
|
|
89
|
+
export function describePluginContent(pluginName, installPath, installKey) {
|
|
58
90
|
const mcpPrefix = `${pluginName}:`;
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
91
|
+
const mcpServers = (() => {
|
|
92
|
+
try {
|
|
93
|
+
return Object.keys(readPluginMcp(installPath, pluginName))
|
|
94
|
+
.filter((k) => k.startsWith(mcpPrefix))
|
|
95
|
+
.map((k) => k.slice(mcpPrefix.length))
|
|
96
|
+
.sort();
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return [];
|
|
100
|
+
}
|
|
101
|
+
})();
|
|
102
|
+
const hooks = (() => {
|
|
103
|
+
try {
|
|
104
|
+
return listPluginHooks().filter((h) => h.plugin === pluginName && (installKey === undefined || h.installKey === installKey));
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return [];
|
|
108
|
+
}
|
|
109
|
+
})();
|
|
110
|
+
const hookReview = (() => {
|
|
111
|
+
if (!installKey)
|
|
112
|
+
return undefined;
|
|
113
|
+
try {
|
|
114
|
+
return reviewPluginHooks(installKey)[0];
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
return undefined;
|
|
118
|
+
}
|
|
119
|
+
})();
|
|
120
|
+
const manifest = (() => {
|
|
121
|
+
try {
|
|
122
|
+
return CanonicalPluginManifest.parse(JSON.parse(readFileSync(join(installPath, CANONICAL_PLUGIN_MANIFEST_FILE), "utf-8")));
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
})();
|
|
76
128
|
return {
|
|
77
129
|
skills: listSkills(installPath),
|
|
78
|
-
commands: listMdNames(
|
|
79
|
-
agents: listMdNames(
|
|
130
|
+
commands: listMdNames(installPath, "commands"),
|
|
131
|
+
agents: listMdNames(installPath, "agents"),
|
|
80
132
|
hooks,
|
|
133
|
+
...(hookReview ? { hookReview } : {}),
|
|
81
134
|
mcpServers,
|
|
135
|
+
automationTemplates: (manifest?.automations?.templates ?? []).map((template) => ({
|
|
136
|
+
...template,
|
|
137
|
+
revision: pluginAutomationTemplateRevision(installKey ?? pluginName, template),
|
|
138
|
+
})),
|
|
82
139
|
};
|
|
83
140
|
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type PluginHookApprovalState } from "./pluginHookIntegrity.js";
|
|
2
|
+
import type { StoredPluginHookReview } from "./types.js";
|
|
3
|
+
export interface PluginHookApprovalResult {
|
|
4
|
+
installKey: string;
|
|
5
|
+
plugin: string;
|
|
6
|
+
status: PluginHookApprovalState;
|
|
7
|
+
changed: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface PluginHookReviewDiffItem {
|
|
10
|
+
change: "added" | "removed" | "changed" | "unchanged";
|
|
11
|
+
current?: StoredPluginHookReview;
|
|
12
|
+
previous?: StoredPluginHookReview;
|
|
13
|
+
}
|
|
14
|
+
export interface PluginHookReview {
|
|
15
|
+
installKey: string;
|
|
16
|
+
plugin: string;
|
|
17
|
+
status: PluginHookApprovalState;
|
|
18
|
+
baselineAvailable: boolean;
|
|
19
|
+
items: PluginHookReviewDiffItem[];
|
|
20
|
+
error?: string;
|
|
21
|
+
}
|
|
22
|
+
/** Review current hooks against the last explicitly approved per-command snapshot. */
|
|
23
|
+
export declare function reviewPluginHooks(target: string): PluginHookReview[];
|
|
24
|
+
/** Approve the exact install-time digest; changed-on-disk hooks cannot be blessed. */
|
|
25
|
+
export declare function approvePluginHooks(target: string): PluginHookApprovalResult[];
|
|
26
|
+
/**
|
|
27
|
+
* Revoke hook execution. Legacy entries are first migrated to a recorded
|
|
28
|
+
* digest so revocation fails closed instead of falling back to legacy trust.
|
|
29
|
+
*/
|
|
30
|
+
export declare function revokePluginHooks(target: string): PluginHookApprovalResult[];
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { readInstalledPlugins, writeInstalledPlugins } from "./installedPlugins.js";
|
|
2
|
+
import { inspectPluginHooks, pluginHookReviewSnapshot, pluginHookApprovalState, } from "./pluginHookIntegrity.js";
|
|
3
|
+
function pluginNameFromKey(key) {
|
|
4
|
+
const at = key.lastIndexOf("@");
|
|
5
|
+
return at > 0 ? key.slice(0, at) : key;
|
|
6
|
+
}
|
|
7
|
+
function matchingInstallKeys(data, target) {
|
|
8
|
+
if (!target.trim())
|
|
9
|
+
throw new Error("plugin hook approval requires a plugin name or install key");
|
|
10
|
+
if (data.plugins[target])
|
|
11
|
+
return [target];
|
|
12
|
+
const matches = Object.keys(data.plugins).filter((key) => pluginNameFromKey(key) === target);
|
|
13
|
+
if (matches.length === 0)
|
|
14
|
+
throw new Error(`plugin "${target}" is not installed`);
|
|
15
|
+
if (matches.length > 1) {
|
|
16
|
+
throw new Error(`plugin "${target}" has multiple installs; use one of: ${matches.join(", ")}`);
|
|
17
|
+
}
|
|
18
|
+
return matches;
|
|
19
|
+
}
|
|
20
|
+
function result(installKey, entry, changed, snapshot) {
|
|
21
|
+
return {
|
|
22
|
+
installKey,
|
|
23
|
+
plugin: pluginNameFromKey(installKey),
|
|
24
|
+
status: pluginHookApprovalState(entry, snapshot),
|
|
25
|
+
changed,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function sameReviewHook(a, b) {
|
|
29
|
+
return (a.rawEvent === b.rawEvent &&
|
|
30
|
+
a.matcher === b.matcher &&
|
|
31
|
+
a.commandDigest === b.commandDigest &&
|
|
32
|
+
a.async === b.async &&
|
|
33
|
+
a.timeoutMs === b.timeoutMs);
|
|
34
|
+
}
|
|
35
|
+
function diffHookReview(current, previous) {
|
|
36
|
+
if (previous === undefined)
|
|
37
|
+
return current.map((hook) => ({ change: "added", current: hook }));
|
|
38
|
+
const unused = new Set(previous.map((_, index) => index));
|
|
39
|
+
const items = [];
|
|
40
|
+
for (const hook of current) {
|
|
41
|
+
const exact = [...unused].find((index) => sameReviewHook(hook, previous[index]));
|
|
42
|
+
if (exact !== undefined) {
|
|
43
|
+
unused.delete(exact);
|
|
44
|
+
items.push({ change: "unchanged", current: hook, previous: previous[exact] });
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
let changed = [...unused].find((index) => {
|
|
48
|
+
const old = previous[index];
|
|
49
|
+
return (old.rawEvent === hook.rawEvent &&
|
|
50
|
+
(old.commandDigest === hook.commandDigest || old.matcher === hook.matcher));
|
|
51
|
+
});
|
|
52
|
+
// If both command and matcher changed, pair the remaining command at the
|
|
53
|
+
// same event when that match is unambiguous instead of presenting a noisy
|
|
54
|
+
// remove+add pair.
|
|
55
|
+
if (changed === undefined) {
|
|
56
|
+
const sameEvent = [...unused].filter((index) => previous[index].rawEvent === hook.rawEvent);
|
|
57
|
+
if (sameEvent.length === 1)
|
|
58
|
+
changed = sameEvent[0];
|
|
59
|
+
}
|
|
60
|
+
if (changed !== undefined) {
|
|
61
|
+
unused.delete(changed);
|
|
62
|
+
items.push({ change: "changed", current: hook, previous: previous[changed] });
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
items.push({ change: "added", current: hook });
|
|
66
|
+
}
|
|
67
|
+
for (const index of unused)
|
|
68
|
+
items.push({ change: "removed", previous: previous[index] });
|
|
69
|
+
return items;
|
|
70
|
+
}
|
|
71
|
+
function review(installKey, entry) {
|
|
72
|
+
const snapshot = inspectPluginHooks(entry.installPath);
|
|
73
|
+
return {
|
|
74
|
+
installKey,
|
|
75
|
+
plugin: pluginNameFromKey(installKey),
|
|
76
|
+
status: pluginHookApprovalState(entry, snapshot),
|
|
77
|
+
baselineAvailable: entry.approvedHookSnapshot !== undefined,
|
|
78
|
+
items: diffHookReview(pluginHookReviewSnapshot(snapshot), entry.approvedHookSnapshot),
|
|
79
|
+
...(snapshot.error ? { error: snapshot.error } : {}),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/** Review current hooks against the last explicitly approved per-command snapshot. */
|
|
83
|
+
export function reviewPluginHooks(target) {
|
|
84
|
+
const data = readInstalledPlugins();
|
|
85
|
+
return matchingInstallKeys(data, target).flatMap((installKey) => (data.plugins[installKey] ?? []).map((entry) => review(installKey, entry)));
|
|
86
|
+
}
|
|
87
|
+
/** Approve the exact install-time digest; changed-on-disk hooks cannot be blessed. */
|
|
88
|
+
export function approvePluginHooks(target) {
|
|
89
|
+
const data = readInstalledPlugins();
|
|
90
|
+
const keys = matchingInstallKeys(data, target);
|
|
91
|
+
const out = [];
|
|
92
|
+
let writeNeeded = false;
|
|
93
|
+
for (const installKey of keys) {
|
|
94
|
+
for (const entry of data.plugins[installKey] ?? []) {
|
|
95
|
+
let entryChanged = false;
|
|
96
|
+
const snapshot = inspectPluginHooks(entry.installPath);
|
|
97
|
+
if (snapshot.state === "invalid") {
|
|
98
|
+
throw new Error(`plugin "${installKey}" hooks definition is invalid and cannot be approved: ${snapshot.error ?? "unknown error"}`);
|
|
99
|
+
}
|
|
100
|
+
if (entry.hookDigest && snapshot.digest !== entry.hookDigest) {
|
|
101
|
+
throw new Error(`plugin "${installKey}" hooks changed after install; reinstall or update before approving`);
|
|
102
|
+
}
|
|
103
|
+
if (!entry.hookDigest) {
|
|
104
|
+
entry.hookDigest = snapshot.digest;
|
|
105
|
+
entryChanged = true;
|
|
106
|
+
writeNeeded = true;
|
|
107
|
+
}
|
|
108
|
+
if (entry.approvedHookDigest !== entry.hookDigest) {
|
|
109
|
+
entry.approvedHookDigest = entry.hookDigest;
|
|
110
|
+
entryChanged = true;
|
|
111
|
+
writeNeeded = true;
|
|
112
|
+
}
|
|
113
|
+
const nextReview = pluginHookReviewSnapshot(snapshot);
|
|
114
|
+
if (JSON.stringify(entry.approvedHookSnapshot) !== JSON.stringify(nextReview)) {
|
|
115
|
+
entry.approvedHookSnapshot = nextReview;
|
|
116
|
+
entryChanged = true;
|
|
117
|
+
writeNeeded = true;
|
|
118
|
+
}
|
|
119
|
+
out.push(result(installKey, entry, entryChanged, snapshot));
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (writeNeeded)
|
|
123
|
+
writeInstalledPlugins(data);
|
|
124
|
+
return out;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Revoke hook execution. Legacy entries are first migrated to a recorded
|
|
128
|
+
* digest so revocation fails closed instead of falling back to legacy trust.
|
|
129
|
+
*/
|
|
130
|
+
export function revokePluginHooks(target) {
|
|
131
|
+
const data = readInstalledPlugins();
|
|
132
|
+
const keys = matchingInstallKeys(data, target);
|
|
133
|
+
const out = [];
|
|
134
|
+
let writeNeeded = false;
|
|
135
|
+
for (const installKey of keys) {
|
|
136
|
+
for (const entry of data.plugins[installKey] ?? []) {
|
|
137
|
+
let entryChanged = false;
|
|
138
|
+
const snapshot = inspectPluginHooks(entry.installPath);
|
|
139
|
+
if (!entry.hookDigest) {
|
|
140
|
+
entry.hookDigest = snapshot.digest;
|
|
141
|
+
entryChanged = true;
|
|
142
|
+
}
|
|
143
|
+
if (snapshot.hasExecutableHooks || snapshot.state === "invalid") {
|
|
144
|
+
if (entry.approvedHookDigest !== undefined) {
|
|
145
|
+
delete entry.approvedHookDigest;
|
|
146
|
+
entryChanged = true;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
else if (entry.approvedHookDigest !== entry.hookDigest) {
|
|
150
|
+
entry.approvedHookDigest = entry.hookDigest;
|
|
151
|
+
entryChanged = true;
|
|
152
|
+
}
|
|
153
|
+
writeNeeded ||= entryChanged;
|
|
154
|
+
out.push(result(installKey, entry, entryChanged, snapshot));
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
if (writeNeeded)
|
|
158
|
+
writeInstalledPlugins(data);
|
|
159
|
+
return out;
|
|
160
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { PluginInstallEntry, StoredPluginHookReview } from "./types.js";
|
|
2
|
+
/** Hard limits for one canonical plugin hook definition. */
|
|
3
|
+
export declare const MAX_PLUGIN_HOOK_FILE_BYTES = 1048576;
|
|
4
|
+
export declare const MAX_PLUGIN_HOOK_EVENTS = 32;
|
|
5
|
+
export declare const MAX_PLUGIN_HOOK_GROUPS = 128;
|
|
6
|
+
export declare const MAX_PLUGIN_HOOK_COMMANDS = 256;
|
|
7
|
+
export declare const MAX_PLUGIN_HOOK_EVENT_NAME_LENGTH = 128;
|
|
8
|
+
export declare const MAX_PLUGIN_HOOK_COMMAND_LENGTH = 32768;
|
|
9
|
+
export declare const MAX_PLUGIN_HOOK_MATCHER_LENGTH = 4096;
|
|
10
|
+
export declare const MAX_PLUGIN_HOOK_TIMEOUT_MS = 600000;
|
|
11
|
+
export declare const MAX_PLUGIN_HOOK_REVIEW_COMMAND_LENGTH = 4096;
|
|
12
|
+
export declare const SUPPORTED_PLUGIN_HOOK_EVENTS: readonly ["SessionStart", "UserPromptSubmit", "PreToolUse", "PostToolUse", "PreCompact", "Notification", "Stop", "SubagentStop"];
|
|
13
|
+
export type SupportedPluginHookEvent = (typeof SUPPORTED_PLUGIN_HOOK_EVENTS)[number];
|
|
14
|
+
export interface ParsedPluginCommandHook {
|
|
15
|
+
command: string;
|
|
16
|
+
async?: boolean;
|
|
17
|
+
timeoutMs?: number;
|
|
18
|
+
}
|
|
19
|
+
export interface ParsedPluginHookGroup {
|
|
20
|
+
matcher?: string;
|
|
21
|
+
hooks: ParsedPluginCommandHook[];
|
|
22
|
+
}
|
|
23
|
+
export interface ParsedPluginHooksDefinition {
|
|
24
|
+
hooks: Partial<Record<SupportedPluginHookEvent, ParsedPluginHookGroup[]>>;
|
|
25
|
+
}
|
|
26
|
+
export interface PluginHooksSnapshot {
|
|
27
|
+
state: "absent" | "valid" | "invalid";
|
|
28
|
+
digest: string;
|
|
29
|
+
definition: ParsedPluginHooksDefinition | null;
|
|
30
|
+
hasExecutableHooks: boolean;
|
|
31
|
+
error?: string;
|
|
32
|
+
}
|
|
33
|
+
export type PluginHookIntegrity = "verified" | "changed" | "legacy";
|
|
34
|
+
export type PluginHookApprovalState = "approved" | "pending" | "changed" | "legacy" | "none";
|
|
35
|
+
/**
|
|
36
|
+
* Securely read and parse the one canonical hook file. All digest, approval,
|
|
37
|
+
* listing, and runtime decisions consume this snapshot so malformed or
|
|
38
|
+
* replaced files cannot be interpreted differently by separate code paths.
|
|
39
|
+
*/
|
|
40
|
+
export declare function inspectPluginHooks(installPath: string): PluginHooksSnapshot;
|
|
41
|
+
/**
|
|
42
|
+
* Digest the exact canonical hooks file after it passes the bounded parser.
|
|
43
|
+
* Valid and absent definitions preserve the existing v1 digest contract;
|
|
44
|
+
* every invalid definition shares a fail-closed sentinel digest.
|
|
45
|
+
*/
|
|
46
|
+
export declare function pluginHooksDigest(installPath: string): string;
|
|
47
|
+
/** Whether the bounded canonical definition currently contains an executable command hook. */
|
|
48
|
+
export declare function pluginHasExecutableHooks(installPath: string): boolean;
|
|
49
|
+
/** Build bounded, non-executable review metadata from one validated snapshot. */
|
|
50
|
+
export declare function pluginHookReviewSnapshot(snapshot: PluginHooksSnapshot): StoredPluginHookReview[];
|
|
51
|
+
/**
|
|
52
|
+
* Older installed_plugins.json entries predate hook digests and remain
|
|
53
|
+
* compatible as `legacy`. New entries fail closed when their effective hook
|
|
54
|
+
* file no longer matches the bytes approved by install/update.
|
|
55
|
+
*/
|
|
56
|
+
export declare function verifyPluginHookIntegrity(entry: PluginInstallEntry, snapshot?: PluginHooksSnapshot): PluginHookIntegrity;
|
|
57
|
+
/**
|
|
58
|
+
* Runtime trust state for one installed plugin. Legacy entries stay compatible;
|
|
59
|
+
* new entries with executable hooks remain pending until the approved digest
|
|
60
|
+
* matches the install-time digest. Invalid definitions always fail closed as
|
|
61
|
+
* hook-free regardless of legacy state.
|
|
62
|
+
*/
|
|
63
|
+
export declare function pluginHookApprovalState(entry: PluginInstallEntry, snapshot?: PluginHooksSnapshot): PluginHookApprovalState;
|
|
64
|
+
/**
|
|
65
|
+
* Integrity fields written at install/update. Hook-free packages approve the
|
|
66
|
+
* absent-hooks digest automatically; executable hooks require explicit trust.
|
|
67
|
+
* A previously approved identical digest remains approved across an update.
|
|
68
|
+
*/
|
|
69
|
+
export declare function pluginHookInstallRecord(installPath: string, previousEntries?: PluginInstallEntry[]): Pick<PluginInstallEntry, "hookDigest" | "approvedHookDigest" | "approvedHookSnapshot">;
|