@cjhyy/code-shell-core 0.7.1 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +36 -23
- package/dist/agent/agent-definition-registry.d.ts +2 -2
- package/dist/agent/agent-definition-registry.js +47 -10
- package/dist/agent/agent-definition.d.ts +5 -0
- package/dist/agent/agent-definition.js +14 -0
- package/dist/automation/index.d.ts +7 -4
- package/dist/automation/index.js +4 -2
- package/dist/automation/runner.js +3 -1
- package/dist/automation/scheduler.d.ts +57 -1
- package/dist/automation/scheduler.js +123 -23
- package/dist/automation/store.d.ts +6 -2
- package/dist/automation/store.js +7 -3
- package/dist/capabilities/index.d.ts +109 -0
- package/dist/capabilities/index.js +80 -0
- package/dist/capability-control/disabled-lists.d.ts +2 -1
- package/dist/capability-control/disabled-lists.js +3 -5
- package/dist/capability-control/overlay.d.ts +14 -1
- package/dist/capability-control/overlay.js +40 -0
- package/dist/capability-control/service.js +6 -4
- package/dist/cli/agent-server-stdio.d.ts +1 -1
- package/dist/cli/agent-server-stdio.js +66 -6
- package/dist/cli/agent-server-tcp.js +7 -3
- package/dist/context/compaction.d.ts +39 -3
- package/dist/context/compaction.js +151 -39
- package/dist/context/manager.d.ts +17 -1
- package/dist/context/manager.js +36 -1
- package/dist/credentials/access.d.ts +3 -1
- package/dist/credentials/access.js +24 -3
- package/dist/credentials/index.d.ts +1 -1
- package/dist/credentials/index.js +1 -1
- package/dist/credentials/oauth.d.ts +4 -1
- package/dist/credentials/oauth.js +14 -0
- package/dist/credentials/store.d.ts +15 -1
- package/dist/credentials/store.js +17 -4
- package/dist/credentials/types.d.ts +24 -0
- package/dist/credentials/use-credential-tool.js +15 -1
- package/dist/engine/auxiliary-pipeline.d.ts +40 -0
- package/dist/engine/auxiliary-pipeline.js +181 -0
- package/dist/{settings → engine}/disk-defaults.d.ts +2 -2
- package/dist/{settings → engine}/disk-defaults.js +5 -2
- package/dist/engine/dynamic-tool-defs.d.ts +4 -0
- package/dist/engine/dynamic-tool-defs.js +4 -0
- package/dist/engine/engine.d.ts +254 -195
- package/dist/engine/engine.js +1812 -2041
- package/dist/engine/file-history-hook.d.ts +11 -0
- package/dist/engine/file-history-hook.js +31 -0
- package/dist/engine/goal-judge-context.d.ts +9 -0
- package/dist/engine/goal-judge-context.js +234 -0
- package/dist/engine/injected-context-cache.d.ts +6 -0
- package/dist/engine/injected-context-cache.js +13 -0
- package/dist/engine/input-attachments.d.ts +1 -1
- package/dist/engine/model-facade.d.ts +3 -3
- package/dist/engine/model-facade.js +15 -14
- package/dist/engine/permission-controller.d.ts +55 -0
- package/dist/engine/permission-controller.js +148 -0
- package/dist/engine/prompt-cache-diagnostics.d.ts +58 -0
- package/dist/engine/prompt-cache-diagnostics.js +178 -0
- package/dist/engine/run-accounting.d.ts +41 -0
- package/dist/engine/run-accounting.js +126 -0
- package/dist/engine/run-context.d.ts +44 -0
- package/dist/engine/run-context.js +88 -0
- package/dist/engine/run-environment.d.ts +30 -0
- package/dist/engine/run-environment.js +77 -0
- package/dist/engine/run-finalize.d.ts +58 -0
- package/dist/engine/run-finalize.js +245 -0
- package/dist/engine/run-goal.d.ts +58 -0
- package/dist/engine/run-goal.js +188 -0
- package/dist/engine/run-image-input.d.ts +1 -1
- package/dist/engine/run-image-input.js +5 -3
- package/dist/engine/run-session-open.d.ts +41 -0
- package/dist/engine/run-session-open.js +186 -0
- package/dist/engine/run-setup.d.ts +42 -0
- package/dist/engine/run-setup.js +58 -0
- package/dist/engine/run-tooling.d.ts +125 -0
- package/dist/engine/run-tooling.js +283 -0
- package/dist/engine/run-types.d.ts +139 -0
- package/dist/engine/run-types.js +12 -0
- package/dist/engine/run-workspace.d.ts +50 -0
- package/dist/engine/run-workspace.js +114 -0
- package/dist/engine/steer-queue.d.ts +1 -1
- package/dist/engine/subagent-spawner.d.ts +32 -0
- package/dist/engine/subagent-spawner.js +287 -0
- package/dist/engine/tool-summary.d.ts +2 -2
- package/dist/engine/tool-summary.js +2 -2
- package/dist/engine/turn-loop.d.ts +49 -10
- package/dist/engine/turn-loop.js +370 -104
- package/dist/engine/types.d.ts +30 -3
- package/dist/engine/types.js +1 -1
- package/dist/{engine/goal.d.ts → goal/lifecycle.d.ts} +76 -4
- package/dist/goal/lifecycle.js +482 -0
- package/dist/hooks/events.d.ts +24 -10
- package/dist/hooks/goal-stop-hook.d.ts +17 -28
- package/dist/hooks/goal-stop-hook.js +110 -465
- package/dist/hooks/registry.js +1 -1
- package/dist/index.d.ts +48 -108
- package/dist/index.extension.d.ts +51 -0
- package/dist/index.extension.js +39 -0
- package/dist/index.internal.d.ts +86 -0
- package/dist/index.internal.js +92 -0
- package/dist/index.js +34 -123
- package/dist/links/cli.d.ts +48 -0
- package/dist/links/cli.js +617 -0
- package/dist/links/http.d.ts +40 -0
- package/dist/links/http.js +166 -0
- package/dist/links/index.d.ts +4 -0
- package/dist/links/index.js +3 -0
- package/dist/links/link-action-tool.d.ts +5 -0
- package/dist/links/link-action-tool.js +241 -0
- package/dist/links/providers.d.ts +8 -0
- package/dist/links/providers.js +665 -0
- package/dist/links/types.d.ts +44 -0
- package/dist/llm/client-base.d.ts +7 -0
- package/dist/llm/client-base.js +60 -0
- package/dist/llm/model-pool.d.ts +1 -1
- package/dist/llm/model-pool.js +1 -1
- package/dist/llm/providers/anthropic.d.ts +1 -0
- package/dist/llm/providers/anthropic.js +9 -0
- package/dist/llm/providers/openai.d.ts +1 -0
- package/dist/llm/providers/openai.js +17 -0
- package/dist/model-catalog/index.js +15 -2
- package/dist/model-catalog/resolve.d.ts +13 -1
- package/dist/model-catalog/resolve.js +37 -2
- package/dist/model-catalog/types.d.ts +74 -48
- package/dist/model-catalog/types.js +16 -5
- package/dist/model-catalog/upsert.d.ts +3 -1
- package/dist/model-catalog/upsert.js +9 -0
- package/dist/onboarding.d.ts +0 -1
- package/dist/onboarding.js +1 -22
- package/dist/panel-apps/bindings.d.ts +24 -0
- package/dist/panel-apps/bindings.js +69 -0
- package/dist/panel-apps/github-archive.d.ts +21 -0
- package/dist/panel-apps/github-archive.js +98 -0
- package/dist/panel-apps/index.d.ts +4 -0
- package/dist/panel-apps/index.js +4 -0
- package/dist/panel-apps/installer.d.ts +68 -0
- package/dist/panel-apps/installer.js +622 -0
- package/dist/panel-apps/manifest.d.ts +364 -0
- package/dist/panel-apps/manifest.js +189 -0
- package/dist/panel-apps/paths.d.ts +13 -0
- package/dist/panel-apps/paths.js +38 -0
- package/dist/panel-apps/registry.d.ts +51 -0
- package/dist/panel-apps/registry.js +99 -0
- package/dist/panel-apps/runtime.d.ts +80 -0
- package/dist/panel-apps/runtime.js +154 -0
- package/dist/plugins/gitOps.js +8 -1
- package/dist/plugins/installedPlugins.d.ts +2 -1
- package/dist/plugins/installedPlugins.js +146 -8
- package/dist/plugins/installer/codex/convertAgents.d.ts +4 -1
- package/dist/plugins/installer/codex/convertAgents.js +62 -8
- package/dist/plugins/installer/codex/convertCommands.d.ts +5 -5
- package/dist/plugins/installer/codex/convertCommands.js +35 -12
- package/dist/plugins/installer/codex/convertHooks.d.ts +10 -0
- package/dist/plugins/installer/codex/convertHooks.js +82 -0
- package/dist/plugins/installer/codex/convertSkills.js +41 -6
- package/dist/plugins/installer/install.d.ts +7 -1
- package/dist/plugins/installer/install.js +21 -87
- package/dist/plugins/installer/installFromArchive.d.ts +26 -4
- package/dist/plugins/installer/installFromArchive.js +44 -27
- package/dist/plugins/installer/installFromNpm.d.ts +31 -0
- package/dist/plugins/installer/installFromNpm.js +273 -0
- package/dist/plugins/installer/loadPluginAgents.js +17 -4
- package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
- package/dist/plugins/installer/loadPluginMcp.js +245 -35
- package/dist/plugins/installer/normalizeManifest.d.ts +13 -0
- package/dist/plugins/installer/normalizeManifest.js +306 -0
- package/dist/plugins/installer/npmTar.d.ts +13 -0
- package/dist/plugins/installer/npmTar.js +321 -0
- package/dist/plugins/installer/parseSource.d.ts +11 -0
- package/dist/plugins/installer/parseSource.js +48 -0
- package/dist/plugins/installer/preview.d.ts +101 -0
- package/dist/plugins/installer/preview.js +336 -0
- package/dist/plugins/installer/projectPluginSource.d.ts +14 -0
- package/dist/plugins/installer/projectPluginSource.js +140 -0
- package/dist/plugins/installer/types.d.ts +775 -0
- package/dist/plugins/installer/types.js +100 -0
- package/dist/plugins/installer/unzip.d.ts +11 -0
- package/dist/plugins/installer/unzip.js +123 -9
- package/dist/plugins/installer/update.d.ts +2 -2
- package/dist/plugins/installer/update.js +43 -4
- package/dist/plugins/loadPluginHooks.d.ts +19 -2
- package/dist/plugins/loadPluginHooks.js +97 -86
- package/dist/plugins/pluginAutomationTemplates.d.ts +18 -0
- package/dist/plugins/pluginAutomationTemplates.js +50 -0
- package/dist/plugins/pluginCatalog.d.ts +45 -0
- package/dist/plugins/pluginCatalog.js +87 -0
- package/dist/plugins/pluginCommandHook.d.ts +6 -0
- package/dist/plugins/pluginCommandHook.js +25 -8
- package/dist/plugins/pluginCommandsLoader.d.ts +19 -0
- package/dist/plugins/pluginCommandsLoader.js +181 -7
- package/dist/plugins/pluginContent.d.ts +10 -1
- package/dist/plugins/pluginContent.js +87 -30
- package/dist/plugins/pluginHookApproval.d.ts +30 -0
- package/dist/plugins/pluginHookApproval.js +160 -0
- package/dist/plugins/pluginHookIntegrity.d.ts +69 -0
- package/dist/plugins/pluginHookIntegrity.js +361 -0
- package/dist/plugins/pluginInstaller.js +71 -12
- package/dist/plugins/pluginMcpApproval.d.ts +19 -0
- package/dist/plugins/pluginMcpApproval.js +110 -0
- package/dist/plugins/pluginMcpIntegrity.d.ts +21 -0
- package/dist/plugins/pluginMcpIntegrity.js +74 -0
- package/dist/plugins/types.d.ts +30 -0
- package/dist/plugins/varRewrite.d.ts +9 -5
- package/dist/plugins/varRewrite.js +26 -17
- package/dist/preset/index.d.ts +11 -8
- package/dist/preset/index.js +62 -203
- package/dist/product/define.js +9 -3
- package/dist/product/types.d.ts +0 -2
- package/dist/profile/activation.d.ts +36 -0
- package/dist/profile/activation.js +57 -0
- package/dist/profile/catalog-store.d.ts +77 -0
- package/dist/profile/catalog-store.js +346 -0
- package/dist/profile/catalog.d.ts +54 -0
- package/dist/profile/catalog.js +152 -0
- package/dist/profile/index.d.ts +7 -0
- package/dist/profile/index.js +7 -0
- package/dist/profile/requirements.d.ts +76 -0
- package/dist/profile/requirements.js +117 -0
- package/dist/profile/resolve.d.ts +11 -0
- package/dist/profile/resolve.js +41 -0
- package/dist/profile/store.d.ts +17 -0
- package/dist/profile/store.js +167 -0
- package/dist/profile/types.d.ts +321 -0
- package/dist/profile/types.js +104 -0
- package/dist/prompt/composer.d.ts +46 -7
- package/dist/prompt/composer.js +78 -48
- package/dist/prompt/instruction-scanner.d.ts +6 -5
- package/dist/prompt/instruction-scanner.js +8 -23
- package/dist/prompt/section-loader.d.ts +2 -2
- package/dist/prompt/section-loader.js +7 -4
- package/dist/prompt/sections/browser.md +10 -9
- package/dist/prompt/sections/harness-base.md +9 -0
- package/dist/protocol/chat-session-manager.d.ts +64 -1
- package/dist/protocol/chat-session-manager.js +104 -0
- package/dist/protocol/chat-session.d.ts +61 -10
- package/dist/protocol/chat-session.js +135 -25
- package/dist/protocol/client.d.ts +33 -3
- package/dist/protocol/client.js +96 -5
- package/dist/protocol/index.d.ts +2 -2
- package/dist/protocol/index.js +2 -2
- package/dist/protocol/mobile-remote-types.d.ts +406 -0
- package/dist/protocol/mobile-remote-types.js +1 -0
- package/dist/protocol/server.d.ts +127 -3
- package/dist/protocol/server.js +1309 -182
- package/dist/protocol/types.d.ts +152 -34
- package/dist/protocol/types.js +16 -0
- package/dist/run/ArtifactTracker.d.ts +6 -1
- package/dist/run/ArtifactTracker.js +29 -21
- package/dist/run/EngineRunner.d.ts +2 -0
- package/dist/run/EngineRunner.js +1 -0
- package/dist/run/RunManager.d.ts +26 -0
- package/dist/run/RunManager.js +82 -11
- package/dist/run/factory.d.ts +3 -0
- package/dist/run/factory.js +2 -0
- package/dist/runtime/safe-spawn.d.ts +6 -0
- package/dist/runtime/safe-spawn.js +8 -13
- package/dist/services/auto-dream.d.ts +13 -1
- package/dist/services/auto-dream.js +56 -8
- package/dist/services/dream-consolidation.js +10 -1
- package/dist/services/memory-orchestrator.js +6 -2
- package/dist/services/oauth.js +4 -1
- package/dist/services/session-memory.d.ts +4 -4
- package/dist/services/session-memory.js +13 -10
- package/dist/session/memory.d.ts +26 -7
- package/dist/session/memory.js +79 -21
- package/dist/session/session-manager.d.ts +182 -28
- package/dist/session/session-manager.js +910 -130
- package/dist/session/session-message.d.ts +22 -0
- package/dist/session/session-message.js +1 -0
- package/dist/session/transcript.d.ts +46 -5
- package/dist/session/transcript.js +159 -3
- package/dist/settings/feature-flags.d.ts +40 -0
- package/dist/settings/feature-flags.js +40 -0
- package/dist/settings/manager.d.ts +39 -1
- package/dist/settings/manager.js +102 -41
- package/dist/settings/migrate-config.js +4 -2
- package/dist/settings/schema.d.ts +511 -177
- package/dist/settings/schema.js +98 -25
- package/dist/skills/scanner.d.ts +6 -2
- package/dist/skills/scanner.js +160 -9
- package/dist/sources/adapter.d.ts +14 -0
- package/dist/sources/adapter.js +7 -0
- package/dist/sources/adapters/local-files.d.ts +10 -0
- package/dist/sources/adapters/local-files.js +127 -0
- package/dist/sources/adapters/mcp-resource.d.ts +17 -0
- package/dist/sources/adapters/mcp-resource.js +41 -0
- package/dist/sources/adapters/mock.d.ts +3 -0
- package/dist/sources/adapters/mock.js +29 -0
- package/dist/sources/binding.d.ts +6 -0
- package/dist/sources/binding.js +24 -0
- package/dist/sources/catalog.d.ts +6 -0
- package/dist/sources/catalog.js +64 -0
- package/dist/sources/context-summary.d.ts +8 -0
- package/dist/sources/context-summary.js +13 -0
- package/dist/sources/credential-status.d.ts +2 -0
- package/dist/sources/credential-status.js +13 -0
- package/dist/sources/index.d.ts +10 -0
- package/dist/sources/index.js +10 -0
- package/dist/sources/resolve.d.ts +28 -0
- package/dist/sources/resolve.js +47 -0
- package/dist/sources/truncate-utf8.d.ts +7 -0
- package/dist/sources/truncate-utf8.js +18 -0
- package/dist/sources/types.d.ts +71 -0
- package/dist/sources/types.js +26 -0
- package/dist/testing/fetch-stub.d.ts +32 -0
- package/dist/testing/fetch-stub.js +24 -0
- package/dist/themes/image.d.ts +18 -0
- package/dist/themes/image.js +117 -0
- package/dist/themes/index.d.ts +4 -0
- package/dist/themes/index.js +4 -0
- package/dist/themes/installer.d.ts +50 -0
- package/dist/themes/installer.js +290 -0
- package/dist/themes/manifest.d.ts +102 -0
- package/dist/themes/manifest.js +86 -0
- package/dist/themes/paths.d.ts +14 -0
- package/dist/themes/paths.js +33 -0
- package/dist/tool-system/browser-bridge.d.ts +53 -11
- package/dist/tool-system/browser-bridge.js +8 -9
- package/dist/tool-system/builtin/agent-heartbeat.d.ts +2 -2
- package/dist/tool-system/builtin/agent-heartbeat.js +20 -6
- package/dist/tool-system/builtin/agent-notifications.d.ts +127 -72
- package/dist/tool-system/builtin/agent-notifications.js +291 -101
- package/dist/tool-system/builtin/agent-output-file.js +1 -3
- package/dist/tool-system/builtin/agent-progress.d.ts +6 -0
- package/dist/tool-system/builtin/agent-progress.js +83 -0
- package/dist/tool-system/builtin/agent-registry.d.ts +38 -2
- package/dist/tool-system/builtin/agent-registry.js +178 -9
- package/dist/tool-system/builtin/agent-transcript-translator.js +1 -1
- package/dist/tool-system/builtin/agent.d.ts +2 -0
- package/dist/tool-system/builtin/agent.js +274 -33
- package/dist/tool-system/builtin/background-jobs.d.ts +55 -2
- package/dist/tool-system/builtin/background-jobs.js +96 -4
- package/dist/tool-system/builtin/background-work.d.ts +6 -0
- package/dist/tool-system/builtin/background-work.js +8 -1
- package/dist/tool-system/builtin/bash.js +5 -2
- package/dist/tool-system/builtin/browser-tools.d.ts +6 -3
- package/dist/tool-system/builtin/browser-tools.js +89 -23
- package/dist/tool-system/builtin/edit-model-catalog.d.ts +6 -0
- package/dist/tool-system/builtin/edit-model-catalog.js +172 -12
- package/dist/tool-system/builtin/edit.js +2 -6
- package/dist/tool-system/builtin/file-cache.d.ts +2 -0
- package/dist/tool-system/builtin/file-cache.js +4 -0
- package/dist/tool-system/builtin/generate-image.js +17 -10
- package/dist/tool-system/builtin/generate-video.js +26 -7
- package/dist/tool-system/builtin/grep.js +2 -2
- package/dist/tool-system/builtin/image-uploader.js +7 -1
- package/dist/tool-system/builtin/index.d.ts +32 -7
- package/dist/tool-system/builtin/index.js +237 -167
- package/dist/tool-system/builtin/memory.d.ts +6 -0
- package/dist/tool-system/builtin/memory.js +36 -15
- package/dist/tool-system/builtin/panel.d.ts +9 -0
- package/dist/tool-system/builtin/panel.js +314 -0
- package/dist/tool-system/builtin/read.js +5 -1
- package/dist/tool-system/builtin/send-message-to-session.d.ts +6 -0
- package/dist/tool-system/builtin/send-message-to-session.js +67 -0
- package/dist/tool-system/builtin/sources.d.ts +8 -0
- package/dist/tool-system/builtin/sources.js +137 -0
- package/dist/tool-system/builtin/tool-search.js +7 -2
- package/dist/tool-system/builtin/update-automation-memory.js +2 -0
- package/dist/tool-system/builtin/web-fetch.js +17 -13
- package/dist/tool-system/builtin/web-search.js +1 -3
- package/dist/tool-system/capability-module.d.ts +93 -0
- package/dist/tool-system/capability-module.js +53 -0
- package/dist/tool-system/context.d.ts +77 -19
- package/dist/tool-system/executor.js +75 -50
- package/dist/tool-system/external-tool-exposure.d.ts +60 -0
- package/dist/tool-system/external-tool-exposure.js +304 -0
- package/dist/tool-system/mcp-manager.d.ts +11 -1
- package/dist/tool-system/mcp-manager.js +19 -4
- package/dist/tool-system/mcp-tool-policy.d.ts +9 -0
- package/dist/tool-system/mcp-tool-policy.js +34 -0
- package/dist/tool-system/panel-bridge.d.ts +53 -0
- package/dist/tool-system/panel-bridge.js +1 -0
- package/dist/tool-system/path-policy.js +99 -2
- package/dist/tool-system/permission.d.ts +26 -0
- package/dist/tool-system/permission.js +46 -0
- package/dist/tool-system/registry.d.ts +12 -1
- package/dist/tool-system/registry.js +31 -7
- package/dist/tool-system/sandbox/index.js +3 -8
- package/dist/tool-system/sandbox/seatbelt.js +2 -6
- package/dist/tool-system/session-tool-host.d.ts +139 -0
- package/dist/tool-system/session-tool-host.js +167 -0
- package/dist/tool-system/testing/tool-registry-harness.d.ts +31 -0
- package/dist/tool-system/testing/tool-registry-harness.js +51 -0
- package/dist/tool-system/validation.d.ts +14 -7
- package/dist/tool-system/validation.js +701 -7
- package/dist/types.d.ts +186 -20
- package/dist/{cc-orchestrator → utils}/cwd-normalize.d.ts +1 -0
- package/dist/{cc-orchestrator → utils}/cwd-normalize.js +1 -0
- package/dist/utils/file-mutex.d.ts +65 -0
- package/dist/utils/file-mutex.js +145 -0
- package/dist/utils/json.d.ts +2 -4
- package/dist/utils/json.js +2 -4
- package/dist/utils/lockfile.d.ts +30 -1
- package/dist/utils/lockfile.js +2 -2
- package/dist/utils/secret-scrubber.d.ts +8 -0
- package/dist/utils/secret-scrubber.js +227 -0
- package/dist/utils/toolDisplay.js +1 -1
- package/package.json +20 -5
- package/THIRD_PARTY_NOTICES.md +0 -206
- package/dist/arena/arena.d.ts +0 -45
- package/dist/arena/arena.js +0 -362
- package/dist/arena/context/context-tools.d.ts +0 -16
- package/dist/arena/context/context-tools.js +0 -272
- package/dist/arena/context/within-root.d.ts +0 -7
- package/dist/arena/context/within-root.js +0 -15
- package/dist/arena/detect-mode.d.ts +0 -20
- package/dist/arena/detect-mode.js +0 -78
- package/dist/arena/digest-builder.d.ts +0 -25
- package/dist/arena/digest-builder.js +0 -120
- package/dist/arena/index.d.ts +0 -29
- package/dist/arena/index.js +0 -29
- package/dist/arena/iterate/convergence.d.ts +0 -25
- package/dist/arena/iterate/convergence.js +0 -103
- package/dist/arena/iterate/formats/index.d.ts +0 -22
- package/dist/arena/iterate/formats/index.js +0 -283
- package/dist/arena/iterate/index.d.ts +0 -11
- package/dist/arena/iterate/index.js +0 -9
- package/dist/arena/iterate/iterative-arena.d.ts +0 -23
- package/dist/arena/iterate/iterative-arena.js +0 -237
- package/dist/arena/iterate/parse.d.ts +0 -42
- package/dist/arena/iterate/parse.js +0 -123
- package/dist/arena/iterate/phases/argue.d.ts +0 -22
- package/dist/arena/iterate/phases/argue.js +0 -165
- package/dist/arena/iterate/phases/revise.d.ts +0 -16
- package/dist/arena/iterate/phases/revise.js +0 -62
- package/dist/arena/iterate/phases/tournament.d.ts +0 -34
- package/dist/arena/iterate/phases/tournament.js +0 -113
- package/dist/arena/iterate/tools/web-tools.d.ts +0 -13
- package/dist/arena/iterate/tools/web-tools.js +0 -54
- package/dist/arena/iterate/types.d.ts +0 -152
- package/dist/arena/iterate/types.js +0 -8
- package/dist/arena/ledger.d.ts +0 -47
- package/dist/arena/ledger.js +0 -159
- package/dist/arena/lenses/architecture.d.ts +0 -5
- package/dist/arena/lenses/architecture.js +0 -22
- package/dist/arena/lenses/engineering.d.ts +0 -5
- package/dist/arena/lenses/engineering.js +0 -22
- package/dist/arena/lenses/general.d.ts +0 -5
- package/dist/arena/lenses/general.js +0 -20
- package/dist/arena/lenses/index.d.ts +0 -16
- package/dist/arena/lenses/index.js +0 -47
- package/dist/arena/lenses/product.d.ts +0 -5
- package/dist/arena/lenses/product.js +0 -22
- package/dist/arena/model-presets.d.ts +0 -23
- package/dist/arena/model-presets.js +0 -44
- package/dist/arena/phases/adjudication.d.ts +0 -25
- package/dist/arena/phases/adjudication.js +0 -142
- package/dist/arena/phases/build-consensus.d.ts +0 -30
- package/dist/arena/phases/build-consensus.js +0 -85
- package/dist/arena/phases/claim-registry.d.ts +0 -26
- package/dist/arena/phases/claim-registry.js +0 -60
- package/dist/arena/phases/cross-review.d.ts +0 -47
- package/dist/arena/phases/cross-review.js +0 -224
- package/dist/arena/phases/debate-rounds.d.ts +0 -28
- package/dist/arena/phases/debate-rounds.js +0 -161
- package/dist/arena/phases/participant-research.d.ts +0 -39
- package/dist/arena/phases/participant-research.js +0 -316
- package/dist/arena/phases/planning-detail-expansion.d.ts +0 -39
- package/dist/arena/phases/planning-detail-expansion.js +0 -120
- package/dist/arena/planner.d.ts +0 -28
- package/dist/arena/planner.js +0 -312
- package/dist/arena/providers/docs.d.ts +0 -7
- package/dist/arena/providers/docs.js +0 -111
- package/dist/arena/providers/git.d.ts +0 -8
- package/dist/arena/providers/git.js +0 -174
- package/dist/arena/providers/index.d.ts +0 -32
- package/dist/arena/providers/index.js +0 -132
- package/dist/arena/providers/none.d.ts +0 -7
- package/dist/arena/providers/none.js +0 -11
- package/dist/arena/providers/repo.d.ts +0 -7
- package/dist/arena/providers/repo.js +0 -258
- package/dist/arena/render/session.d.ts +0 -17
- package/dist/arena/render/session.js +0 -190
- package/dist/arena/render/terminal.d.ts +0 -34
- package/dist/arena/render/terminal.js +0 -286
- package/dist/arena/strategies/discussion.d.ts +0 -25
- package/dist/arena/strategies/discussion.js +0 -143
- package/dist/arena/strategies/index.d.ts +0 -15
- package/dist/arena/strategies/index.js +0 -28
- package/dist/arena/strategies/language-wrapper.d.ts +0 -17
- package/dist/arena/strategies/language-wrapper.js +0 -102
- package/dist/arena/strategies/lens-wrapper.d.ts +0 -16
- package/dist/arena/strategies/lens-wrapper.js +0 -236
- package/dist/arena/strategies/planning.d.ts +0 -30
- package/dist/arena/strategies/planning.js +0 -225
- package/dist/arena/strategies/review.d.ts +0 -26
- package/dist/arena/strategies/review.js +0 -168
- package/dist/arena/strategies/utils.d.ts +0 -36
- package/dist/arena/strategies/utils.js +0 -603
- package/dist/arena/tools/selector.d.ts +0 -17
- package/dist/arena/tools/selector.js +0 -61
- package/dist/arena/transitions.d.ts +0 -53
- package/dist/arena/transitions.js +0 -97
- package/dist/arena/types.d.ts +0 -518
- package/dist/arena/types.js +0 -27
- package/dist/cc-orchestrator/agent-adapter.d.ts +0 -54
- package/dist/cc-orchestrator/agent-adapter.js +0 -143
- package/dist/cc-orchestrator/cc-capability.d.ts +0 -19
- package/dist/cc-orchestrator/cc-capability.js +0 -53
- package/dist/cc-orchestrator/codex-session-discovery.d.ts +0 -24
- package/dist/cc-orchestrator/codex-session-discovery.js +0 -191
- package/dist/cc-orchestrator/codex-session-history.d.ts +0 -38
- package/dist/cc-orchestrator/codex-session-history.js +0 -247
- package/dist/cc-orchestrator/external-agent-bindings.d.ts +0 -27
- package/dist/cc-orchestrator/external-agent-bindings.js +0 -150
- package/dist/cc-orchestrator/external-agent-changes.d.ts +0 -19
- package/dist/cc-orchestrator/external-agent-changes.js +0 -231
- package/dist/cc-orchestrator/external-agent-driver.d.ts +0 -19
- package/dist/cc-orchestrator/external-agent-driver.js +0 -284
- package/dist/cc-orchestrator/external-agent-session-store.d.ts +0 -23
- package/dist/cc-orchestrator/external-agent-session-store.js +0 -146
- package/dist/cc-orchestrator/index.d.ts +0 -8
- package/dist/cc-orchestrator/index.js +0 -8
- package/dist/cc-orchestrator/relevance-judge.d.ts +0 -15
- package/dist/cc-orchestrator/relevance-judge.js +0 -29
- package/dist/cc-orchestrator/session-discovery.d.ts +0 -46
- package/dist/cc-orchestrator/session-discovery.js +0 -125
- package/dist/cc-orchestrator/session-history.d.ts +0 -54
- package/dist/cc-orchestrator/session-history.js +0 -150
- package/dist/cron/cron-runtime.d.ts +0 -2
- package/dist/cron/cron-runtime.js +0 -2
- package/dist/cron/cron-store.d.ts +0 -2
- package/dist/cron/cron-store.js +0 -2
- package/dist/cron/scheduler.d.ts +0 -7
- package/dist/cron/scheduler.js +0 -7
- package/dist/engine/goal.js +0 -206
- package/dist/external-agents/config.d.ts +0 -2
- package/dist/external-agents/config.js +0 -15
- package/dist/external-agents/types.d.ts +0 -31
- package/dist/git/parse-log.d.ts +0 -13
- package/dist/git/parse-log.js +0 -21
- package/dist/git/utils.d.ts +0 -49
- package/dist/git/utils.js +0 -161
- package/dist/git/worktree/crud.d.ts +0 -72
- package/dist/git/worktree/crud.js +0 -235
- package/dist/git/worktree/diff.d.ts +0 -14
- package/dist/git/worktree/diff.js +0 -82
- package/dist/git/worktree/git-exec.d.ts +0 -7
- package/dist/git/worktree/git-exec.js +0 -87
- package/dist/git/worktree/index.d.ts +0 -5
- package/dist/git/worktree/index.js +0 -5
- package/dist/git/worktree/query.d.ts +0 -43
- package/dist/git/worktree/query.js +0 -128
- package/dist/git/worktree/slug.d.ts +0 -11
- package/dist/git/worktree/slug.js +0 -58
- package/dist/git/worktree.d.ts +0 -1
- package/dist/git/worktree.js +0 -5
- package/dist/lsp/client.d.ts +0 -41
- package/dist/lsp/client.js +0 -186
- package/dist/lsp/manager.d.ts +0 -40
- package/dist/lsp/manager.js +0 -155
- package/dist/lsp/root-path.d.ts +0 -9
- package/dist/lsp/root-path.js +0 -12
- package/dist/lsp/servers.d.ts +0 -16
- package/dist/lsp/servers.js +0 -60
- package/dist/prompt/sections/coding.md +0 -35
- package/dist/quota/credentials.d.ts +0 -3
- package/dist/quota/credentials.js +0 -80
- package/dist/quota/index.d.ts +0 -36
- package/dist/quota/index.js +0 -155
- package/dist/quota/types.d.ts +0 -48
- package/dist/quota/types.js +0 -13
- package/dist/review/review-prompt.d.ts +0 -28
- package/dist/review/review-prompt.js +0 -81
- package/dist/state.d.ts +0 -160
- package/dist/state.js +0 -267
- package/dist/tool-system/builtin/apply-patch/applier.d.ts +0 -26
- package/dist/tool-system/builtin/apply-patch/applier.js +0 -308
- package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +0 -10
- package/dist/tool-system/builtin/apply-patch/backup-targets.js +0 -30
- package/dist/tool-system/builtin/apply-patch/index.d.ts +0 -20
- package/dist/tool-system/builtin/apply-patch/index.js +0 -105
- package/dist/tool-system/builtin/apply-patch/parser.d.ts +0 -17
- package/dist/tool-system/builtin/apply-patch/parser.js +0 -212
- package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +0 -18
- package/dist/tool-system/builtin/apply-patch/seek-sequence.js +0 -123
- package/dist/tool-system/builtin/apply-patch/types.d.ts +0 -49
- package/dist/tool-system/builtin/apply-patch/types.js +0 -13
- package/dist/tool-system/builtin/arena.d.ts +0 -31
- package/dist/tool-system/builtin/arena.js +0 -416
- package/dist/tool-system/builtin/brief.d.ts +0 -6
- package/dist/tool-system/builtin/brief.js +0 -41
- package/dist/tool-system/builtin/check-quota.d.ts +0 -15
- package/dist/tool-system/builtin/check-quota.js +0 -34
- package/dist/tool-system/builtin/drive-claude-code.d.ts +0 -51
- package/dist/tool-system/builtin/drive-claude-code.js +0 -698
- package/dist/tool-system/builtin/lsp.d.ts +0 -7
- package/dist/tool-system/builtin/lsp.js +0 -144
- package/dist/tool-system/builtin/notebook-edit.d.ts +0 -7
- package/dist/tool-system/builtin/notebook-edit.js +0 -127
- package/dist/tool-system/builtin/worktree.d.ts +0 -11
- package/dist/tool-system/builtin/worktree.js +0 -363
- /package/dist/{external-agents → links}/types.js +0 -0
- /package/dist/{engine/session-usage.d.ts → session/usage.d.ts} +0 -0
- /package/dist/{engine/session-usage.js → session/usage.js} +0 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
type PetState = "idle" | "running" | "alert";
|
|
2
|
+
type WallpaperMode = "light" | "dark";
|
|
3
|
+
export interface ThemePreview {
|
|
4
|
+
id: string;
|
|
5
|
+
name: string;
|
|
6
|
+
version: string;
|
|
7
|
+
hasColors: boolean;
|
|
8
|
+
petStates: PetState[];
|
|
9
|
+
wallpaperModes: WallpaperMode[];
|
|
10
|
+
/** The pack's primary color (for the picker swatch), if it overrides one. */
|
|
11
|
+
swatch?: string;
|
|
12
|
+
/** Content digest bound to a subsequent install to detect mid-review changes. */
|
|
13
|
+
reviewToken: string;
|
|
14
|
+
warnings: string[];
|
|
15
|
+
}
|
|
16
|
+
/** An installed theme as the host exposes it to the renderer. */
|
|
17
|
+
export interface InstalledTheme {
|
|
18
|
+
id: string;
|
|
19
|
+
name: string;
|
|
20
|
+
version: string;
|
|
21
|
+
colors: {
|
|
22
|
+
light: Record<string, string>;
|
|
23
|
+
dark: Record<string, string>;
|
|
24
|
+
};
|
|
25
|
+
pet: Partial<Record<PetState, string>> & {
|
|
26
|
+
walk?: string[];
|
|
27
|
+
};
|
|
28
|
+
wallpaper?: {
|
|
29
|
+
light?: string;
|
|
30
|
+
dark?: string;
|
|
31
|
+
opacity?: number;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Validate a theme pack directory and return a preview + review-token. Does not
|
|
36
|
+
* write anything. `sourceDir` is a directory (a zip is extracted to a temp dir
|
|
37
|
+
* by the caller before calling this).
|
|
38
|
+
*/
|
|
39
|
+
export declare function previewLocalTheme(sourceDir: string): Promise<ThemePreview>;
|
|
40
|
+
/**
|
|
41
|
+
* Install a previously previewed theme. Re-validates and re-checks the token
|
|
42
|
+
* (rejecting mid-review changes), then atomically writes the theme to
|
|
43
|
+
* ~/.code-shell/themes/<id>/ and records it in the registry.
|
|
44
|
+
*/
|
|
45
|
+
export declare function installReviewedLocalTheme(sourceDir: string, reviewToken: string): Promise<InstalledTheme>;
|
|
46
|
+
/** Read all installed themes (manifest re-read from disk), skipping broken ones. */
|
|
47
|
+
export declare function listInstalledThemes(): Promise<InstalledTheme[]>;
|
|
48
|
+
/** Remove an installed theme and its registry entry. */
|
|
49
|
+
export declare function uninstallTheme(id: string): Promise<void>;
|
|
50
|
+
export {};
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Theme-pack installer: validate → normalize → atomically install a local theme
|
|
3
|
+
* pack into ~/.code-shell/themes/<id>/, and read/uninstall installed packs.
|
|
4
|
+
*
|
|
5
|
+
* Mirrors the plugin installer's discipline (safe names, canonical asset paths,
|
|
6
|
+
* review-token double-check, temp-dir + rename atomicity) but is deliberately
|
|
7
|
+
* self-contained and static-only: a theme pack is a manifest + images, never
|
|
8
|
+
* executable content, so there are no hooks/mcp/skills to approve.
|
|
9
|
+
*/
|
|
10
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
11
|
+
import { mkdir, mkdtemp, readFile, readdir, realpath, rename, rm, stat, writeFile, } from "node:fs/promises";
|
|
12
|
+
import { dirname, join, resolve } from "node:path";
|
|
13
|
+
import { detectThemeImage } from "./image.js";
|
|
14
|
+
import { parseThemeManifest } from "./manifest.js";
|
|
15
|
+
import { THEME_ASSET_DIR, ThemeInstallError, ThemeReviewChangedError, assertSafeThemeName, themeInstallDir, themesRegistryPath, themesRoot, } from "./paths.js";
|
|
16
|
+
const MANIFEST_FILE = ".cs-theme.json";
|
|
17
|
+
const MAX_ASSET_BYTES = 8 * 1024 * 1024;
|
|
18
|
+
async function readImageAsset(sourceDir, rel) {
|
|
19
|
+
const abs = resolve(sourceDir, rel);
|
|
20
|
+
if (!abs.startsWith(resolve(sourceDir) + "/") && abs !== resolve(sourceDir)) {
|
|
21
|
+
throw new ThemeInstallError(`asset escapes theme root: ${rel}`);
|
|
22
|
+
}
|
|
23
|
+
// The string check above stops literal traversal, but not a symlink INSIDE
|
|
24
|
+
// the pack pointing at an arbitrary file outside it. Resolve real paths and
|
|
25
|
+
// require the asset to physically live under the pack root, or a malicious
|
|
26
|
+
// pack could exfiltrate any readable file that happens to be a valid image.
|
|
27
|
+
let realRoot;
|
|
28
|
+
let realAbs;
|
|
29
|
+
try {
|
|
30
|
+
realRoot = await realpath(sourceDir);
|
|
31
|
+
realAbs = await realpath(abs);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
throw new ThemeInstallError(`asset not found: ${rel}`);
|
|
35
|
+
}
|
|
36
|
+
if (realAbs !== realRoot && !realAbs.startsWith(realRoot + "/")) {
|
|
37
|
+
throw new ThemeInstallError(`asset escapes theme root via symlink: ${rel}`);
|
|
38
|
+
}
|
|
39
|
+
let info;
|
|
40
|
+
try {
|
|
41
|
+
info = await stat(realAbs);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
throw new ThemeInstallError(`asset not found: ${rel}`);
|
|
45
|
+
}
|
|
46
|
+
if (!info.isFile())
|
|
47
|
+
throw new ThemeInstallError(`asset is not a file: ${rel}`);
|
|
48
|
+
if (info.size > MAX_ASSET_BYTES)
|
|
49
|
+
throw new ThemeInstallError(`asset too large: ${rel}`);
|
|
50
|
+
const bytes = await readFile(realAbs);
|
|
51
|
+
const detected = detectThemeImage(bytes);
|
|
52
|
+
if (!detected)
|
|
53
|
+
throw new ThemeInstallError(`asset is not a supported image: ${rel}`);
|
|
54
|
+
return { bytes, ext: detected.ext };
|
|
55
|
+
}
|
|
56
|
+
/** Collect the declared assets, validating each, into canonical-name mappings. */
|
|
57
|
+
async function resolveAssets(sourceDir, manifest) {
|
|
58
|
+
const assets = [];
|
|
59
|
+
const bytesByName = new Map();
|
|
60
|
+
const add = async (rel, base) => {
|
|
61
|
+
if (!rel)
|
|
62
|
+
return;
|
|
63
|
+
const { bytes, ext } = await readImageAsset(sourceDir, rel);
|
|
64
|
+
const canonicalName = `${base}.${ext}`;
|
|
65
|
+
assets.push({ sourceRel: rel, canonicalName });
|
|
66
|
+
bytesByName.set(canonicalName, bytes);
|
|
67
|
+
};
|
|
68
|
+
await add(manifest.pet?.idle, "pet-idle");
|
|
69
|
+
await add(manifest.pet?.running, "pet-running");
|
|
70
|
+
await add(manifest.pet?.alert, "pet-alert");
|
|
71
|
+
for (let i = 0; i < (manifest.pet?.walk?.length ?? 0); i += 1) {
|
|
72
|
+
await add(manifest.pet.walk[i], `pet-walk-${i + 1}`);
|
|
73
|
+
}
|
|
74
|
+
await add(manifest.wallpaper?.light, "wallpaper-light");
|
|
75
|
+
await add(manifest.wallpaper?.dark, "wallpaper-dark");
|
|
76
|
+
return { assets, bytesByName };
|
|
77
|
+
}
|
|
78
|
+
/** Deterministic digest over manifest + every canonical asset's bytes. */
|
|
79
|
+
function digestProjection(manifest, bytesByName) {
|
|
80
|
+
const hash = createHash("sha256");
|
|
81
|
+
hash.update(JSON.stringify(manifest));
|
|
82
|
+
for (const name of [...bytesByName.keys()].sort()) {
|
|
83
|
+
hash.update(name);
|
|
84
|
+
hash.update(bytesByName.get(name));
|
|
85
|
+
}
|
|
86
|
+
return hash.digest("hex");
|
|
87
|
+
}
|
|
88
|
+
async function loadManifest(sourceDir) {
|
|
89
|
+
let raw;
|
|
90
|
+
try {
|
|
91
|
+
raw = await readFile(join(sourceDir, MANIFEST_FILE), "utf-8");
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
throw new ThemeInstallError(`missing ${MANIFEST_FILE}`);
|
|
95
|
+
}
|
|
96
|
+
let json;
|
|
97
|
+
try {
|
|
98
|
+
json = JSON.parse(raw);
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
throw new ThemeInstallError(`${MANIFEST_FILE} is not valid JSON`);
|
|
102
|
+
}
|
|
103
|
+
return parseThemeManifest(json);
|
|
104
|
+
}
|
|
105
|
+
function previewOf(manifest, bytesByName, warnings) {
|
|
106
|
+
const petStates = ["idle", "running", "alert"].filter((s) => manifest.pet?.[s]);
|
|
107
|
+
const wallpaperModes = ["light", "dark"].filter((m) => manifest.wallpaper?.[m]);
|
|
108
|
+
return {
|
|
109
|
+
id: manifest.id,
|
|
110
|
+
name: manifest.name,
|
|
111
|
+
version: manifest.version,
|
|
112
|
+
hasColors: Boolean((manifest.colors?.light && Object.keys(manifest.colors.light).length) ||
|
|
113
|
+
(manifest.colors?.dark && Object.keys(manifest.colors.dark).length)),
|
|
114
|
+
petStates: [...petStates],
|
|
115
|
+
wallpaperModes: [...wallpaperModes],
|
|
116
|
+
...((manifest.colors?.light?.["--cs-primary"] ?? manifest.colors?.dark?.["--cs-primary"])
|
|
117
|
+
? {
|
|
118
|
+
swatch: (manifest.colors?.light?.["--cs-primary"] ??
|
|
119
|
+
manifest.colors?.dark?.["--cs-primary"]),
|
|
120
|
+
}
|
|
121
|
+
: {}),
|
|
122
|
+
reviewToken: digestProjection(manifest, bytesByName),
|
|
123
|
+
warnings,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Validate a theme pack directory and return a preview + review-token. Does not
|
|
128
|
+
* write anything. `sourceDir` is a directory (a zip is extracted to a temp dir
|
|
129
|
+
* by the caller before calling this).
|
|
130
|
+
*/
|
|
131
|
+
export async function previewLocalTheme(sourceDir) {
|
|
132
|
+
const manifest = await loadManifest(sourceDir);
|
|
133
|
+
assertSafeThemeName(manifest.id);
|
|
134
|
+
const warnings = [];
|
|
135
|
+
if (!manifest.colors && !manifest.pet && !manifest.wallpaper) {
|
|
136
|
+
warnings.push("theme declares no colors, pet sprites, or wallpaper");
|
|
137
|
+
}
|
|
138
|
+
const { bytesByName } = await resolveAssets(sourceDir, manifest);
|
|
139
|
+
return previewOf(manifest, bytesByName, warnings);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Install a previously previewed theme. Re-validates and re-checks the token
|
|
143
|
+
* (rejecting mid-review changes), then atomically writes the theme to
|
|
144
|
+
* ~/.code-shell/themes/<id>/ and records it in the registry.
|
|
145
|
+
*/
|
|
146
|
+
export async function installReviewedLocalTheme(sourceDir, reviewToken) {
|
|
147
|
+
const manifest = await loadManifest(sourceDir);
|
|
148
|
+
assertSafeThemeName(manifest.id);
|
|
149
|
+
const { assets, bytesByName } = await resolveAssets(sourceDir, manifest);
|
|
150
|
+
if (digestProjection(manifest, bytesByName) !== reviewToken)
|
|
151
|
+
throw new ThemeReviewChangedError();
|
|
152
|
+
const finalDir = themeInstallDir(manifest.id);
|
|
153
|
+
await mkdir(themesRoot(), { recursive: true, mode: 0o700 });
|
|
154
|
+
const staging = await mkdtemp(join(themesRoot(), `.tmp-${manifest.id}-`));
|
|
155
|
+
try {
|
|
156
|
+
// Rewrite the manifest to canonical asset paths, then stage assets.
|
|
157
|
+
const canonical = canonicalManifestFor(manifest, assets);
|
|
158
|
+
await writeFile(join(staging, MANIFEST_FILE), `${JSON.stringify(canonical, null, 2)}\n`, {
|
|
159
|
+
mode: 0o600,
|
|
160
|
+
});
|
|
161
|
+
await mkdir(join(staging, THEME_ASSET_DIR), { recursive: true, mode: 0o700 });
|
|
162
|
+
for (const asset of assets) {
|
|
163
|
+
await writeFile(join(staging, THEME_ASSET_DIR, asset.canonicalName), bytesByName.get(asset.canonicalName), {
|
|
164
|
+
mode: 0o600,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
await rm(finalDir, { recursive: true, force: true });
|
|
168
|
+
await rename(staging, finalDir);
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
await rm(staging, { recursive: true, force: true }).catch(() => undefined);
|
|
172
|
+
throw error;
|
|
173
|
+
}
|
|
174
|
+
await appendRegistryEntry({
|
|
175
|
+
id: manifest.id,
|
|
176
|
+
name: manifest.name,
|
|
177
|
+
version: manifest.version,
|
|
178
|
+
installedAt: Date.now(),
|
|
179
|
+
});
|
|
180
|
+
return toInstalledTheme(canonicalManifestFor(manifest, assets));
|
|
181
|
+
}
|
|
182
|
+
/** Canonical manifest stored on disk: asset fields point at THEME_ASSET_DIR/*. */
|
|
183
|
+
function canonicalManifestFor(manifest, assets) {
|
|
184
|
+
const nameFor = (base) => assets.find((a) => a.canonicalName.startsWith(`${base}.`))?.canonicalName;
|
|
185
|
+
const rel = (base) => {
|
|
186
|
+
const n = nameFor(base);
|
|
187
|
+
return n ? `${THEME_ASSET_DIR}/${n}` : undefined;
|
|
188
|
+
};
|
|
189
|
+
const walk = (manifest.pet?.walk ?? [])
|
|
190
|
+
.map((_, i) => rel(`pet-walk-${i + 1}`))
|
|
191
|
+
.filter((p) => Boolean(p));
|
|
192
|
+
const pet = manifest.pet
|
|
193
|
+
? {
|
|
194
|
+
...(rel("pet-idle") ? { idle: rel("pet-idle") } : {}),
|
|
195
|
+
...(rel("pet-running") ? { running: rel("pet-running") } : {}),
|
|
196
|
+
...(rel("pet-alert") ? { alert: rel("pet-alert") } : {}),
|
|
197
|
+
...(walk.length ? { walk } : {}),
|
|
198
|
+
}
|
|
199
|
+
: undefined;
|
|
200
|
+
const wallpaper = manifest.wallpaper
|
|
201
|
+
? {
|
|
202
|
+
...(rel("wallpaper-light") ? { light: rel("wallpaper-light") } : {}),
|
|
203
|
+
...(rel("wallpaper-dark") ? { dark: rel("wallpaper-dark") } : {}),
|
|
204
|
+
...(manifest.wallpaper.opacity !== undefined
|
|
205
|
+
? { opacity: manifest.wallpaper.opacity }
|
|
206
|
+
: {}),
|
|
207
|
+
}
|
|
208
|
+
: undefined;
|
|
209
|
+
return {
|
|
210
|
+
schemaVersion: 1,
|
|
211
|
+
id: manifest.id,
|
|
212
|
+
name: manifest.name,
|
|
213
|
+
version: manifest.version,
|
|
214
|
+
...(manifest.colors ? { colors: manifest.colors } : {}),
|
|
215
|
+
...(pet && Object.keys(pet).length ? { pet } : {}),
|
|
216
|
+
...(wallpaper && Object.keys(wallpaper).length ? { wallpaper } : {}),
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
function toInstalledTheme(manifest) {
|
|
220
|
+
return {
|
|
221
|
+
id: manifest.id,
|
|
222
|
+
name: manifest.name,
|
|
223
|
+
version: manifest.version,
|
|
224
|
+
colors: { light: manifest.colors?.light ?? {}, dark: manifest.colors?.dark ?? {} },
|
|
225
|
+
pet: {
|
|
226
|
+
...(manifest.pet?.idle ? { idle: manifest.pet.idle } : {}),
|
|
227
|
+
...(manifest.pet?.running ? { running: manifest.pet.running } : {}),
|
|
228
|
+
...(manifest.pet?.alert ? { alert: manifest.pet.alert } : {}),
|
|
229
|
+
...(manifest.pet?.walk?.length ? { walk: manifest.pet.walk } : {}),
|
|
230
|
+
},
|
|
231
|
+
...(manifest.wallpaper ? { wallpaper: manifest.wallpaper } : {}),
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
async function readRegistry() {
|
|
235
|
+
try {
|
|
236
|
+
const raw = await readFile(themesRegistryPath(), "utf-8");
|
|
237
|
+
const parsed = JSON.parse(raw);
|
|
238
|
+
if (parsed?.version === 1 && Array.isArray(parsed.themes))
|
|
239
|
+
return parsed;
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
/* missing/corrupt → empty */
|
|
243
|
+
}
|
|
244
|
+
return { version: 1, themes: [] };
|
|
245
|
+
}
|
|
246
|
+
async function writeRegistry(registry) {
|
|
247
|
+
await mkdir(dirname(themesRegistryPath()), { recursive: true, mode: 0o700 });
|
|
248
|
+
const tmp = `${themesRegistryPath()}.${process.pid}.${randomUUID()}.tmp`;
|
|
249
|
+
await writeFile(tmp, `${JSON.stringify(registry, null, 2)}\n`, { mode: 0o600 });
|
|
250
|
+
await rename(tmp, themesRegistryPath());
|
|
251
|
+
}
|
|
252
|
+
async function appendRegistryEntry(entry) {
|
|
253
|
+
const registry = await readRegistry();
|
|
254
|
+
registry.themes = registry.themes.filter((t) => t.id !== entry.id);
|
|
255
|
+
registry.themes.push(entry);
|
|
256
|
+
await writeRegistry(registry);
|
|
257
|
+
}
|
|
258
|
+
/** Read all installed themes (manifest re-read from disk), skipping broken ones. */
|
|
259
|
+
export async function listInstalledThemes() {
|
|
260
|
+
let ids;
|
|
261
|
+
try {
|
|
262
|
+
const entries = await readdir(themesRoot(), { withFileTypes: true });
|
|
263
|
+
ids = entries.filter((e) => e.isDirectory() && !e.name.startsWith(".")).map((e) => e.name);
|
|
264
|
+
}
|
|
265
|
+
catch {
|
|
266
|
+
return [];
|
|
267
|
+
}
|
|
268
|
+
const themes = [];
|
|
269
|
+
for (const id of ids) {
|
|
270
|
+
try {
|
|
271
|
+
assertSafeThemeName(id);
|
|
272
|
+
const manifest = await loadManifest(themeInstallDir(id));
|
|
273
|
+
if (manifest.id !== id)
|
|
274
|
+
continue; // dir name must match manifest id
|
|
275
|
+
themes.push(toInstalledTheme(manifest));
|
|
276
|
+
}
|
|
277
|
+
catch {
|
|
278
|
+
/* skip a corrupt/foreign directory */
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
return themes;
|
|
282
|
+
}
|
|
283
|
+
/** Remove an installed theme and its registry entry. */
|
|
284
|
+
export async function uninstallTheme(id) {
|
|
285
|
+
assertSafeThemeName(id);
|
|
286
|
+
await rm(themeInstallDir(id), { recursive: true, force: true });
|
|
287
|
+
const registry = await readRegistry();
|
|
288
|
+
registry.themes = registry.themes.filter((t) => t.id !== id);
|
|
289
|
+
await writeRegistry(registry);
|
|
290
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* Theme-pack manifest (`.cs-theme.json`) schema and validation.
|
|
4
|
+
*
|
|
5
|
+
* A pack may override app colors (a whitelisted subset of `--cs-*`, unitless
|
|
6
|
+
* HSL), supply per-state pet sprites, and a light/dark wallpaper. All three are
|
|
7
|
+
* optional — a pack can recolor only, reskin the pet only, etc. Image fields
|
|
8
|
+
* declare author-relative paths that the installer validates and renames to a
|
|
9
|
+
* canonical layout; the manifest here only checks shape, not the image bytes.
|
|
10
|
+
*/
|
|
11
|
+
/** Overridable CSS variables — must stay in sync with the renderer whitelist. */
|
|
12
|
+
export declare const THEME_VAR_NAMES: readonly ["--cs-background", "--cs-foreground", "--cs-card", "--cs-card-foreground", "--cs-popover", "--cs-popover-foreground", "--cs-primary", "--cs-primary-foreground", "--cs-secondary", "--cs-secondary-foreground", "--cs-muted", "--cs-muted-foreground", "--cs-accent", "--cs-accent-foreground", "--cs-destructive", "--cs-destructive-foreground", "--cs-border", "--cs-input", "--cs-ring", "--cs-status-running", "--cs-status-ok", "--cs-status-warn", "--cs-status-err", "--cs-status-idle"];
|
|
13
|
+
export declare const THEME_ID: RegExp;
|
|
14
|
+
export declare const ThemeManifestSchema: z.ZodObject<{
|
|
15
|
+
schemaVersion: z.ZodLiteral<1>;
|
|
16
|
+
id: z.ZodString;
|
|
17
|
+
name: z.ZodString;
|
|
18
|
+
version: z.ZodString;
|
|
19
|
+
colors: z.ZodOptional<z.ZodObject<{
|
|
20
|
+
light: z.ZodOptional<z.ZodEffects<z.ZodEffects<z.ZodRecord<z.ZodString, z.ZodString>, Record<string, string>, Record<string, string>>, Record<string, string>, Record<string, string>>>;
|
|
21
|
+
dark: z.ZodOptional<z.ZodEffects<z.ZodEffects<z.ZodRecord<z.ZodString, z.ZodString>, Record<string, string>, Record<string, string>>, Record<string, string>, Record<string, string>>>;
|
|
22
|
+
}, "strip", z.ZodTypeAny, {
|
|
23
|
+
light?: Record<string, string> | undefined;
|
|
24
|
+
dark?: Record<string, string> | undefined;
|
|
25
|
+
}, {
|
|
26
|
+
light?: Record<string, string> | undefined;
|
|
27
|
+
dark?: Record<string, string> | undefined;
|
|
28
|
+
}>>;
|
|
29
|
+
pet: z.ZodOptional<z.ZodObject<{
|
|
30
|
+
idle: z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>;
|
|
31
|
+
running: z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>;
|
|
32
|
+
alert: z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>;
|
|
33
|
+
/** Ordered frames cycled while the widget is dragged (a "run" loop). */
|
|
34
|
+
walk: z.ZodOptional<z.ZodArray<z.ZodEffects<z.ZodString, string, string>, "many">>;
|
|
35
|
+
}, "strip", z.ZodTypeAny, {
|
|
36
|
+
running?: string | undefined;
|
|
37
|
+
idle?: string | undefined;
|
|
38
|
+
alert?: string | undefined;
|
|
39
|
+
walk?: string[] | undefined;
|
|
40
|
+
}, {
|
|
41
|
+
running?: string | undefined;
|
|
42
|
+
idle?: string | undefined;
|
|
43
|
+
alert?: string | undefined;
|
|
44
|
+
walk?: string[] | undefined;
|
|
45
|
+
}>>;
|
|
46
|
+
wallpaper: z.ZodOptional<z.ZodObject<{
|
|
47
|
+
light: z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>;
|
|
48
|
+
dark: z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>;
|
|
49
|
+
opacity: z.ZodOptional<z.ZodNumber>;
|
|
50
|
+
}, "strip", z.ZodTypeAny, {
|
|
51
|
+
light?: string | undefined;
|
|
52
|
+
dark?: string | undefined;
|
|
53
|
+
opacity?: number | undefined;
|
|
54
|
+
}, {
|
|
55
|
+
light?: string | undefined;
|
|
56
|
+
dark?: string | undefined;
|
|
57
|
+
opacity?: number | undefined;
|
|
58
|
+
}>>;
|
|
59
|
+
}, "strip", z.ZodTypeAny, {
|
|
60
|
+
id: string;
|
|
61
|
+
version: string;
|
|
62
|
+
name: string;
|
|
63
|
+
schemaVersion: 1;
|
|
64
|
+
pet?: {
|
|
65
|
+
running?: string | undefined;
|
|
66
|
+
idle?: string | undefined;
|
|
67
|
+
alert?: string | undefined;
|
|
68
|
+
walk?: string[] | undefined;
|
|
69
|
+
} | undefined;
|
|
70
|
+
colors?: {
|
|
71
|
+
light?: Record<string, string> | undefined;
|
|
72
|
+
dark?: Record<string, string> | undefined;
|
|
73
|
+
} | undefined;
|
|
74
|
+
wallpaper?: {
|
|
75
|
+
light?: string | undefined;
|
|
76
|
+
dark?: string | undefined;
|
|
77
|
+
opacity?: number | undefined;
|
|
78
|
+
} | undefined;
|
|
79
|
+
}, {
|
|
80
|
+
id: string;
|
|
81
|
+
version: string;
|
|
82
|
+
name: string;
|
|
83
|
+
schemaVersion: 1;
|
|
84
|
+
pet?: {
|
|
85
|
+
running?: string | undefined;
|
|
86
|
+
idle?: string | undefined;
|
|
87
|
+
alert?: string | undefined;
|
|
88
|
+
walk?: string[] | undefined;
|
|
89
|
+
} | undefined;
|
|
90
|
+
colors?: {
|
|
91
|
+
light?: Record<string, string> | undefined;
|
|
92
|
+
dark?: Record<string, string> | undefined;
|
|
93
|
+
} | undefined;
|
|
94
|
+
wallpaper?: {
|
|
95
|
+
light?: string | undefined;
|
|
96
|
+
dark?: string | undefined;
|
|
97
|
+
opacity?: number | undefined;
|
|
98
|
+
} | undefined;
|
|
99
|
+
}>;
|
|
100
|
+
export type ThemeManifest = z.infer<typeof ThemeManifestSchema>;
|
|
101
|
+
/** Parse + validate a raw `.cs-theme.json` object. Throws ZodError on invalid input. */
|
|
102
|
+
export declare function parseThemeManifest(raw: unknown): ThemeManifest;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* Theme-pack manifest (`.cs-theme.json`) schema and validation.
|
|
4
|
+
*
|
|
5
|
+
* A pack may override app colors (a whitelisted subset of `--cs-*`, unitless
|
|
6
|
+
* HSL), supply per-state pet sprites, and a light/dark wallpaper. All three are
|
|
7
|
+
* optional — a pack can recolor only, reskin the pet only, etc. Image fields
|
|
8
|
+
* declare author-relative paths that the installer validates and renames to a
|
|
9
|
+
* canonical layout; the manifest here only checks shape, not the image bytes.
|
|
10
|
+
*/
|
|
11
|
+
/** Overridable CSS variables — must stay in sync with the renderer whitelist. */
|
|
12
|
+
export const THEME_VAR_NAMES = [
|
|
13
|
+
"--cs-background",
|
|
14
|
+
"--cs-foreground",
|
|
15
|
+
"--cs-card",
|
|
16
|
+
"--cs-card-foreground",
|
|
17
|
+
"--cs-popover",
|
|
18
|
+
"--cs-popover-foreground",
|
|
19
|
+
"--cs-primary",
|
|
20
|
+
"--cs-primary-foreground",
|
|
21
|
+
"--cs-secondary",
|
|
22
|
+
"--cs-secondary-foreground",
|
|
23
|
+
"--cs-muted",
|
|
24
|
+
"--cs-muted-foreground",
|
|
25
|
+
"--cs-accent",
|
|
26
|
+
"--cs-accent-foreground",
|
|
27
|
+
"--cs-destructive",
|
|
28
|
+
"--cs-destructive-foreground",
|
|
29
|
+
"--cs-border",
|
|
30
|
+
"--cs-input",
|
|
31
|
+
"--cs-ring",
|
|
32
|
+
"--cs-status-running",
|
|
33
|
+
"--cs-status-ok",
|
|
34
|
+
"--cs-status-warn",
|
|
35
|
+
"--cs-status-err",
|
|
36
|
+
"--cs-status-idle",
|
|
37
|
+
];
|
|
38
|
+
const VAR_SET = new Set(THEME_VAR_NAMES);
|
|
39
|
+
/** Unitless HSL triple, e.g. "19 63% 45%". */
|
|
40
|
+
const HSL = /^\d+(?:\.\d+)?\s+\d+(?:\.\d+)?%\s+\d+(?:\.\d+)?%$/;
|
|
41
|
+
const ThemeVarsSchema = z
|
|
42
|
+
.record(z.string())
|
|
43
|
+
.refine((vars) => Object.keys(vars).every((name) => VAR_SET.has(name)), {
|
|
44
|
+
message: "unknown --cs-* variable (not in the theme whitelist)",
|
|
45
|
+
})
|
|
46
|
+
.refine((vars) => Object.values(vars).every((value) => HSL.test(value)), {
|
|
47
|
+
message: "color values must be unitless HSL triples like '19 63% 45%'",
|
|
48
|
+
});
|
|
49
|
+
/** A single safe path segment — no traversal, separators, or NUL. */
|
|
50
|
+
const RELATIVE_ASSET = z
|
|
51
|
+
.string()
|
|
52
|
+
.min(1)
|
|
53
|
+
.refine((p) => !p.includes("\0") &&
|
|
54
|
+
!p.includes("\\") &&
|
|
55
|
+
!p.startsWith("/") &&
|
|
56
|
+
!p.split("/").some((seg) => seg === "" || seg === "." || seg === ".."), { message: "asset path must be a relative path with no traversal" });
|
|
57
|
+
export const THEME_ID = /^[a-z0-9][a-z0-9-]{1,63}$/;
|
|
58
|
+
export const ThemeManifestSchema = z.object({
|
|
59
|
+
schemaVersion: z.literal(1),
|
|
60
|
+
id: z.string().regex(THEME_ID, "id must match ^[a-z0-9][a-z0-9-]{1,63}$"),
|
|
61
|
+
name: z.string().min(1).max(80),
|
|
62
|
+
version: z.string().min(1).max(32),
|
|
63
|
+
colors: z
|
|
64
|
+
.object({ light: ThemeVarsSchema.optional(), dark: ThemeVarsSchema.optional() })
|
|
65
|
+
.optional(),
|
|
66
|
+
pet: z
|
|
67
|
+
.object({
|
|
68
|
+
idle: RELATIVE_ASSET.optional(),
|
|
69
|
+
running: RELATIVE_ASSET.optional(),
|
|
70
|
+
alert: RELATIVE_ASSET.optional(),
|
|
71
|
+
/** Ordered frames cycled while the widget is dragged (a "run" loop). */
|
|
72
|
+
walk: z.array(RELATIVE_ASSET).max(16).optional(),
|
|
73
|
+
})
|
|
74
|
+
.optional(),
|
|
75
|
+
wallpaper: z
|
|
76
|
+
.object({
|
|
77
|
+
light: RELATIVE_ASSET.optional(),
|
|
78
|
+
dark: RELATIVE_ASSET.optional(),
|
|
79
|
+
opacity: z.number().min(0).max(1).optional(),
|
|
80
|
+
})
|
|
81
|
+
.optional(),
|
|
82
|
+
});
|
|
83
|
+
/** Parse + validate a raw `.cs-theme.json` object. Throws ZodError on invalid input. */
|
|
84
|
+
export function parseThemeManifest(raw) {
|
|
85
|
+
return ThemeManifestSchema.parse(raw);
|
|
86
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare class ThemeInstallError extends Error {
|
|
2
|
+
}
|
|
3
|
+
/** A review token changed between preview and install (content was modified). */
|
|
4
|
+
export declare class ThemeReviewChangedError extends ThemeInstallError {
|
|
5
|
+
constructor();
|
|
6
|
+
}
|
|
7
|
+
/** A theme id must be a single safe path segment matching the manifest pattern. */
|
|
8
|
+
export declare function assertSafeThemeName(id: string): void;
|
|
9
|
+
export declare function themesRoot(): string;
|
|
10
|
+
export declare function themeInstallDir(id: string): string;
|
|
11
|
+
/** Canonical asset subdirectory inside an installed theme. */
|
|
12
|
+
export declare const THEME_ASSET_DIR = ".cs-theme-assets";
|
|
13
|
+
/** Registry of installed themes. */
|
|
14
|
+
export declare function themesRegistryPath(): string;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { homedir } from "node:os";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { THEME_ID } from "./manifest.js";
|
|
4
|
+
export class ThemeInstallError extends Error {
|
|
5
|
+
}
|
|
6
|
+
/** A review token changed between preview and install (content was modified). */
|
|
7
|
+
export class ThemeReviewChangedError extends ThemeInstallError {
|
|
8
|
+
constructor() {
|
|
9
|
+
super("theme content changed since preview");
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
function userHome() {
|
|
13
|
+
return process.env.CODE_SHELL_HOME ?? process.env.HOME ?? homedir();
|
|
14
|
+
}
|
|
15
|
+
/** A theme id must be a single safe path segment matching the manifest pattern. */
|
|
16
|
+
export function assertSafeThemeName(id) {
|
|
17
|
+
if (!THEME_ID.test(id) || id === "." || id === "..") {
|
|
18
|
+
throw new ThemeInstallError(`invalid theme id: ${JSON.stringify(id)}`);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export function themesRoot() {
|
|
22
|
+
return join(userHome(), ".code-shell", "themes");
|
|
23
|
+
}
|
|
24
|
+
export function themeInstallDir(id) {
|
|
25
|
+
assertSafeThemeName(id);
|
|
26
|
+
return join(themesRoot(), id);
|
|
27
|
+
}
|
|
28
|
+
/** Canonical asset subdirectory inside an installed theme. */
|
|
29
|
+
export const THEME_ASSET_DIR = ".cs-theme-assets";
|
|
30
|
+
/** Registry of installed themes. */
|
|
31
|
+
export function themesRegistryPath() {
|
|
32
|
+
return join(themesRoot(), "installed.json");
|
|
33
|
+
}
|