@cjhyy/code-shell-core 0.7.1 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +36 -23
- package/dist/agent/agent-definition-registry.d.ts +2 -2
- package/dist/agent/agent-definition-registry.js +47 -10
- package/dist/agent/agent-definition.d.ts +5 -0
- package/dist/agent/agent-definition.js +14 -0
- package/dist/automation/index.d.ts +7 -4
- package/dist/automation/index.js +4 -2
- package/dist/automation/runner.js +3 -1
- package/dist/automation/scheduler.d.ts +57 -1
- package/dist/automation/scheduler.js +123 -23
- package/dist/automation/store.d.ts +6 -2
- package/dist/automation/store.js +7 -3
- package/dist/capabilities/index.d.ts +109 -0
- package/dist/capabilities/index.js +80 -0
- package/dist/capability-control/disabled-lists.d.ts +2 -1
- package/dist/capability-control/disabled-lists.js +3 -5
- package/dist/capability-control/overlay.d.ts +14 -1
- package/dist/capability-control/overlay.js +40 -0
- package/dist/capability-control/service.js +6 -4
- package/dist/cli/agent-server-stdio.d.ts +1 -1
- package/dist/cli/agent-server-stdio.js +66 -6
- package/dist/cli/agent-server-tcp.js +7 -3
- package/dist/context/compaction.d.ts +39 -3
- package/dist/context/compaction.js +151 -39
- package/dist/context/manager.d.ts +17 -1
- package/dist/context/manager.js +36 -1
- package/dist/credentials/access.d.ts +3 -1
- package/dist/credentials/access.js +24 -3
- package/dist/credentials/index.d.ts +1 -1
- package/dist/credentials/index.js +1 -1
- package/dist/credentials/oauth.d.ts +4 -1
- package/dist/credentials/oauth.js +14 -0
- package/dist/credentials/store.d.ts +15 -1
- package/dist/credentials/store.js +17 -4
- package/dist/credentials/types.d.ts +24 -0
- package/dist/credentials/use-credential-tool.js +15 -1
- package/dist/engine/auxiliary-pipeline.d.ts +40 -0
- package/dist/engine/auxiliary-pipeline.js +181 -0
- package/dist/{settings → engine}/disk-defaults.d.ts +2 -2
- package/dist/{settings → engine}/disk-defaults.js +5 -2
- package/dist/engine/dynamic-tool-defs.d.ts +4 -0
- package/dist/engine/dynamic-tool-defs.js +4 -0
- package/dist/engine/engine.d.ts +254 -195
- package/dist/engine/engine.js +1812 -2041
- package/dist/engine/file-history-hook.d.ts +11 -0
- package/dist/engine/file-history-hook.js +31 -0
- package/dist/engine/goal-judge-context.d.ts +9 -0
- package/dist/engine/goal-judge-context.js +234 -0
- package/dist/engine/injected-context-cache.d.ts +6 -0
- package/dist/engine/injected-context-cache.js +13 -0
- package/dist/engine/input-attachments.d.ts +1 -1
- package/dist/engine/model-facade.d.ts +3 -3
- package/dist/engine/model-facade.js +15 -14
- package/dist/engine/permission-controller.d.ts +55 -0
- package/dist/engine/permission-controller.js +148 -0
- package/dist/engine/prompt-cache-diagnostics.d.ts +58 -0
- package/dist/engine/prompt-cache-diagnostics.js +178 -0
- package/dist/engine/run-accounting.d.ts +41 -0
- package/dist/engine/run-accounting.js +126 -0
- package/dist/engine/run-context.d.ts +44 -0
- package/dist/engine/run-context.js +88 -0
- package/dist/engine/run-environment.d.ts +30 -0
- package/dist/engine/run-environment.js +77 -0
- package/dist/engine/run-finalize.d.ts +58 -0
- package/dist/engine/run-finalize.js +245 -0
- package/dist/engine/run-goal.d.ts +58 -0
- package/dist/engine/run-goal.js +188 -0
- package/dist/engine/run-image-input.d.ts +1 -1
- package/dist/engine/run-image-input.js +5 -3
- package/dist/engine/run-session-open.d.ts +41 -0
- package/dist/engine/run-session-open.js +186 -0
- package/dist/engine/run-setup.d.ts +42 -0
- package/dist/engine/run-setup.js +58 -0
- package/dist/engine/run-tooling.d.ts +125 -0
- package/dist/engine/run-tooling.js +283 -0
- package/dist/engine/run-types.d.ts +139 -0
- package/dist/engine/run-types.js +12 -0
- package/dist/engine/run-workspace.d.ts +50 -0
- package/dist/engine/run-workspace.js +114 -0
- package/dist/engine/steer-queue.d.ts +1 -1
- package/dist/engine/subagent-spawner.d.ts +32 -0
- package/dist/engine/subagent-spawner.js +287 -0
- package/dist/engine/tool-summary.d.ts +2 -2
- package/dist/engine/tool-summary.js +2 -2
- package/dist/engine/turn-loop.d.ts +49 -10
- package/dist/engine/turn-loop.js +370 -104
- package/dist/engine/types.d.ts +30 -3
- package/dist/engine/types.js +1 -1
- package/dist/{engine/goal.d.ts → goal/lifecycle.d.ts} +76 -4
- package/dist/goal/lifecycle.js +482 -0
- package/dist/hooks/events.d.ts +24 -10
- package/dist/hooks/goal-stop-hook.d.ts +17 -28
- package/dist/hooks/goal-stop-hook.js +110 -465
- package/dist/hooks/registry.js +1 -1
- package/dist/index.d.ts +48 -108
- package/dist/index.extension.d.ts +51 -0
- package/dist/index.extension.js +39 -0
- package/dist/index.internal.d.ts +86 -0
- package/dist/index.internal.js +92 -0
- package/dist/index.js +34 -123
- package/dist/links/cli.d.ts +48 -0
- package/dist/links/cli.js +617 -0
- package/dist/links/http.d.ts +40 -0
- package/dist/links/http.js +166 -0
- package/dist/links/index.d.ts +4 -0
- package/dist/links/index.js +3 -0
- package/dist/links/link-action-tool.d.ts +5 -0
- package/dist/links/link-action-tool.js +241 -0
- package/dist/links/providers.d.ts +8 -0
- package/dist/links/providers.js +665 -0
- package/dist/links/types.d.ts +44 -0
- package/dist/llm/client-base.d.ts +7 -0
- package/dist/llm/client-base.js +60 -0
- package/dist/llm/model-pool.d.ts +1 -1
- package/dist/llm/model-pool.js +1 -1
- package/dist/llm/providers/anthropic.d.ts +1 -0
- package/dist/llm/providers/anthropic.js +9 -0
- package/dist/llm/providers/openai.d.ts +1 -0
- package/dist/llm/providers/openai.js +17 -0
- package/dist/model-catalog/index.js +15 -2
- package/dist/model-catalog/resolve.d.ts +13 -1
- package/dist/model-catalog/resolve.js +37 -2
- package/dist/model-catalog/types.d.ts +74 -48
- package/dist/model-catalog/types.js +16 -5
- package/dist/model-catalog/upsert.d.ts +3 -1
- package/dist/model-catalog/upsert.js +9 -0
- package/dist/onboarding.d.ts +0 -1
- package/dist/onboarding.js +1 -22
- package/dist/panel-apps/bindings.d.ts +24 -0
- package/dist/panel-apps/bindings.js +69 -0
- package/dist/panel-apps/github-archive.d.ts +21 -0
- package/dist/panel-apps/github-archive.js +98 -0
- package/dist/panel-apps/index.d.ts +4 -0
- package/dist/panel-apps/index.js +4 -0
- package/dist/panel-apps/installer.d.ts +68 -0
- package/dist/panel-apps/installer.js +622 -0
- package/dist/panel-apps/manifest.d.ts +364 -0
- package/dist/panel-apps/manifest.js +189 -0
- package/dist/panel-apps/paths.d.ts +13 -0
- package/dist/panel-apps/paths.js +38 -0
- package/dist/panel-apps/registry.d.ts +51 -0
- package/dist/panel-apps/registry.js +99 -0
- package/dist/panel-apps/runtime.d.ts +80 -0
- package/dist/panel-apps/runtime.js +154 -0
- package/dist/plugins/gitOps.js +8 -1
- package/dist/plugins/installedPlugins.d.ts +2 -1
- package/dist/plugins/installedPlugins.js +146 -8
- package/dist/plugins/installer/codex/convertAgents.d.ts +4 -1
- package/dist/plugins/installer/codex/convertAgents.js +62 -8
- package/dist/plugins/installer/codex/convertCommands.d.ts +5 -5
- package/dist/plugins/installer/codex/convertCommands.js +35 -12
- package/dist/plugins/installer/codex/convertHooks.d.ts +10 -0
- package/dist/plugins/installer/codex/convertHooks.js +82 -0
- package/dist/plugins/installer/codex/convertSkills.js +41 -6
- package/dist/plugins/installer/install.d.ts +7 -1
- package/dist/plugins/installer/install.js +21 -87
- package/dist/plugins/installer/installFromArchive.d.ts +26 -4
- package/dist/plugins/installer/installFromArchive.js +44 -27
- package/dist/plugins/installer/installFromNpm.d.ts +31 -0
- package/dist/plugins/installer/installFromNpm.js +273 -0
- package/dist/plugins/installer/loadPluginAgents.js +17 -4
- package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
- package/dist/plugins/installer/loadPluginMcp.js +245 -35
- package/dist/plugins/installer/normalizeManifest.d.ts +13 -0
- package/dist/plugins/installer/normalizeManifest.js +306 -0
- package/dist/plugins/installer/npmTar.d.ts +13 -0
- package/dist/plugins/installer/npmTar.js +321 -0
- package/dist/plugins/installer/parseSource.d.ts +11 -0
- package/dist/plugins/installer/parseSource.js +48 -0
- package/dist/plugins/installer/preview.d.ts +101 -0
- package/dist/plugins/installer/preview.js +336 -0
- package/dist/plugins/installer/projectPluginSource.d.ts +14 -0
- package/dist/plugins/installer/projectPluginSource.js +140 -0
- package/dist/plugins/installer/types.d.ts +775 -0
- package/dist/plugins/installer/types.js +100 -0
- package/dist/plugins/installer/unzip.d.ts +11 -0
- package/dist/plugins/installer/unzip.js +123 -9
- package/dist/plugins/installer/update.d.ts +2 -2
- package/dist/plugins/installer/update.js +43 -4
- package/dist/plugins/loadPluginHooks.d.ts +19 -2
- package/dist/plugins/loadPluginHooks.js +97 -86
- package/dist/plugins/pluginAutomationTemplates.d.ts +18 -0
- package/dist/plugins/pluginAutomationTemplates.js +50 -0
- package/dist/plugins/pluginCatalog.d.ts +45 -0
- package/dist/plugins/pluginCatalog.js +87 -0
- package/dist/plugins/pluginCommandHook.d.ts +6 -0
- package/dist/plugins/pluginCommandHook.js +25 -8
- package/dist/plugins/pluginCommandsLoader.d.ts +19 -0
- package/dist/plugins/pluginCommandsLoader.js +181 -7
- package/dist/plugins/pluginContent.d.ts +10 -1
- package/dist/plugins/pluginContent.js +87 -30
- package/dist/plugins/pluginHookApproval.d.ts +30 -0
- package/dist/plugins/pluginHookApproval.js +160 -0
- package/dist/plugins/pluginHookIntegrity.d.ts +69 -0
- package/dist/plugins/pluginHookIntegrity.js +361 -0
- package/dist/plugins/pluginInstaller.js +71 -12
- package/dist/plugins/pluginMcpApproval.d.ts +19 -0
- package/dist/plugins/pluginMcpApproval.js +110 -0
- package/dist/plugins/pluginMcpIntegrity.d.ts +21 -0
- package/dist/plugins/pluginMcpIntegrity.js +74 -0
- package/dist/plugins/types.d.ts +30 -0
- package/dist/plugins/varRewrite.d.ts +9 -5
- package/dist/plugins/varRewrite.js +26 -17
- package/dist/preset/index.d.ts +11 -8
- package/dist/preset/index.js +62 -203
- package/dist/product/define.js +9 -3
- package/dist/product/types.d.ts +0 -2
- package/dist/profile/activation.d.ts +36 -0
- package/dist/profile/activation.js +57 -0
- package/dist/profile/catalog-store.d.ts +77 -0
- package/dist/profile/catalog-store.js +346 -0
- package/dist/profile/catalog.d.ts +54 -0
- package/dist/profile/catalog.js +152 -0
- package/dist/profile/index.d.ts +7 -0
- package/dist/profile/index.js +7 -0
- package/dist/profile/requirements.d.ts +76 -0
- package/dist/profile/requirements.js +117 -0
- package/dist/profile/resolve.d.ts +11 -0
- package/dist/profile/resolve.js +41 -0
- package/dist/profile/store.d.ts +17 -0
- package/dist/profile/store.js +167 -0
- package/dist/profile/types.d.ts +321 -0
- package/dist/profile/types.js +104 -0
- package/dist/prompt/composer.d.ts +46 -7
- package/dist/prompt/composer.js +78 -48
- package/dist/prompt/instruction-scanner.d.ts +6 -5
- package/dist/prompt/instruction-scanner.js +8 -23
- package/dist/prompt/section-loader.d.ts +2 -2
- package/dist/prompt/section-loader.js +7 -4
- package/dist/prompt/sections/browser.md +10 -9
- package/dist/prompt/sections/harness-base.md +9 -0
- package/dist/protocol/chat-session-manager.d.ts +64 -1
- package/dist/protocol/chat-session-manager.js +104 -0
- package/dist/protocol/chat-session.d.ts +61 -10
- package/dist/protocol/chat-session.js +135 -25
- package/dist/protocol/client.d.ts +33 -3
- package/dist/protocol/client.js +96 -5
- package/dist/protocol/index.d.ts +2 -2
- package/dist/protocol/index.js +2 -2
- package/dist/protocol/mobile-remote-types.d.ts +406 -0
- package/dist/protocol/mobile-remote-types.js +1 -0
- package/dist/protocol/server.d.ts +127 -3
- package/dist/protocol/server.js +1309 -182
- package/dist/protocol/types.d.ts +152 -34
- package/dist/protocol/types.js +16 -0
- package/dist/run/ArtifactTracker.d.ts +6 -1
- package/dist/run/ArtifactTracker.js +29 -21
- package/dist/run/EngineRunner.d.ts +2 -0
- package/dist/run/EngineRunner.js +1 -0
- package/dist/run/RunManager.d.ts +26 -0
- package/dist/run/RunManager.js +82 -11
- package/dist/run/factory.d.ts +3 -0
- package/dist/run/factory.js +2 -0
- package/dist/runtime/safe-spawn.d.ts +6 -0
- package/dist/runtime/safe-spawn.js +8 -13
- package/dist/services/auto-dream.d.ts +13 -1
- package/dist/services/auto-dream.js +56 -8
- package/dist/services/dream-consolidation.js +10 -1
- package/dist/services/memory-orchestrator.js +6 -2
- package/dist/services/oauth.js +4 -1
- package/dist/services/session-memory.d.ts +4 -4
- package/dist/services/session-memory.js +13 -10
- package/dist/session/memory.d.ts +26 -7
- package/dist/session/memory.js +79 -21
- package/dist/session/session-manager.d.ts +182 -28
- package/dist/session/session-manager.js +910 -130
- package/dist/session/session-message.d.ts +22 -0
- package/dist/session/session-message.js +1 -0
- package/dist/session/transcript.d.ts +46 -5
- package/dist/session/transcript.js +159 -3
- package/dist/settings/feature-flags.d.ts +40 -0
- package/dist/settings/feature-flags.js +40 -0
- package/dist/settings/manager.d.ts +39 -1
- package/dist/settings/manager.js +102 -41
- package/dist/settings/migrate-config.js +4 -2
- package/dist/settings/schema.d.ts +511 -177
- package/dist/settings/schema.js +98 -25
- package/dist/skills/scanner.d.ts +6 -2
- package/dist/skills/scanner.js +160 -9
- package/dist/sources/adapter.d.ts +14 -0
- package/dist/sources/adapter.js +7 -0
- package/dist/sources/adapters/local-files.d.ts +10 -0
- package/dist/sources/adapters/local-files.js +127 -0
- package/dist/sources/adapters/mcp-resource.d.ts +17 -0
- package/dist/sources/adapters/mcp-resource.js +41 -0
- package/dist/sources/adapters/mock.d.ts +3 -0
- package/dist/sources/adapters/mock.js +29 -0
- package/dist/sources/binding.d.ts +6 -0
- package/dist/sources/binding.js +24 -0
- package/dist/sources/catalog.d.ts +6 -0
- package/dist/sources/catalog.js +64 -0
- package/dist/sources/context-summary.d.ts +8 -0
- package/dist/sources/context-summary.js +13 -0
- package/dist/sources/credential-status.d.ts +2 -0
- package/dist/sources/credential-status.js +13 -0
- package/dist/sources/index.d.ts +10 -0
- package/dist/sources/index.js +10 -0
- package/dist/sources/resolve.d.ts +28 -0
- package/dist/sources/resolve.js +47 -0
- package/dist/sources/truncate-utf8.d.ts +7 -0
- package/dist/sources/truncate-utf8.js +18 -0
- package/dist/sources/types.d.ts +71 -0
- package/dist/sources/types.js +26 -0
- package/dist/testing/fetch-stub.d.ts +32 -0
- package/dist/testing/fetch-stub.js +24 -0
- package/dist/themes/image.d.ts +18 -0
- package/dist/themes/image.js +117 -0
- package/dist/themes/index.d.ts +4 -0
- package/dist/themes/index.js +4 -0
- package/dist/themes/installer.d.ts +50 -0
- package/dist/themes/installer.js +290 -0
- package/dist/themes/manifest.d.ts +102 -0
- package/dist/themes/manifest.js +86 -0
- package/dist/themes/paths.d.ts +14 -0
- package/dist/themes/paths.js +33 -0
- package/dist/tool-system/browser-bridge.d.ts +53 -11
- package/dist/tool-system/browser-bridge.js +8 -9
- package/dist/tool-system/builtin/agent-heartbeat.d.ts +2 -2
- package/dist/tool-system/builtin/agent-heartbeat.js +20 -6
- package/dist/tool-system/builtin/agent-notifications.d.ts +127 -72
- package/dist/tool-system/builtin/agent-notifications.js +291 -101
- package/dist/tool-system/builtin/agent-output-file.js +1 -3
- package/dist/tool-system/builtin/agent-progress.d.ts +6 -0
- package/dist/tool-system/builtin/agent-progress.js +83 -0
- package/dist/tool-system/builtin/agent-registry.d.ts +38 -2
- package/dist/tool-system/builtin/agent-registry.js +178 -9
- package/dist/tool-system/builtin/agent-transcript-translator.js +1 -1
- package/dist/tool-system/builtin/agent.d.ts +2 -0
- package/dist/tool-system/builtin/agent.js +274 -33
- package/dist/tool-system/builtin/background-jobs.d.ts +55 -2
- package/dist/tool-system/builtin/background-jobs.js +96 -4
- package/dist/tool-system/builtin/background-work.d.ts +6 -0
- package/dist/tool-system/builtin/background-work.js +8 -1
- package/dist/tool-system/builtin/bash.js +5 -2
- package/dist/tool-system/builtin/browser-tools.d.ts +6 -3
- package/dist/tool-system/builtin/browser-tools.js +89 -23
- package/dist/tool-system/builtin/edit-model-catalog.d.ts +6 -0
- package/dist/tool-system/builtin/edit-model-catalog.js +172 -12
- package/dist/tool-system/builtin/edit.js +2 -6
- package/dist/tool-system/builtin/file-cache.d.ts +2 -0
- package/dist/tool-system/builtin/file-cache.js +4 -0
- package/dist/tool-system/builtin/generate-image.js +17 -10
- package/dist/tool-system/builtin/generate-video.js +26 -7
- package/dist/tool-system/builtin/grep.js +2 -2
- package/dist/tool-system/builtin/image-uploader.js +7 -1
- package/dist/tool-system/builtin/index.d.ts +32 -7
- package/dist/tool-system/builtin/index.js +237 -167
- package/dist/tool-system/builtin/memory.d.ts +6 -0
- package/dist/tool-system/builtin/memory.js +36 -15
- package/dist/tool-system/builtin/panel.d.ts +9 -0
- package/dist/tool-system/builtin/panel.js +314 -0
- package/dist/tool-system/builtin/read.js +5 -1
- package/dist/tool-system/builtin/send-message-to-session.d.ts +6 -0
- package/dist/tool-system/builtin/send-message-to-session.js +67 -0
- package/dist/tool-system/builtin/sources.d.ts +8 -0
- package/dist/tool-system/builtin/sources.js +137 -0
- package/dist/tool-system/builtin/tool-search.js +7 -2
- package/dist/tool-system/builtin/update-automation-memory.js +2 -0
- package/dist/tool-system/builtin/web-fetch.js +17 -13
- package/dist/tool-system/builtin/web-search.js +1 -3
- package/dist/tool-system/capability-module.d.ts +93 -0
- package/dist/tool-system/capability-module.js +53 -0
- package/dist/tool-system/context.d.ts +77 -19
- package/dist/tool-system/executor.js +75 -50
- package/dist/tool-system/external-tool-exposure.d.ts +60 -0
- package/dist/tool-system/external-tool-exposure.js +304 -0
- package/dist/tool-system/mcp-manager.d.ts +11 -1
- package/dist/tool-system/mcp-manager.js +19 -4
- package/dist/tool-system/mcp-tool-policy.d.ts +9 -0
- package/dist/tool-system/mcp-tool-policy.js +34 -0
- package/dist/tool-system/panel-bridge.d.ts +53 -0
- package/dist/tool-system/panel-bridge.js +1 -0
- package/dist/tool-system/path-policy.js +99 -2
- package/dist/tool-system/permission.d.ts +26 -0
- package/dist/tool-system/permission.js +46 -0
- package/dist/tool-system/registry.d.ts +12 -1
- package/dist/tool-system/registry.js +31 -7
- package/dist/tool-system/sandbox/index.js +3 -8
- package/dist/tool-system/sandbox/seatbelt.js +2 -6
- package/dist/tool-system/session-tool-host.d.ts +139 -0
- package/dist/tool-system/session-tool-host.js +167 -0
- package/dist/tool-system/testing/tool-registry-harness.d.ts +31 -0
- package/dist/tool-system/testing/tool-registry-harness.js +51 -0
- package/dist/tool-system/validation.d.ts +14 -7
- package/dist/tool-system/validation.js +701 -7
- package/dist/types.d.ts +186 -20
- package/dist/{cc-orchestrator → utils}/cwd-normalize.d.ts +1 -0
- package/dist/{cc-orchestrator → utils}/cwd-normalize.js +1 -0
- package/dist/utils/file-mutex.d.ts +65 -0
- package/dist/utils/file-mutex.js +145 -0
- package/dist/utils/json.d.ts +2 -4
- package/dist/utils/json.js +2 -4
- package/dist/utils/lockfile.d.ts +30 -1
- package/dist/utils/lockfile.js +2 -2
- package/dist/utils/secret-scrubber.d.ts +8 -0
- package/dist/utils/secret-scrubber.js +227 -0
- package/dist/utils/toolDisplay.js +1 -1
- package/package.json +20 -5
- package/THIRD_PARTY_NOTICES.md +0 -206
- package/dist/arena/arena.d.ts +0 -45
- package/dist/arena/arena.js +0 -362
- package/dist/arena/context/context-tools.d.ts +0 -16
- package/dist/arena/context/context-tools.js +0 -272
- package/dist/arena/context/within-root.d.ts +0 -7
- package/dist/arena/context/within-root.js +0 -15
- package/dist/arena/detect-mode.d.ts +0 -20
- package/dist/arena/detect-mode.js +0 -78
- package/dist/arena/digest-builder.d.ts +0 -25
- package/dist/arena/digest-builder.js +0 -120
- package/dist/arena/index.d.ts +0 -29
- package/dist/arena/index.js +0 -29
- package/dist/arena/iterate/convergence.d.ts +0 -25
- package/dist/arena/iterate/convergence.js +0 -103
- package/dist/arena/iterate/formats/index.d.ts +0 -22
- package/dist/arena/iterate/formats/index.js +0 -283
- package/dist/arena/iterate/index.d.ts +0 -11
- package/dist/arena/iterate/index.js +0 -9
- package/dist/arena/iterate/iterative-arena.d.ts +0 -23
- package/dist/arena/iterate/iterative-arena.js +0 -237
- package/dist/arena/iterate/parse.d.ts +0 -42
- package/dist/arena/iterate/parse.js +0 -123
- package/dist/arena/iterate/phases/argue.d.ts +0 -22
- package/dist/arena/iterate/phases/argue.js +0 -165
- package/dist/arena/iterate/phases/revise.d.ts +0 -16
- package/dist/arena/iterate/phases/revise.js +0 -62
- package/dist/arena/iterate/phases/tournament.d.ts +0 -34
- package/dist/arena/iterate/phases/tournament.js +0 -113
- package/dist/arena/iterate/tools/web-tools.d.ts +0 -13
- package/dist/arena/iterate/tools/web-tools.js +0 -54
- package/dist/arena/iterate/types.d.ts +0 -152
- package/dist/arena/iterate/types.js +0 -8
- package/dist/arena/ledger.d.ts +0 -47
- package/dist/arena/ledger.js +0 -159
- package/dist/arena/lenses/architecture.d.ts +0 -5
- package/dist/arena/lenses/architecture.js +0 -22
- package/dist/arena/lenses/engineering.d.ts +0 -5
- package/dist/arena/lenses/engineering.js +0 -22
- package/dist/arena/lenses/general.d.ts +0 -5
- package/dist/arena/lenses/general.js +0 -20
- package/dist/arena/lenses/index.d.ts +0 -16
- package/dist/arena/lenses/index.js +0 -47
- package/dist/arena/lenses/product.d.ts +0 -5
- package/dist/arena/lenses/product.js +0 -22
- package/dist/arena/model-presets.d.ts +0 -23
- package/dist/arena/model-presets.js +0 -44
- package/dist/arena/phases/adjudication.d.ts +0 -25
- package/dist/arena/phases/adjudication.js +0 -142
- package/dist/arena/phases/build-consensus.d.ts +0 -30
- package/dist/arena/phases/build-consensus.js +0 -85
- package/dist/arena/phases/claim-registry.d.ts +0 -26
- package/dist/arena/phases/claim-registry.js +0 -60
- package/dist/arena/phases/cross-review.d.ts +0 -47
- package/dist/arena/phases/cross-review.js +0 -224
- package/dist/arena/phases/debate-rounds.d.ts +0 -28
- package/dist/arena/phases/debate-rounds.js +0 -161
- package/dist/arena/phases/participant-research.d.ts +0 -39
- package/dist/arena/phases/participant-research.js +0 -316
- package/dist/arena/phases/planning-detail-expansion.d.ts +0 -39
- package/dist/arena/phases/planning-detail-expansion.js +0 -120
- package/dist/arena/planner.d.ts +0 -28
- package/dist/arena/planner.js +0 -312
- package/dist/arena/providers/docs.d.ts +0 -7
- package/dist/arena/providers/docs.js +0 -111
- package/dist/arena/providers/git.d.ts +0 -8
- package/dist/arena/providers/git.js +0 -174
- package/dist/arena/providers/index.d.ts +0 -32
- package/dist/arena/providers/index.js +0 -132
- package/dist/arena/providers/none.d.ts +0 -7
- package/dist/arena/providers/none.js +0 -11
- package/dist/arena/providers/repo.d.ts +0 -7
- package/dist/arena/providers/repo.js +0 -258
- package/dist/arena/render/session.d.ts +0 -17
- package/dist/arena/render/session.js +0 -190
- package/dist/arena/render/terminal.d.ts +0 -34
- package/dist/arena/render/terminal.js +0 -286
- package/dist/arena/strategies/discussion.d.ts +0 -25
- package/dist/arena/strategies/discussion.js +0 -143
- package/dist/arena/strategies/index.d.ts +0 -15
- package/dist/arena/strategies/index.js +0 -28
- package/dist/arena/strategies/language-wrapper.d.ts +0 -17
- package/dist/arena/strategies/language-wrapper.js +0 -102
- package/dist/arena/strategies/lens-wrapper.d.ts +0 -16
- package/dist/arena/strategies/lens-wrapper.js +0 -236
- package/dist/arena/strategies/planning.d.ts +0 -30
- package/dist/arena/strategies/planning.js +0 -225
- package/dist/arena/strategies/review.d.ts +0 -26
- package/dist/arena/strategies/review.js +0 -168
- package/dist/arena/strategies/utils.d.ts +0 -36
- package/dist/arena/strategies/utils.js +0 -603
- package/dist/arena/tools/selector.d.ts +0 -17
- package/dist/arena/tools/selector.js +0 -61
- package/dist/arena/transitions.d.ts +0 -53
- package/dist/arena/transitions.js +0 -97
- package/dist/arena/types.d.ts +0 -518
- package/dist/arena/types.js +0 -27
- package/dist/cc-orchestrator/agent-adapter.d.ts +0 -54
- package/dist/cc-orchestrator/agent-adapter.js +0 -143
- package/dist/cc-orchestrator/cc-capability.d.ts +0 -19
- package/dist/cc-orchestrator/cc-capability.js +0 -53
- package/dist/cc-orchestrator/codex-session-discovery.d.ts +0 -24
- package/dist/cc-orchestrator/codex-session-discovery.js +0 -191
- package/dist/cc-orchestrator/codex-session-history.d.ts +0 -38
- package/dist/cc-orchestrator/codex-session-history.js +0 -247
- package/dist/cc-orchestrator/external-agent-bindings.d.ts +0 -27
- package/dist/cc-orchestrator/external-agent-bindings.js +0 -150
- package/dist/cc-orchestrator/external-agent-changes.d.ts +0 -19
- package/dist/cc-orchestrator/external-agent-changes.js +0 -231
- package/dist/cc-orchestrator/external-agent-driver.d.ts +0 -19
- package/dist/cc-orchestrator/external-agent-driver.js +0 -284
- package/dist/cc-orchestrator/external-agent-session-store.d.ts +0 -23
- package/dist/cc-orchestrator/external-agent-session-store.js +0 -146
- package/dist/cc-orchestrator/index.d.ts +0 -8
- package/dist/cc-orchestrator/index.js +0 -8
- package/dist/cc-orchestrator/relevance-judge.d.ts +0 -15
- package/dist/cc-orchestrator/relevance-judge.js +0 -29
- package/dist/cc-orchestrator/session-discovery.d.ts +0 -46
- package/dist/cc-orchestrator/session-discovery.js +0 -125
- package/dist/cc-orchestrator/session-history.d.ts +0 -54
- package/dist/cc-orchestrator/session-history.js +0 -150
- package/dist/cron/cron-runtime.d.ts +0 -2
- package/dist/cron/cron-runtime.js +0 -2
- package/dist/cron/cron-store.d.ts +0 -2
- package/dist/cron/cron-store.js +0 -2
- package/dist/cron/scheduler.d.ts +0 -7
- package/dist/cron/scheduler.js +0 -7
- package/dist/engine/goal.js +0 -206
- package/dist/external-agents/config.d.ts +0 -2
- package/dist/external-agents/config.js +0 -15
- package/dist/external-agents/types.d.ts +0 -31
- package/dist/git/parse-log.d.ts +0 -13
- package/dist/git/parse-log.js +0 -21
- package/dist/git/utils.d.ts +0 -49
- package/dist/git/utils.js +0 -161
- package/dist/git/worktree/crud.d.ts +0 -72
- package/dist/git/worktree/crud.js +0 -235
- package/dist/git/worktree/diff.d.ts +0 -14
- package/dist/git/worktree/diff.js +0 -82
- package/dist/git/worktree/git-exec.d.ts +0 -7
- package/dist/git/worktree/git-exec.js +0 -87
- package/dist/git/worktree/index.d.ts +0 -5
- package/dist/git/worktree/index.js +0 -5
- package/dist/git/worktree/query.d.ts +0 -43
- package/dist/git/worktree/query.js +0 -128
- package/dist/git/worktree/slug.d.ts +0 -11
- package/dist/git/worktree/slug.js +0 -58
- package/dist/git/worktree.d.ts +0 -1
- package/dist/git/worktree.js +0 -5
- package/dist/lsp/client.d.ts +0 -41
- package/dist/lsp/client.js +0 -186
- package/dist/lsp/manager.d.ts +0 -40
- package/dist/lsp/manager.js +0 -155
- package/dist/lsp/root-path.d.ts +0 -9
- package/dist/lsp/root-path.js +0 -12
- package/dist/lsp/servers.d.ts +0 -16
- package/dist/lsp/servers.js +0 -60
- package/dist/prompt/sections/coding.md +0 -35
- package/dist/quota/credentials.d.ts +0 -3
- package/dist/quota/credentials.js +0 -80
- package/dist/quota/index.d.ts +0 -36
- package/dist/quota/index.js +0 -155
- package/dist/quota/types.d.ts +0 -48
- package/dist/quota/types.js +0 -13
- package/dist/review/review-prompt.d.ts +0 -28
- package/dist/review/review-prompt.js +0 -81
- package/dist/state.d.ts +0 -160
- package/dist/state.js +0 -267
- package/dist/tool-system/builtin/apply-patch/applier.d.ts +0 -26
- package/dist/tool-system/builtin/apply-patch/applier.js +0 -308
- package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +0 -10
- package/dist/tool-system/builtin/apply-patch/backup-targets.js +0 -30
- package/dist/tool-system/builtin/apply-patch/index.d.ts +0 -20
- package/dist/tool-system/builtin/apply-patch/index.js +0 -105
- package/dist/tool-system/builtin/apply-patch/parser.d.ts +0 -17
- package/dist/tool-system/builtin/apply-patch/parser.js +0 -212
- package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +0 -18
- package/dist/tool-system/builtin/apply-patch/seek-sequence.js +0 -123
- package/dist/tool-system/builtin/apply-patch/types.d.ts +0 -49
- package/dist/tool-system/builtin/apply-patch/types.js +0 -13
- package/dist/tool-system/builtin/arena.d.ts +0 -31
- package/dist/tool-system/builtin/arena.js +0 -416
- package/dist/tool-system/builtin/brief.d.ts +0 -6
- package/dist/tool-system/builtin/brief.js +0 -41
- package/dist/tool-system/builtin/check-quota.d.ts +0 -15
- package/dist/tool-system/builtin/check-quota.js +0 -34
- package/dist/tool-system/builtin/drive-claude-code.d.ts +0 -51
- package/dist/tool-system/builtin/drive-claude-code.js +0 -698
- package/dist/tool-system/builtin/lsp.d.ts +0 -7
- package/dist/tool-system/builtin/lsp.js +0 -144
- package/dist/tool-system/builtin/notebook-edit.d.ts +0 -7
- package/dist/tool-system/builtin/notebook-edit.js +0 -127
- package/dist/tool-system/builtin/worktree.d.ts +0 -11
- package/dist/tool-system/builtin/worktree.js +0 -363
- /package/dist/{external-agents → links}/types.js +0 -0
- /package/dist/{engine/session-usage.d.ts → session/usage.d.ts} +0 -0
- /package/dist/{engine/session-usage.js → session/usage.js} +0 -0
|
@@ -1,4 +1,90 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
const PluginLocalizedTitle = z
|
|
3
|
+
.object({
|
|
4
|
+
default: z.string().min(1).max(120),
|
|
5
|
+
en: z.string().min(1).max(120).optional(),
|
|
6
|
+
"zh-CN": z.string().min(1).max(120).optional(),
|
|
7
|
+
})
|
|
8
|
+
.strict();
|
|
9
|
+
export const PluginAutomationTemplate = z
|
|
10
|
+
.object({
|
|
11
|
+
id: z.string().regex(/^[a-z][a-z0-9-]{0,63}$/),
|
|
12
|
+
title: PluginLocalizedTitle,
|
|
13
|
+
description: z.string().min(1).max(500).optional(),
|
|
14
|
+
schedule: z.string().min(1).max(128),
|
|
15
|
+
prompt: z.string().min(1).max(32_768),
|
|
16
|
+
timezone: z.string().min(1).max(100).optional(),
|
|
17
|
+
permissionLevel: z.enum(["read-only", "workspace-write", "full"]).default("read-only"),
|
|
18
|
+
workspace: z.enum(["current", "none"]).default("current"),
|
|
19
|
+
})
|
|
20
|
+
.strict();
|
|
21
|
+
export const PluginAutomationsManifest = z
|
|
22
|
+
.object({
|
|
23
|
+
version: z.literal(1),
|
|
24
|
+
templates: z.array(PluginAutomationTemplate).max(32),
|
|
25
|
+
})
|
|
26
|
+
.strict()
|
|
27
|
+
.superRefine((value, ctx) => {
|
|
28
|
+
const ids = new Set();
|
|
29
|
+
for (const [index, template] of value.templates.entries()) {
|
|
30
|
+
if (ids.has(template.id)) {
|
|
31
|
+
ctx.addIssue({
|
|
32
|
+
code: z.ZodIssueCode.custom,
|
|
33
|
+
path: ["templates", index, "id"],
|
|
34
|
+
message: `duplicate automation template id: ${template.id}`,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
ids.add(template.id);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
const CodexHooksDeclaration = z.union([
|
|
41
|
+
z.string(),
|
|
42
|
+
z.record(z.any()),
|
|
43
|
+
z.array(z.union([z.string(), z.record(z.any())])),
|
|
44
|
+
]);
|
|
45
|
+
const HttpsPluginUrl = z
|
|
46
|
+
.string()
|
|
47
|
+
.url()
|
|
48
|
+
.max(2048)
|
|
49
|
+
.refine((value) => {
|
|
50
|
+
try {
|
|
51
|
+
const url = new URL(value);
|
|
52
|
+
return url.protocol === "https:" && Boolean(url.hostname) && !url.username && !url.password;
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
}, { message: "plugin interface URL must use https" });
|
|
58
|
+
export const PluginInterfaceMetadata = z
|
|
59
|
+
.object({
|
|
60
|
+
displayName: z.string().min(1).max(120).optional(),
|
|
61
|
+
shortDescription: z.string().min(1).max(300).optional(),
|
|
62
|
+
longDescription: z.string().min(1).max(4000).optional(),
|
|
63
|
+
developerName: z.string().min(1).max(160).optional(),
|
|
64
|
+
category: z.string().min(1).max(100).optional(),
|
|
65
|
+
capabilities: z.array(z.string().min(1).max(80)).max(32).optional(),
|
|
66
|
+
websiteURL: HttpsPluginUrl.optional(),
|
|
67
|
+
privacyPolicyURL: HttpsPluginUrl.optional(),
|
|
68
|
+
termsOfServiceURL: HttpsPluginUrl.optional(),
|
|
69
|
+
defaultPrompt: z.array(z.string().min(1).max(128)).max(3).optional(),
|
|
70
|
+
brandColor: z
|
|
71
|
+
.string()
|
|
72
|
+
.regex(/^#[0-9a-fA-F]{6}$/)
|
|
73
|
+
.optional(),
|
|
74
|
+
composerIcon: z.string().min(1).max(512).optional(),
|
|
75
|
+
logo: z.string().min(1).max(512).optional(),
|
|
76
|
+
logoDark: z.string().min(1).max(512).optional(),
|
|
77
|
+
screenshots: z.array(z.string().min(1).max(512)).max(3).optional(),
|
|
78
|
+
})
|
|
79
|
+
.strip();
|
|
80
|
+
/** CodeShell-only manifest overlay kept outside `.codex-plugin/plugin.json`. */
|
|
81
|
+
export const CodeShellPluginOverlay = z
|
|
82
|
+
.object({
|
|
83
|
+
schemaVersion: z.literal(1),
|
|
84
|
+
automations: PluginAutomationsManifest.optional(),
|
|
85
|
+
})
|
|
86
|
+
.strict();
|
|
87
|
+
export const CODESHELL_PLUGIN_OVERLAY_FILE = ".codeshell-plugin/plugin.json";
|
|
2
88
|
/** Codex `.codex-plugin/plugin.json`. v1 reads required fields; unknowns pass through. */
|
|
3
89
|
export const CodexPluginManifest = z
|
|
4
90
|
.object({
|
|
@@ -9,8 +95,22 @@ export const CodexPluginManifest = z
|
|
|
9
95
|
mcpServers: z.union([z.string(), z.record(z.any())]).optional(),
|
|
10
96
|
skills: z.string().optional(),
|
|
11
97
|
agents: z.string().optional(),
|
|
98
|
+
hooks: CodexHooksDeclaration.optional(),
|
|
99
|
+
interface: PluginInterfaceMetadata.passthrough().optional(),
|
|
12
100
|
})
|
|
13
101
|
.passthrough();
|
|
102
|
+
/** Trusted, normalized manifest written into an installed plugin directory. */
|
|
103
|
+
export const CanonicalPluginManifest = z
|
|
104
|
+
.object({
|
|
105
|
+
schemaVersion: z.literal(1),
|
|
106
|
+
name: z.string().min(1),
|
|
107
|
+
version: z.string().optional(),
|
|
108
|
+
description: z.string().optional(),
|
|
109
|
+
interface: PluginInterfaceMetadata.optional(),
|
|
110
|
+
automations: PluginAutomationsManifest.optional(),
|
|
111
|
+
})
|
|
112
|
+
.strict();
|
|
113
|
+
export const CANONICAL_PLUGIN_MANIFEST_FILE = ".cs-plugin-manifest.json";
|
|
14
114
|
/** `.cs-meta.json` written into every installed plugin dir. */
|
|
15
115
|
export const CSMeta = z.object({
|
|
16
116
|
name: z.string(),
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
export declare const MAX_PLUGIN_ZIP_BYTES: number;
|
|
2
|
+
export declare const MAX_PLUGIN_ZIP_ENTRIES = 10000;
|
|
3
|
+
export declare const MAX_PLUGIN_ZIP_EXTRACTED_BYTES: number;
|
|
4
|
+
export declare const MAX_PLUGIN_ZIP_ENTRY_BYTES: number;
|
|
5
|
+
export declare const MAX_PLUGIN_ZIP_ENTRY_NAME = 1024;
|
|
1
6
|
/**
|
|
2
7
|
* Reject path traversal ("zip slip"): a malicious archive can carry entries
|
|
3
8
|
* like `../../etc/foo` that escape the extraction root. We normalize and
|
|
@@ -12,3 +17,9 @@ export declare function safeJoin(destDir: string, entryName: string): string;
|
|
|
12
17
|
* needs and keeps the surface safe.
|
|
13
18
|
*/
|
|
14
19
|
export declare function extractZip(zipPath: string, destDir: string): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Extract one repository-relative subtree from an archive with a single
|
|
22
|
+
* wrapper directory, as produced by GitHub source archives. Unrelated
|
|
23
|
+
* monorepo content is never materialized or counted against extracted limits.
|
|
24
|
+
*/
|
|
25
|
+
export declare function extractZipSubdirectory(zipPath: string, destDir: string, subdirectory?: string): Promise<void>;
|
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import { createRequire } from "node:module";
|
|
2
2
|
import { createWriteStream } from "node:fs";
|
|
3
|
-
import { mkdir } from "node:fs/promises";
|
|
3
|
+
import { mkdir, stat } from "node:fs/promises";
|
|
4
4
|
import { dirname, join, normalize, sep } from "node:path";
|
|
5
5
|
import { pipeline } from "node:stream/promises";
|
|
6
6
|
import { PluginInstallError } from "./types.js";
|
|
7
|
+
export const MAX_PLUGIN_ZIP_BYTES = 128 * 1024 * 1024;
|
|
8
|
+
export const MAX_PLUGIN_ZIP_ENTRIES = 10_000;
|
|
9
|
+
export const MAX_PLUGIN_ZIP_EXTRACTED_BYTES = 256 * 1024 * 1024;
|
|
10
|
+
export const MAX_PLUGIN_ZIP_ENTRY_BYTES = 64 * 1024 * 1024;
|
|
11
|
+
export const MAX_PLUGIN_ZIP_ENTRY_NAME = 1_024;
|
|
7
12
|
let _yauzl;
|
|
8
13
|
function yauzl() {
|
|
9
14
|
if (!_yauzl) {
|
|
@@ -17,6 +22,14 @@ function yauzl() {
|
|
|
17
22
|
* require the resolved path to stay within `destDir`.
|
|
18
23
|
*/
|
|
19
24
|
export function safeJoin(destDir, entryName) {
|
|
25
|
+
if (entryName.length === 0 ||
|
|
26
|
+
entryName.length > MAX_PLUGIN_ZIP_ENTRY_NAME ||
|
|
27
|
+
entryName.includes("\0") ||
|
|
28
|
+
entryName.includes("\\") ||
|
|
29
|
+
entryName.startsWith("/") ||
|
|
30
|
+
/^[A-Za-z]:/.test(entryName)) {
|
|
31
|
+
throw new PluginInstallError(`refusing unsafe zip entry name: ${entryName}`);
|
|
32
|
+
}
|
|
20
33
|
// Zip entries always use forward slashes; normalize to the host separator.
|
|
21
34
|
const target = normalize(join(destDir, entryName));
|
|
22
35
|
const root = normalize(destDir.endsWith(sep) ? destDir : destDir + sep);
|
|
@@ -33,6 +46,10 @@ export function safeJoin(destDir, entryName) {
|
|
|
33
46
|
* needs and keeps the surface safe.
|
|
34
47
|
*/
|
|
35
48
|
export async function extractZip(zipPath, destDir) {
|
|
49
|
+
const archive = await stat(zipPath);
|
|
50
|
+
if (!archive.isFile() || archive.size > MAX_PLUGIN_ZIP_BYTES) {
|
|
51
|
+
throw new PluginInstallError(`plugin zip must be a regular file no larger than ${MAX_PLUGIN_ZIP_BYTES} bytes`);
|
|
52
|
+
}
|
|
36
53
|
const zip = await openZip(zipPath);
|
|
37
54
|
try {
|
|
38
55
|
await drainEntries(zip, destDir);
|
|
@@ -41,6 +58,61 @@ export async function extractZip(zipPath, destDir) {
|
|
|
41
58
|
zip.close();
|
|
42
59
|
}
|
|
43
60
|
}
|
|
61
|
+
/**
|
|
62
|
+
* Extract one repository-relative subtree from an archive with a single
|
|
63
|
+
* wrapper directory, as produced by GitHub source archives. Unrelated
|
|
64
|
+
* monorepo content is never materialized or counted against extracted limits.
|
|
65
|
+
*/
|
|
66
|
+
export async function extractZipSubdirectory(zipPath, destDir, subdirectory = "") {
|
|
67
|
+
const archive = await stat(zipPath);
|
|
68
|
+
if (!archive.isFile() || archive.size > MAX_PLUGIN_ZIP_BYTES) {
|
|
69
|
+
throw new PluginInstallError(`plugin zip must be a regular file no larger than ${MAX_PLUGIN_ZIP_BYTES} bytes`);
|
|
70
|
+
}
|
|
71
|
+
const normalizedSubdirectory = subdirectory.replaceAll("\\", "/").replace(/\/+$/, "");
|
|
72
|
+
if (normalizedSubdirectory.startsWith("/") ||
|
|
73
|
+
normalizedSubdirectory.split("/").some((segment) => segment === "." || segment === "..")) {
|
|
74
|
+
throw new PluginInstallError(`refusing unsafe zip subdirectory: ${subdirectory}`);
|
|
75
|
+
}
|
|
76
|
+
let wrapper;
|
|
77
|
+
const prefix = normalizedSubdirectory ? `${normalizedSubdirectory}/` : "";
|
|
78
|
+
const zip = await openZip(zipPath);
|
|
79
|
+
try {
|
|
80
|
+
const selected = await drainEntries(zip, destDir, (entryName) => {
|
|
81
|
+
// Validate the original archive path before removing GitHub's generated
|
|
82
|
+
// top-level wrapper. safeJoin rejects traversal, absolute paths, NULs,
|
|
83
|
+
// drive letters, and backslashes.
|
|
84
|
+
safeJoin(destDir, entryName);
|
|
85
|
+
const slash = entryName.indexOf("/");
|
|
86
|
+
if (slash < 1)
|
|
87
|
+
return null;
|
|
88
|
+
const entryWrapper = entryName.slice(0, slash);
|
|
89
|
+
if (wrapper === undefined)
|
|
90
|
+
wrapper = entryWrapper;
|
|
91
|
+
else if (wrapper !== entryWrapper) {
|
|
92
|
+
throw new PluginInstallError("GitHub source archive contains multiple root directories");
|
|
93
|
+
}
|
|
94
|
+
const repositoryPath = entryName.slice(slash + 1);
|
|
95
|
+
if (!repositoryPath)
|
|
96
|
+
return null;
|
|
97
|
+
if (normalizedSubdirectory) {
|
|
98
|
+
if (repositoryPath !== normalizedSubdirectory && !repositoryPath.startsWith(prefix)) {
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
const relativePath = repositoryPath === normalizedSubdirectory ? "" : repositoryPath.slice(prefix.length);
|
|
102
|
+
return relativePath || null;
|
|
103
|
+
}
|
|
104
|
+
return repositoryPath;
|
|
105
|
+
});
|
|
106
|
+
if (selected === 0) {
|
|
107
|
+
throw new PluginInstallError(normalizedSubdirectory
|
|
108
|
+
? `GitHub source archive does not contain subdirectory: ${normalizedSubdirectory}`
|
|
109
|
+
: "GitHub source archive is empty");
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
finally {
|
|
113
|
+
zip.close();
|
|
114
|
+
}
|
|
115
|
+
}
|
|
44
116
|
function openZip(zipPath) {
|
|
45
117
|
return new Promise((resolve, reject) => {
|
|
46
118
|
yauzl().open(zipPath, { lazyEntries: true }, (err, z) => {
|
|
@@ -52,23 +124,65 @@ function openZip(zipPath) {
|
|
|
52
124
|
});
|
|
53
125
|
});
|
|
54
126
|
}
|
|
55
|
-
function drainEntries(zip, destDir) {
|
|
127
|
+
function drainEntries(zip, destDir, mapEntryName = (entryName) => entryName) {
|
|
56
128
|
return new Promise((resolve, reject) => {
|
|
57
|
-
|
|
58
|
-
|
|
129
|
+
let entryCount = 0;
|
|
130
|
+
let extractedBytes = 0;
|
|
131
|
+
let settled = false;
|
|
132
|
+
const fail = (error) => {
|
|
133
|
+
if (settled)
|
|
134
|
+
return;
|
|
135
|
+
settled = true;
|
|
136
|
+
zip.close();
|
|
137
|
+
reject(error);
|
|
138
|
+
};
|
|
139
|
+
zip.on("error", fail);
|
|
140
|
+
zip.on("end", () => {
|
|
141
|
+
if (settled)
|
|
142
|
+
return;
|
|
143
|
+
settled = true;
|
|
144
|
+
resolve(entryCount);
|
|
145
|
+
});
|
|
59
146
|
zip.on("entry", (entry) => {
|
|
60
|
-
|
|
147
|
+
let entryName;
|
|
148
|
+
try {
|
|
149
|
+
entryName = mapEntryName(entry.fileName);
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
fail(error);
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
if (entryName === null) {
|
|
156
|
+
zip.readEntry();
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
entryCount += 1;
|
|
160
|
+
if (entryCount > MAX_PLUGIN_ZIP_ENTRIES) {
|
|
161
|
+
fail(new PluginInstallError(`plugin zip contains more than ${MAX_PLUGIN_ZIP_ENTRIES} entries`));
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
if (entryName.length > MAX_PLUGIN_ZIP_ENTRY_NAME ||
|
|
165
|
+
entry.uncompressedSize > MAX_PLUGIN_ZIP_ENTRY_BYTES) {
|
|
166
|
+
fail(new PluginInstallError(`plugin zip entry exceeds preview/install limits: ${entryName}`));
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
extractedBytes += entry.uncompressedSize;
|
|
170
|
+
if (extractedBytes > MAX_PLUGIN_ZIP_EXTRACTED_BYTES) {
|
|
171
|
+
fail(new PluginInstallError(`plugin zip expands beyond ${MAX_PLUGIN_ZIP_EXTRACTED_BYTES} bytes`));
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
const onErr = (e) => fail(e);
|
|
61
175
|
// Directory entry — yauzl signals these with a trailing slash.
|
|
62
|
-
if (/\/$/.test(
|
|
63
|
-
mkdir(safeJoin(destDir,
|
|
176
|
+
if (/\/$/.test(entryName)) {
|
|
177
|
+
mkdir(safeJoin(destDir, entryName), { recursive: true })
|
|
64
178
|
.then(() => zip.readEntry())
|
|
65
179
|
.catch(onErr);
|
|
66
180
|
return;
|
|
67
181
|
}
|
|
68
|
-
const outPath = safeJoin(destDir,
|
|
182
|
+
const outPath = safeJoin(destDir, entryName);
|
|
69
183
|
zip.openReadStream(entry, (err, stream) => {
|
|
70
184
|
if (err || !stream) {
|
|
71
|
-
onErr(new PluginInstallError(`cannot read zip entry ${
|
|
185
|
+
onErr(new PluginInstallError(`cannot read zip entry ${entryName}: ${err?.message ?? "unknown"}`));
|
|
72
186
|
return;
|
|
73
187
|
}
|
|
74
188
|
mkdir(dirname(outPath), { recursive: true })
|
|
@@ -15,8 +15,8 @@ export interface UpdatePluginOptions {
|
|
|
15
15
|
* on failure we delete any partial install and rename the backup back.
|
|
16
16
|
*
|
|
17
17
|
* Async fs only — this runs in the Electron main process, so we never block the
|
|
18
|
-
* event loop with sync fs.
|
|
19
|
-
*
|
|
18
|
+
* event loop with sync fs. A random sibling name keeps concurrent attempts
|
|
19
|
+
* from deleting or restoring each other's backup.
|
|
20
20
|
*/
|
|
21
21
|
export declare function reinstallAtomic(name: string, source: string, doInstall: () => Promise<unknown>): Promise<void>;
|
|
22
22
|
/**
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
1
2
|
import { existsSync, readFileSync } from "node:fs";
|
|
2
3
|
import { rename, rm } from "node:fs/promises";
|
|
3
4
|
import { join } from "node:path";
|
|
@@ -7,6 +8,9 @@ import { installPluginFromPath } from "./install.js";
|
|
|
7
8
|
import { installPluginFromSource } from "./installFromSource.js";
|
|
8
9
|
import { parseSource } from "./parseSource.js";
|
|
9
10
|
import { pluginInstallKey, readInstalledPlugins, removeInstallEntries, writeInstalledPlugins, } from "../installedPlugins.js";
|
|
11
|
+
import { pluginHookInstallRecord } from "../pluginHookIntegrity.js";
|
|
12
|
+
import { pluginMcpInstallRecord } from "../pluginMcpIntegrity.js";
|
|
13
|
+
import { readPluginMcp } from "./loadPluginMcp.js";
|
|
10
14
|
import { CodexPluginManifest, CSMeta, PluginInstallError } from "./types.js";
|
|
11
15
|
/**
|
|
12
16
|
* Reinstall a plugin atomically: a failed update leaves the OLD plugin intact.
|
|
@@ -18,24 +22,56 @@ import { CodexPluginManifest, CSMeta, PluginInstallError } from "./types.js";
|
|
|
18
22
|
* on failure we delete any partial install and rename the backup back.
|
|
19
23
|
*
|
|
20
24
|
* Async fs only — this runs in the Electron main process, so we never block the
|
|
21
|
-
* event loop with sync fs.
|
|
22
|
-
*
|
|
25
|
+
* event loop with sync fs. A random sibling name keeps concurrent attempts
|
|
26
|
+
* from deleting or restoring each other's backup.
|
|
23
27
|
*/
|
|
24
28
|
export async function reinstallAtomic(name, source, doInstall) {
|
|
25
29
|
const dir = pluginInstallDir(name);
|
|
26
|
-
const backup = `${dir}.bak-${process.pid}`;
|
|
30
|
+
const backup = `${dir}.bak-${process.pid}-${randomUUID()}`;
|
|
27
31
|
// Capture the existing install_plugins.json entries so a failed reinstall can
|
|
28
32
|
// restore them (uninstall-then-install used to drop them on failure; here the
|
|
29
33
|
// old plugin survives, so its registration must survive too).
|
|
30
34
|
const key = pluginInstallKey(name, "local");
|
|
31
35
|
const savedEntries = readInstalledPlugins().plugins[key];
|
|
32
|
-
await rm(backup, { recursive: true, force: true });
|
|
33
36
|
await rename(dir, backup);
|
|
34
37
|
// The installer re-adds the entry on success; remove the stale one first so a
|
|
35
38
|
// successful reinstall doesn't accumulate a duplicate.
|
|
36
39
|
removeInstallEntries(key);
|
|
37
40
|
try {
|
|
38
41
|
await doInstall();
|
|
42
|
+
if (savedEntries) {
|
|
43
|
+
const data = readInstalledPlugins();
|
|
44
|
+
const installed = data.plugins[key] ?? [];
|
|
45
|
+
let changed = false;
|
|
46
|
+
for (const entry of installed) {
|
|
47
|
+
const next = pluginHookInstallRecord(entry.installPath, savedEntries);
|
|
48
|
+
const nextMcp = pluginMcpInstallRecord(entry.installPath, Object.keys(readPluginMcp(entry.installPath, name)).length > 0, savedEntries);
|
|
49
|
+
if (entry.hookDigest !== next.hookDigest ||
|
|
50
|
+
entry.approvedHookDigest !== next.approvedHookDigest ||
|
|
51
|
+
JSON.stringify(entry.approvedHookSnapshot) !==
|
|
52
|
+
JSON.stringify(next.approvedHookSnapshot) ||
|
|
53
|
+
entry.mcpDigest !== nextMcp.mcpDigest ||
|
|
54
|
+
entry.approvedMcpDigest !== nextMcp.approvedMcpDigest) {
|
|
55
|
+
entry.hookDigest = next.hookDigest;
|
|
56
|
+
if (next.approvedHookDigest)
|
|
57
|
+
entry.approvedHookDigest = next.approvedHookDigest;
|
|
58
|
+
else
|
|
59
|
+
delete entry.approvedHookDigest;
|
|
60
|
+
if (next.approvedHookSnapshot)
|
|
61
|
+
entry.approvedHookSnapshot = next.approvedHookSnapshot;
|
|
62
|
+
else
|
|
63
|
+
delete entry.approvedHookSnapshot;
|
|
64
|
+
entry.mcpDigest = nextMcp.mcpDigest;
|
|
65
|
+
if (nextMcp.approvedMcpDigest)
|
|
66
|
+
entry.approvedMcpDigest = nextMcp.approvedMcpDigest;
|
|
67
|
+
else
|
|
68
|
+
delete entry.approvedMcpDigest;
|
|
69
|
+
changed = true;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
if (changed)
|
|
73
|
+
writeInstalledPlugins(data);
|
|
74
|
+
}
|
|
39
75
|
}
|
|
40
76
|
catch (err) {
|
|
41
77
|
// Roll back: drop any partial install, restore the old dir + its entries.
|
|
@@ -75,6 +111,9 @@ export async function updatePluginByName(name, installedAt, force, options = {})
|
|
|
75
111
|
const parsed = parseSource(meta.source, {
|
|
76
112
|
allowUnsafeTransport: options.allowUnsafeTransport === true,
|
|
77
113
|
});
|
|
114
|
+
if (parsed.kind === "npm") {
|
|
115
|
+
throw new PluginInstallError("npm plugin auto-update is not available in Phase A; install an explicit npm:<package>@<version> source instead");
|
|
116
|
+
}
|
|
78
117
|
if (parsed.kind === "remote") {
|
|
79
118
|
// No local version to diff against — always re-clone and reinstall.
|
|
80
119
|
await reinstallAtomic(name, meta.source, () => installPluginFromSource(parsed, name, installedAt));
|
|
@@ -30,20 +30,31 @@
|
|
|
30
30
|
* PreCompact → pre_compact
|
|
31
31
|
* Notification → notification
|
|
32
32
|
* Stop → on_session_end
|
|
33
|
-
* SubagentStop → (
|
|
33
|
+
* SubagentStop → notification (implied matcher on kind ^agent_(completed|failed|cancelled)$)
|
|
34
34
|
*
|
|
35
35
|
* matcher semantics:
|
|
36
36
|
* SessionStart — matches against ctx.data.source ("startup"|"resume"|"clear"|"compact")
|
|
37
37
|
* PreToolUse /
|
|
38
38
|
* PostToolUse — matches against ctx.data.toolName
|
|
39
|
+
* Notification /
|
|
40
|
+
* SubagentStop — matches against ctx.data.kind (agent_* terminal states,
|
|
41
|
+
* approval_requested/resolved, mcp_server_*, …)
|
|
39
42
|
* other events — matcher is currently ignored (the CC spec doesn't
|
|
40
43
|
* define matcher semantics for them either)
|
|
41
44
|
*
|
|
42
45
|
* Errors are swallowed per-plugin: a malformed hooks.json from one plugin
|
|
43
46
|
* must not block other plugins from loading.
|
|
44
47
|
*/
|
|
45
|
-
import type { HookEventName } from "../hooks/events.js";
|
|
48
|
+
import type { HookContext, HookEventName } from "../hooks/events.js";
|
|
46
49
|
import type { HookRegistry } from "../hooks/registry.js";
|
|
50
|
+
import { type PluginHookApprovalState, type PluginHookIntegrity } from "./pluginHookIntegrity.js";
|
|
51
|
+
/**
|
|
52
|
+
* Per-event matcher logic. Returns true when the hook should fire.
|
|
53
|
+
*
|
|
54
|
+
* We only consult the matcher for events where CC defines its semantics;
|
|
55
|
+
* for others we always fire (matcher is treated as advisory metadata only).
|
|
56
|
+
*/
|
|
57
|
+
export declare function matcherAccepts(event: HookEventName, matcher: string | undefined, ctx: HookContext): boolean;
|
|
47
58
|
/**
|
|
48
59
|
* Stable identity for ONE plugin-provided hook, used as the record key in
|
|
49
60
|
* `capabilityOverrides.pluginHooks` (per-hook project off-switch). Derived
|
|
@@ -78,6 +89,8 @@ export declare function pluginHookKey(hook: {
|
|
|
78
89
|
export declare function loadPluginHooks(registry: HookRegistry, disabledPlugins?: string[], disabledPluginHooks?: string[]): void;
|
|
79
90
|
/** A single plugin-provided hook, surfaced read-only to the settings UI. */
|
|
80
91
|
export interface PluginHookEntry {
|
|
92
|
+
/** Full install key (`plugin@marketplace`) used by approval APIs. */
|
|
93
|
+
installKey: string;
|
|
81
94
|
/** Source plugin name (bare, no @marketplace). */
|
|
82
95
|
plugin: string;
|
|
83
96
|
/** Mapped codeshell event name. */
|
|
@@ -90,6 +103,10 @@ export interface PluginHookEntry {
|
|
|
90
103
|
matcher?: string;
|
|
91
104
|
/** Whether the owning plugin is currently disabled (its hooks don't fire). */
|
|
92
105
|
disabled: boolean;
|
|
106
|
+
/** Install-time integrity state for the executable hook definition. */
|
|
107
|
+
integrity: PluginHookIntegrity;
|
|
108
|
+
/** Explicit execution trust state. Pending/changed hooks do not register. */
|
|
109
|
+
approval: PluginHookApprovalState;
|
|
93
110
|
/** Stable per-hook identity ({@link pluginHookKey}) — the record key the
|
|
94
111
|
* UI writes to `capabilityOverrides.pluginHooks` to toggle just this hook. */
|
|
95
112
|
key: string;
|