@cjhyy/code-shell-core 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +36 -23
- package/dist/agent/agent-definition-registry.d.ts +2 -2
- package/dist/agent/agent-definition-registry.js +47 -10
- package/dist/agent/agent-definition.d.ts +5 -0
- package/dist/agent/agent-definition.js +14 -0
- package/dist/automation/index.d.ts +7 -4
- package/dist/automation/index.js +4 -2
- package/dist/automation/runner.js +3 -1
- package/dist/automation/scheduler.d.ts +57 -1
- package/dist/automation/scheduler.js +123 -23
- package/dist/automation/store.d.ts +6 -2
- package/dist/automation/store.js +7 -3
- package/dist/capabilities/index.d.ts +109 -0
- package/dist/capabilities/index.js +80 -0
- package/dist/capability-control/disabled-lists.d.ts +2 -1
- package/dist/capability-control/disabled-lists.js +3 -5
- package/dist/capability-control/overlay.d.ts +14 -1
- package/dist/capability-control/overlay.js +40 -0
- package/dist/capability-control/service.js +6 -4
- package/dist/cli/agent-server-stdio.d.ts +1 -1
- package/dist/cli/agent-server-stdio.js +66 -6
- package/dist/cli/agent-server-tcp.js +20 -5
- package/dist/context/compaction.d.ts +39 -3
- package/dist/context/compaction.js +151 -39
- package/dist/context/manager.d.ts +20 -4
- package/dist/context/manager.js +42 -7
- package/dist/context/token-counter.js +5 -3
- package/dist/context/tool-result-storage.d.ts +6 -0
- package/dist/context/tool-result-storage.js +25 -4
- package/dist/credentials/access.d.ts +13 -2
- package/dist/credentials/access.js +99 -4
- package/dist/credentials/index.d.ts +3 -2
- package/dist/credentials/index.js +2 -1
- package/dist/credentials/oauth.d.ts +9 -1
- package/dist/credentials/oauth.js +80 -1
- package/dist/credentials/store.d.ts +16 -2
- package/dist/credentials/store.js +33 -11
- package/dist/credentials/types.d.ts +62 -1
- package/dist/credentials/types.js +16 -1
- package/dist/credentials/use-credential-tool.js +15 -1
- package/dist/engine/auxiliary-pipeline.d.ts +40 -0
- package/dist/engine/auxiliary-pipeline.js +181 -0
- package/dist/{settings → engine}/disk-defaults.d.ts +2 -2
- package/dist/{settings → engine}/disk-defaults.js +5 -2
- package/dist/engine/dynamic-tool-defs.d.ts +4 -0
- package/dist/engine/dynamic-tool-defs.js +4 -0
- package/dist/engine/engine.d.ts +272 -184
- package/dist/engine/engine.js +1869 -1864
- package/dist/engine/file-history-hook.d.ts +11 -0
- package/dist/engine/file-history-hook.js +31 -0
- package/dist/engine/goal-judge-context.d.ts +9 -0
- package/dist/engine/goal-judge-context.js +234 -0
- package/dist/engine/injected-context-cache.d.ts +6 -0
- package/dist/engine/injected-context-cache.js +13 -0
- package/dist/engine/input-attachments.d.ts +1 -1
- package/dist/engine/model-facade.d.ts +3 -3
- package/dist/engine/model-facade.js +15 -14
- package/dist/engine/permission-controller.d.ts +55 -0
- package/dist/engine/permission-controller.js +148 -0
- package/dist/engine/prompt-cache-diagnostics.d.ts +58 -0
- package/dist/engine/prompt-cache-diagnostics.js +178 -0
- package/dist/engine/run-accounting.d.ts +41 -0
- package/dist/engine/run-accounting.js +126 -0
- package/dist/engine/run-context.d.ts +44 -0
- package/dist/engine/run-context.js +88 -0
- package/dist/engine/run-environment.d.ts +30 -0
- package/dist/engine/run-environment.js +77 -0
- package/dist/engine/run-finalize.d.ts +58 -0
- package/dist/engine/run-finalize.js +245 -0
- package/dist/engine/run-goal.d.ts +58 -0
- package/dist/engine/run-goal.js +188 -0
- package/dist/engine/run-image-input.d.ts +1 -1
- package/dist/engine/run-image-input.js +5 -3
- package/dist/engine/run-session-open.d.ts +41 -0
- package/dist/engine/run-session-open.js +186 -0
- package/dist/engine/run-setup.d.ts +42 -0
- package/dist/engine/run-setup.js +58 -0
- package/dist/engine/run-tooling.d.ts +125 -0
- package/dist/engine/run-tooling.js +283 -0
- package/dist/engine/run-types.d.ts +139 -0
- package/dist/engine/run-types.js +12 -0
- package/dist/engine/run-workspace.d.ts +50 -0
- package/dist/engine/run-workspace.js +114 -0
- package/dist/engine/session-title.d.ts +2 -1
- package/dist/engine/session-title.js +4 -1
- package/dist/engine/steer-queue.d.ts +1 -1
- package/dist/engine/subagent-spawner.d.ts +32 -0
- package/dist/engine/subagent-spawner.js +287 -0
- package/dist/engine/tool-summary.d.ts +2 -2
- package/dist/engine/tool-summary.js +2 -2
- package/dist/engine/turn-loop.d.ts +67 -10
- package/dist/engine/turn-loop.js +538 -97
- package/dist/engine/types.d.ts +35 -4
- package/dist/engine/types.js +1 -1
- package/dist/{engine/goal.d.ts → goal/lifecycle.d.ts} +80 -6
- package/dist/goal/lifecycle.js +482 -0
- package/dist/hooks/events.d.ts +26 -9
- package/dist/hooks/events.js +0 -3
- package/dist/hooks/goal-stop-hook.d.ts +28 -29
- package/dist/hooks/goal-stop-hook.js +344 -144
- package/dist/hooks/registry.js +4 -1
- package/dist/hooks/shell-runner.d.ts +12 -1
- package/dist/hooks/shell-runner.js +160 -9
- package/dist/index.d.ts +51 -110
- package/dist/index.extension.d.ts +51 -0
- package/dist/index.extension.js +39 -0
- package/dist/index.internal.d.ts +86 -0
- package/dist/index.internal.js +92 -0
- package/dist/index.js +37 -125
- package/dist/links/cli.d.ts +48 -0
- package/dist/links/cli.js +617 -0
- package/dist/links/http.d.ts +40 -0
- package/dist/links/http.js +166 -0
- package/dist/links/index.d.ts +4 -0
- package/dist/links/index.js +3 -0
- package/dist/links/link-action-tool.d.ts +5 -0
- package/dist/links/link-action-tool.js +241 -0
- package/dist/links/providers.d.ts +8 -0
- package/dist/links/providers.js +665 -0
- package/dist/links/types.d.ts +44 -0
- package/dist/llm/client-base.d.ts +7 -0
- package/dist/llm/client-base.js +72 -10
- package/dist/llm/model-pool.d.ts +1 -1
- package/dist/llm/model-pool.js +1 -1
- package/dist/llm/providers/anthropic.d.ts +1 -0
- package/dist/llm/providers/anthropic.js +9 -0
- package/dist/llm/providers/openai.d.ts +1 -0
- package/dist/llm/providers/openai.js +17 -0
- package/dist/llm/types.d.ts +12 -5
- package/dist/model-catalog/index.js +15 -2
- package/dist/model-catalog/resolve.d.ts +13 -1
- package/dist/model-catalog/resolve.js +37 -2
- package/dist/model-catalog/types.d.ts +74 -48
- package/dist/model-catalog/types.js +16 -5
- package/dist/model-catalog/upsert.d.ts +3 -1
- package/dist/model-catalog/upsert.js +9 -0
- package/dist/onboarding.d.ts +0 -1
- package/dist/onboarding.js +1 -22
- package/dist/panel-apps/bindings.d.ts +24 -0
- package/dist/panel-apps/bindings.js +69 -0
- package/dist/panel-apps/github-archive.d.ts +21 -0
- package/dist/panel-apps/github-archive.js +98 -0
- package/dist/panel-apps/index.d.ts +4 -0
- package/dist/panel-apps/index.js +4 -0
- package/dist/panel-apps/installer.d.ts +68 -0
- package/dist/panel-apps/installer.js +622 -0
- package/dist/panel-apps/manifest.d.ts +364 -0
- package/dist/panel-apps/manifest.js +189 -0
- package/dist/panel-apps/paths.d.ts +13 -0
- package/dist/panel-apps/paths.js +38 -0
- package/dist/panel-apps/registry.d.ts +51 -0
- package/dist/panel-apps/registry.js +99 -0
- package/dist/panel-apps/runtime.d.ts +80 -0
- package/dist/panel-apps/runtime.js +154 -0
- package/dist/plugins/gitOps.js +8 -1
- package/dist/plugins/installedPlugins.d.ts +2 -1
- package/dist/plugins/installedPlugins.js +146 -8
- package/dist/plugins/installer/codex/convertAgents.d.ts +4 -1
- package/dist/plugins/installer/codex/convertAgents.js +62 -8
- package/dist/plugins/installer/codex/convertCommands.d.ts +5 -5
- package/dist/plugins/installer/codex/convertCommands.js +35 -12
- package/dist/plugins/installer/codex/convertHooks.d.ts +10 -0
- package/dist/plugins/installer/codex/convertHooks.js +82 -0
- package/dist/plugins/installer/codex/convertSkills.js +41 -6
- package/dist/plugins/installer/install.d.ts +7 -1
- package/dist/plugins/installer/install.js +21 -87
- package/dist/plugins/installer/installFromArchive.d.ts +26 -4
- package/dist/plugins/installer/installFromArchive.js +44 -27
- package/dist/plugins/installer/installFromNpm.d.ts +31 -0
- package/dist/plugins/installer/installFromNpm.js +273 -0
- package/dist/plugins/installer/loadPluginAgents.js +17 -4
- package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
- package/dist/plugins/installer/loadPluginMcp.js +245 -35
- package/dist/plugins/installer/normalizeManifest.d.ts +13 -0
- package/dist/plugins/installer/normalizeManifest.js +306 -0
- package/dist/plugins/installer/npmTar.d.ts +13 -0
- package/dist/plugins/installer/npmTar.js +321 -0
- package/dist/plugins/installer/parseSource.d.ts +11 -0
- package/dist/plugins/installer/parseSource.js +48 -0
- package/dist/plugins/installer/preview.d.ts +101 -0
- package/dist/plugins/installer/preview.js +336 -0
- package/dist/plugins/installer/projectPluginSource.d.ts +14 -0
- package/dist/plugins/installer/projectPluginSource.js +140 -0
- package/dist/plugins/installer/types.d.ts +775 -0
- package/dist/plugins/installer/types.js +100 -0
- package/dist/plugins/installer/unzip.d.ts +11 -0
- package/dist/plugins/installer/unzip.js +123 -9
- package/dist/plugins/installer/update.d.ts +2 -2
- package/dist/plugins/installer/update.js +43 -4
- package/dist/plugins/loadPluginHooks.d.ts +19 -2
- package/dist/plugins/loadPluginHooks.js +97 -86
- package/dist/plugins/pluginAutomationTemplates.d.ts +18 -0
- package/dist/plugins/pluginAutomationTemplates.js +50 -0
- package/dist/plugins/pluginCatalog.d.ts +45 -0
- package/dist/plugins/pluginCatalog.js +87 -0
- package/dist/plugins/pluginCommandHook.d.ts +10 -4
- package/dist/plugins/pluginCommandHook.js +133 -18
- package/dist/plugins/pluginCommandsLoader.d.ts +19 -0
- package/dist/plugins/pluginCommandsLoader.js +181 -7
- package/dist/plugins/pluginContent.d.ts +10 -1
- package/dist/plugins/pluginContent.js +87 -30
- package/dist/plugins/pluginHookApproval.d.ts +30 -0
- package/dist/plugins/pluginHookApproval.js +160 -0
- package/dist/plugins/pluginHookIntegrity.d.ts +69 -0
- package/dist/plugins/pluginHookIntegrity.js +361 -0
- package/dist/plugins/pluginInstaller.js +71 -12
- package/dist/plugins/pluginMcpApproval.d.ts +19 -0
- package/dist/plugins/pluginMcpApproval.js +110 -0
- package/dist/plugins/pluginMcpIntegrity.d.ts +21 -0
- package/dist/plugins/pluginMcpIntegrity.js +74 -0
- package/dist/plugins/types.d.ts +30 -0
- package/dist/plugins/varRewrite.d.ts +9 -5
- package/dist/plugins/varRewrite.js +26 -17
- package/dist/preset/index.d.ts +11 -8
- package/dist/preset/index.js +62 -203
- package/dist/product/define.js +9 -3
- package/dist/product/types.d.ts +0 -2
- package/dist/profile/activation.d.ts +36 -0
- package/dist/profile/activation.js +57 -0
- package/dist/profile/catalog-store.d.ts +77 -0
- package/dist/profile/catalog-store.js +346 -0
- package/dist/profile/catalog.d.ts +54 -0
- package/dist/profile/catalog.js +152 -0
- package/dist/profile/index.d.ts +7 -0
- package/dist/profile/index.js +7 -0
- package/dist/profile/requirements.d.ts +76 -0
- package/dist/profile/requirements.js +117 -0
- package/dist/profile/resolve.d.ts +11 -0
- package/dist/profile/resolve.js +41 -0
- package/dist/profile/store.d.ts +17 -0
- package/dist/profile/store.js +167 -0
- package/dist/profile/types.d.ts +321 -0
- package/dist/profile/types.js +104 -0
- package/dist/prompt/composer.d.ts +46 -7
- package/dist/prompt/composer.js +78 -48
- package/dist/prompt/instruction-scanner.d.ts +6 -5
- package/dist/prompt/instruction-scanner.js +8 -23
- package/dist/prompt/section-loader.d.ts +2 -2
- package/dist/prompt/section-loader.js +7 -4
- package/dist/prompt/sections/browser.md +10 -9
- package/dist/prompt/sections/harness-base.md +9 -0
- package/dist/protocol/chat-session-manager.d.ts +77 -3
- package/dist/protocol/chat-session-manager.js +194 -18
- package/dist/protocol/chat-session.d.ts +72 -9
- package/dist/protocol/chat-session.js +151 -16
- package/dist/protocol/client.d.ts +37 -4
- package/dist/protocol/client.js +118 -6
- package/dist/protocol/index.d.ts +2 -2
- package/dist/protocol/index.js +2 -2
- package/dist/protocol/mobile-remote-types.d.ts +406 -0
- package/dist/protocol/mobile-remote-types.js +1 -0
- package/dist/protocol/server.d.ts +152 -14
- package/dist/protocol/server.js +1574 -229
- package/dist/protocol/types.d.ts +182 -32
- package/dist/protocol/types.js +18 -0
- package/dist/run/ArtifactTracker.d.ts +6 -1
- package/dist/run/ArtifactTracker.js +29 -21
- package/dist/run/EngineRunner.d.ts +2 -0
- package/dist/run/EngineRunner.js +1 -0
- package/dist/run/RunManager.d.ts +26 -0
- package/dist/run/RunManager.js +82 -11
- package/dist/run/factory.d.ts +3 -0
- package/dist/run/factory.js +2 -0
- package/dist/runtime/safe-spawn.d.ts +6 -0
- package/dist/runtime/safe-spawn.js +8 -13
- package/dist/services/auto-dream.d.ts +13 -1
- package/dist/services/auto-dream.js +56 -8
- package/dist/services/dream-consolidation.d.ts +3 -0
- package/dist/services/dream-consolidation.js +14 -2
- package/dist/services/index.d.ts +1 -1
- package/dist/services/index.js +1 -1
- package/dist/services/memory-orchestrator.js +6 -2
- package/dist/services/oauth.d.ts +34 -10
- package/dist/services/oauth.js +236 -98
- package/dist/services/session-memory.d.ts +4 -4
- package/dist/services/session-memory.js +13 -10
- package/dist/session/memory.d.ts +26 -7
- package/dist/session/memory.js +79 -21
- package/dist/session/session-manager.d.ts +208 -25
- package/dist/session/session-manager.js +1232 -116
- package/dist/session/session-message.d.ts +22 -0
- package/dist/session/session-message.js +1 -0
- package/dist/session/transcript.d.ts +76 -6
- package/dist/session/transcript.js +278 -7
- package/dist/settings/feature-flags.d.ts +40 -0
- package/dist/settings/feature-flags.js +40 -0
- package/dist/settings/manager.d.ts +39 -1
- package/dist/settings/manager.js +102 -41
- package/dist/settings/migrate-config.js +4 -2
- package/dist/settings/schema.d.ts +511 -177
- package/dist/settings/schema.js +98 -25
- package/dist/skills/scanner.d.ts +6 -2
- package/dist/skills/scanner.js +160 -9
- package/dist/sources/adapter.d.ts +14 -0
- package/dist/sources/adapter.js +7 -0
- package/dist/sources/adapters/local-files.d.ts +10 -0
- package/dist/sources/adapters/local-files.js +127 -0
- package/dist/sources/adapters/mcp-resource.d.ts +17 -0
- package/dist/sources/adapters/mcp-resource.js +41 -0
- package/dist/sources/adapters/mock.d.ts +3 -0
- package/dist/sources/adapters/mock.js +29 -0
- package/dist/sources/binding.d.ts +6 -0
- package/dist/sources/binding.js +24 -0
- package/dist/sources/catalog.d.ts +6 -0
- package/dist/sources/catalog.js +64 -0
- package/dist/sources/context-summary.d.ts +8 -0
- package/dist/sources/context-summary.js +13 -0
- package/dist/sources/credential-status.d.ts +2 -0
- package/dist/sources/credential-status.js +13 -0
- package/dist/sources/index.d.ts +10 -0
- package/dist/sources/index.js +10 -0
- package/dist/sources/resolve.d.ts +28 -0
- package/dist/sources/resolve.js +47 -0
- package/dist/sources/truncate-utf8.d.ts +7 -0
- package/dist/sources/truncate-utf8.js +18 -0
- package/dist/sources/types.d.ts +71 -0
- package/dist/sources/types.js +26 -0
- package/dist/testing/fetch-stub.d.ts +32 -0
- package/dist/testing/fetch-stub.js +24 -0
- package/dist/themes/image.d.ts +18 -0
- package/dist/themes/image.js +117 -0
- package/dist/themes/index.d.ts +4 -0
- package/dist/themes/index.js +4 -0
- package/dist/themes/installer.d.ts +50 -0
- package/dist/themes/installer.js +290 -0
- package/dist/themes/manifest.d.ts +102 -0
- package/dist/themes/manifest.js +86 -0
- package/dist/themes/paths.d.ts +14 -0
- package/dist/themes/paths.js +33 -0
- package/dist/tool-system/browser-bridge.d.ts +53 -11
- package/dist/tool-system/browser-bridge.js +8 -9
- package/dist/tool-system/builtin/agent-heartbeat.d.ts +2 -2
- package/dist/tool-system/builtin/agent-heartbeat.js +20 -6
- package/dist/tool-system/builtin/agent-notifications.d.ts +127 -72
- package/dist/tool-system/builtin/agent-notifications.js +291 -101
- package/dist/tool-system/builtin/agent-output-file.js +1 -3
- package/dist/tool-system/builtin/agent-progress.d.ts +6 -0
- package/dist/tool-system/builtin/agent-progress.js +83 -0
- package/dist/tool-system/builtin/agent-registry.d.ts +38 -2
- package/dist/tool-system/builtin/agent-registry.js +178 -9
- package/dist/tool-system/builtin/agent-transcript-translator.js +1 -1
- package/dist/tool-system/builtin/agent.d.ts +2 -0
- package/dist/tool-system/builtin/agent.js +279 -34
- package/dist/tool-system/builtin/background-jobs.d.ts +63 -7
- package/dist/tool-system/builtin/background-jobs.js +111 -15
- package/dist/tool-system/builtin/background-work.d.ts +12 -1
- package/dist/tool-system/builtin/background-work.js +12 -1
- package/dist/tool-system/builtin/bash.d.ts +3 -5
- package/dist/tool-system/builtin/bash.js +14 -6
- package/dist/tool-system/builtin/browser-tools.d.ts +8 -5
- package/dist/tool-system/builtin/browser-tools.js +89 -23
- package/dist/tool-system/builtin/edit-model-catalog.d.ts +6 -0
- package/dist/tool-system/builtin/edit-model-catalog.js +172 -12
- package/dist/tool-system/builtin/edit.d.ts +2 -1
- package/dist/tool-system/builtin/edit.js +14 -10
- package/dist/tool-system/builtin/file-cache.d.ts +2 -0
- package/dist/tool-system/builtin/file-cache.js +4 -0
- package/dist/tool-system/builtin/generate-image.js +17 -10
- package/dist/tool-system/builtin/generate-video.d.ts +4 -0
- package/dist/tool-system/builtin/generate-video.js +164 -28
- package/dist/tool-system/builtin/glob.d.ts +2 -1
- package/dist/tool-system/builtin/glob.js +28 -3
- package/dist/tool-system/builtin/grep.d.ts +1 -0
- package/dist/tool-system/builtin/grep.js +82 -17
- package/dist/tool-system/builtin/image-uploader.js +7 -1
- package/dist/tool-system/builtin/index.d.ts +57 -18
- package/dist/tool-system/builtin/index.js +280 -167
- package/dist/tool-system/builtin/memory.d.ts +6 -0
- package/dist/tool-system/builtin/memory.js +36 -15
- package/dist/tool-system/builtin/panel.d.ts +9 -0
- package/dist/tool-system/builtin/panel.js +314 -0
- package/dist/tool-system/builtin/read.js +5 -1
- package/dist/tool-system/builtin/send-message-to-session.d.ts +6 -0
- package/dist/tool-system/builtin/send-message-to-session.js +67 -0
- package/dist/tool-system/builtin/sources.d.ts +8 -0
- package/dist/tool-system/builtin/sources.js +137 -0
- package/dist/tool-system/builtin/tool-search.js +7 -2
- package/dist/tool-system/builtin/update-automation-memory.js +2 -0
- package/dist/tool-system/builtin/video-providers.d.ts +12 -15
- package/dist/tool-system/builtin/video-providers.js +1 -0
- package/dist/tool-system/builtin/view-image.d.ts +2 -2
- package/dist/tool-system/builtin/web-fetch.js +60 -15
- package/dist/tool-system/builtin/web-search.js +1 -3
- package/dist/tool-system/builtin/write.d.ts +2 -1
- package/dist/tool-system/builtin/write.js +14 -4
- package/dist/tool-system/capability-module.d.ts +93 -0
- package/dist/tool-system/capability-module.js +53 -0
- package/dist/tool-system/context.d.ts +94 -24
- package/dist/tool-system/executor.js +99 -58
- package/dist/tool-system/external-tool-exposure.d.ts +60 -0
- package/dist/tool-system/external-tool-exposure.js +304 -0
- package/dist/tool-system/mcp-manager.d.ts +17 -1
- package/dist/tool-system/mcp-manager.js +72 -7
- package/dist/tool-system/mcp-tool-policy.d.ts +9 -0
- package/dist/tool-system/mcp-tool-policy.js +34 -0
- package/dist/tool-system/panel-bridge.d.ts +53 -0
- package/dist/tool-system/panel-bridge.js +1 -0
- package/dist/tool-system/path-policy.d.ts +19 -0
- package/dist/tool-system/path-policy.js +62 -1
- package/dist/tool-system/permission.d.ts +69 -3
- package/dist/tool-system/permission.js +429 -30
- package/dist/tool-system/registry.d.ts +15 -3
- package/dist/tool-system/registry.js +82 -40
- package/dist/tool-system/sandbox/index.js +3 -8
- package/dist/tool-system/sandbox/seatbelt.js +2 -6
- package/dist/tool-system/session-tool-host.d.ts +139 -0
- package/dist/tool-system/session-tool-host.js +167 -0
- package/dist/tool-system/testing/tool-registry-harness.d.ts +31 -0
- package/dist/tool-system/testing/tool-registry-harness.js +51 -0
- package/dist/tool-system/validation.d.ts +14 -7
- package/dist/tool-system/validation.js +701 -7
- package/dist/types.d.ts +201 -20
- package/dist/{cc-orchestrator → utils}/cwd-normalize.d.ts +1 -0
- package/dist/{cc-orchestrator → utils}/cwd-normalize.js +1 -0
- package/dist/utils/file-mutex.d.ts +65 -0
- package/dist/utils/file-mutex.js +145 -0
- package/dist/utils/json.d.ts +2 -4
- package/dist/utils/json.js +2 -4
- package/dist/utils/lockfile.d.ts +30 -1
- package/dist/utils/lockfile.js +2 -2
- package/dist/utils/secret-scrubber.d.ts +8 -0
- package/dist/utils/secret-scrubber.js +227 -0
- package/dist/utils/toolDisplay.js +1 -1
- package/package.json +20 -5
- package/THIRD_PARTY_NOTICES.md +0 -206
- package/dist/arena/arena.d.ts +0 -43
- package/dist/arena/arena.js +0 -333
- package/dist/arena/context/context-tools.d.ts +0 -16
- package/dist/arena/context/context-tools.js +0 -272
- package/dist/arena/context/within-root.d.ts +0 -7
- package/dist/arena/context/within-root.js +0 -15
- package/dist/arena/detect-mode.d.ts +0 -20
- package/dist/arena/detect-mode.js +0 -78
- package/dist/arena/digest-builder.d.ts +0 -25
- package/dist/arena/digest-builder.js +0 -120
- package/dist/arena/index.d.ts +0 -29
- package/dist/arena/index.js +0 -29
- package/dist/arena/iterate/convergence.d.ts +0 -25
- package/dist/arena/iterate/convergence.js +0 -103
- package/dist/arena/iterate/formats/index.d.ts +0 -22
- package/dist/arena/iterate/formats/index.js +0 -283
- package/dist/arena/iterate/index.d.ts +0 -11
- package/dist/arena/iterate/index.js +0 -9
- package/dist/arena/iterate/iterative-arena.d.ts +0 -23
- package/dist/arena/iterate/iterative-arena.js +0 -237
- package/dist/arena/iterate/parse.d.ts +0 -42
- package/dist/arena/iterate/parse.js +0 -123
- package/dist/arena/iterate/phases/argue.d.ts +0 -22
- package/dist/arena/iterate/phases/argue.js +0 -165
- package/dist/arena/iterate/phases/revise.d.ts +0 -16
- package/dist/arena/iterate/phases/revise.js +0 -62
- package/dist/arena/iterate/phases/tournament.d.ts +0 -34
- package/dist/arena/iterate/phases/tournament.js +0 -113
- package/dist/arena/iterate/tools/web-tools.d.ts +0 -13
- package/dist/arena/iterate/tools/web-tools.js +0 -54
- package/dist/arena/iterate/types.d.ts +0 -152
- package/dist/arena/iterate/types.js +0 -8
- package/dist/arena/ledger.d.ts +0 -47
- package/dist/arena/ledger.js +0 -159
- package/dist/arena/lenses/architecture.d.ts +0 -5
- package/dist/arena/lenses/architecture.js +0 -22
- package/dist/arena/lenses/engineering.d.ts +0 -5
- package/dist/arena/lenses/engineering.js +0 -22
- package/dist/arena/lenses/general.d.ts +0 -5
- package/dist/arena/lenses/general.js +0 -20
- package/dist/arena/lenses/index.d.ts +0 -16
- package/dist/arena/lenses/index.js +0 -47
- package/dist/arena/lenses/product.d.ts +0 -5
- package/dist/arena/lenses/product.js +0 -22
- package/dist/arena/model-presets.d.ts +0 -23
- package/dist/arena/model-presets.js +0 -44
- package/dist/arena/phases/adjudication.d.ts +0 -24
- package/dist/arena/phases/adjudication.js +0 -141
- package/dist/arena/phases/build-consensus.d.ts +0 -29
- package/dist/arena/phases/build-consensus.js +0 -83
- package/dist/arena/phases/claim-registry.d.ts +0 -26
- package/dist/arena/phases/claim-registry.js +0 -60
- package/dist/arena/phases/cross-review.d.ts +0 -45
- package/dist/arena/phases/cross-review.js +0 -218
- package/dist/arena/phases/debate-rounds.d.ts +0 -27
- package/dist/arena/phases/debate-rounds.js +0 -159
- package/dist/arena/phases/participant-research.d.ts +0 -38
- package/dist/arena/phases/participant-research.js +0 -314
- package/dist/arena/phases/planning-detail-expansion.d.ts +0 -38
- package/dist/arena/phases/planning-detail-expansion.js +0 -119
- package/dist/arena/planner.d.ts +0 -27
- package/dist/arena/planner.js +0 -311
- package/dist/arena/providers/docs.d.ts +0 -7
- package/dist/arena/providers/docs.js +0 -111
- package/dist/arena/providers/git.d.ts +0 -8
- package/dist/arena/providers/git.js +0 -174
- package/dist/arena/providers/index.d.ts +0 -32
- package/dist/arena/providers/index.js +0 -132
- package/dist/arena/providers/none.d.ts +0 -7
- package/dist/arena/providers/none.js +0 -11
- package/dist/arena/providers/repo.d.ts +0 -7
- package/dist/arena/providers/repo.js +0 -258
- package/dist/arena/render/session.d.ts +0 -17
- package/dist/arena/render/session.js +0 -190
- package/dist/arena/render/terminal.d.ts +0 -34
- package/dist/arena/render/terminal.js +0 -286
- package/dist/arena/strategies/discussion.d.ts +0 -25
- package/dist/arena/strategies/discussion.js +0 -143
- package/dist/arena/strategies/index.d.ts +0 -15
- package/dist/arena/strategies/index.js +0 -28
- package/dist/arena/strategies/language-wrapper.d.ts +0 -17
- package/dist/arena/strategies/language-wrapper.js +0 -102
- package/dist/arena/strategies/lens-wrapper.d.ts +0 -16
- package/dist/arena/strategies/lens-wrapper.js +0 -236
- package/dist/arena/strategies/planning.d.ts +0 -30
- package/dist/arena/strategies/planning.js +0 -225
- package/dist/arena/strategies/review.d.ts +0 -26
- package/dist/arena/strategies/review.js +0 -168
- package/dist/arena/strategies/utils.d.ts +0 -36
- package/dist/arena/strategies/utils.js +0 -603
- package/dist/arena/tools/selector.d.ts +0 -17
- package/dist/arena/tools/selector.js +0 -61
- package/dist/arena/transitions.d.ts +0 -53
- package/dist/arena/transitions.js +0 -97
- package/dist/arena/types.d.ts +0 -514
- package/dist/arena/types.js +0 -27
- package/dist/cc-orchestrator/agent-adapter.d.ts +0 -54
- package/dist/cc-orchestrator/agent-adapter.js +0 -143
- package/dist/cc-orchestrator/cc-capability.d.ts +0 -19
- package/dist/cc-orchestrator/cc-capability.js +0 -53
- package/dist/cc-orchestrator/codex-session-discovery.d.ts +0 -24
- package/dist/cc-orchestrator/codex-session-discovery.js +0 -191
- package/dist/cc-orchestrator/codex-session-history.d.ts +0 -38
- package/dist/cc-orchestrator/codex-session-history.js +0 -247
- package/dist/cc-orchestrator/external-agent-bindings.d.ts +0 -27
- package/dist/cc-orchestrator/external-agent-bindings.js +0 -150
- package/dist/cc-orchestrator/external-agent-changes.d.ts +0 -19
- package/dist/cc-orchestrator/external-agent-changes.js +0 -231
- package/dist/cc-orchestrator/external-agent-driver.d.ts +0 -19
- package/dist/cc-orchestrator/external-agent-driver.js +0 -284
- package/dist/cc-orchestrator/external-agent-session-store.d.ts +0 -23
- package/dist/cc-orchestrator/external-agent-session-store.js +0 -146
- package/dist/cc-orchestrator/index.d.ts +0 -8
- package/dist/cc-orchestrator/index.js +0 -8
- package/dist/cc-orchestrator/relevance-judge.d.ts +0 -15
- package/dist/cc-orchestrator/relevance-judge.js +0 -29
- package/dist/cc-orchestrator/session-discovery.d.ts +0 -46
- package/dist/cc-orchestrator/session-discovery.js +0 -125
- package/dist/cc-orchestrator/session-history.d.ts +0 -54
- package/dist/cc-orchestrator/session-history.js +0 -150
- package/dist/cron/cron-runtime.d.ts +0 -2
- package/dist/cron/cron-runtime.js +0 -2
- package/dist/cron/cron-store.d.ts +0 -2
- package/dist/cron/cron-store.js +0 -2
- package/dist/cron/scheduler.d.ts +0 -7
- package/dist/cron/scheduler.js +0 -7
- package/dist/engine/goal.js +0 -206
- package/dist/external-agents/config.d.ts +0 -2
- package/dist/external-agents/config.js +0 -15
- package/dist/external-agents/types.d.ts +0 -31
- package/dist/git/parse-log.d.ts +0 -13
- package/dist/git/parse-log.js +0 -21
- package/dist/git/utils.d.ts +0 -49
- package/dist/git/utils.js +0 -161
- package/dist/git/worktree/crud.d.ts +0 -69
- package/dist/git/worktree/crud.js +0 -206
- package/dist/git/worktree/diff.d.ts +0 -14
- package/dist/git/worktree/diff.js +0 -82
- package/dist/git/worktree/git-exec.d.ts +0 -7
- package/dist/git/worktree/git-exec.js +0 -51
- package/dist/git/worktree/index.d.ts +0 -5
- package/dist/git/worktree/index.js +0 -5
- package/dist/git/worktree/query.d.ts +0 -42
- package/dist/git/worktree/query.js +0 -121
- package/dist/git/worktree/slug.d.ts +0 -11
- package/dist/git/worktree/slug.js +0 -58
- package/dist/git/worktree.d.ts +0 -1
- package/dist/git/worktree.js +0 -5
- package/dist/lsp/client.d.ts +0 -41
- package/dist/lsp/client.js +0 -186
- package/dist/lsp/manager.d.ts +0 -40
- package/dist/lsp/manager.js +0 -155
- package/dist/lsp/root-path.d.ts +0 -9
- package/dist/lsp/root-path.js +0 -12
- package/dist/lsp/servers.d.ts +0 -16
- package/dist/lsp/servers.js +0 -60
- package/dist/prompt/sections/coding.md +0 -35
- package/dist/quota/credentials.d.ts +0 -3
- package/dist/quota/credentials.js +0 -80
- package/dist/quota/index.d.ts +0 -36
- package/dist/quota/index.js +0 -155
- package/dist/quota/types.d.ts +0 -48
- package/dist/quota/types.js +0 -13
- package/dist/review/review-prompt.d.ts +0 -28
- package/dist/review/review-prompt.js +0 -81
- package/dist/state.d.ts +0 -160
- package/dist/state.js +0 -267
- package/dist/tool-system/builtin/apply-patch/applier.d.ts +0 -26
- package/dist/tool-system/builtin/apply-patch/applier.js +0 -308
- package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +0 -10
- package/dist/tool-system/builtin/apply-patch/backup-targets.js +0 -30
- package/dist/tool-system/builtin/apply-patch/index.d.ts +0 -20
- package/dist/tool-system/builtin/apply-patch/index.js +0 -105
- package/dist/tool-system/builtin/apply-patch/parser.d.ts +0 -17
- package/dist/tool-system/builtin/apply-patch/parser.js +0 -212
- package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +0 -18
- package/dist/tool-system/builtin/apply-patch/seek-sequence.js +0 -123
- package/dist/tool-system/builtin/apply-patch/types.d.ts +0 -49
- package/dist/tool-system/builtin/apply-patch/types.js +0 -13
- package/dist/tool-system/builtin/arena.d.ts +0 -31
- package/dist/tool-system/builtin/arena.js +0 -415
- package/dist/tool-system/builtin/brief.d.ts +0 -6
- package/dist/tool-system/builtin/brief.js +0 -41
- package/dist/tool-system/builtin/check-quota.d.ts +0 -15
- package/dist/tool-system/builtin/check-quota.js +0 -34
- package/dist/tool-system/builtin/drive-claude-code.d.ts +0 -51
- package/dist/tool-system/builtin/drive-claude-code.js +0 -698
- package/dist/tool-system/builtin/lsp.d.ts +0 -7
- package/dist/tool-system/builtin/lsp.js +0 -144
- package/dist/tool-system/builtin/notebook-edit.d.ts +0 -7
- package/dist/tool-system/builtin/notebook-edit.js +0 -127
- package/dist/tool-system/builtin/worktree.d.ts +0 -11
- package/dist/tool-system/builtin/worktree.js +0 -345
- /package/dist/{external-agents → links}/types.js +0 -0
- /package/dist/{engine/session-usage.d.ts → session/usage.d.ts} +0 -0
- /package/dist/{engine/session-usage.js → session/usage.js} +0 -0
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
|
|
4
|
+
import { dirname } from "node:path";
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
import { panelAppsRegistryPath } from "./paths.js";
|
|
7
|
+
import { lock } from "../utils/lockfile.js";
|
|
8
|
+
const GitSource = z
|
|
9
|
+
.object({
|
|
10
|
+
kind: z.literal("git"),
|
|
11
|
+
url: z.string().url().max(4_096),
|
|
12
|
+
ref: z.string().min(1).max(255).optional(),
|
|
13
|
+
subdir: z.string().min(1).max(1_024).optional(),
|
|
14
|
+
})
|
|
15
|
+
.strict();
|
|
16
|
+
const RegistryEntry = z
|
|
17
|
+
.object({
|
|
18
|
+
id: z.string().regex(/^[a-z][a-z0-9-]{0,63}$/),
|
|
19
|
+
version: z.string().min(1).max(80),
|
|
20
|
+
source: z.union([z.string().min(1).max(4_096), GitSource]),
|
|
21
|
+
installedAt: z.string().min(1).max(128),
|
|
22
|
+
lastUpdated: z.string().min(1).max(128),
|
|
23
|
+
})
|
|
24
|
+
.strict();
|
|
25
|
+
const Registry = z
|
|
26
|
+
.object({
|
|
27
|
+
version: z.literal(1),
|
|
28
|
+
apps: z.array(RegistryEntry).max(1_024),
|
|
29
|
+
})
|
|
30
|
+
.strict();
|
|
31
|
+
async function readRegistryUnlocked() {
|
|
32
|
+
const path = panelAppsRegistryPath();
|
|
33
|
+
if (!existsSync(path))
|
|
34
|
+
return [];
|
|
35
|
+
try {
|
|
36
|
+
return Registry.parse(JSON.parse(await readFile(path, "utf-8"))).apps;
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return [];
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async function writeRegistryUnlocked(apps) {
|
|
43
|
+
const path = panelAppsRegistryPath();
|
|
44
|
+
await mkdir(dirname(path), { recursive: true, mode: 0o700 });
|
|
45
|
+
const tmp = `${path}.${process.pid}.${randomUUID()}.tmp`;
|
|
46
|
+
try {
|
|
47
|
+
const registry = Registry.parse({
|
|
48
|
+
version: 1,
|
|
49
|
+
apps: [...apps].sort((left, right) => left.id.localeCompare(right.id)),
|
|
50
|
+
});
|
|
51
|
+
await writeFile(tmp, `${JSON.stringify(registry, null, 2)}\n`, {
|
|
52
|
+
encoding: "utf-8",
|
|
53
|
+
flag: "wx",
|
|
54
|
+
mode: 0o600,
|
|
55
|
+
});
|
|
56
|
+
await rename(tmp, path);
|
|
57
|
+
}
|
|
58
|
+
finally {
|
|
59
|
+
await rm(tmp, { force: true });
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async function mutateRegistry(mutation) {
|
|
63
|
+
const directory = dirname(panelAppsRegistryPath());
|
|
64
|
+
await mkdir(directory, { recursive: true, mode: 0o700 });
|
|
65
|
+
const release = await lock(directory, {
|
|
66
|
+
realpath: true,
|
|
67
|
+
stale: 10_000,
|
|
68
|
+
retries: { retries: 8, minTimeout: 10, maxTimeout: 120, factor: 1.5 },
|
|
69
|
+
});
|
|
70
|
+
try {
|
|
71
|
+
const next = mutation(await readRegistryUnlocked());
|
|
72
|
+
await writeRegistryUnlocked(next.apps);
|
|
73
|
+
return next.result;
|
|
74
|
+
}
|
|
75
|
+
finally {
|
|
76
|
+
await release();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
export async function readInstalledPanelAppsRegistry() {
|
|
80
|
+
return readRegistryUnlocked();
|
|
81
|
+
}
|
|
82
|
+
export async function writeInstalledPanelAppsRegistry(apps) {
|
|
83
|
+
await mutateRegistry(() => ({ apps, result: undefined }));
|
|
84
|
+
}
|
|
85
|
+
export async function upsertInstalledPanelAppRecord(record) {
|
|
86
|
+
await mutateRegistry((current) => ({
|
|
87
|
+
apps: [
|
|
88
|
+
...current.filter((candidate) => candidate.id !== record.id),
|
|
89
|
+
RegistryEntry.parse(record),
|
|
90
|
+
],
|
|
91
|
+
result: undefined,
|
|
92
|
+
}));
|
|
93
|
+
}
|
|
94
|
+
export async function removeInstalledPanelAppRecord(id) {
|
|
95
|
+
await mutateRegistry((current) => ({
|
|
96
|
+
apps: current.filter((candidate) => candidate.id !== id),
|
|
97
|
+
result: undefined,
|
|
98
|
+
}));
|
|
99
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UI-agnostic lifecycle runtime for trusted, code-backed Panel App modules.
|
|
3
|
+
*
|
|
4
|
+
* A host supplies its own service object and panel context. Core owns ordering,
|
|
5
|
+
* instance identity, and error isolation; it does not import React/Electron or
|
|
6
|
+
* decide how an untrusted installed Panel App is sandboxed.
|
|
7
|
+
*/
|
|
8
|
+
export type PanelAppLifecycleEventName = "activate" | "panel_mount" | "panel_context_changed" | "panel_visibility_changed" | "panel_unmount" | "deactivate";
|
|
9
|
+
export interface PanelAppInstance<TContext extends object = Record<string, unknown>> {
|
|
10
|
+
panelId: string;
|
|
11
|
+
instanceId: string;
|
|
12
|
+
context: TContext;
|
|
13
|
+
visible: boolean;
|
|
14
|
+
}
|
|
15
|
+
export type PanelAppLifecycleEvent<TContext extends object = Record<string, unknown>> = {
|
|
16
|
+
type: "activate";
|
|
17
|
+
} | {
|
|
18
|
+
type: "panel_mount";
|
|
19
|
+
panel: PanelAppInstance<TContext>;
|
|
20
|
+
} | {
|
|
21
|
+
type: "panel_context_changed";
|
|
22
|
+
panel: PanelAppInstance<TContext>;
|
|
23
|
+
} | {
|
|
24
|
+
type: "panel_visibility_changed";
|
|
25
|
+
panel: PanelAppInstance<TContext>;
|
|
26
|
+
} | {
|
|
27
|
+
type: "panel_unmount";
|
|
28
|
+
panel: PanelAppInstance<TContext>;
|
|
29
|
+
} | {
|
|
30
|
+
type: "deactivate";
|
|
31
|
+
};
|
|
32
|
+
export interface PanelAppLifecycleHookContext<THost, TContext extends object = Record<string, unknown>> {
|
|
33
|
+
appId: string;
|
|
34
|
+
host: THost;
|
|
35
|
+
event: PanelAppLifecycleEvent<TContext>;
|
|
36
|
+
}
|
|
37
|
+
export type PanelAppLifecycleHook<THost, TContext extends object = Record<string, unknown>> = (context: PanelAppLifecycleHookContext<THost, TContext>) => void | Promise<void>;
|
|
38
|
+
export type PanelAppLifecycleHooks<THost, TContext extends object = Record<string, unknown>> = Partial<Record<PanelAppLifecycleEventName, PanelAppLifecycleHook<THost, TContext> | readonly PanelAppLifecycleHook<THost, TContext>[]>>;
|
|
39
|
+
/** Trusted code module. Installed web content must not be imported through this boundary. */
|
|
40
|
+
export interface PanelAppLifecycleModule<THost, TContext extends object = Record<string, unknown>> {
|
|
41
|
+
id: string;
|
|
42
|
+
hooks?: PanelAppLifecycleHooks<THost, TContext>;
|
|
43
|
+
}
|
|
44
|
+
export interface PanelAppLifecycleError<THost, TContext extends object = Record<string, unknown>> {
|
|
45
|
+
appId: string;
|
|
46
|
+
event: PanelAppLifecycleEvent<TContext>;
|
|
47
|
+
host: THost;
|
|
48
|
+
error: unknown;
|
|
49
|
+
}
|
|
50
|
+
export interface PanelAppLifecycleRuntimeOptions<THost, TContext extends object = Record<string, unknown>> {
|
|
51
|
+
onError?(error: PanelAppLifecycleError<THost, TContext>): void;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Stateful lifecycle coordinator shared by headless and UI hosts.
|
|
55
|
+
*
|
|
56
|
+
* Mounting the first panel activates its module automatically. State changes
|
|
57
|
+
* are recorded before hooks run, so re-entrant/StrictMode calls remain
|
|
58
|
+
* idempotent even when a hook is asynchronous.
|
|
59
|
+
*/
|
|
60
|
+
export declare class PanelAppLifecycleRuntime<THost, TContext extends object = Record<string, unknown>> {
|
|
61
|
+
private readonly options;
|
|
62
|
+
private readonly modules;
|
|
63
|
+
private readonly active;
|
|
64
|
+
private readonly panels;
|
|
65
|
+
constructor(options?: PanelAppLifecycleRuntimeOptions<THost, TContext>);
|
|
66
|
+
register(module: PanelAppLifecycleModule<THost, TContext>): () => void;
|
|
67
|
+
has(appId: string): boolean;
|
|
68
|
+
isActive(appId: string): boolean;
|
|
69
|
+
mountedPanels(appId?: string): PanelAppInstance<TContext>[];
|
|
70
|
+
activate(appId: string, host: THost): Promise<void>;
|
|
71
|
+
mountPanel(appId: string, panel: PanelAppInstance<TContext>, host: THost): Promise<void>;
|
|
72
|
+
updatePanelContext(appId: string, instanceId: string, context: TContext, host: THost): Promise<void>;
|
|
73
|
+
setPanelVisibility(appId: string, instanceId: string, visible: boolean, host: THost): Promise<void>;
|
|
74
|
+
unmountPanel(appId: string, instanceId: string, host: THost): Promise<void>;
|
|
75
|
+
deactivate(appId: string, host: THost): Promise<void>;
|
|
76
|
+
private hasMountedPanels;
|
|
77
|
+
private requireModule;
|
|
78
|
+
private requirePanel;
|
|
79
|
+
private emit;
|
|
80
|
+
}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UI-agnostic lifecycle runtime for trusted, code-backed Panel App modules.
|
|
3
|
+
*
|
|
4
|
+
* A host supplies its own service object and panel context. Core owns ordering,
|
|
5
|
+
* instance identity, and error isolation; it does not import React/Electron or
|
|
6
|
+
* decide how an untrusted installed Panel App is sandboxed.
|
|
7
|
+
*/
|
|
8
|
+
function panelKey(appId, instanceId) {
|
|
9
|
+
return `${appId}\0${instanceId}`;
|
|
10
|
+
}
|
|
11
|
+
function clonePanel(panel) {
|
|
12
|
+
return { ...panel, context: { ...panel.context } };
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Stateful lifecycle coordinator shared by headless and UI hosts.
|
|
16
|
+
*
|
|
17
|
+
* Mounting the first panel activates its module automatically. State changes
|
|
18
|
+
* are recorded before hooks run, so re-entrant/StrictMode calls remain
|
|
19
|
+
* idempotent even when a hook is asynchronous.
|
|
20
|
+
*/
|
|
21
|
+
export class PanelAppLifecycleRuntime {
|
|
22
|
+
options;
|
|
23
|
+
modules = new Map();
|
|
24
|
+
active = new Set();
|
|
25
|
+
panels = new Map();
|
|
26
|
+
constructor(options = {}) {
|
|
27
|
+
this.options = options;
|
|
28
|
+
}
|
|
29
|
+
register(module) {
|
|
30
|
+
if (!module.id)
|
|
31
|
+
throw new Error("Panel App lifecycle module id is required");
|
|
32
|
+
if (this.modules.has(module.id)) {
|
|
33
|
+
throw new Error(`Panel App lifecycle module '${module.id}' is already registered`);
|
|
34
|
+
}
|
|
35
|
+
this.modules.set(module.id, module);
|
|
36
|
+
let disposed = false;
|
|
37
|
+
return () => {
|
|
38
|
+
if (disposed)
|
|
39
|
+
return;
|
|
40
|
+
if (this.active.has(module.id) || this.hasMountedPanels(module.id)) {
|
|
41
|
+
throw new Error(`Panel App lifecycle module '${module.id}' must be deactivated first`);
|
|
42
|
+
}
|
|
43
|
+
disposed = true;
|
|
44
|
+
if (this.modules.get(module.id) === module)
|
|
45
|
+
this.modules.delete(module.id);
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
has(appId) {
|
|
49
|
+
return this.modules.has(appId);
|
|
50
|
+
}
|
|
51
|
+
isActive(appId) {
|
|
52
|
+
return this.active.has(appId);
|
|
53
|
+
}
|
|
54
|
+
mountedPanels(appId) {
|
|
55
|
+
const prefix = appId === undefined ? null : `${appId}\0`;
|
|
56
|
+
return [...this.panels.entries()]
|
|
57
|
+
.filter(([key]) => prefix === null || key.startsWith(prefix))
|
|
58
|
+
.map(([, panel]) => clonePanel(panel));
|
|
59
|
+
}
|
|
60
|
+
async activate(appId, host) {
|
|
61
|
+
this.requireModule(appId);
|
|
62
|
+
if (this.active.has(appId))
|
|
63
|
+
return;
|
|
64
|
+
this.active.add(appId);
|
|
65
|
+
await this.emit(appId, host, { type: "activate" });
|
|
66
|
+
}
|
|
67
|
+
async mountPanel(appId, panel, host) {
|
|
68
|
+
this.requireModule(appId);
|
|
69
|
+
const key = panelKey(appId, panel.instanceId);
|
|
70
|
+
if (this.panels.has(key))
|
|
71
|
+
return;
|
|
72
|
+
const snapshot = clonePanel(panel);
|
|
73
|
+
this.panels.set(key, snapshot);
|
|
74
|
+
await this.activate(appId, host);
|
|
75
|
+
// A host can unmount/remount while an async activate hook is pending. Only
|
|
76
|
+
// the generation that installed this snapshot may publish its mount event.
|
|
77
|
+
if (this.panels.get(key) !== snapshot)
|
|
78
|
+
return;
|
|
79
|
+
await this.emit(appId, host, { type: "panel_mount", panel: clonePanel(snapshot) });
|
|
80
|
+
}
|
|
81
|
+
async updatePanelContext(appId, instanceId, context, host) {
|
|
82
|
+
const current = this.requirePanel(appId, instanceId);
|
|
83
|
+
const next = { ...current, context: { ...context } };
|
|
84
|
+
this.panels.set(panelKey(appId, instanceId), next);
|
|
85
|
+
await this.emit(appId, host, {
|
|
86
|
+
type: "panel_context_changed",
|
|
87
|
+
panel: clonePanel(next),
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
async setPanelVisibility(appId, instanceId, visible, host) {
|
|
91
|
+
const current = this.requirePanel(appId, instanceId);
|
|
92
|
+
if (current.visible === visible)
|
|
93
|
+
return;
|
|
94
|
+
const next = { ...current, visible };
|
|
95
|
+
this.panels.set(panelKey(appId, instanceId), next);
|
|
96
|
+
await this.emit(appId, host, {
|
|
97
|
+
type: "panel_visibility_changed",
|
|
98
|
+
panel: clonePanel(next),
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
async unmountPanel(appId, instanceId, host) {
|
|
102
|
+
const key = panelKey(appId, instanceId);
|
|
103
|
+
const current = this.panels.get(key);
|
|
104
|
+
if (!current)
|
|
105
|
+
return;
|
|
106
|
+
this.panels.delete(key);
|
|
107
|
+
await this.emit(appId, host, {
|
|
108
|
+
type: "panel_unmount",
|
|
109
|
+
panel: clonePanel(current),
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
async deactivate(appId, host) {
|
|
113
|
+
this.requireModule(appId);
|
|
114
|
+
for (const panel of this.mountedPanels(appId)) {
|
|
115
|
+
await this.unmountPanel(appId, panel.instanceId, host);
|
|
116
|
+
}
|
|
117
|
+
if (!this.active.delete(appId))
|
|
118
|
+
return;
|
|
119
|
+
await this.emit(appId, host, { type: "deactivate" });
|
|
120
|
+
}
|
|
121
|
+
hasMountedPanels(appId) {
|
|
122
|
+
const prefix = `${appId}\0`;
|
|
123
|
+
for (const key of this.panels.keys()) {
|
|
124
|
+
if (key.startsWith(prefix))
|
|
125
|
+
return true;
|
|
126
|
+
}
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
requireModule(appId) {
|
|
130
|
+
const module = this.modules.get(appId);
|
|
131
|
+
if (!module)
|
|
132
|
+
throw new Error(`unknown Panel App lifecycle module '${appId}'`);
|
|
133
|
+
return module;
|
|
134
|
+
}
|
|
135
|
+
requirePanel(appId, instanceId) {
|
|
136
|
+
const panel = this.panels.get(panelKey(appId, instanceId));
|
|
137
|
+
if (!panel) {
|
|
138
|
+
throw new Error(`Panel App instance '${appId}:${instanceId}' is not mounted`);
|
|
139
|
+
}
|
|
140
|
+
return panel;
|
|
141
|
+
}
|
|
142
|
+
async emit(appId, host, event) {
|
|
143
|
+
const configured = this.requireModule(appId).hooks?.[event.type];
|
|
144
|
+
const hooks = configured ? (Array.isArray(configured) ? configured : [configured]) : [];
|
|
145
|
+
for (const hook of hooks) {
|
|
146
|
+
try {
|
|
147
|
+
await hook({ appId, host, event });
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
this.options.onError?.({ appId, event, host, error });
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
package/dist/plugins/gitOps.js
CHANGED
|
@@ -63,6 +63,10 @@ async function runGit(args, cwd, timeoutMs = 60_000) {
|
|
|
63
63
|
cwd: cwd ?? process.cwd(),
|
|
64
64
|
env: nonInteractiveGitEnv(process.env),
|
|
65
65
|
timeoutMs,
|
|
66
|
+
// A stalled git clone/fetch owns helpers such as git-remote-https. Keep
|
|
67
|
+
// them in a dedicated group so the timeout cannot leave network workers
|
|
68
|
+
// running after the UI operation has failed.
|
|
69
|
+
processGroup: process.platform !== "win32",
|
|
66
70
|
});
|
|
67
71
|
if (r.spawnFailed) {
|
|
68
72
|
return { ok: false, error: `git ${args.join(" ")} failed: ${r.error ?? "spawn failed"}` };
|
|
@@ -164,7 +168,10 @@ export async function gitLsRemote(url, ref) {
|
|
|
164
168
|
return r;
|
|
165
169
|
const sha = r.stdout.split(/\s+/)[0] ?? "";
|
|
166
170
|
if (!/^[0-9a-f]{7,40}$/i.test(sha)) {
|
|
167
|
-
return {
|
|
171
|
+
return {
|
|
172
|
+
ok: false,
|
|
173
|
+
error: `ls-remote: no sha for ${ref ?? "HEAD"} in: ${r.stdout.slice(0, 120)}`,
|
|
174
|
+
};
|
|
168
175
|
}
|
|
169
176
|
return { ok: true, stdout: sha };
|
|
170
177
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Read/write ~/.code-shell/plugins/installed_plugins.json (V2 format).
|
|
3
|
-
*
|
|
3
|
+
* Reads the Claude Code-compatible V2 shape plus optional CodeShell integrity
|
|
4
|
+
* fields on each install entry.
|
|
4
5
|
*/
|
|
5
6
|
import type { InstalledPluginsV2, PluginInstallEntry } from "./types.js";
|
|
6
7
|
export declare function installedPluginsPath(): string;
|
|
@@ -1,26 +1,153 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Read/write ~/.code-shell/plugins/installed_plugins.json (V2 format).
|
|
3
|
-
*
|
|
3
|
+
* Reads the Claude Code-compatible V2 shape plus optional CodeShell integrity
|
|
4
|
+
* fields on each install entry.
|
|
4
5
|
*/
|
|
5
|
-
import {
|
|
6
|
+
import { randomUUID } from "node:crypto";
|
|
7
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from "node:fs";
|
|
6
8
|
import { dirname, join } from "node:path";
|
|
7
9
|
import { homedir } from "node:os";
|
|
10
|
+
const MAX_PLUGIN_KEYS = 2_048;
|
|
11
|
+
const MAX_INSTALLS_PER_KEY = 16;
|
|
12
|
+
const MAX_KEY_LENGTH = 256;
|
|
13
|
+
const MAX_PATH_LENGTH = 4_096;
|
|
14
|
+
const MAX_METADATA_LENGTH = 512;
|
|
15
|
+
const DIGEST_RE = /^[a-f0-9]{64}$/;
|
|
16
|
+
const MAX_HOOK_REVIEW_ITEMS = 256;
|
|
17
|
+
const MAX_HOOK_REVIEW_COMMAND_LENGTH = 4_096;
|
|
18
|
+
const MAX_HOOK_REVIEW_MATCHER_LENGTH = 4_096;
|
|
8
19
|
function userHome() {
|
|
9
20
|
return process.env.HOME ?? homedir();
|
|
10
21
|
}
|
|
11
22
|
export function installedPluginsPath() {
|
|
12
23
|
return join(userHome(), ".code-shell", "plugins", "installed_plugins.json");
|
|
13
24
|
}
|
|
14
|
-
|
|
25
|
+
function recordOf(value) {
|
|
26
|
+
return value && typeof value === "object" && !Array.isArray(value)
|
|
27
|
+
? value
|
|
28
|
+
: undefined;
|
|
29
|
+
}
|
|
30
|
+
function boundedString(value, maxLength) {
|
|
31
|
+
return typeof value === "string" &&
|
|
32
|
+
value.length > 0 &&
|
|
33
|
+
value.length <= maxLength &&
|
|
34
|
+
!value.includes("\0")
|
|
35
|
+
? value
|
|
36
|
+
: undefined;
|
|
37
|
+
}
|
|
38
|
+
function hookReviewItemOf(value) {
|
|
39
|
+
const raw = recordOf(value);
|
|
40
|
+
if (!raw)
|
|
41
|
+
return undefined;
|
|
42
|
+
const rawEvent = boundedString(raw.rawEvent, 128);
|
|
43
|
+
const command = boundedString(raw.command, MAX_HOOK_REVIEW_COMMAND_LENGTH);
|
|
44
|
+
const commandDigest = typeof raw.commandDigest === "string" && DIGEST_RE.test(raw.commandDigest)
|
|
45
|
+
? raw.commandDigest
|
|
46
|
+
: undefined;
|
|
47
|
+
if (!rawEvent || !command || !commandDigest)
|
|
48
|
+
return undefined;
|
|
49
|
+
const matcher = raw.matcher === undefined
|
|
50
|
+
? undefined
|
|
51
|
+
: boundedString(raw.matcher, MAX_HOOK_REVIEW_MATCHER_LENGTH);
|
|
52
|
+
if (raw.matcher !== undefined && matcher === undefined)
|
|
53
|
+
return undefined;
|
|
54
|
+
if (raw.commandTruncated !== undefined && typeof raw.commandTruncated !== "boolean") {
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
if (raw.async !== undefined && typeof raw.async !== "boolean")
|
|
58
|
+
return undefined;
|
|
59
|
+
const timeoutMs = raw.timeoutMs === undefined ||
|
|
60
|
+
(typeof raw.timeoutMs === "number" &&
|
|
61
|
+
Number.isSafeInteger(raw.timeoutMs) &&
|
|
62
|
+
raw.timeoutMs >= 1 &&
|
|
63
|
+
raw.timeoutMs <= 600_000)
|
|
64
|
+
? raw.timeoutMs
|
|
65
|
+
: null;
|
|
66
|
+
if (timeoutMs === null)
|
|
67
|
+
return undefined;
|
|
68
|
+
return {
|
|
69
|
+
rawEvent,
|
|
70
|
+
...(matcher === undefined ? {} : { matcher }),
|
|
71
|
+
command,
|
|
72
|
+
commandDigest,
|
|
73
|
+
...(raw.commandTruncated === true ? { commandTruncated: true } : {}),
|
|
74
|
+
...(raw.async === undefined ? {} : { async: raw.async }),
|
|
75
|
+
...(timeoutMs === undefined ? {} : { timeoutMs }),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
function installEntryOf(value) {
|
|
79
|
+
const raw = recordOf(value);
|
|
80
|
+
if (!raw || raw.scope !== "user")
|
|
81
|
+
return undefined;
|
|
82
|
+
const installPath = boundedString(raw.installPath, MAX_PATH_LENGTH);
|
|
83
|
+
const version = boundedString(raw.version, MAX_METADATA_LENGTH);
|
|
84
|
+
const installedAt = boundedString(raw.installedAt, MAX_METADATA_LENGTH);
|
|
85
|
+
const lastUpdated = boundedString(raw.lastUpdated, MAX_METADATA_LENGTH);
|
|
86
|
+
if (!installPath || !version || !installedAt || !lastUpdated)
|
|
87
|
+
return undefined;
|
|
88
|
+
const entry = {
|
|
89
|
+
scope: "user",
|
|
90
|
+
installPath,
|
|
91
|
+
version,
|
|
92
|
+
installedAt,
|
|
93
|
+
lastUpdated,
|
|
94
|
+
};
|
|
95
|
+
const gitCommitSha = boundedString(raw.gitCommitSha, MAX_METADATA_LENGTH);
|
|
96
|
+
if (gitCommitSha)
|
|
97
|
+
entry.gitCommitSha = gitCommitSha;
|
|
98
|
+
for (const field of [
|
|
99
|
+
"hookDigest",
|
|
100
|
+
"approvedHookDigest",
|
|
101
|
+
"mcpDigest",
|
|
102
|
+
"approvedMcpDigest",
|
|
103
|
+
]) {
|
|
104
|
+
const digest = raw[field];
|
|
105
|
+
if (typeof digest === "string" && DIGEST_RE.test(digest))
|
|
106
|
+
entry[field] = digest;
|
|
107
|
+
}
|
|
108
|
+
if (Array.isArray(raw.approvedHookSnapshot) &&
|
|
109
|
+
raw.approvedHookSnapshot.length <= MAX_HOOK_REVIEW_ITEMS) {
|
|
110
|
+
const snapshot = raw.approvedHookSnapshot
|
|
111
|
+
.map((item) => hookReviewItemOf(item))
|
|
112
|
+
.filter((item) => item !== undefined);
|
|
113
|
+
if (snapshot.length === raw.approvedHookSnapshot.length)
|
|
114
|
+
entry.approvedHookSnapshot = snapshot;
|
|
115
|
+
}
|
|
116
|
+
return entry;
|
|
117
|
+
}
|
|
118
|
+
function registryOf(value) {
|
|
119
|
+
const raw = recordOf(value);
|
|
120
|
+
const plugins = recordOf(raw?.plugins);
|
|
121
|
+
if (raw?.version !== 2 || !plugins)
|
|
122
|
+
return undefined;
|
|
123
|
+
const entries = Object.entries(plugins);
|
|
124
|
+
if (entries.length > MAX_PLUGIN_KEYS)
|
|
125
|
+
return undefined;
|
|
126
|
+
const normalized = { version: 2, plugins: {} };
|
|
127
|
+
for (const [key, value] of entries) {
|
|
128
|
+
if (key.length === 0 ||
|
|
129
|
+
key.length > MAX_KEY_LENGTH ||
|
|
130
|
+
key.includes("\0") ||
|
|
131
|
+
!Array.isArray(value) ||
|
|
132
|
+
value.length > MAX_INSTALLS_PER_KEY) {
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
const installs = value
|
|
136
|
+
.map((entry) => installEntryOf(entry))
|
|
137
|
+
.filter((entry) => entry !== undefined);
|
|
138
|
+
if (installs.length > 0)
|
|
139
|
+
normalized.plugins[key] = installs;
|
|
140
|
+
}
|
|
141
|
+
return normalized;
|
|
142
|
+
}
|
|
15
143
|
export function readInstalledPlugins() {
|
|
16
144
|
const path = installedPluginsPath();
|
|
17
145
|
if (!existsSync(path))
|
|
18
146
|
return { version: 2, plugins: {} };
|
|
19
147
|
try {
|
|
20
|
-
const
|
|
21
|
-
if (
|
|
22
|
-
return
|
|
23
|
-
}
|
|
148
|
+
const parsed = registryOf(JSON.parse(readFileSync(path, "utf-8")));
|
|
149
|
+
if (parsed)
|
|
150
|
+
return parsed;
|
|
24
151
|
}
|
|
25
152
|
catch {
|
|
26
153
|
// Corrupt — treat as empty so the user can re-install.
|
|
@@ -30,7 +157,18 @@ export function readInstalledPlugins() {
|
|
|
30
157
|
export function writeInstalledPlugins(data) {
|
|
31
158
|
const path = installedPluginsPath();
|
|
32
159
|
mkdirSync(dirname(path), { recursive: true });
|
|
33
|
-
|
|
160
|
+
const tmp = `${path}.${process.pid}.${randomUUID()}.tmp`;
|
|
161
|
+
try {
|
|
162
|
+
writeFileSync(tmp, JSON.stringify(data, null, 2) + "\n", {
|
|
163
|
+
encoding: "utf-8",
|
|
164
|
+
flag: "wx",
|
|
165
|
+
mode: 0o600,
|
|
166
|
+
});
|
|
167
|
+
renameSync(tmp, path);
|
|
168
|
+
}
|
|
169
|
+
finally {
|
|
170
|
+
rmSync(tmp, { force: true });
|
|
171
|
+
}
|
|
34
172
|
}
|
|
35
173
|
/**
|
|
36
174
|
* Append an install entry for `<plugin>@<marketplace>`. Multiple entries
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Convert one Codex agent TOML into a CC agent Markdown string.
|
|
3
|
-
* Real
|
|
3
|
+
* Real CodeShell fields: name, description, model, MCP allowlist and
|
|
4
|
+
* body(=developer_instructions).
|
|
4
5
|
* Every other field is preserved with a `codex_` prefix (v1 inert; see spec §7.1).
|
|
5
6
|
* `mcp_servers` values are rewritten to `<plugin>:<server>` to match the MCP merge key.
|
|
6
7
|
*/
|
|
7
8
|
export declare function convertCodexAgentToml(toml: string, sourceName: string, pluginName: string): string;
|
|
9
|
+
/** Walk <sourceDir>/agents/**.toml → <destDir>/agents/**.md. */
|
|
10
|
+
export declare function convertCodexAgentsDirectory(sourceDir: string, destDir: string, pluginName: string): Promise<void>;
|
|
@@ -1,11 +1,15 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { mkdir, readFile, readdir, realpath, stat, writeFile } from "node:fs/promises";
|
|
3
|
+
import { isAbsolute, join, relative, sep } from "node:path";
|
|
1
4
|
import { parse as parseToml } from "smol-toml";
|
|
2
5
|
import { stringify as stringifyYaml } from "yaml";
|
|
3
6
|
import { serializeAgentDefinition } from "../../../agent/agent-definition.js";
|
|
4
7
|
import { PluginInstallError } from "../types.js";
|
|
5
|
-
const MAPPED = new Set(["name", "description", "model", "developer_instructions"]);
|
|
8
|
+
const MAPPED = new Set(["name", "description", "model", "developer_instructions", "mcp_servers"]);
|
|
6
9
|
/**
|
|
7
10
|
* Convert one Codex agent TOML into a CC agent Markdown string.
|
|
8
|
-
* Real
|
|
11
|
+
* Real CodeShell fields: name, description, model, MCP allowlist and
|
|
12
|
+
* body(=developer_instructions).
|
|
9
13
|
* Every other field is preserved with a `codex_` prefix (v1 inert; see spec §7.1).
|
|
10
14
|
* `mcp_servers` values are rewritten to `<plugin>:<server>` to match the MCP merge key.
|
|
11
15
|
*/
|
|
@@ -24,11 +28,24 @@ export function convertCodexAgentToml(toml, sourceName, pluginName) {
|
|
|
24
28
|
throw new PluginInstallError(`${sourceName}: missing required 'description'`);
|
|
25
29
|
}
|
|
26
30
|
const body = typeof raw.developer_instructions === "string" ? raw.developer_instructions.trim() : "";
|
|
31
|
+
let mcp;
|
|
32
|
+
if (raw.mcp_servers !== undefined) {
|
|
33
|
+
if (!Array.isArray(raw.mcp_servers) ||
|
|
34
|
+
raw.mcp_servers.length > 256 ||
|
|
35
|
+
raw.mcp_servers.some((server) => typeof server !== "string" ||
|
|
36
|
+
server.length === 0 ||
|
|
37
|
+
server.length > 256 ||
|
|
38
|
+
!/^[A-Za-z0-9._-]+$/u.test(server))) {
|
|
39
|
+
throw new PluginInstallError(`${sourceName}: 'mcp_servers' must be an array of at most 256 safe server names`);
|
|
40
|
+
}
|
|
41
|
+
mcp = [...new Set(raw.mcp_servers.map((server) => `${pluginName}:${server}`))];
|
|
42
|
+
}
|
|
27
43
|
const base = serializeAgentDefinition({
|
|
28
44
|
name: raw.name.trim(),
|
|
29
45
|
description: raw.description.trim(),
|
|
30
46
|
systemPrompt: body,
|
|
31
47
|
...(typeof raw.model === "string" && raw.model.trim() ? { model: raw.model.trim() } : {}),
|
|
48
|
+
...(mcp !== undefined ? { mcp } : {}),
|
|
32
49
|
});
|
|
33
50
|
// Collect codex_-prefixed extras.
|
|
34
51
|
const extras = {};
|
|
@@ -36,12 +53,7 @@ export function convertCodexAgentToml(toml, sourceName, pluginName) {
|
|
|
36
53
|
if (MAPPED.has(key))
|
|
37
54
|
continue;
|
|
38
55
|
const outKey = `codex_${key}`;
|
|
39
|
-
|
|
40
|
-
extras[outKey] = value.map((s) => (typeof s === "string" ? `${pluginName}:${s}` : s));
|
|
41
|
-
}
|
|
42
|
-
else {
|
|
43
|
-
extras[outKey] = value;
|
|
44
|
-
}
|
|
56
|
+
extras[outKey] = value;
|
|
45
57
|
}
|
|
46
58
|
if (Object.keys(extras).length === 0)
|
|
47
59
|
return base;
|
|
@@ -53,3 +65,45 @@ export function convertCodexAgentToml(toml, sourceName, pluginName) {
|
|
|
53
65
|
const [, fm, rest] = match;
|
|
54
66
|
return `---\n${fm}\n${extraYaml}\n---\n${rest}`;
|
|
55
67
|
}
|
|
68
|
+
/** Walk <sourceDir>/agents/**.toml → <destDir>/agents/**.md. */
|
|
69
|
+
export async function convertCodexAgentsDirectory(sourceDir, destDir, pluginName) {
|
|
70
|
+
const agentsSrc = join(sourceDir, "agents");
|
|
71
|
+
if (!existsSync(agentsSrc))
|
|
72
|
+
return;
|
|
73
|
+
const sourceRoot = await realpath(sourceDir);
|
|
74
|
+
const resolvedAgentsRoot = await resolveContainedAgentSource(sourceRoot, agentsSrc, "agents");
|
|
75
|
+
const walk = async (dir) => {
|
|
76
|
+
for (const dirent of await readdir(dir, { withFileTypes: true })) {
|
|
77
|
+
const abs = join(dir, dirent.name);
|
|
78
|
+
if (dirent.isDirectory()) {
|
|
79
|
+
await walk(abs);
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (!dirent.name.endsWith(".toml"))
|
|
83
|
+
continue;
|
|
84
|
+
const source = await resolveContainedAgentSource(resolvedAgentsRoot, abs, relative(resolvedAgentsRoot, abs));
|
|
85
|
+
if (!(await stat(source)).isFile())
|
|
86
|
+
continue;
|
|
87
|
+
const rel = relative(resolvedAgentsRoot, abs).replace(/\.toml$/, ".md");
|
|
88
|
+
const outPath = join(destDir, "agents", rel);
|
|
89
|
+
await mkdir(join(outPath, ".."), { recursive: true });
|
|
90
|
+
const markdown = convertCodexAgentToml(await readFile(source, "utf-8"), rel, pluginName);
|
|
91
|
+
await writeFile(outPath, markdown);
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
await walk(resolvedAgentsRoot);
|
|
95
|
+
}
|
|
96
|
+
async function resolveContainedAgentSource(sourceRoot, candidate, label) {
|
|
97
|
+
let target;
|
|
98
|
+
try {
|
|
99
|
+
target = await realpath(candidate);
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
throw new PluginInstallError(`agent source not found: ${label}`);
|
|
103
|
+
}
|
|
104
|
+
const rel = relative(sourceRoot, target);
|
|
105
|
+
if (rel === ".." || rel.startsWith(`..${sep}`) || isAbsolute(rel)) {
|
|
106
|
+
throw new PluginInstallError(`agent source escapes plugin dir: ${label}`);
|
|
107
|
+
}
|
|
108
|
+
return target;
|
|
109
|
+
}
|
|
@@ -7,11 +7,11 @@
|
|
|
7
7
|
* already scans `commands/*.md`. So the conversion is a flat copy of every
|
|
8
8
|
* `.md` from `prompts/` (and any explicit `commands/`) into `dest/commands/`.
|
|
9
9
|
*
|
|
10
|
-
* Placeholder syntax differs (Codex `$1`/`$FILE` vs CC `$ARGUMENTS`)
|
|
11
|
-
* body is copied verbatim
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
10
|
+
* Placeholder syntax differs (Codex `$1`/`$FILE` vs CC `$ARGUMENTS`), so the
|
|
11
|
+
* body is copied verbatim and expanded at invocation time by
|
|
12
|
+
* `expandPluginCommandBody`. Non-`.md` files are ignored, matching Codex's
|
|
13
|
+
* own behaviour. On a filename collision an explicit `commands/` entry wins
|
|
14
|
+
* over `prompts/` (the more specific source).
|
|
15
15
|
*
|
|
16
16
|
* Async fs throughout: this runs in the Electron main process during install;
|
|
17
17
|
* sync copies block the event loop and freeze the UI (see convertSkills.ts).
|