mixdog 1.2.1 → 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 (557) hide show
  1. package/README.md +18 -0
  2. package/package.json +2 -1
  3. package/scripts/gate-local.mjs +19 -3
  4. package/scripts/model-catalog-audit.mjs +1 -15
  5. package/scripts/provider-pingpong-live.mjs +509 -0
  6. package/src/agents/advisor/AGENT.md +1 -1
  7. package/src/agents/advisor/agent.json +1 -1
  8. package/src/agents/reviewer/AGENT.md +3 -3
  9. package/src/agents/reviewer/agent.json +1 -1
  10. package/src/defaults/shipped-history.json +6 -0
  11. package/src/defaults/skills/setup/SKILL.md +6 -1
  12. package/src/defaults/skills/setup/references/actions.md +44 -22
  13. package/src/defaults/skills/setup/references/surfaces.md +10 -8
  14. package/src/headless-exec.mjs +15 -8
  15. package/src/lib/keychain-cjs.cjs +7 -4
  16. package/src/output-styles/common.md +11 -10
  17. package/src/repl/slash-commands.mjs +16 -1
  18. package/src/rules/agent/AGENT.md +5 -5
  19. package/src/rules/lead/LEAD.md +5 -5
  20. package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +29 -4
  21. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +10 -0
  22. package/src/runtime/agent/orchestrator/agent-trace-io.mjs +92 -61
  23. package/src/runtime/agent/orchestrator/cache-mtime.mjs +10 -1
  24. package/src/runtime/agent/orchestrator/config-providers-merge.mjs +7 -0
  25. package/src/runtime/agent/orchestrator/config.mjs +5 -0
  26. package/src/runtime/agent/orchestrator/context/collect.mjs +1 -0
  27. package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +26 -7
  28. package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +112 -7
  29. package/src/runtime/agent/orchestrator/mcp/client-config.mjs +36 -7
  30. package/src/runtime/agent/orchestrator/mcp/client-handshake.mjs +49 -10
  31. package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +40 -3
  32. package/src/runtime/agent/orchestrator/mcp/client.mjs +230 -96
  33. package/src/runtime/agent/orchestrator/mcp/oauth-callback.mjs +103 -0
  34. package/src/runtime/agent/orchestrator/mcp/oauth-credentials.mjs +150 -0
  35. package/src/runtime/agent/orchestrator/mcp/oauth-login.mjs +111 -0
  36. package/src/runtime/agent/orchestrator/mcp/oauth-probe.mjs +87 -0
  37. package/src/runtime/agent/orchestrator/mcp/oauth-provider.mjs +95 -0
  38. package/src/runtime/agent/orchestrator/mcp/oauth-request.mjs +122 -0
  39. package/src/runtime/agent/orchestrator/mcp/oauth-shared.mjs +9 -0
  40. package/src/runtime/agent/orchestrator/mcp/oauth.mjs +229 -0
  41. package/src/runtime/agent/orchestrator/providers/account-pool.mjs +188 -29
  42. package/src/runtime/agent/orchestrator/providers/anthropic-api-recovery.mjs +2 -1
  43. package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +48 -20
  44. package/src/runtime/agent/orchestrator/providers/anthropic-api-transport.mjs +94 -31
  45. package/src/runtime/agent/orchestrator/providers/anthropic-error-contract.mjs +98 -0
  46. package/src/runtime/agent/orchestrator/providers/anthropic-fast-mode.mjs +39 -18
  47. package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens-recovery.mjs +55 -0
  48. package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens.mjs +48 -37
  49. package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +10 -7
  50. package/src/runtime/agent/orchestrator/providers/anthropic-midstream-recovery.mjs +18 -4
  51. package/src/runtime/agent/orchestrator/providers/anthropic-model-resolve.mjs +13 -1
  52. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
  53. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-midstream.mjs +10 -1
  54. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-recovery.mjs +23 -9
  55. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/initial-status.mjs +46 -20
  56. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request.mjs +14 -9
  57. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +102 -45
  58. package/src/runtime/agent/orchestrator/providers/anthropic-overload-fallback.mjs +69 -0
  59. package/src/runtime/agent/orchestrator/providers/anthropic-server-fallback.mjs +4 -0
  60. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-blocks.mjs +20 -1
  61. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-delta.mjs +15 -2
  62. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-start.mjs +11 -4
  63. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/message-events.mjs +3 -0
  64. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events.mjs +12 -5
  65. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-outcome.mjs +1 -0
  66. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-state.mjs +14 -0
  67. package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +10 -1
  68. package/src/runtime/agent/orchestrator/providers/anthropic-turn-result.mjs +9 -0
  69. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +40 -7
  70. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-catalog.mjs +30 -9
  71. package/src/runtime/agent/orchestrator/providers/antigravity-oauth.mjs +7 -0
  72. package/src/runtime/agent/orchestrator/providers/antigravity-request.mjs +88 -21
  73. package/src/runtime/agent/orchestrator/providers/antigravity-response.mjs +30 -10
  74. package/src/runtime/agent/orchestrator/providers/antigravity-retry-policy.mjs +106 -0
  75. package/src/runtime/agent/orchestrator/providers/antigravity-stream.mjs +10 -61
  76. package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +94 -15
  77. package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +1 -1
  78. package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +117 -72
  79. package/src/runtime/agent/orchestrator/providers/compat-request-policy.mjs +78 -2
  80. package/src/runtime/agent/orchestrator/providers/cursor-auth.mjs +75 -10
  81. package/src/runtime/agent/orchestrator/providers/cursor-client-version.mjs +1 -1
  82. package/src/runtime/agent/orchestrator/providers/cursor-wire-guards.mjs +97 -2
  83. package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-bridge.mjs +103 -23
  84. package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-messages.mjs +43 -2
  85. package/src/runtime/agent/orchestrator/providers/cursor-wire-transport.mjs +103 -33
  86. package/src/runtime/agent/orchestrator/providers/cursor-wire.mjs +32 -6
  87. package/src/runtime/agent/orchestrator/providers/cursor.mjs +27 -3
  88. package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +64 -1
  89. package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +70 -6
  90. package/src/runtime/agent/orchestrator/providers/custom-reasoning.mjs +34 -7
  91. package/src/runtime/agent/orchestrator/providers/custom-tool-wire.mjs +32 -6
  92. package/src/runtime/agent/orchestrator/providers/deepseek.mjs +67 -0
  93. package/src/runtime/agent/orchestrator/providers/effort-configuration.mjs +80 -18
  94. package/src/runtime/agent/orchestrator/providers/gemini-cache-policy.mjs +11 -4
  95. package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +46 -8
  96. package/src/runtime/agent/orchestrator/providers/gemini-error-contract.mjs +273 -0
  97. package/src/runtime/agent/orchestrator/providers/gemini-family.mjs +9 -0
  98. package/src/runtime/agent/orchestrator/providers/gemini-history-signatures.mjs +9 -4
  99. package/src/runtime/agent/orchestrator/providers/gemini-request-body.mjs +41 -5
  100. package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +3 -1
  101. package/src/runtime/agent/orchestrator/providers/gemini-retry-policy.mjs +180 -0
  102. package/src/runtime/agent/orchestrator/providers/gemini-schema.mjs +369 -112
  103. package/src/runtime/agent/orchestrator/providers/gemini-sdk-request.mjs +3 -1
  104. package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +140 -35
  105. package/src/runtime/agent/orchestrator/providers/gemini-thinking.mjs +70 -24
  106. package/src/runtime/agent/orchestrator/providers/gemini.mjs +80 -29
  107. package/src/runtime/agent/orchestrator/providers/grok-client-version.mjs +1 -1
  108. package/src/runtime/agent/orchestrator/providers/grok-oauth-tokens.mjs +3 -0
  109. package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +69 -19
  110. package/src/runtime/agent/orchestrator/providers/lib/action-input-contract.mjs +60 -0
  111. package/src/runtime/agent/orchestrator/providers/lib/anthropic-native-blocks.mjs +1 -0
  112. package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +246 -42
  113. package/src/runtime/agent/orchestrator/providers/lib/anthropic-server-tool-usage.mjs +18 -0
  114. package/src/runtime/agent/orchestrator/providers/lib/anthropic-system-blocks.mjs +27 -6
  115. package/src/runtime/agent/orchestrator/providers/lib/claude-bridge-schema.mjs +388 -0
  116. package/src/runtime/agent/orchestrator/providers/lib/inclusive-usage.mjs +54 -0
  117. package/src/runtime/agent/orchestrator/providers/lib/origin-bound-fetch.mjs +16 -0
  118. package/src/runtime/agent/orchestrator/providers/lib/responses-terminal-fields.mjs +11 -0
  119. package/src/runtime/agent/orchestrator/providers/lib/usage-primitives.mjs +8 -0
  120. package/src/runtime/agent/orchestrator/providers/lib/wire-pairing.mjs +48 -22
  121. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +119 -18
  122. package/src/runtime/agent/orchestrator/providers/mimo-oauth-profile.mjs +13 -15
  123. package/src/runtime/agent/orchestrator/providers/mimo-oauth.mjs +3 -0
  124. package/src/runtime/agent/orchestrator/providers/model-list-sanitize.mjs +2 -1
  125. package/src/runtime/agent/orchestrator/providers/model-proxy-channel.d.mts +1 -1
  126. package/src/runtime/agent/orchestrator/providers/model-proxy-channel.mjs +1 -0
  127. package/src/runtime/agent/orchestrator/providers/model-proxy-provider.mjs +33 -1
  128. package/src/runtime/agent/orchestrator/providers/muse-code-oauth.mjs +4 -9
  129. package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +2 -0
  130. package/src/runtime/agent/orchestrator/providers/openai-codex-metadata.mjs +2 -0
  131. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +123 -61
  132. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/chunk-events.mjs +35 -14
  133. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-result.mjs +27 -2
  134. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +37 -7
  135. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/tool-call-acc.mjs +2 -9
  136. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream.mjs +1 -0
  137. package/src/runtime/agent/orchestrator/providers/openai-compat-error-contract.mjs +50 -0
  138. package/src/runtime/agent/orchestrator/providers/openai-compat-models.mjs +47 -2
  139. package/src/runtime/agent/orchestrator/providers/openai-compat-options.mjs +47 -25
  140. package/src/runtime/agent/orchestrator/providers/openai-compat-presets.mjs +5 -1
  141. package/src/runtime/agent/orchestrator/providers/openai-compat-reasoning-field.mjs +151 -0
  142. package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +64 -23
  143. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-events.mjs +79 -33
  144. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-head-parity.json +2901 -0
  145. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-parity.fixtures.mjs +172 -0
  146. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-state.mjs +3 -2
  147. package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +144 -15
  148. package/src/runtime/agent/orchestrator/providers/openai-compat-retry-profile.mjs +193 -0
  149. package/src/runtime/agent/orchestrator/providers/openai-compat-stream-common.mjs +66 -2
  150. package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +9 -2
  151. package/src/runtime/agent/orchestrator/providers/openai-compat-trace.mjs +2 -0
  152. package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +109 -26
  153. package/src/runtime/agent/orchestrator/providers/openai-compat-xai-send.mjs +27 -6
  154. package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +34 -20
  155. package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +23 -4
  156. package/src/runtime/agent/orchestrator/providers/openai-direct-request.mjs +37 -28
  157. package/src/runtime/agent/orchestrator/providers/openai-error-contract.mjs +274 -0
  158. package/src/runtime/agent/orchestrator/providers/openai-http-sse-request.mjs +72 -32
  159. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/output-items.mjs +23 -10
  160. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/terminal-frames.mjs +43 -15
  161. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events.mjs +10 -0
  162. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-items.mjs +18 -7
  163. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-outcome.mjs +5 -2
  164. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-stamps.mjs +2 -2
  165. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-state.mjs +7 -3
  166. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/text-relay.mjs +9 -1
  167. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state.mjs +2 -2
  168. package/src/runtime/agent/orchestrator/providers/openai-http-sse-watchdogs.mjs +1 -3
  169. package/src/runtime/agent/orchestrator/providers/openai-model-capabilities.mjs +80 -0
  170. package/src/runtime/agent/orchestrator/providers/openai-oauth-dispatch.mjs +37 -4
  171. package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +12 -1
  172. package/src/runtime/agent/orchestrator/providers/openai-oauth-tokens.mjs +22 -2
  173. package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +12 -1
  174. package/src/runtime/agent/orchestrator/providers/openai-responses-input.mjs +76 -33
  175. package/src/runtime/agent/orchestrator/providers/openai-responses-payload-parity.fixture.json +323 -0
  176. package/src/runtime/agent/orchestrator/providers/openai-responses-payload.mjs +44 -16
  177. package/src/runtime/agent/orchestrator/providers/openai-retry-policy.mjs +9 -0
  178. package/src/runtime/agent/orchestrator/providers/openai-ws-delta.mjs +7 -16
  179. package/src/runtime/agent/orchestrator/providers/openai-ws-handshake.mjs +16 -8
  180. package/src/runtime/agent/orchestrator/providers/openai-ws-response-state/refusals.mjs +60 -0
  181. package/src/runtime/agent/orchestrator/providers/openai-ws-response-state/tool-calls.mjs +51 -35
  182. package/src/runtime/agent/orchestrator/providers/openai-ws-response-state.mjs +30 -0
  183. package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/attempt-context.mjs +1 -2
  184. package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/policy.mjs +25 -14
  185. package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +12 -0
  186. package/src/runtime/agent/orchestrator/providers/openai-ws-stream/terminal-frames.mjs +25 -6
  187. package/src/runtime/agent/orchestrator/providers/openai-ws-terminal.mjs +18 -11
  188. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +41 -22
  189. package/src/runtime/agent/orchestrator/providers/opencode-go-gemini.mjs +170 -0
  190. package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +75 -70
  191. package/src/runtime/agent/orchestrator/providers/openrouter.mjs +75 -0
  192. package/src/runtime/agent/orchestrator/providers/provider-error-kind.mjs +720 -0
  193. package/src/runtime/agent/orchestrator/providers/registry.mjs +4 -1
  194. package/src/runtime/agent/orchestrator/providers/retry-backoff.mjs +46 -7
  195. package/src/runtime/agent/orchestrator/providers/retry-classification.mjs +123 -219
  196. package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +2 -0
  197. package/src/runtime/agent/orchestrator/providers/retry-executor.mjs +148 -45
  198. package/src/runtime/agent/orchestrator/providers/retry-midstream.mjs +81 -16
  199. package/src/runtime/agent/orchestrator/providers/transport-scope.d.mts +6 -0
  200. package/src/runtime/agent/orchestrator/providers/transport-scope.mjs +28 -0
  201. package/src/runtime/agent/orchestrator/providers/wire-gateway.mjs +157 -0
  202. package/src/runtime/agent/orchestrator/providers/wire-route.mjs +512 -0
  203. package/src/runtime/agent/orchestrator/providers/xai-tool-search-head-parity.json +1131 -0
  204. package/src/runtime/agent/orchestrator/providers/xai-tool-search.fixtures.mjs +183 -0
  205. package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +100 -0
  206. package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +3 -0
  207. package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-availability.mjs +21 -0
  208. package/src/runtime/agent/orchestrator/runtime-core/effort.mjs +15 -0
  209. package/src/runtime/agent/orchestrator/runtime-core/goal-reminder.mjs +0 -18
  210. package/src/runtime/agent/orchestrator/runtime-core/model-capabilities.mjs +57 -28
  211. package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +19 -16
  212. package/src/runtime/agent/orchestrator/runtime-core/plugin-mcp.mjs +1 -97
  213. package/src/runtime/agent/orchestrator/runtime-core/provider-request-snapshot.mjs +7 -3
  214. package/src/runtime/agent/orchestrator/runtime-core/session-title.mjs +21 -1
  215. package/src/runtime/agent/orchestrator/runtime-core/skill-tool-loading.mjs +14 -3
  216. package/src/runtime/agent/orchestrator/runtime-core/tool-bridge.mjs +526 -0
  217. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-data.mjs +3 -0
  218. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-schema.mjs +10 -7
  219. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +176 -71
  220. package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +62 -10
  221. package/src/runtime/agent/orchestrator/runtime-core/tool-exposure.mjs +96 -0
  222. package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +5 -1
  223. package/src/runtime/agent/orchestrator/session/compact/constants.mjs +3 -2
  224. package/src/runtime/agent/orchestrator/session/compact/messages.mjs +14 -93
  225. package/src/runtime/agent/orchestrator/session/compact/summary-anchor.mjs +5 -0
  226. package/src/runtime/agent/orchestrator/session/compact/user-message-kind.mjs +120 -0
  227. package/src/runtime/agent/orchestrator/session/context-tool-schema.mjs +17 -2
  228. package/src/runtime/agent/orchestrator/session/context-utils.mjs +8 -4
  229. package/src/runtime/agent/orchestrator/session/eager-dispatch/admission.mjs +2 -1
  230. package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +6 -1
  231. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +91 -1
  232. package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +1 -1
  233. package/src/runtime/agent/orchestrator/session/loop/context-overflow.mjs +56 -0
  234. package/src/runtime/agent/orchestrator/session/loop/deferred-call-through.mjs +18 -8
  235. package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +1 -0
  236. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +21 -10
  237. package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +132 -0
  238. package/src/runtime/agent/orchestrator/session/loop/request-boundary.mjs +30 -0
  239. package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +67 -20
  240. package/src/runtime/agent/orchestrator/session/loop/step-auto-effort.mjs +104 -19
  241. package/src/runtime/agent/orchestrator/session/loop/tool-call-resolution.mjs +95 -0
  242. package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +30 -3
  243. package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +15 -4
  244. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +15 -1
  245. package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +150 -0
  246. package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +7 -2
  247. package/src/runtime/agent/orchestrator/session/manager/ask-queue.mjs +30 -2
  248. package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +11 -2
  249. package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +2 -1
  250. package/src/runtime/agent/orchestrator/session/manager/ask-turn-commit.mjs +34 -12
  251. package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +57 -21
  252. package/src/runtime/agent/orchestrator/session/manager/ask-turn-loop-options.mjs +57 -25
  253. package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +6 -0
  254. package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +4 -0
  255. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +8 -0
  256. package/src/runtime/agent/orchestrator/session/manager/pending-message-entry.mjs +5 -10
  257. package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +208 -14
  258. package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +16 -4
  259. package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +25 -3
  260. package/src/runtime/agent/orchestrator/session/manager/session-fallback-title.mjs +82 -0
  261. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +19 -2
  262. package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +3 -0
  263. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +4 -1
  264. package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +18 -7
  265. package/src/runtime/agent/orchestrator/session/manager.mjs +2 -1
  266. package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +6 -0
  267. package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +168 -29
  268. package/src/runtime/agent/orchestrator/session/side-question-store.mjs +96 -0
  269. package/src/runtime/agent/orchestrator/session/side-question.mjs +192 -0
  270. package/src/runtime/agent/orchestrator/session/store/lifecycle-barriers.mjs +17 -3
  271. package/src/runtime/agent/orchestrator/session/store/live-state.mjs +23 -0
  272. package/src/runtime/agent/orchestrator/session/store/paths-heartbeat.mjs +58 -2
  273. package/src/runtime/agent/orchestrator/session/store/save-worker.mjs +6 -3
  274. package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +41 -28
  275. package/src/runtime/agent/orchestrator/session/store/session-observers.mjs +4 -2
  276. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-finish.mjs +12 -1
  277. package/src/runtime/agent/orchestrator/session/store/write-admission.mjs +3 -1
  278. package/src/runtime/agent/orchestrator/session/store/write-guards.mjs +16 -0
  279. package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +22 -10
  280. package/src/runtime/agent/orchestrator/session/store-summary-archived-agent.mjs +34 -15
  281. package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +6 -0
  282. package/src/runtime/agent/orchestrator/session/store-summary-fields.mjs +13 -0
  283. package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +13 -1
  284. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +10 -2
  285. package/src/runtime/agent/orchestrator/session/store.mjs +19 -3
  286. package/src/runtime/agent/orchestrator/session/tool-batch/execute-call.mjs +1 -0
  287. package/src/runtime/agent/orchestrator/session/tool-batch/finalize.mjs +1 -1
  288. package/src/runtime/agent/orchestrator/session/tool-batch/record-outcome.mjs +1 -1
  289. package/src/runtime/agent/orchestrator/session/tool-batch/state.mjs +7 -1
  290. package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +4 -0
  291. package/src/runtime/agent/orchestrator/session/tool-schema-rejection.mjs +77 -0
  292. package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +20 -1
  293. package/src/runtime/agent/orchestrator/tools/bash-policy-scan.mjs +8 -2
  294. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +2 -2
  295. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/command-preflight.mjs +3 -3
  296. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/deadline-plan.mjs +12 -15
  297. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +4 -1
  298. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +5 -5
  299. package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +14 -10
  300. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +49 -34
  301. package/src/runtime/agent/orchestrator/tools/builtin/runtime-capabilities.mjs +23 -1
  302. package/src/runtime/agent/orchestrator/tools/code-graph/dispatch/root-resolution.mjs +1 -1
  303. package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +1 -1
  304. package/src/runtime/agent/orchestrator/tools/patch/ui-diff.mjs +73 -39
  305. package/src/runtime/agent/orchestrator/tools/progress-message.mjs +18 -1
  306. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +7 -4
  307. package/src/runtime/agent/orchestrator/tools/shell-exec-policy.mjs +88 -12
  308. package/src/runtime/agent/orchestrator/tools/shell-policy.mjs +2 -0
  309. package/src/runtime/computer-bridge/action-schema.mjs +44 -21
  310. package/src/runtime/github/tool.mjs +92 -2
  311. package/src/runtime/memory/index.mjs +1 -0
  312. package/src/runtime/memory/lib/http-router/ingest-routes.mjs +22 -1
  313. package/src/runtime/memory/lib/ingest/transcript-offsets.mjs +2 -0
  314. package/src/runtime/memory/lib/pg/adapter.mjs +98 -1
  315. package/src/runtime/memory/lib/pg/process.mjs +65 -50
  316. package/src/runtime/memory/lib/pg/run-child.mjs +49 -0
  317. package/src/runtime/memory/lib/pg/supervisor.mjs +124 -16
  318. package/src/runtime/memory/lib/runtime-fetcher.mjs +12 -13
  319. package/src/runtime/memory/lib/transcript-ingest.mjs +14 -0
  320. package/src/runtime/office/README.md +2 -2
  321. package/src/runtime/office/authoring/html-document-author.mjs +2 -0
  322. package/src/runtime/office/authoring/pptx-contact-sheet.mjs +2 -0
  323. package/src/runtime/office/authoring/pptx-html-measure.mjs +2 -0
  324. package/src/runtime/office/authoring/pptx-html-runner.mjs +2 -0
  325. package/src/runtime/office/authoring/xlsx-html-runner.mjs +2 -0
  326. package/src/runtime/office/core/office-actions-read.mjs +3 -0
  327. package/src/runtime/office/core/office-render-preview.mjs +2 -0
  328. package/src/runtime/office/core/office-session-dispatch.mjs +7 -0
  329. package/src/runtime/office/core/office-sessionless-actions.mjs +8 -0
  330. package/src/runtime/office/core/office-sessions.mjs +5 -0
  331. package/src/runtime/office/core/office-transactions.mjs +3 -0
  332. package/src/runtime/office/core/office-write-ledger.mjs +98 -0
  333. package/src/runtime/office/design/library/templates/mixdog-executive.mixdog-edit.pptx +0 -0
  334. package/src/runtime/office/index.mjs +30 -0
  335. package/src/runtime/office/pdf/pdf-edit-document.mjs +2 -0
  336. package/src/runtime/office/pdf/pdf-render.mjs +23 -7
  337. package/src/runtime/office/pdf/pdf-security.mjs +2 -0
  338. package/src/runtime/office/portable/portable-opc.mjs +4 -1
  339. package/src/runtime/office/quality/visual-diff.mjs +2 -0
  340. package/src/runtime/office/shared/values.mjs +0 -5
  341. package/src/runtime/shared/background-tasks.mjs +92 -14
  342. package/src/runtime/shared/bounded-file-read.mjs +13 -0
  343. package/src/runtime/shared/bounded-line-diff.mjs +182 -0
  344. package/src/runtime/shared/buffered-appender.mjs +18 -0
  345. package/src/runtime/shared/config.mjs +78 -18
  346. package/src/runtime/shared/err-text.mjs +31 -0
  347. package/src/runtime/shared/error-presentation.mjs +159 -19
  348. package/src/runtime/shared/file-permissions.d.mts +6 -1
  349. package/src/runtime/shared/file-permissions.mjs +54 -6
  350. package/src/runtime/shared/llm/anthropic-betas.mjs +4 -3
  351. package/src/runtime/shared/llm/anthropic-effort.mjs +129 -134
  352. package/src/runtime/shared/llm/anthropic-thinking-contract.mjs +50 -14
  353. package/src/runtime/shared/llm/model-catalog.mjs +53 -40
  354. package/src/runtime/shared/llm/openai-daybreak.mjs +4 -16
  355. package/src/runtime/shared/llm/provider-catalog-registry.mjs +11 -0
  356. package/src/runtime/shared/llm/provider-model-identities.mjs +13 -4
  357. package/src/runtime/shared/llm/usage-accounting.mjs +5 -2
  358. package/src/runtime/shared/llm/usage-ledger-rollup.mjs +3 -0
  359. package/src/runtime/shared/llm/usage-rollup.mjs +0 -1
  360. package/src/runtime/shared/loopback-listener.mjs +9 -0
  361. package/src/runtime/shared/model-display.mjs +13 -0
  362. package/src/runtime/shared/provider-api-key.mjs +2 -0
  363. package/src/runtime/shared/quota-resume-store.mjs +11 -0
  364. package/src/runtime/shared/review-diff.mjs +52 -0
  365. package/src/runtime/shared/session-baseline-store.mjs +960 -0
  366. package/src/runtime/shared/session-sidebar-host.d.mts +4 -0
  367. package/src/runtime/shared/session-sidebar-host.mjs +38 -0
  368. package/src/runtime/shared/slow-span.mjs +114 -0
  369. package/src/runtime/shared/statusline/statusline-format.mjs +4 -4
  370. package/src/runtime/shared/statusline/statusline-segments.mjs +28 -4
  371. package/src/runtime/shared/task-notification-envelope.mjs +2 -2
  372. package/src/runtime/shared/tool-card-model/card-header.mjs +6 -1
  373. package/src/runtime/shared/tool-card-model/generic-detail.mjs +39 -5
  374. package/src/runtime/shared/tool-card-model.mjs +5 -2
  375. package/src/runtime/shared/tool-output-limit.mjs +4 -0
  376. package/src/runtime/shared/tool-primitives.mjs +13 -0
  377. package/src/runtime/shared/tool-result-summary.mjs +8 -1
  378. package/src/runtime/shared/tool-surface.mjs +18 -3
  379. package/src/runtime/shared/tool-work-units.mjs +40 -4
  380. package/src/runtime/shared/transcript-writer/purge.mjs +74 -0
  381. package/src/runtime/shared/transcript-writer.mjs +10 -2
  382. package/src/runtime/shared/turn-changes.mjs +670 -274
  383. package/src/runtime/shared/turn-review-reply.mjs +8 -39
  384. package/src/runtime/shared/turn-snapshot-store.mjs +94 -2
  385. package/src/runtime/shared/turn-snapshot.mjs +986 -690
  386. package/src/runtime/shared/turn-worktree-snapshot.mjs +279 -262
  387. package/src/runtime/shared/user-data-guard.mjs +262 -49
  388. package/src/runtime/shared/worktrees/carry.mjs +531 -0
  389. package/src/runtime/shared/worktrees/contract.mjs +34 -24
  390. package/src/runtime/shared/worktrees/file-recovery.mjs +68 -0
  391. package/src/runtime/shared/worktrees/git-head.mjs +205 -0
  392. package/src/runtime/shared/worktrees/git.mjs +8 -3
  393. package/src/runtime/shared/worktrees/maintenance.mjs +1 -1
  394. package/src/runtime/shared/worktrees/manager.mjs +156 -8
  395. package/src/runtime/shared/worktrees/merge.mjs +31 -21
  396. package/src/runtime/shared/worktrees/paths.d.mts +6 -0
  397. package/src/runtime/shared/worktrees/test-support.mjs +19 -4
  398. package/src/runtime/terminal-bridge/client.mjs +44 -11
  399. package/src/runtime/terminal-bridge/tool-defs.mjs +13 -6
  400. package/src/runtime/tidy/apply.mjs +47 -2
  401. package/src/runtime/tidy/run-engines.mjs +11 -5
  402. package/src/session-runtime/agent-tool-routing.mjs +19 -13
  403. package/src/session-runtime/boot/apis.mjs +19 -5
  404. package/src/session-runtime/boot/facade.mjs +1 -0
  405. package/src/session-runtime/boot/infrastructure.mjs +12 -1
  406. package/src/session-runtime/boot/session.mjs +0 -1
  407. package/src/session-runtime/boot/tools.mjs +4 -1
  408. package/src/session-runtime/cwd-plugins/cwd-apply.mjs +12 -5
  409. package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +65 -0
  410. package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +3 -1
  411. package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +11 -4
  412. package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +115 -18
  413. package/src/session-runtime/internal-tool-executor.mjs +6 -2
  414. package/src/session-runtime/lifecycle/cold-heir.mjs +188 -0
  415. package/src/session-runtime/lifecycle/inheritance.mjs +71 -27
  416. package/src/session-runtime/lifecycle/session-catalog.mjs +14 -3
  417. package/src/session-runtime/lifecycle/session-switch/resume.mjs +6 -0
  418. package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +29 -6
  419. package/src/session-runtime/lifecycle/teardown.mjs +73 -8
  420. package/src/session-runtime/lifecycle-api.mjs +1 -0
  421. package/src/session-runtime/mcp-glue/connect.mjs +46 -14
  422. package/src/session-runtime/mcp-glue/server-catalog.mjs +20 -3
  423. package/src/session-runtime/mcp-glue.mjs +3 -0
  424. package/src/session-runtime/mcp-oauth-login.mjs +174 -0
  425. package/src/session-runtime/model-route/model-switch-target.mjs +34 -0
  426. package/src/session-runtime/model-route/set-route.mjs +85 -17
  427. package/src/session-runtime/model-route/web-search-route.mjs +1 -1
  428. package/src/session-runtime/native-web-search/routes.mjs +22 -3
  429. package/src/session-runtime/native-web-search-usage.mjs +51 -0
  430. package/src/session-runtime/native-web-search.mjs +10 -1
  431. package/src/session-runtime/new-session-config.mjs +4 -2
  432. package/src/session-runtime/provider-auth/login.mjs +4 -0
  433. package/src/session-runtime/provider-models/model-meta.mjs +12 -3
  434. package/src/session-runtime/quick-model-rows/web-search-rows.mjs +13 -8
  435. package/src/session-runtime/quick-web-search-models.mjs +13 -38
  436. package/src/session-runtime/resource-extension-sync.mjs +4 -0
  437. package/src/session-runtime/resource-mcp-api.mjs +98 -2
  438. package/src/session-runtime/resource-scope-decorate.mjs +10 -3
  439. package/src/session-runtime/runtime-review-api.mjs +21 -2
  440. package/src/session-runtime/services/agent-tool/index-write-queue.mjs +81 -20
  441. package/src/session-runtime/services/agent-tool/job-task-reconcile.mjs +13 -1
  442. package/src/session-runtime/services/agent-tool/job-views/agent-list.mjs +7 -2
  443. package/src/session-runtime/services/agent-tool/lead-worker-index/forgotten-leads.mjs +29 -0
  444. package/src/session-runtime/services/agent-tool/lead-worker-index/index-file.mjs +1 -1
  445. package/src/session-runtime/services/agent-tool/lead-worker-index.mjs +73 -7
  446. package/src/session-runtime/services/agent-tool/send-flow.mjs +22 -4
  447. package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +2 -0
  448. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +22 -5
  449. package/src/session-runtime/services/agent-tool/tag-registry.mjs +15 -1
  450. package/src/session-runtime/services/agent-tool/worker-index/row-liveness.mjs +8 -1
  451. package/src/session-runtime/services/agent-tool/worker-index/row-shape.mjs +2 -2
  452. package/src/session-runtime/services/agent-tool/worker-index/row-store.mjs +10 -1
  453. package/src/session-runtime/services/agent-tool/worker-index.mjs +46 -7
  454. package/src/session-runtime/services/agent-tool/worker-rows.mjs +17 -0
  455. package/src/session-runtime/services/agent-tool.mjs +3 -0
  456. package/src/session-runtime/services/channel-admin.mjs +19 -3
  457. package/src/session-runtime/services/memory-runtime-proxy/calls.mjs +4 -0
  458. package/src/session-runtime/services/memory-runtime-proxy.mjs +1 -0
  459. package/src/session-runtime/services/provider-admin.mjs +81 -15
  460. package/src/session-runtime/session-transcript-purge.mjs +32 -0
  461. package/src/session-runtime/session-turn-api.mjs +14 -5
  462. package/src/session-runtime/settings-builtin-tools-api.mjs +9 -0
  463. package/src/session-runtime/settings-compaction-api.mjs +1 -0
  464. package/src/session-runtime/setup-tool/executor.mjs +36 -6
  465. package/src/session-runtime/setup-tool/extended-actions.mjs +86 -6
  466. package/src/session-runtime/setup-tool/settings-contract.mjs +13 -3
  467. package/src/session-runtime/setup-tool/tool-defs.mjs +13 -4
  468. package/src/session-runtime/skills-api.mjs +3 -5
  469. package/src/session-runtime/tool-surface.mjs +5 -1
  470. package/src/session-runtime/turn/compaction-gate.mjs +25 -0
  471. package/src/session-runtime/turn/session-ops.mjs +7 -5
  472. package/src/session-runtime/turn/side-question-ops.mjs +22 -0
  473. package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +5 -1
  474. package/src/session-runtime/turn/turn-run/turn-prepare.mjs +8 -3
  475. package/src/session-runtime/turn/turn-run/turn-settle.mjs +10 -0
  476. package/src/session-runtime/turn/turn-run/turn-timing.mjs +4 -3
  477. package/src/session-runtime/turn/turn-run.mjs +25 -9
  478. package/src/session-runtime/usage-stats-api.mjs +43 -11
  479. package/src/session-runtime/workspace/project-branches.mjs +7 -5
  480. package/src/session-runtime/workspace/transition-steps.mjs +129 -31
  481. package/src/session-runtime/workspace/transitions.mjs +190 -15
  482. package/src/standalone/daemon-agent-control.mjs +9 -1
  483. package/src/standalone/daemon-drain-policy.mjs +8 -0
  484. package/src/standalone/daemon-local-session-bridge.mjs +14 -1
  485. package/src/standalone/daemon-owner.mjs +17 -4
  486. package/src/standalone/daemon-pg-stop.mjs +51 -0
  487. package/src/standalone/daemon-stop-budget.d.mts +2 -0
  488. package/src/standalone/daemon-stop-budget.mjs +18 -0
  489. package/src/standalone/daemon-stored-session-views.mjs +2 -0
  490. package/src/standalone/daemon-telemetry.mjs +74 -0
  491. package/src/standalone/daemon.mjs +64 -8
  492. package/src/standalone/desktop-service-registry.mjs +5 -0
  493. package/src/standalone/local-session-runtime.mjs +70 -19
  494. package/src/standalone/session-client.mjs +42 -0
  495. package/src/standalone/session-protocol.mjs +14 -0
  496. package/src/standalone/session-proxy/projection.mjs +41 -4
  497. package/src/standalone/session-runtime-inline-host/boot-loaders.mjs +15 -1
  498. package/src/standalone/session-runtime-inline-host.mjs +1 -0
  499. package/src/standalone/session-service/agent-tree/agent-cancel.mjs +33 -2
  500. package/src/standalone/session-service/agent-tree/agent-turns.mjs +26 -10
  501. package/src/standalone/session-service/agent-tree.mjs +12 -0
  502. package/src/standalone/session-service/quota-resume.mjs +8 -0
  503. package/src/standalone/session-service/retention/busy.mjs +15 -1
  504. package/src/standalone/session-service/session-calls/session-action.mjs +18 -3
  505. package/src/standalone/session-service-api.mjs +11 -1
  506. package/src/standalone/session-service.mjs +1 -0
  507. package/src/standalone/session-state-patch.d.mts +2 -1
  508. package/src/standalone/session-state-patch.mjs +41 -1
  509. package/src/tui/App.jsx +25 -0
  510. package/src/tui/app/app-view/floating-panel.jsx +26 -1
  511. package/src/tui/app/app-view.jsx +1 -0
  512. package/src/tui/app/btw-controller.mjs +118 -0
  513. package/src/tui/app/create-app-pickers.mjs +6 -0
  514. package/src/tui/app/extension-pickers/mcp-login.mjs +107 -0
  515. package/src/tui/app/extension-pickers/mcp-servers-picker.mjs +2 -1
  516. package/src/tui/app/extension-pickers.mjs +2 -1
  517. package/src/tui/app/model-options.mjs +11 -16
  518. package/src/tui/app/shell-layout/row-budgets.mjs +11 -1
  519. package/src/tui/app/shell-layout/surfaces.mjs +3 -1
  520. package/src/tui/app/slash-commands.mjs +20 -5
  521. package/src/tui/app/slash-dispatch/panel-commands.mjs +16 -1
  522. package/src/tui/app/slash-dispatch/session-commands.mjs +19 -6
  523. package/src/tui/app/use-global-key-input/approval-shortcut.mjs +12 -0
  524. package/src/tui/app/use-global-key-input.mjs +5 -12
  525. package/src/tui/app/use-prompt-handlers.mjs +11 -0
  526. package/src/tui/components/BtwPanel.jsx +53 -0
  527. package/src/tui/components/QuestionPanel.jsx +275 -0
  528. package/src/tui/components/StatusLine.jsx +2 -0
  529. package/src/tui/components/question-panel-model.mjs +156 -0
  530. package/src/tui/components/status-line/local-line.mjs +5 -2
  531. package/src/tui/components/status-line/use-statusline-text.mjs +7 -1
  532. package/src/tui/dist/index.mjs +3221 -1500
  533. package/src/tui/session/context-state.mjs +4 -2
  534. package/src/tui/session/quota-resume.mjs +46 -14
  535. package/src/tui/session/session-api/commands.mjs +43 -24
  536. package/src/tui/session/session-api/controls.mjs +2 -2
  537. package/src/tui/session/session-api/extensions.mjs +22 -0
  538. package/src/tui/session/session-api/integrations.mjs +16 -2
  539. package/src/tui/session/session-api/lifecycle/dispose.mjs +1 -0
  540. package/src/tui/session/session-api/lifecycle.mjs +7 -2
  541. package/src/tui/session/session-api/routes.mjs +71 -7
  542. package/src/tui/session/session-api/settings.mjs +11 -14
  543. package/src/tui/session/session-api.mjs +1 -0
  544. package/src/tui/session/session-flow/drain.mjs +7 -1
  545. package/src/tui/session/session-flow/failed-turn-rewind.mjs +10 -4
  546. package/src/tui/session/tool-approval.mjs +10 -7
  547. package/src/tui/session/transcript-spill.mjs +14 -7
  548. package/src/tui/session/turn-stream.mjs +174 -31
  549. package/src/tui/session/turn.mjs +46 -16
  550. package/src/tui/statusline-ansi-bridge.mjs +1 -1
  551. package/src/ui/statusline-agents.mjs +15 -4
  552. package/src/ui/statusline.mjs +7 -3
  553. package/src/ui/streaming-markdown-heal.mjs +34 -3
  554. package/src/vendor/statusline/src/gateway/claude-current.mjs +14 -4
  555. package/src/workflows/default/WORKFLOW.md +3 -1
  556. package/src/runtime/memory/lib/memory-session-merge.mjs +0 -32
  557. package/src/runtime/shared/llm/usage-session-history.mjs +0 -266
