@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/llm/client-base.js
CHANGED
|
@@ -3,15 +3,26 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { LLMError, ContextLimitError, LLMRateLimitError } from "../exceptions.js";
|
|
5
5
|
import { logger } from "../logging/logger.js";
|
|
6
|
+
function emptyUsageTracker() {
|
|
7
|
+
return {
|
|
8
|
+
records: [],
|
|
9
|
+
totalPromptTokens: 0,
|
|
10
|
+
totalCompletionTokens: 0,
|
|
11
|
+
totalTokens: 0,
|
|
12
|
+
totalCacheReadTokens: 0,
|
|
13
|
+
totalCacheCreationTokens: 0,
|
|
14
|
+
requestCount: 0,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
6
17
|
export class LLMClientBase {
|
|
7
18
|
config;
|
|
8
19
|
provider;
|
|
9
20
|
model;
|
|
10
|
-
temperature;
|
|
11
21
|
maxTokens;
|
|
22
|
+
temperature;
|
|
12
23
|
timeout;
|
|
13
24
|
retryMaxAttempts;
|
|
14
|
-
|
|
25
|
+
imageDetail;
|
|
15
26
|
/**
|
|
16
27
|
* Process-wide hook fired on every LLM response. The CLI installs this in
|
|
17
28
|
* main.ts to feed the cost tracker; lives on the base class so every code
|
|
@@ -19,22 +30,27 @@ export class LLMClientBase {
|
|
|
19
30
|
* each call site needing to remember.
|
|
20
31
|
*/
|
|
21
32
|
static onUsage;
|
|
22
|
-
usage =
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
constructor(config) {
|
|
33
|
+
usage = emptyUsageTracker();
|
|
34
|
+
/**
|
|
35
|
+
* `config` carries model identity (provider/model/apiKey/baseUrl/maxTokens/
|
|
36
|
+
* thinking/providerKind). `defaults` carries cross-model runtime knobs
|
|
37
|
+
* (temperature/timeout/retryMaxAttempts/imageDetail) — those are owned by
|
|
38
|
+
* the Engine and stay stable across hot model switches.
|
|
39
|
+
*/
|
|
40
|
+
constructor(config, defaults) {
|
|
30
41
|
this.config = config;
|
|
31
42
|
this.provider = config.provider;
|
|
32
43
|
this.model = config.model;
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
44
|
+
// No `?? 8192` fallback: when the model's output ceiling is unknown we keep
|
|
45
|
+
// `undefined` so each provider decides (OpenAI omits the field and lets the
|
|
46
|
+
// endpoint use its own max; Anthropic, where max_tokens is required, supplies
|
|
47
|
+
// a conservative default at request time). Forcing 8192 here truncated long
|
|
48
|
+
// outputs — a streamed tool-arg JSON cut off mid-token → "Missing file_path".
|
|
49
|
+
this.maxTokens = config.maxTokens;
|
|
50
|
+
this.temperature = defaults?.temperature ?? 0.3;
|
|
51
|
+
this.timeout = defaults?.timeout ?? 120_000;
|
|
52
|
+
this.retryMaxAttempts = defaults?.retryMaxAttempts ?? 3;
|
|
53
|
+
this.imageDetail = defaults?.imageDetail;
|
|
38
54
|
this.initClient();
|
|
39
55
|
}
|
|
40
56
|
recordUsage(usage, options) {
|
|
@@ -44,23 +60,112 @@ export class LLMClientBase {
|
|
|
44
60
|
this.usage.totalPromptTokens += usage.promptTokens;
|
|
45
61
|
this.usage.totalCompletionTokens += usage.completionTokens;
|
|
46
62
|
this.usage.totalTokens += usage.totalTokens;
|
|
63
|
+
this.usage.totalCacheReadTokens += usage.cacheReadTokens ?? 0;
|
|
64
|
+
this.usage.totalCacheCreationTokens += usage.cacheCreationTokens ?? 0;
|
|
47
65
|
this.usage.requestCount++;
|
|
48
66
|
LLMClientBase.onUsage?.(this.model, usage);
|
|
49
67
|
}
|
|
50
68
|
getUsage() {
|
|
51
69
|
return { ...this.usage };
|
|
52
70
|
}
|
|
53
|
-
|
|
54
|
-
|
|
71
|
+
/** Zero all accumulated usage. Used when starting a fresh accounting window
|
|
72
|
+
* (e.g. after a model switch, where the prior model's cache stats no longer
|
|
73
|
+
* apply). */
|
|
74
|
+
resetUsage() {
|
|
75
|
+
this.usage = emptyUsageTracker();
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Compose the caller's AbortSignal with a hard per-request deadline.
|
|
79
|
+
*
|
|
80
|
+
* The provider SDKs accept a `timeout`, but in practice it does NOT fire for
|
|
81
|
+
* a *half-dead socket* (TCP connected, keep-alives flowing, but no response
|
|
82
|
+
* bytes) — we have observed real requests hang 15–33 minutes before the SDK
|
|
83
|
+
* finally surfaced "Socket timeout". The streaming idle-watchdog only covers
|
|
84
|
+
* the gap BETWEEN chunks, not connection setup / first byte, and non-stream
|
|
85
|
+
* calls don't go through it at all. An explicit AbortSignal.timeout is the
|
|
86
|
+
* one mechanism that reliably tears such a request down.
|
|
87
|
+
*
|
|
88
|
+
* Returns a signal to hand the SDK (`{ signal }`) plus a `cleanup()` to clear
|
|
89
|
+
* the timer once the request settles. The deadline is generous (default 2×
|
|
90
|
+
* the SDK timeout, min 120s) — long enough for slow-but-alive generations,
|
|
91
|
+
* short enough that a wedged socket can't burn half an hour.
|
|
92
|
+
*/
|
|
93
|
+
withRequestDeadline(callerSignal) {
|
|
94
|
+
const deadlineMs = Math.max(this.timeout * 2, 120_000);
|
|
95
|
+
const deadline = AbortSignal.timeout(deadlineMs);
|
|
96
|
+
// AbortSignal.any is available in Node ≥20 / Bun; combine so EITHER the
|
|
97
|
+
// user's cancel OR the deadline aborts the request.
|
|
98
|
+
const signal = callerSignal
|
|
99
|
+
? AbortSignal.any([callerSignal, deadline])
|
|
100
|
+
: deadline;
|
|
101
|
+
// AbortSignal.timeout's timer is unref'd by the runtime; no manual clear is
|
|
102
|
+
// strictly required, but expose cleanup for symmetry / future tightening.
|
|
103
|
+
return { signal, cleanup: () => { } };
|
|
104
|
+
}
|
|
105
|
+
async withRetry(fn, opts) {
|
|
106
|
+
const attempts = opts?.maxAttempts ?? this.retryMaxAttempts;
|
|
107
|
+
const signal = opts?.signal;
|
|
55
108
|
let lastError;
|
|
56
109
|
for (let attempt = 1; attempt <= attempts; attempt++) {
|
|
110
|
+
// Bail BEFORE issuing (or re-issuing) the request if the run was
|
|
111
|
+
// cancelled. Without this, a cancel that lands during a backoff sleep —
|
|
112
|
+
// or while a flaky connection hangs — still re-fires the same doomed
|
|
113
|
+
// request, so the user's Stop "does nothing" until all attempts +
|
|
114
|
+
// backoffs drain (~50 s for a 3× Connection-error loop). Checking here
|
|
115
|
+
// makes Cancel take effect at the next retry boundary.
|
|
116
|
+
if (signal?.aborted) {
|
|
117
|
+
throw new DOMException("Request cancelled", "AbortError");
|
|
118
|
+
}
|
|
119
|
+
// Per-attempt hard deadline composed with the caller's cancel signal.
|
|
120
|
+
// A half-dead socket that ignores the SDK timeout is torn down here.
|
|
121
|
+
const { signal: requestSignal, cleanup } = this.withRequestDeadline(signal);
|
|
57
122
|
try {
|
|
58
|
-
return await fn();
|
|
123
|
+
return await fn(requestSignal);
|
|
59
124
|
}
|
|
60
125
|
catch (err) {
|
|
61
126
|
lastError = err;
|
|
62
127
|
if (err instanceof ContextLimitError)
|
|
63
128
|
throw err;
|
|
129
|
+
// Distinguish a deadline tear-down from a user cancel. When the caller
|
|
130
|
+
// did NOT abort but the request signal did, the per-request deadline
|
|
131
|
+
// fired (wedged socket). That is RETRYABLE — fall through to the normal
|
|
132
|
+
// retry/backoff path rather than the abort-no-retry guard below, since
|
|
133
|
+
// the upstream may have just recovered.
|
|
134
|
+
const deadlineFired = !signal?.aborted && requestSignal.aborted;
|
|
135
|
+
if (deadlineFired) {
|
|
136
|
+
logger.warn("llm.request_deadline", {
|
|
137
|
+
cat: "llm",
|
|
138
|
+
provider: this.provider,
|
|
139
|
+
model: this.model,
|
|
140
|
+
attempt,
|
|
141
|
+
of: attempts,
|
|
142
|
+
});
|
|
143
|
+
if (attempt < attempts) {
|
|
144
|
+
const backoff = Math.min(1000 * Math.pow(2, attempt - 1), 30_000);
|
|
145
|
+
if (await abortableSleep(backoff, signal)) {
|
|
146
|
+
throw new DOMException("Request cancelled during retry backoff", "AbortError");
|
|
147
|
+
}
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
throw new LLMError(`request exceeded deadline (${Math.max(this.timeout * 2, 120_000)}ms) — connection wedged`, this.provider);
|
|
151
|
+
}
|
|
152
|
+
// User pressed ESC / Stop, or the run's AbortSignal fired. The SDK
|
|
153
|
+
// throws APIUserAbortError (no HTTP status, so isClientError below
|
|
154
|
+
// can't catch it). Retrying re-issues the same aborted request 3×
|
|
155
|
+
// with growing backoff — ~40 s of dead time ending in llm.exhausted,
|
|
156
|
+
// for work the user explicitly cancelled. Surface immediately.
|
|
157
|
+
// Also catch the case where the run aborted but the underlying error
|
|
158
|
+
// surfaced as a generic Connection error (not an SDK abort): the
|
|
159
|
+
// signal is the authoritative "user cancelled" source.
|
|
160
|
+
if (isAbortError(err) || signal?.aborted) {
|
|
161
|
+
logger.warn("llm.abort_no_retry", {
|
|
162
|
+
cat: "llm",
|
|
163
|
+
provider: this.provider,
|
|
164
|
+
model: this.model,
|
|
165
|
+
error: err.message,
|
|
166
|
+
});
|
|
167
|
+
throw err;
|
|
168
|
+
}
|
|
64
169
|
if (err instanceof LLMRateLimitError) {
|
|
65
170
|
const waitMs = (err.retryAfter ?? attempt * 2) * 1000;
|
|
66
171
|
logger.warn("llm.retry", {
|
|
@@ -72,7 +177,9 @@ export class LLMClientBase {
|
|
|
72
177
|
reason: "rate_limit",
|
|
73
178
|
waitMs,
|
|
74
179
|
});
|
|
75
|
-
|
|
180
|
+
if (await abortableSleep(waitMs, signal)) {
|
|
181
|
+
throw new DOMException("Request cancelled during retry backoff", "AbortError");
|
|
182
|
+
}
|
|
76
183
|
continue;
|
|
77
184
|
}
|
|
78
185
|
// 4xx (except 429, handled above as LLMRateLimitError) is a
|
|
@@ -111,27 +218,80 @@ export class LLMClientBase {
|
|
|
111
218
|
error: err.message,
|
|
112
219
|
backoffMs: backoff,
|
|
113
220
|
});
|
|
114
|
-
|
|
221
|
+
if (await abortableSleep(backoff, signal)) {
|
|
222
|
+
throw new DOMException("Request cancelled during retry backoff", "AbortError");
|
|
223
|
+
}
|
|
115
224
|
}
|
|
116
225
|
}
|
|
117
226
|
throw lastError ?? new LLMError("Unknown LLM error");
|
|
118
227
|
}
|
|
119
228
|
}
|
|
229
|
+
/**
|
|
230
|
+
* Sleep `ms`, but wake immediately if `signal` aborts. Returns true when it
|
|
231
|
+
* woke due to an abort (caller should bail), false on a normal timeout.
|
|
232
|
+
* Without this an abort during a retry backoff is invisible until the timer
|
|
233
|
+
* fires — the root cause of "Stop does nothing" during a flaky-connection
|
|
234
|
+
* retry loop.
|
|
235
|
+
*/
|
|
236
|
+
function abortableSleep(ms, signal) {
|
|
237
|
+
if (signal?.aborted)
|
|
238
|
+
return Promise.resolve(true);
|
|
239
|
+
return new Promise((resolve) => {
|
|
240
|
+
const timer = setTimeout(() => {
|
|
241
|
+
signal?.removeEventListener("abort", onAbort);
|
|
242
|
+
resolve(false);
|
|
243
|
+
}, ms);
|
|
244
|
+
const onAbort = () => {
|
|
245
|
+
clearTimeout(timer);
|
|
246
|
+
resolve(true);
|
|
247
|
+
};
|
|
248
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
249
|
+
});
|
|
250
|
+
}
|
|
120
251
|
/**
|
|
121
252
|
* Detect HTTP 4xx errors from provider SDKs so withRetry can bail
|
|
122
|
-
* without burning backoff time. OpenAI/Anthropic SDKs
|
|
123
|
-
*
|
|
124
|
-
*
|
|
253
|
+
* without burning backoff time. OpenAI/Anthropic SDKs attach a numeric
|
|
254
|
+
* `status` to their error objects; we treat 400-499 as non-retryable
|
|
255
|
+
* (429 is handled separately above as a rate-limit).
|
|
256
|
+
*
|
|
257
|
+
* The provider clients also wrap SDK errors into `new LLMError(msg,
|
|
258
|
+
* provider, { status })`, where the status lands in
|
|
259
|
+
* `FrameworkError.details.status` rather than a top-level `.status`.
|
|
260
|
+
* We read both so a wrapped 400/401/404 isn't retried 3× (~9 s wasted)
|
|
261
|
+
* before finally surfacing.
|
|
125
262
|
*
|
|
126
263
|
* Network errors and 5xx fall through and remain retryable.
|
|
264
|
+
*
|
|
265
|
+
* Exported for unit testing.
|
|
127
266
|
*/
|
|
128
|
-
function isClientError(err) {
|
|
267
|
+
export function isClientError(err) {
|
|
129
268
|
if (typeof err !== "object" || err === null)
|
|
130
269
|
return false;
|
|
131
|
-
const
|
|
270
|
+
const top = err.status;
|
|
271
|
+
const buried = err.details?.status;
|
|
272
|
+
const status = typeof top === "number" ? top : typeof buried === "number" ? buried : undefined;
|
|
132
273
|
if (typeof status !== "number")
|
|
133
274
|
return false;
|
|
134
275
|
if (status === 429)
|
|
135
276
|
return false;
|
|
136
277
|
return status >= 400 && status < 500;
|
|
137
278
|
}
|
|
279
|
+
/**
|
|
280
|
+
* Detect a user/run cancellation. The OpenAI and Anthropic SDKs throw
|
|
281
|
+
* `APIUserAbortError` when a request's AbortSignal fires mid-flight; the
|
|
282
|
+
* providers rethrow it unchanged (see handleApiError). It carries no HTTP
|
|
283
|
+
* `status`, so `isClientError` can't recognise it — without an explicit
|
|
284
|
+
* check it falls through to `withRetry`'s generic branch and gets retried.
|
|
285
|
+
*
|
|
286
|
+
* We match by error name rather than `instanceof` to avoid importing the
|
|
287
|
+
* provider SDKs into the base class: `APIUserAbortError` from the SDKs, and
|
|
288
|
+
* the WHATWG `AbortError` from `fetch`/AbortController, both surface here.
|
|
289
|
+
*
|
|
290
|
+
* Exported for unit testing.
|
|
291
|
+
*/
|
|
292
|
+
export function isAbortError(err) {
|
|
293
|
+
if (typeof err !== "object" || err === null)
|
|
294
|
+
return false;
|
|
295
|
+
const name = err.name;
|
|
296
|
+
return name === "APIUserAbortError" || name === "AbortError";
|
|
297
|
+
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* LLM provider factory with registry pattern.
|
|
3
3
|
*/
|
|
4
|
-
import type { LLMConfig } from "../types.js";
|
|
4
|
+
import type { ClientDefaults, LLMConfig } from "../types.js";
|
|
5
5
|
import type { LLMClientBase } from "./client-base.js";
|
|
6
|
-
type ProviderConstructor = new (config: LLMConfig) => LLMClientBase;
|
|
6
|
+
type ProviderConstructor = new (config: LLMConfig, defaults?: ClientDefaults) => LLMClientBase;
|
|
7
7
|
declare const PROVIDER_REGISTRY: Map<string, ProviderConstructor>;
|
|
8
8
|
export declare function registerProvider(name: string, cls: ProviderConstructor): void;
|
|
9
|
-
export declare function createLLMClient(config: LLMConfig): Promise<LLMClientBase>;
|
|
9
|
+
export declare function createLLMClient(config: LLMConfig, defaults?: ClientDefaults): Promise<LLMClientBase>;
|
|
10
10
|
export { PROVIDER_REGISTRY };
|
|
@@ -6,7 +6,7 @@ const PROVIDER_REGISTRY = new Map();
|
|
|
6
6
|
export function registerProvider(name, cls) {
|
|
7
7
|
PROVIDER_REGISTRY.set(name, cls);
|
|
8
8
|
}
|
|
9
|
-
export async function createLLMClient(config) {
|
|
9
|
+
export async function createLLMClient(config, defaults) {
|
|
10
10
|
let Cls = PROVIDER_REGISTRY.get(config.provider);
|
|
11
11
|
if (!Cls) {
|
|
12
12
|
// Auto-register built-in providers on first use
|
|
@@ -24,6 +24,6 @@ export async function createLLMClient(config) {
|
|
|
24
24
|
if (!Cls) {
|
|
25
25
|
throw new LLMError(`Unknown LLM provider: ${config.provider}. Available: ${[...PROVIDER_REGISTRY.keys()].join(", ")}`);
|
|
26
26
|
}
|
|
27
|
-
return new Cls(config);
|
|
27
|
+
return new Cls(config, defaults);
|
|
28
28
|
}
|
|
29
29
|
export { PROVIDER_REGISTRY };
|
package/dist/llm/model-cache.js
CHANGED
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
* reads, isStale just checks. Malformed/missing files yield undefined.
|
|
7
7
|
*/
|
|
8
8
|
import { readFileSync, writeFileSync, mkdirSync, existsSync } from "node:fs";
|
|
9
|
-
import { homedir } from "node:os";
|
|
10
9
|
import { join } from "node:path";
|
|
10
|
+
import { userHome } from "../settings/manager.js";
|
|
11
11
|
const TTL_MS = 7 * 24 * 3600 * 1000;
|
|
12
12
|
export function readCache(cacheDir, providerKey) {
|
|
13
13
|
const path = join(cacheDir, `${providerKey}.json`);
|
|
@@ -42,5 +42,7 @@ export function isStale(file, now = Date.now()) {
|
|
|
42
42
|
return now - ts > TTL_MS;
|
|
43
43
|
}
|
|
44
44
|
export function defaultCacheDir() {
|
|
45
|
-
|
|
45
|
+
// userHome() (not raw homedir(), which bun caches at process start) so a
|
|
46
|
+
// relocated/test HOME redirects the cache dir instead of writing real ~/.code-shell.
|
|
47
|
+
return join(userHome(), ".code-shell", "cache", "models");
|
|
46
48
|
}
|
package/dist/llm/model-pool.d.ts
CHANGED
|
@@ -23,19 +23,32 @@ export interface ModelEntry {
|
|
|
23
23
|
model: string;
|
|
24
24
|
baseUrl?: string;
|
|
25
25
|
apiKey?: string;
|
|
26
|
+
/** Whether the catalog template requires a key (default true; false = local/
|
|
27
|
+
* no-auth provider). Used by resolveLLMConfigForTag to reject a key-needing
|
|
28
|
+
* connection that has no resolved key with a clear error rather than a 401. */
|
|
29
|
+
needsKey?: boolean;
|
|
26
30
|
maxOutputTokens?: number;
|
|
27
31
|
/** Per-model context window size. Falls back to config.maxContextTokens → 200_000. */
|
|
28
32
|
maxContextTokens?: number;
|
|
29
33
|
/** Optional reference into ProviderCatalog. When set, baseUrl/apiKey
|
|
30
34
|
* come from the catalog unless the entry overrides them. */
|
|
31
35
|
providerKey?: string;
|
|
36
|
+
/** Per-model external token command; overrides provider-level (TODO 7.2). */
|
|
37
|
+
authCommand?: string;
|
|
38
|
+
/** Per-model extra HTTP headers; merged over provider-level (TODO 7.2). */
|
|
39
|
+
httpHeaders?: Record<string, string>;
|
|
40
|
+
/** OpenAI `service_tier` request param (TODO 7.2). */
|
|
41
|
+
serviceTier?: string;
|
|
42
|
+
/** OpenAI reasoning `summary` control (TODO 7.2). */
|
|
43
|
+
reasoningSummary?: string;
|
|
32
44
|
/**
|
|
33
|
-
* Per-model
|
|
34
|
-
* (ProviderCatalog entry's `
|
|
35
|
-
* provider need different defaults — e.g.
|
|
36
|
-
* V4 Flash on.
|
|
45
|
+
* Per-model reasoning override. Wins over the provider-level setting
|
|
46
|
+
* (ProviderCatalog entry's `reasoning`). Useful when models in the same
|
|
47
|
+
* provider need different defaults — e.g. one model off but another on.
|
|
37
48
|
*/
|
|
38
|
-
|
|
49
|
+
reasoning?: import("./reasoning-setting.js").ReasoningSetting;
|
|
50
|
+
/** Catalog-driven extra request-body fields (wire-mapped paramValues). */
|
|
51
|
+
extraBody?: Record<string, unknown>;
|
|
39
52
|
}
|
|
40
53
|
export declare class ModelPool {
|
|
41
54
|
private models;
|
|
@@ -83,13 +96,18 @@ export declare class ModelPool {
|
|
|
83
96
|
/** Check if a key exists. */
|
|
84
97
|
has(key: string): boolean;
|
|
85
98
|
/**
|
|
86
|
-
* Build an LLMConfig
|
|
87
|
-
*
|
|
99
|
+
* Build an LLMConfig (pure model identity) for the given entry. Cross-model
|
|
100
|
+
* runtime knobs (temperature/timeout/retryMaxAttempts/imageDetail) are NOT
|
|
101
|
+
* part of LLMConfig — they live on the Engine as ClientDefaults and are
|
|
102
|
+
* threaded into the LLMClient independently. That separation lets hot-
|
|
103
|
+
* switching the model replace this object wholesale without touching the
|
|
104
|
+
* user's runtime preferences (and without leaking the old model's settings
|
|
105
|
+
* onto a model that doesn't share them — e.g. 384k-output deepseek bleeding
|
|
106
|
+
* into 128k-cap gpt-5.5).
|
|
88
107
|
*/
|
|
89
|
-
toLLMConfig(entry: ModelEntry
|
|
108
|
+
toLLMConfig(entry: ModelEntry): LLMConfig;
|
|
90
109
|
/**
|
|
91
|
-
* Build an LLMConfig for the active model (or a specific key)
|
|
92
|
-
* merging with a base config.
|
|
110
|
+
* Build an LLMConfig for the active model (or a specific key).
|
|
93
111
|
*/
|
|
94
|
-
resolveLLMConfig(key?: string
|
|
112
|
+
resolveLLMConfig(key?: string): LLMConfig | undefined;
|
|
95
113
|
}
|
package/dist/llm/model-pool.js
CHANGED
|
@@ -193,10 +193,16 @@ export class ModelPool {
|
|
|
193
193
|
return this.models.has(key);
|
|
194
194
|
}
|
|
195
195
|
/**
|
|
196
|
-
* Build an LLMConfig
|
|
197
|
-
*
|
|
196
|
+
* Build an LLMConfig (pure model identity) for the given entry. Cross-model
|
|
197
|
+
* runtime knobs (temperature/timeout/retryMaxAttempts/imageDetail) are NOT
|
|
198
|
+
* part of LLMConfig — they live on the Engine as ClientDefaults and are
|
|
199
|
+
* threaded into the LLMClient independently. That separation lets hot-
|
|
200
|
+
* switching the model replace this object wholesale without touching the
|
|
201
|
+
* user's runtime preferences (and without leaking the old model's settings
|
|
202
|
+
* onto a model that doesn't share them — e.g. 384k-output deepseek bleeding
|
|
203
|
+
* into 128k-cap gpt-5.5).
|
|
198
204
|
*/
|
|
199
|
-
toLLMConfig(entry
|
|
205
|
+
toLLMConfig(entry) {
|
|
200
206
|
const fromCat = entry.providerKey && this.providerCatalog
|
|
201
207
|
? this.providerCatalog.get(entry.providerKey)
|
|
202
208
|
: undefined;
|
|
@@ -215,32 +221,42 @@ export class ModelPool {
|
|
|
215
221
|
kindToClientProvider(fromCat?.kind) ||
|
|
216
222
|
"openai",
|
|
217
223
|
model: entry.model,
|
|
218
|
-
apiKey: entry.apiKey ?? fromCat?.apiKey
|
|
219
|
-
baseUrl: entry.baseUrl ?? fromCat?.baseUrl
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
//
|
|
224
|
-
|
|
225
|
-
//
|
|
226
|
-
...(entry.
|
|
227
|
-
? {
|
|
224
|
+
apiKey: entry.apiKey ?? fromCat?.apiKey,
|
|
225
|
+
baseUrl: entry.baseUrl ?? fromCat?.baseUrl,
|
|
226
|
+
// No invented default: undefined lets each client apply its own fallback
|
|
227
|
+
// (OpenAI omits the token field entirely; Anthropic uses its own constant)
|
|
228
|
+
// instead of fabricating 8192, which silently truncates long outputs and
|
|
229
|
+
// masks the real per-model cap.
|
|
230
|
+
maxTokens: entry.maxOutputTokens,
|
|
231
|
+
// reasoning: entry overrides catalog. No base fallback — see class doc.
|
|
232
|
+
...(entry.reasoning ?? fromCat?.reasoning
|
|
233
|
+
? { reasoning: entry.reasoning ?? fromCat?.reasoning }
|
|
228
234
|
: {}),
|
|
235
|
+
// Auth command: entry overrides catalog. (TODO 7.2)
|
|
236
|
+
...(entry.authCommand ?? fromCat?.authCommand
|
|
237
|
+
? { authCommand: entry.authCommand ?? fromCat?.authCommand }
|
|
238
|
+
: {}),
|
|
239
|
+
// HTTP headers: merge catalog (base) then entry (override). (TODO 7.2)
|
|
240
|
+
...(fromCat?.httpHeaders || entry.httpHeaders
|
|
241
|
+
? { httpHeaders: { ...fromCat?.httpHeaders, ...entry.httpHeaders } }
|
|
242
|
+
: {}),
|
|
243
|
+
...(entry.serviceTier ? { serviceTier: entry.serviceTier } : {}),
|
|
244
|
+
...(entry.reasoningSummary ? { reasoningSummary: entry.reasoningSummary } : {}),
|
|
229
245
|
// Carry the catalog kind through so the capability layer can pick
|
|
230
|
-
// per-(kind, model) request-shape rules.
|
|
231
|
-
// unusual case where an entry has a provider but no providerKey
|
|
232
|
-
// (legacy / arena-injected models).
|
|
246
|
+
// per-(kind, model) request-shape rules.
|
|
233
247
|
...(fromCat?.kind ? { providerKind: fromCat.kind } : {}),
|
|
248
|
+
...(entry.extraBody && Object.keys(entry.extraBody).length > 0
|
|
249
|
+
? { extraBody: entry.extraBody }
|
|
250
|
+
: {}),
|
|
234
251
|
};
|
|
235
252
|
}
|
|
236
253
|
/**
|
|
237
|
-
* Build an LLMConfig for the active model (or a specific key)
|
|
238
|
-
* merging with a base config.
|
|
254
|
+
* Build an LLMConfig for the active model (or a specific key).
|
|
239
255
|
*/
|
|
240
|
-
resolveLLMConfig(key
|
|
256
|
+
resolveLLMConfig(key) {
|
|
241
257
|
const entry = this.get(key);
|
|
242
258
|
if (!entry)
|
|
243
259
|
return undefined;
|
|
244
|
-
return this.toLLMConfig(entry
|
|
260
|
+
return this.toLLMConfig(entry);
|
|
245
261
|
}
|
|
246
262
|
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider auth/header resolution for custom model providers (TODO 7.2).
|
|
3
|
+
*
|
|
4
|
+
* - `authCommand`: a shell command whose stdout is an auth token. Used for
|
|
5
|
+
* short-lived tokens vended by an external tool (gcloud, aws, vault…). The
|
|
6
|
+
* result is cached briefly so we don't re-run the command on every request.
|
|
7
|
+
* - `httpHeaders`: extra headers; a `$ENV_VAR` value is resolved from the
|
|
8
|
+
* environment at build time so secrets stay out of settings.json.
|
|
9
|
+
*
|
|
10
|
+
* The token-running side is isolated behind a `runCommand` injection so the
|
|
11
|
+
* env-var + caching logic is unit-testable without spawning a shell.
|
|
12
|
+
*/
|
|
13
|
+
/** Resolve `$ENV` / `${ENV}` placeholders in a header value against `env`. */
|
|
14
|
+
export declare function resolveHeaderValue(value: string, env?: NodeJS.ProcessEnv): string;
|
|
15
|
+
/** Resolve every header value's env placeholders, dropping empties. */
|
|
16
|
+
export declare function resolveHeaders(headers: Record<string, string> | undefined, env?: NodeJS.ProcessEnv): Record<string, string>;
|
|
17
|
+
type RunCommand = (cmd: string) => string;
|
|
18
|
+
/**
|
|
19
|
+
* Run an auth command and return its trimmed first line as the token. Caches
|
|
20
|
+
* by command string for {@link TOKEN_TTL_MS}. `now`/`runCommand` are injectable
|
|
21
|
+
* for tests. Returns "" if the command yields no output.
|
|
22
|
+
*/
|
|
23
|
+
export declare function resolveAuthCommand(command: string, opts?: {
|
|
24
|
+
runCommand?: RunCommand;
|
|
25
|
+
now?: number;
|
|
26
|
+
}): string;
|
|
27
|
+
/** Test seam: clear the token cache. */
|
|
28
|
+
export declare function __clearAuthTokenCache(): void;
|
|
29
|
+
/**
|
|
30
|
+
* Resolve the effective API key for a client: an explicit `apiKey` wins;
|
|
31
|
+
* otherwise run `authCommand` if present; otherwise fall back to `envKey`
|
|
32
|
+
* (e.g. process.env.OPENAI_API_KEY). Returns undefined when nothing resolves.
|
|
33
|
+
*/
|
|
34
|
+
export declare function resolveApiKey(config: {
|
|
35
|
+
apiKey?: string;
|
|
36
|
+
authCommand?: string;
|
|
37
|
+
}, envKey?: string, opts?: {
|
|
38
|
+
runCommand?: RunCommand;
|
|
39
|
+
now?: number;
|
|
40
|
+
}): string | undefined;
|
|
41
|
+
export {};
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider auth/header resolution for custom model providers (TODO 7.2).
|
|
3
|
+
*
|
|
4
|
+
* - `authCommand`: a shell command whose stdout is an auth token. Used for
|
|
5
|
+
* short-lived tokens vended by an external tool (gcloud, aws, vault…). The
|
|
6
|
+
* result is cached briefly so we don't re-run the command on every request.
|
|
7
|
+
* - `httpHeaders`: extra headers; a `$ENV_VAR` value is resolved from the
|
|
8
|
+
* environment at build time so secrets stay out of settings.json.
|
|
9
|
+
*
|
|
10
|
+
* The token-running side is isolated behind a `runCommand` injection so the
|
|
11
|
+
* env-var + caching logic is unit-testable without spawning a shell.
|
|
12
|
+
*/
|
|
13
|
+
import { createRequire } from "node:module";
|
|
14
|
+
/** Resolve `$ENV` / `${ENV}` placeholders in a header value against `env`. */
|
|
15
|
+
export function resolveHeaderValue(value, env = process.env) {
|
|
16
|
+
const m = /^\$\{?([A-Za-z_][A-Za-z0-9_]*)\}?$/.exec(value.trim());
|
|
17
|
+
if (m)
|
|
18
|
+
return env[m[1]] ?? "";
|
|
19
|
+
return value;
|
|
20
|
+
}
|
|
21
|
+
/** Resolve every header value's env placeholders, dropping empties. */
|
|
22
|
+
export function resolveHeaders(headers, env = process.env) {
|
|
23
|
+
const out = {};
|
|
24
|
+
if (!headers)
|
|
25
|
+
return out;
|
|
26
|
+
for (const [k, v] of Object.entries(headers)) {
|
|
27
|
+
const resolved = resolveHeaderValue(v, env);
|
|
28
|
+
if (resolved)
|
|
29
|
+
out[k] = resolved;
|
|
30
|
+
}
|
|
31
|
+
return out;
|
|
32
|
+
}
|
|
33
|
+
const tokenCache = new Map();
|
|
34
|
+
/** Token cache TTL — short, since external tokens are usually short-lived. */
|
|
35
|
+
const TOKEN_TTL_MS = 60_000;
|
|
36
|
+
/**
|
|
37
|
+
* Run an auth command and return its trimmed first line as the token. Caches
|
|
38
|
+
* by command string for {@link TOKEN_TTL_MS}. `now`/`runCommand` are injectable
|
|
39
|
+
* for tests. Returns "" if the command yields no output.
|
|
40
|
+
*/
|
|
41
|
+
export function resolveAuthCommand(command, opts = {}) {
|
|
42
|
+
const now = opts.now ?? Date.now();
|
|
43
|
+
const cached = tokenCache.get(command);
|
|
44
|
+
if (cached && cached.expiresAt > now)
|
|
45
|
+
return cached.token;
|
|
46
|
+
const run = opts.runCommand ??
|
|
47
|
+
((cmd) => {
|
|
48
|
+
// Lazy require (via createRequire so it works in ESM bundles too) so the
|
|
49
|
+
// pure helpers above don't pull in child_process at module load.
|
|
50
|
+
const { execSync } = createRequire(import.meta.url)("node:child_process");
|
|
51
|
+
return execSync(cmd, { encoding: "utf8", timeout: 30_000 });
|
|
52
|
+
});
|
|
53
|
+
const out = run(command) ?? "";
|
|
54
|
+
const token = out.split("\n")[0]?.trim() ?? "";
|
|
55
|
+
tokenCache.set(command, { token, expiresAt: now + TOKEN_TTL_MS });
|
|
56
|
+
return token;
|
|
57
|
+
}
|
|
58
|
+
/** Test seam: clear the token cache. */
|
|
59
|
+
export function __clearAuthTokenCache() {
|
|
60
|
+
tokenCache.clear();
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Resolve the effective API key for a client: an explicit `apiKey` wins;
|
|
64
|
+
* otherwise run `authCommand` if present; otherwise fall back to `envKey`
|
|
65
|
+
* (e.g. process.env.OPENAI_API_KEY). Returns undefined when nothing resolves.
|
|
66
|
+
*/
|
|
67
|
+
export function resolveApiKey(config, envKey, opts = {}) {
|
|
68
|
+
if (config.apiKey)
|
|
69
|
+
return config.apiKey;
|
|
70
|
+
if (config.authCommand) {
|
|
71
|
+
const token = resolveAuthCommand(config.authCommand, opts);
|
|
72
|
+
if (token)
|
|
73
|
+
return token;
|
|
74
|
+
}
|
|
75
|
+
return envKey;
|
|
76
|
+
}
|
|
@@ -11,10 +11,14 @@ export interface ProviderConfig {
|
|
|
11
11
|
kind: ProviderKindName;
|
|
12
12
|
baseUrl: string;
|
|
13
13
|
apiKey?: string;
|
|
14
|
+
/** Shell command yielding an auth token (TODO 7.2). See LLMConfig.authCommand. */
|
|
15
|
+
authCommand?: string;
|
|
16
|
+
/** Extra HTTP headers for this provider (TODO 7.2). See LLMConfig.httpHeaders. */
|
|
17
|
+
httpHeaders?: Record<string, string>;
|
|
14
18
|
protocol?: "openai-compat" | "anthropic-style";
|
|
15
19
|
modelsPath?: string;
|
|
16
|
-
/** Default
|
|
17
|
-
|
|
20
|
+
/** Default reasoning/thinking setting for this provider. See LLMConfig. */
|
|
21
|
+
reasoning?: import("./reasoning-setting.js").ReasoningSetting;
|
|
18
22
|
}
|
|
19
23
|
export declare class ProviderCatalog {
|
|
20
24
|
private byKey;
|