@cjhyy/code-shell-core 0.5.0-rc.2 → 0.6.0-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -10
- package/dist/agent/agent-definition-registry.d.ts +3 -0
- package/dist/agent/agent-definition-registry.js +3 -1
- package/dist/agent/agent-definition.d.ts +15 -0
- package/dist/agent/agent-definition.js +27 -3
- package/dist/arena/context/context-tools.js +47 -4
- package/dist/arena/ledger.js +9 -1
- package/dist/arena/strategies/utils.d.ts +1 -4
- package/dist/arena/strategies/utils.js +7 -84
- package/dist/automation/cron-expr.d.ts +10 -0
- package/dist/automation/cron-expr.js +23 -5
- package/dist/automation/runner.d.ts +21 -4
- package/dist/automation/runner.js +48 -12
- package/dist/automation/scheduler.d.ts +38 -0
- package/dist/automation/scheduler.js +89 -12
- package/dist/automation/store.js +5 -2
- package/dist/capability-control/disabled-lists.d.ts +25 -0
- package/dist/capability-control/disabled-lists.js +57 -0
- package/dist/capability-control/overlay.d.ts +15 -0
- package/dist/capability-control/overlay.js +27 -0
- package/dist/cc-orchestrator/agent-adapter.d.ts +50 -0
- package/dist/cc-orchestrator/agent-adapter.js +133 -0
- package/dist/cc-orchestrator/cc-capability.d.ts +19 -0
- package/dist/cc-orchestrator/cc-capability.js +53 -0
- package/dist/cc-orchestrator/codex-session-discovery.d.ts +24 -0
- package/dist/cc-orchestrator/codex-session-discovery.js +191 -0
- package/dist/cc-orchestrator/codex-session-history.d.ts +25 -0
- package/dist/cc-orchestrator/codex-session-history.js +187 -0
- package/dist/cc-orchestrator/external-agent-changes.d.ts +19 -0
- package/dist/cc-orchestrator/external-agent-changes.js +214 -0
- package/dist/cc-orchestrator/external-agent-driver.d.ts +18 -0
- package/dist/cc-orchestrator/external-agent-driver.js +69 -0
- package/dist/cc-orchestrator/index.d.ts +8 -0
- package/dist/cc-orchestrator/index.js +8 -0
- package/dist/cc-orchestrator/relevance-judge.d.ts +15 -0
- package/dist/cc-orchestrator/relevance-judge.js +29 -0
- package/dist/cc-orchestrator/session-discovery.d.ts +46 -0
- package/dist/cc-orchestrator/session-discovery.js +125 -0
- package/dist/cc-orchestrator/session-history.d.ts +19 -0
- package/dist/cc-orchestrator/session-history.js +67 -0
- package/dist/cli/agent-server-stdio.d.ts +15 -1
- package/dist/cli/agent-server-stdio.js +115 -17
- package/dist/cli/agent-server-tcp.js +40 -26
- package/dist/context/compaction.d.ts +56 -0
- package/dist/context/compaction.js +186 -0
- package/dist/context/manager.js +25 -4
- package/dist/cost-tracker.js +5 -61
- package/dist/credentials/cipher.d.ts +49 -0
- package/dist/credentials/cipher.js +45 -0
- package/dist/credentials/cookie-jar.d.ts +24 -0
- package/dist/credentials/cookie-jar.js +40 -0
- package/dist/credentials/index.d.ts +7 -0
- package/dist/credentials/index.js +5 -0
- package/dist/credentials/inject-credential-tool.d.ts +20 -0
- package/dist/credentials/inject-credential-tool.js +130 -0
- package/dist/credentials/store.d.ts +72 -0
- package/dist/credentials/store.js +184 -0
- package/dist/credentials/types.d.ts +56 -0
- package/dist/credentials/use-credential-tool.d.ts +29 -0
- package/dist/credentials/use-credential-tool.js +205 -0
- package/dist/credentials/use-gate.d.ts +56 -0
- package/dist/credentials/use-gate.js +52 -0
- package/dist/data/model-metadata.d.ts +77 -0
- package/dist/data/model-metadata.js +56 -0
- package/dist/data/model-metadata.json +216 -0
- package/dist/data/openrouter-models.d.ts +18 -7
- package/dist/data/openrouter-models.js +35 -8
- package/dist/engine/aux-key.d.ts +10 -0
- package/dist/engine/aux-key.js +11 -0
- package/dist/engine/dynamic-tool-defs.d.ts +19 -0
- package/dist/engine/dynamic-tool-defs.js +36 -0
- package/dist/engine/engine.d.ts +267 -138
- package/dist/engine/engine.js +957 -191
- package/dist/engine/friendly-error.d.ts +18 -0
- package/dist/engine/friendly-error.js +63 -0
- package/dist/engine/goal.d.ts +145 -0
- package/dist/engine/goal.js +144 -0
- package/dist/engine/image-policy.d.ts +13 -0
- package/dist/engine/image-policy.js +24 -0
- package/dist/engine/model-connections-pool.d.ts +17 -0
- package/dist/engine/model-connections-pool.js +66 -0
- package/dist/engine/model-facade.d.ts +10 -0
- package/dist/engine/model-facade.js +25 -0
- package/dist/engine/patch-orphaned-tools.js +3 -0
- package/dist/engine/resolve-llm-config.d.ts +16 -0
- package/dist/engine/resolve-llm-config.js +44 -0
- package/dist/engine/runtime.js +2 -1
- package/dist/engine/sandbox-cache-key.d.ts +10 -0
- package/dist/engine/sandbox-cache-key.js +9 -0
- package/dist/engine/sandbox-config.d.ts +31 -0
- package/dist/engine/sandbox-config.js +38 -0
- package/dist/engine/session-usage.d.ts +19 -0
- package/dist/engine/session-usage.js +25 -0
- package/dist/engine/steer-queue.d.ts +32 -0
- package/dist/engine/steer-queue.js +26 -0
- package/dist/engine/streaming-tool-queue.d.ts +12 -0
- package/dist/engine/streaming-tool-queue.js +50 -10
- package/dist/engine/turn-loop.d.ts +67 -3
- package/dist/engine/turn-loop.js +292 -41
- package/dist/engine/types.d.ts +175 -0
- package/dist/engine/types.js +13 -0
- package/dist/external-agents/config.d.ts +2 -0
- package/dist/external-agents/config.js +15 -0
- package/dist/external-agents/types.d.ts +31 -0
- package/dist/external-agents/types.js +1 -0
- package/dist/git/utils.js +11 -6
- package/dist/git/worktree.d.ts +48 -0
- package/dist/git/worktree.js +86 -10
- package/dist/hooks/goal-stop-hook.d.ts +28 -0
- package/dist/hooks/goal-stop-hook.js +186 -9
- package/dist/hooks/registry.d.ts +8 -0
- package/dist/hooks/registry.js +19 -0
- package/dist/hooks/shell-runner.js +10 -21
- package/dist/index.d.ts +49 -6
- package/dist/index.js +60 -4
- package/dist/llm/capabilities/param-specs.d.ts +14 -0
- package/dist/llm/capabilities/param-specs.js +62 -0
- package/dist/llm/capabilities/rules.js +4 -0
- package/dist/llm/capabilities/types.d.ts +10 -0
- package/dist/llm/client-base.d.ts +28 -1
- package/dist/llm/client-base.js +119 -13
- package/dist/llm/model-cache.js +4 -2
- package/dist/llm/model-pool.d.ts +14 -0
- package/dist/llm/model-pool.js +13 -0
- package/dist/llm/provider-auth.d.ts +41 -0
- package/dist/llm/provider-auth.js +76 -0
- package/dist/llm/provider-catalog.d.ts +4 -0
- package/dist/llm/providers/anthropic.js +64 -14
- package/dist/llm/providers/openai.d.ts +36 -0
- package/dist/llm/providers/openai.js +257 -51
- package/dist/llm/reasoning-setting.d.ts +3 -3
- package/dist/llm/reasoning-setting.js +9 -1
- package/dist/llm/stream-watchdog.js +5 -1
- package/dist/llm/token-counter.js +9 -2
- package/dist/llm/types.d.ts +4 -0
- package/dist/logging/sanitize-messages.js +22 -0
- package/dist/lsp/manager.d.ts +1 -1
- package/dist/lsp/manager.js +40 -10
- package/dist/model-catalog/builtin.d.ts +12 -0
- package/dist/model-catalog/builtin.js +407 -0
- package/dist/model-catalog/gen-connections.d.ts +20 -0
- package/dist/model-catalog/gen-connections.js +28 -0
- package/dist/model-catalog/index.d.ts +41 -0
- package/dist/model-catalog/index.js +90 -0
- package/dist/model-catalog/params.d.ts +20 -0
- package/dist/model-catalog/params.js +45 -0
- package/dist/model-catalog/resolve.d.ts +48 -0
- package/dist/model-catalog/resolve.js +33 -0
- package/dist/model-catalog/save-entry.d.ts +32 -0
- package/dist/model-catalog/save-entry.js +104 -0
- package/dist/model-catalog/types.d.ts +561 -0
- package/dist/model-catalog/types.js +93 -0
- package/dist/model-catalog/upsert.d.ts +9 -0
- package/dist/model-catalog/upsert.js +8 -0
- package/dist/onboarding.d.ts +12 -82
- package/dist/onboarding.js +61 -326
- package/dist/plugins/gitOps.d.ts +19 -0
- package/dist/plugins/gitOps.js +73 -4
- package/dist/plugins/installer/checkUpdate.d.ts +16 -0
- package/dist/plugins/installer/checkUpdate.js +32 -0
- package/dist/plugins/installer/codex/convertCommands.d.ts +19 -0
- package/dist/plugins/installer/codex/convertCommands.js +46 -0
- package/dist/plugins/installer/codex/convertMcp.d.ts +5 -2
- package/dist/plugins/installer/codex/convertMcp.js +45 -5
- package/dist/plugins/installer/install.js +25 -1
- package/dist/plugins/installer/installFromArchive.d.ts +43 -0
- package/dist/plugins/installer/installFromArchive.js +134 -0
- package/dist/plugins/installer/installFromSource.js +8 -2
- package/dist/plugins/installer/loadPluginAgents.js +6 -2
- package/dist/plugins/installer/loadPluginMcp.d.ts +9 -2
- package/dist/plugins/installer/loadPluginMcp.js +35 -2
- package/dist/plugins/installer/pruneDisabled.d.ts +24 -0
- package/dist/plugins/installer/pruneDisabled.js +73 -0
- package/dist/plugins/installer/types.d.ts +5 -2
- package/dist/plugins/installer/types.js +1 -0
- package/dist/plugins/installer/uninstall.js +4 -0
- package/dist/plugins/installer/unzip.d.ts +14 -0
- package/dist/plugins/installer/unzip.js +82 -0
- package/dist/plugins/installer/update.d.ts +14 -0
- package/dist/plugins/installer/update.js +53 -21
- package/dist/plugins/loadPluginHooks.d.ts +47 -1
- package/dist/plugins/loadPluginHooks.js +73 -1
- package/dist/plugins/marketplaceManager.d.ts +7 -0
- package/dist/plugins/marketplaceManager.js +20 -0
- package/dist/plugins/pluginCommandHook.js +4 -18
- package/dist/plugins/pluginContent.d.ts +30 -0
- package/dist/plugins/pluginContent.js +83 -0
- package/dist/plugins/pluginInstaller.d.ts +13 -0
- package/dist/plugins/pluginInstaller.js +42 -8
- package/dist/plugins/schemas.js +1 -0
- package/dist/plugins/types.d.ts +6 -0
- package/dist/preset/index.d.ts +7 -1
- package/dist/preset/index.js +96 -6
- package/dist/product/types.d.ts +1 -1
- package/dist/prompt/composer.d.ts +27 -0
- package/dist/prompt/composer.js +67 -21
- package/dist/prompt/instruction-scanner.js +5 -3
- package/dist/prompt/section-loader.js +1 -0
- package/dist/prompt/sections/base.md +1 -0
- package/dist/prompt/sections/browser.md +10 -0
- package/dist/prompt/sections/coding.md +4 -0
- package/dist/protocol/chat-session-manager.d.ts +8 -2
- package/dist/protocol/chat-session-manager.js +36 -0
- package/dist/protocol/chat-session.d.ts +65 -0
- package/dist/protocol/chat-session.js +94 -2
- package/dist/protocol/client.d.ts +27 -0
- package/dist/protocol/client.js +38 -0
- package/dist/protocol/server.d.ts +112 -0
- package/dist/protocol/server.js +586 -16
- package/dist/protocol/transport.js +3 -2
- package/dist/protocol/types.d.ts +46 -0
- package/dist/protocol/types.js +16 -0
- package/dist/quota/credentials.d.ts +3 -0
- package/dist/quota/credentials.js +80 -0
- package/dist/quota/index.d.ts +36 -0
- package/dist/quota/index.js +155 -0
- package/dist/quota/types.d.ts +48 -0
- package/dist/quota/types.js +13 -0
- package/dist/review/review-prompt.d.ts +28 -0
- package/dist/review/review-prompt.js +81 -0
- package/dist/run/FileRunStore.js +8 -3
- package/dist/run/RunApprovalBackend.js +25 -5
- package/dist/run/RunManager.d.ts +12 -0
- package/dist/run/RunManager.js +35 -0
- package/dist/run/factory.d.ts +1 -1
- package/dist/runtime/background-shell.d.ts +139 -0
- package/dist/runtime/background-shell.js +495 -0
- package/dist/runtime/output-clean.d.ts +24 -0
- package/dist/runtime/output-clean.js +41 -0
- package/dist/runtime/ring-file.d.ts +64 -0
- package/dist/runtime/ring-file.js +174 -0
- package/dist/runtime/safe-spawn.js +15 -34
- package/dist/runtime/spawn-common.d.ts +148 -0
- package/dist/runtime/spawn-common.js +303 -0
- package/dist/runtime/truncate-output.d.ts +22 -0
- package/dist/runtime/truncate-output.js +49 -0
- package/dist/runtime/utf8-cut.d.ts +11 -0
- package/dist/runtime/utf8-cut.js +23 -0
- package/dist/services/auto-dream.d.ts +4 -0
- package/dist/services/auto-dream.js +26 -26
- package/dist/services/diagnostics.d.ts +1 -2
- package/dist/services/diagnostics.js +12 -7
- package/dist/services/extract-memories.d.ts +14 -1
- package/dist/services/extract-memories.js +45 -6
- package/dist/services/memory-orchestrator.d.ts +21 -0
- package/dist/services/memory-orchestrator.js +125 -50
- package/dist/services/session-memory.js +24 -12
- package/dist/session/file-history.d.ts +124 -1
- package/dist/session/file-history.js +222 -6
- package/dist/session/memory.d.ts +116 -2
- package/dist/session/memory.js +250 -28
- package/dist/session/session-manager.d.ts +40 -0
- package/dist/session/session-manager.js +113 -3
- package/dist/session/simple-diff.d.ts +23 -0
- package/dist/session/simple-diff.js +84 -0
- package/dist/session/transcript.d.ts +25 -1
- package/dist/session/transcript.js +35 -2
- package/dist/session/undo-target.d.ts +67 -0
- package/dist/session/undo-target.js +144 -0
- package/dist/settings/disk-defaults.d.ts +9 -2
- package/dist/settings/disk-defaults.js +11 -2
- package/dist/settings/feature-flags.d.ts +64 -0
- package/dist/settings/feature-flags.js +61 -0
- package/dist/settings/manager.d.ts +68 -1
- package/dist/settings/manager.js +266 -29
- package/dist/settings/migrate-config.d.ts +45 -0
- package/dist/settings/migrate-config.js +125 -0
- package/dist/settings/schema-export.d.ts +25 -0
- package/dist/settings/schema-export.js +38 -0
- package/dist/settings/schema.d.ts +1186 -771
- package/dist/settings/schema.js +268 -97
- package/dist/skills/scanner.d.ts +9 -0
- package/dist/skills/scanner.js +30 -2
- package/dist/stt/resolve-transcribe.d.ts +31 -0
- package/dist/stt/resolve-transcribe.js +108 -0
- package/dist/stt/transcribe.d.ts +51 -0
- package/dist/stt/transcribe.js +65 -0
- package/dist/tool-system/browser-bridge.d.ts +226 -0
- package/dist/tool-system/browser-bridge.js +163 -0
- package/dist/tool-system/builtin/agent-heartbeat.d.ts +49 -0
- package/dist/tool-system/builtin/agent-heartbeat.js +89 -0
- package/dist/tool-system/builtin/agent-notifications.d.ts +12 -3
- package/dist/tool-system/builtin/agent-notifications.js +9 -3
- package/dist/tool-system/builtin/agent-output-file.d.ts +38 -0
- package/dist/tool-system/builtin/agent-output-file.js +72 -0
- package/dist/tool-system/builtin/agent-registry.d.ts +12 -0
- package/dist/tool-system/builtin/agent-registry.js +8 -0
- package/dist/tool-system/builtin/agent.d.ts +21 -1
- package/dist/tool-system/builtin/agent.js +489 -42
- package/dist/tool-system/builtin/apply-patch/applier.js +66 -8
- package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +10 -0
- package/dist/tool-system/builtin/apply-patch/backup-targets.js +30 -0
- package/dist/tool-system/builtin/apply-patch/index.js +0 -15
- package/dist/tool-system/builtin/background-jobs.d.ts +76 -0
- package/dist/tool-system/builtin/background-jobs.js +124 -0
- package/dist/tool-system/builtin/background-shell-tools.d.ts +20 -0
- package/dist/tool-system/builtin/background-shell-tools.js +108 -0
- package/dist/tool-system/builtin/background-work.d.ts +67 -0
- package/dist/tool-system/builtin/background-work.js +86 -0
- package/dist/tool-system/builtin/bash-output-style.d.ts +32 -0
- package/dist/tool-system/builtin/bash-output-style.js +40 -0
- package/dist/tool-system/builtin/bash.d.ts +5 -2
- package/dist/tool-system/builtin/bash.js +98 -62
- package/dist/tool-system/builtin/browser-tools.d.ts +33 -0
- package/dist/tool-system/builtin/browser-tools.js +312 -0
- package/dist/tool-system/builtin/cancel-goal.d.ts +31 -0
- package/dist/tool-system/builtin/cancel-goal.js +64 -0
- package/dist/tool-system/builtin/check-quota.d.ts +15 -0
- package/dist/tool-system/builtin/check-quota.js +34 -0
- package/dist/tool-system/builtin/config.js +7 -0
- package/dist/tool-system/builtin/cron.d.ts +7 -0
- package/dist/tool-system/builtin/cron.js +55 -3
- package/dist/tool-system/builtin/drive-claude-code.d.ts +30 -0
- package/dist/tool-system/builtin/drive-claude-code.js +157 -0
- package/dist/tool-system/builtin/edit-model-catalog.d.ts +3 -0
- package/dist/tool-system/builtin/edit-model-catalog.js +94 -0
- package/dist/tool-system/builtin/edit.js +20 -16
- package/dist/tool-system/builtin/eol.d.ts +29 -0
- package/dist/tool-system/builtin/eol.js +37 -0
- package/dist/tool-system/builtin/file-cache.d.ts +6 -0
- package/dist/tool-system/builtin/file-cache.js +8 -0
- package/dist/tool-system/builtin/generate-image.d.ts +35 -0
- package/dist/tool-system/builtin/generate-image.js +278 -50
- package/dist/tool-system/builtin/generate-video.d.ts +55 -0
- package/dist/tool-system/builtin/generate-video.js +361 -0
- package/dist/tool-system/builtin/glob.js +0 -7
- package/dist/tool-system/builtin/grep.js +6 -8
- package/dist/tool-system/builtin/image-providers.d.ts +86 -0
- package/dist/tool-system/builtin/image-providers.js +190 -0
- package/dist/tool-system/builtin/image-uploader.d.ts +33 -0
- package/dist/tool-system/builtin/image-uploader.js +74 -0
- package/dist/tool-system/builtin/index.d.ts +7 -1
- package/dist/tool-system/builtin/index.js +249 -25
- package/dist/tool-system/builtin/mcp-tools.js +23 -3
- package/dist/tool-system/builtin/memory.js +45 -7
- package/dist/tool-system/builtin/notebook-edit.js +0 -7
- package/dist/tool-system/builtin/powershell.js +4 -1
- package/dist/tool-system/builtin/read.js +10 -10
- package/dist/tool-system/builtin/repl.js +4 -1
- package/dist/tool-system/builtin/skill.js +9 -0
- package/dist/tool-system/builtin/sleep.js +3 -2
- package/dist/tool-system/builtin/tool-search.js +25 -7
- package/dist/tool-system/builtin/video-providers.d.ts +154 -0
- package/dist/tool-system/builtin/video-providers.js +235 -0
- package/dist/tool-system/builtin/web-fetch.js +12 -2
- package/dist/tool-system/builtin/web-search.js +21 -7
- package/dist/tool-system/builtin/worktree.d.ts +2 -1
- package/dist/tool-system/builtin/worktree.js +31 -4
- package/dist/tool-system/builtin/write.js +0 -6
- package/dist/tool-system/context.d.ts +154 -6
- package/dist/tool-system/executor.d.ts +3 -1
- package/dist/tool-system/executor.js +172 -88
- package/dist/tool-system/investigation-guard.js +1 -1
- package/dist/tool-system/mcp-manager.d.ts +42 -4
- package/dist/tool-system/mcp-manager.js +186 -20
- package/dist/tool-system/path-policy.d.ts +5 -0
- package/dist/tool-system/path-policy.js +307 -8
- package/dist/tool-system/permission.d.ts +36 -1
- package/dist/tool-system/permission.js +281 -69
- package/dist/tool-system/plan-mode-allowlist.d.ts +13 -2
- package/dist/tool-system/plan-mode-allowlist.js +24 -2
- package/dist/tool-system/registry.d.ts +1 -0
- package/dist/tool-system/registry.js +16 -2
- package/dist/tool-system/sandbox/index.d.ts +8 -0
- package/dist/tool-system/sandbox/index.js +7 -2
- package/dist/tool-system/validate-tool-metadata.d.ts +36 -0
- package/dist/tool-system/validate-tool-metadata.js +63 -0
- package/dist/types.d.ts +217 -6
- package/dist/updater.js +20 -9
- package/dist/utils/envUtils.d.ts +0 -9
- package/dist/utils/envUtils.js +3 -28
- package/dist/utils/exec.d.ts +40 -0
- package/dist/utils/exec.js +144 -0
- package/dist/utils/json.d.ts +12 -0
- package/dist/utils/json.js +92 -0
- package/dist/utils/theme.d.ts +1 -1
- package/dist/utils/theme.js +1 -1
- package/dist/utils/toolDisplay.js +0 -1
- package/package.json +13 -7
- package/dist/agent/coordinator.d.ts +0 -49
- package/dist/agent/coordinator.js +0 -77
- package/dist/settings/manager.test.js +0 -73
- package/dist/tool-system/builtin/remote-trigger.d.ts +0 -6
- package/dist/tool-system/builtin/remote-trigger.js +0 -54
- package/dist/tool-system/builtin/send-message.d.ts +0 -6
- package/dist/tool-system/builtin/send-message.js +0 -47
- /package/dist/{settings/manager.test.d.ts → credentials/types.js} +0 -0
|
@@ -0,0 +1,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,6 +11,10 @@ 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
20
|
/** Default reasoning/thinking setting for this provider. See LLMConfig. */
|
|
@@ -7,6 +7,7 @@ import { ContextLimitError, LLMError, LLMRateLimitError } from "../../exceptions
|
|
|
7
7
|
import { logger } from "../../logging/logger.js";
|
|
8
8
|
import { countTokens } from "../token-counter.js";
|
|
9
9
|
import { capabilitiesFor } from "../capabilities/index.js";
|
|
10
|
+
import { resolveApiKey, resolveHeaders } from "../provider-auth.js";
|
|
10
11
|
import { stripVisionFromHistory } from "../strip-vision.js";
|
|
11
12
|
/**
|
|
12
13
|
* Anthropic's `max_tokens` is required, so unlike OpenAI we can't omit it when
|
|
@@ -30,9 +31,12 @@ export class AnthropicClient extends LLMClientBase {
|
|
|
30
31
|
}
|
|
31
32
|
get client() {
|
|
32
33
|
if (!this._client) {
|
|
34
|
+
const headers = resolveHeaders(this.config.httpHeaders);
|
|
33
35
|
this._client = new Anthropic({
|
|
34
|
-
|
|
36
|
+
// explicit apiKey > authCommand stdout > ANTHROPIC_API_KEY (TODO 7.2).
|
|
37
|
+
apiKey: resolveApiKey(this.config, process.env.ANTHROPIC_API_KEY),
|
|
35
38
|
...(this.config.baseUrl ? { baseURL: this.config.baseUrl } : {}),
|
|
39
|
+
...(Object.keys(headers).length > 0 ? { defaultHeaders: headers } : {}),
|
|
36
40
|
timeout: this.timeout,
|
|
37
41
|
});
|
|
38
42
|
}
|
|
@@ -101,7 +105,7 @@ export class AnthropicClient extends LLMClientBase {
|
|
|
101
105
|
return { type: "enabled", budget_tokens: budget };
|
|
102
106
|
}
|
|
103
107
|
async createMessage(options) {
|
|
104
|
-
return this.withRetry(async () => {
|
|
108
|
+
return this.withRetry(async (requestSignal) => {
|
|
105
109
|
const messages = this.buildMessages(options.messages);
|
|
106
110
|
const tools = options.tools ? this.convertTools(options.tools) : undefined;
|
|
107
111
|
// One span per outbound LLM request. Begin emits debug-level so the
|
|
@@ -118,8 +122,8 @@ export class AnthropicClient extends LLMClientBase {
|
|
|
118
122
|
});
|
|
119
123
|
try {
|
|
120
124
|
const response = options.stream && options.onChunk
|
|
121
|
-
? await this.streamMessage(options, messages, tools)
|
|
122
|
-
: await this.nonStreamMessage(options, messages, tools);
|
|
125
|
+
? await this.streamMessage(options, messages, tools, requestSignal)
|
|
126
|
+
: await this.nonStreamMessage(options, messages, tools, requestSignal);
|
|
123
127
|
span.end({
|
|
124
128
|
stopReason: response.stopReason,
|
|
125
129
|
promptTokens: response.usage?.promptTokens,
|
|
@@ -133,9 +137,9 @@ export class AnthropicClient extends LLMClientBase {
|
|
|
133
137
|
span.fail(err);
|
|
134
138
|
throw err;
|
|
135
139
|
}
|
|
136
|
-
});
|
|
140
|
+
}, { signal: options.signal });
|
|
137
141
|
}
|
|
138
|
-
async nonStreamMessage(options, messages, tools) {
|
|
142
|
+
async nonStreamMessage(options, messages, tools, requestSignal) {
|
|
139
143
|
try {
|
|
140
144
|
// Per-call reasoning wins; otherwise fall back to the provider/model
|
|
141
145
|
// default (settings → LLMConfig.reasoning). Mirrors openai.ts.
|
|
@@ -158,7 +162,7 @@ export class AnthropicClient extends LLMClientBase {
|
|
|
158
162
|
...(options.temperature !== undefined
|
|
159
163
|
? { temperature: options.temperature }
|
|
160
164
|
: { temperature: this.temperature }),
|
|
161
|
-
}, { signal: options.signal });
|
|
165
|
+
}, { signal: requestSignal ?? options.signal });
|
|
162
166
|
const usage = {
|
|
163
167
|
promptTokens: response.usage.input_tokens,
|
|
164
168
|
completionTokens: response.usage.output_tokens,
|
|
@@ -174,7 +178,7 @@ export class AnthropicClient extends LLMClientBase {
|
|
|
174
178
|
throw err;
|
|
175
179
|
}
|
|
176
180
|
}
|
|
177
|
-
async streamMessage(options, messages, tools) {
|
|
181
|
+
async streamMessage(options, messages, tools, requestSignal) {
|
|
178
182
|
try {
|
|
179
183
|
const reasoning = options.reasoning ?? this.config.reasoning;
|
|
180
184
|
const maxTokens = options.maxTokens ?? this.maxTokens ?? ANTHROPIC_FALLBACK_MAX_TOKENS;
|
|
@@ -195,7 +199,7 @@ export class AnthropicClient extends LLMClientBase {
|
|
|
195
199
|
...(options.temperature !== undefined
|
|
196
200
|
? { temperature: options.temperature }
|
|
197
201
|
: { temperature: this.temperature }),
|
|
198
|
-
}, { signal: options.signal });
|
|
202
|
+
}, { signal: requestSignal ?? options.signal });
|
|
199
203
|
let currentText = "";
|
|
200
204
|
let currentToolName = "";
|
|
201
205
|
let currentToolId = "";
|
|
@@ -212,12 +216,15 @@ export class AnthropicClient extends LLMClientBase {
|
|
|
212
216
|
return;
|
|
213
217
|
options.onChunk?.(chunk);
|
|
214
218
|
};
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
219
|
+
// Tear the SDK stream down on EITHER the user's cancel OR the per-request
|
|
220
|
+
// deadline (requestSignal composes both) — a wedged stream then aborts
|
|
221
|
+
// instead of hanging on the SDK's unreliable timeout.
|
|
222
|
+
const teardownSig = requestSignal ?? options.signal;
|
|
223
|
+
if (teardownSig) {
|
|
224
|
+
if (teardownSig.aborted)
|
|
218
225
|
stream.abort();
|
|
219
226
|
else
|
|
220
|
-
|
|
227
|
+
teardownSig.addEventListener("abort", () => stream.abort(), { once: true });
|
|
221
228
|
}
|
|
222
229
|
// Time-to-first-byte: log exactly once per stream so streaming-latency
|
|
223
230
|
// questions ("model felt slow tonight") get a clean number per request.
|
|
@@ -373,14 +380,57 @@ export class AnthropicClient extends LLMClientBase {
|
|
|
373
380
|
}
|
|
374
381
|
}
|
|
375
382
|
}
|
|
383
|
+
// Prompt-cache breakpoint on the history: mark the LAST content block of
|
|
384
|
+
// the LAST message. The API caches everything up to the marker, so the
|
|
385
|
+
// stable prefix (all prior turns) is reused; only the growing tail is
|
|
386
|
+
// re-billed. CC does exactly this (one marker at messages.length - 1) and
|
|
387
|
+
// warns a second history marker causes KV page eviction. We only ANNOTATE
|
|
388
|
+
// the tail block — never reorder — so the tool_use/tool_result adjacency
|
|
389
|
+
// invariant is untouched. A string-content message is lifted to a single
|
|
390
|
+
// text block so it can carry cache_control. See
|
|
391
|
+
// docs/todo/prompt-cache-optimization.md.
|
|
392
|
+
const lastMsg = result[result.length - 1];
|
|
393
|
+
if (lastMsg) {
|
|
394
|
+
if (typeof lastMsg.content === "string") {
|
|
395
|
+
lastMsg.content = [
|
|
396
|
+
{
|
|
397
|
+
type: "text",
|
|
398
|
+
text: lastMsg.content,
|
|
399
|
+
cache_control: { type: "ephemeral" },
|
|
400
|
+
},
|
|
401
|
+
];
|
|
402
|
+
}
|
|
403
|
+
else {
|
|
404
|
+
const lastBlock = lastMsg.content[lastMsg.content.length - 1];
|
|
405
|
+
// Skip thinking/redacted_thinking blocks: they reject cache_control and
|
|
406
|
+
// marking them would 400. buildMessages never emits them today (thinking
|
|
407
|
+
// is a top-level request field, not history content), but guard anyway
|
|
408
|
+
// so a future block type can't silently break the request.
|
|
409
|
+
if (lastBlock &&
|
|
410
|
+
lastBlock.type !== "thinking" &&
|
|
411
|
+
lastBlock.type !== "redacted_thinking") {
|
|
412
|
+
lastBlock.cache_control = { type: "ephemeral" };
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
}
|
|
376
416
|
return result;
|
|
377
417
|
}
|
|
378
418
|
convertTools(tools) {
|
|
379
|
-
|
|
419
|
+
const converted = tools.map((t) => ({
|
|
380
420
|
name: t.name,
|
|
381
421
|
description: t.description,
|
|
382
422
|
input_schema: t.inputSchema,
|
|
383
423
|
}));
|
|
424
|
+
// Prompt-cache breakpoint: mark ONLY the last tool. The API caches every
|
|
425
|
+
// block up to and including a cache_control marker, so one marker on the
|
|
426
|
+
// tail makes the whole (stable) tools array a cached prefix — vs 73
|
|
427
|
+
// definitions re-billed as input every turn. CC does the same (one marker,
|
|
428
|
+
// not per-tool); a second marker here would waste a scarce cache_control
|
|
429
|
+
// slot (max 4) and risk KV eviction. See docs/todo/prompt-cache-optimization.md.
|
|
430
|
+
const last = converted[converted.length - 1];
|
|
431
|
+
if (last)
|
|
432
|
+
last.cache_control = { type: "ephemeral" };
|
|
433
|
+
return converted;
|
|
384
434
|
}
|
|
385
435
|
handleApiError(err) {
|
|
386
436
|
// ESC / Stop path — see openai.ts handleApiError for the same logic.
|
|
@@ -27,6 +27,13 @@ interface RunStreamOpts {
|
|
|
27
27
|
* Stop ("content comes back after interrupt").
|
|
28
28
|
*/
|
|
29
29
|
signal?: AbortSignal;
|
|
30
|
+
/**
|
|
31
|
+
* Per-call override of the watchdog. Leave undefined to follow the env
|
|
32
|
+
* default (STREAM_WATCHDOG_CONFIG.enabled). Set false to force the fast
|
|
33
|
+
* path even when the watchdog is enabled globally; passing idleTimeoutMs
|
|
34
|
+
* still re-activates it (an explicit timeout means the caller wants it).
|
|
35
|
+
*/
|
|
36
|
+
disableWatchdog?: boolean;
|
|
30
37
|
}
|
|
31
38
|
/**
|
|
32
39
|
* Consume an async iterable of stream chunks with an idle watchdog.
|
|
@@ -56,6 +63,20 @@ export declare class OpenAIClient extends LLMClientBase {
|
|
|
56
63
|
*/
|
|
57
64
|
private _capability;
|
|
58
65
|
private get capability();
|
|
66
|
+
/**
|
|
67
|
+
* True when this client routes an Anthropic-family model through OpenRouter's
|
|
68
|
+
* OpenAI-compatible endpoint. Anthropic caching is EXPLICIT — nothing is
|
|
69
|
+
* cached unless the request carries `cache_control` breakpoints (verified live
|
|
70
|
+
* 2026-07-02: plain requests to anthropic/claude-opus-4.7-fast via OpenRouter
|
|
71
|
+
* report cached_tokens 0 on every repeat; a single system-block breakpoint
|
|
72
|
+
* turns the whole stable prefix — tools + system — into a cache hit, ~89%
|
|
73
|
+
* cheaper on the follow-up). OpenAI and other OpenRouter models cache
|
|
74
|
+
* automatically, so they must NOT get breakpoints. The slug arrives resolved
|
|
75
|
+
* (e.g. "anthropic/claude-opus-4.7-fast") or as the router alias
|
|
76
|
+
* ("~anthropic/claude-opus-latest") — both start with an optional "~" then
|
|
77
|
+
* "anthropic/".
|
|
78
|
+
*/
|
|
79
|
+
private get isOpenRouterAnthropic();
|
|
59
80
|
createMessage(options: CreateMessageOptions): Promise<LLMResponse>;
|
|
60
81
|
/**
|
|
61
82
|
* Build the request body honoring the model's capability descriptor.
|
|
@@ -67,6 +88,21 @@ export declare class OpenAIClient extends LLMClientBase {
|
|
|
67
88
|
private streamMessage;
|
|
68
89
|
private processChoice;
|
|
69
90
|
private buildMessages;
|
|
91
|
+
/**
|
|
92
|
+
* In-place: add prompt-cache breakpoints for Anthropic-over-OpenRouter.
|
|
93
|
+
* Mirrors the native anthropic provider (≤4 breakpoints):
|
|
94
|
+
* 1. System block — the stable prefix. Anthropic sees tools BEFORE the
|
|
95
|
+
* system prompt, so one marker on the system block caches tools too
|
|
96
|
+
* (verified live: system-only marker cached 3511/3952 prompt tokens
|
|
97
|
+
* including tool defs).
|
|
98
|
+
* 2. Last message — one rolling breakpoint so the growing conversation
|
|
99
|
+
* history becomes a cached prefix. Not scrolled: as history grows the
|
|
100
|
+
* "last message" naturally advances and its tail is the next write.
|
|
101
|
+
* A string `content` is lifted to a single-element `[{type:"text",...}]`
|
|
102
|
+
* array so it can carry `cache_control`; OpenRouter accepts this OpenAI
|
|
103
|
+
* multimodal wire form for text.
|
|
104
|
+
*/
|
|
105
|
+
private applyAnthropicCacheBreakpoints;
|
|
70
106
|
private convertTools;
|
|
71
107
|
private handleApiError;
|
|
72
108
|
}
|