@cjhyy/code-shell-core 0.5.0-rc.1 → 0.6.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -10
- package/dist/agent/agent-definition-registry.d.ts +21 -3
- package/dist/agent/agent-definition-registry.js +49 -18
- package/dist/agent/agent-definition.d.ts +32 -0
- package/dist/agent/agent-definition.js +49 -4
- package/dist/arena/arena.js +11 -12
- package/dist/arena/context/context-tools.js +47 -6
- package/dist/arena/context/within-root.d.ts +7 -0
- package/dist/arena/context/within-root.js +15 -0
- package/dist/arena/iterate/phases/argue.js +8 -2
- package/dist/arena/iterate/phases/revise.js +1 -1
- package/dist/arena/iterate/phases/tournament.js +3 -3
- package/dist/arena/ledger.js +9 -1
- package/dist/arena/phases/adjudication.js +1 -4
- package/dist/arena/phases/build-consensus.js +1 -4
- package/dist/arena/phases/cross-review.js +2 -8
- package/dist/arena/phases/debate-rounds.js +1 -4
- package/dist/arena/phases/participant-research.js +1 -4
- package/dist/arena/phases/planning-detail-expansion.js +8 -10
- package/dist/arena/planner.js +0 -1
- package/dist/arena/providers/docs.d.ts +1 -0
- package/dist/arena/providers/docs.js +5 -2
- package/dist/arena/providers/repo.d.ts +1 -0
- package/dist/arena/providers/repo.js +5 -2
- package/dist/arena/strategies/utils.d.ts +1 -4
- package/dist/arena/strategies/utils.js +7 -51
- package/dist/arena/transitions.d.ts +7 -2
- package/dist/arena/transitions.js +9 -4
- package/dist/arena/types.d.ts +8 -2
- package/dist/automation/cron-expr.d.ts +41 -0
- package/dist/automation/cron-expr.js +169 -0
- package/dist/automation/index.d.ts +41 -0
- package/dist/automation/index.js +39 -0
- package/dist/automation/runner.d.ts +84 -0
- package/dist/automation/runner.js +92 -0
- package/dist/automation/scheduler.d.ts +194 -0
- package/dist/automation/scheduler.js +623 -0
- package/dist/automation/store.d.ts +39 -0
- package/dist/automation/store.js +122 -0
- package/dist/automation/write-policy.d.ts +34 -0
- package/dist/automation/write-policy.js +113 -0
- package/dist/automation/write-run.d.ts +51 -0
- package/dist/automation/write-run.js +38 -0
- package/dist/capability-control/disabled-lists.d.ts +25 -0
- package/dist/capability-control/disabled-lists.js +57 -0
- package/dist/capability-control/index.d.ts +5 -0
- package/dist/capability-control/index.js +3 -0
- package/dist/capability-control/overlay.d.ts +64 -0
- package/dist/capability-control/overlay.js +116 -0
- package/dist/capability-control/project.d.ts +65 -0
- package/dist/capability-control/project.js +147 -0
- package/dist/capability-control/service.d.ts +70 -0
- package/dist/capability-control/service.js +147 -0
- package/dist/capability-control/types.d.ts +62 -0
- package/dist/capability-control/types.js +17 -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 +26 -1
- package/dist/cli/agent-server-stdio.js +221 -28
- package/dist/cli/agent-server-tcp.d.ts +20 -0
- package/dist/cli/agent-server-tcp.js +134 -0
- package/dist/cli/graceful-shutdown.d.ts +27 -0
- package/dist/cli/graceful-shutdown.js +30 -0
- package/dist/context/compaction.d.ts +56 -0
- package/dist/context/compaction.js +209 -15
- package/dist/context/manager.d.ts +0 -20
- package/dist/context/manager.js +25 -41
- 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/cron/cron-runtime.d.ts +2 -0
- package/dist/cron/cron-runtime.js +2 -0
- package/dist/cron/cron-store.d.ts +2 -0
- package/dist/cron/cron-store.js +2 -0
- package/dist/cron/scheduler.d.ts +5 -32
- package/dist/cron/scheduler.js +5 -113
- 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/data/openrouter-sync.js +1 -1
- 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 +431 -108
- package/dist/engine/engine.js +1630 -279
- package/dist/engine/friendly-error.d.ts +18 -0
- package/dist/engine/friendly-error.js +63 -0
- package/dist/engine/goal.d.ts +187 -0
- package/dist/engine/goal.js +196 -0
- package/dist/engine/image-compression.d.ts +81 -0
- package/dist/engine/image-compression.js +186 -0
- package/dist/engine/image-policy.d.ts +165 -0
- package/dist/engine/image-policy.js +189 -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/reactive-threshold.d.ts +13 -0
- package/dist/engine/reactive-threshold.js +17 -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 +9 -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-title.d.ts +13 -0
- package/dist/engine/session-title.js +34 -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 +94 -9
- package/dist/engine/turn-loop.js +775 -342
- 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/parse-log.d.ts +13 -0
- package/dist/git/parse-log.js +21 -0
- package/dist/git/utils.d.ts +8 -6
- package/dist/git/utils.js +62 -26
- package/dist/git/worktree.d.ts +48 -0
- package/dist/git/worktree.js +111 -20
- package/dist/hooks/events.d.ts +23 -1
- package/dist/hooks/goal-stop-hook.d.ts +58 -0
- package/dist/hooks/goal-stop-hook.js +279 -0
- package/dist/hooks/hook-output.d.ts +33 -0
- package/dist/hooks/hook-output.js +79 -0
- package/dist/hooks/registry.d.ts +15 -0
- package/dist/hooks/registry.js +57 -1
- package/dist/hooks/shell-runner.d.ts +2 -0
- package/dist/hooks/shell-runner.js +48 -18
- package/dist/index.d.ts +79 -11
- package/dist/index.js +89 -6
- package/dist/llm/capabilities/param-specs.d.ts +14 -0
- package/dist/llm/capabilities/param-specs.js +62 -0
- package/dist/llm/capabilities/reasoning-control.d.ts +24 -0
- package/dist/llm/capabilities/reasoning-control.js +38 -0
- package/dist/llm/capabilities/rules.js +37 -3
- package/dist/llm/capabilities/types.d.ts +32 -2
- package/dist/llm/clamp-max-tokens.d.ts +11 -0
- package/dist/llm/clamp-max-tokens.js +17 -0
- package/dist/llm/client-base.d.ts +69 -5
- package/dist/llm/client-base.js +185 -25
- package/dist/llm/client-factory.d.ts +3 -3
- package/dist/llm/client-factory.js +2 -2
- package/dist/llm/model-cache.js +4 -2
- package/dist/llm/model-pool.d.ts +29 -11
- package/dist/llm/model-pool.js +36 -20
- package/dist/llm/provider-auth.d.ts +41 -0
- package/dist/llm/provider-auth.js +76 -0
- package/dist/llm/provider-catalog.d.ts +6 -2
- package/dist/llm/providers/anthropic.d.ts +32 -2
- package/dist/llm/providers/anthropic.js +207 -18
- package/dist/llm/providers/openai.d.ts +47 -2
- package/dist/llm/providers/openai.js +478 -71
- package/dist/llm/reasoning-setting.d.ts +51 -0
- package/dist/llm/reasoning-setting.js +40 -0
- package/dist/llm/stop-reason.d.ts +13 -0
- package/dist/llm/stop-reason.js +21 -0
- package/dist/llm/stream-watchdog.js +5 -1
- package/dist/llm/strip-vision.d.ts +32 -0
- package/dist/llm/strip-vision.js +94 -0
- package/dist/llm/token-counter.js +9 -2
- package/dist/llm/types.d.ts +9 -6
- package/dist/logging/logger.js +18 -4
- package/dist/logging/sanitize-messages.d.ts +10 -0
- package/dist/logging/sanitize-messages.js +112 -0
- package/dist/lsp/client.js +28 -8
- package/dist/lsp/manager.d.ts +1 -1
- package/dist/lsp/manager.js +42 -11
- package/dist/lsp/root-path.d.ts +9 -0
- package/dist/lsp/root-path.js +12 -0
- 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 +75 -333
- package/dist/plugins/gitOps.d.ts +53 -0
- package/dist/plugins/gitOps.js +130 -5
- package/dist/plugins/installer/checkUpdate.d.ts +16 -0
- package/dist/plugins/installer/checkUpdate.js +32 -0
- package/dist/plugins/installer/codex/convertAgents.d.ts +7 -0
- package/dist/plugins/installer/codex/convertAgents.js +55 -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 +11 -0
- package/dist/plugins/installer/codex/convertMcp.js +85 -0
- package/dist/plugins/installer/codex/convertSkills.d.ts +12 -0
- package/dist/plugins/installer/codex/convertSkills.js +33 -0
- package/dist/plugins/installer/detectFormat.d.ts +2 -0
- package/dist/plugins/installer/detectFormat.js +6 -0
- package/dist/plugins/installer/install.d.ts +7 -0
- package/dist/plugins/installer/install.js +123 -0
- package/dist/plugins/installer/installFromArchive.d.ts +43 -0
- package/dist/plugins/installer/installFromArchive.js +134 -0
- package/dist/plugins/installer/installFromSource.d.ts +13 -0
- package/dist/plugins/installer/installFromSource.js +51 -0
- package/dist/plugins/installer/list.d.ts +9 -0
- package/dist/plugins/installer/list.js +30 -0
- package/dist/plugins/installer/loadPluginAgents.d.ts +3 -0
- package/dist/plugins/installer/loadPluginAgents.js +27 -0
- package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
- package/dist/plugins/installer/loadPluginMcp.js +107 -0
- package/dist/plugins/installer/parseSource.d.ts +20 -0
- package/dist/plugins/installer/parseSource.js +74 -0
- package/dist/plugins/installer/paths.d.ts +5 -0
- package/dist/plugins/installer/paths.js +25 -0
- package/dist/plugins/installer/pruneDisabled.d.ts +24 -0
- package/dist/plugins/installer/pruneDisabled.js +73 -0
- package/dist/plugins/installer/types.d.ts +52 -0
- package/dist/plugins/installer/types.js +28 -0
- package/dist/plugins/installer/uninstall.d.ts +2 -0
- package/dist/plugins/installer/uninstall.js +18 -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 +28 -0
- package/dist/plugins/installer/update.js +97 -0
- package/dist/plugins/loadPluginHooks.d.ts +54 -1
- package/dist/plugins/loadPluginHooks.js +83 -1
- package/dist/plugins/marketplaceManager.d.ts +15 -1
- package/dist/plugins/marketplaceManager.js +58 -4
- package/dist/plugins/pluginCommandHook.js +34 -14
- package/dist/plugins/pluginContent.d.ts +30 -0
- package/dist/plugins/pluginContent.js +83 -0
- package/dist/plugins/pluginInstaller.d.ts +34 -0
- package/dist/plugins/pluginInstaller.js +168 -35
- package/dist/plugins/schemas.js +41 -6
- package/dist/plugins/types.d.ts +10 -0
- package/dist/preset/index.d.ts +7 -1
- package/dist/preset/index.js +112 -6
- package/dist/product/types.d.ts +1 -1
- package/dist/prompt/composer.d.ts +31 -0
- package/dist/prompt/composer.js +95 -25
- 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/prompt/sections/orchestration.md +8 -0
- package/dist/protocol/chat-session-manager.d.ts +15 -2
- package/dist/protocol/chat-session-manager.js +46 -0
- package/dist/protocol/chat-session.d.ts +82 -0
- package/dist/protocol/chat-session.js +121 -1
- package/dist/protocol/client.d.ts +27 -0
- package/dist/protocol/client.js +38 -0
- package/dist/protocol/redact.d.ts +50 -0
- package/dist/protocol/redact.js +71 -0
- package/dist/protocol/server.d.ts +153 -2
- package/dist/protocol/server.js +807 -39
- package/dist/protocol/tcp-transport.d.ts +45 -0
- package/dist/protocol/tcp-transport.js +74 -0
- package/dist/protocol/transport.js +3 -2
- package/dist/protocol/types.d.ts +69 -0
- package/dist/protocol/types.js +22 -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/remote/bridge.d.ts +11 -2
- package/dist/remote/bridge.js +61 -33
- package/dist/review/review-prompt.d.ts +28 -0
- package/dist/review/review-prompt.js +81 -0
- package/dist/run/ArtifactTracker.js +5 -4
- package/dist/run/EngineRunner.d.ts +27 -1
- package/dist/run/EngineRunner.js +46 -8
- package/dist/run/FileRunStore.js +40 -11
- package/dist/run/RunApprovalBackend.js +25 -5
- package/dist/run/RunLock.d.ts +28 -2
- package/dist/run/RunLock.js +49 -7
- package/dist/run/RunManager.d.ts +12 -0
- package/dist/run/RunManager.js +86 -3
- package/dist/run/RunQueue.d.ts +1 -0
- package/dist/run/RunQueue.js +8 -2
- package/dist/run/factory.d.ts +8 -1
- package/dist/run/factory.js +1 -0
- package/dist/run/index.d.ts +2 -2
- package/dist/run/index.js +1 -1
- package/dist/run/redirect-target.d.ts +7 -0
- package/dist/run/redirect-target.js +13 -0
- package/dist/run/types.js +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/browser-open.d.ts +13 -0
- package/dist/services/browser-open.js +16 -0
- package/dist/services/diagnostics.d.ts +1 -2
- package/dist/services/diagnostics.js +12 -7
- package/dist/services/dream-consolidation.d.ts +57 -0
- package/dist/services/dream-consolidation.js +151 -0
- 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 -32
- package/dist/services/notifier.d.ts +8 -0
- package/dist/services/notifier.js +39 -25
- package/dist/services/oauth.js +5 -7
- package/dist/services/session-memory-sort.d.ts +8 -0
- package/dist/services/session-memory-sort.js +9 -0
- package/dist/services/session-memory.js +30 -19
- package/dist/session/file-history.d.ts +124 -1
- package/dist/session/file-history.js +232 -9
- package/dist/session/memory.d.ts +116 -2
- package/dist/session/memory.js +250 -28
- package/dist/session/session-manager.d.ts +63 -1
- package/dist/session/session-manager.js +186 -5
- 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 +42 -0
- package/dist/settings/disk-defaults.js +33 -0
- package/dist/settings/feature-flags.d.ts +64 -0
- package/dist/settings/feature-flags.js +61 -0
- package/dist/settings/manager.d.ts +101 -1
- package/dist/settings/manager.js +345 -15
- package/dist/settings/migrate-config.d.ts +45 -0
- package/dist/settings/migrate-config.js +125 -0
- package/dist/settings/personalization.d.ts +19 -0
- package/dist/settings/personalization.js +7 -0
- package/dist/settings/schema-export.d.ts +25 -0
- package/dist/settings/schema-export.js +38 -0
- package/dist/settings/schema.d.ts +1827 -396
- package/dist/settings/schema.js +361 -81
- 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/add-marketplace.d.ts +12 -0
- package/dist/tool-system/builtin/add-marketplace.js +76 -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 +23 -0
- package/dist/tool-system/builtin/agent-registry.js +16 -4
- package/dist/tool-system/builtin/agent.d.ts +50 -11
- package/dist/tool-system/builtin/agent.js +576 -73
- 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 +7 -3
- package/dist/tool-system/builtin/arena.js +6 -7
- 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/complete-goal.d.ts +25 -0
- package/dist/tool-system/builtin/complete-goal.js +45 -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 +105 -9
- 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.d.ts +2 -1
- package/dist/tool-system/builtin/edit.js +21 -12
- 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 +60 -0
- package/dist/tool-system/builtin/generate-image.js +374 -0
- 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/grep.js +6 -2
- 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 +24 -1
- package/dist/tool-system/builtin/index.js +310 -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.d.ts +2 -1
- package/dist/tool-system/builtin/notebook-edit.js +1 -1
- package/dist/tool-system/builtin/powershell.js +4 -1
- package/dist/tool-system/builtin/read.d.ts +2 -1
- package/dist/tool-system/builtin/read.js +11 -3
- 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 +12 -5
- package/dist/tool-system/builtin/task.js +4 -1
- package/dist/tool-system/builtin/tool-search.js +25 -7
- package/dist/tool-system/builtin/update-automation-memory.d.ts +24 -0
- package/dist/tool-system/builtin/update-automation-memory.js +60 -0
- 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/view-image.d.ts +18 -0
- package/dist/tool-system/builtin/view-image.js +96 -0
- package/dist/tool-system/builtin/web-fetch.js +12 -2
- package/dist/tool-system/builtin/web-search.d.ts +4 -1
- package/dist/tool-system/builtin/web-search.js +57 -10
- 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.d.ts +2 -1
- package/dist/tool-system/builtin/write.js +1 -1
- package/dist/tool-system/context.d.ts +166 -6
- package/dist/tool-system/executor.d.ts +3 -2
- package/dist/tool-system/executor.js +197 -119
- package/dist/tool-system/investigation-guard.d.ts +4 -1
- package/dist/tool-system/investigation-guard.js +20 -4
- package/dist/tool-system/mcp-manager.d.ts +78 -16
- package/dist/tool-system/mcp-manager.js +357 -28
- package/dist/tool-system/path-policy.d.ts +99 -0
- package/dist/tool-system/path-policy.js +578 -0
- package/dist/tool-system/permission.d.ts +36 -1
- package/dist/tool-system/permission.js +322 -117
- package/dist/tool-system/plan-mode-allowlist.d.ts +32 -0
- package/dist/tool-system/plan-mode-allowlist.js +65 -0
- package/dist/tool-system/registry.d.ts +1 -0
- package/dist/tool-system/registry.js +26 -1
- 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/tool-system/validation.d.ts +10 -0
- package/dist/tool-system/validation.js +16 -3
- package/dist/types.d.ts +301 -15
- 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/format.js +4 -2
- package/dist/utils/json.d.ts +12 -0
- package/dist/utils/json.js +92 -0
- package/dist/utils/lockfile.js +9 -2
- package/dist/utils/theme.d.ts +7 -1
- package/dist/utils/theme.js +5 -3
- package/dist/utils/toolDisplay.js +0 -1
- package/package.json +14 -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
package/dist/onboarding.d.ts
CHANGED
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
* (see src/ui/components/OnboardingPrompt.tsx); this module only exposes
|
|
5
5
|
* pure(-ish) helpers it consumes, so there's a single input stack.
|
|
6
6
|
*/
|
|
7
|
+
import { PROVIDERS, type ProviderDef } from "./data/model-metadata.js";
|
|
8
|
+
export { PROVIDERS, type ProviderDef };
|
|
7
9
|
export interface OnboardingResult {
|
|
8
10
|
/**
|
|
9
11
|
* Pool alias key (e.g. "deepseek-v4-pro"). The engine uses this to switch
|
|
@@ -17,25 +19,6 @@ export interface OnboardingResult {
|
|
|
17
19
|
apiKey: string;
|
|
18
20
|
baseUrl: string;
|
|
19
21
|
}
|
|
20
|
-
export interface ProviderDef {
|
|
21
|
-
id: string;
|
|
22
|
-
name: string;
|
|
23
|
-
envKey: string;
|
|
24
|
-
provider: string;
|
|
25
|
-
baseUrl: string;
|
|
26
|
-
keyUrl: string;
|
|
27
|
-
keyPrefix: string;
|
|
28
|
-
/**
|
|
29
|
-
* The catalog of model IDs to register for this provider. The first
|
|
30
|
-
* entry doubles as the zero-config default — auto-activated when the
|
|
31
|
-
* user boots with just an env key (no onboarding). Users override by
|
|
32
|
-
* picking in the wizard or running `/model`.
|
|
33
|
-
*/
|
|
34
|
-
models: string[];
|
|
35
|
-
/** When true, skip API key prompt (e.g. local providers like Ollama). */
|
|
36
|
-
noKey?: boolean;
|
|
37
|
-
}
|
|
38
|
-
export declare const PROVIDERS: ProviderDef[];
|
|
39
22
|
/**
|
|
40
23
|
* Resolve the model list a provider should expose right now. For
|
|
41
24
|
* OpenRouter this comes from the snapshot; for direct providers it
|
|
@@ -65,26 +48,6 @@ export declare function validateApiKey(baseUrl: string, apiKey: string): Promise
|
|
|
65
48
|
* Priority: 1) command-line option 2) settings.json 3) all provider env vars
|
|
66
49
|
*/
|
|
67
50
|
export declare function resolveApiKey(optionsApiKey?: string, settingsApiKey?: string): string | undefined;
|
|
68
|
-
/**
|
|
69
|
-
* Look up a previously-persisted API key for a given provider in
|
|
70
|
-
* ~/.code-shell/settings.json. Matches by baseUrl (each ProviderDef.baseUrl
|
|
71
|
-
* is unique, while `provider` is a generic kind like "openai" shared across
|
|
72
|
-
* multiple endpoints).
|
|
73
|
-
*
|
|
74
|
-
* Returns the first match found in: settings.models[] (preferred — newer),
|
|
75
|
-
* then settings.model (legacy top-level). undefined when nothing matches.
|
|
76
|
-
*/
|
|
77
|
-
export declare function findSavedKeyForProvider(provider: ProviderDef): {
|
|
78
|
-
apiKey: string;
|
|
79
|
-
baseUrl: string;
|
|
80
|
-
} | undefined;
|
|
81
|
-
/**
|
|
82
|
-
* Return the list of model IDs previously saved under this provider
|
|
83
|
-
* (matched by baseUrl). Used by the onboarding wizard to pre-populate the
|
|
84
|
-
* "model pool" step with the user's prior choices instead of resetting to
|
|
85
|
-
* just the provider's first model.
|
|
86
|
-
*/
|
|
87
|
-
export declare function loadSavedModelsForProvider(provider: ProviderDef): string[];
|
|
88
51
|
export declare function hasApiKey(): boolean;
|
|
89
52
|
/**
|
|
90
53
|
* Resolve a model's max-output-token budget. Lookup order:
|
|
@@ -135,55 +98,22 @@ export declare function buildModelPool(provider: ProviderDef, apiKey: string): A
|
|
|
135
98
|
maxContextTokens?: number;
|
|
136
99
|
}>;
|
|
137
100
|
export declare function modelDisplayName(model: string): string;
|
|
138
|
-
export declare function saveSettings(result: OnboardingResult, providerDef?: ProviderDef, poolModels?: string[]): void;
|
|
139
101
|
/**
|
|
140
|
-
*
|
|
141
|
-
*
|
|
142
|
-
*
|
|
143
|
-
* - settings.activeKey — primary source of truth for active model
|
|
144
|
-
* - settings.models[] — self-describing entries (key, provider,
|
|
145
|
-
* model, baseUrl, apiKey, maxOutput, maxContext)
|
|
146
|
-
* - settings.providers[] — credential source for the wizard
|
|
147
|
-
* - settings.model.* — legacy mirror of the active entry, kept in
|
|
148
|
-
* sync so legacy boot paths (cli/main.ts,
|
|
149
|
-
* repl.ts, run.ts) keep working without
|
|
150
|
-
* each having to learn about activeKey
|
|
151
|
-
*
|
|
152
|
-
* Append-only: never removes existing entries. To start over use /logout.
|
|
153
|
-
* Writes atomically via tmp+rename.
|
|
102
|
+
* 持久化 onboarding 结果到统一 catalog(credentials + modelConnections +
|
|
103
|
+
* defaults.text)。Append-only:相同 instanceId 跳过。defaults.text 设为 activeId。
|
|
104
|
+
* 原子写(tmp+rename)。(旧版写 legacy model.* / models / providers / activeKey,已删)
|
|
154
105
|
*/
|
|
155
106
|
export declare function appendOnboardingResult(opts: {
|
|
156
|
-
/**
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
activeMirror: {
|
|
160
|
-
provider: string;
|
|
161
|
-
model: string;
|
|
162
|
-
apiKey: string;
|
|
163
|
-
baseUrl: string;
|
|
164
|
-
};
|
|
165
|
-
addedProvider?: {
|
|
166
|
-
key: string;
|
|
167
|
-
label?: string;
|
|
107
|
+
/** 本次新增的模型实例(每个成为一个 modelConnection + credential)。 */
|
|
108
|
+
models: Array<{
|
|
109
|
+
instanceId: string;
|
|
168
110
|
kind: string;
|
|
169
|
-
baseUrl: string;
|
|
170
|
-
apiKey?: string;
|
|
171
|
-
protocol?: string;
|
|
172
|
-
modelsPath?: string;
|
|
173
|
-
};
|
|
174
|
-
addedModels: Array<{
|
|
175
|
-
key: string;
|
|
176
|
-
label?: string;
|
|
177
|
-
providerKey?: string;
|
|
178
|
-
/** LLM client/protocol ("openai"/"anthropic"). New canonical name. */
|
|
179
|
-
protocol?: string;
|
|
180
|
-
/** Legacy mirror of `protocol`. Both are written so legacy readers keep working. */
|
|
181
|
-
provider?: string;
|
|
182
111
|
model: string;
|
|
183
|
-
baseUrl: string;
|
|
184
112
|
apiKey?: string;
|
|
185
|
-
|
|
186
|
-
maxOutputTokens?: number;
|
|
113
|
+
baseUrl?: string;
|
|
187
114
|
}>;
|
|
115
|
+
/** 选中的活跃实例 id(写入 defaults.text)。 */
|
|
116
|
+
activeId: string;
|
|
117
|
+
tag?: "text" | "image" | "video";
|
|
188
118
|
}): void;
|
|
189
119
|
export declare function saveArenaSettingsByKeys(keys: string[]): void;
|
package/dist/onboarding.js
CHANGED
|
@@ -4,137 +4,19 @@
|
|
|
4
4
|
* (see src/ui/components/OnboardingPrompt.tsx); this module only exposes
|
|
5
5
|
* pure(-ish) helpers it consumes, so there's a single input stack.
|
|
6
6
|
*/
|
|
7
|
-
import { mkdirSync, writeFileSync, readFileSync, existsSync, renameSync } from "node:fs";
|
|
7
|
+
import { mkdirSync, writeFileSync, readFileSync, existsSync, renameSync, rmSync, chmodSync } from "node:fs";
|
|
8
8
|
import { join } from "node:path";
|
|
9
|
-
import {
|
|
9
|
+
import { userHome } from "./settings/manager.js";
|
|
10
10
|
import { getOpenRouterModels } from "./data/openrouter-models.js";
|
|
11
|
+
import { KNOWN_MAX_OUTPUT, KNOWN_CONTEXT_WINDOWS, OPENROUTER_VENDORS, PROVIDERS, } from "./data/model-metadata.js";
|
|
12
|
+
// Re-exported so existing importers (and tests) can keep importing from
|
|
13
|
+
// onboarding; the catalog data itself now lives in data/model-metadata.json.
|
|
14
|
+
export { PROVIDERS };
|
|
11
15
|
import { sanitizeApiKey } from "./llm/api-key-sanitize.js";
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
name: "OpenRouter (推荐 — 支持所有模型)",
|
|
16
|
-
envKey: "OPENROUTER_API_KEY",
|
|
17
|
-
provider: "openai",
|
|
18
|
-
baseUrl: "https://openrouter.ai/api/v1",
|
|
19
|
-
keyUrl: "https://openrouter.ai/keys",
|
|
20
|
-
keyPrefix: "sk-or-",
|
|
21
|
-
// First entry is the zero-config default (auto-activated when the
|
|
22
|
-
// user starts with only an env key, no onboarding). Sonnet beats Opus
|
|
23
|
-
// here because it's ~5x cheaper and a safer pick for someone who
|
|
24
|
-
// hasn't picked yet — Opus stays one slot away for anyone who wants it.
|
|
25
|
-
models: [
|
|
26
|
-
"anthropic/claude-sonnet-4.6",
|
|
27
|
-
"anthropic/claude-opus-4.7",
|
|
28
|
-
"anthropic/claude-haiku-4.5",
|
|
29
|
-
"openai/gpt-5",
|
|
30
|
-
"openai/gpt-5-mini",
|
|
31
|
-
"openai/gpt-4o",
|
|
32
|
-
"openai/o4-mini",
|
|
33
|
-
"openai/o3",
|
|
34
|
-
"google/gemini-2.5-pro",
|
|
35
|
-
"google/gemini-2.5-flash",
|
|
36
|
-
"deepseek/deepseek-chat",
|
|
37
|
-
"deepseek/deepseek-reasoner",
|
|
38
|
-
"qwen/qwen3-coder",
|
|
39
|
-
"meta-llama/llama-4-maverick",
|
|
40
|
-
],
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
id: "anthropic",
|
|
44
|
-
name: "Anthropic (直连 Claude API)",
|
|
45
|
-
envKey: "ANTHROPIC_API_KEY",
|
|
46
|
-
provider: "anthropic",
|
|
47
|
-
baseUrl: "https://api.anthropic.com",
|
|
48
|
-
keyUrl: "https://console.anthropic.com/settings/keys",
|
|
49
|
-
keyPrefix: "sk-ant-",
|
|
50
|
-
models: [
|
|
51
|
-
"claude-sonnet-4-6",
|
|
52
|
-
"claude-opus-4-7",
|
|
53
|
-
"claude-haiku-4-5",
|
|
54
|
-
],
|
|
55
|
-
},
|
|
56
|
-
{
|
|
57
|
-
id: "openai",
|
|
58
|
-
name: "OpenAI",
|
|
59
|
-
envKey: "OPENAI_API_KEY",
|
|
60
|
-
provider: "openai",
|
|
61
|
-
baseUrl: "https://api.openai.com/v1",
|
|
62
|
-
keyUrl: "https://platform.openai.com/api-keys",
|
|
63
|
-
keyPrefix: "sk-",
|
|
64
|
-
models: ["gpt-5", "gpt-5-mini", "gpt-5-nano", "gpt-4o", "o4-mini", "o3"],
|
|
65
|
-
},
|
|
66
|
-
{
|
|
67
|
-
id: "deepseek",
|
|
68
|
-
name: "DeepSeek (官方直连)",
|
|
69
|
-
envKey: "DEEPSEEK_API_KEY",
|
|
70
|
-
provider: "openai",
|
|
71
|
-
baseUrl: "https://api.deepseek.com/v1",
|
|
72
|
-
keyUrl: "https://platform.deepseek.com/api_keys",
|
|
73
|
-
keyPrefix: "sk-",
|
|
74
|
-
models: ["deepseek-v4-pro", "deepseek-v4-flash", "deepseek-chat"],
|
|
75
|
-
},
|
|
76
|
-
{
|
|
77
|
-
id: "zai",
|
|
78
|
-
name: "Z.AI (GLM 官方)",
|
|
79
|
-
envKey: "ZAI_API_KEY",
|
|
80
|
-
provider: "openai",
|
|
81
|
-
baseUrl: "https://api.z.ai/api/paas/v4",
|
|
82
|
-
keyUrl: "https://z.ai/manage-apikey/apikey-list",
|
|
83
|
-
keyPrefix: "",
|
|
84
|
-
models: ["glm-5.1", "glm-4.6", "glm-4.5-air"],
|
|
85
|
-
},
|
|
86
|
-
{
|
|
87
|
-
id: "gemini",
|
|
88
|
-
name: "Google Gemini (官方直连)",
|
|
89
|
-
envKey: "GEMINI_API_KEY",
|
|
90
|
-
provider: "openai",
|
|
91
|
-
baseUrl: "https://generativelanguage.googleapis.com/v1beta/openai",
|
|
92
|
-
keyUrl: "https://aistudio.google.com/apikey",
|
|
93
|
-
keyPrefix: "",
|
|
94
|
-
models: [
|
|
95
|
-
"gemini-2.5-pro",
|
|
96
|
-
"gemini-2.5-flash",
|
|
97
|
-
"gemini-2.0-flash",
|
|
98
|
-
],
|
|
99
|
-
},
|
|
100
|
-
{
|
|
101
|
-
id: "ollama",
|
|
102
|
-
name: "Ollama (本地,无需 Key)",
|
|
103
|
-
envKey: "",
|
|
104
|
-
provider: "openai",
|
|
105
|
-
baseUrl: "http://localhost:11434/v1",
|
|
106
|
-
keyUrl: "https://ollama.com/library",
|
|
107
|
-
keyPrefix: "",
|
|
108
|
-
models: ["llama3.1", "qwen2.5-coder", "deepseek-r1", "mistral", "gemma3"],
|
|
109
|
-
noKey: true,
|
|
110
|
-
},
|
|
111
|
-
{
|
|
112
|
-
id: "custom",
|
|
113
|
-
name: "自定义 (任何 OpenAI 兼容 API)",
|
|
114
|
-
envKey: "",
|
|
115
|
-
provider: "openai",
|
|
116
|
-
baseUrl: "",
|
|
117
|
-
keyUrl: "",
|
|
118
|
-
keyPrefix: "",
|
|
119
|
-
models: [],
|
|
120
|
-
},
|
|
121
|
-
];
|
|
16
|
+
import { getMergedCatalog } from "./model-catalog/index.js";
|
|
17
|
+
// ProviderDef 类型 + PROVIDERS 目录已外移到 data/model-metadata.json
|
|
18
|
+
// (loader: data/model-metadata.ts),并在文件顶部 re-export。core 只读目录数据。
|
|
122
19
|
// ─── Dynamic model list (OpenRouter snapshot) ────────────────────
|
|
123
|
-
/**
|
|
124
|
-
* Curated vendors and how many of their newest models to surface in the
|
|
125
|
-
* onboarding picker. Order matters — first vendors appear first.
|
|
126
|
-
* Tweak this if a new vendor becomes worth exposing in the picker.
|
|
127
|
-
*/
|
|
128
|
-
const OPENROUTER_VENDORS = [
|
|
129
|
-
{ prefix: "anthropic/", take: 4 },
|
|
130
|
-
{ prefix: "openai/", take: 5 },
|
|
131
|
-
{ prefix: "google/", take: 3 },
|
|
132
|
-
{ prefix: "deepseek/", take: 3 },
|
|
133
|
-
{ prefix: "x-ai/", take: 2 },
|
|
134
|
-
{ prefix: "qwen/", take: 2 },
|
|
135
|
-
{ prefix: "meta-llama/", take: 2 },
|
|
136
|
-
{ prefix: "mistralai/", take: 1 },
|
|
137
|
-
];
|
|
138
20
|
/**
|
|
139
21
|
* Build the OpenRouter model picker list from the bundled snapshot.
|
|
140
22
|
* Filters out `:free`/preview variants for the default picker (still
|
|
@@ -226,9 +108,12 @@ export function detectProviderFromApiKey(apiKey, baseUrl) {
|
|
|
226
108
|
// ─── API key validation ────────────────────────────────────────────
|
|
227
109
|
export async function validateApiKey(baseUrl, apiKey) {
|
|
228
110
|
try {
|
|
111
|
+
// 10s timeout so a hung/slow provider doesn't block the onboarding wizard
|
|
112
|
+
// until the OS socket timeout — AbortError is caught below → "let it pass".
|
|
229
113
|
if (baseUrl.includes("openrouter")) {
|
|
230
114
|
const res = await fetch("https://openrouter.ai/api/v1/auth/key", {
|
|
231
115
|
headers: { Authorization: `Bearer ${apiKey}` },
|
|
116
|
+
signal: AbortSignal.timeout(10_000),
|
|
232
117
|
});
|
|
233
118
|
const data = await res.json();
|
|
234
119
|
return !data.error;
|
|
@@ -236,6 +121,7 @@ export async function validateApiKey(baseUrl, apiKey) {
|
|
|
236
121
|
const url = baseUrl.replace(/\/$/, "") + "/models";
|
|
237
122
|
const res = await fetch(url, {
|
|
238
123
|
headers: { Authorization: `Bearer ${apiKey}` },
|
|
124
|
+
signal: AbortSignal.timeout(10_000),
|
|
239
125
|
});
|
|
240
126
|
return res.status !== 401 && res.status !== 403;
|
|
241
127
|
}
|
|
@@ -257,92 +143,31 @@ export function resolveApiKey(optionsApiKey, settingsApiKey) {
|
|
|
257
143
|
if (!p.envKey)
|
|
258
144
|
continue;
|
|
259
145
|
const v = process.env[p.envKey];
|
|
260
|
-
if (v
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
* ~/.code-shell/settings.json. Matches by baseUrl (each ProviderDef.baseUrl
|
|
268
|
-
* is unique, while `provider` is a generic kind like "openai" shared across
|
|
269
|
-
* multiple endpoints).
|
|
270
|
-
*
|
|
271
|
-
* Returns the first match found in: settings.models[] (preferred — newer),
|
|
272
|
-
* then settings.model (legacy top-level). undefined when nothing matches.
|
|
273
|
-
*/
|
|
274
|
-
export function findSavedKeyForProvider(provider) {
|
|
275
|
-
const file = join(homedir(), ".code-shell", "settings.json");
|
|
276
|
-
if (!existsSync(file))
|
|
277
|
-
return undefined;
|
|
278
|
-
let data;
|
|
279
|
-
try {
|
|
280
|
-
data = JSON.parse(readFileSync(file, "utf-8"));
|
|
281
|
-
}
|
|
282
|
-
catch {
|
|
283
|
-
return undefined;
|
|
284
|
-
}
|
|
285
|
-
if (Array.isArray(data?.models)) {
|
|
286
|
-
for (const m of data.models) {
|
|
287
|
-
if (m?.apiKey && m?.baseUrl === provider.baseUrl) {
|
|
288
|
-
return { apiKey: String(m.apiKey), baseUrl: String(m.baseUrl) };
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
if (data?.model?.apiKey && data?.model?.baseUrl === provider.baseUrl) {
|
|
293
|
-
return {
|
|
294
|
-
apiKey: String(data.model.apiKey),
|
|
295
|
-
baseUrl: String(data.model.baseUrl),
|
|
296
|
-
};
|
|
146
|
+
if (!v)
|
|
147
|
+
continue;
|
|
148
|
+
// Same sanitization boundary as detectEnvKeys — env-sourced keys carry
|
|
149
|
+
// CRLF/BOM/zero-width/control chars; .trim() alone misses interior ones.
|
|
150
|
+
const cleaned = sanitizeApiKey(v).value;
|
|
151
|
+
if (cleaned)
|
|
152
|
+
return cleaned;
|
|
297
153
|
}
|
|
298
154
|
return undefined;
|
|
299
155
|
}
|
|
300
|
-
/**
|
|
301
|
-
* Return the list of model IDs previously saved under this provider
|
|
302
|
-
* (matched by baseUrl). Used by the onboarding wizard to pre-populate the
|
|
303
|
-
* "model pool" step with the user's prior choices instead of resetting to
|
|
304
|
-
* just the provider's first model.
|
|
305
|
-
*/
|
|
306
|
-
export function loadSavedModelsForProvider(provider) {
|
|
307
|
-
const file = join(homedir(), ".code-shell", "settings.json");
|
|
308
|
-
if (!existsSync(file))
|
|
309
|
-
return [];
|
|
310
|
-
let data;
|
|
311
|
-
try {
|
|
312
|
-
data = JSON.parse(readFileSync(file, "utf-8"));
|
|
313
|
-
}
|
|
314
|
-
catch {
|
|
315
|
-
return [];
|
|
316
|
-
}
|
|
317
|
-
if (!Array.isArray(data?.models))
|
|
318
|
-
return [];
|
|
319
|
-
const out = [];
|
|
320
|
-
for (const m of data.models) {
|
|
321
|
-
if (m?.baseUrl === provider.baseUrl && typeof m?.model === "string") {
|
|
322
|
-
out.push(m.model);
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
return out;
|
|
326
|
-
}
|
|
327
156
|
export function hasApiKey() {
|
|
328
157
|
// Env variables alone are NOT enough to skip onboarding — they're surfaced
|
|
329
158
|
// as a one-click option on the provider page instead. We only skip when the
|
|
330
|
-
// user has explicitly persisted a config.
|
|
331
|
-
//
|
|
332
|
-
//
|
|
333
|
-
// ProviderModelFlow actually writes). Missing any one of these made
|
|
334
|
-
// /logout look like a no-op when the others still held credentials.
|
|
159
|
+
// user has explicitly persisted a config. Unified catalog: a credential with
|
|
160
|
+
// an apiKey, or any configured modelConnection, counts as "set up". The
|
|
161
|
+
// legacy model.apiKey / models[] / providers[] locations were removed.
|
|
335
162
|
// Reads ~/.code-shell/ only — ~/.claude/ compat was dropped because Claude
|
|
336
163
|
// Code's settings schema diverges and merging broke boot.
|
|
337
|
-
const p = join(
|
|
164
|
+
const p = join(userHome(), ".code-shell", "settings.json");
|
|
338
165
|
if (existsSync(p)) {
|
|
339
166
|
try {
|
|
340
167
|
const data = JSON.parse(readFileSync(p, "utf-8"));
|
|
341
|
-
if (data?.
|
|
342
|
-
return true;
|
|
343
|
-
if (Array.isArray(data?.models) && data.models.some((m) => m?.apiKey))
|
|
168
|
+
if (Array.isArray(data?.credentials) && data.credentials.some((c) => c?.apiKey))
|
|
344
169
|
return true;
|
|
345
|
-
if (Array.isArray(data?.
|
|
170
|
+
if (Array.isArray(data?.modelConnections) && data.modelConnections.length > 0)
|
|
346
171
|
return true;
|
|
347
172
|
}
|
|
348
173
|
catch { /* ignore */ }
|
|
@@ -350,54 +175,8 @@ export function hasApiKey() {
|
|
|
350
175
|
return false;
|
|
351
176
|
}
|
|
352
177
|
// ─── Model pool helpers ───────────────────────────────────────────
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
"anthropic/claude-opus-4.7": 32000,
|
|
356
|
-
"anthropic/claude-opus-4-7": 32000,
|
|
357
|
-
"claude-opus-4-7": 32000,
|
|
358
|
-
"anthropic/claude-sonnet-4.6": 16000,
|
|
359
|
-
"anthropic/claude-sonnet-4-6": 16000,
|
|
360
|
-
"claude-sonnet-4-6": 16000,
|
|
361
|
-
"anthropic/claude-haiku-4.5": 8192,
|
|
362
|
-
"anthropic/claude-haiku-4-5": 8192,
|
|
363
|
-
"claude-haiku-4-5": 8192,
|
|
364
|
-
"openai/gpt-5": 32000,
|
|
365
|
-
"openai/gpt-5-mini": 32000,
|
|
366
|
-
"openai/gpt-5-nano": 16000,
|
|
367
|
-
"gpt-5": 32000,
|
|
368
|
-
"gpt-5-mini": 32000,
|
|
369
|
-
"gpt-5-nano": 16000,
|
|
370
|
-
"openai/gpt-4o": 16384,
|
|
371
|
-
"gpt-4o": 16384,
|
|
372
|
-
"openai/o4-mini": 100000,
|
|
373
|
-
"o4-mini": 100000,
|
|
374
|
-
"openai/o3": 100000,
|
|
375
|
-
"o3": 100000,
|
|
376
|
-
"google/gemini-2.5-pro": 65536,
|
|
377
|
-
"google/gemini-2.5-flash": 65536,
|
|
378
|
-
"gemini-2.5-pro": 65536,
|
|
379
|
-
"gemini-2.5-flash": 65536,
|
|
380
|
-
"gemini-2.0-flash": 8192,
|
|
381
|
-
"deepseek/deepseek-v3.2": 8192,
|
|
382
|
-
"deepseek/deepseek-r1": 8192,
|
|
383
|
-
"deepseek-v4-flash": 8192,
|
|
384
|
-
"deepseek-v4-pro": 65536,
|
|
385
|
-
"deepseek-chat": 8192,
|
|
386
|
-
"qwen/qwen3-coder": 16384,
|
|
387
|
-
"meta-llama/llama-4-maverick": 32000,
|
|
388
|
-
};
|
|
389
|
-
/**
|
|
390
|
-
* Known context window sizes for direct-provider models (not routed through OpenRouter).
|
|
391
|
-
* These are the models whose IDs don't include a "vendor/" prefix.
|
|
392
|
-
*/
|
|
393
|
-
const KNOWN_CONTEXT_WINDOWS = {
|
|
394
|
-
"deepseek-v4-pro": 1_000_000,
|
|
395
|
-
"deepseek-v4-flash": 1_000_000,
|
|
396
|
-
"deepseek-chat": 1_000_000,
|
|
397
|
-
"deepseek/deepseek-chat": 1_000_000,
|
|
398
|
-
"deepseek/deepseek-v4-pro": 1_000_000,
|
|
399
|
-
"deepseek/deepseek-v4-flash": 1_000_000,
|
|
400
|
-
};
|
|
178
|
+
// KNOWN_MAX_OUTPUT / KNOWN_CONTEXT_WINDOWS now live in data/model-metadata.json
|
|
179
|
+
// (imported above) so they can be updated without a code change.
|
|
401
180
|
/**
|
|
402
181
|
* Resolve a model's max-output-token budget. Lookup order:
|
|
403
182
|
* 1. KNOWN_MAX_OUTPUT (covers direct providers like Anthropic/DeepSeek
|
|
@@ -500,58 +279,23 @@ export function modelDisplayName(model) {
|
|
|
500
279
|
return `Gemini ${parts.slice(1).join("-")}`;
|
|
501
280
|
return base.charAt(0).toUpperCase() + base.slice(1);
|
|
502
281
|
}
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
}
|
|
512
|
-
catch { }
|
|
513
|
-
}
|
|
514
|
-
const updated = {
|
|
515
|
-
...existing,
|
|
516
|
-
model: {
|
|
517
|
-
...(typeof existing.model === "object" ? existing.model : {}),
|
|
518
|
-
provider: result.provider,
|
|
519
|
-
name: result.model,
|
|
520
|
-
apiKey: result.apiKey,
|
|
521
|
-
baseUrl: result.baseUrl,
|
|
522
|
-
},
|
|
523
|
-
};
|
|
524
|
-
// Merge model pool: keep entries from other providers (matched by baseUrl)
|
|
525
|
-
// and replace just the current provider's slice. A naive overwrite would
|
|
526
|
-
// wipe out every other provider's models every time the wizard runs.
|
|
527
|
-
if (providerDef && poolModels && poolModels.length > 0) {
|
|
528
|
-
const newEntries = buildModelPool(providerDef, result.apiKey).filter((e) => new Set(poolModels).has(e.model));
|
|
529
|
-
const existingModels = Array.isArray(existing.models)
|
|
530
|
-
? existing.models
|
|
531
|
-
: [];
|
|
532
|
-
const otherProvider = existingModels.filter((e) => e?.baseUrl !== providerDef.baseUrl);
|
|
533
|
-
updated.models = [...otherProvider, ...newEntries];
|
|
534
|
-
}
|
|
535
|
-
writeFileSync(file, JSON.stringify(updated, null, 2) + "\n", "utf-8");
|
|
282
|
+
/**
|
|
283
|
+
* Map a provider kind → catalogId. If a builtin (or user) TEXT catalog entry
|
|
284
|
+
* with id===kind exists, use it; otherwise fall back to the generic "custom"
|
|
285
|
+
* OpenAI-compatible entry. resolveInstance() returns null for an unknown
|
|
286
|
+
* catalogId, so every connection's catalogId MUST exist in the merged catalog.
|
|
287
|
+
*/
|
|
288
|
+
function catalogIdForKind(kind) {
|
|
289
|
+
return getMergedCatalog().some((e) => e.id === kind && e.tag === "text") ? kind : "custom";
|
|
536
290
|
}
|
|
537
291
|
/**
|
|
538
|
-
*
|
|
539
|
-
*
|
|
540
|
-
*
|
|
541
|
-
* - settings.activeKey — primary source of truth for active model
|
|
542
|
-
* - settings.models[] — self-describing entries (key, provider,
|
|
543
|
-
* model, baseUrl, apiKey, maxOutput, maxContext)
|
|
544
|
-
* - settings.providers[] — credential source for the wizard
|
|
545
|
-
* - settings.model.* — legacy mirror of the active entry, kept in
|
|
546
|
-
* sync so legacy boot paths (cli/main.ts,
|
|
547
|
-
* repl.ts, run.ts) keep working without
|
|
548
|
-
* each having to learn about activeKey
|
|
549
|
-
*
|
|
550
|
-
* Append-only: never removes existing entries. To start over use /logout.
|
|
551
|
-
* Writes atomically via tmp+rename.
|
|
292
|
+
* 持久化 onboarding 结果到统一 catalog(credentials + modelConnections +
|
|
293
|
+
* defaults.text)。Append-only:相同 instanceId 跳过。defaults.text 设为 activeId。
|
|
294
|
+
* 原子写(tmp+rename)。(旧版写 legacy model.* / models / providers / activeKey,已删)
|
|
552
295
|
*/
|
|
553
296
|
export function appendOnboardingResult(opts) {
|
|
554
|
-
const
|
|
297
|
+
const tag = opts.tag ?? "text";
|
|
298
|
+
const dir = join(userHome(), ".code-shell");
|
|
555
299
|
const file = join(dir, "settings.json");
|
|
556
300
|
mkdirSync(dir, { recursive: true });
|
|
557
301
|
let existing = {};
|
|
@@ -559,56 +303,50 @@ export function appendOnboardingResult(opts) {
|
|
|
559
303
|
try {
|
|
560
304
|
existing = JSON.parse(readFileSync(file, "utf-8"));
|
|
561
305
|
}
|
|
562
|
-
catch {
|
|
563
|
-
/* ignore — corrupt file is replaced */
|
|
564
|
-
}
|
|
306
|
+
catch { /* corrupt → replace */ }
|
|
565
307
|
}
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
: [];
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
const
|
|
573
|
-
if (!
|
|
574
|
-
|
|
308
|
+
const creds = Array.isArray(existing.credentials)
|
|
309
|
+
? [...existing.credentials] : [];
|
|
310
|
+
const conns = Array.isArray(existing.modelConnections)
|
|
311
|
+
? [...existing.modelConnections] : [];
|
|
312
|
+
for (const m of opts.models) {
|
|
313
|
+
const catalogId = catalogIdForKind(m.kind);
|
|
314
|
+
const credId = `${m.instanceId}-key`;
|
|
315
|
+
if (!creds.some((c) => c?.id === credId)) {
|
|
316
|
+
creds.push({ id: credId, catalogId, apiKey: m.apiKey, baseUrl: m.baseUrl });
|
|
317
|
+
}
|
|
318
|
+
if (!conns.some((c) => c?.id === m.instanceId)) {
|
|
319
|
+
conns.push({
|
|
320
|
+
id: m.instanceId, catalogId, tag, model: m.model, credentialId: credId,
|
|
321
|
+
...(m.baseUrl ? { baseUrl: m.baseUrl } : {}),
|
|
322
|
+
});
|
|
323
|
+
}
|
|
575
324
|
}
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
// means the user re-added the exact same alias and we leave the older
|
|
579
|
-
// entry alone rather than silently overwriting credentials).
|
|
580
|
-
const existingModels = Array.isArray(existing.models)
|
|
581
|
-
? existing.models
|
|
582
|
-
: [];
|
|
583
|
-
const existingKeys = new Set(existingModels.map((m) => m?.key));
|
|
584
|
-
const modelsToAppend = opts.addedModels.filter((m) => !existingKeys.has(m.key));
|
|
325
|
+
const existingDefaults = (typeof existing.defaults === "object" && existing.defaults)
|
|
326
|
+
? existing.defaults : {};
|
|
585
327
|
const updated = {
|
|
586
328
|
...existing,
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
provider: opts.activeMirror.provider,
|
|
591
|
-
name: opts.activeMirror.model,
|
|
592
|
-
apiKey: opts.activeMirror.apiKey,
|
|
593
|
-
baseUrl: opts.activeMirror.baseUrl,
|
|
594
|
-
},
|
|
595
|
-
providers: providersOut,
|
|
596
|
-
models: [...existingModels, ...modelsToAppend],
|
|
329
|
+
credentials: creds,
|
|
330
|
+
modelConnections: conns,
|
|
331
|
+
defaults: { ...existingDefaults, [tag]: opts.activeId },
|
|
597
332
|
};
|
|
598
333
|
// Atomic write: tmp file in the same dir, then rename (atomic on POSIX).
|
|
334
|
+
// mode 0o600 — settings.json holds plaintext API keys, must be owner-only.
|
|
599
335
|
const tmp = `${file}.${process.pid}.tmp`;
|
|
600
|
-
writeFileSync(tmp, JSON.stringify(updated, null, 2) + "\n", "utf-8");
|
|
336
|
+
writeFileSync(tmp, JSON.stringify(updated, null, 2) + "\n", { encoding: "utf-8", mode: 0o600 });
|
|
601
337
|
try {
|
|
602
338
|
renameSync(tmp, file);
|
|
603
339
|
}
|
|
604
340
|
catch {
|
|
605
|
-
// Fallback: best-effort direct write if rename fails (e.g. cross-device)
|
|
606
|
-
|
|
341
|
+
// Fallback: best-effort direct write if rename fails (e.g. cross-device),
|
|
342
|
+
// then remove the orphaned temp file the failed rename left behind.
|
|
343
|
+
writeFileSync(file, JSON.stringify(updated, null, 2) + "\n", { encoding: "utf-8", mode: 0o600 });
|
|
344
|
+
rmSync(tmp, { force: true });
|
|
607
345
|
}
|
|
608
346
|
}
|
|
609
347
|
// saveArenaSettings removed — replaced by saveArenaSettingsByKeys
|
|
610
348
|
export function saveArenaSettingsByKeys(keys) {
|
|
611
|
-
const dir = join(
|
|
349
|
+
const dir = join(userHome(), ".code-shell");
|
|
612
350
|
const file = join(dir, "settings.json");
|
|
613
351
|
let existing = {};
|
|
614
352
|
if (existsSync(file)) {
|
|
@@ -621,5 +359,9 @@ export function saveArenaSettingsByKeys(keys) {
|
|
|
621
359
|
...existing,
|
|
622
360
|
arena: { participants: keys },
|
|
623
361
|
};
|
|
624
|
-
writeFileSync(file, JSON.stringify(updated, null, 2) + "\n", "utf-8");
|
|
362
|
+
writeFileSync(file, JSON.stringify(updated, null, 2) + "\n", { encoding: "utf-8", mode: 0o600 });
|
|
363
|
+
try {
|
|
364
|
+
chmodSync(file, 0o600);
|
|
365
|
+
}
|
|
366
|
+
catch { /* best-effort */ }
|
|
625
367
|
}
|