@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
|
@@ -22,6 +22,9 @@
|
|
|
22
22
|
* reference this via ${CODESHELL_PLUGIN_ROOT}
|
|
23
23
|
* (varRewrite.ts rewrites CC's CLAUDE_PLUGIN_ROOT
|
|
24
24
|
* to this name at install time).
|
|
25
|
+
* PLUGIN_ROOT — Codex-compatible alias for the installed root.
|
|
26
|
+
* CODESHELL_PLUGIN_DATA — stable writable state directory for this plugin.
|
|
27
|
+
* PLUGIN_DATA — Codex-compatible alias for the state directory.
|
|
25
28
|
* CODESHELL_HOOK_EVENT — the codeshell-side event name (snake_case)
|
|
26
29
|
*
|
|
27
30
|
* We deliberately do NOT set CLAUDE_PLUGIN_ROOT here. Plugin scripts that
|
|
@@ -31,9 +34,21 @@
|
|
|
31
34
|
* branch — not the CC one.
|
|
32
35
|
*/
|
|
33
36
|
import { spawn } from "node:child_process";
|
|
37
|
+
import { createHash } from "node:crypto";
|
|
38
|
+
import { mkdirSync } from "node:fs";
|
|
39
|
+
import { homedir } from "node:os";
|
|
40
|
+
import { join } from "node:path";
|
|
34
41
|
import { MAX_HOOK_OUTPUT_BYTES } from "../hooks/hook-output.js";
|
|
42
|
+
import { closeHookStdin, MAX_HOOK_STDIN_BYTES, writeHookStdin } from "../hooks/shell-runner.js";
|
|
35
43
|
import { killChildTree } from "../runtime/spawn-common.js";
|
|
36
44
|
const DEFAULT_TIMEOUT_MS = 60_000;
|
|
45
|
+
function codeShellHome() {
|
|
46
|
+
return process.env.CODE_SHELL_HOME || join(process.env.HOME ?? homedir(), ".code-shell");
|
|
47
|
+
}
|
|
48
|
+
export function resolvePluginDataPath(pluginKey) {
|
|
49
|
+
const stableKey = createHash("sha256").update(pluginKey).digest("hex");
|
|
50
|
+
return join(codeShellHome(), "plugin-data", stableKey);
|
|
51
|
+
}
|
|
37
52
|
/**
|
|
38
53
|
* Extract the user-facing context string from a CC plugin's stdout JSON.
|
|
39
54
|
* Returns null if the payload doesn't carry context (which is valid — the
|
|
@@ -60,34 +75,69 @@ function extractAdditionalContext(parsed) {
|
|
|
60
75
|
}
|
|
61
76
|
return null;
|
|
62
77
|
}
|
|
78
|
+
function extractExplicitDenial(parsed) {
|
|
79
|
+
if (!parsed || typeof parsed !== "object")
|
|
80
|
+
return null;
|
|
81
|
+
const obj = parsed;
|
|
82
|
+
const nested = obj.hookSpecificOutput && typeof obj.hookSpecificOutput === "object"
|
|
83
|
+
? obj.hookSpecificOutput
|
|
84
|
+
: undefined;
|
|
85
|
+
const decision = obj.decision ?? obj.permissionDecision ?? nested?.decision ?? nested?.permissionDecision;
|
|
86
|
+
if (decision !== "deny" && decision !== "reject")
|
|
87
|
+
return null;
|
|
88
|
+
const message = obj.reason ??
|
|
89
|
+
obj.message ??
|
|
90
|
+
obj.permissionDecisionReason ??
|
|
91
|
+
nested?.reason ??
|
|
92
|
+
nested?.message ??
|
|
93
|
+
nested?.permissionDecisionReason;
|
|
94
|
+
return typeof message === "string" && message.trim() ? { message: message.trim() } : {};
|
|
95
|
+
}
|
|
96
|
+
function parseJson(stdout) {
|
|
97
|
+
if (!stdout)
|
|
98
|
+
return undefined;
|
|
99
|
+
try {
|
|
100
|
+
return JSON.parse(stdout);
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
63
106
|
/**
|
|
64
|
-
* Run one plugin hook command.
|
|
65
|
-
*
|
|
66
|
-
*
|
|
107
|
+
* Run one plugin hook command. CC's exit-code 2 and explicit deny/reject JSON
|
|
108
|
+
* are normalized to the native HookResult deny contract. Other failures stay
|
|
109
|
+
* non-blocking so a broken plugin does not wedge the engine.
|
|
67
110
|
*
|
|
68
111
|
* Stdin carries the same envelope shape the codeshell-native shell-runner
|
|
69
112
|
* uses (eventName + data) so plugin authors who want richer context can
|
|
70
113
|
* read it; CC plugins typically ignore stdin and emit context derived from
|
|
71
114
|
* their own state (e.g. reading a SKILL.md off disk via PLUGIN_ROOT).
|
|
72
115
|
*/
|
|
73
|
-
export async function runPluginCommandHook(spec, ctx) {
|
|
116
|
+
export async function runPluginCommandHook(spec, ctx, abortSignal) {
|
|
74
117
|
const timeoutMs = spec.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
118
|
+
const signal = abortSignal ?? ctx.data.signal;
|
|
119
|
+
if (signal?.aborted)
|
|
120
|
+
return {};
|
|
75
121
|
return new Promise((resolve) => {
|
|
76
122
|
let child;
|
|
77
123
|
try {
|
|
78
|
-
|
|
79
|
-
|
|
124
|
+
const pluginDataPath = spec.dataPath ?? resolvePluginDataPath(spec.pluginKey);
|
|
125
|
+
mkdirSync(pluginDataPath, { recursive: true, mode: 0o700 });
|
|
126
|
+
// Strip Claude-specific plugin vars from the inherited env: a plugin
|
|
127
|
+
// script that branches on `[ -n "$CLAUDE_PLUGIN_ROOT" ]` must conclude
|
|
80
128
|
// "not Claude Code" and pick the codeshell branch. varRewrite.ts
|
|
81
|
-
// converted
|
|
82
|
-
//
|
|
83
|
-
// story.
|
|
129
|
+
// converted literal root/data references to CodeShell-native names;
|
|
130
|
+
// this drop closes the runtime side of the same story.
|
|
84
131
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
85
|
-
const { CLAUDE_PLUGIN_ROOT:
|
|
132
|
+
const { CLAUDE_PLUGIN_ROOT: _strippedRoot, CLAUDE_PLUGIN_DATA: _strippedData, ...parentEnv } = process.env;
|
|
86
133
|
child = spawn(spec.command, [], {
|
|
87
134
|
shell: true,
|
|
88
135
|
env: {
|
|
89
136
|
...parentEnv,
|
|
90
137
|
CODESHELL_PLUGIN_ROOT: spec.installPath,
|
|
138
|
+
PLUGIN_ROOT: spec.installPath,
|
|
139
|
+
CODESHELL_PLUGIN_DATA: pluginDataPath,
|
|
140
|
+
PLUGIN_DATA: pluginDataPath,
|
|
91
141
|
CODESHELL_HOOK_EVENT: ctx.eventName,
|
|
92
142
|
},
|
|
93
143
|
});
|
|
@@ -112,8 +162,14 @@ export async function runPluginCommandHook(spec, ctx) {
|
|
|
112
162
|
if (settled)
|
|
113
163
|
return;
|
|
114
164
|
settled = true;
|
|
165
|
+
clearTimeout(timer);
|
|
166
|
+
signal?.removeEventListener("abort", onAbort);
|
|
115
167
|
resolve(value);
|
|
116
168
|
};
|
|
169
|
+
const onAbort = () => {
|
|
170
|
+
killChildTree(child, 1000);
|
|
171
|
+
settle({});
|
|
172
|
+
};
|
|
117
173
|
const timer = setTimeout(() => {
|
|
118
174
|
// eslint-disable-next-line no-console
|
|
119
175
|
console.warn(`[plugin-hook] ${spec.pluginKey} ${ctx.eventName} timed out after ${timeoutMs}ms`);
|
|
@@ -121,6 +177,9 @@ export async function runPluginCommandHook(spec, ctx) {
|
|
|
121
177
|
killChildTree(child, 1000);
|
|
122
178
|
settle({});
|
|
123
179
|
}, timeoutMs);
|
|
180
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
181
|
+
if (signal?.aborted)
|
|
182
|
+
onAbort();
|
|
124
183
|
child.stdout?.on("data", (chunk) => {
|
|
125
184
|
stdoutBytes += chunk.length;
|
|
126
185
|
if (stdoutBytes > MAX_HOOK_OUTPUT_BYTES) {
|
|
@@ -150,21 +209,29 @@ export async function runPluginCommandHook(spec, ctx) {
|
|
|
150
209
|
console.error(`[plugin-hook] ${spec.pluginKey} ${ctx.eventName} spawn error:`, err.message);
|
|
151
210
|
settle({});
|
|
152
211
|
});
|
|
153
|
-
|
|
154
|
-
|
|
212
|
+
let stdinFinished = false;
|
|
213
|
+
let pendingClose;
|
|
214
|
+
const handleClose = (code) => {
|
|
155
215
|
if (stdoutCapped) {
|
|
156
216
|
// eslint-disable-next-line no-console
|
|
157
217
|
console.error(`[plugin-hook] ${spec.pluginKey} ${ctx.eventName} killed due to oversized stdout (> ${MAX_HOOK_OUTPUT_BYTES} bytes)`);
|
|
158
218
|
settle({});
|
|
159
219
|
return;
|
|
160
220
|
}
|
|
221
|
+
const trimmed = stdout.trim();
|
|
222
|
+
const parsedForDecision = parseJson(trimmed);
|
|
223
|
+
const explicitDenial = extractExplicitDenial(parsedForDecision);
|
|
224
|
+
if (code === 2 || explicitDenial) {
|
|
225
|
+
const message = stderr.trim() || explicitDenial?.message || "Plugin denied this tool operation";
|
|
226
|
+
settle({ decision: "deny", messages: [message] });
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
161
229
|
if (code !== 0) {
|
|
162
230
|
// eslint-disable-next-line no-console
|
|
163
231
|
console.warn(`[plugin-hook] ${spec.pluginKey} ${ctx.eventName} exited ${code}; stderr:`, stderr.slice(0, 500));
|
|
164
232
|
settle({});
|
|
165
233
|
return;
|
|
166
234
|
}
|
|
167
|
-
const trimmed = stdout.trim();
|
|
168
235
|
if (trimmed.length === 0) {
|
|
169
236
|
settle({});
|
|
170
237
|
return;
|
|
@@ -185,16 +252,64 @@ export async function runPluginCommandHook(spec, ctx) {
|
|
|
185
252
|
return;
|
|
186
253
|
}
|
|
187
254
|
settle({ messages: [additional] });
|
|
255
|
+
};
|
|
256
|
+
child.on("close", (code) => {
|
|
257
|
+
clearTimeout(timer);
|
|
258
|
+
if (settled)
|
|
259
|
+
return;
|
|
260
|
+
if (!stdinFinished && !stdoutCapped) {
|
|
261
|
+
pendingClose = { code };
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
handleClose(code);
|
|
188
265
|
});
|
|
266
|
+
const finishStdin = () => {
|
|
267
|
+
stdinFinished = true;
|
|
268
|
+
if (pendingClose && !settled) {
|
|
269
|
+
const { code } = pendingClose;
|
|
270
|
+
pendingClose = undefined;
|
|
271
|
+
handleClose(code);
|
|
272
|
+
}
|
|
273
|
+
};
|
|
189
274
|
// Stdin envelope: matches the shape codeshell-native shell hooks use.
|
|
190
|
-
|
|
191
|
-
// keeps the protocol open for plugin authors who want it.
|
|
275
|
+
let envelope;
|
|
192
276
|
try {
|
|
193
|
-
|
|
194
|
-
child.stdin?.end();
|
|
277
|
+
envelope = JSON.stringify({ eventName: ctx.eventName, data: ctx.data });
|
|
195
278
|
}
|
|
196
279
|
catch {
|
|
197
|
-
|
|
280
|
+
closeHookStdin(child.stdin);
|
|
281
|
+
finishStdin();
|
|
282
|
+
return;
|
|
198
283
|
}
|
|
284
|
+
if (Buffer.byteLength(envelope, "utf8") > MAX_HOOK_STDIN_BYTES) {
|
|
285
|
+
// eslint-disable-next-line no-console
|
|
286
|
+
console.warn(`[plugin-hook] ${spec.pluginKey} ${ctx.eventName} stdin exceeded ${MAX_HOOK_STDIN_BYTES} bytes; running without envelope`);
|
|
287
|
+
closeHookStdin(child.stdin);
|
|
288
|
+
finishStdin();
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
setImmediate(() => {
|
|
292
|
+
void (async () => {
|
|
293
|
+
if (settled)
|
|
294
|
+
return;
|
|
295
|
+
try {
|
|
296
|
+
await writeHookStdin(child.stdin, envelope);
|
|
297
|
+
finishStdin();
|
|
298
|
+
}
|
|
299
|
+
catch (error) {
|
|
300
|
+
clearTimeout(timer);
|
|
301
|
+
const err = error;
|
|
302
|
+
const failure = {
|
|
303
|
+
type: "stdin_error",
|
|
304
|
+
code: typeof err?.code === "string" ? err.code : "UNKNOWN",
|
|
305
|
+
message: err instanceof Error ? err.message : String(error),
|
|
306
|
+
};
|
|
307
|
+
// eslint-disable-next-line no-console
|
|
308
|
+
console.error(`[plugin-hook] ${spec.pluginKey} ${ctx.eventName} stdin error:`, failure.message);
|
|
309
|
+
killChildTree(child, 1000);
|
|
310
|
+
settle({ data: { hookFailure: failure } });
|
|
311
|
+
}
|
|
312
|
+
})();
|
|
313
|
+
});
|
|
199
314
|
});
|
|
200
315
|
}
|
|
@@ -21,5 +21,24 @@ export interface PluginCommand {
|
|
|
21
21
|
/** Absolute path to the .md file. */
|
|
22
22
|
filePath: string;
|
|
23
23
|
}
|
|
24
|
+
export interface PluginCommandDescriptor {
|
|
25
|
+
name: string;
|
|
26
|
+
pluginName: string;
|
|
27
|
+
description: string;
|
|
28
|
+
argumentHint?: string;
|
|
29
|
+
}
|
|
30
|
+
/** Bounded prompt contribution limits shared by Desktop, TUI, and protocol hosts. */
|
|
31
|
+
export declare const MAX_PLUGIN_COMMAND_FILE_BYTES: number;
|
|
32
|
+
export declare const MAX_PLUGIN_COMMAND_ARGUMENT_CHARS: number;
|
|
33
|
+
export declare const MAX_PLUGIN_COMMAND_EXPANDED_CHARS: number;
|
|
24
34
|
export declare function scanPluginCommands(): PluginCommand[];
|
|
25
35
|
export declare function invalidatePluginCommandsCache(): void;
|
|
36
|
+
export declare function describePluginCommands(commands: readonly Pick<PluginCommand, "name" | "pluginName" | "description" | "argumentHint">[], disabledPluginNames?: ReadonlySet<string>): PluginCommandDescriptor[];
|
|
37
|
+
/**
|
|
38
|
+
* Expand CC/CodeShell and deprecated Codex custom-prompt placeholders.
|
|
39
|
+
*
|
|
40
|
+
* Codex plugins in the wild still ship `prompts/*.md`, so compatibility needs
|
|
41
|
+
* `$1`…`$9`, named `KEY=value` placeholders, `$ARGUMENTS`, and `$$` literals
|
|
42
|
+
* even though new upstream workflows are expected to use skills.
|
|
43
|
+
*/
|
|
44
|
+
export declare function expandPluginCommandBody(body: string, rawArguments?: string): string;
|
|
@@ -5,12 +5,16 @@
|
|
|
5
5
|
* MVP subset (single-level commands directory, no nested subcommands,
|
|
6
6
|
* no inline-via-plugin.json commands).
|
|
7
7
|
*/
|
|
8
|
-
import { existsSync, readdirSync,
|
|
9
|
-
import { join } from "node:path";
|
|
8
|
+
import { closeSync, constants, existsSync, fstatSync, openSync, readdirSync, readSync, realpathSync, statSync, } from "node:fs";
|
|
9
|
+
import { isAbsolute, join, relative, sep } from "node:path";
|
|
10
10
|
import { homedir } from "node:os";
|
|
11
11
|
import { memoize } from "../utils/memoize.js";
|
|
12
12
|
import { parseFrontmatter, coerceDescription } from "../skills/frontmatter.js";
|
|
13
13
|
import { installedPluginsPath, readInstalledPlugins } from "./installedPlugins.js";
|
|
14
|
+
/** Bounded prompt contribution limits shared by Desktop, TUI, and protocol hosts. */
|
|
15
|
+
export const MAX_PLUGIN_COMMAND_FILE_BYTES = 256 * 1024;
|
|
16
|
+
export const MAX_PLUGIN_COMMAND_ARGUMENT_CHARS = 32 * 1024;
|
|
17
|
+
export const MAX_PLUGIN_COMMAND_EXPANDED_CHARS = 512 * 1024;
|
|
14
18
|
function isENOENT(e) {
|
|
15
19
|
return (typeof e === "object" && e !== null && "code" in e && e.code === "ENOENT");
|
|
16
20
|
}
|
|
@@ -18,14 +22,34 @@ function isInaccessible(e) {
|
|
|
18
22
|
if (typeof e !== "object" || e === null || !("code" in e))
|
|
19
23
|
return false;
|
|
20
24
|
const code = e.code;
|
|
21
|
-
return code === "EACCES" || code === "EPERM" || code === "EIO";
|
|
25
|
+
return code === "EACCES" || code === "EPERM" || code === "EIO" || code === "ELOOP";
|
|
22
26
|
}
|
|
23
27
|
function userHome() {
|
|
24
28
|
return process.env.HOME ?? homedir();
|
|
25
29
|
}
|
|
26
30
|
function readCommandFile(filePath) {
|
|
31
|
+
let fd;
|
|
27
32
|
try {
|
|
28
|
-
|
|
33
|
+
fd = openSync(filePath, constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
34
|
+
const stat = fstatSync(fd);
|
|
35
|
+
if (!stat.isFile() || stat.size > MAX_PLUGIN_COMMAND_FILE_BYTES)
|
|
36
|
+
return null;
|
|
37
|
+
const chunks = [];
|
|
38
|
+
let total = 0;
|
|
39
|
+
while (true) {
|
|
40
|
+
const remaining = MAX_PLUGIN_COMMAND_FILE_BYTES + 1 - total;
|
|
41
|
+
if (remaining <= 0)
|
|
42
|
+
return null;
|
|
43
|
+
const chunk = Buffer.allocUnsafe(Math.min(64 * 1024, remaining));
|
|
44
|
+
const bytesRead = readSync(fd, chunk, 0, chunk.length, null);
|
|
45
|
+
if (bytesRead === 0)
|
|
46
|
+
break;
|
|
47
|
+
total += bytesRead;
|
|
48
|
+
if (total > MAX_PLUGIN_COMMAND_FILE_BYTES)
|
|
49
|
+
return null;
|
|
50
|
+
chunks.push(chunk.subarray(0, bytesRead));
|
|
51
|
+
}
|
|
52
|
+
return Buffer.concat(chunks, total).toString("utf-8");
|
|
29
53
|
}
|
|
30
54
|
catch (e) {
|
|
31
55
|
if (isENOENT(e))
|
|
@@ -37,6 +61,29 @@ function readCommandFile(filePath) {
|
|
|
37
61
|
}
|
|
38
62
|
throw e;
|
|
39
63
|
}
|
|
64
|
+
finally {
|
|
65
|
+
if (fd !== undefined)
|
|
66
|
+
closeSync(fd);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Resolve a plugin contribution through symlinks and require it to remain
|
|
71
|
+
* inside its declared owner directory. Installed plugin trees are untrusted:
|
|
72
|
+
* without this check `commands -> /some/private/dir` or `command.md` symlinks
|
|
73
|
+
* could make the host read arbitrary local Markdown and expose it as a prompt.
|
|
74
|
+
*/
|
|
75
|
+
function resolveContainedPath(root, candidate) {
|
|
76
|
+
try {
|
|
77
|
+
const realRoot = realpathSync(root);
|
|
78
|
+
const realCandidate = realpathSync(candidate);
|
|
79
|
+
const rel = relative(realRoot, realCandidate);
|
|
80
|
+
if (rel === ".." || rel.startsWith(`..${sep}`) || isAbsolute(rel))
|
|
81
|
+
return null;
|
|
82
|
+
return realCandidate;
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
40
87
|
}
|
|
41
88
|
function scanOnce() {
|
|
42
89
|
const data = readInstalledPlugins();
|
|
@@ -51,14 +98,17 @@ function scanOnce() {
|
|
|
51
98
|
const commandsDir = join(entry.installPath, "commands");
|
|
52
99
|
if (!existsSync(commandsDir))
|
|
53
100
|
continue;
|
|
101
|
+
const resolvedCommandsDir = resolveContainedPath(entry.installPath, commandsDir);
|
|
102
|
+
if (!resolvedCommandsDir)
|
|
103
|
+
continue;
|
|
54
104
|
let dirEntries;
|
|
55
105
|
try {
|
|
56
|
-
dirEntries = readdirSync(
|
|
106
|
+
dirEntries = readdirSync(resolvedCommandsDir, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name));
|
|
57
107
|
}
|
|
58
108
|
catch (e) {
|
|
59
109
|
if (isInaccessible(e)) {
|
|
60
110
|
// eslint-disable-next-line no-console
|
|
61
|
-
console.warn(`[plugin-commands] cannot read ${
|
|
111
|
+
console.warn(`[plugin-commands] cannot read ${resolvedCommandsDir}: ${e.message}`);
|
|
62
112
|
continue;
|
|
63
113
|
}
|
|
64
114
|
throw e;
|
|
@@ -68,7 +118,17 @@ function scanOnce() {
|
|
|
68
118
|
continue;
|
|
69
119
|
if (!dirent.name.endsWith(".md"))
|
|
70
120
|
continue;
|
|
71
|
-
const filePath = join(
|
|
121
|
+
const filePath = resolveContainedPath(resolvedCommandsDir, join(resolvedCommandsDir, dirent.name));
|
|
122
|
+
if (!filePath)
|
|
123
|
+
continue;
|
|
124
|
+
try {
|
|
125
|
+
const fileStat = statSync(filePath);
|
|
126
|
+
if (!fileStat.isFile() || fileStat.size > MAX_PLUGIN_COMMAND_FILE_BYTES)
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
72
132
|
const raw = readCommandFile(filePath);
|
|
73
133
|
if (raw === null)
|
|
74
134
|
continue;
|
|
@@ -112,3 +172,117 @@ export function scanPluginCommands() {
|
|
|
112
172
|
export function invalidatePluginCommandsCache() {
|
|
113
173
|
memoized.cache.clear?.();
|
|
114
174
|
}
|
|
175
|
+
function parsePluginCommandArguments(input) {
|
|
176
|
+
const tokens = [];
|
|
177
|
+
let current = "";
|
|
178
|
+
let quote = null;
|
|
179
|
+
let escaping = false;
|
|
180
|
+
const push = () => {
|
|
181
|
+
if (current.length === 0)
|
|
182
|
+
return;
|
|
183
|
+
tokens.push(current);
|
|
184
|
+
current = "";
|
|
185
|
+
};
|
|
186
|
+
for (const character of input.trim()) {
|
|
187
|
+
if (escaping) {
|
|
188
|
+
current += character;
|
|
189
|
+
escaping = false;
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
if (character === "\\" && quote !== "'") {
|
|
193
|
+
escaping = true;
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
if (quote) {
|
|
197
|
+
if (character === quote)
|
|
198
|
+
quote = null;
|
|
199
|
+
else
|
|
200
|
+
current += character;
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
if (character === "'" || character === '"') {
|
|
204
|
+
quote = character;
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
if (/\s/u.test(character)) {
|
|
208
|
+
push();
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
current += character;
|
|
212
|
+
}
|
|
213
|
+
if (escaping)
|
|
214
|
+
current += "\\";
|
|
215
|
+
push();
|
|
216
|
+
const positional = [];
|
|
217
|
+
const named = new Map();
|
|
218
|
+
for (const token of tokens) {
|
|
219
|
+
const assignment = /^([A-Z][A-Z0-9_]*)=(.*)$/u.exec(token);
|
|
220
|
+
if (assignment)
|
|
221
|
+
named.set(assignment[1], assignment[2]);
|
|
222
|
+
else
|
|
223
|
+
positional.push(token);
|
|
224
|
+
}
|
|
225
|
+
return { positional, named };
|
|
226
|
+
}
|
|
227
|
+
export function describePluginCommands(commands, disabledPluginNames = new Set()) {
|
|
228
|
+
return commands
|
|
229
|
+
.filter((command) => !disabledPluginNames.has(command.pluginName))
|
|
230
|
+
.map((command) => ({
|
|
231
|
+
name: command.name,
|
|
232
|
+
pluginName: command.pluginName,
|
|
233
|
+
description: command.description,
|
|
234
|
+
...(command.argumentHint ? { argumentHint: command.argumentHint } : {}),
|
|
235
|
+
}))
|
|
236
|
+
.sort((left, right) => left.name.localeCompare(right.name));
|
|
237
|
+
}
|
|
238
|
+
const PLUGIN_COMMAND_PLACEHOLDER = /\$\$|\$ARGUMENTS|\{args\}|\$([1-9])|\$([A-Z][A-Z0-9_]*)(?![A-Z0-9_])/gu;
|
|
239
|
+
function pluginCommandReplacement(token, positionalIndex, namedPlaceholder, rawArguments, parsed) {
|
|
240
|
+
if (token === "$$")
|
|
241
|
+
return "$";
|
|
242
|
+
if (token === "$ARGUMENTS" || token === "{args}")
|
|
243
|
+
return rawArguments;
|
|
244
|
+
if (positionalIndex)
|
|
245
|
+
return parsed.positional[Number(positionalIndex) - 1] ?? "";
|
|
246
|
+
if (namedPlaceholder && parsed.named.has(namedPlaceholder)) {
|
|
247
|
+
return parsed.named.get(namedPlaceholder);
|
|
248
|
+
}
|
|
249
|
+
return token;
|
|
250
|
+
}
|
|
251
|
+
function assertExpansionBudget(body, rawArguments, parsed) {
|
|
252
|
+
if (Buffer.byteLength(body, "utf-8") > MAX_PLUGIN_COMMAND_FILE_BYTES) {
|
|
253
|
+
throw new Error(`plugin command body exceeds ${MAX_PLUGIN_COMMAND_FILE_BYTES} bytes`);
|
|
254
|
+
}
|
|
255
|
+
if (rawArguments.length > MAX_PLUGIN_COMMAND_ARGUMENT_CHARS) {
|
|
256
|
+
throw new Error(`plugin command arguments exceed ${MAX_PLUGIN_COMMAND_ARGUMENT_CHARS} characters`);
|
|
257
|
+
}
|
|
258
|
+
let projected = body.length;
|
|
259
|
+
for (const match of body.matchAll(PLUGIN_COMMAND_PLACEHOLDER)) {
|
|
260
|
+
projected +=
|
|
261
|
+
pluginCommandReplacement(match[0], match[1], match[2], rawArguments, parsed).length -
|
|
262
|
+
match[0].length;
|
|
263
|
+
if (projected > MAX_PLUGIN_COMMAND_EXPANDED_CHARS)
|
|
264
|
+
break;
|
|
265
|
+
}
|
|
266
|
+
if (projected > MAX_PLUGIN_COMMAND_EXPANDED_CHARS) {
|
|
267
|
+
throw new Error(`expanded plugin command exceeds ${MAX_PLUGIN_COMMAND_EXPANDED_CHARS} characters`);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Expand CC/CodeShell and deprecated Codex custom-prompt placeholders.
|
|
272
|
+
*
|
|
273
|
+
* Codex plugins in the wild still ship `prompts/*.md`, so compatibility needs
|
|
274
|
+
* `$1`…`$9`, named `KEY=value` placeholders, `$ARGUMENTS`, and `$$` literals
|
|
275
|
+
* even though new upstream workflows are expected to use skills.
|
|
276
|
+
*/
|
|
277
|
+
export function expandPluginCommandBody(body, rawArguments = "") {
|
|
278
|
+
if (rawArguments.length > MAX_PLUGIN_COMMAND_ARGUMENT_CHARS) {
|
|
279
|
+
throw new Error(`plugin command arguments exceed ${MAX_PLUGIN_COMMAND_ARGUMENT_CHARS} characters`);
|
|
280
|
+
}
|
|
281
|
+
const parsed = parsePluginCommandArguments(rawArguments);
|
|
282
|
+
assertExpansionBudget(body, rawArguments, parsed);
|
|
283
|
+
const expanded = body.replace(PLUGIN_COMMAND_PLACEHOLDER, (token, positionalIndex, namedPlaceholder) => pluginCommandReplacement(token, positionalIndex, namedPlaceholder, rawArguments, parsed));
|
|
284
|
+
if (expanded.length > MAX_PLUGIN_COMMAND_EXPANDED_CHARS) {
|
|
285
|
+
throw new Error(`expanded plugin command exceeds ${MAX_PLUGIN_COMMAND_EXPANDED_CHARS} characters`);
|
|
286
|
+
}
|
|
287
|
+
return expanded;
|
|
288
|
+
}
|
|
@@ -6,6 +6,11 @@
|
|
|
6
6
|
* loaders use so the inventory can't drift from what actually loads.
|
|
7
7
|
*/
|
|
8
8
|
import { type PluginHookEntry } from "./loadPluginHooks.js";
|
|
9
|
+
import { type PluginHookReview } from "./pluginHookApproval.js";
|
|
10
|
+
import { type PluginAutomationTemplate } from "./installer/types.js";
|
|
11
|
+
export type PluginAutomationTemplateDescriptor = PluginAutomationTemplate & {
|
|
12
|
+
revision: string;
|
|
13
|
+
};
|
|
9
14
|
export interface PluginContentInventory {
|
|
10
15
|
/** skills/<name>/SKILL.md — name + frontmatter description when present. */
|
|
11
16
|
skills: {
|
|
@@ -18,8 +23,12 @@ export interface PluginContentInventory {
|
|
|
18
23
|
agents: string[];
|
|
19
24
|
/** hooks/hooks.json entries (event + command), owner-filtered. */
|
|
20
25
|
hooks: PluginHookEntry[];
|
|
26
|
+
/** Current hook definition compared with the last explicitly approved snapshot. */
|
|
27
|
+
hookReview?: PluginHookReview;
|
|
21
28
|
/** MCP server names as merged (keyed `<plugin>:<server>` — bare name here). */
|
|
22
29
|
mcpServers: string[];
|
|
30
|
+
/** Reusable scheduled-task templates; never instantiated automatically. */
|
|
31
|
+
automationTemplates: PluginAutomationTemplateDescriptor[];
|
|
23
32
|
}
|
|
24
33
|
/**
|
|
25
34
|
* Inventory one plugin's contributions. `pluginName` is the bare name (no
|
|
@@ -27,4 +36,4 @@ export interface PluginContentInventory {
|
|
|
27
36
|
* scanners the runtime loaders use (filtered to this plugin) so naming —
|
|
28
37
|
* e.g. MCP's `<plugin>:<server>` record keys — matches what users see live.
|
|
29
38
|
*/
|
|
30
|
-
export declare function describePluginContent(pluginName: string, installPath: string): PluginContentInventory;
|
|
39
|
+
export declare function describePluginContent(pluginName: string, installPath: string, installKey?: string): PluginContentInventory;
|