@@ -1,6 +1,7 @@
1
1
  // Transcript lowering is independent of request/turn metadata. A retained
2
2
  // message must have the same wire representation in every subsequent request.
3
3
  import { providerReplayItems } from './lib/provider-replay.mjs';
4
+ import { responsesEffortUpdates } from './effort-configuration.mjs';
4
5
  import { ensureResponsesCallOutputs } from './lib/wire-pairing.mjs';
5
6
  import { normalizeContentForOpenAIResponses, splitToolContentForOpenAIResponses } from './media-normalization.mjs';
6
7
  import {
@@ -8,8 +9,30 @@ import {
8
9
  isCustomToolCallRecord,
9
10
  nativeToolSearchCallInput,
10
11
  nativeToolSearchOutputInput,
12
+ toolCallNamespace,
11
13
  } from './custom-tool-wire.mjs';
12
14
 
15
+ // A call record that carries a Responses namespace replays it beside `name`.
16
+ const namespaceField = (call) => {
17
+ const namespace = toolCallNamespace(call);
18
+ return namespace ? { namespace } : {};
19
+ };
20
+
21
+ // A replayed native tool_search item for a model that has no tool_search tool:
22
+ // a client call becomes the load_tool function call (its output is lowered
23
+ // from the tool message), server-executed calls and outputs are dropped.
24
+ function withoutNativeToolSearch(item) {
25
+ if (item?.type === 'tool_search_output') return null;
26
+ if (item?.type !== 'tool_search_call') return item;
27
+ if (item.execution === 'server' || !item.call_id) return null;
28
+ return {
29
+ type: 'function_call',
30
+ call_id: item.call_id,
31
+ name: 'load_tool',
32
+ arguments: typeof item.arguments === 'string' ? item.arguments : JSON.stringify(item.arguments ?? {}),
33
+ };
34
+ }
35
+
13
36
  /**
14
37
  * One tool result → its wire item. Which item depends on how the call was
15
38
  * lowered: a custom tool answers with custom_tool_call_output, a native
@@ -17,16 +40,13 @@ import {
17
40
  * media, since that item carries no text field), everything else with
18
41
  * function_call_output.
19
42
  */
20
- function pushToolResult(
21
- m,
22
- { out, pendingToolMedia, pendingToolLoads, customToolCallNameById, nativeSearchCalls, opts }
23
- ) {
24
- const { output, mediaContent } = splitToolContentForOpenAIResponses(m.content);
25
- if (customToolCallNameById.has(m.toolCallId || '')) {
43
+ function pushToolResult(m, { out, pendingToolMedia, pendingToolLoads, customToolCallIds, nativeSearchCalls, opts }) {
44
+ const { output, mediaContent } = (opts.splitToolContent || splitToolContentForOpenAIResponses)(m.content);
45
+ if (customToolCallIds.has(m.toolCallId || '')) {
46
+ // Documented custom_tool_call_output shape: call_id + output (+ id).
26
47
  out.push({
27
48
  type: 'custom_tool_call_output',
28
49
  call_id: m.toolCallId || '',
29
- name: customToolCallNameById.get(m.toolCallId || '') || undefined,
30
50
  output,
31
51
  });
32
52
  if (mediaContent) pendingToolMedia.push(...mediaContent);
@@ -53,7 +73,8 @@ function pushToolResult(
53
73
  // A function result (e.g. Skill) cannot carry schemas. Tools it already
54
74
  // loaded ride a runtime load_tool pair emitted after the batch's outputs;
55
75
  // only a result from another native family falls back to a load hint.
56
- const loadedNames = (m.nativeToolSearch?.openaiTools || []).map((tool) => tool.name);
76
+ const loadedNames =
77
+ opts.nativeToolSearch === false ? [] : (m.nativeToolSearch?.openaiTools || []).map((tool) => tool.name);
57
78
  const loadOutput = loadedNames.length
58
79
  ? nativeToolSearchOutputInput(m, opts.nativeToolSearchProvider || 'openai-oauth')
59
80
  : null;
@@ -84,18 +105,21 @@ function pushToolResult(
84
105
  * lowered as a custom tool or a native search call so the matching result
85
106
  * lowers the same way.
86
107
  */
87
- function pushAssistantToolCalls(toolCalls, { out, customToolCallNameById, nativeSearchCalls }) {
108
+ function pushAssistantToolCalls(toolCalls, { out, customToolCallIds, nativeSearchCalls, nativeToolSearch }) {
88
109
  for (const tc of toolCalls) {
89
- const nativeSearchCall = nativeToolSearchCallInput(tc);
110
+ // A model without native tool_search replays its load_tool call as the
111
+ // plain function call it was declared as.
112
+ const nativeSearchCall = nativeToolSearch ? nativeToolSearchCallInput(tc) : null;
90
113
  if (nativeSearchCall) {
91
114
  nativeSearchCalls.set(tc.id, nativeSearchCall);
92
115
  out.push(nativeSearchCall);
93
116
  } else if (isCustomToolCallRecord(tc)) {
94
- if (tc.id) customToolCallNameById.set(tc.id, tc.name || '');
117
+ if (tc.id) customToolCallIds.add(tc.id);
95
118
  out.push({
96
119
  type: 'custom_tool_call',
97
120
  call_id: tc.id,
98
121
  name: tc.name,
122
+ ...namespaceField(tc),
99
123
  input: customToolInputFromArguments(tc.name, tc.arguments),
100
124
  });
101
125
  } else {
@@ -103,20 +127,41 @@ function pushAssistantToolCalls(toolCalls, { out, customToolCallNameById, native
103
127
  type: 'function_call',
104
128
  call_id: tc.id,
105
129
  name: tc.name === 'tool_search' ? 'load_tool' : tc.name,
130
+ ...namespaceField(tc),
106
131
  arguments: JSON.stringify(tc.arguments),
107
132
  });
108
133
  }
109
134
  }
110
135
  }
111
136
 
137
+ /**
138
+ * Messages → Responses input items, native-aware. Defaults are the first-party
139
+ * OpenAI lowering. Gateways that speak the same item types opt in through:
140
+ * - `replayProvider`: the providerReplay owner tag accepted for ordered
141
+ * replay (default 'openai-responses'); any other owner is never replayed.
142
+ * - `replayOwnedReasoning`: keep reasoning items of an accepted ordered
143
+ * replay even when `replayEncryptedReasoning` (flattened message
144
+ * reasoning) is off.
145
+ * - `reasoningByMessageIndex`: same-owner reasoning from provider state,
146
+ * injected before the message at that index (or after the last one).
147
+ * - `includeSystem`, `nativePdf`, `splitToolContent`, `startIndex`: the
148
+ * gateway's system/media/continuation handling.
149
+ */
112
150
  export function convertMessagesToResponsesInput(messages, opts = {}) {
113
151
  const out = [];
114
152
  const pendingToolMedia = [];
115
153
  const pendingToolLoads = [];
116
- const customToolCallNameById = new Map();
154
+ const customToolCallIds = new Set();
117
155
  const nativeSearchCalls = new Map();
118
156
  const replayEncryptedReasoning = opts.replayEncryptedReasoning === true;
119
157
  const wireParity = opts.codexWireParity === true;
158
+ const replayOwner = opts.replayProvider || 'openai-responses';
159
+ const replayOwnedReasoning = opts.replayOwnedReasoning ?? replayEncryptedReasoning;
160
+ // Native tool_search is a per-model capability (gpt-5.4 and later on the
161
+ // public API); every other caller keeps it.
162
+ const nativeToolSearch = opts.nativeToolSearch !== false;
163
+ const nativePdf = opts.nativePdf;
164
+ const contentOpts = (role) => (nativePdf === undefined ? { role } : { role, nativePdf });
120
165
  const wireMessage = (role, content, phase) => ({
121
166
  ...(wireParity ? { type: 'message' } : {}),
122
167
  role,
@@ -156,33 +201,29 @@ export function convertMessagesToResponsesInput(messages, opts = {}) {
156
201
  if (!pendingToolMedia.length) return;
157
202
  out.push(wireMessage('user', pendingToolMedia.splice(0)));
158
203
  };
159
- // An update on a tool result applies after its whole batch; one on a user
160
- // message before it. Adjacent updates are rejected, so a batch update that
161
- // a user message directly follows yields to that message's own.
162
- let afterBatch = null;
163
- for (const m of messages) {
164
- if (!m || m.role === 'system') continue;
165
- const changedEffort = opts.effortProjection?.updates.get(m);
204
+ const effortUpdates = responsesEffortUpdates(opts.effortProjection);
205
+ for (let messageIndex = opts.startIndex || 0; messageIndex < messages.length; messageIndex += 1) {
206
+ const m = messages[messageIndex];
207
+ if (!m || (m.role === 'system' && opts.includeSystem !== true)) continue;
208
+ const updates = effortUpdates.before(m);
166
209
  if (m.role === 'tool') {
167
- pushToolResult(m, { out, pendingToolMedia, pendingToolLoads, customToolCallNameById, nativeSearchCalls, opts });
168
- if (changedEffort) afterBatch = changedEffort;
210
+ pushToolResult(m, { out, pendingToolMedia, pendingToolLoads, customToolCallIds, nativeSearchCalls, opts });
169
211
  continue;
170
212
  }
171
213
  flushToolMedia();
172
- if (changedEffort || afterBatch) out.push({ type: 'configuration_update', reasoning: { effort: changedEffort || afterBatch } });
173
- afterBatch = null;
214
+ out.push(...updates);
174
215
  // Preserve original assistant phases and item order even when encrypted
175
216
  // reasoning is explicitly disabled. Never replay another provider's data.
176
217
  const orderedReplay =
177
218
  m.role === 'assistant'
178
- ? providerReplayItems(m, 'openai-responses')?.filter(
179
- (item) => replayEncryptedReasoning || item?.type !== 'reasoning'
180
- )
219
+ ? providerReplayItems(m, replayOwner)?.filter((item) => replayOwnedReasoning || item?.type !== 'reasoning')
181
220
  : undefined;
182
221
  if (orderedReplay?.length) {
183
- for (const item of orderedReplay) {
222
+ for (const replayItem of orderedReplay) {
223
+ const item = nativeToolSearch ? replayItem : withoutNativeToolSearch(replayItem);
224
+ if (!item) continue;
184
225
  if (item?.type === 'custom_tool_call' && item.call_id) {
185
- customToolCallNameById.set(item.call_id, item.name || '');
226
+ customToolCallIds.add(item.call_id);
186
227
  }
187
228
  if (item?.type === 'tool_search_call' && item.call_id) {
188
229
  nativeSearchCalls.set(item.call_id, item);
@@ -191,28 +232,30 @@ export function convertMessagesToResponsesInput(messages, opts = {}) {
191
232
  }
192
233
  continue;
193
234
  }
235
+ if (opts.reasoningByMessageIndex?.has(messageIndex)) out.push(...opts.reasoningByMessageIndex.get(messageIndex));
194
236
  pushReasoningItems(m, 'before');
195
237
  if (m.role === 'assistant' && Array.isArray(m.toolCalls) && m.toolCalls.length) {
196
238
  // Legacy sessions may have only flattened messages and reasoning.
197
239
  if (m.content)
198
240
  out.push(
199
- wireMessage('assistant', normalizeContentForOpenAIResponses(m.content, { role: 'assistant' }), m.phase)
241
+ wireMessage('assistant', normalizeContentForOpenAIResponses(m.content, contentOpts('assistant')), m.phase)
200
242
  );
201
243
  pushReasoningItems(m, 'after');
202
- pushAssistantToolCalls(m.toolCalls, { out, customToolCallNameById, nativeSearchCalls });
244
+ pushAssistantToolCalls(m.toolCalls, { out, customToolCallIds, nativeSearchCalls, nativeToolSearch });
203
245
  continue;
204
246
  }
205
247
  out.push(
206
248
  wireMessage(
207
- m.role === 'assistant' ? 'assistant' : 'user',
208
- normalizeContentForOpenAIResponses(m.content, { role: m.role }),
249
+ m.role === 'assistant' || m.role === 'system' ? m.role : 'user',
250
+ normalizeContentForOpenAIResponses(m.role === 'system' ? m.content || '' : m.content, contentOpts(m.role)),
209
251
  m.phase
210
252
  )
211
253
  );
212
254
  pushReasoningItems(m, 'after');
213
255
  }
214
256
  flushToolMedia();
215
- if (afterBatch) out.push({ type: 'configuration_update', reasoning: { effort: afterBatch } });
257
+ if (opts.reasoningByMessageIndex?.has(messages.length)) out.push(...opts.reasoningByMessageIndex.get(messages.length));
258
+ out.push(...effortUpdates.end());
216
259
  // Wire-level pairing guard: replay envelopes can carry a call whose
217
260
  // result never committed (cancel/abort). The provider hard-rejects the
218
261
  // unpaired call, so synthesize the missing outputs here.
@@ -0,0 +1,323 @@
1
+ {
2
+ "openai|gpt-5.5": {
3
+ "model": "gpt-5.5",
4
+ "instructions": "Sys",
5
+ "input": [
6
+ {
7
+ "role": "user",
8
+ "content": [
9
+ {
10
+ "type": "input_text",
11
+ "text": "hi"
12
+ }
13
+ ]
14
+ }
15
+ ],
16
+ "tools": [
17
+ {
18
+ "type": "function",
19
+ "name": "read",
20
+ "description": "r",
21
+ "parameters": {
22
+ "type": "object",
23
+ "properties": {}
24
+ },
25
+ "strict": false
26
+ },
27
+ {
28
+ "type": "tool_search",
29
+ "execution": "client",
30
+ "description": "l",
31
+ "parameters": {
32
+ "type": "object",
33
+ "properties": {}
34
+ }
35
+ }
36
+ ],
37
+ "tool_choice": "auto",
38
+ "parallel_tool_calls": true,
39
+ "reasoning": {
40
+ "effort": "high",
41
+ "summary": "auto"
42
+ },
43
+ "store": false,
44
+ "stream": true,
45
+ "include": [
46
+ "reasoning.encrypted_content"
47
+ ],
48
+ "prompt_cache_key": "mixdog-openai-9d2848824f0e8f27c7",
49
+ "text": {
50
+ "verbosity": "low"
51
+ }
52
+ },
53
+ "openai|gpt-5.4": {
54
+ "model": "gpt-5.4",
55
+ "instructions": "Sys",
56
+ "input": [
57
+ {
58
+ "role": "user",
59
+ "content": [
60
+ {
61
+ "type": "input_text",
62
+ "text": "hi"
63
+ }
64
+ ]
65
+ }
66
+ ],
67
+ "tools": [
68
+ {
69
+ "type": "function",
70
+ "name": "read",
71
+ "description": "r",
72
+ "parameters": {
73
+ "type": "object",
74
+ "properties": {}
75
+ },
76
+ "strict": false
77
+ },
78
+ {
79
+ "type": "tool_search",
80
+ "execution": "client",
81
+ "description": "l",
82
+ "parameters": {
83
+ "type": "object",
84
+ "properties": {}
85
+ }
86
+ }
87
+ ],
88
+ "tool_choice": "auto",
89
+ "parallel_tool_calls": true,
90
+ "reasoning": {
91
+ "effort": "high",
92
+ "summary": "auto"
93
+ },
94
+ "store": false,
95
+ "stream": true,
96
+ "include": [
97
+ "reasoning.encrypted_content"
98
+ ],
99
+ "prompt_cache_key": "mixdog-openai-23e138e99281d0cc66",
100
+ "text": {
101
+ "verbosity": "low"
102
+ }
103
+ },
104
+ "openai|gpt-5.6-sol": {
105
+ "model": "gpt-5.6-sol",
106
+ "instructions": "Sys",
107
+ "input": [
108
+ {
109
+ "role": "user",
110
+ "content": [
111
+ {
112
+ "type": "input_text",
113
+ "text": "hi"
114
+ }
115
+ ]
116
+ }
117
+ ],
118
+ "tools": [
119
+ {
120
+ "type": "function",
121
+ "name": "read",
122
+ "description": "r",
123
+ "parameters": {
124
+ "type": "object",
125
+ "properties": {}
126
+ },
127
+ "strict": false
128
+ },
129
+ {
130
+ "type": "tool_search",
131
+ "execution": "client",
132
+ "description": "l",
133
+ "parameters": {
134
+ "type": "object",
135
+ "properties": {}
136
+ }
137
+ }
138
+ ],
139
+ "tool_choice": "auto",
140
+ "parallel_tool_calls": true,
141
+ "reasoning": {
142
+ "effort": "high",
143
+ "summary": "auto"
144
+ },
145
+ "store": false,
146
+ "stream": true,
147
+ "include": [
148
+ "reasoning.encrypted_content"
149
+ ],
150
+ "prompt_cache_key": "mixdog-openai-b61ada2751af9f3cdc",
151
+ "text": {
152
+ "verbosity": "low"
153
+ }
154
+ },
155
+ "openai-oauth|gpt-5.5": {
156
+ "model": "gpt-5.5",
157
+ "instructions": "Sys",
158
+ "input": [
159
+ {
160
+ "type": "message",
161
+ "role": "user",
162
+ "content": [
163
+ {
164
+ "type": "input_text",
165
+ "text": "hi"
166
+ }
167
+ ],
168
+ "internal_chat_message_metadata_passthrough": {}
169
+ }
170
+ ],
171
+ "tools": [
172
+ {
173
+ "type": "function",
174
+ "name": "read",
175
+ "description": "r",
176
+ "parameters": {
177
+ "type": "object",
178
+ "properties": {}
179
+ },
180
+ "strict": false
181
+ },
182
+ {
183
+ "type": "tool_search",
184
+ "execution": "client",
185
+ "description": "l",
186
+ "parameters": {
187
+ "type": "object",
188
+ "properties": {}
189
+ }
190
+ }
191
+ ],
192
+ "tool_choice": "auto",
193
+ "parallel_tool_calls": true,
194
+ "reasoning": {
195
+ "effort": "high",
196
+ "summary": "auto"
197
+ },
198
+ "store": false,
199
+ "stream": true,
200
+ "stream_options": {
201
+ "reasoning_summary_delivery": "sequential_cutoff"
202
+ },
203
+ "include": [
204
+ "reasoning.encrypted_content"
205
+ ],
206
+ "prompt_cache_key": "parity",
207
+ "text": {
208
+ "verbosity": "low"
209
+ }
210
+ },
211
+ "openai-oauth|gpt-5.4": {
212
+ "model": "gpt-5.4",
213
+ "instructions": "Sys",
214
+ "input": [
215
+ {
216
+ "type": "message",
217
+ "role": "user",
218
+ "content": [
219
+ {
220
+ "type": "input_text",
221
+ "text": "hi"
222
+ }
223
+ ],
224
+ "internal_chat_message_metadata_passthrough": {}
225
+ }
226
+ ],
227
+ "tools": [
228
+ {
229
+ "type": "function",
230
+ "name": "read",
231
+ "description": "r",
232
+ "parameters": {
233
+ "type": "object",
234
+ "properties": {}
235
+ },
236
+ "strict": false
237
+ },
238
+ {
239
+ "type": "tool_search",
240
+ "execution": "client",
241
+ "description": "l",
242
+ "parameters": {
243
+ "type": "object",
244
+ "properties": {}
245
+ }
246
+ }
247
+ ],
248
+ "tool_choice": "auto",
249
+ "parallel_tool_calls": true,
250
+ "reasoning": {
251
+ "effort": "high",
252
+ "summary": "auto"
253
+ },
254
+ "store": false,
255
+ "stream": true,
256
+ "stream_options": {
257
+ "reasoning_summary_delivery": "sequential_cutoff"
258
+ },
259
+ "include": [
260
+ "reasoning.encrypted_content"
261
+ ],
262
+ "prompt_cache_key": "parity",
263
+ "text": {
264
+ "verbosity": "low"
265
+ }
266
+ },
267
+ "openai-oauth|gpt-5.6-sol": {
268
+ "model": "gpt-5.6-sol",
269
+ "instructions": "Sys",
270
+ "input": [
271
+ {
272
+ "type": "message",
273
+ "role": "user",
274
+ "content": [
275
+ {
276
+ "type": "input_text",
277
+ "text": "hi"
278
+ }
279
+ ],
280
+ "internal_chat_message_metadata_passthrough": {}
281
+ }
282
+ ],
283
+ "tools": [
284
+ {
285
+ "type": "function",
286
+ "name": "read",
287
+ "description": "r",
288
+ "parameters": {
289
+ "type": "object",
290
+ "properties": {}
291
+ },
292
+ "strict": false
293
+ },
294
+ {
295
+ "type": "tool_search",
296
+ "execution": "client",
297
+ "description": "l",
298
+ "parameters": {
299
+ "type": "object",
300
+ "properties": {}
301
+ }
302
+ }
303
+ ],
304
+ "tool_choice": "auto",
305
+ "parallel_tool_calls": true,
306
+ "reasoning": {
307
+ "effort": "high",
308
+ "summary": "auto"
309
+ },
310
+ "store": false,
311
+ "stream": true,
312
+ "stream_options": {
313
+ "reasoning_summary_delivery": "sequential_cutoff"
314
+ },
315
+ "include": [
316
+ "reasoning.encrypted_content"
317
+ ],
318
+ "prompt_cache_key": "parity",
319
+ "text": {
320
+ "verbosity": "low"
321
+ }
322
+ }
323
+ }
@@ -3,14 +3,22 @@ import { projectEffortConfiguration } from './effort-configuration.mjs';
3
3
  import { convertMessagesToResponsesInput } from './openai-responses-input.mjs';
4
4
  export { convertMessagesToResponsesInput } from './openai-responses-input.mjs';
5
5
  import { buildStableProviderPromptCacheKey, resolveProviderPromptCacheLane } from '../agent-runtime/cache-strategy.mjs';
6
+ import { acceptedWireTools } from './lib/claude-bridge-schema.mjs';
6
7
  import { isResponsesFreeformTool, toResponsesCustomTool } from './custom-tool-wire.mjs';
7
8
  import { _envFlag } from './openai-oauth-http-sse.mjs';
8
9
  import { findCachedCodexModel } from './openai-oauth-catalog.mjs';
9
10
  import { resolveOpenAiServiceTier } from './openai-service-tier.mjs';
11
+ import {
12
+ openAiPublicSupportsReasoning,
13
+ openAiPublicSupportsToolSearch,
14
+ openAiPublicSupportsVerbosity,
15
+ } from './openai-model-capabilities.mjs';
10
16
  import { daybreakAccessPrograms } from '../../../shared/llm/openai-daybreak.mjs';
11
17
 
12
- export function toOpenAIResponsesTool(t) {
13
- if (t?.name === 'load_tool' || t?.name === 'tool_search') {
18
+ // `nativeToolSearch: false` (public API models before gpt-5.4) keeps load_tool
19
+ // a plain function tool instead of the native tool_search tool.
20
+ export function toOpenAIResponsesTool(t, { nativeToolSearch = true } = {}) {
21
+ if (nativeToolSearch && (t?.name === 'load_tool' || t?.name === 'tool_search')) {
14
22
  return {
15
23
  type: 'tool_search',
16
24
  execution: 'client',
@@ -95,8 +103,8 @@ function environmentContextItem(environmentText, promptCacheProvider) {
95
103
  };
96
104
  }
97
105
 
98
- function responsesInclude(opts) {
99
- const include = ['reasoning.encrypted_content'];
106
+ function responsesInclude(opts, reasoningCapable) {
107
+ const include = reasoningCapable ? ['reasoning.encrypted_content'] : [];
100
108
  for (const item of Array.isArray(opts.nativeInclude) ? opts.nativeInclude : []) {
101
109
  const value = String(item || '').trim();
102
110
  if (value && !include.includes(value)) include.push(value);
@@ -106,16 +114,24 @@ function responsesInclude(opts) {
106
114
 
107
115
  // `nativeTools` are server-hosted Responses tools (for example web_search)
108
116
  // and must be passed through without wrapping them as function tools.
109
- function responsesToolsList(tools, opts) {
110
- const functionTools = tools?.length ? tools.map(toOpenAIResponsesTool) : [];
117
+ function responsesToolsList(tools, opts, nativeToolSearch) {
118
+ // Freeform tools go out as grammar (no JSON schema); every other `parameters`
119
+ // must be a valid 2020-12 object schema -- lowered when it is not, left out
120
+ // and reported when it still is not.
121
+ const sendable = tools?.length
122
+ ? acceptedWireTools(tools, 'openai', opts.onToolExcluded, `[${opts.promptCacheProvider || 'openai-oauth'}] tool`, isResponsesFreeformTool)
123
+ : [];
124
+ const functionTools = sendable.map((t) => toOpenAIResponsesTool(t, { nativeToolSearch }));
111
125
  const nativeTools = Array.isArray(opts.nativeTools) ? opts.nativeTools.filter((t) => t && typeof t === 'object') : [];
112
126
  return functionTools.length || nativeTools.length ? [...nativeTools, ...functionTools] : null;
113
127
  }
114
128
 
115
- function requestedMaxOutputTokens(opts) {
129
+ // The public API honors an explicit caller limit; the OAuth/Codex backend only
130
+ // receives it behind MIXDOG_OPENAI_OAUTH_SEND_MAX_OUTPUT_TOKENS.
131
+ function requestedMaxOutputTokens(opts, promptCacheProvider) {
116
132
  const maxOutputTokens = Number(opts.maxOutputTokens ?? opts.outputTokens ?? opts.max_output_tokens);
117
133
  const send =
118
- _envFlag('MIXDOG_OPENAI_OAUTH_SEND_MAX_OUTPUT_TOKENS', false) &&
134
+ (promptCacheProvider === 'openai' || _envFlag('MIXDOG_OPENAI_OAUTH_SEND_MAX_OUTPUT_TOKENS', false)) &&
119
135
  Number.isFinite(maxOutputTokens) &&
120
136
  maxOutputTokens > 0;
121
137
  return send ? Math.floor(maxOutputTokens) : null;
@@ -149,6 +165,11 @@ function replaysEncryptedReasoning(opts, promptCacheProvider) {
149
165
  // WIRE-VERIFIED (40 response.create captures, 2026-07-03): the wire
150
166
  // carries reasoning as {"effort":"..."} with NO summary field on gpt-5.5.
151
167
  function responsesReasoningFields(model, effortProjection, opts, promptCacheProvider) {
168
+ // Public API models without reasoning get no reasoning field at all; the
169
+ // Codex route keeps its defaults.
170
+ if (promptCacheProvider === 'openai' && !openAiPublicSupportsReasoning(model)) {
171
+ return { reasoning: null, streamOptions: null };
172
+ }
152
173
  const supportsReasoningSummary = _codexModelSupportsReasoningSummaries(model);
153
174
  return {
154
175
  reasoning: {
@@ -197,29 +218,36 @@ export function buildRequestBody(messages, model, tools, sendOpts) {
197
218
  const opts = sendOpts || {};
198
219
  const promptCacheProvider = opts.promptCacheProvider || 'openai-oauth';
199
220
  const effortProjection = projectEffortConfiguration(messages, promptCacheProvider, model, opts);
221
+ // Public API capability gates per model (openai-model-capabilities.mjs);
222
+ // the Codex route keeps its own defaults.
223
+ const publicApi = promptCacheProvider === 'openai';
224
+ const reasoningCapable = !publicApi || openAiPublicSupportsReasoning(model);
225
+ const nativeToolSearch = !publicApi || openAiPublicSupportsToolSearch(model);
200
226
  const input = convertMessagesToResponsesInput(messages, {
201
227
  effortProjection,
202
228
  providerState: opts.providerState,
203
229
  model,
204
230
  nativeToolSearchProvider: promptCacheProvider,
205
- replayEncryptedReasoning: replaysEncryptedReasoning(opts, promptCacheProvider),
231
+ nativeToolSearch,
232
+ replayEncryptedReasoning: reasoningCapable && replaysEncryptedReasoning(opts, promptCacheProvider),
206
233
  codexWireParity: promptCacheProvider === 'openai-oauth',
207
234
  });
208
235
  if (environmentText) input.unshift(environmentContextItem(environmentText, promptCacheProvider));
209
236
  const { reasoning, streamOptions } = responsesReasoningFields(model, effortProjection, opts, promptCacheProvider);
210
237
  const serviceTier = requestedServiceTier(model, opts);
211
- const maxOutputTokens = requestedMaxOutputTokens(opts);
238
+ const maxOutputTokens = requestedMaxOutputTokens(opts, promptCacheProvider);
212
239
  const toolChoice = opts.toolChoice || 'auto';
213
- const toolsList = responsesToolsList(tools, opts);
240
+ const toolsList = responsesToolsList(tools, opts, nativeToolSearch);
241
+ const include = responsesInclude(opts, reasoningCapable);
214
242
  const promptCacheKey = responsesPromptCacheKey(promptCacheProvider, opts, {
215
243
  model,
216
244
  instructions,
217
245
  toolsList,
218
- effort: reasoning.effort,
246
+ effort: reasoning ? reasoning.effort : undefined,
219
247
  serviceTier,
220
248
  toolChoice,
221
249
  });
222
- const verbosity = requestedVerbosity(opts);
250
+ const verbosity = !publicApi || openAiPublicSupportsVerbosity(model) ? requestedVerbosity(opts) : null;
223
251
  // Daybreak Blue rides on the ChatGPT route only, and only for a model that
224
252
  // accepts it; the server still decides entitlement.
225
253
  const accessPrograms =
@@ -245,14 +273,14 @@ export function buildRequestBody(messages, model, tools, sendOpts) {
245
273
  ...(toolsList ? { tools: toolsList } : {}),
246
274
  tool_choice: toolChoice,
247
275
  parallel_tool_calls: true,
248
- reasoning,
276
+ ...(reasoning ? { reasoning } : {}),
249
277
  store: process.env.MIXDOG_OAI_STORE === 'true',
250
278
  stream: true,
251
279
  ...(streamOptions ? { stream_options: streamOptions } : {}),
252
- include: responsesInclude(opts),
280
+ ...(include.length ? { include } : {}),
253
281
  ...(serviceTier ? { service_tier: serviceTier } : {}),
254
282
  prompt_cache_key: promptCacheKey,
255
- text: { verbosity },
283
+ ...(verbosity ? { text: { verbosity } } : {}),
256
284
  ...(accessPrograms ? { access_programs: accessPrograms } : {}),
257
285
  ...(maxOutputTokens ? { max_output_tokens: maxOutputTokens } : {}),
258
286
  };