mixdog 1.2.2 → 1.2.3

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 (415) hide show
  1. package/README.md +18 -0
  2. package/package.json +2 -1
  3. package/scripts/provider-pingpong-live.mjs +509 -0
  4. package/src/agents/advisor/AGENT.md +1 -1
  5. package/src/agents/advisor/agent.json +1 -1
  6. package/src/defaults/shipped-history.json +5 -0
  7. package/src/defaults/skills/setup/SKILL.md +6 -1
  8. package/src/defaults/skills/setup/references/actions.md +44 -22
  9. package/src/defaults/skills/setup/references/surfaces.md +10 -8
  10. package/src/headless-exec.mjs +15 -8
  11. package/src/lib/keychain-cjs.cjs +7 -4
  12. package/src/output-styles/common.md +11 -10
  13. package/src/rules/agent/AGENT.md +5 -5
  14. package/src/rules/lead/LEAD.md +5 -5
  15. package/src/runtime/agent/orchestrator/agent-trace-io.mjs +92 -61
  16. package/src/runtime/agent/orchestrator/cache-mtime.mjs +10 -1
  17. package/src/runtime/agent/orchestrator/config-providers-merge.mjs +7 -0
  18. package/src/runtime/agent/orchestrator/config.mjs +5 -0
  19. package/src/runtime/agent/orchestrator/context/collect.mjs +1 -0
  20. package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +26 -7
  21. package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +112 -7
  22. package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +48 -20
  23. package/src/runtime/agent/orchestrator/providers/anthropic-error-contract.mjs +2 -0
  24. package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens.mjs +24 -17
  25. package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +7 -6
  26. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
  27. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +29 -10
  28. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-blocks.mjs +20 -1
  29. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-delta.mjs +15 -2
  30. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-start.mjs +11 -4
  31. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/message-events.mjs +3 -0
  32. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events.mjs +12 -5
  33. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-outcome.mjs +1 -0
  34. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-state.mjs +14 -0
  35. package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +2 -0
  36. package/src/runtime/agent/orchestrator/providers/anthropic-turn-result.mjs +9 -0
  37. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +6 -0
  38. package/src/runtime/agent/orchestrator/providers/antigravity-request.mjs +58 -7
  39. package/src/runtime/agent/orchestrator/providers/antigravity-response.mjs +29 -10
  40. package/src/runtime/agent/orchestrator/providers/antigravity-retry-policy.mjs +16 -3
  41. package/src/runtime/agent/orchestrator/providers/antigravity-stream.mjs +10 -61
  42. package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +12 -6
  43. package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +1 -1
  44. package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +114 -72
  45. package/src/runtime/agent/orchestrator/providers/compat-request-policy.mjs +78 -2
  46. package/src/runtime/agent/orchestrator/providers/cursor-auth.mjs +37 -5
  47. package/src/runtime/agent/orchestrator/providers/cursor-client-version.mjs +1 -1
  48. package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-bridge.mjs +1 -0
  49. package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-messages.mjs +43 -2
  50. package/src/runtime/agent/orchestrator/providers/cursor-wire.mjs +3 -0
  51. package/src/runtime/agent/orchestrator/providers/cursor.mjs +9 -2
  52. package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +64 -1
  53. package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +70 -6
  54. package/src/runtime/agent/orchestrator/providers/custom-reasoning.mjs +34 -7
  55. package/src/runtime/agent/orchestrator/providers/custom-tool-wire.mjs +32 -6
  56. package/src/runtime/agent/orchestrator/providers/deepseek.mjs +67 -0
  57. package/src/runtime/agent/orchestrator/providers/effort-configuration.mjs +3 -1
  58. package/src/runtime/agent/orchestrator/providers/gemini-cache-policy.mjs +11 -4
  59. package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +25 -8
  60. package/src/runtime/agent/orchestrator/providers/gemini-error-contract.mjs +87 -5
  61. package/src/runtime/agent/orchestrator/providers/gemini-request-body.mjs +41 -5
  62. package/src/runtime/agent/orchestrator/providers/gemini-retry-policy.mjs +13 -13
  63. package/src/runtime/agent/orchestrator/providers/gemini-schema.mjs +355 -37
  64. package/src/runtime/agent/orchestrator/providers/gemini-sdk-request.mjs +1 -2
  65. package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +93 -47
  66. package/src/runtime/agent/orchestrator/providers/gemini-thinking.mjs +55 -10
  67. package/src/runtime/agent/orchestrator/providers/gemini.mjs +26 -8
  68. package/src/runtime/agent/orchestrator/providers/grok-client-version.mjs +1 -1
  69. package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +1 -0
  70. package/src/runtime/agent/orchestrator/providers/lib/action-input-contract.mjs +60 -0
  71. package/src/runtime/agent/orchestrator/providers/lib/anthropic-native-blocks.mjs +1 -0
  72. package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +246 -42
  73. package/src/runtime/agent/orchestrator/providers/lib/anthropic-server-tool-usage.mjs +18 -0
  74. package/src/runtime/agent/orchestrator/providers/lib/anthropic-system-blocks.mjs +27 -6
  75. package/src/runtime/agent/orchestrator/providers/lib/claude-bridge-schema.mjs +388 -0
  76. package/src/runtime/agent/orchestrator/providers/lib/inclusive-usage.mjs +54 -0
  77. package/src/runtime/agent/orchestrator/providers/lib/origin-bound-fetch.mjs +16 -0
  78. package/src/runtime/agent/orchestrator/providers/lib/responses-terminal-fields.mjs +11 -0
  79. package/src/runtime/agent/orchestrator/providers/lib/usage-primitives.mjs +8 -0
  80. package/src/runtime/agent/orchestrator/providers/lib/wire-pairing.mjs +48 -22
  81. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +119 -18
  82. package/src/runtime/agent/orchestrator/providers/mimo-oauth-profile.mjs +13 -15
  83. package/src/runtime/agent/orchestrator/providers/model-proxy-channel.d.mts +1 -1
  84. package/src/runtime/agent/orchestrator/providers/model-proxy-channel.mjs +1 -0
  85. package/src/runtime/agent/orchestrator/providers/model-proxy-provider.mjs +33 -1
  86. package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +2 -0
  87. package/src/runtime/agent/orchestrator/providers/openai-codex-metadata.mjs +2 -0
  88. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +121 -61
  89. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/chunk-events.mjs +35 -14
  90. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-result.mjs +5 -2
  91. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +37 -7
  92. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/tool-call-acc.mjs +2 -9
  93. package/src/runtime/agent/orchestrator/providers/openai-compat-error-contract.mjs +1 -1
  94. package/src/runtime/agent/orchestrator/providers/openai-compat-models.mjs +47 -2
  95. package/src/runtime/agent/orchestrator/providers/openai-compat-options.mjs +47 -25
  96. package/src/runtime/agent/orchestrator/providers/openai-compat-presets.mjs +5 -1
  97. package/src/runtime/agent/orchestrator/providers/openai-compat-reasoning-field.mjs +151 -0
  98. package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +42 -24
  99. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-events.mjs +63 -25
  100. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-head-parity.json +2901 -0
  101. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-parity.fixtures.mjs +172 -0
  102. package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +53 -5
  103. package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +7 -1
  104. package/src/runtime/agent/orchestrator/providers/openai-compat-trace.mjs +2 -0
  105. package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +103 -26
  106. package/src/runtime/agent/orchestrator/providers/openai-compat-xai-send.mjs +23 -4
  107. package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +11 -6
  108. package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +6 -1
  109. package/src/runtime/agent/orchestrator/providers/openai-direct-request.mjs +15 -23
  110. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/output-items.mjs +23 -10
  111. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/terminal-frames.mjs +25 -4
  112. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events.mjs +10 -0
  113. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-items.mjs +18 -7
  114. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-outcome.mjs +4 -0
  115. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-state.mjs +5 -0
  116. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/text-relay.mjs +9 -1
  117. package/src/runtime/agent/orchestrator/providers/openai-model-capabilities.mjs +80 -0
  118. package/src/runtime/agent/orchestrator/providers/openai-oauth-dispatch.mjs +3 -1
  119. package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +7 -0
  120. package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +7 -1
  121. package/src/runtime/agent/orchestrator/providers/openai-responses-input.mjs +71 -24
  122. package/src/runtime/agent/orchestrator/providers/openai-responses-payload-parity.fixture.json +323 -0
  123. package/src/runtime/agent/orchestrator/providers/openai-responses-payload.mjs +44 -16
  124. package/src/runtime/agent/orchestrator/providers/openai-ws-delta.mjs +7 -16
  125. package/src/runtime/agent/orchestrator/providers/openai-ws-response-state/refusals.mjs +60 -0
  126. package/src/runtime/agent/orchestrator/providers/openai-ws-response-state/tool-calls.mjs +51 -35
  127. package/src/runtime/agent/orchestrator/providers/openai-ws-response-state.mjs +30 -0
  128. package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +12 -0
  129. package/src/runtime/agent/orchestrator/providers/openai-ws-stream/terminal-frames.mjs +25 -6
  130. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +11 -3
  131. package/src/runtime/agent/orchestrator/providers/opencode-go-gemini.mjs +170 -0
  132. package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +75 -70
  133. package/src/runtime/agent/orchestrator/providers/openrouter.mjs +75 -0
  134. package/src/runtime/agent/orchestrator/providers/provider-error-kind.mjs +147 -8
  135. package/src/runtime/agent/orchestrator/providers/registry.mjs +4 -1
  136. package/src/runtime/agent/orchestrator/providers/retry-classification.mjs +5 -0
  137. package/src/runtime/agent/orchestrator/providers/transport-scope.d.mts +6 -0
  138. package/src/runtime/agent/orchestrator/providers/transport-scope.mjs +28 -0
  139. package/src/runtime/agent/orchestrator/providers/wire-gateway.mjs +157 -0
  140. package/src/runtime/agent/orchestrator/providers/wire-route.mjs +512 -0
  141. package/src/runtime/agent/orchestrator/providers/xai-tool-search-head-parity.json +1131 -0
  142. package/src/runtime/agent/orchestrator/providers/xai-tool-search.fixtures.mjs +183 -0
  143. package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +100 -0
  144. package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-availability.mjs +21 -0
  145. package/src/runtime/agent/orchestrator/runtime-core/effort.mjs +15 -0
  146. package/src/runtime/agent/orchestrator/runtime-core/provider-request-snapshot.mjs +7 -3
  147. package/src/runtime/agent/orchestrator/runtime-core/session-title.mjs +21 -1
  148. package/src/runtime/agent/orchestrator/runtime-core/skill-tool-loading.mjs +14 -3
  149. package/src/runtime/agent/orchestrator/runtime-core/tool-bridge.mjs +526 -0
  150. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-data.mjs +3 -0
  151. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-schema.mjs +10 -7
  152. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +176 -71
  153. package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +62 -10
  154. package/src/runtime/agent/orchestrator/runtime-core/tool-exposure.mjs +96 -0
  155. package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +3 -1
  156. package/src/runtime/agent/orchestrator/session/compact/constants.mjs +3 -2
  157. package/src/runtime/agent/orchestrator/session/compact/messages.mjs +14 -93
  158. package/src/runtime/agent/orchestrator/session/compact/summary-anchor.mjs +5 -0
  159. package/src/runtime/agent/orchestrator/session/compact/user-message-kind.mjs +120 -0
  160. package/src/runtime/agent/orchestrator/session/context-tool-schema.mjs +17 -2
  161. package/src/runtime/agent/orchestrator/session/context-utils.mjs +8 -4
  162. package/src/runtime/agent/orchestrator/session/eager-dispatch/admission.mjs +2 -1
  163. package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +6 -1
  164. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +91 -1
  165. package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +1 -1
  166. package/src/runtime/agent/orchestrator/session/loop/context-overflow.mjs +56 -0
  167. package/src/runtime/agent/orchestrator/session/loop/deferred-call-through.mjs +18 -8
  168. package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +1 -0
  169. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +21 -10
  170. package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +132 -0
  171. package/src/runtime/agent/orchestrator/session/loop/request-boundary.mjs +30 -0
  172. package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +63 -20
  173. package/src/runtime/agent/orchestrator/session/loop/step-auto-effort.mjs +2 -1
  174. package/src/runtime/agent/orchestrator/session/loop/tool-call-resolution.mjs +95 -0
  175. package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +30 -3
  176. package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +15 -4
  177. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +15 -1
  178. package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +150 -0
  179. package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +4 -1
  180. package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +2 -1
  181. package/src/runtime/agent/orchestrator/session/manager/ask-turn-commit.mjs +34 -12
  182. package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +16 -0
  183. package/src/runtime/agent/orchestrator/session/manager/ask-turn-loop-options.mjs +57 -25
  184. package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +6 -0
  185. package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +4 -0
  186. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +8 -0
  187. package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +208 -14
  188. package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +15 -3
  189. package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +25 -3
  190. package/src/runtime/agent/orchestrator/session/manager/session-fallback-title.mjs +82 -0
  191. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +19 -2
  192. package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +3 -0
  193. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +4 -1
  194. package/src/runtime/agent/orchestrator/session/manager.mjs +2 -1
  195. package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +6 -0
  196. package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +13 -0
  197. package/src/runtime/agent/orchestrator/session/side-question-store.mjs +96 -0
  198. package/src/runtime/agent/orchestrator/session/side-question.mjs +192 -0
  199. package/src/runtime/agent/orchestrator/session/store/lifecycle-barriers.mjs +17 -3
  200. package/src/runtime/agent/orchestrator/session/store/live-state.mjs +23 -0
  201. package/src/runtime/agent/orchestrator/session/store/paths-heartbeat.mjs +58 -2
  202. package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +41 -28
  203. package/src/runtime/agent/orchestrator/session/store/session-observers.mjs +4 -2
  204. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-finish.mjs +12 -1
  205. package/src/runtime/agent/orchestrator/session/store/write-admission.mjs +3 -1
  206. package/src/runtime/agent/orchestrator/session/store-summary-archived-agent.mjs +34 -15
  207. package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +4 -0
  208. package/src/runtime/agent/orchestrator/session/store-summary-fields.mjs +8 -0
  209. package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +10 -1
  210. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +10 -2
  211. package/src/runtime/agent/orchestrator/session/store.mjs +19 -3
  212. package/src/runtime/agent/orchestrator/session/tool-batch/execute-call.mjs +1 -0
  213. package/src/runtime/agent/orchestrator/session/tool-batch/finalize.mjs +1 -1
  214. package/src/runtime/agent/orchestrator/session/tool-batch/record-outcome.mjs +1 -1
  215. package/src/runtime/agent/orchestrator/session/tool-batch/state.mjs +7 -1
  216. package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +4 -0
  217. package/src/runtime/agent/orchestrator/session/tool-schema-rejection.mjs +77 -0
  218. package/src/runtime/agent/orchestrator/tools/bash-policy-scan.mjs +8 -2
  219. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/command-preflight.mjs +3 -3
  220. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +4 -1
  221. package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +14 -10
  222. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +49 -34
  223. package/src/runtime/agent/orchestrator/tools/builtin/runtime-capabilities.mjs +23 -1
  224. package/src/runtime/agent/orchestrator/tools/code-graph/dispatch/root-resolution.mjs +1 -1
  225. package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +1 -1
  226. package/src/runtime/agent/orchestrator/tools/patch/ui-diff.mjs +73 -39
  227. package/src/runtime/agent/orchestrator/tools/progress-message.mjs +18 -1
  228. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +7 -4
  229. package/src/runtime/agent/orchestrator/tools/shell-exec-policy.mjs +88 -12
  230. package/src/runtime/agent/orchestrator/tools/shell-policy.mjs +2 -0
  231. package/src/runtime/computer-bridge/action-schema.mjs +44 -21
  232. package/src/runtime/github/tool.mjs +92 -2
  233. package/src/runtime/memory/index.mjs +1 -0
  234. package/src/runtime/memory/lib/http-router/ingest-routes.mjs +22 -1
  235. package/src/runtime/memory/lib/ingest/transcript-offsets.mjs +2 -0
  236. package/src/runtime/memory/lib/pg/adapter.mjs +98 -1
  237. package/src/runtime/memory/lib/pg/process.mjs +31 -26
  238. package/src/runtime/memory/lib/pg/run-child.mjs +49 -0
  239. package/src/runtime/memory/lib/pg/supervisor.mjs +108 -3
  240. package/src/runtime/memory/lib/runtime-fetcher.mjs +12 -13
  241. package/src/runtime/memory/lib/transcript-ingest.mjs +14 -0
  242. package/src/runtime/office/README.md +1 -1
  243. package/src/runtime/office/authoring/html-document-author.mjs +2 -0
  244. package/src/runtime/office/authoring/pptx-contact-sheet.mjs +2 -0
  245. package/src/runtime/office/authoring/pptx-html-measure.mjs +2 -0
  246. package/src/runtime/office/authoring/pptx-html-runner.mjs +2 -0
  247. package/src/runtime/office/authoring/xlsx-html-runner.mjs +2 -0
  248. package/src/runtime/office/core/office-actions-read.mjs +3 -0
  249. package/src/runtime/office/core/office-render-preview.mjs +2 -0
  250. package/src/runtime/office/core/office-session-dispatch.mjs +7 -0
  251. package/src/runtime/office/core/office-sessionless-actions.mjs +8 -0
  252. package/src/runtime/office/core/office-sessions.mjs +5 -0
  253. package/src/runtime/office/core/office-transactions.mjs +3 -0
  254. package/src/runtime/office/core/office-write-ledger.mjs +98 -0
  255. package/src/runtime/office/design/library/templates/mixdog-executive.mixdog-edit.pptx +0 -0
  256. package/src/runtime/office/index.mjs +30 -0
  257. package/src/runtime/office/pdf/pdf-edit-document.mjs +2 -0
  258. package/src/runtime/office/pdf/pdf-render.mjs +23 -7
  259. package/src/runtime/office/pdf/pdf-security.mjs +2 -0
  260. package/src/runtime/office/portable/portable-opc.mjs +4 -1
  261. package/src/runtime/office/quality/visual-diff.mjs +2 -0
  262. package/src/runtime/shared/bounded-file-read.mjs +13 -0
  263. package/src/runtime/shared/bounded-line-diff.mjs +182 -0
  264. package/src/runtime/shared/buffered-appender.mjs +18 -0
  265. package/src/runtime/shared/config.mjs +78 -18
  266. package/src/runtime/shared/err-text.mjs +6 -0
  267. package/src/runtime/shared/file-permissions.d.mts +6 -1
  268. package/src/runtime/shared/file-permissions.mjs +54 -6
  269. package/src/runtime/shared/llm/anthropic-effort.mjs +6 -0
  270. package/src/runtime/shared/llm/usage-accounting.mjs +5 -2
  271. package/src/runtime/shared/llm/usage-ledger-rollup.mjs +3 -0
  272. package/src/runtime/shared/loopback-listener.mjs +9 -0
  273. package/src/runtime/shared/provider-api-key.mjs +2 -0
  274. package/src/runtime/shared/review-diff.mjs +52 -0
  275. package/src/runtime/shared/session-sidebar-host.d.mts +4 -0
  276. package/src/runtime/shared/session-sidebar-host.mjs +38 -0
  277. package/src/runtime/shared/slow-span.mjs +114 -0
  278. package/src/runtime/shared/statusline/statusline-segments.mjs +28 -4
  279. package/src/runtime/shared/tool-card-model/card-header.mjs +6 -1
  280. package/src/runtime/shared/tool-card-model/generic-detail.mjs +39 -5
  281. package/src/runtime/shared/tool-card-model.mjs +5 -2
  282. package/src/runtime/shared/tool-output-limit.mjs +4 -0
  283. package/src/runtime/shared/tool-primitives.mjs +13 -0
  284. package/src/runtime/shared/tool-result-summary.mjs +8 -1
  285. package/src/runtime/shared/tool-surface.mjs +18 -3
  286. package/src/runtime/shared/tool-work-units.mjs +40 -4
  287. package/src/runtime/shared/transcript-writer/purge.mjs +74 -0
  288. package/src/runtime/shared/transcript-writer.mjs +10 -2
  289. package/src/runtime/shared/turn-changes.mjs +268 -100
  290. package/src/runtime/shared/turn-review-reply.mjs +8 -39
  291. package/src/runtime/shared/turn-snapshot-store.mjs +19 -108
  292. package/src/runtime/shared/turn-snapshot.mjs +857 -683
  293. package/src/runtime/shared/turn-worktree-snapshot.mjs +183 -255
  294. package/src/runtime/shared/user-data-guard.mjs +262 -49
  295. package/src/runtime/shared/worktrees/carry.mjs +531 -0
  296. package/src/runtime/shared/worktrees/contract.mjs +34 -0
  297. package/src/runtime/shared/worktrees/file-recovery.mjs +68 -0
  298. package/src/runtime/shared/worktrees/git-head.mjs +205 -0
  299. package/src/runtime/shared/worktrees/git.mjs +8 -3
  300. package/src/runtime/shared/worktrees/maintenance.mjs +1 -1
  301. package/src/runtime/shared/worktrees/manager.mjs +156 -8
  302. package/src/runtime/shared/worktrees/merge.mjs +31 -21
  303. package/src/runtime/shared/worktrees/paths.d.mts +6 -0
  304. package/src/runtime/terminal-bridge/client.mjs +44 -11
  305. package/src/runtime/terminal-bridge/tool-defs.mjs +13 -6
  306. package/src/runtime/tidy/apply.mjs +47 -2
  307. package/src/runtime/tidy/run-engines.mjs +11 -5
  308. package/src/session-runtime/agent-tool-routing.mjs +19 -13
  309. package/src/session-runtime/boot/apis.mjs +13 -5
  310. package/src/session-runtime/boot/facade.mjs +1 -0
  311. package/src/session-runtime/boot/infrastructure.mjs +6 -1
  312. package/src/session-runtime/boot/session.mjs +0 -1
  313. package/src/session-runtime/boot/tools.mjs +4 -1
  314. package/src/session-runtime/cwd-plugins/cwd-apply.mjs +12 -5
  315. package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +65 -0
  316. package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +3 -1
  317. package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +11 -4
  318. package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +115 -18
  319. package/src/session-runtime/internal-tool-executor.mjs +6 -2
  320. package/src/session-runtime/lifecycle/cold-heir.mjs +188 -0
  321. package/src/session-runtime/lifecycle/inheritance.mjs +71 -27
  322. package/src/session-runtime/lifecycle/session-catalog.mjs +12 -3
  323. package/src/session-runtime/lifecycle/session-switch/resume.mjs +6 -0
  324. package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +29 -6
  325. package/src/session-runtime/lifecycle/teardown.mjs +72 -7
  326. package/src/session-runtime/lifecycle-api.mjs +1 -0
  327. package/src/session-runtime/mcp-glue/connect.mjs +17 -5
  328. package/src/session-runtime/model-route/set-route.mjs +2 -2
  329. package/src/session-runtime/native-web-search-usage.mjs +51 -0
  330. package/src/session-runtime/native-web-search.mjs +10 -1
  331. package/src/session-runtime/new-session-config.mjs +4 -2
  332. package/src/session-runtime/provider-auth/login.mjs +4 -0
  333. package/src/session-runtime/resource-scope-decorate.mjs +10 -3
  334. package/src/session-runtime/runtime-review-api.mjs +8 -2
  335. package/src/session-runtime/services/agent-tool/index-write-queue.mjs +81 -20
  336. package/src/session-runtime/services/agent-tool/lead-worker-index/forgotten-leads.mjs +29 -0
  337. package/src/session-runtime/services/agent-tool/lead-worker-index/index-file.mjs +1 -1
  338. package/src/session-runtime/services/agent-tool/lead-worker-index.mjs +73 -7
  339. package/src/session-runtime/services/agent-tool/tag-registry.mjs +15 -1
  340. package/src/session-runtime/services/agent-tool/worker-index/row-store.mjs +10 -1
  341. package/src/session-runtime/services/agent-tool/worker-index.mjs +46 -7
  342. package/src/session-runtime/services/agent-tool.mjs +3 -0
  343. package/src/session-runtime/services/channel-admin.mjs +19 -3
  344. package/src/session-runtime/services/memory-runtime-proxy/calls.mjs +4 -0
  345. package/src/session-runtime/services/memory-runtime-proxy.mjs +1 -0
  346. package/src/session-runtime/services/provider-admin.mjs +81 -15
  347. package/src/session-runtime/session-transcript-purge.mjs +32 -0
  348. package/src/session-runtime/session-turn-api.mjs +14 -5
  349. package/src/session-runtime/settings-builtin-tools-api.mjs +9 -0
  350. package/src/session-runtime/setup-tool/executor.mjs +36 -6
  351. package/src/session-runtime/setup-tool/extended-actions.mjs +86 -6
  352. package/src/session-runtime/setup-tool/settings-contract.mjs +13 -3
  353. package/src/session-runtime/setup-tool/tool-defs.mjs +13 -4
  354. package/src/session-runtime/skills-api.mjs +3 -5
  355. package/src/session-runtime/tool-surface.mjs +5 -1
  356. package/src/session-runtime/turn/compaction-gate.mjs +25 -0
  357. package/src/session-runtime/turn/session-ops.mjs +7 -5
  358. package/src/session-runtime/turn/side-question-ops.mjs +22 -0
  359. package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +5 -1
  360. package/src/session-runtime/turn/turn-run/turn-prepare.mjs +8 -3
  361. package/src/session-runtime/turn/turn-run/turn-settle.mjs +10 -0
  362. package/src/session-runtime/turn/turn-run/turn-timing.mjs +4 -3
  363. package/src/session-runtime/turn/turn-run.mjs +25 -9
  364. package/src/session-runtime/usage-stats-api.mjs +43 -11
  365. package/src/session-runtime/workspace/project-branches.mjs +7 -5
  366. package/src/session-runtime/workspace/transition-steps.mjs +129 -31
  367. package/src/session-runtime/workspace/transitions.mjs +190 -15
  368. package/src/standalone/daemon-agent-control.mjs +9 -1
  369. package/src/standalone/daemon-local-session-bridge.mjs +14 -1
  370. package/src/standalone/daemon-owner.mjs +17 -4
  371. package/src/standalone/daemon-pg-stop.mjs +51 -0
  372. package/src/standalone/daemon-stop-budget.d.mts +2 -0
  373. package/src/standalone/daemon-stop-budget.mjs +18 -0
  374. package/src/standalone/daemon-stored-session-views.mjs +2 -0
  375. package/src/standalone/daemon-telemetry.mjs +19 -0
  376. package/src/standalone/daemon.mjs +61 -1
  377. package/src/standalone/desktop-service-registry.mjs +5 -0
  378. package/src/standalone/local-session-runtime.mjs +70 -19
  379. package/src/standalone/session-client.mjs +42 -0
  380. package/src/standalone/session-protocol.mjs +7 -0
  381. package/src/standalone/session-proxy/projection.mjs +41 -4
  382. package/src/standalone/session-runtime-inline-host/boot-loaders.mjs +15 -1
  383. package/src/standalone/session-runtime-inline-host.mjs +1 -0
  384. package/src/standalone/session-service/session-calls/session-action.mjs +18 -3
  385. package/src/standalone/session-service-api.mjs +6 -1
  386. package/src/standalone/session-state-patch.d.mts +2 -1
  387. package/src/standalone/session-state-patch.mjs +41 -1
  388. package/src/tui/App.jsx +25 -0
  389. package/src/tui/app/app-view/floating-panel.jsx +26 -1
  390. package/src/tui/app/btw-controller.mjs +118 -0
  391. package/src/tui/app/create-app-pickers.mjs +2 -0
  392. package/src/tui/app/shell-layout/row-budgets.mjs +11 -1
  393. package/src/tui/app/shell-layout/surfaces.mjs +3 -1
  394. package/src/tui/app/slash-commands.mjs +13 -3
  395. package/src/tui/app/slash-dispatch/session-commands.mjs +19 -6
  396. package/src/tui/app/use-global-key-input/approval-shortcut.mjs +12 -0
  397. package/src/tui/app/use-global-key-input.mjs +5 -12
  398. package/src/tui/app/use-prompt-handlers.mjs +11 -0
  399. package/src/tui/components/BtwPanel.jsx +53 -0
  400. package/src/tui/components/QuestionPanel.jsx +275 -0
  401. package/src/tui/components/question-panel-model.mjs +156 -0
  402. package/src/tui/dist/index.mjs +2413 -1465
  403. package/src/tui/session/context-state.mjs +4 -2
  404. package/src/tui/session/session-api/commands.mjs +10 -0
  405. package/src/tui/session/session-api/controls.mjs +2 -2
  406. package/src/tui/session/session-api/integrations.mjs +9 -2
  407. package/src/tui/session/session-api/lifecycle/dispose.mjs +1 -0
  408. package/src/tui/session/session-api/lifecycle.mjs +2 -1
  409. package/src/tui/session/session-api/settings.mjs +6 -0
  410. package/src/tui/session/session-api.mjs +1 -0
  411. package/src/tui/session/tool-approval.mjs +10 -7
  412. package/src/tui/session/transcript-spill.mjs +14 -7
  413. package/src/tui/session/turn-stream.mjs +174 -31
  414. package/src/tui/session/turn.mjs +12 -5
  415. package/src/workflows/default/WORKFLOW.md +3 -1
