mixdog 0.9.63 → 0.9.65

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 (408) 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/turn-snapshot.mjs +184 -0
  187. package/src/runtime/shared/update-checker.mjs +1 -1
  188. package/src/runtime/shared/user-cwd.mjs +3 -3
  189. package/src/runtime/shared/user-data-guard.mjs +4 -4
  190. package/src/runtime/shared/workspace-router.mjs +5 -5
  191. package/src/session-runtime/config-helpers.mjs +2 -3
  192. package/src/session-runtime/config-lifecycle.mjs +1 -1
  193. package/src/session-runtime/hitch-profile.mjs +1 -1
  194. package/src/session-runtime/lifecycle-api.mjs +6 -4
  195. package/src/session-runtime/model-recency.mjs +5 -5
  196. package/src/session-runtime/plugin-mcp.mjs +1 -1
  197. package/src/session-runtime/provider-request-snapshot.mjs +338 -0
  198. package/src/session-runtime/runtime-core.mjs +4 -0
  199. package/src/session-runtime/session-text.mjs +4 -4
  200. package/src/session-runtime/session-turn-api.mjs +7 -0
  201. package/src/session-runtime/tool-catalog-schema.mjs +197 -0
  202. package/src/session-runtime/tool-catalog.mjs +6 -483
  203. package/src/session-runtime/tool-defs.mjs +1 -1
  204. package/src/standalone/agent-task-status.mjs +1 -1
  205. package/src/standalone/agent-tool/helpers.mjs +2 -2
  206. package/src/standalone/channel-admin.mjs +4 -4
  207. package/src/standalone/explore-tool.mjs +3 -3
  208. package/src/standalone/hook-bus/config.mjs +1 -1
  209. package/src/standalone/hook-bus/constants.mjs +1 -1
  210. package/src/standalone/hook-bus/rules.mjs +1 -1
  211. package/src/standalone/projects.mjs +1 -1
  212. package/src/standalone/provider-admin.mjs +2 -2
  213. package/src/tui/App.jsx +1 -1
  214. package/src/tui/app/app-format.mjs +2 -2
  215. package/src/tui/app/clipboard.mjs +3 -3
  216. package/src/tui/app/input-parsers.mjs +1 -1
  217. package/src/tui/app/text-layout.mjs +1 -1
  218. package/src/tui/app/transcript-row-estimate.mjs +360 -0
  219. package/src/tui/app/transcript-window.mjs +5 -347
  220. package/src/tui/app/use-mouse-input.mjs +1 -1
  221. package/src/tui/app/use-prompt-handlers.mjs +1 -1
  222. package/src/tui/components/tool-execution/surface-detail.mjs +9 -9
  223. package/src/tui/components/tool-execution/text-format.mjs +2 -2
  224. package/src/tui/components/tool-output-format.mjs +7 -7
  225. package/src/tui/display-width.mjs +4 -4
  226. package/src/tui/dist/index.mjs +187 -99
  227. package/src/tui/engine/agent-envelope.mjs +5 -5
  228. package/src/tui/engine/live-share.mjs +100 -0
  229. package/src/tui/engine/notification-plan.mjs +1 -1
  230. package/src/tui/engine/queue-helpers.mjs +3 -3
  231. package/src/tui/engine/render-timing.mjs +4 -5
  232. package/src/tui/engine/session-api-ext.mjs +6 -3
  233. package/src/tui/engine/tool-result-status.mjs +5 -5
  234. package/src/tui/engine/tool-result-text.mjs +1 -1
  235. package/src/tui/engine/transcript-spill.mjs +585 -0
  236. package/src/tui/engine/tui-steering-persist.mjs +1 -1
  237. package/src/tui/engine.mjs +29 -474
  238. package/src/tui/lib/voice-setup.mjs +1 -1
  239. package/src/tui/markdown/format-token.mjs +1 -1
  240. package/src/tui/markdown/render-ansi.mjs +1 -1
  241. package/src/tui/markdown/table-layout.mjs +4 -4
  242. package/src/tui/paste-attachments.mjs +1 -1
  243. package/src/tui/prompt-history-store.mjs +3 -3
  244. package/src/tui/statusline-ansi-bridge.mjs +2 -2
  245. package/src/tui/theme.mjs +1 -1
  246. package/src/tui/transcript-tool-failures.mjs +2 -2
  247. package/src/ui/ansi.mjs +0 -9
  248. package/src/ui/statusline-format.mjs +2 -4
  249. package/scripts/_bench-cwc.json +0 -20
  250. package/scripts/_jitter-fuzz.jsx +0 -42
  251. package/scripts/_jitter-fuzz2.jsx +0 -30
  252. package/scripts/_jitter-probe.jsx +0 -35
  253. package/scripts/_jp2.jsx +0 -16
  254. package/scripts/_smoke_wd.mjs +0 -7
  255. package/scripts/abort-recovery-test.mjs +0 -175
  256. package/scripts/agent-dispatch-abort-compose-test.mjs +0 -31
  257. package/scripts/agent-live-arg-guard-smoke.mjs +0 -20
  258. package/scripts/agent-live-path-suffix-smoke.mjs +0 -34
  259. package/scripts/agent-live-toolcall-args-smoke.mjs +0 -45
  260. package/scripts/agent-loop-policy-test.mjs +0 -37
  261. package/scripts/agent-model-liveness-test.mjs +0 -763
  262. package/scripts/agent-parallel-smoke.mjs +0 -435
  263. package/scripts/agent-route-batch-test.mjs +0 -40
  264. package/scripts/agent-tag-reuse-smoke.mjs +0 -441
  265. package/scripts/agent-terminal-reap-test.mjs +0 -252
  266. package/scripts/agent-trace-io-test.mjs +0 -133
  267. package/scripts/ansi-color-capability-test.mjs +0 -90
  268. package/scripts/anthropic-admission-retry-integration-test.mjs +0 -119
  269. package/scripts/anthropic-maxtokens-test.mjs +0 -119
  270. package/scripts/anthropic-oauth-refresh-race-test.mjs +0 -397
  271. package/scripts/anthropic-transport-policy-test.mjs +0 -726
  272. package/scripts/apply-patch-edit-smoke.mjs +0 -71
  273. package/scripts/arg-guard-test.mjs +0 -93
  274. package/scripts/async-notify-settlement-test.mjs +0 -99
  275. package/scripts/atomic-lock-tryonce-test.mjs +0 -125
  276. package/scripts/background-task-meta-smoke.mjs +0 -38
  277. package/scripts/bench-run.mjs +0 -508
  278. package/scripts/boot-smoke.mjs +0 -137
  279. package/scripts/build-runtime-windows.ps1 +0 -242
  280. package/scripts/channel-daemon-smoke.mjs +0 -1103
  281. package/scripts/code-graph-aggregate-cwd-test.mjs +0 -158
  282. package/scripts/code-graph-disk-hit-test.mjs +0 -290
  283. package/scripts/code-graph-dispatch-test.mjs +0 -96
  284. package/scripts/code-graph-root-federation-test.mjs +0 -273
  285. package/scripts/compact-active-turn-test.mjs +0 -68
  286. package/scripts/compact-file-reattach-test.mjs +0 -88
  287. package/scripts/compact-pressure-test.mjs +0 -788
  288. package/scripts/compact-prior-context-flatten-test.mjs +0 -252
  289. package/scripts/compact-recall-digest-test.mjs +0 -57
  290. package/scripts/compact-smoke.mjs +0 -1017
  291. package/scripts/compact-trigger-migration-smoke.mjs +0 -261
  292. package/scripts/compacted-placeholder-scrub-test.mjs +0 -63
  293. package/scripts/context-mcp-metering-test.mjs +0 -1406
  294. package/scripts/debounced-skills-async-save-test.mjs +0 -57
  295. package/scripts/deferred-tool-loading-test.mjs +0 -250
  296. package/scripts/desktop-session-bridge-test.mjs +0 -1013
  297. package/scripts/dispatch-persist-recovery-test.mjs +0 -141
  298. package/scripts/embedding-worker-exit-test.mjs +0 -76
  299. package/scripts/execution-completion-dedup-test.mjs +0 -205
  300. package/scripts/execution-pending-resume-kick-test.mjs +0 -151
  301. package/scripts/execution-resume-esc-integration-test.mjs +0 -176
  302. package/scripts/explore-bench-tmp.mjs +0 -36
  303. package/scripts/explore-bench.mjs +0 -248
  304. package/scripts/explore-prompt-policy-test.mjs +0 -256
  305. package/scripts/explore-timeout-cancel-test.mjs +0 -345
  306. package/scripts/find-fuzzy-hidden-test.mjs +0 -267
  307. package/scripts/forwarder-rebind-tail-test.mjs +0 -67
  308. package/scripts/freevar-smoke.mjs +0 -98
  309. package/scripts/gemini-provider-test.mjs +0 -1448
  310. package/scripts/generate-oc-icons.mjs +0 -11
  311. package/scripts/grok-oauth-refresh-race-test.mjs +0 -273
  312. package/scripts/headless-pristine-execution-test.mjs +0 -614
  313. package/scripts/hook-bus-test.mjs +0 -552
  314. package/scripts/ingest-pure-conversation-smoke.mjs +0 -175
  315. package/scripts/internal-comms-bench-test.mjs +0 -226
  316. package/scripts/internal-comms-bench.mjs +0 -853
  317. package/scripts/internal-comms-smoke.mjs +0 -277
  318. package/scripts/internal-tools-normalization-test.mjs +0 -62
  319. package/scripts/interrupted-turn-history-test.mjs +0 -399
  320. package/scripts/lead-workflow-smoke.mjs +0 -592
  321. package/scripts/lifecycle-api-test.mjs +0 -137
  322. package/scripts/live-share-test.mjs +0 -148
  323. package/scripts/live-worker-smoke.mjs +0 -333
  324. package/scripts/log-writer-guard-smoke.mjs +0 -131
  325. package/scripts/maintenance-default-routes-test.mjs +0 -164
  326. package/scripts/max-output-recovery-persist-test.mjs +0 -81
  327. package/scripts/max-output-recovery-test.mjs +0 -368
  328. package/scripts/mcp-client-normalization-test.mjs +0 -45
  329. package/scripts/mcp-grace-deferred-test.mjs +0 -225
  330. package/scripts/memory-core-input-test.mjs +0 -167
  331. package/scripts/memory-cycle-routing-test.mjs +0 -111
  332. package/scripts/memory-meta-concurrency-test.mjs +0 -20
  333. package/scripts/memory-pg-recovery-test.mjs +0 -59
  334. package/scripts/memory-rule-contract-test.mjs +0 -93
  335. package/scripts/model-list-sanitize-test.mjs +0 -37
  336. package/scripts/mouse-tracking-restore-smoke.mjs +0 -107
  337. package/scripts/native-edit-wire-test.mjs +0 -152
  338. package/scripts/notify-completion-mirror-test.mjs +0 -73
  339. package/scripts/openai-oauth-refresh-race-test.mjs +0 -120
  340. package/scripts/openai-oauth-ws-1006-retry-test.mjs +0 -954
  341. package/scripts/openai-ws-early-settle-test.mjs +0 -216
  342. package/scripts/output-style-bench.mjs +0 -292
  343. package/scripts/output-style-smoke.mjs +0 -145
  344. package/scripts/parent-abort-link-test.mjs +0 -90
  345. package/scripts/patch-binary-cache-test.mjs +0 -181
  346. package/scripts/path-suffix-test.mjs +0 -57
  347. package/scripts/pending-completion-drop-test.mjs +0 -239
  348. package/scripts/pending-messages-lock-nonblocking-test.mjs +0 -62
  349. package/scripts/pretool-ask-runtime-test.mjs +0 -54
  350. package/scripts/process-lifecycle-test.mjs +0 -461
  351. package/scripts/prompt-immediate-render-test.mjs +0 -89
  352. package/scripts/prompt-input-parity-test.mjs +0 -145
  353. package/scripts/provider-admission-scheduler-test.mjs +0 -681
  354. package/scripts/provider-contract-test.mjs +0 -632
  355. package/scripts/provider-stream-stall-test.mjs +0 -276
  356. package/scripts/provider-toolcall-test.mjs +0 -3063
  357. package/scripts/reactive-compact-persist-smoke.mjs +0 -203
  358. package/scripts/recall-bench.mjs +0 -359
  359. package/scripts/resource-admission-test.mjs +0 -792
  360. package/scripts/result-classification-test.mjs +0 -75
  361. package/scripts/rg-runner-test.mjs +0 -240
  362. package/scripts/routing-corpus-test.mjs +0 -349
  363. package/scripts/sanitize-tool-pairs-test.mjs +0 -260
  364. package/scripts/session-bench-cache-break-test.mjs +0 -102
  365. package/scripts/session-bench.mjs +0 -1708
  366. package/scripts/session-context-bench.mjs +0 -344
  367. package/scripts/session-heartbeat-lifecycle-test.mjs +0 -68
  368. package/scripts/session-ingest-compaction-smoke.mjs +0 -279
  369. package/scripts/session-ingest-smoke.mjs +0 -177
  370. package/scripts/session-orphan-sweep-test.mjs +0 -109
  371. package/scripts/set-effort-config-test.mjs +0 -41
  372. package/scripts/shell-failure-diagnostics-test.mjs +0 -280
  373. package/scripts/shell-hardening-test.mjs +0 -209
  374. package/scripts/shell-jobs-windows-hide-test.mjs +0 -164
  375. package/scripts/ship-mode-test.mjs +0 -98
  376. package/scripts/smoke-loop-failure-summary-test.mjs +0 -38
  377. package/scripts/smoke-loop-failure-summary.mjs +0 -16
  378. package/scripts/smoke-loop-report.mjs +0 -221
  379. package/scripts/smoke-loop.mjs +0 -202
  380. package/scripts/smoke-runtime-negative.ps1 +0 -106
  381. package/scripts/statusline-quota-hysteresis-test.mjs +0 -62
  382. package/scripts/steering-drain-buckets-test.mjs +0 -467
  383. package/scripts/steering-fold-provenance-test.mjs +0 -71
  384. package/scripts/streaming-tail-window-test.mjs +0 -175
  385. package/scripts/submit-commandbusy-race-test.mjs +0 -257
  386. package/scripts/task-bench.mjs +0 -205
  387. package/scripts/terminal-bench-isolation-guards-test.mjs +0 -102
  388. package/scripts/termio-input-smoke.mjs +0 -199
  389. package/scripts/tool-result-hook-test.mjs +0 -48
  390. package/scripts/tool-smoke.mjs +0 -2453
  391. package/scripts/tool-tui-presentation-test.mjs +0 -286
  392. package/scripts/toolcall-args-test.mjs +0 -239
  393. package/scripts/tui-ambiguous-width-test.mjs +0 -113
  394. package/scripts/tui-background-failure-smoke.mjs +0 -73
  395. package/scripts/tui-perf-run.ps1 +0 -26
  396. package/scripts/tui-render-smoke.mjs +0 -90
  397. package/scripts/tui-runtime-load-bench-entry.jsx +0 -608
  398. package/scripts/tui-runtime-load-bench.mjs +0 -50
  399. package/scripts/tui-store-frame-batch-test.mjs +0 -99
  400. package/scripts/tui-transcript-jitter-harness-entry.jsx +0 -383
  401. package/scripts/tui-transcript-perf-test.mjs +0 -934
  402. package/scripts/usage-metrics-epoch-smoke.mjs +0 -114
  403. package/scripts/verify-release-assets-test.mjs +0 -281
  404. package/scripts/web-fetch-routing-test.mjs +0 -158
  405. package/scripts/webhook-smoke.mjs +0 -201
  406. package/scripts/windows-hide-spawn-options-test.mjs +0 -19
  407. package/scripts/worker-notify-rejection-test.mjs +0 -51
  408. 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)}` : '';