@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
|
@@ -1,14 +1,44 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Anthropic Claude provider using @anthropic-ai/sdk.
|
|
3
3
|
*/
|
|
4
|
-
import type { LLMConfig, LLMResponse } from "../../types.js";
|
|
4
|
+
import type { ClientDefaults, LLMConfig, LLMResponse } from "../../types.js";
|
|
5
5
|
import type { CreateMessageOptions } from "../types.js";
|
|
6
6
|
import { LLMClientBase } from "../client-base.js";
|
|
7
7
|
export declare class AnthropicClient extends LLMClientBase {
|
|
8
8
|
private _client;
|
|
9
|
-
constructor(config: LLMConfig);
|
|
9
|
+
constructor(config: LLMConfig, defaults?: ClientDefaults);
|
|
10
10
|
protected initClient(): void;
|
|
11
11
|
private get client();
|
|
12
|
+
/**
|
|
13
|
+
* Resolve the capability descriptor for the current model. `providerKind`
|
|
14
|
+
* defaults to "anthropic" (this client only serves the Anthropic API).
|
|
15
|
+
* Memoized — the model doesn't change mid-client.
|
|
16
|
+
*/
|
|
17
|
+
private _capability;
|
|
18
|
+
private get capability();
|
|
19
|
+
/**
|
|
20
|
+
* Translate the resolved ReasoningSetting into Anthropic's `thinking` field,
|
|
21
|
+
* honoring the model's reasoning shape (rules.ts):
|
|
22
|
+
*
|
|
23
|
+
* - `anthropic-budget` (Claude 4.0–4.5): supports explicit
|
|
24
|
+
* `thinking:{type:"enabled", budget_tokens≥minBudgetTokens}`.
|
|
25
|
+
* · mode "budget" → use budgetTokens (clamped up to minBudgetTokens)
|
|
26
|
+
* · mode "on" → default budget (clamped up to minBudgetTokens)
|
|
27
|
+
* · mode "effort" → this family is budget-typed, not effort-typed, so
|
|
28
|
+
* treat any effort selection as "on" with the default.
|
|
29
|
+
* · mode "off" / unset → return undefined (omit the field).
|
|
30
|
+
* - `anthropic-adaptive` (Claude 4.6+): thinking is automatic and NOT
|
|
31
|
+
* controllable; sending `type:"enabled"` 400s. Always omit → undefined.
|
|
32
|
+
* - anything else (Claude 3.x catch-all → kind "none"): omit → undefined.
|
|
33
|
+
*
|
|
34
|
+
* `maxTokens` is the request's max_tokens. Anthropic requires
|
|
35
|
+
* max_tokens > budget_tokens when thinking is enabled, so we cap the budget
|
|
36
|
+
* just below it (leaving headroom for the visible answer). The minBudgetTokens
|
|
37
|
+
* floor still wins — if even the floor doesn't fit under max_tokens the model
|
|
38
|
+
* itself rejects it, which surfaces as a clear API error rather than us
|
|
39
|
+
* silently sending a degenerate budget.
|
|
40
|
+
*/
|
|
41
|
+
private buildThinking;
|
|
12
42
|
createMessage(options: CreateMessageOptions): Promise<LLMResponse>;
|
|
13
43
|
private nonStreamMessage;
|
|
14
44
|
private streamMessage;
|
|
@@ -6,26 +6,106 @@ import { LLMClientBase } from "../client-base.js";
|
|
|
6
6
|
import { ContextLimitError, LLMError, LLMRateLimitError } from "../../exceptions.js";
|
|
7
7
|
import { logger } from "../../logging/logger.js";
|
|
8
8
|
import { countTokens } from "../token-counter.js";
|
|
9
|
+
import { capabilitiesFor } from "../capabilities/index.js";
|
|
10
|
+
import { resolveApiKey, resolveHeaders } from "../provider-auth.js";
|
|
11
|
+
import { stripVisionFromHistory } from "../strip-vision.js";
|
|
12
|
+
/**
|
|
13
|
+
* Anthropic's `max_tokens` is required, so unlike OpenAI we can't omit it when
|
|
14
|
+
* the model's ceiling is unknown. Use a conservative floor in that rare case
|
|
15
|
+
* (every catalog Anthropic model resolves a real value via resolveMaxOutput, so
|
|
16
|
+
* this only fires for an unconfigured/unknown model).
|
|
17
|
+
*/
|
|
18
|
+
const ANTHROPIC_FALLBACK_MAX_TOKENS = 4096;
|
|
19
|
+
/**
|
|
20
|
+
* Default thinking budget when a budget-capable model wants "thinking on" but
|
|
21
|
+
* no explicit token budget was given. Clamped up to the model's minimum.
|
|
22
|
+
*/
|
|
23
|
+
const ANTHROPIC_DEFAULT_THINKING_BUDGET = 4096;
|
|
9
24
|
export class AnthropicClient extends LLMClientBase {
|
|
10
25
|
_client = null;
|
|
11
|
-
constructor(config) {
|
|
12
|
-
super(config);
|
|
26
|
+
constructor(config, defaults) {
|
|
27
|
+
super(config, defaults);
|
|
13
28
|
}
|
|
14
29
|
initClient() {
|
|
15
30
|
// Lazy init
|
|
16
31
|
}
|
|
17
32
|
get client() {
|
|
18
33
|
if (!this._client) {
|
|
34
|
+
const headers = resolveHeaders(this.config.httpHeaders);
|
|
19
35
|
this._client = new Anthropic({
|
|
20
|
-
|
|
36
|
+
// explicit apiKey > authCommand stdout > ANTHROPIC_API_KEY (TODO 7.2).
|
|
37
|
+
apiKey: resolveApiKey(this.config, process.env.ANTHROPIC_API_KEY),
|
|
21
38
|
...(this.config.baseUrl ? { baseURL: this.config.baseUrl } : {}),
|
|
39
|
+
...(Object.keys(headers).length > 0 ? { defaultHeaders: headers } : {}),
|
|
22
40
|
timeout: this.timeout,
|
|
23
41
|
});
|
|
24
42
|
}
|
|
25
43
|
return this._client;
|
|
26
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* Resolve the capability descriptor for the current model. `providerKind`
|
|
47
|
+
* defaults to "anthropic" (this client only serves the Anthropic API).
|
|
48
|
+
* Memoized — the model doesn't change mid-client.
|
|
49
|
+
*/
|
|
50
|
+
_capability = null;
|
|
51
|
+
get capability() {
|
|
52
|
+
if (!this._capability) {
|
|
53
|
+
const kind = (this.config.providerKind ?? "anthropic");
|
|
54
|
+
this._capability = capabilitiesFor(kind, this.model);
|
|
55
|
+
}
|
|
56
|
+
return this._capability;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Translate the resolved ReasoningSetting into Anthropic's `thinking` field,
|
|
60
|
+
* honoring the model's reasoning shape (rules.ts):
|
|
61
|
+
*
|
|
62
|
+
* - `anthropic-budget` (Claude 4.0–4.5): supports explicit
|
|
63
|
+
* `thinking:{type:"enabled", budget_tokens≥minBudgetTokens}`.
|
|
64
|
+
* · mode "budget" → use budgetTokens (clamped up to minBudgetTokens)
|
|
65
|
+
* · mode "on" → default budget (clamped up to minBudgetTokens)
|
|
66
|
+
* · mode "effort" → this family is budget-typed, not effort-typed, so
|
|
67
|
+
* treat any effort selection as "on" with the default.
|
|
68
|
+
* · mode "off" / unset → return undefined (omit the field).
|
|
69
|
+
* - `anthropic-adaptive` (Claude 4.6+): thinking is automatic and NOT
|
|
70
|
+
* controllable; sending `type:"enabled"` 400s. Always omit → undefined.
|
|
71
|
+
* - anything else (Claude 3.x catch-all → kind "none"): omit → undefined.
|
|
72
|
+
*
|
|
73
|
+
* `maxTokens` is the request's max_tokens. Anthropic requires
|
|
74
|
+
* max_tokens > budget_tokens when thinking is enabled, so we cap the budget
|
|
75
|
+
* just below it (leaving headroom for the visible answer). The minBudgetTokens
|
|
76
|
+
* floor still wins — if even the floor doesn't fit under max_tokens the model
|
|
77
|
+
* itself rejects it, which surfaces as a clear API error rather than us
|
|
78
|
+
* silently sending a degenerate budget.
|
|
79
|
+
*/
|
|
80
|
+
buildThinking(reasoning, maxTokens) {
|
|
81
|
+
const cap = this.capability;
|
|
82
|
+
if (cap.reasoning.kind !== "anthropic-budget") {
|
|
83
|
+
// anthropic-adaptive and none: never send a thinking field.
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
if (!reasoning || reasoning.mode === "off") {
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
89
|
+
const min = cap.reasoning.minBudgetTokens;
|
|
90
|
+
// Anthropic constraint: max_tokens must STRICTLY exceed budget_tokens, and
|
|
91
|
+
// budget_tokens must be ≥ the model's minimum. If max_tokens can't fit a
|
|
92
|
+
// min-sized thinking block plus at least `min` tokens of answer, there is
|
|
93
|
+
// no valid budget — omit thinking entirely rather than emit budget_tokens
|
|
94
|
+
// ≥ max_tokens (which the API rejects with a 400). This is reachable for
|
|
95
|
+
// small-maxTokens auxiliary calls (judge/planner) on budget models.
|
|
96
|
+
const ceiling = maxTokens - min;
|
|
97
|
+
if (ceiling < min) {
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
let budget = reasoning.mode === "budget"
|
|
101
|
+
? reasoning.budgetTokens
|
|
102
|
+
: ANTHROPIC_DEFAULT_THINKING_BUDGET; // "on" or "effort" → default budget
|
|
103
|
+
// Clamp into [min, ceiling] — both bounds are now guaranteed ≥ min.
|
|
104
|
+
budget = Math.min(Math.max(budget, min), ceiling);
|
|
105
|
+
return { type: "enabled", budget_tokens: budget };
|
|
106
|
+
}
|
|
27
107
|
async createMessage(options) {
|
|
28
|
-
return this.withRetry(async () => {
|
|
108
|
+
return this.withRetry(async (requestSignal) => {
|
|
29
109
|
const messages = this.buildMessages(options.messages);
|
|
30
110
|
const tools = options.tools ? this.convertTools(options.tools) : undefined;
|
|
31
111
|
// One span per outbound LLM request. Begin emits debug-level so the
|
|
@@ -42,8 +122,8 @@ export class AnthropicClient extends LLMClientBase {
|
|
|
42
122
|
});
|
|
43
123
|
try {
|
|
44
124
|
const response = options.stream && options.onChunk
|
|
45
|
-
? await this.streamMessage(options, messages, tools)
|
|
46
|
-
: await this.nonStreamMessage(options, messages, tools);
|
|
125
|
+
? await this.streamMessage(options, messages, tools, requestSignal)
|
|
126
|
+
: await this.nonStreamMessage(options, messages, tools, requestSignal);
|
|
47
127
|
span.end({
|
|
48
128
|
stopReason: response.stopReason,
|
|
49
129
|
promptTokens: response.usage?.promptTokens,
|
|
@@ -57,13 +137,18 @@ export class AnthropicClient extends LLMClientBase {
|
|
|
57
137
|
span.fail(err);
|
|
58
138
|
throw err;
|
|
59
139
|
}
|
|
60
|
-
});
|
|
140
|
+
}, { signal: options.signal });
|
|
61
141
|
}
|
|
62
|
-
async nonStreamMessage(options, messages, tools) {
|
|
142
|
+
async nonStreamMessage(options, messages, tools, requestSignal) {
|
|
63
143
|
try {
|
|
144
|
+
// Per-call reasoning wins; otherwise fall back to the provider/model
|
|
145
|
+
// default (settings → LLMConfig.reasoning). Mirrors openai.ts.
|
|
146
|
+
const reasoning = options.reasoning ?? this.config.reasoning;
|
|
147
|
+
const maxTokens = options.maxTokens ?? this.maxTokens ?? ANTHROPIC_FALLBACK_MAX_TOKENS;
|
|
148
|
+
const thinking = this.buildThinking(reasoning, maxTokens);
|
|
64
149
|
const response = await this.client.messages.create({
|
|
65
150
|
model: this.model,
|
|
66
|
-
max_tokens:
|
|
151
|
+
max_tokens: maxTokens,
|
|
67
152
|
system: [
|
|
68
153
|
{
|
|
69
154
|
type: "text",
|
|
@@ -73,10 +158,11 @@ export class AnthropicClient extends LLMClientBase {
|
|
|
73
158
|
],
|
|
74
159
|
messages,
|
|
75
160
|
...(tools?.length ? { tools } : {}),
|
|
161
|
+
...(thinking ? { thinking } : {}),
|
|
76
162
|
...(options.temperature !== undefined
|
|
77
163
|
? { temperature: options.temperature }
|
|
78
164
|
: { temperature: this.temperature }),
|
|
79
|
-
}, { signal: options.signal });
|
|
165
|
+
}, { signal: requestSignal ?? options.signal });
|
|
80
166
|
const usage = {
|
|
81
167
|
promptTokens: response.usage.input_tokens,
|
|
82
168
|
completionTokens: response.usage.output_tokens,
|
|
@@ -92,11 +178,14 @@ export class AnthropicClient extends LLMClientBase {
|
|
|
92
178
|
throw err;
|
|
93
179
|
}
|
|
94
180
|
}
|
|
95
|
-
async streamMessage(options, messages, tools) {
|
|
181
|
+
async streamMessage(options, messages, tools, requestSignal) {
|
|
96
182
|
try {
|
|
183
|
+
const reasoning = options.reasoning ?? this.config.reasoning;
|
|
184
|
+
const maxTokens = options.maxTokens ?? this.maxTokens ?? ANTHROPIC_FALLBACK_MAX_TOKENS;
|
|
185
|
+
const thinking = this.buildThinking(reasoning, maxTokens);
|
|
97
186
|
const stream = this.client.messages.stream({
|
|
98
187
|
model: this.model,
|
|
99
|
-
max_tokens:
|
|
188
|
+
max_tokens: maxTokens,
|
|
100
189
|
system: [
|
|
101
190
|
{
|
|
102
191
|
type: "text",
|
|
@@ -106,14 +195,37 @@ export class AnthropicClient extends LLMClientBase {
|
|
|
106
195
|
],
|
|
107
196
|
messages,
|
|
108
197
|
...(tools?.length ? { tools } : {}),
|
|
198
|
+
...(thinking ? { thinking } : {}),
|
|
109
199
|
...(options.temperature !== undefined
|
|
110
200
|
? { temperature: options.temperature }
|
|
111
201
|
: { temperature: this.temperature }),
|
|
112
|
-
}, { signal: options.signal });
|
|
202
|
+
}, { signal: requestSignal ?? options.signal });
|
|
113
203
|
let currentText = "";
|
|
114
204
|
let currentToolName = "";
|
|
115
205
|
let currentToolId = "";
|
|
116
206
|
let currentToolInput = "";
|
|
207
|
+
// Abort-guarded emit: once the turn is cancelled, stop forwarding chunks
|
|
208
|
+
// to the UI. The SDK's event emitter can keep firing buffered text/
|
|
209
|
+
// contentBlock/inputJson events after abort() until its HTTP stream tears
|
|
210
|
+
// down; without this guard those leak to the UI after the user hit Stop
|
|
211
|
+
// ("content comes back after interrupt"). We also eagerly abort the SDK
|
|
212
|
+
// stream below so teardown starts immediately rather than waiting on the
|
|
213
|
+
// passed-in request signal alone.
|
|
214
|
+
const emit = (chunk) => {
|
|
215
|
+
if (options.signal?.aborted)
|
|
216
|
+
return;
|
|
217
|
+
options.onChunk?.(chunk);
|
|
218
|
+
};
|
|
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)
|
|
225
|
+
stream.abort();
|
|
226
|
+
else
|
|
227
|
+
teardownSig.addEventListener("abort", () => stream.abort(), { once: true });
|
|
228
|
+
}
|
|
117
229
|
// Time-to-first-byte: log exactly once per stream so streaming-latency
|
|
118
230
|
// questions ("model felt slow tonight") get a clean number per request.
|
|
119
231
|
const streamStartedAt = Date.now();
|
|
@@ -129,14 +241,14 @@ export class AnthropicClient extends LLMClientBase {
|
|
|
129
241
|
});
|
|
130
242
|
}
|
|
131
243
|
currentText += text;
|
|
132
|
-
|
|
244
|
+
emit({ type: "text", text, tokens: countTokens(text) });
|
|
133
245
|
});
|
|
134
246
|
stream.on("contentBlock", (block) => {
|
|
135
247
|
if (block.type === "tool_use") {
|
|
136
248
|
currentToolName = block.name;
|
|
137
249
|
currentToolId = block.id;
|
|
138
250
|
currentToolInput = "";
|
|
139
|
-
|
|
251
|
+
emit({
|
|
140
252
|
type: "tool_use_start",
|
|
141
253
|
toolCall: { id: block.id, toolName: block.name, args: {} },
|
|
142
254
|
});
|
|
@@ -145,7 +257,7 @@ export class AnthropicClient extends LLMClientBase {
|
|
|
145
257
|
stream.on("inputJson", (_delta, snapshot) => {
|
|
146
258
|
currentToolInput = JSON.stringify(snapshot);
|
|
147
259
|
if (currentToolId) {
|
|
148
|
-
|
|
260
|
+
emit({
|
|
149
261
|
type: "tool_use_delta",
|
|
150
262
|
toolCall: {
|
|
151
263
|
id: currentToolId,
|
|
@@ -195,6 +307,7 @@ export class AnthropicClient extends LLMClientBase {
|
|
|
195
307
|
};
|
|
196
308
|
}
|
|
197
309
|
buildMessages(messages) {
|
|
310
|
+
messages = stripVisionFromHistory(messages, this.capability.supportsVision);
|
|
198
311
|
const result = [];
|
|
199
312
|
for (const msg of messages) {
|
|
200
313
|
if (msg.role === "system")
|
|
@@ -218,10 +331,37 @@ export class AnthropicClient extends LLMClientBase {
|
|
|
218
331
|
});
|
|
219
332
|
}
|
|
220
333
|
else if (block.type === "tool_result" && block.tool_use_id) {
|
|
334
|
+
let content;
|
|
335
|
+
if (typeof block.content === "string") {
|
|
336
|
+
content = block.content;
|
|
337
|
+
}
|
|
338
|
+
else if (Array.isArray(block.content)) {
|
|
339
|
+
const parts = [];
|
|
340
|
+
for (const part of block.content) {
|
|
341
|
+
if (part.type === "text" && part.text) {
|
|
342
|
+
parts.push({ type: "text", text: part.text });
|
|
343
|
+
}
|
|
344
|
+
else if (part.type === "image" && part.source) {
|
|
345
|
+
parts.push({
|
|
346
|
+
type: "image",
|
|
347
|
+
source: {
|
|
348
|
+
type: "base64",
|
|
349
|
+
media_type: part.source.media_type,
|
|
350
|
+
data: part.source.data,
|
|
351
|
+
},
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
content = parts;
|
|
356
|
+
}
|
|
357
|
+
else {
|
|
358
|
+
content = "";
|
|
359
|
+
}
|
|
221
360
|
blocks.push({
|
|
222
361
|
type: "tool_result",
|
|
223
362
|
tool_use_id: block.tool_use_id,
|
|
224
|
-
content
|
|
363
|
+
content,
|
|
364
|
+
...(block.is_error ? { is_error: true } : {}),
|
|
225
365
|
});
|
|
226
366
|
}
|
|
227
367
|
else if (block.type === "image" && block.source) {
|
|
@@ -240,16 +380,65 @@ export class AnthropicClient extends LLMClientBase {
|
|
|
240
380
|
}
|
|
241
381
|
}
|
|
242
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
|
+
}
|
|
243
416
|
return result;
|
|
244
417
|
}
|
|
245
418
|
convertTools(tools) {
|
|
246
|
-
|
|
419
|
+
const converted = tools.map((t) => ({
|
|
247
420
|
name: t.name,
|
|
248
421
|
description: t.description,
|
|
249
422
|
input_schema: t.inputSchema,
|
|
250
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;
|
|
251
434
|
}
|
|
252
435
|
handleApiError(err) {
|
|
436
|
+
// ESC / Stop path — see openai.ts handleApiError for the same logic.
|
|
437
|
+
// Rethrow the SDK's abort error unchanged so server.ts recognises
|
|
438
|
+
// cancellation; don't repackage it as a generic "Anthropic API error".
|
|
439
|
+
if (err instanceof Anthropic.APIUserAbortError) {
|
|
440
|
+
throw err;
|
|
441
|
+
}
|
|
253
442
|
if (err instanceof Anthropic.APIError) {
|
|
254
443
|
if (err.status === 429) {
|
|
255
444
|
throw new LLMRateLimitError("anthropic");
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* field name, rejected sampling params, thinking knob, reasoning echo —
|
|
8
8
|
* is resolved through `capabilitiesFor()`, not hardcoded.
|
|
9
9
|
*/
|
|
10
|
-
import type { LLMConfig, LLMResponse } from "../../types.js";
|
|
10
|
+
import type { ClientDefaults, LLMConfig, LLMResponse } from "../../types.js";
|
|
11
11
|
import type { CreateMessageOptions } from "../types.js";
|
|
12
12
|
import { LLMClientBase } from "../client-base.js";
|
|
13
13
|
interface RunStreamOpts {
|
|
@@ -19,6 +19,21 @@ interface RunStreamOpts {
|
|
|
19
19
|
* the watchdog-side text accumulator used in tests.
|
|
20
20
|
*/
|
|
21
21
|
onChunk?: (chunk: any) => string;
|
|
22
|
+
/**
|
|
23
|
+
* Abort signal. Checked BEFORE handing each chunk to onChunk so a cancelled
|
|
24
|
+
* turn stops emitting text_delta immediately — the SDK keeps yielding
|
|
25
|
+
* already-buffered chunks after abort() until its HTTP teardown completes, and
|
|
26
|
+
* without this guard those buffered deltas leak to the UI after the user hit
|
|
27
|
+
* Stop ("content comes back after interrupt").
|
|
28
|
+
*/
|
|
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;
|
|
22
37
|
}
|
|
23
38
|
/**
|
|
24
39
|
* Consume an async iterable of stream chunks with an idle watchdog.
|
|
@@ -35,7 +50,8 @@ export declare function runStreamWithWatchdog<T = any>(stream: AsyncIterable<T>,
|
|
|
35
50
|
export declare class OpenAIClient extends LLMClientBase {
|
|
36
51
|
private _client;
|
|
37
52
|
private _forceMaxCompletionTokens;
|
|
38
|
-
|
|
53
|
+
private _dropReasoningEffort;
|
|
54
|
+
constructor(config: LLMConfig, defaults?: ClientDefaults);
|
|
39
55
|
protected initClient(): void;
|
|
40
56
|
private get client();
|
|
41
57
|
/**
|
|
@@ -47,6 +63,20 @@ export declare class OpenAIClient extends LLMClientBase {
|
|
|
47
63
|
*/
|
|
48
64
|
private _capability;
|
|
49
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();
|
|
50
80
|
createMessage(options: CreateMessageOptions): Promise<LLMResponse>;
|
|
51
81
|
/**
|
|
52
82
|
* Build the request body honoring the model's capability descriptor.
|
|
@@ -58,6 +88,21 @@ export declare class OpenAIClient extends LLMClientBase {
|
|
|
58
88
|
private streamMessage;
|
|
59
89
|
private processChoice;
|
|
60
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;
|
|
61
106
|
private convertTools;
|
|
62
107
|
private handleApiError;
|
|
63
108
|
}
|