@@ -1,5 +1,5 @@
1
1
  import { providerNativeToolPrefixCount } from '../../runtime-core/provider-request-tools.mjs';
2
- import { actionInputContract } from './action-input-contract.mjs';
2
+ import { actionInputContract, actionInputUnionFor } from './action-input-contract.mjs';
3
3
  import { isNativeServerToolBlockType } from './anthropic-native-blocks.mjs';
4
4
  import { isAnthropicThinkingBlock, sanitizeAnthropicReplayBlocks } from './anthropic-replay-blocks.mjs';
5
5
  import { sanitizeAnthropicContentPairs, foldUserTextIntoToolResultTail } from '../../session/context-utils.mjs';
@@ -7,24 +7,76 @@ import { normalizeContentForAnthropic } from '../media-normalization.mjs';
7
7
  import { createProviderReplay, providerReplayItems } from './provider-replay.mjs';
8
8
  import { anthropicFallbackProviderMetadata, parseAnthropicFallbackBlock } from '../anthropic-server-fallback.mjs';
9
9
  import { mergeFlatSchemaProperty } from './flat-schema-merge.mjs';
10
+ import { reportedCostUsd } from './usage-primitives.mjs';
11
+ import { reportInvalidTool, wireInputSchema } from './claude-bridge-schema.mjs';
12
+ import { normalizeServerToolUse } from './anthropic-server-tool-usage.mjs';
10
13
  export const ANTHROPIC_CACHE_TTL_STABLE = { type: 'ephemeral', ttl: '1h' };
