@cjhyy/code-shell-core 0.5.0-rc.2 → 0.6.0-rc.2
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 +13 -10
- package/dist/agent/agent-definition-registry.d.ts +3 -0
- package/dist/agent/agent-definition-registry.js +3 -1
- package/dist/agent/agent-definition.d.ts +15 -0
- package/dist/agent/agent-definition.js +27 -3
- package/dist/arena/context/context-tools.js +47 -4
- package/dist/arena/ledger.js +9 -1
- package/dist/arena/strategies/utils.d.ts +1 -4
- package/dist/arena/strategies/utils.js +7 -84
- package/dist/automation/cron-expr.d.ts +10 -0
- package/dist/automation/cron-expr.js +23 -5
- package/dist/automation/runner.d.ts +21 -4
- package/dist/automation/runner.js +48 -12
- package/dist/automation/scheduler.d.ts +38 -0
- package/dist/automation/scheduler.js +89 -12
- package/dist/automation/store.js +5 -2
- package/dist/capability-control/disabled-lists.d.ts +25 -0
- package/dist/capability-control/disabled-lists.js +57 -0
- package/dist/capability-control/overlay.d.ts +15 -0
- package/dist/capability-control/overlay.js +27 -0
- package/dist/cc-orchestrator/agent-adapter.d.ts +50 -0
- package/dist/cc-orchestrator/agent-adapter.js +133 -0
- package/dist/cc-orchestrator/cc-capability.d.ts +19 -0
- package/dist/cc-orchestrator/cc-capability.js +53 -0
- package/dist/cc-orchestrator/codex-session-discovery.d.ts +24 -0
- package/dist/cc-orchestrator/codex-session-discovery.js +191 -0
- package/dist/cc-orchestrator/codex-session-history.d.ts +25 -0
- package/dist/cc-orchestrator/codex-session-history.js +187 -0
- package/dist/cc-orchestrator/external-agent-changes.d.ts +19 -0
- package/dist/cc-orchestrator/external-agent-changes.js +214 -0
- package/dist/cc-orchestrator/external-agent-driver.d.ts +18 -0
- package/dist/cc-orchestrator/external-agent-driver.js +69 -0
- package/dist/cc-orchestrator/index.d.ts +8 -0
- package/dist/cc-orchestrator/index.js +8 -0
- package/dist/cc-orchestrator/relevance-judge.d.ts +15 -0
- package/dist/cc-orchestrator/relevance-judge.js +29 -0
- package/dist/cc-orchestrator/session-discovery.d.ts +46 -0
- package/dist/cc-orchestrator/session-discovery.js +125 -0
- package/dist/cc-orchestrator/session-history.d.ts +19 -0
- package/dist/cc-orchestrator/session-history.js +67 -0
- package/dist/cli/agent-server-stdio.d.ts +15 -1
- package/dist/cli/agent-server-stdio.js +115 -17
- package/dist/cli/agent-server-tcp.js +40 -26
- package/dist/context/compaction.d.ts +56 -0
- package/dist/context/compaction.js +186 -0
- package/dist/context/manager.js +25 -4
- package/dist/cost-tracker.js +5 -61
- package/dist/credentials/cipher.d.ts +49 -0
- package/dist/credentials/cipher.js +45 -0
- package/dist/credentials/cookie-jar.d.ts +24 -0
- package/dist/credentials/cookie-jar.js +40 -0
- package/dist/credentials/index.d.ts +7 -0
- package/dist/credentials/index.js +5 -0
- package/dist/credentials/inject-credential-tool.d.ts +20 -0
- package/dist/credentials/inject-credential-tool.js +130 -0
- package/dist/credentials/store.d.ts +72 -0
- package/dist/credentials/store.js +184 -0
- package/dist/credentials/types.d.ts +56 -0
- package/dist/credentials/use-credential-tool.d.ts +29 -0
- package/dist/credentials/use-credential-tool.js +205 -0
- package/dist/credentials/use-gate.d.ts +56 -0
- package/dist/credentials/use-gate.js +52 -0
- package/dist/data/model-metadata.d.ts +77 -0
- package/dist/data/model-metadata.js +56 -0
- package/dist/data/model-metadata.json +216 -0
- package/dist/data/openrouter-models.d.ts +18 -7
- package/dist/data/openrouter-models.js +35 -8
- package/dist/engine/aux-key.d.ts +10 -0
- package/dist/engine/aux-key.js +11 -0
- package/dist/engine/dynamic-tool-defs.d.ts +19 -0
- package/dist/engine/dynamic-tool-defs.js +36 -0
- package/dist/engine/engine.d.ts +267 -138
- package/dist/engine/engine.js +957 -191
- package/dist/engine/friendly-error.d.ts +18 -0
- package/dist/engine/friendly-error.js +63 -0
- package/dist/engine/goal.d.ts +145 -0
- package/dist/engine/goal.js +144 -0
- package/dist/engine/image-policy.d.ts +13 -0
- package/dist/engine/image-policy.js +24 -0
- package/dist/engine/model-connections-pool.d.ts +17 -0
- package/dist/engine/model-connections-pool.js +66 -0
- package/dist/engine/model-facade.d.ts +10 -0
- package/dist/engine/model-facade.js +25 -0
- package/dist/engine/patch-orphaned-tools.js +3 -0
- package/dist/engine/resolve-llm-config.d.ts +16 -0
- package/dist/engine/resolve-llm-config.js +44 -0
- package/dist/engine/runtime.js +2 -1
- package/dist/engine/sandbox-cache-key.d.ts +10 -0
- package/dist/engine/sandbox-cache-key.js +9 -0
- package/dist/engine/sandbox-config.d.ts +31 -0
- package/dist/engine/sandbox-config.js +38 -0
- package/dist/engine/session-usage.d.ts +19 -0
- package/dist/engine/session-usage.js +25 -0
- package/dist/engine/steer-queue.d.ts +32 -0
- package/dist/engine/steer-queue.js +26 -0
- package/dist/engine/streaming-tool-queue.d.ts +12 -0
- package/dist/engine/streaming-tool-queue.js +50 -10
- package/dist/engine/turn-loop.d.ts +67 -3
- package/dist/engine/turn-loop.js +292 -41
- package/dist/engine/types.d.ts +175 -0
- package/dist/engine/types.js +13 -0
- package/dist/external-agents/config.d.ts +2 -0
- package/dist/external-agents/config.js +15 -0
- package/dist/external-agents/types.d.ts +31 -0
- package/dist/external-agents/types.js +1 -0
- package/dist/git/utils.js +11 -6
- package/dist/git/worktree.d.ts +48 -0
- package/dist/git/worktree.js +86 -10
- package/dist/hooks/goal-stop-hook.d.ts +28 -0
- package/dist/hooks/goal-stop-hook.js +186 -9
- package/dist/hooks/registry.d.ts +8 -0
- package/dist/hooks/registry.js +19 -0
- package/dist/hooks/shell-runner.js +10 -21
- package/dist/index.d.ts +49 -6
- package/dist/index.js +60 -4
- package/dist/llm/capabilities/param-specs.d.ts +14 -0
- package/dist/llm/capabilities/param-specs.js +62 -0
- package/dist/llm/capabilities/rules.js +4 -0
- package/dist/llm/capabilities/types.d.ts +10 -0
- package/dist/llm/client-base.d.ts +28 -1
- package/dist/llm/client-base.js +119 -13
- package/dist/llm/model-cache.js +4 -2
- package/dist/llm/model-pool.d.ts +14 -0
- package/dist/llm/model-pool.js +13 -0
- package/dist/llm/provider-auth.d.ts +41 -0
- package/dist/llm/provider-auth.js +76 -0
- package/dist/llm/provider-catalog.d.ts +4 -0
- package/dist/llm/providers/anthropic.js +64 -14
- package/dist/llm/providers/openai.d.ts +36 -0
- package/dist/llm/providers/openai.js +257 -51
- package/dist/llm/reasoning-setting.d.ts +3 -3
- package/dist/llm/reasoning-setting.js +9 -1
- package/dist/llm/stream-watchdog.js +5 -1
- package/dist/llm/token-counter.js +9 -2
- package/dist/llm/types.d.ts +4 -0
- package/dist/logging/sanitize-messages.js +22 -0
- package/dist/lsp/manager.d.ts +1 -1
- package/dist/lsp/manager.js +40 -10
- package/dist/model-catalog/builtin.d.ts +12 -0
- package/dist/model-catalog/builtin.js +407 -0
- package/dist/model-catalog/gen-connections.d.ts +20 -0
- package/dist/model-catalog/gen-connections.js +28 -0
- package/dist/model-catalog/index.d.ts +41 -0
- package/dist/model-catalog/index.js +90 -0
- package/dist/model-catalog/params.d.ts +20 -0
- package/dist/model-catalog/params.js +45 -0
- package/dist/model-catalog/resolve.d.ts +48 -0
- package/dist/model-catalog/resolve.js +33 -0
- package/dist/model-catalog/save-entry.d.ts +32 -0
- package/dist/model-catalog/save-entry.js +104 -0
- package/dist/model-catalog/types.d.ts +561 -0
- package/dist/model-catalog/types.js +93 -0
- package/dist/model-catalog/upsert.d.ts +9 -0
- package/dist/model-catalog/upsert.js +8 -0
- package/dist/onboarding.d.ts +12 -82
- package/dist/onboarding.js +61 -326
- package/dist/plugins/gitOps.d.ts +19 -0
- package/dist/plugins/gitOps.js +73 -4
- package/dist/plugins/installer/checkUpdate.d.ts +16 -0
- package/dist/plugins/installer/checkUpdate.js +32 -0
- package/dist/plugins/installer/codex/convertCommands.d.ts +19 -0
- package/dist/plugins/installer/codex/convertCommands.js +46 -0
- package/dist/plugins/installer/codex/convertMcp.d.ts +5 -2
- package/dist/plugins/installer/codex/convertMcp.js +45 -5
- package/dist/plugins/installer/install.js +25 -1
- package/dist/plugins/installer/installFromArchive.d.ts +43 -0
- package/dist/plugins/installer/installFromArchive.js +134 -0
- package/dist/plugins/installer/installFromSource.js +8 -2
- package/dist/plugins/installer/loadPluginAgents.js +6 -2
- package/dist/plugins/installer/loadPluginMcp.d.ts +9 -2
- package/dist/plugins/installer/loadPluginMcp.js +35 -2
- package/dist/plugins/installer/pruneDisabled.d.ts +24 -0
- package/dist/plugins/installer/pruneDisabled.js +73 -0
- package/dist/plugins/installer/types.d.ts +5 -2
- package/dist/plugins/installer/types.js +1 -0
- package/dist/plugins/installer/uninstall.js +4 -0
- package/dist/plugins/installer/unzip.d.ts +14 -0
- package/dist/plugins/installer/unzip.js +82 -0
- package/dist/plugins/installer/update.d.ts +14 -0
- package/dist/plugins/installer/update.js +53 -21
- package/dist/plugins/loadPluginHooks.d.ts +47 -1
- package/dist/plugins/loadPluginHooks.js +73 -1
- package/dist/plugins/marketplaceManager.d.ts +7 -0
- package/dist/plugins/marketplaceManager.js +20 -0
- package/dist/plugins/pluginCommandHook.js +4 -18
- package/dist/plugins/pluginContent.d.ts +30 -0
- package/dist/plugins/pluginContent.js +83 -0
- package/dist/plugins/pluginInstaller.d.ts +13 -0
- package/dist/plugins/pluginInstaller.js +42 -8
- package/dist/plugins/schemas.js +1 -0
- package/dist/plugins/types.d.ts +6 -0
- package/dist/preset/index.d.ts +7 -1
- package/dist/preset/index.js +96 -6
- package/dist/product/types.d.ts +1 -1
- package/dist/prompt/composer.d.ts +27 -0
- package/dist/prompt/composer.js +67 -21
- package/dist/prompt/instruction-scanner.js +5 -3
- package/dist/prompt/section-loader.js +1 -0
- package/dist/prompt/sections/base.md +1 -0
- package/dist/prompt/sections/browser.md +10 -0
- package/dist/prompt/sections/coding.md +4 -0
- package/dist/protocol/chat-session-manager.d.ts +8 -2
- package/dist/protocol/chat-session-manager.js +36 -0
- package/dist/protocol/chat-session.d.ts +65 -0
- package/dist/protocol/chat-session.js +94 -2
- package/dist/protocol/client.d.ts +27 -0
- package/dist/protocol/client.js +38 -0
- package/dist/protocol/server.d.ts +112 -0
- package/dist/protocol/server.js +586 -16
- package/dist/protocol/transport.js +3 -2
- package/dist/protocol/types.d.ts +46 -0
- package/dist/protocol/types.js +16 -0
- package/dist/quota/credentials.d.ts +3 -0
- package/dist/quota/credentials.js +80 -0
- package/dist/quota/index.d.ts +36 -0
- package/dist/quota/index.js +155 -0
- package/dist/quota/types.d.ts +48 -0
- package/dist/quota/types.js +13 -0
- package/dist/review/review-prompt.d.ts +28 -0
- package/dist/review/review-prompt.js +81 -0
- package/dist/run/FileRunStore.js +8 -3
- package/dist/run/RunApprovalBackend.js +25 -5
- package/dist/run/RunManager.d.ts +12 -0
- package/dist/run/RunManager.js +35 -0
- package/dist/run/factory.d.ts +1 -1
- package/dist/runtime/background-shell.d.ts +139 -0
- package/dist/runtime/background-shell.js +495 -0
- package/dist/runtime/output-clean.d.ts +24 -0
- package/dist/runtime/output-clean.js +41 -0
- package/dist/runtime/ring-file.d.ts +64 -0
- package/dist/runtime/ring-file.js +174 -0
- package/dist/runtime/safe-spawn.js +15 -34
- package/dist/runtime/spawn-common.d.ts +148 -0
- package/dist/runtime/spawn-common.js +303 -0
- package/dist/runtime/truncate-output.d.ts +22 -0
- package/dist/runtime/truncate-output.js +49 -0
- package/dist/runtime/utf8-cut.d.ts +11 -0
- package/dist/runtime/utf8-cut.js +23 -0
- package/dist/services/auto-dream.d.ts +4 -0
- package/dist/services/auto-dream.js +26 -26
- package/dist/services/diagnostics.d.ts +1 -2
- package/dist/services/diagnostics.js +12 -7
- package/dist/services/extract-memories.d.ts +14 -1
- package/dist/services/extract-memories.js +45 -6
- package/dist/services/memory-orchestrator.d.ts +21 -0
- package/dist/services/memory-orchestrator.js +125 -50
- package/dist/services/session-memory.js +24 -12
- package/dist/session/file-history.d.ts +124 -1
- package/dist/session/file-history.js +222 -6
- package/dist/session/memory.d.ts +116 -2
- package/dist/session/memory.js +250 -28
- package/dist/session/session-manager.d.ts +40 -0
- package/dist/session/session-manager.js +113 -3
- package/dist/session/simple-diff.d.ts +23 -0
- package/dist/session/simple-diff.js +84 -0
- package/dist/session/transcript.d.ts +25 -1
- package/dist/session/transcript.js +35 -2
- package/dist/session/undo-target.d.ts +67 -0
- package/dist/session/undo-target.js +144 -0
- package/dist/settings/disk-defaults.d.ts +9 -2
- package/dist/settings/disk-defaults.js +11 -2
- package/dist/settings/feature-flags.d.ts +64 -0
- package/dist/settings/feature-flags.js +61 -0
- package/dist/settings/manager.d.ts +68 -1
- package/dist/settings/manager.js +266 -29
- package/dist/settings/migrate-config.d.ts +45 -0
- package/dist/settings/migrate-config.js +125 -0
- package/dist/settings/schema-export.d.ts +25 -0
- package/dist/settings/schema-export.js +38 -0
- package/dist/settings/schema.d.ts +1186 -771
- package/dist/settings/schema.js +268 -97
- package/dist/skills/scanner.d.ts +9 -0
- package/dist/skills/scanner.js +30 -2
- package/dist/stt/resolve-transcribe.d.ts +31 -0
- package/dist/stt/resolve-transcribe.js +108 -0
- package/dist/stt/transcribe.d.ts +51 -0
- package/dist/stt/transcribe.js +65 -0
- package/dist/tool-system/browser-bridge.d.ts +226 -0
- package/dist/tool-system/browser-bridge.js +163 -0
- package/dist/tool-system/builtin/agent-heartbeat.d.ts +49 -0
- package/dist/tool-system/builtin/agent-heartbeat.js +89 -0
- package/dist/tool-system/builtin/agent-notifications.d.ts +12 -3
- package/dist/tool-system/builtin/agent-notifications.js +9 -3
- package/dist/tool-system/builtin/agent-output-file.d.ts +38 -0
- package/dist/tool-system/builtin/agent-output-file.js +72 -0
- package/dist/tool-system/builtin/agent-registry.d.ts +12 -0
- package/dist/tool-system/builtin/agent-registry.js +8 -0
- package/dist/tool-system/builtin/agent.d.ts +21 -1
- package/dist/tool-system/builtin/agent.js +489 -42
- package/dist/tool-system/builtin/apply-patch/applier.js +66 -8
- package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +10 -0
- package/dist/tool-system/builtin/apply-patch/backup-targets.js +30 -0
- package/dist/tool-system/builtin/apply-patch/index.js +0 -15
- package/dist/tool-system/builtin/background-jobs.d.ts +76 -0
- package/dist/tool-system/builtin/background-jobs.js +124 -0
- package/dist/tool-system/builtin/background-shell-tools.d.ts +20 -0
- package/dist/tool-system/builtin/background-shell-tools.js +108 -0
- package/dist/tool-system/builtin/background-work.d.ts +67 -0
- package/dist/tool-system/builtin/background-work.js +86 -0
- package/dist/tool-system/builtin/bash-output-style.d.ts +32 -0
- package/dist/tool-system/builtin/bash-output-style.js +40 -0
- package/dist/tool-system/builtin/bash.d.ts +5 -2
- package/dist/tool-system/builtin/bash.js +98 -62
- package/dist/tool-system/builtin/browser-tools.d.ts +33 -0
- package/dist/tool-system/builtin/browser-tools.js +312 -0
- package/dist/tool-system/builtin/cancel-goal.d.ts +31 -0
- package/dist/tool-system/builtin/cancel-goal.js +64 -0
- package/dist/tool-system/builtin/check-quota.d.ts +15 -0
- package/dist/tool-system/builtin/check-quota.js +34 -0
- package/dist/tool-system/builtin/config.js +7 -0
- package/dist/tool-system/builtin/cron.d.ts +7 -0
- package/dist/tool-system/builtin/cron.js +55 -3
- package/dist/tool-system/builtin/drive-claude-code.d.ts +30 -0
- package/dist/tool-system/builtin/drive-claude-code.js +157 -0
- package/dist/tool-system/builtin/edit-model-catalog.d.ts +3 -0
- package/dist/tool-system/builtin/edit-model-catalog.js +94 -0
- package/dist/tool-system/builtin/edit.js +20 -16
- package/dist/tool-system/builtin/eol.d.ts +29 -0
- package/dist/tool-system/builtin/eol.js +37 -0
- package/dist/tool-system/builtin/file-cache.d.ts +6 -0
- package/dist/tool-system/builtin/file-cache.js +8 -0
- package/dist/tool-system/builtin/generate-image.d.ts +35 -0
- package/dist/tool-system/builtin/generate-image.js +278 -50
- package/dist/tool-system/builtin/generate-video.d.ts +55 -0
- package/dist/tool-system/builtin/generate-video.js +361 -0
- package/dist/tool-system/builtin/glob.js +0 -7
- package/dist/tool-system/builtin/grep.js +6 -8
- package/dist/tool-system/builtin/image-providers.d.ts +86 -0
- package/dist/tool-system/builtin/image-providers.js +190 -0
- package/dist/tool-system/builtin/image-uploader.d.ts +33 -0
- package/dist/tool-system/builtin/image-uploader.js +74 -0
- package/dist/tool-system/builtin/index.d.ts +7 -1
- package/dist/tool-system/builtin/index.js +249 -25
- package/dist/tool-system/builtin/mcp-tools.js +23 -3
- package/dist/tool-system/builtin/memory.js +45 -7
- package/dist/tool-system/builtin/notebook-edit.js +0 -7
- package/dist/tool-system/builtin/powershell.js +4 -1
- package/dist/tool-system/builtin/read.js +10 -10
- package/dist/tool-system/builtin/repl.js +4 -1
- package/dist/tool-system/builtin/skill.js +9 -0
- package/dist/tool-system/builtin/sleep.js +3 -2
- package/dist/tool-system/builtin/tool-search.js +25 -7
- package/dist/tool-system/builtin/video-providers.d.ts +154 -0
- package/dist/tool-system/builtin/video-providers.js +235 -0
- package/dist/tool-system/builtin/web-fetch.js +12 -2
- package/dist/tool-system/builtin/web-search.js +21 -7
- package/dist/tool-system/builtin/worktree.d.ts +2 -1
- package/dist/tool-system/builtin/worktree.js +31 -4
- package/dist/tool-system/builtin/write.js +0 -6
- package/dist/tool-system/context.d.ts +154 -6
- package/dist/tool-system/executor.d.ts +3 -1
- package/dist/tool-system/executor.js +172 -88
- package/dist/tool-system/investigation-guard.js +1 -1
- package/dist/tool-system/mcp-manager.d.ts +42 -4
- package/dist/tool-system/mcp-manager.js +186 -20
- package/dist/tool-system/path-policy.d.ts +5 -0
- package/dist/tool-system/path-policy.js +307 -8
- package/dist/tool-system/permission.d.ts +36 -1
- package/dist/tool-system/permission.js +281 -69
- package/dist/tool-system/plan-mode-allowlist.d.ts +13 -2
- package/dist/tool-system/plan-mode-allowlist.js +24 -2
- package/dist/tool-system/registry.d.ts +1 -0
- package/dist/tool-system/registry.js +16 -2
- package/dist/tool-system/sandbox/index.d.ts +8 -0
- package/dist/tool-system/sandbox/index.js +7 -2
- package/dist/tool-system/validate-tool-metadata.d.ts +36 -0
- package/dist/tool-system/validate-tool-metadata.js +63 -0
- package/dist/types.d.ts +217 -6
- package/dist/updater.js +20 -9
- package/dist/utils/envUtils.d.ts +0 -9
- package/dist/utils/envUtils.js +3 -28
- package/dist/utils/exec.d.ts +40 -0
- package/dist/utils/exec.js +144 -0
- package/dist/utils/json.d.ts +12 -0
- package/dist/utils/json.js +92 -0
- package/dist/utils/theme.d.ts +1 -1
- package/dist/utils/theme.js +1 -1
- package/dist/utils/toolDisplay.js +0 -1
- package/package.json +13 -7
- package/dist/agent/coordinator.d.ts +0 -49
- package/dist/agent/coordinator.js +0 -77
- package/dist/settings/manager.test.js +0 -73
- package/dist/tool-system/builtin/remote-trigger.d.ts +0 -6
- package/dist/tool-system/builtin/remote-trigger.js +0 -54
- package/dist/tool-system/builtin/send-message.d.ts +0 -6
- package/dist/tool-system/builtin/send-message.js +0 -47
- /package/dist/{settings/manager.test.d.ts → credentials/types.js} +0 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model catalog assembly — merge built-in (A) + user (B) templates.
|
|
3
|
+
*
|
|
4
|
+
* - A: {@link BUILTIN_CATALOG} (ships with the app).
|
|
5
|
+
* - B: ~/.code-shell/model-catalog.user.json (user-added templates).
|
|
6
|
+
* - merge: union by `id`; same id → user B wins (so升级 doesn't clobber the
|
|
7
|
+
* user's overrides/additions).
|
|
8
|
+
*
|
|
9
|
+
* No remote source this version (design doc §5).
|
|
10
|
+
*/
|
|
11
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
12
|
+
import { join } from "node:path";
|
|
13
|
+
import { userHome } from "../settings/manager.js";
|
|
14
|
+
import { logger } from "../logging/logger.js";
|
|
15
|
+
import { BUILTIN_CATALOG } from "./builtin.js";
|
|
16
|
+
import { userCatalogFileSchema } from "./types.js";
|
|
17
|
+
export { BUILTIN_CATALOG } from "./builtin.js";
|
|
18
|
+
export { saveCatalogEntry, deleteUserCatalogEntry } from "./save-entry.js";
|
|
19
|
+
/** Path to the user catalog file (source B). */
|
|
20
|
+
export function userCatalogPath() {
|
|
21
|
+
return join(userHome(), ".code-shell", "model-catalog.user.json");
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Load user-defined catalog entries (source B). Returns [] when the file is
|
|
25
|
+
* absent or invalid — a bad user file must never break the built-in catalog.
|
|
26
|
+
*/
|
|
27
|
+
export function loadUserCatalog() {
|
|
28
|
+
const path = userCatalogPath();
|
|
29
|
+
if (!existsSync(path))
|
|
30
|
+
return [];
|
|
31
|
+
try {
|
|
32
|
+
const parsed = JSON.parse(readFileSync(path, "utf-8"));
|
|
33
|
+
const result = userCatalogFileSchema.safeParse(parsed);
|
|
34
|
+
if (!result.success) {
|
|
35
|
+
logger.warn("model_catalog_user_invalid", { path, issues: result.error.issues.length });
|
|
36
|
+
return [];
|
|
37
|
+
}
|
|
38
|
+
return result.data;
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
logger.warn("model_catalog_user_read_failed", { path, error: err.message });
|
|
42
|
+
return [];
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Merged catalog: built-in (A) ∪ user (B), deduped by `id` with user winning.
|
|
47
|
+
* This is the single source the 连接 page renders from and the tool-description
|
|
48
|
+
* injector looks up `paramsDoc` in.
|
|
49
|
+
*/
|
|
50
|
+
export function getMergedCatalog() {
|
|
51
|
+
const byId = new Map();
|
|
52
|
+
for (const e of BUILTIN_CATALOG)
|
|
53
|
+
byId.set(e.id, e);
|
|
54
|
+
for (const e of loadUserCatalog())
|
|
55
|
+
byId.set(e.id, e); // user overrides built-in
|
|
56
|
+
return [...byId.values()];
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Look up a catalog entry by id (e.g. an instance's `catalogId`), falling back
|
|
60
|
+
* to the first entry whose `adapterKind` matches `kindFallback`. Since an
|
|
61
|
+
* adapterKind (e.g. "openai") can now back both a text and an image entry,
|
|
62
|
+
* `tagFallback` disambiguates the fallback to the right group.
|
|
63
|
+
*/
|
|
64
|
+
export function findCatalogEntry(catalog, id, kindFallback, tagFallback) {
|
|
65
|
+
if (id) {
|
|
66
|
+
const exact = catalog.find((e) => e.id === id);
|
|
67
|
+
if (exact)
|
|
68
|
+
return exact;
|
|
69
|
+
}
|
|
70
|
+
if (kindFallback) {
|
|
71
|
+
return catalog.find((e) => e.adapterKind === kindFallback && (!tagFallback || e.tag === tagFallback));
|
|
72
|
+
}
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Per-id provenance of the merged catalog: pure built-in, pure user-added, or a
|
|
77
|
+
* user override of a built-in. Lets the editor UI show 编辑/删除/重置 correctly
|
|
78
|
+
* (only an override can be "reset"; only a user-only entry can be truly deleted).
|
|
79
|
+
*/
|
|
80
|
+
export function catalogEntryOrigins() {
|
|
81
|
+
const builtinIds = new Set(BUILTIN_CATALOG.map((e) => e.id));
|
|
82
|
+
const userIds = new Set(loadUserCatalog().map((e) => e.id));
|
|
83
|
+
const out = {};
|
|
84
|
+
for (const id of builtinIds)
|
|
85
|
+
out[id] = userIds.has(id) ? "user-override-of-builtin" : "builtin";
|
|
86
|
+
for (const id of userIds)
|
|
87
|
+
if (!builtinIds.has(id))
|
|
88
|
+
out[id] = "user";
|
|
89
|
+
return out;
|
|
90
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Param projection — the two halves of the "one declaration drives both" goal:
|
|
3
|
+
* - applyParams: user's chosen values → request-body fields (via wire.field).
|
|
4
|
+
* - buildParamsDoc: the param specs → a natural-language note injected into the
|
|
5
|
+
* tool description so the agent knows what a configured model accepts.
|
|
6
|
+
* See docs/superpowers/specs/2026-06-15-unified-model-catalog-design.md §4/§6.
|
|
7
|
+
*/
|
|
8
|
+
import type { ParamSpec } from "./types.js";
|
|
9
|
+
/**
|
|
10
|
+
* Project `values` onto a request-body fragment using each spec's wire.field
|
|
11
|
+
* (falling back to the param name). A dotted field ("thinking.budget_tokens")
|
|
12
|
+
* nests. Values with no matching spec, and specs the user didn't set, are
|
|
13
|
+
* skipped.
|
|
14
|
+
*/
|
|
15
|
+
export declare function applyParams(values: Record<string, unknown>, params: ParamSpec[]): Record<string, unknown>;
|
|
16
|
+
/**
|
|
17
|
+
* Build a natural-language note describing the params a model accepts, for
|
|
18
|
+
* injection into the tool description. Empty string when there are no params.
|
|
19
|
+
*/
|
|
20
|
+
export declare function buildParamsDoc(params: ParamSpec[] | undefined): string;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project `values` onto a request-body fragment using each spec's wire.field
|
|
3
|
+
* (falling back to the param name). A dotted field ("thinking.budget_tokens")
|
|
4
|
+
* nests. Values with no matching spec, and specs the user didn't set, are
|
|
5
|
+
* skipped.
|
|
6
|
+
*/
|
|
7
|
+
export function applyParams(values, params) {
|
|
8
|
+
const body = {};
|
|
9
|
+
for (const spec of params) {
|
|
10
|
+
if (!(spec.name in values))
|
|
11
|
+
continue;
|
|
12
|
+
const value = values[spec.name];
|
|
13
|
+
if (value === undefined)
|
|
14
|
+
continue;
|
|
15
|
+
const field = spec.wire?.field ?? spec.name;
|
|
16
|
+
setDeep(body, field, value);
|
|
17
|
+
}
|
|
18
|
+
return body;
|
|
19
|
+
}
|
|
20
|
+
/** Set a (possibly dotted) path on an object, creating intermediate objects. */
|
|
21
|
+
function setDeep(obj, path, value) {
|
|
22
|
+
const parts = path.split(".");
|
|
23
|
+
let cur = obj;
|
|
24
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
25
|
+
const key = parts[i];
|
|
26
|
+
if (typeof cur[key] !== "object" || cur[key] === null)
|
|
27
|
+
cur[key] = {};
|
|
28
|
+
cur = cur[key];
|
|
29
|
+
}
|
|
30
|
+
cur[parts[parts.length - 1]] = value;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Build a natural-language note describing the params a model accepts, for
|
|
34
|
+
* injection into the tool description. Empty string when there are no params.
|
|
35
|
+
*/
|
|
36
|
+
export function buildParamsDoc(params) {
|
|
37
|
+
if (!params || params.length === 0)
|
|
38
|
+
return "";
|
|
39
|
+
const lines = params.map((p) => {
|
|
40
|
+
const opts = p.options && p.options.length > 0 ? ` (${p.options.join(" | ")})` : "";
|
|
41
|
+
const doc = p.doc ? ` — ${p.doc}` : "";
|
|
42
|
+
return `${p.name}${opts}${doc}`;
|
|
43
|
+
});
|
|
44
|
+
return lines.join("; ");
|
|
45
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* resolveInstance — single resolver every capability entry (chat /
|
|
3
|
+
* GenerateImage / GenerateVideo) goes through. Turns a stored ModelInstance +
|
|
4
|
+
* credentials + catalog into the runtime shape: which adapter, which key (from
|
|
5
|
+
* the referenced credential), which preset, which param values. text/image/
|
|
6
|
+
* video all share this — only adapterKind differs ("底层一套").
|
|
7
|
+
* See docs/superpowers/specs/2026-06-15-unified-model-catalog-design.md §6.
|
|
8
|
+
*/
|
|
9
|
+
import { type CatalogEntry } from "./index.js";
|
|
10
|
+
import type { ModelPreset } from "./types.js";
|
|
11
|
+
/** An independent credential (mirrors settings.credentials[] entries). */
|
|
12
|
+
export interface Credential {
|
|
13
|
+
id: string;
|
|
14
|
+
catalogId: string;
|
|
15
|
+
apiKey?: string;
|
|
16
|
+
baseUrl?: string;
|
|
17
|
+
}
|
|
18
|
+
/** A stored connection instance (mirrors settings.modelConnections[] entries). */
|
|
19
|
+
export interface ModelInstance {
|
|
20
|
+
id: string;
|
|
21
|
+
catalogId: string;
|
|
22
|
+
tag: "text" | "image" | "video" | "audio";
|
|
23
|
+
model: string;
|
|
24
|
+
baseUrl?: string;
|
|
25
|
+
/** Which credential supplies the key (independent entity, shareable). */
|
|
26
|
+
credentialId?: string;
|
|
27
|
+
paramValues?: Record<string, unknown>;
|
|
28
|
+
}
|
|
29
|
+
export interface ResolvedInstance {
|
|
30
|
+
entry: CatalogEntry;
|
|
31
|
+
adapterKind: string;
|
|
32
|
+
baseUrl: string;
|
|
33
|
+
apiKey?: string;
|
|
34
|
+
/** Whether the catalog template requires a key (false = local/no-auth provider).
|
|
35
|
+
* Surfaced so higher layers can tell "needs a key but has none" (a misconfig
|
|
36
|
+
* worth a clear error) from "legitimately keyless". resolveInstance itself
|
|
37
|
+
* still NEVER throws on a missing key — that no-crash contract is unchanged. */
|
|
38
|
+
needsKey: boolean;
|
|
39
|
+
preset?: ModelPreset;
|
|
40
|
+
model: string;
|
|
41
|
+
paramValues: Record<string, unknown>;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Resolve `inst` against the credential list (for its key) and `catalog`.
|
|
45
|
+
* Returns null when the instance's catalogId resolves to no entry.
|
|
46
|
+
* baseUrl precedence: connection override → credential → catalog default.
|
|
47
|
+
*/
|
|
48
|
+
export declare function resolveInstance(inst: ModelInstance, credentials: Credential[], catalog: CatalogEntry[]): ResolvedInstance | null;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* resolveInstance — single resolver every capability entry (chat /
|
|
3
|
+
* GenerateImage / GenerateVideo) goes through. Turns a stored ModelInstance +
|
|
4
|
+
* credentials + catalog into the runtime shape: which adapter, which key (from
|
|
5
|
+
* the referenced credential), which preset, which param values. text/image/
|
|
6
|
+
* video all share this — only adapterKind differs ("底层一套").
|
|
7
|
+
* See docs/superpowers/specs/2026-06-15-unified-model-catalog-design.md §6.
|
|
8
|
+
*/
|
|
9
|
+
import { findCatalogEntry } from "./index.js";
|
|
10
|
+
/**
|
|
11
|
+
* Resolve `inst` against the credential list (for its key) and `catalog`.
|
|
12
|
+
* Returns null when the instance's catalogId resolves to no entry.
|
|
13
|
+
* baseUrl precedence: connection override → credential → catalog default.
|
|
14
|
+
*/
|
|
15
|
+
export function resolveInstance(inst, credentials, catalog) {
|
|
16
|
+
const entry = findCatalogEntry(catalog, inst.catalogId);
|
|
17
|
+
if (!entry)
|
|
18
|
+
return null;
|
|
19
|
+
const cred = inst.credentialId
|
|
20
|
+
? credentials.find((c) => c.id === inst.credentialId)
|
|
21
|
+
: undefined;
|
|
22
|
+
const preset = entry.modelPresets?.find((p) => p.value === inst.model);
|
|
23
|
+
return {
|
|
24
|
+
entry,
|
|
25
|
+
adapterKind: entry.adapterKind,
|
|
26
|
+
baseUrl: inst.baseUrl ?? cred?.baseUrl ?? entry.defaultBaseUrl,
|
|
27
|
+
apiKey: cred?.apiKey,
|
|
28
|
+
needsKey: entry.needsKey !== false, // default-true: only an explicit false is keyless
|
|
29
|
+
preset,
|
|
30
|
+
model: inst.model,
|
|
31
|
+
paramValues: inst.paramValues ?? {},
|
|
32
|
+
};
|
|
33
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export interface SaveCatalogResult {
|
|
2
|
+
ok: boolean;
|
|
3
|
+
action?: "added" | "updated";
|
|
4
|
+
error?: string;
|
|
5
|
+
backup?: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* @param stamp caller-supplied unique suffix for the backup filename. Pass a
|
|
9
|
+
* timestamp/counter from the caller — core forbids Date.now() in some paths
|
|
10
|
+
* and tests need determinism.
|
|
11
|
+
*/
|
|
12
|
+
export declare function saveCatalogEntry(entry: unknown, opts: {
|
|
13
|
+
path: string;
|
|
14
|
+
stamp: string;
|
|
15
|
+
}): SaveCatalogResult;
|
|
16
|
+
export interface DeleteCatalogResult {
|
|
17
|
+
ok: boolean;
|
|
18
|
+
removed: boolean;
|
|
19
|
+
error?: string;
|
|
20
|
+
backup?: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Remove the entry with `id` from the user catalog file. Mirrors saveCatalogEntry's
|
|
24
|
+
* backup + atomic-write safety. removed:false means the id wasn't in the user file
|
|
25
|
+
* (a pristine built-in entry, or simply absent). The built-in catalog is code,
|
|
26
|
+
* untouched — deleting a user override just lets getMergedCatalog fall back to the
|
|
27
|
+
* built-in version ("reset" semantics).
|
|
28
|
+
*/
|
|
29
|
+
export declare function deleteUserCatalogEntry(id: string, opts: {
|
|
30
|
+
path: string;
|
|
31
|
+
stamp: string;
|
|
32
|
+
}): DeleteCatalogResult;
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* saveCatalogEntry — backup + validate + upsert-write one CatalogEntry into a
|
|
3
|
+
* user catalog file. Safe: backs up any existing (even corrupt) file first,
|
|
4
|
+
* validates the entry against the schema, and only writes on success. The
|
|
5
|
+
* agent-facing catalog edit tool wraps this; key/credentials are NOT touched
|
|
6
|
+
* here (those go through the user's own Edit, by design).
|
|
7
|
+
* See docs/superpowers/specs/2026-06-15-unified-model-catalog-design.md §7.
|
|
8
|
+
*/
|
|
9
|
+
import { readFileSync, writeFileSync, existsSync, copyFileSync, mkdirSync } from "node:fs";
|
|
10
|
+
import { dirname } from "node:path";
|
|
11
|
+
import { catalogEntrySchema, userCatalogFileSchema } from "./types.js";
|
|
12
|
+
import { upsertCatalogEntry } from "./upsert.js";
|
|
13
|
+
/**
|
|
14
|
+
* @param stamp caller-supplied unique suffix for the backup filename. Pass a
|
|
15
|
+
* timestamp/counter from the caller — core forbids Date.now() in some paths
|
|
16
|
+
* and tests need determinism.
|
|
17
|
+
*/
|
|
18
|
+
export function saveCatalogEntry(entry, opts) {
|
|
19
|
+
// Validate the incoming entry first — never write a malformed catalog.
|
|
20
|
+
const parsed = catalogEntrySchema.safeParse(entry);
|
|
21
|
+
if (!parsed.success) {
|
|
22
|
+
return { ok: false, error: `invalid catalog entry: ${parsed.error.issues.map((i) => i.message).join("; ")}` };
|
|
23
|
+
}
|
|
24
|
+
const valid = parsed.data;
|
|
25
|
+
// Read + back up any existing file (even if corrupt — never silently lose it).
|
|
26
|
+
let current = [];
|
|
27
|
+
let backup;
|
|
28
|
+
if (existsSync(opts.path)) {
|
|
29
|
+
backup = `${opts.path}.bak-${opts.stamp}`;
|
|
30
|
+
try {
|
|
31
|
+
copyFileSync(opts.path, backup);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
backup = undefined; // best-effort; don't abort the write on backup failure
|
|
35
|
+
}
|
|
36
|
+
try {
|
|
37
|
+
const raw = JSON.parse(readFileSync(opts.path, "utf-8"));
|
|
38
|
+
const safe = userCatalogFileSchema.safeParse(raw);
|
|
39
|
+
current = safe.success ? safe.data : [];
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
current = []; // corrupt → start fresh (original preserved in backup)
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
const action = current.some((e) => e.id === valid.id) ? "updated" : "added";
|
|
46
|
+
const next = upsertCatalogEntry(current, valid);
|
|
47
|
+
// Ensure the parent dir exists — a first-ever catalog write on a machine
|
|
48
|
+
// whose ~/.code-shell hasn't been created yet would otherwise throw ENOENT
|
|
49
|
+
// (the agent-facing tool wants a clean {ok:false} or a real write, not a crash).
|
|
50
|
+
try {
|
|
51
|
+
mkdirSync(dirname(opts.path), { recursive: true });
|
|
52
|
+
}
|
|
53
|
+
catch (e) {
|
|
54
|
+
return { ok: false, error: `could not create catalog directory: ${e instanceof Error ? e.message : String(e)}`, backup };
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
writeFileSync(opts.path, JSON.stringify(next, null, 2));
|
|
58
|
+
}
|
|
59
|
+
catch (e) {
|
|
60
|
+
// IO error (perms / disk full / bad path): return a clean {ok:false} with the
|
|
61
|
+
// backup filename preserved, never let the throw escape past the tool's
|
|
62
|
+
// expected result shape (the original file is intact — we only upsert-wrote).
|
|
63
|
+
return { ok: false, error: `could not write catalog: ${e instanceof Error ? e.message : String(e)}`, backup };
|
|
64
|
+
}
|
|
65
|
+
return { ok: true, action, backup };
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Remove the entry with `id` from the user catalog file. Mirrors saveCatalogEntry's
|
|
69
|
+
* backup + atomic-write safety. removed:false means the id wasn't in the user file
|
|
70
|
+
* (a pristine built-in entry, or simply absent). The built-in catalog is code,
|
|
71
|
+
* untouched — deleting a user override just lets getMergedCatalog fall back to the
|
|
72
|
+
* built-in version ("reset" semantics).
|
|
73
|
+
*/
|
|
74
|
+
export function deleteUserCatalogEntry(id, opts) {
|
|
75
|
+
if (!existsSync(opts.path))
|
|
76
|
+
return { ok: true, removed: false };
|
|
77
|
+
let backup = `${opts.path}.bak-${opts.stamp}`;
|
|
78
|
+
try {
|
|
79
|
+
copyFileSync(opts.path, backup);
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
backup = undefined;
|
|
83
|
+
}
|
|
84
|
+
let current = [];
|
|
85
|
+
try {
|
|
86
|
+
const raw = JSON.parse(readFileSync(opts.path, "utf-8"));
|
|
87
|
+
const safe = userCatalogFileSchema.safeParse(raw);
|
|
88
|
+
current = safe.success ? safe.data : [];
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
current = [];
|
|
92
|
+
}
|
|
93
|
+
const next = current.filter((e) => e.id !== id);
|
|
94
|
+
const removed = next.length !== current.length;
|
|
95
|
+
if (!removed)
|
|
96
|
+
return { ok: true, removed: false, backup };
|
|
97
|
+
try {
|
|
98
|
+
writeFileSync(opts.path, JSON.stringify(next, null, 2));
|
|
99
|
+
}
|
|
100
|
+
catch (e) {
|
|
101
|
+
return { ok: false, removed: false, error: `could not write catalog: ${e instanceof Error ? e.message : String(e)}`, backup };
|
|
102
|
+
}
|
|
103
|
+
return { ok: true, removed: true, backup };
|
|
104
|
+
}
|