mixdog 0.9.62 → 0.9.64
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 +3 -0
- package/package.json +9 -2
- package/scripts/code-graph-description-contract.mjs +3 -3
- package/scripts/verify-release-assets.mjs +2 -2
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch.mjs +11 -14
- package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +6 -6
- package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +2 -2
- package/src/runtime/agent/orchestrator/agent-trace-format.mjs +1 -0
- package/src/runtime/agent/orchestrator/config.mjs +19 -124
- package/src/runtime/agent/orchestrator/context/collect.mjs +6 -6
- package/src/runtime/agent/orchestrator/dispatch-persist.mjs +2 -2
- package/src/runtime/agent/orchestrator/internal-agents.mjs +2 -2
- package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +1 -1
- package/src/runtime/agent/orchestrator/mcp/client.mjs +4 -4
- package/src/runtime/agent/orchestrator/providers/admission-scheduler.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/anthropic-betas.mjs +4 -4
- package/src/runtime/agent/orchestrator/providers/anthropic-effort.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens.mjs +4 -4
- package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +333 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-model-resolve.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +4 -4
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic.mjs +3 -277
- package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/custom-tool-wire.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +6 -6
- package/src/runtime/agent/orchestrator/providers/grok-oauth-login.mjs +196 -0
- package/src/runtime/agent/orchestrator/providers/grok-oauth-tokens.mjs +460 -0
- package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +14 -593
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +4 -4
- package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +5 -280
- package/src/runtime/agent/orchestrator/providers/openai-responses-payload.mjs +357 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws-headers.mjs +216 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws-pool.mjs +2 -188
- package/src/runtime/agent/orchestrator/providers/openai-ws-stream.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/provider-catalog-cache.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/registry.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/statusline-route-meta.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/cache/prefetch-cache.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/cache/scoped-cache.mjs +3 -3
- package/src/runtime/agent/orchestrator/session/compact/budget.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/compact/file-reattach.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/compact/summary-schema.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/compact/summary.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/compact/text-utils.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/context-utils.mjs +4 -4
- package/src/runtime/agent/orchestrator/session/loop/deferred-call-through.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +17 -0
- package/src/runtime/agent/orchestrator/session/loop/steering.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/stored-tool-args.mjs +18 -26
- package/src/runtime/agent/orchestrator/session/loop/termination.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/tool-classify.mjs +3 -3
- package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +1 -0
- package/src/runtime/agent/orchestrator/session/manager/context-meta.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/delivered-completions.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/status-telemetry.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/live-state.mjs +49 -0
- package/src/runtime/agent/orchestrator/session/store/load-cache.mjs +49 -0
- package/src/runtime/agent/orchestrator/session/store/save-worker.mjs +260 -0
- package/src/runtime/agent/orchestrator/session/store/serialize.mjs +72 -0
- package/src/runtime/agent/orchestrator/session/store/summary-cache.mjs +163 -0
- package/src/runtime/agent/orchestrator/session/store/write-guards.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/store.mjs +9 -561
- package/src/runtime/agent/orchestrator/session/tool-envelope.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +2 -2
- package/src/runtime/agent/orchestrator/stall-policy.mjs +11 -11
- package/src/runtime/agent/orchestrator/tools/bash-policy-scan.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/bash-session.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/builtin/advisory-lock.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/builtin/atomic-write.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +2 -154
- package/src/runtime/agent/orchestrator/tools/builtin/cache-layers.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/cwd-utils.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/fs-reachability.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/fuzzy-match.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/glob-walk.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/path-locks.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/path-utils.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-args.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +2 -3
- package/src/runtime/agent/orchestrator/tools/builtin/read-image-resize.mjs +4 -4
- package/src/runtime/agent/orchestrator/tools/builtin/read-open.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/rg-runner.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/builtin/search-path-diagnostics.mjs +5 -5
- package/src/runtime/agent/orchestrator/tools/builtin/shell-analysis.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/shell-job-paths.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/builtin/shell-job-process.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/builtin/shell-job-spawn.mjs +519 -0
- package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +5 -449
- package/src/runtime/agent/orchestrator/tools/builtin/snapshot-helpers.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/task-tool.mjs +212 -0
- package/src/runtime/agent/orchestrator/tools/builtin.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/code-graph/build.mjs +1 -7
- package/src/runtime/agent/orchestrator/tools/code-graph/disk-cache.mjs +9 -36
- package/src/runtime/agent/orchestrator/tools/code-graph/dispatch.mjs +15 -3
- package/src/runtime/agent/orchestrator/tools/code-graph/search-references.mjs +429 -0
- package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +2 -395
- package/src/runtime/agent/orchestrator/tools/code-graph/symbol-index.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/code-graph/text-mask.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/code-graph/trusted-roots.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/code-graph-prewarm-worker.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/code-graph-state.mjs +3 -3
- package/src/runtime/agent/orchestrator/tools/mutation-planner.mjs +5 -5
- package/src/runtime/agent/orchestrator/tools/next-call-utils.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/patch/dispatch.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/patch/matcher.mjs +7 -7
- package/src/runtime/agent/orchestrator/tools/patch/orchestrator.mjs +72 -9
- package/src/runtime/agent/orchestrator/tools/patch/parsing.mjs +4 -4
- package/src/runtime/agent/orchestrator/tools/patch/paths.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/patch/v4a-convert.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/patch-tool-defs.mjs +4 -4
- package/src/runtime/agent/orchestrator/tools/patch.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/result-compression.mjs +3 -3
- package/src/runtime/agent/orchestrator/tools/shell-command.mjs +2 -444
- package/src/runtime/agent/orchestrator/tools/shell-exec-output.mjs +505 -0
- package/src/runtime/agent/orchestrator/tools/shell-exec-policy.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/shell-snapshot.mjs +1 -1
- package/src/runtime/channels/lib/backend-dispatch.mjs +20 -5
- package/src/runtime/channels/lib/scheduler.mjs +1 -1
- package/src/runtime/channels/lib/telegram-format.mjs +1 -1
- package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +4 -4
- package/src/runtime/channels/tool-defs.mjs +2 -3
- package/src/runtime/memory/index.mjs +1 -5
- package/src/runtime/memory/lib/core-memory-candidates.mjs +357 -0
- package/src/runtime/memory/lib/core-memory-store.mjs +7 -357
- package/src/runtime/memory/lib/cycle-signatures.mjs +1 -1
- package/src/runtime/memory/lib/embedding-model-config.mjs +1 -1
- package/src/runtime/memory/lib/embedding-provider.mjs +1 -5
- package/src/runtime/memory/lib/embedding-worker.mjs +1 -5
- package/src/runtime/memory/lib/ko-morph.mjs +2 -2
- package/src/runtime/memory/lib/memory-config-flags.mjs +2 -5
- package/src/runtime/memory/lib/memory-cycle-requests.mjs +3 -7
- package/src/runtime/memory/lib/memory-cycle1.mjs +4 -8
- package/src/runtime/memory/lib/memory-cycle2-gate.mjs +1 -1
- package/src/runtime/memory/lib/memory-cycle2-mutations.mjs +1 -1
- package/src/runtime/memory/lib/memory-cycle2-shared.mjs +2 -5
- package/src/runtime/memory/lib/memory-cycle3.mjs +1 -5
- package/src/runtime/memory/lib/memory-embed.mjs +2 -6
- package/src/runtime/memory/lib/memory-log.mjs +8 -0
- package/src/runtime/memory/lib/memory-ops-policy.mjs +4 -8
- package/src/runtime/memory/lib/memory-recall-scope-filter.mjs +1 -1
- package/src/runtime/memory/lib/memory-recall-store.mjs +2 -193
- package/src/runtime/memory/lib/memory-score.mjs +1 -1
- package/src/runtime/memory/lib/memory-text-utils.mjs +2 -2
- package/src/runtime/memory/lib/memory.mjs +2 -6
- package/src/runtime/memory/lib/pg/adapter.mjs +2 -6
- package/src/runtime/memory/lib/pg/process.mjs +1 -5
- package/src/runtime/memory/lib/pg/supervisor.mjs +1 -5
- package/src/runtime/memory/lib/recall-format.mjs +2 -2
- package/src/runtime/memory/lib/recall-scoring.mjs +195 -0
- package/src/runtime/memory/lib/runtime-fetcher.mjs +1 -5
- package/src/runtime/memory/lib/trace-store.mjs +2 -6
- package/src/runtime/search/lib/http-fetch.mjs +6 -6
- package/src/runtime/search/lib/web-tools.mjs +2 -2
- package/src/runtime/shared/buffered-appender.mjs +1 -1
- package/src/runtime/shared/child-guardian.mjs +1 -1
- package/src/runtime/shared/child-spawn-gate.mjs +1 -1
- package/src/runtime/shared/config.mjs +4 -4
- package/src/runtime/shared/launcher-control.mjs +9 -10
- package/src/runtime/shared/llm/index.mjs +5 -20
- package/src/runtime/shared/markdown-frontmatter.mjs +1 -1
- package/src/runtime/shared/memory-snapshot.mjs +4 -4
- package/src/runtime/shared/pristine-execution.mjs +1 -1
- package/src/runtime/shared/process-lifecycle.mjs +0 -1
- package/src/runtime/shared/process-shutdown.mjs +1 -1
- package/src/runtime/shared/resource-admission.mjs +2 -2
- package/src/runtime/shared/schedule-session-run.mjs +1 -1
- package/src/runtime/shared/schedules-db.mjs +1 -1
- package/src/runtime/shared/service-discovery.mjs +2 -2
- package/src/runtime/shared/staged-update.mjs +6 -6
- package/src/runtime/shared/tool-execution-contract.mjs +1 -1
- package/src/runtime/shared/tool-primitives.mjs +1 -1
- package/src/runtime/shared/tool-surface.mjs +2 -2
- package/src/runtime/shared/update-checker.mjs +1 -1
- package/src/runtime/shared/user-cwd.mjs +3 -3
- package/src/runtime/shared/user-data-guard.mjs +4 -4
- package/src/runtime/shared/workspace-router.mjs +5 -5
- package/src/session-runtime/config-helpers.mjs +2 -3
- package/src/session-runtime/config-lifecycle.mjs +1 -1
- package/src/session-runtime/hitch-profile.mjs +1 -1
- package/src/session-runtime/lifecycle-api.mjs +6 -4
- package/src/session-runtime/model-recency.mjs +5 -5
- package/src/session-runtime/plugin-mcp.mjs +1 -1
- package/src/session-runtime/provider-request-snapshot.mjs +338 -0
- package/src/session-runtime/session-text.mjs +4 -4
- package/src/session-runtime/tool-catalog-schema.mjs +197 -0
- package/src/session-runtime/tool-catalog.mjs +6 -483
- package/src/session-runtime/tool-defs.mjs +1 -1
- package/src/standalone/agent-task-status.mjs +1 -1
- package/src/standalone/agent-tool/helpers.mjs +2 -2
- package/src/standalone/channel-admin.mjs +4 -4
- package/src/standalone/explore-tool.mjs +3 -3
- package/src/standalone/hook-bus/config.mjs +1 -1
- package/src/standalone/hook-bus/constants.mjs +1 -1
- package/src/standalone/hook-bus/rules.mjs +1 -1
- package/src/standalone/projects.mjs +1 -1
- package/src/standalone/provider-admin.mjs +2 -2
- package/src/tui/app/app-format.mjs +2 -2
- package/src/tui/app/clipboard.mjs +3 -3
- package/src/tui/app/input-parsers.mjs +1 -1
- package/src/tui/app/text-layout.mjs +1 -1
- package/src/tui/app/transcript-row-estimate.mjs +360 -0
- package/src/tui/app/transcript-window.mjs +5 -347
- package/src/tui/app/use-mouse-input.mjs +1 -1
- package/src/tui/app/use-prompt-handlers.mjs +1 -1
- package/src/tui/components/tool-execution/surface-detail.mjs +9 -9
- package/src/tui/components/tool-execution/text-format.mjs +2 -2
- package/src/tui/components/tool-output-format.mjs +7 -7
- package/src/tui/display-width.mjs +4 -4
- package/src/tui/dist/index.mjs +63 -97
- package/src/tui/engine/agent-envelope.mjs +5 -5
- package/src/tui/engine/notification-plan.mjs +1 -1
- package/src/tui/engine/queue-helpers.mjs +3 -3
- package/src/tui/engine/render-timing.mjs +4 -5
- package/src/tui/engine/session-api-ext.mjs +3 -3
- package/src/tui/engine/tool-result-status.mjs +5 -5
- package/src/tui/engine/tool-result-text.mjs +1 -1
- package/src/tui/engine/transcript-spill.mjs +585 -0
- package/src/tui/engine/tui-steering-persist.mjs +1 -1
- package/src/tui/engine.mjs +2 -474
- package/src/tui/lib/voice-setup.mjs +1 -1
- package/src/tui/markdown/format-token.mjs +1 -1
- package/src/tui/markdown/render-ansi.mjs +1 -1
- package/src/tui/markdown/table-layout.mjs +4 -4
- package/src/tui/paste-attachments.mjs +1 -1
- package/src/tui/prompt-history-store.mjs +3 -3
- package/src/tui/statusline-ansi-bridge.mjs +2 -2
- package/src/tui/theme.mjs +1 -1
- package/src/tui/transcript-tool-failures.mjs +2 -2
- package/src/ui/ansi.mjs +0 -9
- package/src/ui/statusline-format.mjs +2 -4
- package/scripts/_bench-cwc.json +0 -20
- package/scripts/_jitter-fuzz.jsx +0 -42
- package/scripts/_jitter-fuzz2.jsx +0 -30
- package/scripts/_jitter-probe.jsx +0 -35
- package/scripts/_jp2.jsx +0 -16
- package/scripts/_smoke_wd.mjs +0 -7
- package/scripts/abort-recovery-test.mjs +0 -175
- package/scripts/agent-dispatch-abort-compose-test.mjs +0 -31
- package/scripts/agent-live-arg-guard-smoke.mjs +0 -20
- package/scripts/agent-live-path-suffix-smoke.mjs +0 -34
- package/scripts/agent-live-toolcall-args-smoke.mjs +0 -45
- package/scripts/agent-loop-policy-test.mjs +0 -37
- package/scripts/agent-model-liveness-test.mjs +0 -763
- package/scripts/agent-parallel-smoke.mjs +0 -435
- package/scripts/agent-route-batch-test.mjs +0 -40
- package/scripts/agent-tag-reuse-smoke.mjs +0 -441
- package/scripts/agent-terminal-reap-test.mjs +0 -252
- package/scripts/agent-trace-io-test.mjs +0 -133
- package/scripts/ansi-color-capability-test.mjs +0 -90
- package/scripts/anthropic-admission-retry-integration-test.mjs +0 -119
- package/scripts/anthropic-maxtokens-test.mjs +0 -119
- package/scripts/anthropic-oauth-refresh-race-test.mjs +0 -397
- package/scripts/anthropic-transport-policy-test.mjs +0 -726
- package/scripts/apply-patch-edit-smoke.mjs +0 -71
- package/scripts/arg-guard-test.mjs +0 -93
- package/scripts/async-notify-settlement-test.mjs +0 -99
- package/scripts/atomic-lock-tryonce-test.mjs +0 -125
- package/scripts/background-task-meta-smoke.mjs +0 -38
- package/scripts/bench-run.mjs +0 -508
- package/scripts/boot-smoke.mjs +0 -137
- package/scripts/build-runtime-windows.ps1 +0 -242
- package/scripts/channel-daemon-smoke.mjs +0 -1103
- package/scripts/code-graph-aggregate-cwd-test.mjs +0 -158
- package/scripts/code-graph-disk-hit-test.mjs +0 -290
- package/scripts/code-graph-dispatch-test.mjs +0 -96
- package/scripts/code-graph-root-federation-test.mjs +0 -273
- package/scripts/compact-active-turn-test.mjs +0 -68
- package/scripts/compact-file-reattach-test.mjs +0 -88
- package/scripts/compact-pressure-test.mjs +0 -788
- package/scripts/compact-prior-context-flatten-test.mjs +0 -252
- package/scripts/compact-recall-digest-test.mjs +0 -57
- package/scripts/compact-smoke.mjs +0 -1017
- package/scripts/compact-trigger-migration-smoke.mjs +0 -261
- package/scripts/compacted-placeholder-scrub-test.mjs +0 -63
- package/scripts/context-mcp-metering-test.mjs +0 -1406
- package/scripts/debounced-skills-async-save-test.mjs +0 -57
- package/scripts/deferred-tool-loading-test.mjs +0 -250
- package/scripts/desktop-session-bridge-test.mjs +0 -1013
- package/scripts/dispatch-persist-recovery-test.mjs +0 -141
- package/scripts/embedding-worker-exit-test.mjs +0 -76
- package/scripts/execution-completion-dedup-test.mjs +0 -205
- package/scripts/execution-pending-resume-kick-test.mjs +0 -151
- package/scripts/execution-resume-esc-integration-test.mjs +0 -176
- package/scripts/explore-bench-tmp.mjs +0 -36
- package/scripts/explore-bench.mjs +0 -248
- package/scripts/explore-prompt-policy-test.mjs +0 -256
- package/scripts/explore-timeout-cancel-test.mjs +0 -345
- package/scripts/find-fuzzy-hidden-test.mjs +0 -267
- package/scripts/forwarder-rebind-tail-test.mjs +0 -67
- package/scripts/freevar-smoke.mjs +0 -98
- package/scripts/gemini-provider-test.mjs +0 -1448
- package/scripts/generate-oc-icons.mjs +0 -11
- package/scripts/grok-oauth-refresh-race-test.mjs +0 -273
- package/scripts/headless-pristine-execution-test.mjs +0 -614
- package/scripts/hook-bus-test.mjs +0 -552
- package/scripts/ingest-pure-conversation-smoke.mjs +0 -175
- package/scripts/internal-comms-bench-test.mjs +0 -226
- package/scripts/internal-comms-bench.mjs +0 -853
- package/scripts/internal-comms-smoke.mjs +0 -277
- package/scripts/internal-tools-normalization-test.mjs +0 -62
- package/scripts/interrupted-turn-history-test.mjs +0 -399
- package/scripts/lead-workflow-smoke.mjs +0 -592
- package/scripts/lifecycle-api-test.mjs +0 -137
- package/scripts/live-share-test.mjs +0 -148
- package/scripts/live-worker-smoke.mjs +0 -333
- package/scripts/log-writer-guard-smoke.mjs +0 -131
- package/scripts/maintenance-default-routes-test.mjs +0 -164
- package/scripts/max-output-recovery-persist-test.mjs +0 -81
- package/scripts/max-output-recovery-test.mjs +0 -368
- package/scripts/mcp-client-normalization-test.mjs +0 -45
- package/scripts/mcp-grace-deferred-test.mjs +0 -225
- package/scripts/memory-core-input-test.mjs +0 -167
- package/scripts/memory-cycle-routing-test.mjs +0 -111
- package/scripts/memory-meta-concurrency-test.mjs +0 -20
- package/scripts/memory-pg-recovery-test.mjs +0 -59
- package/scripts/memory-rule-contract-test.mjs +0 -93
- package/scripts/model-list-sanitize-test.mjs +0 -37
- package/scripts/mouse-tracking-restore-smoke.mjs +0 -107
- package/scripts/native-edit-wire-test.mjs +0 -152
- package/scripts/notify-completion-mirror-test.mjs +0 -73
- package/scripts/openai-oauth-refresh-race-test.mjs +0 -120
- package/scripts/openai-oauth-ws-1006-retry-test.mjs +0 -954
- package/scripts/openai-ws-early-settle-test.mjs +0 -216
- package/scripts/output-style-bench.mjs +0 -292
- package/scripts/output-style-smoke.mjs +0 -145
- package/scripts/parent-abort-link-test.mjs +0 -90
- package/scripts/patch-binary-cache-test.mjs +0 -181
- package/scripts/path-suffix-test.mjs +0 -57
- package/scripts/pending-completion-drop-test.mjs +0 -239
- package/scripts/pending-messages-lock-nonblocking-test.mjs +0 -62
- package/scripts/pretool-ask-runtime-test.mjs +0 -54
- package/scripts/process-lifecycle-test.mjs +0 -461
- package/scripts/prompt-immediate-render-test.mjs +0 -89
- package/scripts/prompt-input-parity-test.mjs +0 -145
- package/scripts/provider-admission-scheduler-test.mjs +0 -681
- package/scripts/provider-contract-test.mjs +0 -632
- package/scripts/provider-stream-stall-test.mjs +0 -276
- package/scripts/provider-toolcall-test.mjs +0 -3063
- package/scripts/reactive-compact-persist-smoke.mjs +0 -203
- package/scripts/recall-bench.mjs +0 -359
- package/scripts/resource-admission-test.mjs +0 -792
- package/scripts/result-classification-test.mjs +0 -75
- package/scripts/rg-runner-test.mjs +0 -240
- package/scripts/routing-corpus-test.mjs +0 -349
- package/scripts/sanitize-tool-pairs-test.mjs +0 -260
- package/scripts/session-bench-cache-break-test.mjs +0 -102
- package/scripts/session-bench.mjs +0 -1708
- package/scripts/session-context-bench.mjs +0 -344
- package/scripts/session-heartbeat-lifecycle-test.mjs +0 -68
- package/scripts/session-ingest-compaction-smoke.mjs +0 -279
- package/scripts/session-ingest-smoke.mjs +0 -177
- package/scripts/session-orphan-sweep-test.mjs +0 -109
- package/scripts/set-effort-config-test.mjs +0 -41
- package/scripts/shell-failure-diagnostics-test.mjs +0 -280
- package/scripts/shell-hardening-test.mjs +0 -209
- package/scripts/shell-jobs-windows-hide-test.mjs +0 -164
- package/scripts/ship-mode-test.mjs +0 -98
- package/scripts/smoke-loop-failure-summary-test.mjs +0 -38
- package/scripts/smoke-loop-failure-summary.mjs +0 -16
- package/scripts/smoke-loop-report.mjs +0 -221
- package/scripts/smoke-loop.mjs +0 -202
- package/scripts/smoke-runtime-negative.ps1 +0 -106
- package/scripts/statusline-quota-hysteresis-test.mjs +0 -62
- package/scripts/steering-drain-buckets-test.mjs +0 -467
- package/scripts/steering-fold-provenance-test.mjs +0 -71
- package/scripts/streaming-tail-window-test.mjs +0 -175
- package/scripts/submit-commandbusy-race-test.mjs +0 -257
- package/scripts/task-bench.mjs +0 -205
- package/scripts/terminal-bench-isolation-guards-test.mjs +0 -102
- package/scripts/termio-input-smoke.mjs +0 -199
- package/scripts/tool-result-hook-test.mjs +0 -48
- package/scripts/tool-smoke.mjs +0 -2453
- package/scripts/tool-tui-presentation-test.mjs +0 -286
- package/scripts/toolcall-args-test.mjs +0 -239
- package/scripts/tui-ambiguous-width-test.mjs +0 -113
- package/scripts/tui-background-failure-smoke.mjs +0 -73
- package/scripts/tui-perf-run.ps1 +0 -26
- package/scripts/tui-render-smoke.mjs +0 -90
- package/scripts/tui-runtime-load-bench-entry.jsx +0 -608
- package/scripts/tui-runtime-load-bench.mjs +0 -50
- package/scripts/tui-store-frame-batch-test.mjs +0 -99
- package/scripts/tui-transcript-jitter-harness-entry.jsx +0 -383
- package/scripts/tui-transcript-perf-test.mjs +0 -934
- package/scripts/usage-metrics-epoch-smoke.mjs +0 -114
- package/scripts/verify-release-assets-test.mjs +0 -281
- package/scripts/web-fetch-routing-test.mjs +0 -158
- package/scripts/webhook-smoke.mjs +0 -201
- package/scripts/windows-hide-spawn-options-test.mjs +0 -19
- package/scripts/worker-notify-rejection-test.mjs +0 -51
- package/scripts/write-backpressure-test.mjs +0 -147
|
@@ -32,7 +32,7 @@ const MAX_TOKENS = {
|
|
|
32
32
|
// garbage, whitespace) are treated as UNSET — not as "use the default cap
|
|
33
33
|
// outright" — so catalog/fallback still decide for low-cap models. Raw env
|
|
34
34
|
// truthiness must never bypass resolution.
|
|
35
|
-
|
|
35
|
+
function envAnthropicMaxOutputOverride() {
|
|
36
36
|
const raw = process.env[ENV_VAR];
|
|
37
37
|
if (raw == null || String(raw).trim() === '') return null;
|
|
38
38
|
const n = Number(raw);
|
|
@@ -40,14 +40,14 @@ export function envAnthropicMaxOutputOverride() {
|
|
|
40
40
|
return Math.floor(n);
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
function resolveAnthropicSafetyCap() {
|
|
44
44
|
return envAnthropicMaxOutputOverride() ?? DEFAULT_SAFETY_CAP;
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
// Pure lookup over an already-loaded catalog array (disk cache or in-memory
|
|
48
48
|
// mirror) — no I/O, no caching strategy. Callers own how/when the array is
|
|
49
49
|
// loaded/refreshed.
|
|
50
|
-
|
|
50
|
+
function lookupCatalogOutputTokens(models, id) {
|
|
51
51
|
if (!id || !Array.isArray(models)) return null;
|
|
52
52
|
const entry = models.find(m => m?.id === id);
|
|
53
53
|
const out = Number(entry?.outputTokens);
|
|
@@ -59,7 +59,7 @@ export function lookupCatalogOutputTokens(models, id) {
|
|
|
59
59
|
// the legacy 4.x line (this is the claude-sonnet-5 fix: 16384 was starving
|
|
60
60
|
// visible output once extended thinking ate into the same hard cap). Keep
|
|
61
61
|
// sonnet-4-x conservative at 16384; only bump 5+.
|
|
62
|
-
|
|
62
|
+
function fallbackAnthropicMaxTokens(model) {
|
|
63
63
|
if (MAX_TOKENS[model]) return MAX_TOKENS[model];
|
|
64
64
|
const id = String(model || '').toLowerCase();
|
|
65
65
|
if (id.includes('opus')) return 65536;
|
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
// Anthropic model catalog + message conversion helpers, extracted from anthropic.mjs.
|
|
2
|
+
import { createRequire } from 'node:module';
|
|
3
|
+
import { getAgentApiKey } from '../../../shared/provider-api-key.mjs';
|
|
4
|
+
import { sanitizeToolPairs, sanitizeAnthropicContentPairs, foldUserTextIntoToolResultTail } from '../session/context-utils.mjs';
|
|
5
|
+
import {
|
|
6
|
+
ANTHROPIC_RETRY_BACKOFF_MS,
|
|
7
|
+
ANTHROPIC_RETRY_JITTER_RATIO,
|
|
8
|
+
AnthropicFallbackTriggeredError,
|
|
9
|
+
anthropicMaxAttempts,
|
|
10
|
+
anthropicRequestTimeoutMs,
|
|
11
|
+
classifyError,
|
|
12
|
+
midstreamBackoffFor,
|
|
13
|
+
sleepWithAbort,
|
|
14
|
+
withRetry,
|
|
15
|
+
retryAfterMsFromError,
|
|
16
|
+
} from './retry-classifier.mjs';
|
|
17
|
+
import { traceAgentUsage } from '../agent-trace.mjs';
|
|
18
|
+
import {
|
|
19
|
+
PROVIDER_FIRST_BYTE_TIMEOUT_MS,
|
|
20
|
+
createTimeoutSignal,
|
|
21
|
+
createPassthroughSignal,
|
|
22
|
+
} from '../stall-policy.mjs';
|
|
23
|
+
import { createAbortController } from '../../../shared/abort-controller.mjs';
|
|
24
|
+
import {
|
|
25
|
+
ANTHROPIC_MAX_MIDSTREAM_RETRIES,
|
|
26
|
+
parseSSEStream,
|
|
27
|
+
_classifyMidstreamError,
|
|
28
|
+
} from './anthropic-sse.mjs';
|
|
29
|
+
import { buildAnthropicBetaHeaders, supportsAnthropicFastMode } from './anthropic-betas.mjs';
|
|
30
|
+
import {
|
|
31
|
+
applyAnthropicEffortToBody,
|
|
32
|
+
effortValuesForModel,
|
|
33
|
+
shouldIncludeEffortBeta,
|
|
34
|
+
} from './anthropic-effort.mjs';
|
|
35
|
+
import { normalizeContentForAnthropic } from './media-normalization.mjs';
|
|
36
|
+
import { enrichModels } from './model-catalog.mjs';
|
|
37
|
+
import { sanitizeModelList } from './model-list-sanitize.mjs';
|
|
38
|
+
import { makeModelCache } from './model-cache.mjs';
|
|
39
|
+
import { resolveAnthropicMaxTokens } from './anthropic-max-tokens.mjs';
|
|
40
|
+
import { getLlmDispatcher } from '../../../shared/llm/http-agent.mjs';
|
|
41
|
+
import { notifyCurrentAnthropicRateLimit } from './admission-scheduler.mjs';
|
|
42
|
+
import {
|
|
43
|
+
ANTHROPIC_CACHE_TTL_STABLE as CACHE_TTL_STABLE,
|
|
44
|
+
ANTHROPIC_CACHE_TTL_VOLATILE as CACHE_TTL_VOLATILE,
|
|
45
|
+
applyAnthropicCacheMarkers,
|
|
46
|
+
clampAnthropicThinkingBudget as clampThinkingBudgetTokens,
|
|
47
|
+
deferredAnthropicTools as sharedDeferredAnthropicTools,
|
|
48
|
+
requestAnthropicTools as sharedRequestAnthropicTools,
|
|
49
|
+
normalizeAnthropicNonStreamingResponse,
|
|
50
|
+
resolveAnthropicCacheTtls as resolveCacheTtls,
|
|
51
|
+
sanitizeAnthropicInputSchema,
|
|
52
|
+
toAnthropicToolChoice,
|
|
53
|
+
} from './lib/anthropic-request-utils.mjs';
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
export const require = createRequire(import.meta.url);
|
|
57
|
+
let _Anthropic = null;
|
|
58
|
+
export function loadAnthropic() {
|
|
59
|
+
if (!_Anthropic) {
|
|
60
|
+
const mod = require('@anthropic-ai/sdk');
|
|
61
|
+
_Anthropic = mod.default || mod.Anthropic || mod;
|
|
62
|
+
}
|
|
63
|
+
return _Anthropic;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Abort-aware mid-stream backoff sleep → shared sleepWithAbort
|
|
67
|
+
// (retry-classifier.mjs). abortMessage preserves the prior fallback text.
|
|
68
|
+
export function _midstreamSleepWithAbort(ms, signal) {
|
|
69
|
+
return sleepWithAbort(ms, signal, undefined, 'Anthropic mid-stream retry backoff aborted');
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// 4-BP cache policy aligned with anthropic-oauth — system + tier3 +
|
|
73
|
+
// messages-tail. Tool schemas sit before system and are covered by the system
|
|
74
|
+
// breakpoint, so they do not spend a separate cache_control slot. 1h TTL
|
|
75
|
+
// requires the extended-cache-ttl beta header, which we set on the client via
|
|
76
|
+
// defaultHeaders below.
|
|
77
|
+
|
|
78
|
+
// BP3 (tier3) rides its own `system` role block (the 3rd system block, tagged
|
|
79
|
+
// cacheTier:'tier3'). buildSystemBlocks applies the tier3 1h cache_control to
|
|
80
|
+
// that block; BP1/BP2 take the system TTL. Mirrors anthropic-oauth.mjs.
|
|
81
|
+
|
|
82
|
+
export function buildSystemBlocks(systemMsgs, systemTtl, tier3Ttl) {
|
|
83
|
+
// systemMsgs is an array of { content, cacheTier }. Each non-empty element
|
|
84
|
+
// becomes its own content block: cacheTier:'tier3' (BP3 sessionMarker) gets
|
|
85
|
+
// tier3Ttl, every other block (BP1/BP2) gets systemTtl. A null TTL leaves
|
|
86
|
+
// the corresponding block uncached.
|
|
87
|
+
const items = Array.isArray(systemMsgs)
|
|
88
|
+
? systemMsgs
|
|
89
|
+
.map(m => ({
|
|
90
|
+
text: typeof m?.content === 'string' ? m.content.trim() : '',
|
|
91
|
+
tier: m?.cacheTier === 'tier3' ? 'tier3' : 'system',
|
|
92
|
+
}))
|
|
93
|
+
.filter(it => it.text)
|
|
94
|
+
: [];
|
|
95
|
+
// Anthropic caps cache_control breakpoints at 4 per request; defensively
|
|
96
|
+
// cap it here too so an unexpectedly large systemMsgs array can never
|
|
97
|
+
// mark more than 4 blocks (extras keep their text, just lose the
|
|
98
|
+
// cache_control breakpoint, not the block itself). Mirrors
|
|
99
|
+
// anthropic-oauth.mjs.
|
|
100
|
+
const MAX_SYSTEM_BREAKPOINTS = 4;
|
|
101
|
+
let bpCount = 0;
|
|
102
|
+
return items.map(it => {
|
|
103
|
+
const block = { type: 'text', text: it.text };
|
|
104
|
+
const ttl = it.tier === 'tier3' ? tier3Ttl : systemTtl;
|
|
105
|
+
if (ttl && bpCount < MAX_SYSTEM_BREAKPOINTS) {
|
|
106
|
+
block.cache_control = ttl;
|
|
107
|
+
bpCount++;
|
|
108
|
+
}
|
|
109
|
+
return block;
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export const MODELS = [
|
|
114
|
+
{ id: 'claude-opus-4-8', name: 'Claude Opus 4.8', provider: 'anthropic', family: 'opus', contextWindow: 1000000 },
|
|
115
|
+
{ id: 'claude-opus-4-7', name: 'Claude Opus 4.7', provider: 'anthropic', family: 'opus', contextWindow: 1000000 },
|
|
116
|
+
{ id: 'claude-opus-4-6', name: 'Claude Opus 4.6', provider: 'anthropic', family: 'opus', contextWindow: 1000000 },
|
|
117
|
+
{ id: 'claude-sonnet-4-6', name: 'Claude Sonnet 4.6', provider: 'anthropic', family: 'sonnet', contextWindow: 1000000 },
|
|
118
|
+
{ id: 'claude-haiku-4-5-20251001', name: 'Claude Haiku 4.5', provider: 'anthropic', family: 'haiku', contextWindow: 200000 },
|
|
119
|
+
];
|
|
120
|
+
export const ANTHROPIC_VERSION = '2023-06-01';
|
|
121
|
+
|
|
122
|
+
export function _prettyName(id, family) {
|
|
123
|
+
const v = String(id || '').match(/^claude-[a-z]+-(\d+)(?:-(\d+))?/i);
|
|
124
|
+
const base = family ? family[0].toUpperCase() + family.slice(1) : 'Claude';
|
|
125
|
+
return v ? `${base} ${v[1]}${v[2] ? `.${v[2]}` : ''}` : base;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export function _defaultContextForModel(id, family) {
|
|
129
|
+
const text = String(id || '');
|
|
130
|
+
const version = text.match(/^claude-[a-z]+-(\d+)(?:-(\d+))?/i);
|
|
131
|
+
if (Number(version?.[1] || 0) >= 5) return 1000000;
|
|
132
|
+
if (/^claude-(opus|sonnet)-4-(6|7|8)(?:$|-)/i.test(text)) return 1000000;
|
|
133
|
+
if (family && family !== 'other') return 200000;
|
|
134
|
+
return 200000;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export function _capabilitySupported(capability) {
|
|
138
|
+
return capability === true || capability?.supported === true;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export function _normalizeAnthropicModel(raw, provider = 'anthropic') {
|
|
142
|
+
const id = raw?.id || raw?.name || raw?.model;
|
|
143
|
+
if (!id) return null;
|
|
144
|
+
const familyMatch = String(id).match(/^claude-([a-z]+)/i);
|
|
145
|
+
const family = familyMatch ? familyMatch[1].toLowerCase() : 'other';
|
|
146
|
+
const dated = /-\d{8}$/.test(String(id));
|
|
147
|
+
const versioned = !dated && /^claude-[a-z]+-\d+(?:-\d+)?$/i.test(String(id));
|
|
148
|
+
const effortValues = effortValuesForModel(raw?.capabilities, id);
|
|
149
|
+
return {
|
|
150
|
+
id,
|
|
151
|
+
display: raw?.display_name || raw?.displayName || raw?.display || _prettyName(id, family),
|
|
152
|
+
family,
|
|
153
|
+
provider,
|
|
154
|
+
contextWindow: raw?.context_window || raw?.max_context_window || raw?.max_input_tokens || raw?.input_token_limit || raw?.inputTokenLimit || _defaultContextForModel(id, family),
|
|
155
|
+
outputTokens: raw?.max_tokens || raw?.max_output_tokens || raw?.output_token_limit || raw?.outputTokenLimit || null,
|
|
156
|
+
tier: dated ? 'dated' : versioned ? 'version' : 'family',
|
|
157
|
+
latest: false,
|
|
158
|
+
supportsReasoning: effortValues.length > 0 || _capabilitySupported(raw?.capabilities?.thinking),
|
|
159
|
+
reasoningOptions: effortValues.length ? [{ type: 'effort', values: effortValues }] : [],
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
// Family-based heuristic so new model ids (including custom user-configured
|
|
163
|
+
// ones) resolve a sensible max_tokens without requiring a code change.
|
|
164
|
+
// The API-key provider has no catalog cache of its own — it reads the same
|
|
165
|
+
// anthropic-oauth-models.json disk cache (read-only) that the OAuth provider
|
|
166
|
+
// maintains. Both providers hit the same Anthropic /v1/models catalog, so a
|
|
167
|
+
// per-model outputTokens entry is valid regardless of which auth path wrote
|
|
168
|
+
// it. If this provider is ever run standalone without the OAuth provider
|
|
169
|
+
// ever having populated the cache, loadSync() simply returns null and we
|
|
170
|
+
// fall through to the shared static heuristic in anthropic-max-tokens.mjs.
|
|
171
|
+
const ANTHROPIC_OAUTH_MODEL_CACHE_TTL_MS = 24 * 60 * 60_000;
|
|
172
|
+
const _sharedOAuthModelCache = makeModelCache({
|
|
173
|
+
fileName: 'anthropic-oauth-models.json',
|
|
174
|
+
ttlMs: ANTHROPIC_OAUTH_MODEL_CACHE_TTL_MS,
|
|
175
|
+
version: 1,
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
// In-memory mirror populated by this provider's own listModels() fetch.
|
|
179
|
+
// API-key-only installs never have the OAuth provider write the shared disk
|
|
180
|
+
// cache, so without this mirror catalog outputTokens would stay invisible to
|
|
181
|
+
// resolveMaxTokens until an OAuth session runs. listModels() results flow in
|
|
182
|
+
// here (memory only — the disk cache stays OAuth-owned/read-only for us).
|
|
183
|
+
let _apiKeyCatalogMirror = null;
|
|
184
|
+
export function _setApiKeyCatalogMirror(value) { _apiKeyCatalogMirror = value; }
|
|
185
|
+
|
|
186
|
+
function _catalogOutputTokensFromSharedCache(model) {
|
|
187
|
+
if (!model) return null;
|
|
188
|
+
try {
|
|
189
|
+
const models = Array.isArray(_apiKeyCatalogMirror)
|
|
190
|
+
? _apiKeyCatalogMirror
|
|
191
|
+
: _sharedOAuthModelCache.loadSync();
|
|
192
|
+
if (!Array.isArray(models)) return null;
|
|
193
|
+
const entry = models.find(m => m?.id === model);
|
|
194
|
+
const out = Number(entry?.outputTokens);
|
|
195
|
+
return Number.isFinite(out) && out > 0 ? out : null;
|
|
196
|
+
} catch {
|
|
197
|
+
return null;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
export function resolveMaxTokens(model) {
|
|
202
|
+
return resolveAnthropicMaxTokens(model, { catalogLookup: _catalogOutputTokensFromSharedCache });
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// Test-only escape hatch for scripts/anthropic-maxtokens-test.mjs.
|
|
206
|
+
export const _test = {
|
|
207
|
+
resolveMaxTokens,
|
|
208
|
+
deferredAnthropicTools,
|
|
209
|
+
requestAnthropicTools,
|
|
210
|
+
sanitizeInputSchema: (schema, toolName) => sanitizeAnthropicInputSchema(schema, toolName, 'anthropic'),
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
// Anthropic forbids oneOf / allOf / anyOf at the TOP level of input_schema.
|
|
214
|
+
// Mirror the same sanitizer as anthropic-oauth.mjs so both providers are safe.
|
|
215
|
+
// Map the orchestrator-level opts.toolChoice into Anthropic's tool_choice.
|
|
216
|
+
// Only 'none' is activated: it lets the hard-cap final turn keep the tool
|
|
217
|
+
// DEFINITIONS in-request (so the tools->system->messages prefix — and its
|
|
218
|
+
// prompt-cache prefix — stay byte-identical to prior turns) while forbidding
|
|
219
|
+
// tool USE, so the model can only emit text. Forced values
|
|
220
|
+
// ('required'->{type:'any'}, {name}->{type:'tool'}) are deliberately NOT
|
|
221
|
+
// mapped: Anthropic returns a 400 for any forced tool_choice while
|
|
222
|
+
// extended/adaptive thinking is enabled, and the only caller that sets
|
|
223
|
+
// opts.toolChoice='required' (the forced-first-tool turn) runs with
|
|
224
|
+
// effort/thinking active on reasoning models — activating it would convert a
|
|
225
|
+
// previously-harmless no-op into a hard 400 on exactly that turn. Attached
|
|
226
|
+
// only when the request actually carries tools (see _doSend). Mirrors
|
|
227
|
+
// anthropic-oauth.mjs.
|
|
228
|
+
export function deferredAnthropicTools(activeTools, messages, opts) {
|
|
229
|
+
return sharedDeferredAnthropicTools(activeTools, messages, opts, 'anthropic');
|
|
230
|
+
}
|
|
231
|
+
export function requestAnthropicTools(tools, messages, opts) {
|
|
232
|
+
return sharedRequestAnthropicTools(tools, messages, opts, 'anthropic');
|
|
233
|
+
}
|
|
234
|
+
export function toAnthropicMessages(messages) {
|
|
235
|
+
// Marker-free lowering. cache_control is applied AFTER sanitization by
|
|
236
|
+
// applyAnthropicCacheMarkers() so that block drops/inserts/reorders
|
|
237
|
+
// performed by sanitizeAnthropicContentPairs cannot move or delete a
|
|
238
|
+
// marked block (the root cause of the sporadic COLD-turn cache miss:
|
|
239
|
+
// pre-sanitize markers landed on blocks the sanitizer then rewrote, so
|
|
240
|
+
// the provider-visible breakpoint diverged from the cached one).
|
|
241
|
+
const result = [];
|
|
242
|
+
for (let idx = 0; idx < messages.length; idx++) {
|
|
243
|
+
const m = messages[idx];
|
|
244
|
+
if (m.role === 'system') continue;
|
|
245
|
+
if (m.role === 'assistant' && (m.toolCalls?.length || m.assistantBlocks?.length || m.thinkingBlocks?.length)) {
|
|
246
|
+
let content;
|
|
247
|
+
if (m.assistantBlocks?.length) {
|
|
248
|
+
content = m.assistantBlocks.slice();
|
|
249
|
+
} else {
|
|
250
|
+
content = [];
|
|
251
|
+
// Adaptive-thinking round-trip: prior-turn thinking blocks are
|
|
252
|
+
// REQUIRED back, unmodified (signature intact; empty thinking
|
|
253
|
+
// field allowed), and MUST precede tool_use blocks.
|
|
254
|
+
if (Array.isArray(m.thinkingBlocks)) {
|
|
255
|
+
for (const tb of m.thinkingBlocks) {
|
|
256
|
+
if (tb && typeof tb === 'object') content.push(tb);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
if (m.content) content.push({ type: 'text', text: m.content });
|
|
260
|
+
for (const tc of m.toolCalls || []) {
|
|
261
|
+
content.push({
|
|
262
|
+
type: 'tool_use',
|
|
263
|
+
id: tc.id,
|
|
264
|
+
name: tc.name,
|
|
265
|
+
input: tc.arguments,
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
result.push({ role: 'assistant', content });
|
|
270
|
+
continue;
|
|
271
|
+
}
|
|
272
|
+
if (m.role === 'tool') {
|
|
273
|
+
const last = result[result.length - 1];
|
|
274
|
+
const native = m.nativeToolSearch;
|
|
275
|
+
const nativeProvider = String(native?.provider || '').toLowerCase();
|
|
276
|
+
const anthropicNative = new Set(['anthropic', 'anthropic-oauth']);
|
|
277
|
+
const references = (!nativeProvider || anthropicNative.has(nativeProvider))
|
|
278
|
+
&& Array.isArray(native?.toolReferences)
|
|
279
|
+
? native.toolReferences.map((name) => String(name || '').trim()).filter(Boolean)
|
|
280
|
+
: [];
|
|
281
|
+
const block = {
|
|
282
|
+
type: 'tool_result',
|
|
283
|
+
tool_use_id: m.toolCallId || '',
|
|
284
|
+
content: references.length
|
|
285
|
+
? references.map((tool_name) => ({ type: 'tool_reference', tool_name }))
|
|
286
|
+
: normalizeContentForAnthropic(m.content),
|
|
287
|
+
...((m.toolKind === 'error' || m.isError === true) ? { is_error: true } : {}),
|
|
288
|
+
};
|
|
289
|
+
if (last?.role === 'user' && Array.isArray(last.content)) {
|
|
290
|
+
last.content.push(block);
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
result.push({ role: 'user', content: [block] });
|
|
294
|
+
}
|
|
295
|
+
continue;
|
|
296
|
+
}
|
|
297
|
+
// First-party client parity: fold a user text turn that directly follows a
|
|
298
|
+
// tool_result turn into that tool_result's content (empty end_turn
|
|
299
|
+
// livelock prevention; see foldUserTextIntoToolResultTail).
|
|
300
|
+
// EXCEPTION: steering-origin user messages (human/TUI interjections)
|
|
301
|
+
// keep their own user turn so provenance survives — folding them would
|
|
302
|
+
// disguise user input as tool output. Anthropic accepts a user text
|
|
303
|
+
// message after a tool_result message, so the turn stays request-valid.
|
|
304
|
+
const isSteering = m.role === 'user' && m.meta?.source === 'steering';
|
|
305
|
+
if (m.role === 'user' && !isSteering
|
|
306
|
+
&& foldUserTextIntoToolResultTail(result, normalizeContentForAnthropic(m.content))) {
|
|
307
|
+
continue;
|
|
308
|
+
}
|
|
309
|
+
result.push({ role: m.role, content: normalizeContentForAnthropic(m.content) });
|
|
310
|
+
}
|
|
311
|
+
return sanitizeAnthropicContentPairs(result);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
// Test-only: expose the lowering so the steering-provenance test can assert
|
|
315
|
+
// the API-key provider keeps steering-tagged user turns distinct (mirrors
|
|
316
|
+
// anthropic-oauth._buildRequestBodyForCacheSmoke coverage).
|
|
317
|
+
export function _toAnthropicMessagesForTest(messages) {
|
|
318
|
+
return toAnthropicMessages(messages);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
// Applies cache_control markers to the FINAL, already-sanitized Anthropic
|
|
322
|
+
// message array — by INVARIANT, never by pre-sanitize index. Because
|
|
323
|
+
// sanitizeAnthropicContentPairs has already run (and must NOT run again
|
|
324
|
+
// after this), the blocks we mark here are exactly the blocks the provider
|
|
325
|
+
// sees, so the cache breakpoint is stable across turns.
|
|
326
|
+
// message-anchor: prefer a safe tool_result tail, then a previous real user
|
|
327
|
+
// text turn if another slot remains. Synthetic
|
|
328
|
+
// <system-reminder> messages and current pure-text prompts
|
|
329
|
+
// are excluded so per-call volatileTail/current prompt
|
|
330
|
+
// content never becomes a 1h prefix key.
|
|
331
|
+
// messageTtl === null disables the tail. BP3 (tier3) now rides a system block,
|
|
332
|
+
// so it is no longer marked here.
|
|
333
|
+
// ANTHROPIC_MSG_SLOTS=0 is honoured upstream by passing messageTtl = null.
|
|
@@ -29,7 +29,7 @@ export async function _loadModelCache() {
|
|
|
29
29
|
return _modelCache.loadSync();
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
async function _saveModelCache(models) {
|
|
33
33
|
_modelCache.save(models);
|
|
34
34
|
}
|
|
35
35
|
|
|
@@ -112,7 +112,7 @@ function _defaultContextForModel(id, family) {
|
|
|
112
112
|
|
|
113
113
|
// Mark the highest-numbered version per family as `latest: true`. Uses a simple
|
|
114
114
|
// lexicographic comparison on the numeric parts embedded in the id.
|
|
115
|
-
|
|
115
|
+
function _markLatestByFamily(models) {
|
|
116
116
|
const byFamily = new Map();
|
|
117
117
|
for (const m of models) {
|
|
118
118
|
if (m.tier !== 'version') continue;
|
|
@@ -31,10 +31,10 @@ function assertSafeTokenURL(rawURL) {
|
|
|
31
31
|
return rawURL;
|
|
32
32
|
}
|
|
33
33
|
export const TOKEN_URL = assertSafeTokenURL(process.env.ANTHROPIC_OAUTH_TOKEN_URL || 'https://platform.claude.com/v1/oauth/token');
|
|
34
|
-
|
|
35
|
-
|
|
34
|
+
const DEFAULT_CREDENTIALS_PATH = join(resolvePluginData(), 'anthropic-oauth-credentials.json');
|
|
35
|
+
const CLAUDE_CODE_CLIENT_ID = process.env.ANTHROPIC_OAUTH_CLIENT_ID || '9d1c250a-e61b-44d9-88ed-5944d1962f5e';
|
|
36
36
|
export const TOKEN_REFRESH_SKEW_MS = 5 * 60_000;
|
|
37
|
-
|
|
37
|
+
const ANTHROPIC_OAUTH_REFRESH_DISABLED_ENV = 'MIXDOG_ANTHROPIC_OAUTH_REFRESH_DISABLED';
|
|
38
38
|
const CLAUDE_AI_AUTHORIZE_URL = 'https://claude.com/cai/oauth/authorize';
|
|
39
39
|
const ALL_OAUTH_SCOPES = [
|
|
40
40
|
'org:create_api_key',
|
|
@@ -71,7 +71,7 @@ function _pushUnique(list, value) {
|
|
|
71
71
|
if (!list.includes(value)) list.push(value);
|
|
72
72
|
}
|
|
73
73
|
|
|
74
|
-
|
|
74
|
+
function credentialCandidates() {
|
|
75
75
|
const bound = boundProviderAuthPath('anthropic-oauth');
|
|
76
76
|
if (bound) return [resolve(bound)];
|
|
77
77
|
const explicit = process.env.ANTHROPIC_OAUTH_CREDENTIALS_PATH;
|
|
@@ -94,7 +94,7 @@ function formatRetryAfter(ms) {
|
|
|
94
94
|
return `${Math.ceil(n)}ms`;
|
|
95
95
|
}
|
|
96
96
|
|
|
97
|
-
|
|
97
|
+
function anthropicQuotaError(status, headers, bodyText = '') {
|
|
98
98
|
const retryAfterMs = retryAfterMsFromError({ headers, response: { headers } });
|
|
99
99
|
const retryAfter = formatRetryAfter(retryAfterMs);
|
|
100
100
|
const detail = bodyText ? `: ${String(bodyText).slice(0, 200)}` : '';
|