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
@@ -9,8 +9,30 @@ import {
9
9
  isCustomToolCallRecord,
10
10
  nativeToolSearchCallInput,
11
11
  nativeToolSearchOutputInput,
12
+ toolCallNamespace,
12
13
  } from './custom-tool-wire.mjs';
13
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
+
14
36
  /**
15
37
  * One tool result → its wire item. Which item depends on how the call was
16
38
  * lowered: a custom tool answers with custom_tool_call_output, a native
@@ -18,16 +40,13 @@ import {
18
40
  * media, since that item carries no text field), everything else with
19
41
  * function_call_output.
20
42
  */
21
- function pushToolResult(
22
- m,
23
- { out, pendingToolMedia, pendingToolLoads, customToolCallNameById, nativeSearchCalls, opts }
24
- ) {
25
- const { output, mediaContent } = splitToolContentForOpenAIResponses(m.content);
26
- 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).
27
47
  out.push({
28
48
  type: 'custom_tool_call_output',
29
49
  call_id: m.toolCallId || '',
30
- name: customToolCallNameById.get(m.toolCallId || '') || undefined,
31
50
  output,
32
51
  });
33
52
  if (mediaContent) pendingToolMedia.push(...mediaContent);
@@ -54,7 +73,8 @@ function pushToolResult(
54
73
  // A function result (e.g. Skill) cannot carry schemas. Tools it already
55
74
  // loaded ride a runtime load_tool pair emitted after the batch's outputs;
56
75
  // only a result from another native family falls back to a load hint.
57
- const loadedNames = (m.nativeToolSearch?.openaiTools || []).map((tool) => tool.name);
76
+ const loadedNames =
77
+ opts.nativeToolSearch === false ? [] : (m.nativeToolSearch?.openaiTools || []).map((tool) => tool.name);
58
78
  const loadOutput = loadedNames.length
59
79
  ? nativeToolSearchOutputInput(m, opts.nativeToolSearchProvider || 'openai-oauth')
60
80
  : null;
@@ -85,18 +105,21 @@ function pushToolResult(
85
105
  * lowered as a custom tool or a native search call so the matching result
86
106
  * lowers the same way.
87
107
  */
88
- function pushAssistantToolCalls(toolCalls, { out, customToolCallNameById, nativeSearchCalls }) {
108
+ function pushAssistantToolCalls(toolCalls, { out, customToolCallIds, nativeSearchCalls, nativeToolSearch }) {
89
109
  for (const tc of toolCalls) {
90
- 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;
91
113
  if (nativeSearchCall) {
92
114
  nativeSearchCalls.set(tc.id, nativeSearchCall);
93
115
  out.push(nativeSearchCall);
94
116
  } else if (isCustomToolCallRecord(tc)) {
95
- if (tc.id) customToolCallNameById.set(tc.id, tc.name || '');
117
+ if (tc.id) customToolCallIds.add(tc.id);
96
118
  out.push({
97
119
  type: 'custom_tool_call',
98
120
  call_id: tc.id,
99
121
  name: tc.name,
122
+ ...namespaceField(tc),
100
123
  input: customToolInputFromArguments(tc.name, tc.arguments),
101
124
  });
102
125
  } else {
@@ -104,20 +127,41 @@ function pushAssistantToolCalls(toolCalls, { out, customToolCallNameById, native
104
127
  type: 'function_call',
105
128
  call_id: tc.id,
106
129
  name: tc.name === 'tool_search' ? 'load_tool' : tc.name,
130
+ ...namespaceField(tc),
107
131
  arguments: JSON.stringify(tc.arguments),
108
132
  });
109
133
  }
110
134
  }
111
135
  }
112
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
+ */
113
150
  export function convertMessagesToResponsesInput(messages, opts = {}) {
114
151
  const out = [];
115
152
  const pendingToolMedia = [];
116
153
  const pendingToolLoads = [];
117
- const customToolCallNameById = new Map();
154
+ const customToolCallIds = new Set();
118
155
  const nativeSearchCalls = new Map();
119
156
  const replayEncryptedReasoning = opts.replayEncryptedReasoning === true;
120
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 });
121
165
  const wireMessage = (role, content, phase) => ({
122
166
  ...(wireParity ? { type: 'message' } : {}),
123
167
  role,
@@ -158,11 +202,12 @@ export function convertMessagesToResponsesInput(messages, opts = {}) {
158
202
  out.push(wireMessage('user', pendingToolMedia.splice(0)));
159
203
  };
160
204
  const effortUpdates = responsesEffortUpdates(opts.effortProjection);
161
- for (const m of messages) {
162
- if (!m || m.role === 'system') continue;
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;
163
208
  const updates = effortUpdates.before(m);
164
209
  if (m.role === 'tool') {
165
- pushToolResult(m, { out, pendingToolMedia, pendingToolLoads, customToolCallNameById, nativeSearchCalls, opts });
210
+ pushToolResult(m, { out, pendingToolMedia, pendingToolLoads, customToolCallIds, nativeSearchCalls, opts });
166
211
  continue;
167
212
  }
168
213
  flushToolMedia();
@@ -171,14 +216,14 @@ export function convertMessagesToResponsesInput(messages, opts = {}) {
171
216
  // reasoning is explicitly disabled. Never replay another provider's data.
172
217
  const orderedReplay =
173
218
  m.role === 'assistant'
174
- ? providerReplayItems(m, 'openai-responses')?.filter(
175
- (item) => replayEncryptedReasoning || item?.type !== 'reasoning'
176
- )
219
+ ? providerReplayItems(m, replayOwner)?.filter((item) => replayOwnedReasoning || item?.type !== 'reasoning')
177
220
  : undefined;
178
221
  if (orderedReplay?.length) {
179
- for (const item of orderedReplay) {
222
+ for (const replayItem of orderedReplay) {
223
+ const item = nativeToolSearch ? replayItem : withoutNativeToolSearch(replayItem);
224
+ if (!item) continue;
180
225
  if (item?.type === 'custom_tool_call' && item.call_id) {
181
- customToolCallNameById.set(item.call_id, item.name || '');
226
+ customToolCallIds.add(item.call_id);
182
227
  }
183
228
  if (item?.type === 'tool_search_call' && item.call_id) {
184
229
  nativeSearchCalls.set(item.call_id, item);
@@ -187,27 +232,29 @@ export function convertMessagesToResponsesInput(messages, opts = {}) {
187
232
  }
188
233
  continue;
189
234
  }
235
+ if (opts.reasoningByMessageIndex?.has(messageIndex)) out.push(...opts.reasoningByMessageIndex.get(messageIndex));
190
236
  pushReasoningItems(m, 'before');
191
237
  if (m.role === 'assistant' && Array.isArray(m.toolCalls) && m.toolCalls.length) {
192
238
  // Legacy sessions may have only flattened messages and reasoning.
193
239
  if (m.content)
194
240
  out.push(
195
- wireMessage('assistant', normalizeContentForOpenAIResponses(m.content, { role: 'assistant' }), m.phase)
241
+ wireMessage('assistant', normalizeContentForOpenAIResponses(m.content, contentOpts('assistant')), m.phase)
196
242
  );
197
243
  pushReasoningItems(m, 'after');
198
- pushAssistantToolCalls(m.toolCalls, { out, customToolCallNameById, nativeSearchCalls });
244
+ pushAssistantToolCalls(m.toolCalls, { out, customToolCallIds, nativeSearchCalls, nativeToolSearch });
199
245
  continue;
200
246
  }
201
247
  out.push(
202
248
  wireMessage(
203
- m.role === 'assistant' ? 'assistant' : 'user',
204
- 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)),
205
251
  m.phase
206
252
  )
207
253
  );
208
254
  pushReasoningItems(m, 'after');
209
255
  }
210
256
  flushToolMedia();
257
+ if (opts.reasoningByMessageIndex?.has(messages.length)) out.push(...opts.reasoningByMessageIndex.get(messages.length));
211
258
  out.push(...effortUpdates.end());
212
259
  // Wire-level pairing guard: replay envelopes can carry a call whose
213
260
  // result never committed (cancel/abort). The provider hard-rejects the
@@ -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
  };