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.
Files changed (403) hide show
  1. package/README.md +3 -0
  2. package/package.json +9 -2
  3. package/scripts/code-graph-description-contract.mjs +3 -3
  4. package/scripts/verify-release-assets.mjs +2 -2
  5. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch.mjs +11 -14
  6. package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +6 -6
  7. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +2 -2
  8. package/src/runtime/agent/orchestrator/agent-trace-format.mjs +1 -0
  9. package/src/runtime/agent/orchestrator/config.mjs +19 -124
  10. package/src/runtime/agent/orchestrator/context/collect.mjs +6 -6
  11. package/src/runtime/agent/orchestrator/dispatch-persist.mjs +2 -2
  12. package/src/runtime/agent/orchestrator/internal-agents.mjs +2 -2
  13. package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +1 -1
  14. package/src/runtime/agent/orchestrator/mcp/client.mjs +4 -4
  15. package/src/runtime/agent/orchestrator/providers/admission-scheduler.mjs +2 -2
  16. package/src/runtime/agent/orchestrator/providers/anthropic-betas.mjs +4 -4
  17. package/src/runtime/agent/orchestrator/providers/anthropic-effort.mjs +2 -2
  18. package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens.mjs +4 -4
  19. package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +333 -0
  20. package/src/runtime/agent/orchestrator/providers/anthropic-model-resolve.mjs +2 -2
  21. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +4 -4
  22. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +1 -1
  23. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +3 -277
  24. package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +2 -2
  25. package/src/runtime/agent/orchestrator/providers/custom-tool-wire.mjs +1 -1
  26. package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +2 -2
  27. package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +6 -6
  28. package/src/runtime/agent/orchestrator/providers/grok-oauth-login.mjs +196 -0
  29. package/src/runtime/agent/orchestrator/providers/grok-oauth-tokens.mjs +460 -0
  30. package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +14 -593
  31. package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +1 -1
  32. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +1 -1
  33. package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +1 -1
  34. package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +4 -4
  35. package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +2 -2
  36. package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +5 -280
  37. package/src/runtime/agent/orchestrator/providers/openai-responses-payload.mjs +357 -0
  38. package/src/runtime/agent/orchestrator/providers/openai-ws-headers.mjs +216 -0
  39. package/src/runtime/agent/orchestrator/providers/openai-ws-pool.mjs +2 -188
  40. package/src/runtime/agent/orchestrator/providers/openai-ws-stream.mjs +2 -2
  41. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +2 -2
  42. package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +1 -1
  43. package/src/runtime/agent/orchestrator/providers/provider-catalog-cache.mjs +1 -1
  44. package/src/runtime/agent/orchestrator/providers/registry.mjs +1 -1
  45. package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +2 -2
  46. package/src/runtime/agent/orchestrator/providers/statusline-route-meta.mjs +1 -1
  47. package/src/runtime/agent/orchestrator/session/cache/prefetch-cache.mjs +1 -1
  48. package/src/runtime/agent/orchestrator/session/cache/scoped-cache.mjs +3 -3
  49. package/src/runtime/agent/orchestrator/session/compact/budget.mjs +2 -2
  50. package/src/runtime/agent/orchestrator/session/compact/file-reattach.mjs +2 -2
  51. package/src/runtime/agent/orchestrator/session/compact/summary-schema.mjs +1 -1
  52. package/src/runtime/agent/orchestrator/session/compact/summary.mjs +1 -1
  53. package/src/runtime/agent/orchestrator/session/compact/text-utils.mjs +2 -2
  54. package/src/runtime/agent/orchestrator/session/context-utils.mjs +4 -4
  55. package/src/runtime/agent/orchestrator/session/loop/deferred-call-through.mjs +1 -1
  56. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +17 -0
  57. package/src/runtime/agent/orchestrator/session/loop/steering.mjs +1 -1
  58. package/src/runtime/agent/orchestrator/session/loop/stored-tool-args.mjs +18 -26
  59. package/src/runtime/agent/orchestrator/session/loop/termination.mjs +1 -1
  60. package/src/runtime/agent/orchestrator/session/loop/tool-classify.mjs +3 -3
  61. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +1 -0
  62. package/src/runtime/agent/orchestrator/session/manager/context-meta.mjs +1 -1
  63. package/src/runtime/agent/orchestrator/session/manager/delivered-completions.mjs +1 -1
  64. package/src/runtime/agent/orchestrator/session/manager/status-telemetry.mjs +1 -1
  65. package/src/runtime/agent/orchestrator/session/store/live-state.mjs +49 -0
  66. package/src/runtime/agent/orchestrator/session/store/load-cache.mjs +49 -0
  67. package/src/runtime/agent/orchestrator/session/store/save-worker.mjs +260 -0
  68. package/src/runtime/agent/orchestrator/session/store/serialize.mjs +72 -0
  69. package/src/runtime/agent/orchestrator/session/store/summary-cache.mjs +163 -0
  70. package/src/runtime/agent/orchestrator/session/store/write-guards.mjs +1 -1
  71. package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +1 -1
  72. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +4 -1
  73. package/src/runtime/agent/orchestrator/session/store.mjs +9 -561
  74. package/src/runtime/agent/orchestrator/session/tool-envelope.mjs +1 -1
  75. package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +2 -2
  76. package/src/runtime/agent/orchestrator/stall-policy.mjs +11 -11
  77. package/src/runtime/agent/orchestrator/tools/bash-policy-scan.mjs +1 -1
  78. package/src/runtime/agent/orchestrator/tools/bash-session.mjs +2 -2
  79. package/src/runtime/agent/orchestrator/tools/builtin/advisory-lock.mjs +1 -1
  80. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +2 -2
  81. package/src/runtime/agent/orchestrator/tools/builtin/atomic-write.mjs +1 -1
  82. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +2 -154
  83. package/src/runtime/agent/orchestrator/tools/builtin/cache-layers.mjs +1 -1
  84. package/src/runtime/agent/orchestrator/tools/builtin/cwd-utils.mjs +1 -1
  85. package/src/runtime/agent/orchestrator/tools/builtin/fs-reachability.mjs +1 -1
  86. package/src/runtime/agent/orchestrator/tools/builtin/fuzzy-match.mjs +1 -1
  87. package/src/runtime/agent/orchestrator/tools/builtin/glob-walk.mjs +1 -1
  88. package/src/runtime/agent/orchestrator/tools/builtin/path-locks.mjs +1 -1
  89. package/src/runtime/agent/orchestrator/tools/builtin/path-utils.mjs +1 -1
  90. package/src/runtime/agent/orchestrator/tools/builtin/read-args.mjs +2 -2
  91. package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +2 -3
  92. package/src/runtime/agent/orchestrator/tools/builtin/read-image-resize.mjs +4 -4
  93. package/src/runtime/agent/orchestrator/tools/builtin/read-open.mjs +1 -1
  94. package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +1 -1
  95. package/src/runtime/agent/orchestrator/tools/builtin/rg-runner.mjs +2 -2
  96. package/src/runtime/agent/orchestrator/tools/builtin/search-path-diagnostics.mjs +5 -5
  97. package/src/runtime/agent/orchestrator/tools/builtin/shell-analysis.mjs +1 -1
  98. package/src/runtime/agent/orchestrator/tools/builtin/shell-job-paths.mjs +2 -2
  99. package/src/runtime/agent/orchestrator/tools/builtin/shell-job-process.mjs +2 -2
  100. package/src/runtime/agent/orchestrator/tools/builtin/shell-job-spawn.mjs +519 -0
  101. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +5 -449
  102. package/src/runtime/agent/orchestrator/tools/builtin/snapshot-helpers.mjs +1 -1
  103. package/src/runtime/agent/orchestrator/tools/builtin/task-tool.mjs +212 -0
  104. package/src/runtime/agent/orchestrator/tools/builtin.mjs +1 -1
  105. package/src/runtime/agent/orchestrator/tools/code-graph/build.mjs +1 -7
  106. package/src/runtime/agent/orchestrator/tools/code-graph/disk-cache.mjs +9 -36
  107. package/src/runtime/agent/orchestrator/tools/code-graph/dispatch.mjs +15 -3
  108. package/src/runtime/agent/orchestrator/tools/code-graph/search-references.mjs +429 -0
  109. package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +2 -395
  110. package/src/runtime/agent/orchestrator/tools/code-graph/symbol-index.mjs +2 -2
  111. package/src/runtime/agent/orchestrator/tools/code-graph/text-mask.mjs +1 -1
  112. package/src/runtime/agent/orchestrator/tools/code-graph/trusted-roots.mjs +1 -1
  113. package/src/runtime/agent/orchestrator/tools/code-graph-prewarm-worker.mjs +1 -1
  114. package/src/runtime/agent/orchestrator/tools/code-graph-state.mjs +3 -3
  115. package/src/runtime/agent/orchestrator/tools/mutation-planner.mjs +5 -5
  116. package/src/runtime/agent/orchestrator/tools/next-call-utils.mjs +1 -1
  117. package/src/runtime/agent/orchestrator/tools/patch/dispatch.mjs +1 -1
  118. package/src/runtime/agent/orchestrator/tools/patch/matcher.mjs +7 -7
  119. package/src/runtime/agent/orchestrator/tools/patch/orchestrator.mjs +72 -9
  120. package/src/runtime/agent/orchestrator/tools/patch/parsing.mjs +4 -4
  121. package/src/runtime/agent/orchestrator/tools/patch/paths.mjs +1 -1
  122. package/src/runtime/agent/orchestrator/tools/patch/v4a-convert.mjs +1 -1
  123. package/src/runtime/agent/orchestrator/tools/patch-tool-defs.mjs +4 -4
  124. package/src/runtime/agent/orchestrator/tools/patch.mjs +1 -1
  125. package/src/runtime/agent/orchestrator/tools/result-compression.mjs +3 -3
  126. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +2 -444
  127. package/src/runtime/agent/orchestrator/tools/shell-exec-output.mjs +505 -0
  128. package/src/runtime/agent/orchestrator/tools/shell-exec-policy.mjs +2 -2
  129. package/src/runtime/agent/orchestrator/tools/shell-snapshot.mjs +1 -1
  130. package/src/runtime/channels/lib/backend-dispatch.mjs +20 -5
  131. package/src/runtime/channels/lib/scheduler.mjs +1 -1
  132. package/src/runtime/channels/lib/telegram-format.mjs +1 -1
  133. package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +4 -4
  134. package/src/runtime/channels/tool-defs.mjs +2 -3
  135. package/src/runtime/memory/index.mjs +1 -5
  136. package/src/runtime/memory/lib/core-memory-candidates.mjs +357 -0
  137. package/src/runtime/memory/lib/core-memory-store.mjs +7 -357
  138. package/src/runtime/memory/lib/cycle-signatures.mjs +1 -1
  139. package/src/runtime/memory/lib/embedding-model-config.mjs +1 -1
  140. package/src/runtime/memory/lib/embedding-provider.mjs +1 -5
  141. package/src/runtime/memory/lib/embedding-worker.mjs +1 -5
  142. package/src/runtime/memory/lib/ko-morph.mjs +2 -2
  143. package/src/runtime/memory/lib/memory-config-flags.mjs +2 -5
  144. package/src/runtime/memory/lib/memory-cycle-requests.mjs +3 -7
  145. package/src/runtime/memory/lib/memory-cycle1.mjs +4 -8
  146. package/src/runtime/memory/lib/memory-cycle2-gate.mjs +1 -1
  147. package/src/runtime/memory/lib/memory-cycle2-mutations.mjs +1 -1
  148. package/src/runtime/memory/lib/memory-cycle2-shared.mjs +2 -5
  149. package/src/runtime/memory/lib/memory-cycle3.mjs +1 -5
  150. package/src/runtime/memory/lib/memory-embed.mjs +2 -6
  151. package/src/runtime/memory/lib/memory-log.mjs +8 -0
  152. package/src/runtime/memory/lib/memory-ops-policy.mjs +4 -8
  153. package/src/runtime/memory/lib/memory-recall-scope-filter.mjs +1 -1
  154. package/src/runtime/memory/lib/memory-recall-store.mjs +2 -193
  155. package/src/runtime/memory/lib/memory-score.mjs +1 -1
  156. package/src/runtime/memory/lib/memory-text-utils.mjs +2 -2
  157. package/src/runtime/memory/lib/memory.mjs +2 -6
  158. package/src/runtime/memory/lib/pg/adapter.mjs +2 -6
  159. package/src/runtime/memory/lib/pg/process.mjs +1 -5
  160. package/src/runtime/memory/lib/pg/supervisor.mjs +1 -5
  161. package/src/runtime/memory/lib/recall-format.mjs +2 -2
  162. package/src/runtime/memory/lib/recall-scoring.mjs +195 -0
  163. package/src/runtime/memory/lib/runtime-fetcher.mjs +1 -5
  164. package/src/runtime/memory/lib/trace-store.mjs +2 -6
  165. package/src/runtime/search/lib/http-fetch.mjs +6 -6
  166. package/src/runtime/search/lib/web-tools.mjs +2 -2
  167. package/src/runtime/shared/buffered-appender.mjs +1 -1
  168. package/src/runtime/shared/child-guardian.mjs +1 -1
  169. package/src/runtime/shared/child-spawn-gate.mjs +1 -1
  170. package/src/runtime/shared/config.mjs +4 -4
  171. package/src/runtime/shared/launcher-control.mjs +9 -10
  172. package/src/runtime/shared/llm/index.mjs +5 -20
  173. package/src/runtime/shared/markdown-frontmatter.mjs +1 -1
  174. package/src/runtime/shared/memory-snapshot.mjs +4 -4
  175. package/src/runtime/shared/pristine-execution.mjs +1 -1
  176. package/src/runtime/shared/process-lifecycle.mjs +0 -1
  177. package/src/runtime/shared/process-shutdown.mjs +1 -1
  178. package/src/runtime/shared/resource-admission.mjs +2 -2
  179. package/src/runtime/shared/schedule-session-run.mjs +1 -1
  180. package/src/runtime/shared/schedules-db.mjs +1 -1
  181. package/src/runtime/shared/service-discovery.mjs +2 -2
  182. package/src/runtime/shared/staged-update.mjs +6 -6
  183. package/src/runtime/shared/tool-execution-contract.mjs +1 -1
  184. package/src/runtime/shared/tool-primitives.mjs +1 -1
  185. package/src/runtime/shared/tool-surface.mjs +2 -2
  186. package/src/runtime/shared/update-checker.mjs +1 -1
  187. package/src/runtime/shared/user-cwd.mjs +3 -3
  188. package/src/runtime/shared/user-data-guard.mjs +4 -4
  189. package/src/runtime/shared/workspace-router.mjs +5 -5
  190. package/src/session-runtime/config-helpers.mjs +2 -3
  191. package/src/session-runtime/config-lifecycle.mjs +1 -1
  192. package/src/session-runtime/hitch-profile.mjs +1 -1
  193. package/src/session-runtime/lifecycle-api.mjs +6 -4
  194. package/src/session-runtime/model-recency.mjs +5 -5
  195. package/src/session-runtime/plugin-mcp.mjs +1 -1
  196. package/src/session-runtime/provider-request-snapshot.mjs +338 -0
  197. package/src/session-runtime/session-text.mjs +4 -4
  198. package/src/session-runtime/tool-catalog-schema.mjs +197 -0
  199. package/src/session-runtime/tool-catalog.mjs +6 -483
  200. package/src/session-runtime/tool-defs.mjs +1 -1
  201. package/src/standalone/agent-task-status.mjs +1 -1
  202. package/src/standalone/agent-tool/helpers.mjs +2 -2
  203. package/src/standalone/channel-admin.mjs +4 -4
  204. package/src/standalone/explore-tool.mjs +3 -3
  205. package/src/standalone/hook-bus/config.mjs +1 -1
  206. package/src/standalone/hook-bus/constants.mjs +1 -1
  207. package/src/standalone/hook-bus/rules.mjs +1 -1
  208. package/src/standalone/projects.mjs +1 -1
  209. package/src/standalone/provider-admin.mjs +2 -2
  210. package/src/tui/app/app-format.mjs +2 -2
  211. package/src/tui/app/clipboard.mjs +3 -3
  212. package/src/tui/app/input-parsers.mjs +1 -1
  213. package/src/tui/app/text-layout.mjs +1 -1
  214. package/src/tui/app/transcript-row-estimate.mjs +360 -0
  215. package/src/tui/app/transcript-window.mjs +5 -347
  216. package/src/tui/app/use-mouse-input.mjs +1 -1
  217. package/src/tui/app/use-prompt-handlers.mjs +1 -1
  218. package/src/tui/components/tool-execution/surface-detail.mjs +9 -9
  219. package/src/tui/components/tool-execution/text-format.mjs +2 -2
  220. package/src/tui/components/tool-output-format.mjs +7 -7
  221. package/src/tui/display-width.mjs +4 -4
  222. package/src/tui/dist/index.mjs +63 -97
  223. package/src/tui/engine/agent-envelope.mjs +5 -5
  224. package/src/tui/engine/notification-plan.mjs +1 -1
  225. package/src/tui/engine/queue-helpers.mjs +3 -3
  226. package/src/tui/engine/render-timing.mjs +4 -5
  227. package/src/tui/engine/session-api-ext.mjs +3 -3
  228. package/src/tui/engine/tool-result-status.mjs +5 -5
  229. package/src/tui/engine/tool-result-text.mjs +1 -1
  230. package/src/tui/engine/transcript-spill.mjs +585 -0
  231. package/src/tui/engine/tui-steering-persist.mjs +1 -1
  232. package/src/tui/engine.mjs +2 -474
  233. package/src/tui/lib/voice-setup.mjs +1 -1
  234. package/src/tui/markdown/format-token.mjs +1 -1
  235. package/src/tui/markdown/render-ansi.mjs +1 -1
  236. package/src/tui/markdown/table-layout.mjs +4 -4
  237. package/src/tui/paste-attachments.mjs +1 -1
  238. package/src/tui/prompt-history-store.mjs +3 -3
  239. package/src/tui/statusline-ansi-bridge.mjs +2 -2
  240. package/src/tui/theme.mjs +1 -1
  241. package/src/tui/transcript-tool-failures.mjs +2 -2
  242. package/src/ui/ansi.mjs +0 -9
  243. package/src/ui/statusline-format.mjs +2 -4
  244. package/scripts/_bench-cwc.json +0 -20
  245. package/scripts/_jitter-fuzz.jsx +0 -42
  246. package/scripts/_jitter-fuzz2.jsx +0 -30
  247. package/scripts/_jitter-probe.jsx +0 -35
  248. package/scripts/_jp2.jsx +0 -16
  249. package/scripts/_smoke_wd.mjs +0 -7
  250. package/scripts/abort-recovery-test.mjs +0 -175
  251. package/scripts/agent-dispatch-abort-compose-test.mjs +0 -31
  252. package/scripts/agent-live-arg-guard-smoke.mjs +0 -20
  253. package/scripts/agent-live-path-suffix-smoke.mjs +0 -34
  254. package/scripts/agent-live-toolcall-args-smoke.mjs +0 -45
  255. package/scripts/agent-loop-policy-test.mjs +0 -37
  256. package/scripts/agent-model-liveness-test.mjs +0 -763
  257. package/scripts/agent-parallel-smoke.mjs +0 -435
  258. package/scripts/agent-route-batch-test.mjs +0 -40
  259. package/scripts/agent-tag-reuse-smoke.mjs +0 -441
  260. package/scripts/agent-terminal-reap-test.mjs +0 -252
  261. package/scripts/agent-trace-io-test.mjs +0 -133
  262. package/scripts/ansi-color-capability-test.mjs +0 -90
  263. package/scripts/anthropic-admission-retry-integration-test.mjs +0 -119
  264. package/scripts/anthropic-maxtokens-test.mjs +0 -119
  265. package/scripts/anthropic-oauth-refresh-race-test.mjs +0 -397
  266. package/scripts/anthropic-transport-policy-test.mjs +0 -726
  267. package/scripts/apply-patch-edit-smoke.mjs +0 -71
  268. package/scripts/arg-guard-test.mjs +0 -93
  269. package/scripts/async-notify-settlement-test.mjs +0 -99
  270. package/scripts/atomic-lock-tryonce-test.mjs +0 -125
  271. package/scripts/background-task-meta-smoke.mjs +0 -38
  272. package/scripts/bench-run.mjs +0 -508
  273. package/scripts/boot-smoke.mjs +0 -137
  274. package/scripts/build-runtime-windows.ps1 +0 -242
  275. package/scripts/channel-daemon-smoke.mjs +0 -1103
  276. package/scripts/code-graph-aggregate-cwd-test.mjs +0 -158
  277. package/scripts/code-graph-disk-hit-test.mjs +0 -290
  278. package/scripts/code-graph-dispatch-test.mjs +0 -96
  279. package/scripts/code-graph-root-federation-test.mjs +0 -273
  280. package/scripts/compact-active-turn-test.mjs +0 -68
  281. package/scripts/compact-file-reattach-test.mjs +0 -88
  282. package/scripts/compact-pressure-test.mjs +0 -788
  283. package/scripts/compact-prior-context-flatten-test.mjs +0 -252
  284. package/scripts/compact-recall-digest-test.mjs +0 -57
  285. package/scripts/compact-smoke.mjs +0 -1017
  286. package/scripts/compact-trigger-migration-smoke.mjs +0 -261
  287. package/scripts/compacted-placeholder-scrub-test.mjs +0 -63
  288. package/scripts/context-mcp-metering-test.mjs +0 -1406
  289. package/scripts/debounced-skills-async-save-test.mjs +0 -57
  290. package/scripts/deferred-tool-loading-test.mjs +0 -250
  291. package/scripts/desktop-session-bridge-test.mjs +0 -1013
  292. package/scripts/dispatch-persist-recovery-test.mjs +0 -141
  293. package/scripts/embedding-worker-exit-test.mjs +0 -76
  294. package/scripts/execution-completion-dedup-test.mjs +0 -205
  295. package/scripts/execution-pending-resume-kick-test.mjs +0 -151
  296. package/scripts/execution-resume-esc-integration-test.mjs +0 -176
  297. package/scripts/explore-bench-tmp.mjs +0 -36
  298. package/scripts/explore-bench.mjs +0 -248
  299. package/scripts/explore-prompt-policy-test.mjs +0 -256
  300. package/scripts/explore-timeout-cancel-test.mjs +0 -345
  301. package/scripts/find-fuzzy-hidden-test.mjs +0 -267
  302. package/scripts/forwarder-rebind-tail-test.mjs +0 -67
  303. package/scripts/freevar-smoke.mjs +0 -98
  304. package/scripts/gemini-provider-test.mjs +0 -1448
  305. package/scripts/generate-oc-icons.mjs +0 -11
  306. package/scripts/grok-oauth-refresh-race-test.mjs +0 -273
  307. package/scripts/headless-pristine-execution-test.mjs +0 -614
  308. package/scripts/hook-bus-test.mjs +0 -552
  309. package/scripts/ingest-pure-conversation-smoke.mjs +0 -175
  310. package/scripts/internal-comms-bench-test.mjs +0 -226
  311. package/scripts/internal-comms-bench.mjs +0 -853
  312. package/scripts/internal-comms-smoke.mjs +0 -277
  313. package/scripts/internal-tools-normalization-test.mjs +0 -62
  314. package/scripts/interrupted-turn-history-test.mjs +0 -399
  315. package/scripts/lead-workflow-smoke.mjs +0 -592
  316. package/scripts/lifecycle-api-test.mjs +0 -137
  317. package/scripts/live-share-test.mjs +0 -148
  318. package/scripts/live-worker-smoke.mjs +0 -333
  319. package/scripts/log-writer-guard-smoke.mjs +0 -131
  320. package/scripts/maintenance-default-routes-test.mjs +0 -164
  321. package/scripts/max-output-recovery-persist-test.mjs +0 -81
  322. package/scripts/max-output-recovery-test.mjs +0 -368
  323. package/scripts/mcp-client-normalization-test.mjs +0 -45
  324. package/scripts/mcp-grace-deferred-test.mjs +0 -225
  325. package/scripts/memory-core-input-test.mjs +0 -167
  326. package/scripts/memory-cycle-routing-test.mjs +0 -111
  327. package/scripts/memory-meta-concurrency-test.mjs +0 -20
  328. package/scripts/memory-pg-recovery-test.mjs +0 -59
  329. package/scripts/memory-rule-contract-test.mjs +0 -93
  330. package/scripts/model-list-sanitize-test.mjs +0 -37
  331. package/scripts/mouse-tracking-restore-smoke.mjs +0 -107
  332. package/scripts/native-edit-wire-test.mjs +0 -152
  333. package/scripts/notify-completion-mirror-test.mjs +0 -73
  334. package/scripts/openai-oauth-refresh-race-test.mjs +0 -120
  335. package/scripts/openai-oauth-ws-1006-retry-test.mjs +0 -954
  336. package/scripts/openai-ws-early-settle-test.mjs +0 -216
  337. package/scripts/output-style-bench.mjs +0 -292
  338. package/scripts/output-style-smoke.mjs +0 -145
  339. package/scripts/parent-abort-link-test.mjs +0 -90
  340. package/scripts/patch-binary-cache-test.mjs +0 -181
  341. package/scripts/path-suffix-test.mjs +0 -57
  342. package/scripts/pending-completion-drop-test.mjs +0 -239
  343. package/scripts/pending-messages-lock-nonblocking-test.mjs +0 -62
  344. package/scripts/pretool-ask-runtime-test.mjs +0 -54
  345. package/scripts/process-lifecycle-test.mjs +0 -461
  346. package/scripts/prompt-immediate-render-test.mjs +0 -89
  347. package/scripts/prompt-input-parity-test.mjs +0 -145
  348. package/scripts/provider-admission-scheduler-test.mjs +0 -681
  349. package/scripts/provider-contract-test.mjs +0 -632
  350. package/scripts/provider-stream-stall-test.mjs +0 -276
  351. package/scripts/provider-toolcall-test.mjs +0 -3063
  352. package/scripts/reactive-compact-persist-smoke.mjs +0 -203
  353. package/scripts/recall-bench.mjs +0 -359
  354. package/scripts/resource-admission-test.mjs +0 -792
  355. package/scripts/result-classification-test.mjs +0 -75
  356. package/scripts/rg-runner-test.mjs +0 -240
  357. package/scripts/routing-corpus-test.mjs +0 -349
  358. package/scripts/sanitize-tool-pairs-test.mjs +0 -260
  359. package/scripts/session-bench-cache-break-test.mjs +0 -102
  360. package/scripts/session-bench.mjs +0 -1708
  361. package/scripts/session-context-bench.mjs +0 -344
  362. package/scripts/session-heartbeat-lifecycle-test.mjs +0 -68
  363. package/scripts/session-ingest-compaction-smoke.mjs +0 -279
  364. package/scripts/session-ingest-smoke.mjs +0 -177
  365. package/scripts/session-orphan-sweep-test.mjs +0 -109
  366. package/scripts/set-effort-config-test.mjs +0 -41
  367. package/scripts/shell-failure-diagnostics-test.mjs +0 -280
  368. package/scripts/shell-hardening-test.mjs +0 -209
  369. package/scripts/shell-jobs-windows-hide-test.mjs +0 -164
  370. package/scripts/ship-mode-test.mjs +0 -98
  371. package/scripts/smoke-loop-failure-summary-test.mjs +0 -38
  372. package/scripts/smoke-loop-failure-summary.mjs +0 -16
  373. package/scripts/smoke-loop-report.mjs +0 -221
  374. package/scripts/smoke-loop.mjs +0 -202
  375. package/scripts/smoke-runtime-negative.ps1 +0 -106
  376. package/scripts/statusline-quota-hysteresis-test.mjs +0 -62
  377. package/scripts/steering-drain-buckets-test.mjs +0 -467
  378. package/scripts/steering-fold-provenance-test.mjs +0 -71
  379. package/scripts/streaming-tail-window-test.mjs +0 -175
  380. package/scripts/submit-commandbusy-race-test.mjs +0 -257
  381. package/scripts/task-bench.mjs +0 -205
  382. package/scripts/terminal-bench-isolation-guards-test.mjs +0 -102
  383. package/scripts/termio-input-smoke.mjs +0 -199
  384. package/scripts/tool-result-hook-test.mjs +0 -48
  385. package/scripts/tool-smoke.mjs +0 -2453
  386. package/scripts/tool-tui-presentation-test.mjs +0 -286
  387. package/scripts/toolcall-args-test.mjs +0 -239
  388. package/scripts/tui-ambiguous-width-test.mjs +0 -113
  389. package/scripts/tui-background-failure-smoke.mjs +0 -73
  390. package/scripts/tui-perf-run.ps1 +0 -26
  391. package/scripts/tui-render-smoke.mjs +0 -90
  392. package/scripts/tui-runtime-load-bench-entry.jsx +0 -608
  393. package/scripts/tui-runtime-load-bench.mjs +0 -50
  394. package/scripts/tui-store-frame-batch-test.mjs +0 -99
  395. package/scripts/tui-transcript-jitter-harness-entry.jsx +0 -383
  396. package/scripts/tui-transcript-perf-test.mjs +0 -934
  397. package/scripts/usage-metrics-epoch-smoke.mjs +0 -114
  398. package/scripts/verify-release-assets-test.mjs +0 -281
  399. package/scripts/web-fetch-routing-test.mjs +0 -158
  400. package/scripts/webhook-smoke.mjs +0 -201
  401. package/scripts/windows-hide-spawn-options-test.mjs +0 -19
  402. package/scripts/worker-notify-rejection-test.mjs +0 -51
  403. 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
- export function envAnthropicMaxOutputOverride() {
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
- export function resolveAnthropicSafetyCap() {
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
- export function lookupCatalogOutputTokens(models, id) {
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
- export function fallbackAnthropicMaxTokens(model) {
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
- export async function _saveModelCache(models) {
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
- export function _markLatestByFamily(models) {
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
- export const DEFAULT_CREDENTIALS_PATH = join(resolvePluginData(), 'anthropic-oauth-credentials.json');
35
- export const CLAUDE_CODE_CLIENT_ID = process.env.ANTHROPIC_OAUTH_CLIENT_ID || '9d1c250a-e61b-44d9-88ed-5944d1962f5e';
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
- export const ANTHROPIC_OAUTH_REFRESH_DISABLED_ENV = 'MIXDOG_ANTHROPIC_OAUTH_REFRESH_DISABLED';
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
- export function credentialCandidates() {
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
- export function anthropicQuotaError(status, headers, bodyText = '') {
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)}` : '';