@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,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 激活/切换/关闭事务。原子性来源:整个 `profile` 子树一次
|
|
3
|
+
* saveProjectSetting 写入(内部 tmp+rename)——切换即全量替换,
|
|
4
|
+
* 永远不存在“旧的撤一半、新的写一半”。
|
|
5
|
+
* mainInstruction / portableMemory 不落 settings:settings 只记 active
|
|
6
|
+
* 名字(+ preset/overrides 快照),活字段由 resolve.ts 从库读取。
|
|
7
|
+
*/
|
|
8
|
+
import type { SettingsManager } from "../settings/manager.js";
|
|
9
|
+
import type { CapabilityOverrides } from "../settings/schema.js";
|
|
10
|
+
import type { WorkspaceProfile } from "./types.js";
|
|
11
|
+
/** settings.profile 子树的形状(与 settings/schema.ts 的 zod 定义一致)。 */
|
|
12
|
+
export interface WorkspaceProfileSubtree {
|
|
13
|
+
active: string;
|
|
14
|
+
preset?: string;
|
|
15
|
+
overrides?: CapabilityOverrides;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 当前机器上可见的能力清单,用于 `exclusiveCapabilities` 决定「要关掉哪些」。
|
|
19
|
+
* 由 host 注入(core 不扫描磁盘)。缺省即无法独占,退回并集语义。
|
|
20
|
+
*/
|
|
21
|
+
export interface InstalledCapabilityNames {
|
|
22
|
+
skills?: readonly string[];
|
|
23
|
+
plugins?: readonly string[];
|
|
24
|
+
mcp?: readonly string[];
|
|
25
|
+
agents?: readonly string[];
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 把 profile 声明的能力展开为 override 快照;空 bucket 不落键。
|
|
29
|
+
*
|
|
30
|
+
* 默认只产出 `"on"`(并集:保证该有的在,不动用户开的)。profile 声明
|
|
31
|
+
* `exclusiveCapabilities` 且 host 给出 `installed` 时,未声明的同类能力显式
|
|
32
|
+
* 落 `"off"`,形成独占工作面。
|
|
33
|
+
*/
|
|
34
|
+
export declare function profileOverridesFromDefinition(profile: WorkspaceProfile, installed?: InstalledCapabilityNames): NonNullable<CapabilityOverrides>;
|
|
35
|
+
export declare function activateWorkspaceProfile(settings: SettingsManager, name: string, cwd: string, installed?: InstalledCapabilityNames): WorkspaceProfile;
|
|
36
|
+
export declare function deactivateWorkspaceProfile(settings: SettingsManager, cwd: string): void;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { readWorkspaceProfile } from "./store.js";
|
|
2
|
+
/**
|
|
3
|
+
* 把 profile 声明的能力展开为 override 快照;空 bucket 不落键。
|
|
4
|
+
*
|
|
5
|
+
* 默认只产出 `"on"`(并集:保证该有的在,不动用户开的)。profile 声明
|
|
6
|
+
* `exclusiveCapabilities` 且 host 给出 `installed` 时,未声明的同类能力显式
|
|
7
|
+
* 落 `"off"`,形成独占工作面。
|
|
8
|
+
*/
|
|
9
|
+
// 返回 NonNullable:`CapabilityOverrides` 自身以 `.optional()` 结尾(settings 里
|
|
10
|
+
// 整个 key 可以缺失),但这个函数**总是**构造一个对象字面量,永不返回 undefined。
|
|
11
|
+
// 沿用可空别名会迫使每个调用方(含断言 `overrides.skills` 的测试)先做一次不可能
|
|
12
|
+
// 为真的 null 检查。
|
|
13
|
+
export function profileOverridesFromDefinition(profile, installed) {
|
|
14
|
+
const exclusive = profile.exclusiveCapabilities === true;
|
|
15
|
+
const bucket = (declared, available) => {
|
|
16
|
+
const entries = {};
|
|
17
|
+
for (const name of declared)
|
|
18
|
+
entries[name] = "on";
|
|
19
|
+
if (exclusive && available) {
|
|
20
|
+
const claimed = new Set(declared);
|
|
21
|
+
for (const name of available) {
|
|
22
|
+
if (!claimed.has(name))
|
|
23
|
+
entries[name] = "off";
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return Object.keys(entries).length > 0 ? entries : undefined;
|
|
27
|
+
};
|
|
28
|
+
const plugins = bucket(profile.plugins, installed?.plugins);
|
|
29
|
+
const skills = bucket(profile.skills, installed?.skills);
|
|
30
|
+
const mcp = bucket(profile.mcp, installed?.mcp);
|
|
31
|
+
const agents = bucket(profile.agents, installed?.agents);
|
|
32
|
+
return {
|
|
33
|
+
...(plugins ? { plugins } : {}),
|
|
34
|
+
...(skills ? { skills } : {}),
|
|
35
|
+
...(mcp ? { mcp } : {}),
|
|
36
|
+
...(agents ? { agents } : {}),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export function activateWorkspaceProfile(settings, name, cwd, installed) {
|
|
40
|
+
const profile = readWorkspaceProfile(name);
|
|
41
|
+
if (!profile) {
|
|
42
|
+
throw new Error(`Workspace profile "${name}" not found in the global library`);
|
|
43
|
+
}
|
|
44
|
+
const subtree = {
|
|
45
|
+
active: profile.name,
|
|
46
|
+
// A digital human contributes its role, capabilities, and memory. The
|
|
47
|
+
// CodeShell runtime base is a host concern and must not vary with imported
|
|
48
|
+
// definitions that happen to carry a legacy basePreset value.
|
|
49
|
+
preset: "general",
|
|
50
|
+
overrides: profileOverridesFromDefinition(profile, installed),
|
|
51
|
+
};
|
|
52
|
+
settings.saveProjectSetting("profile", subtree, cwd);
|
|
53
|
+
return profile;
|
|
54
|
+
}
|
|
55
|
+
export function deactivateWorkspaceProfile(settings, cwd) {
|
|
56
|
+
settings.deleteProjectSetting("profile", cwd);
|
|
57
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { type CatalogEntry, type CatalogTeam } from "./catalog.js";
|
|
2
|
+
export interface RegisteredHumanRepo {
|
|
3
|
+
/** `owner/repo` */
|
|
4
|
+
repo: string;
|
|
5
|
+
addedAt: number;
|
|
6
|
+
}
|
|
7
|
+
export interface HumanRepoListEntry extends RegisteredHumanRepo {
|
|
8
|
+
/** 该仓库当前提供的数字人数量。 */
|
|
9
|
+
count: number;
|
|
10
|
+
/** 读取过程中的问题(坏定义、缺 manifest)。 */
|
|
11
|
+
errors: string[];
|
|
12
|
+
cloned: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare function humanReposRoot(): string;
|
|
15
|
+
export declare function humanRepoDir(repo: string): string;
|
|
16
|
+
export declare function listHumanRepos(): RegisteredHumanRepo[];
|
|
17
|
+
/**
|
|
18
|
+
* 注册并克隆一个数字人仓库。已存在则拉取更新。
|
|
19
|
+
*
|
|
20
|
+
* 克隆是网络+磁盘写入操作,调用方应已取得用户确认。
|
|
21
|
+
*/
|
|
22
|
+
export declare function addHumanRepo(repo: string): Promise<{
|
|
23
|
+
ok: true;
|
|
24
|
+
entry: HumanRepoListEntry;
|
|
25
|
+
} | {
|
|
26
|
+
ok: false;
|
|
27
|
+
error: string;
|
|
28
|
+
}>;
|
|
29
|
+
/**
|
|
30
|
+
* Swap a validated staging tree into place.
|
|
31
|
+
*
|
|
32
|
+
* Ordering matters for crash safety: promote FIRST (rename staging over a
|
|
33
|
+
* now-absent `dir`), and only retire the old tree around it. The previous
|
|
34
|
+
* `dir → retired` then `staging → dir` sequence left no tree at `dir` at all if
|
|
35
|
+
* the process died in between, and nothing scanned for `.retired-*` on startup,
|
|
36
|
+
* so the UI showed "尚未克隆" with the data still on disk under a name nobody
|
|
37
|
+
* looked for. Here the only window is one where BOTH the old tree (at `retired`)
|
|
38
|
+
* and the new tree (at `staging`) still exist, and `reclaimOrphanedTrees`
|
|
39
|
+
* cleans up whatever is left over on the next call.
|
|
40
|
+
*/
|
|
41
|
+
declare function promoteStagedRepo(staging: string, dir: string): void;
|
|
42
|
+
/**
|
|
43
|
+
* Recover from a crash during a previous swap.
|
|
44
|
+
*
|
|
45
|
+
* If `dir` is missing but a `.retired-*` sibling exists, a process died between
|
|
46
|
+
* retiring the old tree and promoting the new one. Restore the newest retired
|
|
47
|
+
* tree rather than leaving the repo looking un-cloned, then drop the rest.
|
|
48
|
+
* Runs under the repo lock, so no concurrent swap can be mid-flight.
|
|
49
|
+
*/
|
|
50
|
+
declare function reclaimOrphanedTrees(dir: string): void;
|
|
51
|
+
/**
|
|
52
|
+
* Crash-safety internals, exposed for tests only.
|
|
53
|
+
*
|
|
54
|
+
* `promoteStagedRepo`/`reclaimOrphanedTrees` implement the swap-and-recover
|
|
55
|
+
* protocol. Exercising them through `addHumanRepo` would require network git, so
|
|
56
|
+
* the recovery cases (interrupted swap, stale retired trees) are tested here
|
|
57
|
+
* directly. Not part of the package's public surface.
|
|
58
|
+
*/
|
|
59
|
+
export declare const __testables: {
|
|
60
|
+
promoteStagedRepo: typeof promoteStagedRepo;
|
|
61
|
+
reclaimOrphanedTrees: typeof reclaimOrphanedTrees;
|
|
62
|
+
};
|
|
63
|
+
export declare function removeHumanRepo(repo: string): void;
|
|
64
|
+
/** 注册表 + 每个仓库的读取结果,供设置页展示。 */
|
|
65
|
+
export declare function listHumanRepoDetails(): HumanRepoListEntry[];
|
|
66
|
+
/**
|
|
67
|
+
* 所有已注册仓库提供的数字人。
|
|
68
|
+
*
|
|
69
|
+
* 同名定义按注册顺序先到先得,并记一条冲突说明——静默覆盖会让用户以为装的是
|
|
70
|
+
* 另一个仓库的版本。
|
|
71
|
+
*/
|
|
72
|
+
export declare function readAllHumanRepoEntries(): {
|
|
73
|
+
entries: CatalogEntry[];
|
|
74
|
+
teams: CatalogTeam[];
|
|
75
|
+
errors: string[];
|
|
76
|
+
};
|
|
77
|
+
export {};
|
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 已注册的数字人仓库:注册表 + 克隆缓存 + 读取。
|
|
3
|
+
*
|
|
4
|
+
* 与插件市场并列的一等分发通道。数字人不必先成为插件——它有自己的定义格式和
|
|
5
|
+
* 导入/导出原语,仓库只是把「一批定义」打包分发。
|
|
6
|
+
*
|
|
7
|
+
* 磁盘布局:
|
|
8
|
+
* ~/.code-shell/human-repos.json —— 注册表(owner/repo 列表)
|
|
9
|
+
* ~/.code-shell/human-repos/<key>/ —— 各仓库的浅克隆
|
|
10
|
+
*/
|
|
11
|
+
import { existsSync, mkdirSync, readdirSync, readFileSync, renameSync, rmSync, writeFileSync, } from "node:fs";
|
|
12
|
+
import { randomUUID } from "node:crypto";
|
|
13
|
+
import { basename, dirname, join } from "node:path";
|
|
14
|
+
import { codeShellHome } from "../session/session-manager.js";
|
|
15
|
+
import { acquireLockOnPath, mutateJsonFile } from "../utils/file-mutex.js";
|
|
16
|
+
// gitFetchAndReset is deliberately NOT used any more: updating in place is what
|
|
17
|
+
// destroyed the last-known-good tree on a bad upstream commit. Updates clone to
|
|
18
|
+
// a staging dir and swap (see addHumanRepo).
|
|
19
|
+
import { gitClone, githubRepoToCloneUrl } from "../plugins/gitOps.js";
|
|
20
|
+
import { CATALOG_REPO_RE, readCatalogFromDir, sourceToRepoKey, } from "./catalog.js";
|
|
21
|
+
const MAX_REPOS = 32;
|
|
22
|
+
export function humanReposRoot() {
|
|
23
|
+
return join(codeShellHome(), "human-repos");
|
|
24
|
+
}
|
|
25
|
+
function registryPath() {
|
|
26
|
+
return join(codeShellHome(), "human-repos.json");
|
|
27
|
+
}
|
|
28
|
+
export function humanRepoDir(repo) {
|
|
29
|
+
return join(humanReposRoot(), sourceToRepoKey(repo));
|
|
30
|
+
}
|
|
31
|
+
export function listHumanRepos() {
|
|
32
|
+
try {
|
|
33
|
+
// Missing or corrupt registry reads as "no repos" — never fatal.
|
|
34
|
+
return parseRegistry(readFileSync(registryPath(), "utf-8"));
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return [];
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function parseRegistry(raw) {
|
|
41
|
+
if (raw === undefined)
|
|
42
|
+
return [];
|
|
43
|
+
try {
|
|
44
|
+
const parsed = JSON.parse(raw);
|
|
45
|
+
if (!Array.isArray(parsed.repos))
|
|
46
|
+
return [];
|
|
47
|
+
return parsed.repos
|
|
48
|
+
.filter((r) => !!r &&
|
|
49
|
+
typeof r === "object" &&
|
|
50
|
+
typeof r.repo === "string" &&
|
|
51
|
+
CATALOG_REPO_RE.test(r.repo))
|
|
52
|
+
.map((r) => ({ repo: r.repo, addedAt: Number(r.addedAt) || 0 }));
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return [];
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Serialize add/update/remove of ONE repo across processes.
|
|
60
|
+
*
|
|
61
|
+
* Distinct from the registry lock inside `updateRegistry`: that one only guards
|
|
62
|
+
* the JSON file, and is held for a moment. This one spans the whole mutation —
|
|
63
|
+
* capacity check, directory swap, registry write — so two processes cannot both
|
|
64
|
+
* decide the repo is absent and clone into the same path, and cannot both slip
|
|
65
|
+
* past MAX_REPOS. Keyed per repo, so unrelated repos still install in parallel.
|
|
66
|
+
*
|
|
67
|
+
* The lock file lives next to the clones and is never the clone dir itself
|
|
68
|
+
* (proper-lockfile creates `<path>.lock`, which must not collide with a tree we
|
|
69
|
+
* rename over).
|
|
70
|
+
*/
|
|
71
|
+
function withHumanRepoLock(repo, run) {
|
|
72
|
+
const root = humanReposRoot();
|
|
73
|
+
mkdirSync(root, { recursive: true });
|
|
74
|
+
const lockTarget = join(root, `.${sourceToRepoKey(repo)}.repo-lock`);
|
|
75
|
+
if (!existsSync(lockTarget))
|
|
76
|
+
writeFileSync(lockTarget, "", { mode: 0o600 });
|
|
77
|
+
// Lock the marker FILE, not humanReposRoot(): a directory lock would serialize
|
|
78
|
+
// unrelated repos and deadlock against the registry lock taken below.
|
|
79
|
+
// 30s covers a swap that waits behind another process's publish step.
|
|
80
|
+
const release = acquireLockOnPath(lockTarget, 30_000);
|
|
81
|
+
try {
|
|
82
|
+
return run();
|
|
83
|
+
}
|
|
84
|
+
finally {
|
|
85
|
+
release();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Read-modify-write the registry under a cross-process lock.
|
|
90
|
+
*
|
|
91
|
+
* add/remove used to be `listHumanRepos()` in the caller followed by a bare
|
|
92
|
+
* `writeFileSync` of the whole array. Two windows (or a window plus an agent)
|
|
93
|
+
* mutating different repos would each write back their own stale snapshot, so
|
|
94
|
+
* one of the entries silently disappeared. The single-window UI operation lock
|
|
95
|
+
* did not help, because it does not span processes.
|
|
96
|
+
*/
|
|
97
|
+
function updateRegistry(change) {
|
|
98
|
+
mkdirSync(codeShellHome(), { recursive: true });
|
|
99
|
+
mutateJsonFile(registryPath(), {
|
|
100
|
+
parse: parseRegistry,
|
|
101
|
+
serialize: (repos) => `${JSON.stringify({ repos }, null, 2)}\n`,
|
|
102
|
+
mutation: (current) => ({ value: change(current) }),
|
|
103
|
+
mode: 0o600,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* 注册并克隆一个数字人仓库。已存在则拉取更新。
|
|
108
|
+
*
|
|
109
|
+
* 克隆是网络+磁盘写入操作,调用方应已取得用户确认。
|
|
110
|
+
*/
|
|
111
|
+
export async function addHumanRepo(repo) {
|
|
112
|
+
if (!CATALOG_REPO_RE.test(repo)) {
|
|
113
|
+
return { ok: false, error: `"${repo}" 不是合法的仓库地址(应为 owner/repo)` };
|
|
114
|
+
}
|
|
115
|
+
const dir = humanRepoDir(repo);
|
|
116
|
+
mkdirSync(humanReposRoot(), { recursive: true });
|
|
117
|
+
// Clone into a private staging dir FIRST, outside the lock — this is the slow
|
|
118
|
+
// network step and must not hold the lock for the duration. Both the add and
|
|
119
|
+
// the update path stage: cloning straight into `dir` let two processes race
|
|
120
|
+
// into the same path, and the loser's `rmSync(dir)` then deleted the winner's
|
|
121
|
+
// perfectly good clone.
|
|
122
|
+
const staging = `${dir}.staging-${process.pid}-${randomUUID()}`;
|
|
123
|
+
try {
|
|
124
|
+
const cloned = await gitClone(githubRepoToCloneUrl(repo), staging, { full: true });
|
|
125
|
+
if (!cloned.ok) {
|
|
126
|
+
// Only ever removes OUR staging dir (finally below); `dir` is untouched.
|
|
127
|
+
return { ok: false, error: explainGitFailure(cloned.error, repo) };
|
|
128
|
+
}
|
|
129
|
+
const staged = readCatalogFromDir(staging, repo);
|
|
130
|
+
if (staged.entries.length === 0 && staged.errors.length > 0) {
|
|
131
|
+
// A repo that yields nothing usable is a mistake worth surfacing now
|
|
132
|
+
// rather than leaving an empty row in the list. On update this also keeps
|
|
133
|
+
// the last known good tree in place.
|
|
134
|
+
const hadPrevious = existsSync(dir);
|
|
135
|
+
return {
|
|
136
|
+
ok: false,
|
|
137
|
+
error: hadPrevious
|
|
138
|
+
? `更新 ${repo} 失败,已保留上一个可用版本:${staged.errors[0]}`
|
|
139
|
+
: staged.errors[0],
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
// Publish under the repo lock: capacity check, directory swap and registry
|
|
143
|
+
// write must be one critical section. Checking MAX_REPOS before the lock
|
|
144
|
+
// let N processes each observe 31 repos and all proceed past the cap.
|
|
145
|
+
const published = withHumanRepoLock(repo, () => {
|
|
146
|
+
const current = listHumanRepos();
|
|
147
|
+
const alreadyRegistered = current.some((r) => r.repo === repo);
|
|
148
|
+
if (current.length >= MAX_REPOS && !alreadyRegistered) {
|
|
149
|
+
return { ok: false, error: `最多只能添加 ${MAX_REPOS} 个数字人仓库` };
|
|
150
|
+
}
|
|
151
|
+
promoteStagedRepo(staging, dir);
|
|
152
|
+
updateRegistry((repos) => [
|
|
153
|
+
...repos.filter((r) => r.repo !== repo),
|
|
154
|
+
{ repo, addedAt: Date.now() },
|
|
155
|
+
]);
|
|
156
|
+
return { ok: true };
|
|
157
|
+
});
|
|
158
|
+
if (!published.ok)
|
|
159
|
+
return published;
|
|
160
|
+
return {
|
|
161
|
+
ok: true,
|
|
162
|
+
entry: {
|
|
163
|
+
repo,
|
|
164
|
+
addedAt: Date.now(),
|
|
165
|
+
count: staged.entries.length,
|
|
166
|
+
errors: staged.errors,
|
|
167
|
+
cloned: true,
|
|
168
|
+
},
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
finally {
|
|
172
|
+
rmSync(staging, { recursive: true, force: true });
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Swap a validated staging tree into place.
|
|
177
|
+
*
|
|
178
|
+
* Ordering matters for crash safety: promote FIRST (rename staging over a
|
|
179
|
+
* now-absent `dir`), and only retire the old tree around it. The previous
|
|
180
|
+
* `dir → retired` then `staging → dir` sequence left no tree at `dir` at all if
|
|
181
|
+
* the process died in between, and nothing scanned for `.retired-*` on startup,
|
|
182
|
+
* so the UI showed "尚未克隆" with the data still on disk under a name nobody
|
|
183
|
+
* looked for. Here the only window is one where BOTH the old tree (at `retired`)
|
|
184
|
+
* and the new tree (at `staging`) still exist, and `reclaimOrphanedTrees`
|
|
185
|
+
* cleans up whatever is left over on the next call.
|
|
186
|
+
*/
|
|
187
|
+
function promoteStagedRepo(staging, dir) {
|
|
188
|
+
reclaimOrphanedTrees(dir);
|
|
189
|
+
if (!existsSync(dir)) {
|
|
190
|
+
renameSync(staging, dir);
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
const retired = `${dir}.retired-${process.pid}-${randomUUID()}`;
|
|
194
|
+
renameSync(dir, retired);
|
|
195
|
+
try {
|
|
196
|
+
renameSync(staging, dir);
|
|
197
|
+
}
|
|
198
|
+
catch (err) {
|
|
199
|
+
// Promotion failed — put the good tree back before surfacing the error.
|
|
200
|
+
try {
|
|
201
|
+
renameSync(retired, dir);
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
// Best effort; the retired copy is still on disk for manual recovery.
|
|
205
|
+
}
|
|
206
|
+
throw err;
|
|
207
|
+
}
|
|
208
|
+
rmSync(retired, { recursive: true, force: true });
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Recover from a crash during a previous swap.
|
|
212
|
+
*
|
|
213
|
+
* If `dir` is missing but a `.retired-*` sibling exists, a process died between
|
|
214
|
+
* retiring the old tree and promoting the new one. Restore the newest retired
|
|
215
|
+
* tree rather than leaving the repo looking un-cloned, then drop the rest.
|
|
216
|
+
* Runs under the repo lock, so no concurrent swap can be mid-flight.
|
|
217
|
+
*/
|
|
218
|
+
function reclaimOrphanedTrees(dir) {
|
|
219
|
+
const parent = dirname(dir);
|
|
220
|
+
const prefix = `${basename(dir)}.retired-`;
|
|
221
|
+
let orphans;
|
|
222
|
+
try {
|
|
223
|
+
orphans = readdirSync(parent).filter((name) => name.startsWith(prefix));
|
|
224
|
+
}
|
|
225
|
+
catch {
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
if (orphans.length === 0)
|
|
229
|
+
return;
|
|
230
|
+
orphans.sort();
|
|
231
|
+
if (!existsSync(dir)) {
|
|
232
|
+
const restore = orphans.pop();
|
|
233
|
+
try {
|
|
234
|
+
renameSync(join(parent, restore), dir);
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
// Fall through: leave it for manual recovery rather than deleting data.
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
for (const stale of orphans) {
|
|
241
|
+
rmSync(join(parent, stale), { recursive: true, force: true });
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Crash-safety internals, exposed for tests only.
|
|
246
|
+
*
|
|
247
|
+
* `promoteStagedRepo`/`reclaimOrphanedTrees` implement the swap-and-recover
|
|
248
|
+
* protocol. Exercising them through `addHumanRepo` would require network git, so
|
|
249
|
+
* the recovery cases (interrupted swap, stale retired trees) are tested here
|
|
250
|
+
* directly. Not part of the package's public surface.
|
|
251
|
+
*/
|
|
252
|
+
export const __testables = { promoteStagedRepo, reclaimOrphanedTrees };
|
|
253
|
+
/**
|
|
254
|
+
* Turn a raw git failure into something a user can act on.
|
|
255
|
+
*
|
|
256
|
+
* gitOps deliberately returns the full command line (`git clone --depth 1
|
|
257
|
+
* --filter=blob:none … exited 128: …`) because it serves low-level callers.
|
|
258
|
+
* Pasting that into an "add a repo" box tells the user nothing about the actual
|
|
259
|
+
* problem — usually just a typo in the name.
|
|
260
|
+
*/
|
|
261
|
+
function explainGitFailure(error, repo) {
|
|
262
|
+
if (/repository not found|could not read from remote|remote: not found/i.test(error)) {
|
|
263
|
+
return `找不到仓库 ${repo}。请检查拼写,并确认它是公开仓库。`;
|
|
264
|
+
}
|
|
265
|
+
if (/authentication failed|permission denied|terminal prompts disabled/i.test(error)) {
|
|
266
|
+
return `无权访问 ${repo}。私有仓库需要先配置 git 凭据。`;
|
|
267
|
+
}
|
|
268
|
+
if (/could not resolve host|network is unreachable|timed out|operation timed out/i.test(error)) {
|
|
269
|
+
return `无法连接 GitHub,请检查网络后重试。`;
|
|
270
|
+
}
|
|
271
|
+
if (error.startsWith("GIT_NOT_FOUND")) {
|
|
272
|
+
// Already a written, actionable message from gitOps.
|
|
273
|
+
return error;
|
|
274
|
+
}
|
|
275
|
+
// Unrecognized: keep the tail (the actual stderr) and drop the command line,
|
|
276
|
+
// so the user sees the cause rather than our argv.
|
|
277
|
+
const tail = error.includes(": ") ? error.slice(error.lastIndexOf(": ") + 2) : error;
|
|
278
|
+
return `克隆 ${repo} 失败:${tail.trim() || "未知错误"}`;
|
|
279
|
+
}
|
|
280
|
+
export function removeHumanRepo(repo) {
|
|
281
|
+
if (!CATALOG_REPO_RE.test(repo))
|
|
282
|
+
throw new Error("invalid digital-human repo");
|
|
283
|
+
// Same repo lock as add/update: otherwise a remove can delete the tree a
|
|
284
|
+
// concurrent add just published, leaving a registered repo with no clone.
|
|
285
|
+
withHumanRepoLock(repo, () => {
|
|
286
|
+
// Filter inside the registry lock so a concurrent add of a DIFFERENT repo
|
|
287
|
+
// is not lost.
|
|
288
|
+
updateRegistry((repos) => repos.filter((r) => r.repo !== repo));
|
|
289
|
+
const dir = humanRepoDir(repo);
|
|
290
|
+
rmSync(dir, { recursive: true, force: true });
|
|
291
|
+
// Drop any tree a crashed swap left behind, so a later re-add does not
|
|
292
|
+
// resurrect the old contents via reclaimOrphanedTrees.
|
|
293
|
+
reclaimOrphanedTrees(dir);
|
|
294
|
+
rmSync(dir, { recursive: true, force: true });
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
/** 注册表 + 每个仓库的读取结果,供设置页展示。 */
|
|
298
|
+
export function listHumanRepoDetails() {
|
|
299
|
+
return listHumanRepos().map((registered) => {
|
|
300
|
+
const dir = humanRepoDir(registered.repo);
|
|
301
|
+
if (!existsSync(dir)) {
|
|
302
|
+
return { ...registered, count: 0, errors: ["尚未克隆"], cloned: false };
|
|
303
|
+
}
|
|
304
|
+
const read = readCatalogFromDir(dir, registered.repo);
|
|
305
|
+
return { ...registered, count: read.entries.length, errors: read.errors, cloned: true };
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* 所有已注册仓库提供的数字人。
|
|
310
|
+
*
|
|
311
|
+
* 同名定义按注册顺序先到先得,并记一条冲突说明——静默覆盖会让用户以为装的是
|
|
312
|
+
* 另一个仓库的版本。
|
|
313
|
+
*/
|
|
314
|
+
export function readAllHumanRepoEntries() {
|
|
315
|
+
const entries = [];
|
|
316
|
+
const teams = [];
|
|
317
|
+
const errors = [];
|
|
318
|
+
const seen = new Map();
|
|
319
|
+
const seenTeams = new Map();
|
|
320
|
+
for (const { repo } of listHumanRepos()) {
|
|
321
|
+
const dir = humanRepoDir(repo);
|
|
322
|
+
if (!existsSync(dir))
|
|
323
|
+
continue;
|
|
324
|
+
const read = readCatalogFromDir(dir, repo);
|
|
325
|
+
errors.push(...read.errors);
|
|
326
|
+
for (const entry of read.entries) {
|
|
327
|
+
const owner = seen.get(entry.profile.name);
|
|
328
|
+
if (owner) {
|
|
329
|
+
errors.push(`"${entry.profile.name}" 同时存在于 ${owner} 与 ${repo},已采用前者`);
|
|
330
|
+
continue;
|
|
331
|
+
}
|
|
332
|
+
seen.set(entry.profile.name, repo);
|
|
333
|
+
entries.push(entry);
|
|
334
|
+
}
|
|
335
|
+
for (const team of read.teams) {
|
|
336
|
+
const owner = seenTeams.get(team.id);
|
|
337
|
+
if (owner) {
|
|
338
|
+
errors.push(`团队 "${team.id}" 同时存在于 ${owner} 与 ${repo},已采用前者`);
|
|
339
|
+
continue;
|
|
340
|
+
}
|
|
341
|
+
seenTeams.set(team.id, repo);
|
|
342
|
+
teams.push(team);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
return { entries, teams, errors };
|
|
346
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { type WorkspaceProfile } from "./types.js";
|
|
2
|
+
/** `owner/repo`,与 SKILL_REPO_RE 同源,供仓库地址复用。 */
|
|
3
|
+
export declare const CATALOG_REPO_RE: RegExp;
|
|
4
|
+
export interface HumansManifestEntry {
|
|
5
|
+
name: string;
|
|
6
|
+
label?: string;
|
|
7
|
+
description?: string;
|
|
8
|
+
category?: string;
|
|
9
|
+
tags?: string[];
|
|
10
|
+
}
|
|
11
|
+
export interface HumansManifest {
|
|
12
|
+
name?: string;
|
|
13
|
+
description?: string;
|
|
14
|
+
humans: HumansManifestEntry[];
|
|
15
|
+
teams: HumansManifestTeam[];
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* A team shipped by a repo. Same shape as a locally-authored team minus `mode`
|
|
19
|
+
* (the dead enum): `lead` picks the coordinator, `playbook` is the collaboration
|
|
20
|
+
* rules injected into its opening briefing.
|
|
21
|
+
*/
|
|
22
|
+
export interface HumansManifestTeam {
|
|
23
|
+
id: string;
|
|
24
|
+
name: string;
|
|
25
|
+
description?: string;
|
|
26
|
+
members: string[];
|
|
27
|
+
lead?: string;
|
|
28
|
+
playbook?: string;
|
|
29
|
+
}
|
|
30
|
+
export interface CatalogTeam extends HumansManifestTeam {
|
|
31
|
+
sourceRepo: string;
|
|
32
|
+
}
|
|
33
|
+
export interface CatalogEntry {
|
|
34
|
+
profile: WorkspaceProfile;
|
|
35
|
+
/** 来源仓库 `owner/repo`,用于展示与去重。 */
|
|
36
|
+
sourceRepo: string;
|
|
37
|
+
category?: string;
|
|
38
|
+
tags: string[];
|
|
39
|
+
}
|
|
40
|
+
export interface CatalogReadResult {
|
|
41
|
+
entries: CatalogEntry[];
|
|
42
|
+
teams: CatalogTeam[];
|
|
43
|
+
/** 逐条目的失败原因;一个坏定义不该让整个仓库不可用。 */
|
|
44
|
+
errors: string[];
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* `owner/repo` → 一个安全的目录段。小写化保证同一仓库不同大小写写法命中同一份
|
|
48
|
+
* 缓存;斜杠换成 `-` 后仍需通过 SAFE_SEGMENT_RE,杜绝路径逃逸。
|
|
49
|
+
*/
|
|
50
|
+
export declare function sourceToRepoKey(repo: string): string;
|
|
51
|
+
/** 解析 humans.json。缺 humans 数组按空目录处理;JSON 坏了才抛。 */
|
|
52
|
+
export declare function parseHumansManifest(raw: string): HumansManifest;
|
|
53
|
+
/** 读取一个已克隆的数字人仓库目录。 */
|
|
54
|
+
export declare function readCatalogFromDir(dir: string, sourceRepo: string): CatalogReadResult;
|