11
14
  const ANTHROPIC_CACHE_TTL_VOLATILE = { type: 'ephemeral' };
12
15
 
13
- function appendAnthropicCacheControl(content, ttl = ANTHROPIC_CACHE_TTL_VOLATILE) {
14
- const withCacheControl = (block) => {
15
- if (!block || typeof block !== 'object' || block.cache_control) return block;
16
- return { ...block, cache_control: ttl };
17
- };
18
- if (Array.isArray(content)) {
19
- if (content.length === 0) return content;
20
- const next = [...content];
21
- next[next.length - 1] = withCacheControl(next[next.length - 1]);
22
- return next;
16
+ // Anthropic allows at most 4 cache_control breakpoints across the whole
17
+ // serialized request (tools + system + messages).
18
+ export const ANTHROPIC_MAX_CACHE_BREAKPOINTS = 4;
19
+
20
+ // A block can carry a breakpoint unless it is thinking/redacted_thinking or an
21
+ // empty text block (both are rejected by the API).
22
+ function isCacheEligibleBlock(block) {
23
+ if (!block || typeof block !== 'object') return false;
24
+ if (block.type === 'thinking' || block.type === 'redacted_thinking') return false;
25
+ if (block.type === 'text') return typeof block.text === 'string' && block.text.trim() !== '';
26
+ return true;
27
+ }
28
+
29
+ function lastEligibleBlockIndex(content) {
30
+ if (typeof content === 'string') return content.trim() ? 0 : -1;
31
+ if (!Array.isArray(content)) return -1;
32
+ for (let i = content.length - 1; i >= 0; i--) if (isCacheEligibleBlock(content[i])) return i;
33
+ return -1;
34
+ }
35
+
36
+ /** Count cache_control markers on a block / block list (incl. tool_result content). */
37
+ export function countAnthropicCacheControls(value) {
38
+ if (Array.isArray(value)) return value.reduce((sum, item) => sum + countAnthropicCacheControls(item), 0);
39
+ if (!value || typeof value !== 'object') return 0;
40
+ return (value.cache_control ? 1 : 0) + (Array.isArray(value.content) ? countAnthropicCacheControls(value.content) : 0);
41
+ }
42
+
43
+ function stripCacheControl(block, budget) {
44
+ if (!block || typeof block !== 'object' || budget.n <= 0) return block;
45
+ let next = block;
46
+ if (block.cache_control) {
47
+ budget.n--;
48
+ const { cache_control: _dropped, ...rest } = block;
49
+ next = rest;
50
+ }
51
+ if (Array.isArray(next.content) && budget.n > 0) {
52
+ const content = next.content.map((child) => stripCacheControl(child, budget));
53
+ if (content.some((child, i) => child !== next.content[i])) next = { ...next, content };
54
+ }
55
+ return next;
56
+ }
57
+
58
+ // Drop the `excess` oldest message markers (the newest breakpoints are the
59
+ // valuable ones: they cover the longest prefix).
60
+ function stripOldestMessageCacheControls(messages, excess) {
61
+ const budget = { n: excess };
62
+ for (const message of messages) {
63
+ if (budget.n <= 0) break;
64
+ if (!Array.isArray(message?.content)) continue;
65
+ const content = message.content.map((block) => stripCacheControl(block, budget));
66
+ if (content.some((block, i) => block !== message.content[i])) message.content = content;
23
67
  }
68
+ }
69
+
70
+ function appendAnthropicCacheControl(content, ttl = ANTHROPIC_CACHE_TTL_VOLATILE, blockIndex = null) {
71
+ const index = blockIndex ?? lastEligibleBlockIndex(content);
24
72
  if (typeof content === 'string') {
25
- return [withCacheControl({ type: 'text', text: content })];
73
+ return index < 0 ? content : [{ type: 'text', text: content, cache_control: ttl }];
26
74
  }
27
- return content;
75
+ if (!Array.isArray(content) || index < 0 || !isCacheEligibleBlock(content[index])) return content;
76
+ if (content[index].cache_control) return content;
77
+ const next = [...content];
78
+ next[index] = { ...content[index], cache_control: ttl };
79
+ return next;
28
80
  }
29
81
 
30
82
  export function resolveAnthropicCacheTtls(opts) {
@@ -64,15 +116,41 @@ export function resolveAnthropicCacheTtls(opts) {
64
116
  // live tail on every request. ANTHROPIC_MSG_SLOTS=0 disables message caching;
65
117
  // any positive value enables that one marker when the system layout leaves a
66
118
  // slot. messageTtl === null turns the tail off.
67
- export function resolveAnthropicMessageCacheSlots(systemBlocks, ttls) {
68
- const usedSlots = systemBlocks.filter((b) => b.cache_control).length;
119
+ //
120
+ // The 4-breakpoint limit is request-wide: `tools` (native-tool markers) count
121
+ // next to the system blocks as reserved slots; markers already preserved in
122
+ // message content are enforced by applyAnthropicCacheMarkers via
123
+ // `reservedSlots`.
124
+ export function resolveAnthropicMessageCacheSlots(systemBlocks, ttls, { tools = [] } = {}) {
125
+ // Tool markers take their slots first; system markers beyond the remainder
126
+ // are dropped earliest-first (the last system marker covers the longest
127
+ // prefix). The freshly built system blocks are edited in place.
128
+ // Tool markers alone are capped first: beyond the request-wide limit the
129
+ // earliest are dropped (the last covers the longest tool prefix). Tool
130
+ // objects may be shared with the caller, so the array slot is replaced by a
131
+ // marker-free copy instead of mutating the object.
132
+ let toolExcess = countAnthropicCacheControls(tools) - ANTHROPIC_MAX_CACHE_BREAKPOINTS;
133
+ for (let i = 0; toolExcess > 0 && i < tools.length; i++) {
134
+ if (!tools[i]?.cache_control) continue;
135
+ const { cache_control: _dropped, ...rest } = tools[i];
136
+ tools[i] = rest;
137
+ toolExcess--;
138
+ }
139
+ const toolSlots = countAnthropicCacheControls(tools);
140
+ let systemExcess = countAnthropicCacheControls(systemBlocks) + toolSlots - ANTHROPIC_MAX_CACHE_BREAKPOINTS;
141
+ for (const block of systemBlocks) {
142
+ if (systemExcess <= 0) break;
143
+ if (block?.cache_control) {
144
+ delete block.cache_control;
145
+ systemExcess--;
146
+ }
147
+ }
148
+ const reservedSlots = countAnthropicCacheControls(systemBlocks) + toolSlots;
69
149
  const slotsCap = Number.parseInt(process.env.ANTHROPIC_MSG_SLOTS, 10);
70
- const hasFreeSlot = usedSlots < 4;
150
+ const hasFreeSlot = reservedSlots < ANTHROPIC_MAX_CACHE_BREAKPOINTS;
71
151
  const capAllowsMessage = Number.isFinite(slotsCap) && slotsCap >= 0 ? slotsCap > 0 : true;
72
152
  const messageSlots = ttls.messages && hasFreeSlot && capAllowsMessage ? 1 : 0;
73
- // Key order matches the object both call sites built inline: messageTtl
74
- // first, then messageSlots.
75
- return { messageTtl: messageSlots > 0 ? ttls.messages : null, messageSlots };
153
+ return { messageTtl: messageSlots > 0 ? ttls.messages : null, messageSlots, reservedSlots };
76
154
  }
77
155
 
78
156
  // Single lowering of orchestrator messages to the Anthropic wire shape. The
@@ -150,7 +228,10 @@ function splitErrorToolResultContent(content) {
150
228
  // Native tool_search providers whose stored references this lowering replays.
151
229
  const ANTHROPIC_NATIVE_PROVIDERS = new Set(['anthropic', 'anthropic-oauth']);
152
230
 
153
- export function toAnthropicMessages(messages, availableTools) {
231
+ // `provider`: the engine's provider name. A gateway on a native Messages
232
+ // route (wire-route.mjs) also replays the references it tagged itself.
233
+ export function toAnthropicMessages(messages, availableTools, provider = '') {
234
+ const ownProvider = String(provider || '').toLowerCase();
154
235
  const availableNames = anthropicToolNameSet(availableTools);
155
236
  const result = [];
156
237
  for (let idx = 0; idx < messages.length; idx++) {
@@ -195,7 +276,8 @@ export function toAnthropicMessages(messages, availableTools) {
195
276
  const native = m.nativeToolSearch;
196
277
  const nativeProvider = String(native?.provider || '').toLowerCase();
197
278
  const references =
198
- (!nativeProvider || ANTHROPIC_NATIVE_PROVIDERS.has(nativeProvider)) && Array.isArray(native?.toolReferences)
279
+ (!nativeProvider || ANTHROPIC_NATIVE_PROVIDERS.has(nativeProvider) || nativeProvider === ownProvider) &&
280
+ Array.isArray(native?.toolReferences)
199
281
  ? native.toolReferences.map((name) => String(name || '').trim()).filter(Boolean)
200
282
  : [];
201
283
  // Keep only references this request can actually back with a
@@ -305,11 +387,15 @@ export function normalizeAnthropicNonStreamingResponse(message, fallbackModel =
305
387
  const input = Number(usage.input_tokens) || 0;
306
388
  const cacheRead = Number(usage.cache_read_input_tokens) || 0;
307
389
  const cacheWrite = Number(usage.cache_creation_input_tokens) || 0;
390
+ const costUsd = reportedCostUsd(usage.cost);
391
+ const serverToolUse = normalizeServerToolUse(usage);
308
392
  return {
309
393
  content: text,
310
394
  model: fallbackEvents.at(-1)?.fallbackModel || message?.model || fallbackModel,
311
395
  toolCalls: toolCalls.length ? toolCalls : undefined,
312
396
  stopReason: message?.stop_reason || null,
397
+ ...(message?.stop_details != null ? { stopDetails: message.stop_details } : {}),
398
+ ...(message?.stop_sequence != null ? { stopSequence: message.stop_sequence } : {}),
313
399
  hasThinkingContent: modelEmittedThinking,
314
400
  contentBlockTypes: blocks.map((block) => block?.type).filter(Boolean),
315
401
  thinkingBlocks: thinkingBlocks.length ? thinkingBlocks : undefined,
@@ -325,6 +411,8 @@ export function normalizeAnthropicNonStreamingResponse(message, fallbackModel =
325
411
  ? { cacheWrite1hTokens: Number(usage.cache_creation.ephemeral_1h_input_tokens) }
326
412
  : {}),
327
413
  promptTokens: input + cacheRead + cacheWrite,
414
+ ...(costUsd !== undefined ? { costUsd } : {}),
415
+ ...(serverToolUse ? { serverToolUse } : {}),
328
416
  raw: usage,
329
417
  },
330
418
  };
@@ -399,16 +487,42 @@ export function sanitizeAnthropicInputSchema(schema, toolName, logTag) {
399
487
  };
400
488
  }
401
489
 
402
- function toAnthropicTools(tools, logTag) {
403
- return tools.map((tool) => {
404
- const out = {
405
- name: tool.name,
406
- description: tool.description,
407
- input_schema: sanitizeAnthropicInputSchema(tool.inputSchema, tool.name, logTag),
408
- };
409
- if (tool.deferLoading === true || tool.defer_loading === true) out.defer_loading = true;
410
- return out;
490
+ // The Messages `input_schema` of a tool: the flattened schema, lowered to
491
+ // 2020-12 with an object root when it is not valid as written ({ schema }), or
492
+ // { pointer, reason } when it is broken even then.
493
+ function anthropicInputSchema(tool, logTag) {
494
+ // First-party Anthropic accepts nested per-action input alternatives;
495
+ // gateways on the same wire keep the advertised flat schema.
496
+ const flattened = sanitizeAnthropicInputSchema(
497
+ ANTHROPIC_NATIVE_PROVIDERS.has(logTag) ? actionInputUnionFor(tool.inputSchema) : tool.inputSchema,
498
+ tool.name,
499
+ logTag
500
+ );
501
+ return wireInputSchema(flattened, 'anthropic');
502
+ }
503
+
504
+ /** The `{ name, pointer, reason }` for which the Messages wire leaves `tool`
505
+ * out of a request, or null when it is sent. Reports nothing. */
506
+ export function anthropicToolExclusion(tool, logTag = 'anthropic') {
507
+ const result = anthropicInputSchema(tool, logTag);
508
+ return result.schema ? null : { name: tool.name, pointer: result.pointer || '/', reason: result.reason };
509
+ }
510
+
511
+ // A Messages endpoint rejects the whole request for one invalid input_schema,
512
+ // so a tool broken even after lowering is reported and left out.
513
+ function toAnthropicTools(tools, logTag, onToolExcluded) {
514
+ const out = [];
515
+ tools.forEach((tool, index) => {
516
+ const result = anthropicInputSchema(tool, logTag);
517
+ if (!result.schema) {
518
+ reportInvalidTool(tool.name, index, result, onToolExcluded, `[${logTag}] tool`);
519
+ return;
520
+ }
521
+ const entry = { name: tool.name, description: tool.description, input_schema: result.schema };
522
+ if (tool.deferLoading === true || tool.defer_loading === true) entry.defer_loading = true;
523
+ out.push(entry);
411
524
  });
525
+ return out;
412
526
  }
413
527
 
414
528
  // Map the orchestrator-level opts.toolChoice into Anthropic's tool_choice.
@@ -423,8 +537,43 @@ function toAnthropicTools(tools, logTag) {
423
537
  // effort/thinking active on reasoning models — activating it would convert a
424
538
  // previously-harmless no-op into a hard 400 on exactly that turn. Attached
425
539
  // only when the request actually carries tools.
426
- export function toAnthropicToolChoice(toolChoice) {
427
- return toolChoice === 'none' ? { type: 'none' } : undefined;
540
+ //
541
+ // Mapping: 'auto'→auto, 'required'/'any'→any, {name}|{type:'tool',name}→tool,
542
+ // 'none'→none. Forced any/tool is rejected by the API while extended/adaptive
543
+ // thinking is on: with `thinking` set it falls back to auto (default) or throws
544
+ // (`onThinkingConflict: 'error'`). `disableParallelToolUse` adds
545
+ // disable_parallel_tool_use (not valid with none) unless the endpoint declares
546
+ // `supportsDisableParallelToolUse: false` (gateway capability).
547
+ export function toAnthropicToolChoice(
548
+ toolChoice,
549
+ { thinking = false, disableParallelToolUse = false, supportsDisableParallelToolUse = true, onThinkingConflict = 'fallback' } = {}
550
+ ) {
551
+ let choice;
552
+ if (toolChoice === 'none') choice = { type: 'none' };
553
+ else if (toolChoice === 'auto') choice = { type: 'auto' };
554
+ else if (toolChoice === 'required' || toolChoice === 'any') choice = { type: 'any' };
555
+ else if (toolChoice && typeof toolChoice === 'object') {
556
+ const name = typeof toolChoice.name === 'string' ? toolChoice.name : toolChoice.function?.name;
557
+ if (toolChoice.type === 'none') choice = { type: 'none' };
558
+ else if (toolChoice.type === 'auto') choice = { type: 'auto' };
559
+ else if (toolChoice.type === 'any') choice = { type: 'any' };
560
+ else if (typeof name === 'string' && name) choice = { type: 'tool', name };
561
+ }
562
+ if (choice && (choice.type === 'any' || choice.type === 'tool') && thinking) {
563
+ if (onThinkingConflict === 'error') {
564
+ throw new Error(`Anthropic tool_choice "${choice.type}" is not allowed while extended thinking is enabled`);
565
+ }
566
+ choice = undefined;
567
+ }
568
+ if (disableParallelToolUse === true && supportsDisableParallelToolUse !== false && choice?.type !== 'none') {
569
+ choice = { ...(choice || { type: 'auto' }), disable_parallel_tool_use: true };
570
+ }
571
+ return choice;
572
+ }
573
+
574
+ /** True when the request body enables extended/adaptive thinking. */
575
+ export function anthropicThinkingActive(body) {
576
+ return body?.thinking?.type === 'enabled' || body?.thinking?.type === 'adaptive';
428
577
  }
429
578
 
430
579
  export function deferredAnthropicTools(activeTools, messages, opts, provider) {
@@ -470,14 +619,14 @@ export function requestAnthropicTools(tools, messages, opts, provider) {
470
619
  const nativePrefixCount = providerNativeToolPrefixCount(activeTools, opts.providerNativeToolPrefixCount);
471
620
  return [
472
621
  ...activeTools.slice(0, nativePrefixCount),
473
- ...toAnthropicTools(activeTools.slice(nativePrefixCount), provider),
622
+ ...toAnthropicTools(activeTools.slice(nativePrefixCount), provider, opts.onToolExcluded),
474
623
  ];
475
624
  }
476
625
  const deferredTools = deferredAnthropicTools(activeTools, messages, opts, provider);
477
626
  const nativeTools = Array.isArray(opts?.nativeTools)
478
627
  ? opts.nativeTools.filter((tool) => tool && typeof tool === 'object')
479
628
  : [];
480
- return [...nativeTools, ...toAnthropicTools([...activeTools, ...deferredTools], provider)];
629
+ return [...nativeTools, ...toAnthropicTools([...activeTools, ...deferredTools], provider, opts?.onToolExcluded)];
481
630
  }
482
631
 
483
632
  // Applies cache_control markers to the FINAL, already-sanitized Anthropic
@@ -493,20 +642,75 @@ export function requestAnthropicTools(tools, messages, opts, provider) {
493
642
  // messageTtl === null disables the tail. BP3 (tier3) rides a system block,
494
643
  // so it is not marked here. ANTHROPIC_MSG_SLOTS=0 is honoured upstream by
495
644
  // passing messageTtl = null.
645
+ // `sharedPrefix` (see sharedCachePrefixBoundary) moves the breakpoint off the
646
+ // tail onto a shared prefix's last block, or drops it (`false`).
496
647
  export function applyAnthropicCacheMarkers(
497
648
  sanitizedMessages,
498
- { messageTtl = ANTHROPIC_CACHE_TTL_VOLATILE, messageSlots = 1 } = {}
649
+ { messageTtl = ANTHROPIC_CACHE_TTL_VOLATILE, messageSlots = 1, reservedSlots = 0 } = {},
650
+ sharedPrefix = null
499
651
  ) {
500
652
  if (!Array.isArray(sanitizedMessages) || sanitizedMessages.length === 0) {
501
653
  return sanitizedMessages;
502
654
  }
503
- if (messageTtl !== null && Number(messageSlots) > 0) {
504
- // A trailing effort control (empty system message) has no block to mark;
505
- // the breakpoint goes on the message before it.
506
- let index = sanitizedMessages.length - 1;
507
- while (index > 0 && sanitizedMessages[index].role === 'system' && !sanitizedMessages[index].content?.length) index--;
508
- const message = sanitizedMessages[index];
509
- message.content = appendAnthropicCacheControl(message.content, messageTtl);
655
+ // Request-wide 4-breakpoint limit: slots held by system/tools are reserved;
656
+ // markers preserved inside message content may only use what is left.
657
+ const budget = Math.max(0, ANTHROPIC_MAX_CACHE_BREAKPOINTS - (Number(reservedSlots) || 0));
658
+ const present = countAnthropicCacheControls(sanitizedMessages);
659
+ if (present > budget) stripOldestMessageCacheControls(sanitizedMessages, present - budget);
660
+ const free = budget - Math.min(present, budget);
661
+ if (messageTtl === null || !(Number(messageSlots) > 0) || sharedPrefix === false || free <= 0) {
662
+ return sanitizedMessages;
510
663
  }
664
+ if (sharedPrefix) {
665
+ const message = sanitizedMessages[sharedPrefix.index];
666
+ if (message && contentBlockKey(message.content, sharedPrefix.blockIndex) === sharedPrefix.blockKey) {
667
+ message.content = appendAnthropicCacheControl(message.content, messageTtl, sharedPrefix.blockIndex);
668
+ }
669
+ return sanitizedMessages;
670
+ }
671
+ const index = lastMarkableMessageIndex(sanitizedMessages);
672
+ if (index < 0) return sanitizedMessages;
673
+ const message = sanitizedMessages[index];
674
+ message.content = appendAnthropicCacheControl(message.content, messageTtl);
511
675
  return sanitizedMessages;
512
676
  }
677
+
678
+ // The breakpoint goes on the last message that has an eligible block: a
679
+ // trailing effort control (empty system message) or a thinking-only tail has
680
+ // nothing to mark. -1 when no message does.
681
+ function lastMarkableMessageIndex(messages) {
682
+ for (let index = messages.length - 1; index >= 0; index--) {
683
+ if (lastEligibleBlockIndex(messages[index].content) >= 0) return index;
684
+ }
685
+ return -1;
686
+ }
687
+
688
+ function contentBlockKey(content, blockIndex) {
689
+ const block = Array.isArray(content) ? content[blockIndex] : content;
690
+ return block === undefined ? undefined : JSON.stringify(block);
691
+ }
692
+
693
+ /**
694
+ * Where a cache-sharing fork (a /btw side question) keeps its message
695
+ * breakpoint. The fork re-sends an earlier request's messages unchanged and
696
+ * appends a short suffix; `opts.sharedCachePrefixCount` is the number of
697
+ * leading messages that make up that shared prefix (a plain number, so it
698
+ * survives model-proxy serialization). The breakpoint stays on the block the earlier request
699
+ * marked (the prefix's own lowered tail), so the fork reads that cache entry
700
+ * and writes none for its suffix. `lowerPrefix(messages)` lowers a message
701
+ * list exactly as the request does. Null for an ordinary request (tail
702
+ * breakpoint); false when the prefix is not part of this request.
703
+ */
704
+ export function sharedCachePrefixBoundary(messages, opts, lowerPrefix) {
705
+ const count = opts?.sharedCachePrefixCount;
706
+ if (!count) return null;
707
+ if (!Number.isInteger(count) || count < 0 || count > messages.length) return false;
708
+ const prefix = lowerPrefix(messages.slice(0, count));
709
+ if (!prefix.length) return false;
710
+ const index = lastMarkableMessageIndex(prefix);
711
+ if (index < 0) return false;
712
+ const content = prefix[index].content;
713
+ const blockIndex = lastEligibleBlockIndex(content);
714
+ const blockKey = contentBlockKey(content, blockIndex);
715
+ return blockKey === undefined ? false : { index, blockIndex, blockKey };
716
+ }
@@ -0,0 +1,18 @@
1
+ // Normalized Anthropic server-tool usage counters (`usage.server_tool_use`):
2
+ // the number of server-side web searches / web fetches the turn ran. Returns
3
+ // undefined when the usage reports none, so ordinary turns carry no field.
4
+ const COUNTERS = [
5
+ ['web_search_requests', 'webSearchRequests'],
6
+ ['web_fetch_requests', 'webFetchRequests'],
7
+ ];
8
+
9
+ export function normalizeServerToolUse(raw) {
10
+ const source = raw && typeof raw === 'object' ? raw.server_tool_use : null;
11
+ if (!source || typeof source !== 'object') return undefined;
12
+ const out = {};
13
+ for (const [wire, key] of COUNTERS) {
14
+ const n = Number(source[wire]);
15
+ if (Number.isFinite(n) && n >= 0) out[key] = n;
16
+ }
17
+ return Object.keys(out).length ? out : undefined;
18
+ }
@@ -2,13 +2,34 @@
2
2
  const SYSTEM_CACHE_TIERS = new Set(['tier3', 'env']);
3
3
  const systemCacheTier = (cacheTier) => (SYSTEM_CACHE_TIERS.has(cacheTier) ? cacheTier : 'system');
4
4
 
5
- /** Non-empty system messages as `{ text, tier }` block items; a non-array yields none. */
6
- export function systemBlockItems(systemMsgs) {
7
- const items = [];
8
- for (const m of Array.isArray(systemMsgs) ? systemMsgs : []) {
9
- const text = typeof m?.content === 'string' ? m.content.trim() : '';
10
- if (text) items.push({ text, tier: systemCacheTier(m?.cacheTier) });
5
+ function pushSystemEntry(items, entry, tier) {
6
+ if (entry == null) return;
7
+ if (typeof entry === 'string') {
8
+ const text = entry.trim();
9
+ if (text) items.push({ text, tier });
10
+ return;
11
+ }
12
+ if (Array.isArray(entry)) {
13
+ for (const part of entry) pushSystemEntry(items, part, tier);
14
+ return;
15
+ }
16
+ if (typeof entry === 'object') {
17
+ const entryTier = entry.cacheTier === undefined ? tier : systemCacheTier(entry.cacheTier);
18
+ if (entry.type === 'text' && typeof entry.text === 'string') return pushSystemEntry(items, entry.text, entryTier);
19
+ if (entry.type === undefined && 'content' in entry) return pushSystemEntry(items, entry.content, entryTier);
11
20
  }
21
+ throw new TypeError('Anthropic system instructions must be a string, text blocks, or system messages of those');
22
+ }
23
+
24
+ /**
25
+ * Non-empty system instructions as `{ text, tier }` block items. Accepts a
26
+ * string, a text-block array (`{ type: 'text', text }`), or an array of system
27
+ * messages whose `content` is either. Null/undefined yields none; any other
28
+ * shape throws rather than silently dropping structured instructions.
29
+ */
30
+ export function systemBlockItems(system) {
31
+ const items = [];
32
+ pushSystemEntry(items, system, 'system');
12
33
  return items;
13
34
  }
14
35
  /** cacheTier:'env' (volatile session/project environment) is never marked —