mixdog 1.2.2 → 1.2.4

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 (692) hide show
  1. package/README.md +18 -0
  2. package/package.json +2 -1
  3. package/scripts/gate-local.mjs +6 -4
  4. package/scripts/lib/gate-scheduler.mjs +29 -11
  5. package/scripts/probe-provider-catalog.mjs +31 -0
  6. package/scripts/provider-pingpong-live.mjs +599 -0
  7. package/scripts/session-sweep.mjs +5 -25
  8. package/src/agents/advisor/AGENT.md +1 -1
  9. package/src/agents/advisor/agent.json +1 -1
  10. package/src/agents/maintainer/AGENT.md +1 -1
  11. package/src/agents/maintainer/agent.json +1 -1
  12. package/src/agents/reviewer/AGENT.md +2 -4
  13. package/src/agents/security/AGENT.md +1 -2
  14. package/src/agents/writer/AGENT.md +2 -3
  15. package/src/defaults/shipped-history.json +11 -1
  16. package/src/defaults/skills/image/SKILL.md +21 -23
  17. package/src/defaults/skills/setup/SKILL.md +6 -1
  18. package/src/defaults/skills/setup/references/actions.md +44 -22
  19. package/src/defaults/skills/setup/references/surfaces.md +10 -8
  20. package/src/headless-exec.mjs +15 -8
  21. package/src/lib/keychain-cjs.cjs +20 -15
  22. package/src/output-styles/common.md +11 -10
  23. package/src/rules/agent/AGENT.md +6 -4
  24. package/src/rules/lead/LEAD.md +7 -9
  25. package/src/rules/shared/45-destructive.md +4 -0
  26. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/preset.mjs +1 -0
  27. package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +28 -7
  28. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +2 -11
  29. package/src/runtime/agent/orchestrator/agent-trace-io.mjs +92 -61
  30. package/src/runtime/agent/orchestrator/cache-mtime.mjs +10 -1
  31. package/src/runtime/agent/orchestrator/config-providers-merge.mjs +7 -0
  32. package/src/runtime/agent/orchestrator/config.mjs +5 -0
  33. package/src/runtime/agent/orchestrator/context/collect.mjs +1 -0
  34. package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +26 -7
  35. package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +112 -7
  36. package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +101 -23
  37. package/src/runtime/agent/orchestrator/providers/account-pool.mjs +2 -0
  38. package/src/runtime/agent/orchestrator/providers/anthropic-api-key-fetch.mjs +36 -0
  39. package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +48 -20
  40. package/src/runtime/agent/orchestrator/providers/anthropic-error-contract.mjs +3 -1
  41. package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens.mjs +24 -17
  42. package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +9 -9
  43. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
  44. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/gzip-post.mjs +26 -44
  45. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +31 -15
  46. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-blocks.mjs +20 -1
  47. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-delta.mjs +15 -2
  48. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-start.mjs +11 -4
  49. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/message-events.mjs +3 -0
  50. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events.mjs +12 -5
  51. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-outcome.mjs +1 -0
  52. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-state.mjs +14 -0
  53. package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +2 -0
  54. package/src/runtime/agent/orchestrator/providers/anthropic-turn-result.mjs +9 -0
  55. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +10 -0
  56. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-catalog.mjs +41 -12
  57. package/src/runtime/agent/orchestrator/providers/antigravity-oauth.mjs +13 -1
  58. package/src/runtime/agent/orchestrator/providers/antigravity-request.mjs +131 -9
  59. package/src/runtime/agent/orchestrator/providers/antigravity-response.mjs +29 -10
  60. package/src/runtime/agent/orchestrator/providers/antigravity-retry-policy.mjs +125 -8
  61. package/src/runtime/agent/orchestrator/providers/antigravity-stream.mjs +12 -62
  62. package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +117 -41
  63. package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +1 -1
  64. package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +117 -72
  65. package/src/runtime/agent/orchestrator/providers/compat-request-policy.mjs +78 -2
  66. package/src/runtime/agent/orchestrator/providers/cursor-auth.mjs +39 -5
  67. package/src/runtime/agent/orchestrator/providers/cursor-client-version.mjs +1 -1
  68. package/src/runtime/agent/orchestrator/providers/cursor-native-context.mjs +48 -0
  69. package/src/runtime/agent/orchestrator/providers/cursor-wire-exec.mjs +144 -34
  70. package/src/runtime/agent/orchestrator/providers/cursor-wire-protobuf.mjs +28 -4
  71. package/src/runtime/agent/orchestrator/providers/cursor-wire-request.mjs +8 -4
  72. package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-bridge.mjs +42 -11
  73. package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-messages.mjs +109 -6
  74. package/src/runtime/agent/orchestrator/providers/cursor-wire.mjs +17 -4
  75. package/src/runtime/agent/orchestrator/providers/cursor.mjs +22 -2
  76. package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +73 -7
  77. package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +75 -6
  78. package/src/runtime/agent/orchestrator/providers/custom-reasoning.mjs +34 -7
  79. package/src/runtime/agent/orchestrator/providers/custom-tool-wire.mjs +32 -6
  80. package/src/runtime/agent/orchestrator/providers/deepseek.mjs +67 -0
  81. package/src/runtime/agent/orchestrator/providers/effort-configuration.mjs +29 -5
  82. package/src/runtime/agent/orchestrator/providers/gemini-cache-policy.mjs +11 -4
  83. package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +36 -13
  84. package/src/runtime/agent/orchestrator/providers/gemini-error-contract.mjs +101 -11
  85. package/src/runtime/agent/orchestrator/providers/gemini-request-body.mjs +41 -5
  86. package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +1 -0
  87. package/src/runtime/agent/orchestrator/providers/gemini-rest-stream/watchdogs.mjs +16 -5
  88. package/src/runtime/agent/orchestrator/providers/gemini-retry-policy.mjs +19 -14
  89. package/src/runtime/agent/orchestrator/providers/gemini-schema.mjs +371 -41
  90. package/src/runtime/agent/orchestrator/providers/gemini-sdk-request.mjs +1 -2
  91. package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +97 -49
  92. package/src/runtime/agent/orchestrator/providers/gemini-thinking.mjs +81 -10
  93. package/src/runtime/agent/orchestrator/providers/gemini.mjs +35 -8
  94. package/src/runtime/agent/orchestrator/providers/grok-client-version.mjs +1 -1
  95. package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +1 -0
  96. package/src/runtime/agent/orchestrator/providers/lib/action-input-contract.mjs +60 -0
  97. package/src/runtime/agent/orchestrator/providers/lib/anthropic-native-blocks.mjs +1 -0
  98. package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +253 -42
  99. package/src/runtime/agent/orchestrator/providers/lib/anthropic-server-tool-usage.mjs +18 -0
  100. package/src/runtime/agent/orchestrator/providers/lib/anthropic-system-blocks.mjs +27 -6
  101. package/src/runtime/agent/orchestrator/providers/lib/claude-bridge-schema.mjs +392 -0
  102. package/src/runtime/agent/orchestrator/providers/lib/inclusive-usage.mjs +54 -0
  103. package/src/runtime/agent/orchestrator/providers/lib/origin-bound-fetch.mjs +16 -0
  104. package/src/runtime/agent/orchestrator/providers/lib/request-compression.mjs +86 -0
  105. package/src/runtime/agent/orchestrator/providers/lib/responses-terminal-fields.mjs +11 -0
  106. package/src/runtime/agent/orchestrator/providers/lib/usage-primitives.mjs +8 -0
  107. package/src/runtime/agent/orchestrator/providers/lib/wire-pairing.mjs +50 -22
  108. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +133 -21
  109. package/src/runtime/agent/orchestrator/providers/mimo-oauth-profile.mjs +13 -15
  110. package/src/runtime/agent/orchestrator/providers/mimo-oauth.mjs +7 -1
  111. package/src/runtime/agent/orchestrator/providers/model-proxy-channel.d.mts +1 -1
  112. package/src/runtime/agent/orchestrator/providers/model-proxy-channel.mjs +1 -0
  113. package/src/runtime/agent/orchestrator/providers/model-proxy-provider.mjs +92 -16
  114. package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +13 -13
  115. package/src/runtime/agent/orchestrator/providers/openai-codex-metadata.mjs +2 -0
  116. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +133 -62
  117. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/chunk-events.mjs +35 -14
  118. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-result.mjs +5 -2
  119. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +39 -7
  120. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/tool-call-acc.mjs +2 -9
  121. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream.mjs +5 -0
  122. package/src/runtime/agent/orchestrator/providers/openai-compat-error-contract.mjs +1 -1
  123. package/src/runtime/agent/orchestrator/providers/openai-compat-models.mjs +84 -2
  124. package/src/runtime/agent/orchestrator/providers/openai-compat-options.mjs +47 -25
  125. package/src/runtime/agent/orchestrator/providers/openai-compat-presets.mjs +5 -1
  126. package/src/runtime/agent/orchestrator/providers/openai-compat-reasoning-field.mjs +155 -0
  127. package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +40 -24
  128. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-events.mjs +63 -25
  129. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-head-parity.json +2901 -0
  130. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-parity.fixtures.mjs +183 -0
  131. package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +87 -6
  132. package/src/runtime/agent/orchestrator/providers/openai-compat-retry-profile.mjs +51 -3
  133. package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +7 -1
  134. package/src/runtime/agent/orchestrator/providers/openai-compat-trace.mjs +2 -0
  135. package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +103 -26
  136. package/src/runtime/agent/orchestrator/providers/openai-compat-xai-send.mjs +23 -4
  137. package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +11 -6
  138. package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +17 -2
  139. package/src/runtime/agent/orchestrator/providers/openai-direct-request.mjs +15 -23
  140. package/src/runtime/agent/orchestrator/providers/openai-http-sse-request.mjs +64 -52
  141. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/output-items.mjs +23 -10
  142. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/terminal-frames.mjs +28 -5
  143. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events.mjs +10 -0
  144. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-items.mjs +18 -7
  145. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-outcome.mjs +4 -0
  146. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-state.mjs +5 -0
  147. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/text-relay.mjs +9 -1
  148. package/src/runtime/agent/orchestrator/providers/openai-model-capabilities.mjs +80 -0
  149. package/src/runtime/agent/orchestrator/providers/openai-oauth-dispatch.mjs +3 -1
  150. package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +7 -0
  151. package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +7 -1
  152. package/src/runtime/agent/orchestrator/providers/openai-responses-input.mjs +72 -24
  153. package/src/runtime/agent/orchestrator/providers/openai-responses-payload-parity.fixture.json +323 -0
  154. package/src/runtime/agent/orchestrator/providers/openai-responses-payload.mjs +50 -16
  155. package/src/runtime/agent/orchestrator/providers/openai-ws-delta.mjs +7 -19
  156. package/src/runtime/agent/orchestrator/providers/openai-ws-response-state/refusals.mjs +60 -0
  157. package/src/runtime/agent/orchestrator/providers/openai-ws-response-state/tool-calls.mjs +51 -36
  158. package/src/runtime/agent/orchestrator/providers/openai-ws-response-state.mjs +30 -0
  159. package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +12 -0
  160. package/src/runtime/agent/orchestrator/providers/openai-ws-stream/terminal-frames.mjs +25 -6
  161. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +18 -9
  162. package/src/runtime/agent/orchestrator/providers/opencode-go-gemini.mjs +181 -0
  163. package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +78 -70
  164. package/src/runtime/agent/orchestrator/providers/openrouter.mjs +74 -0
  165. package/src/runtime/agent/orchestrator/providers/provider-error-kind.mjs +150 -10
  166. package/src/runtime/agent/orchestrator/providers/registry.mjs +13 -2
  167. package/src/runtime/agent/orchestrator/providers/retry-classification.mjs +7 -1
  168. package/src/runtime/agent/orchestrator/providers/transport-scope.d.mts +6 -0
  169. package/src/runtime/agent/orchestrator/providers/transport-scope.mjs +28 -0
  170. package/src/runtime/agent/orchestrator/providers/wire-gateway.mjs +164 -0
  171. package/src/runtime/agent/orchestrator/providers/wire-route.mjs +522 -0
  172. package/src/runtime/agent/orchestrator/providers/xai-tool-search-head-parity.json +1131 -0
  173. package/src/runtime/agent/orchestrator/providers/xai-tool-search.fixtures.mjs +195 -0
  174. package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +104 -0
  175. package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +8 -6
  176. package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-availability.mjs +24 -0
  177. package/src/runtime/agent/orchestrator/runtime-core/effort.mjs +15 -0
  178. package/src/runtime/agent/orchestrator/runtime-core/goal-store.mjs +30 -2
  179. package/src/runtime/agent/orchestrator/runtime-core/goal-turns.mjs +3 -2
  180. package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +8 -3
  181. package/src/runtime/agent/orchestrator/runtime-core/provider-request-snapshot.mjs +7 -3
  182. package/src/runtime/agent/orchestrator/runtime-core/session-title.mjs +21 -1
  183. package/src/runtime/agent/orchestrator/runtime-core/skill-tool-loading.mjs +16 -3
  184. package/src/runtime/agent/orchestrator/runtime-core/tool-bridge-contract.mjs +6 -0
  185. package/src/runtime/agent/orchestrator/runtime-core/tool-bridge.mjs +526 -0
  186. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-data.mjs +3 -0
  187. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-schema.mjs +10 -7
  188. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +178 -71
  189. package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +102 -12
  190. package/src/runtime/agent/orchestrator/runtime-core/tool-exposure.mjs +96 -0
  191. package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +10 -8
  192. package/src/runtime/agent/orchestrator/session/agent-loop.mjs +1 -2
  193. package/src/runtime/agent/orchestrator/session/agent-pool-progress.mjs +24 -0
  194. package/src/runtime/agent/orchestrator/session/cache/tool-result-reuse.mjs +10 -2
  195. package/src/runtime/agent/orchestrator/session/catalog-db/index.mjs +2 -3
  196. package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +5 -11
  197. package/src/runtime/agent/orchestrator/session/catalog-db/worker.mjs +6 -22
  198. package/src/runtime/agent/orchestrator/session/compact/constants.mjs +3 -2
  199. package/src/runtime/agent/orchestrator/session/compact/messages.mjs +16 -93
  200. package/src/runtime/agent/orchestrator/session/compact/runner.mjs +16 -2
  201. package/src/runtime/agent/orchestrator/session/compact/summary-anchor.mjs +5 -0
  202. package/src/runtime/agent/orchestrator/session/compact/user-message-kind.mjs +148 -0
  203. package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +1 -1
  204. package/src/runtime/agent/orchestrator/session/context-tool-schema.mjs +17 -2
  205. package/src/runtime/agent/orchestrator/session/context-utils.mjs +8 -4
  206. package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +0 -6
  207. package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +0 -6
  208. package/src/runtime/agent/orchestrator/session/eager-dispatch/admission.mjs +3 -2
  209. package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +6 -1
  210. package/src/runtime/agent/orchestrator/session/historical-session-closure.mjs +10 -0
  211. package/src/runtime/agent/orchestrator/session/loop/assistant-commit.mjs +2 -5
  212. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +89 -1
  213. package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +1 -1
  214. package/src/runtime/agent/orchestrator/session/loop/context-overflow.mjs +56 -0
  215. package/src/runtime/agent/orchestrator/session/loop/deferred-call-through.mjs +18 -8
  216. package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +1 -27
  217. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/output-limit.mjs +1 -1
  218. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/segments.mjs +4 -10
  219. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +2 -9
  220. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +24 -10
  221. package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +135 -0
  222. package/src/runtime/agent/orchestrator/session/loop/request-boundary.mjs +31 -4
  223. package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +76 -0
  224. package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +67 -20
  225. package/src/runtime/agent/orchestrator/session/loop/step-auto-effort.mjs +10 -10
  226. package/src/runtime/agent/orchestrator/session/loop/tool-call-resolution.mjs +95 -0
  227. package/src/runtime/agent/orchestrator/session/loop/tool-classify.mjs +6 -0
  228. package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +30 -3
  229. package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +29 -5
  230. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +15 -1
  231. package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +147 -0
  232. package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +7 -5
  233. package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +33 -3
  234. package/src/runtime/agent/orchestrator/session/manager/ask-support.mjs +0 -4
  235. package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +23 -2
  236. package/src/runtime/agent/orchestrator/session/manager/ask-turn-commit.mjs +34 -12
  237. package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +54 -13
  238. package/src/runtime/agent/orchestrator/session/manager/ask-turn-failure.mjs +33 -0
  239. package/src/runtime/agent/orchestrator/session/manager/ask-turn-loop-options.mjs +57 -25
  240. package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +11 -0
  241. package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +22 -0
  242. package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +57 -13
  243. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +8 -0
  244. package/src/runtime/agent/orchestrator/session/manager/failed-turn-rewind.mjs +16 -0
  245. package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +6 -120
  246. package/src/runtime/agent/orchestrator/session/manager/pending-persist-queue.mjs +1 -1
  247. package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +231 -16
  248. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +42 -49
  249. package/src/runtime/agent/orchestrator/session/manager/runtime-state.mjs +50 -0
  250. package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +47 -17
  251. package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +26 -4
  252. package/src/runtime/agent/orchestrator/session/manager/session-fallback-title.mjs +82 -0
  253. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +36 -35
  254. package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +29 -13
  255. package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +6 -3
  256. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +4 -1
  257. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-recovery.mjs +45 -0
  258. package/src/runtime/agent/orchestrator/session/manager.mjs +4 -10
  259. package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +6 -0
  260. package/src/runtime/agent/orchestrator/session/send-instrumentation.mjs +2 -1
  261. package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +17 -1
  262. package/src/runtime/agent/orchestrator/session/side-question-store.mjs +96 -0
  263. package/src/runtime/agent/orchestrator/session/side-question.mjs +197 -0
  264. package/src/runtime/agent/orchestrator/session/store/lifecycle-barriers.mjs +22 -15
  265. package/src/runtime/agent/orchestrator/session/store/lifecycle-read.mjs +1 -1
  266. package/src/runtime/agent/orchestrator/session/store/listing.mjs +2 -6
  267. package/src/runtime/agent/orchestrator/session/store/live-cache-eviction.mjs +1 -1
  268. package/src/runtime/agent/orchestrator/session/store/live-state.mjs +23 -0
  269. package/src/runtime/agent/orchestrator/session/store/liveness-veto.mjs +46 -37
  270. package/src/runtime/agent/orchestrator/session/store/load-cache.mjs +1 -1
  271. package/src/runtime/agent/orchestrator/session/store/load-session.mjs +1 -1
  272. package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +44 -37
  273. package/src/runtime/agent/orchestrator/session/store/session-observers.mjs +4 -2
  274. package/src/runtime/agent/orchestrator/session/store/session-paths.mjs +59 -0
  275. package/src/runtime/agent/orchestrator/session/store/summary-cache.mjs +1 -1
  276. package/src/runtime/agent/orchestrator/session/store/sweep/stale-sweep.mjs +1 -1
  277. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-finish.mjs +27 -21
  278. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-plan.mjs +0 -8
  279. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-record.mjs +6 -18
  280. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-row.mjs +33 -106
  281. package/src/runtime/agent/orchestrator/session/store/write-admission.mjs +4 -2
  282. package/src/runtime/agent/orchestrator/session/store-agent-worker-pool.mjs +5 -8
  283. package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +136 -196
  284. package/src/runtime/agent/orchestrator/session/store-summary-archived-agent.mjs +34 -15
  285. package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +53 -115
  286. package/src/runtime/agent/orchestrator/session/store-summary-fields.mjs +8 -0
  287. package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +10 -1
  288. package/src/runtime/agent/orchestrator/session/store-summary-locations.mjs +3 -29
  289. package/src/runtime/agent/orchestrator/session/store-summary-reader-catalog-fixture.mjs +1 -1
  290. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +17 -10
  291. package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +9 -20
  292. package/src/runtime/agent/orchestrator/session/store.mjs +22 -19
  293. package/src/runtime/agent/orchestrator/session/tool-batch/execute-call.mjs +12 -12
  294. package/src/runtime/agent/orchestrator/session/tool-batch/finalize.mjs +38 -14
  295. package/src/runtime/agent/orchestrator/session/tool-batch/pre-dispatch.mjs +15 -4
  296. package/src/runtime/agent/orchestrator/session/tool-batch/record-outcome.mjs +1 -1
  297. package/src/runtime/agent/orchestrator/session/tool-batch/state.mjs +7 -1
  298. package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +4 -0
  299. package/src/runtime/agent/orchestrator/session/tool-schema-rejection.mjs +79 -0
  300. package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +72 -15
  301. package/src/runtime/agent/orchestrator/session/turn-failure.mjs +45 -0
  302. package/src/runtime/agent/orchestrator/stall-policy.mjs +50 -0
  303. package/src/runtime/agent/orchestrator/tools/bash-policy-scan.mjs +8 -2
  304. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/command-preflight.mjs +3 -3
  305. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +5 -1
  306. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/inline-hoist.mjs +6 -2
  307. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +4 -1
  308. package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +218 -20
  309. package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +160 -39
  310. package/src/runtime/agent/orchestrator/tools/builtin/git-partial-stage.mjs +7 -5
  311. package/src/runtime/agent/orchestrator/tools/builtin/grep-formatting.mjs +14 -5
  312. package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-context-expander.mjs +4 -3
  313. package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-output.mjs +2 -1
  314. package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-path-fanout.mjs +48 -44
  315. package/src/runtime/agent/orchestrator/tools/builtin/lib/search-input-helpers.mjs +10 -3
  316. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +247 -49
  317. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-task-output.mjs +5 -4
  318. package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +6 -1
  319. package/src/runtime/agent/orchestrator/tools/builtin/runtime-capabilities.mjs +23 -1
  320. package/src/runtime/agent/orchestrator/tools/builtin/shell-analysis.mjs +20 -0
  321. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +101 -2
  322. package/src/runtime/agent/orchestrator/tools/code-graph/dispatch/root-resolution.mjs +1 -1
  323. package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +1 -1
  324. package/src/runtime/agent/orchestrator/tools/code-graph-prewarm-worker.mjs +1 -1
  325. package/src/runtime/agent/orchestrator/tools/lib/owned-shell-trees.mjs +67 -0
  326. package/src/runtime/agent/orchestrator/tools/lib/process-table-fixture.mjs +50 -0
  327. package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +303 -63
  328. package/src/runtime/agent/orchestrator/tools/lib/shell-run-background/promote-job.mjs +2 -0
  329. package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +108 -18
  330. package/src/runtime/agent/orchestrator/tools/lib/shell-run-spawn.mjs +77 -11
  331. package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +81 -5
  332. package/src/runtime/agent/orchestrator/tools/patch/ui-diff.mjs +73 -39
  333. package/src/runtime/agent/orchestrator/tools/progress-message.mjs +18 -1
  334. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +7 -4
  335. package/src/runtime/agent/orchestrator/tools/shell-exec-policy.mjs +88 -12
  336. package/src/runtime/agent/orchestrator/tools/shell-policy.mjs +2 -0
  337. package/src/runtime/attachments/store.d.mts +9 -0
  338. package/src/runtime/attachments/store.mjs +80 -9
  339. package/src/runtime/browser-bridge/browser-action-contract.d.mts +0 -1
  340. package/src/runtime/browser-bridge/browser-action-contract.mjs +0 -2
  341. package/src/runtime/computer-bridge/action-schema.mjs +219 -196
  342. package/src/runtime/computer-bridge/linux-readiness.d.mts +0 -2
  343. package/src/runtime/computer-bridge/linux-readiness.mjs +0 -16
  344. package/src/runtime/effort-judge/judge-client.mjs +21 -4
  345. package/src/runtime/effort-judge/judge-worker.mjs +4 -1
  346. package/src/runtime/github/tool.mjs +208 -17
  347. package/src/runtime/media/adapters/codex-image.mjs +140 -21
  348. package/src/runtime/media/catalog.mjs +4 -4
  349. package/src/runtime/media/chatgpt-usage.mjs +55 -0
  350. package/src/runtime/media/defaults.mjs +37 -0
  351. package/src/runtime/media/jobs.mjs +12 -2
  352. package/src/runtime/media/lanes.mjs +12 -0
  353. package/src/runtime/media/tool-defs.mjs +15 -4
  354. package/src/runtime/media/tool.mjs +41 -12
  355. package/src/runtime/media/upstream-error.mjs +72 -6
  356. package/src/runtime/memory/index.mjs +1 -0
  357. package/src/runtime/memory/lib/http-router/ingest-routes.mjs +22 -1
  358. package/src/runtime/memory/lib/ingest/transcript-offsets.mjs +2 -0
  359. package/src/runtime/memory/lib/ingest/transcript-rows.mjs +1 -0
  360. package/src/runtime/memory/lib/pg/adapter.mjs +98 -1
  361. package/src/runtime/memory/lib/pg/process.mjs +36 -33
  362. package/src/runtime/memory/lib/pg/run-child.mjs +49 -0
  363. package/src/runtime/memory/lib/pg/supervisor.mjs +112 -4
  364. package/src/runtime/memory/lib/runtime-fetcher.mjs +12 -13
  365. package/src/runtime/memory/lib/transcript-ingest.mjs +14 -0
  366. package/src/runtime/office/README.md +1 -1
  367. package/src/runtime/office/authoring/docx-html-runner.mjs +1 -1
  368. package/src/runtime/office/authoring/html-browser.mjs +18 -8
  369. package/src/runtime/office/authoring/html-document-author.mjs +2 -0
  370. package/src/runtime/office/authoring/pdf-html-runner.mjs +1 -1
  371. package/src/runtime/office/authoring/pptx-contact-sheet.mjs +2 -0
  372. package/src/runtime/office/authoring/pptx-html-measure.mjs +3 -1
  373. package/src/runtime/office/authoring/pptx-html-runner.mjs +2 -0
  374. package/src/runtime/office/authoring/xlsx-html-runner.mjs +3 -1
  375. package/src/runtime/office/core/office-actions-read.mjs +3 -0
  376. package/src/runtime/office/core/office-render-preview.mjs +2 -0
  377. package/src/runtime/office/core/office-session-dispatch.mjs +7 -0
  378. package/src/runtime/office/core/office-sessionless-actions.mjs +8 -0
  379. package/src/runtime/office/core/office-sessions.mjs +5 -0
  380. package/src/runtime/office/core/office-transactions.mjs +3 -0
  381. package/src/runtime/office/core/office-write-ledger.mjs +94 -0
  382. package/src/runtime/office/design/library/templates/mixdog-executive.mixdog-edit.pptx +0 -0
  383. package/src/runtime/office/index.mjs +29 -0
  384. package/src/runtime/office/pdf/pdf-analysis.mjs +0 -68
  385. package/src/runtime/office/pdf/pdf-edit-document.mjs +2 -0
  386. package/src/runtime/office/pdf/pdf-render.mjs +23 -7
  387. package/src/runtime/office/pdf/pdf-security.mjs +2 -0
  388. package/src/runtime/office/portable/portable-opc.mjs +4 -1
  389. package/src/runtime/office/quality/visual-diff.mjs +2 -0
  390. package/src/runtime/session-search/session-search-ingest.mjs +1 -1
  391. package/src/runtime/shared/agent-reap-state.mjs +13 -0
  392. package/src/runtime/shared/atomic-file.d.mts +1 -1
  393. package/src/runtime/shared/background-tasks.mjs +6 -1
  394. package/src/runtime/shared/bounded-file-read.mjs +13 -0
  395. package/src/runtime/shared/bounded-line-diff.mjs +191 -0
  396. package/src/runtime/shared/browser-launch.mjs +15 -0
  397. package/src/runtime/shared/buffered-appender.mjs +18 -0
  398. package/src/runtime/shared/config.mjs +78 -18
  399. package/src/runtime/shared/err-text.mjs +48 -4
  400. package/src/runtime/shared/file-lock.mjs +6 -5
  401. package/src/runtime/shared/file-permissions.d.mts +6 -1
  402. package/src/runtime/shared/file-permissions.mjs +54 -6
  403. package/src/runtime/shared/llm/anthropic-betas.mjs +1 -2
  404. package/src/runtime/shared/llm/anthropic-effort.mjs +6 -0
  405. package/src/runtime/shared/llm/provider-model-identities.mjs +1 -0
  406. package/src/runtime/shared/llm/usage-accounting.mjs +5 -2
  407. package/src/runtime/shared/llm/usage-ledger-rollup.mjs +3 -0
  408. package/src/runtime/shared/loopback-listener.mjs +9 -0
  409. package/src/runtime/shared/model-route-chain.d.mts +8 -0
  410. package/src/runtime/shared/model-route-chain.mjs +48 -0
  411. package/src/runtime/shared/model-route-fallback.mjs +22 -0
  412. package/src/runtime/shared/pid-liveness.mjs +12 -0
  413. package/src/runtime/shared/provider-api-key.mjs +8 -0
  414. package/src/runtime/shared/provider-timeout-phase.mjs +17 -0
  415. package/src/runtime/shared/quiet-progress.d.mts +35 -0
  416. package/src/runtime/shared/quiet-progress.mjs +101 -0
  417. package/src/runtime/shared/quota-resume-store.mjs +32 -1
  418. package/src/runtime/shared/read-row-numbers.mjs +44 -0
  419. package/src/runtime/shared/remote-intent.mjs +2 -42
  420. package/src/runtime/shared/review-diff.mjs +52 -0
  421. package/src/runtime/shared/session-sidebar-host.d.mts +4 -0
  422. package/src/runtime/shared/session-sidebar-host.mjs +38 -0
  423. package/src/runtime/shared/slow-span.mjs +121 -0
  424. package/src/runtime/shared/statusline/statusline-segments.mjs +52 -6
  425. package/src/runtime/shared/tool-card-model/card-header.mjs +7 -1
  426. package/src/runtime/shared/tool-card-model/generic-detail.mjs +39 -5
  427. package/src/runtime/shared/tool-card-model.mjs +5 -2
  428. package/src/runtime/shared/tool-output-budget.mjs +2 -0
  429. package/src/runtime/shared/tool-output-limit.mjs +4 -0
  430. package/src/runtime/shared/tool-primitives.mjs +13 -0
  431. package/src/runtime/shared/tool-result-summary.mjs +22 -1
  432. package/src/runtime/shared/tool-status.mjs +3 -2
  433. package/src/runtime/shared/tool-surface.mjs +20 -6
  434. package/src/runtime/shared/tool-work-units.mjs +54 -11
  435. package/src/runtime/shared/transcript-metadata.mjs +49 -1
  436. package/src/runtime/shared/transcript-turn-keys.mjs +33 -0
  437. package/src/runtime/shared/transcript-writer/purge.mjs +74 -0
  438. package/src/runtime/shared/transcript-writer/transcript-file.mjs +10 -1
  439. package/src/runtime/shared/transcript-writer.mjs +24 -6
  440. package/src/runtime/shared/turn-changes.mjs +269 -100
  441. package/src/runtime/shared/turn-review-reply.mjs +8 -39
  442. package/src/runtime/shared/turn-snapshot-store.mjs +19 -108
  443. package/src/runtime/shared/turn-snapshot.mjs +865 -683
  444. package/src/runtime/shared/turn-worktree-snapshot.mjs +183 -255
  445. package/src/runtime/shared/user-data-guard.mjs +262 -49
  446. package/src/runtime/shared/worktrees/activity-gate.mjs +175 -0
  447. package/src/runtime/shared/worktrees/branch-management.mjs +179 -0
  448. package/src/runtime/shared/worktrees/carry.mjs +533 -0
  449. package/src/runtime/shared/worktrees/contract.mjs +60 -0
  450. package/src/runtime/shared/worktrees/dependencies.mjs +456 -0
  451. package/src/runtime/shared/worktrees/file-recovery.mjs +84 -0
  452. package/src/runtime/shared/worktrees/git-head.mjs +214 -0
  453. package/src/runtime/shared/worktrees/git.mjs +8 -3
  454. package/src/runtime/shared/worktrees/include.mjs +125 -7
  455. package/src/runtime/shared/worktrees/lock.mjs +1 -1
  456. package/src/runtime/shared/worktrees/maintenance.mjs +20 -2
  457. package/src/runtime/shared/worktrees/manager.mjs +525 -31
  458. package/src/runtime/shared/worktrees/merge.mjs +31 -21
  459. package/src/runtime/shared/worktrees/owner.mjs +2 -1
  460. package/src/runtime/shared/worktrees/paths.d.mts +6 -0
  461. package/src/runtime/shared/worktrees/preparation-report.mjs +79 -0
  462. package/src/runtime/shared/worktrees/setup-commands.mjs +232 -0
  463. package/src/runtime/shared/worktrees/workspace-visibility.mjs +17 -0
  464. package/src/runtime/terminal-bridge/client.mjs +57 -20
  465. package/src/runtime/terminal-bridge/tool-defs.mjs +13 -6
  466. package/src/runtime/tidy/apply.mjs +47 -2
  467. package/src/runtime/tidy/run-engines.mjs +11 -5
  468. package/src/session-runtime/agent-tool-routing.mjs +19 -13
  469. package/src/session-runtime/boot/apis.mjs +20 -6
  470. package/src/session-runtime/boot/config.mjs +2 -0
  471. package/src/session-runtime/boot/facade.mjs +4 -0
  472. package/src/session-runtime/boot/infrastructure.mjs +6 -1
  473. package/src/session-runtime/boot/session.mjs +3 -3
  474. package/src/session-runtime/boot/tools.mjs +7 -1
  475. package/src/session-runtime/conversation-import/service.mjs +1 -1
  476. package/src/session-runtime/cwd-plugins/cwd-apply.mjs +12 -5
  477. package/src/session-runtime/goal-facade-api.mjs +2 -2
  478. package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +91 -0
  479. package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +3 -1
  480. package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +15 -5
  481. package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +137 -26
  482. package/src/session-runtime/internal-tool-executor.mjs +8 -2
  483. package/src/session-runtime/lifecycle/cold-heir.mjs +187 -0
  484. package/src/session-runtime/lifecycle/inheritance.mjs +71 -27
  485. package/src/session-runtime/lifecycle/session-catalog.mjs +25 -18
  486. package/src/session-runtime/lifecycle/session-switch/resume.mjs +6 -0
  487. package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +36 -48
  488. package/src/session-runtime/lifecycle/session-switch.mjs +1 -1
  489. package/src/session-runtime/lifecycle/shared.mjs +5 -6
  490. package/src/session-runtime/lifecycle/teardown/session-close.mjs +6 -5
  491. package/src/session-runtime/lifecycle/teardown.mjs +70 -14
  492. package/src/session-runtime/lifecycle-api.mjs +1 -0
  493. package/src/session-runtime/mcp-glue/connect.mjs +17 -5
  494. package/src/session-runtime/media-api.mjs +8 -0
  495. package/src/session-runtime/model-route/route-ownership.mjs +60 -0
  496. package/src/session-runtime/model-route/route-persist.mjs +3 -2
  497. package/src/session-runtime/model-route/set-route.mjs +116 -36
  498. package/src/session-runtime/model-route/web-search-route.mjs +7 -2
  499. package/src/session-runtime/model-route-api.mjs +4 -2
  500. package/src/session-runtime/native-web-search/routes.mjs +37 -24
  501. package/src/session-runtime/native-web-search-usage.mjs +51 -0
  502. package/src/session-runtime/native-web-search.mjs +19 -9
  503. package/src/session-runtime/new-session-config.mjs +4 -2
  504. package/src/session-runtime/provider-auth/login.mjs +4 -0
  505. package/src/session-runtime/provider-auth/setup.mjs +4 -0
  506. package/src/session-runtime/provider-models/catalog-load.mjs +9 -0
  507. package/src/session-runtime/provider-models/web-search-catalog.mjs +23 -3
  508. package/src/session-runtime/provider-models.mjs +1 -0
  509. package/src/session-runtime/provider-usage.mjs +4 -0
  510. package/src/session-runtime/resource-scope-decorate.mjs +10 -3
  511. package/src/session-runtime/route-resolution.mjs +3 -1
  512. package/src/session-runtime/runtime-core.mjs +4 -0
  513. package/src/session-runtime/runtime-facade.mjs +6 -0
  514. package/src/session-runtime/runtime-review-api.mjs +8 -2
  515. package/src/session-runtime/services/agent-task-status.mjs +2 -0
  516. package/src/session-runtime/services/agent-tool/close-flow/close-all.mjs +0 -3
  517. package/src/session-runtime/services/agent-tool/close-flow.mjs +6 -7
  518. package/src/session-runtime/services/agent-tool/execute-send.mjs +2 -2
  519. package/src/session-runtime/services/agent-tool/execute-spawn.mjs +36 -3
  520. package/src/session-runtime/services/agent-tool/execute.mjs +9 -1
  521. package/src/session-runtime/services/agent-tool/helpers.mjs +30 -7
  522. package/src/session-runtime/services/agent-tool/index-write-queue.mjs +81 -20
  523. package/src/session-runtime/services/agent-tool/job-task-reconcile.mjs +7 -2
  524. package/src/session-runtime/services/agent-tool/job-views/session-progress.mjs +6 -3
  525. package/src/session-runtime/services/agent-tool/lead-worker-index/forgotten-leads.mjs +29 -0
  526. package/src/session-runtime/services/agent-tool/lead-worker-index/index-file.mjs +1 -1
  527. package/src/session-runtime/services/agent-tool/lead-worker-index/lead-rows.mjs +3 -4
  528. package/src/session-runtime/services/agent-tool/lead-worker-index/reap-timers.mjs +9 -3
  529. package/src/session-runtime/services/agent-tool/lead-worker-index/row-settlement.mjs +7 -18
  530. package/src/session-runtime/services/agent-tool/lead-worker-index.mjs +82 -13
  531. package/src/session-runtime/services/agent-tool/model-select.mjs +82 -0
  532. package/src/session-runtime/services/agent-tool/send-flow.mjs +24 -6
  533. package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +3 -1
  534. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +19 -5
  535. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +5 -4
  536. package/src/session-runtime/services/agent-tool/spawn-flow.mjs +2 -1
  537. package/src/session-runtime/services/agent-tool/spawn-preset.mjs +3 -0
  538. package/src/session-runtime/services/agent-tool/tag-registry/tag-lookup.mjs +1 -3
  539. package/src/session-runtime/services/agent-tool/tag-registry/tag-refresh.mjs +1 -3
  540. package/src/session-runtime/services/agent-tool/tag-registry.mjs +18 -10
  541. package/src/session-runtime/services/agent-tool/terminal-reaper/scan-admission.mjs +8 -41
  542. package/src/session-runtime/services/agent-tool/terminal-reaper/stale-rows.mjs +3 -3
  543. package/src/session-runtime/services/agent-tool/terminal-reaper.mjs +6 -23
  544. package/src/session-runtime/services/agent-tool/terminal-trace.mjs +0 -1
  545. package/src/session-runtime/services/agent-tool/tool-def.mjs +7 -0
  546. package/src/session-runtime/services/agent-tool/worker-index/row-liveness.mjs +32 -20
  547. package/src/session-runtime/services/agent-tool/worker-index/row-shape.mjs +5 -2
  548. package/src/session-runtime/services/agent-tool/worker-index/row-store.mjs +10 -1
  549. package/src/session-runtime/services/agent-tool/worker-index.mjs +74 -15
  550. package/src/session-runtime/services/agent-tool.mjs +7 -0
  551. package/src/session-runtime/services/agent-watchdog-registry.mjs +2 -0
  552. package/src/session-runtime/services/channel-admin.mjs +19 -3
  553. package/src/session-runtime/services/memory-runtime-proxy/calls.mjs +4 -0
  554. package/src/session-runtime/services/memory-runtime-proxy.mjs +1 -0
  555. package/src/session-runtime/services/provider-admin.mjs +158 -15
  556. package/src/session-runtime/session-create/session-options.mjs +7 -5
  557. package/src/session-runtime/session-create/session-start-hook.mjs +2 -1
  558. package/src/session-runtime/session-transcript-purge.mjs +32 -0
  559. package/src/session-runtime/session-transcript.mjs +4 -5
  560. package/src/session-runtime/session-turn-api.mjs +17 -14
  561. package/src/session-runtime/settings-builtin-tools-api.mjs +18 -6
  562. package/src/session-runtime/setup-tool/executor.mjs +57 -9
  563. package/src/session-runtime/setup-tool/extended-actions.mjs +86 -6
  564. package/src/session-runtime/setup-tool/settings-contract.mjs +18 -3
  565. package/src/session-runtime/setup-tool/tool-defs.mjs +25 -4
  566. package/src/session-runtime/skills-api.mjs +3 -5
  567. package/src/session-runtime/tool-policy-refresh.mjs +83 -32
  568. package/src/session-runtime/tool-surface.mjs +5 -1
  569. package/src/session-runtime/turn/agent-ops.mjs +49 -2
  570. package/src/session-runtime/turn/compaction-gate.mjs +25 -0
  571. package/src/session-runtime/turn/session-ops.mjs +7 -5
  572. package/src/session-runtime/turn/side-question-ops.mjs +19 -0
  573. package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +7 -1
  574. package/src/session-runtime/turn/turn-run/turn-prepare.mjs +12 -3
  575. package/src/session-runtime/turn/turn-run/turn-settle.mjs +18 -2
  576. package/src/session-runtime/turn/turn-run/turn-timing.mjs +4 -3
  577. package/src/session-runtime/turn/turn-run.mjs +26 -45
  578. package/src/session-runtime/usage-stats-api.mjs +46 -11
  579. package/src/session-runtime/workflow-agents-api/agent-route.mjs +16 -1
  580. package/src/session-runtime/workspace/admission-gate.mjs +44 -15
  581. package/src/session-runtime/workspace/project-branches.mjs +35 -41
  582. package/src/session-runtime/workspace/transition-steps.mjs +215 -116
  583. package/src/session-runtime/workspace/transitions.mjs +428 -73
  584. package/src/standalone/channel-transport.mjs +3 -4
  585. package/src/standalone/daemon-agent-control.mjs +9 -1
  586. package/src/standalone/daemon-desktop-runtime.mjs +32 -1
  587. package/src/standalone/daemon-local-session-bridge.mjs +14 -1
  588. package/src/standalone/daemon-owner.mjs +17 -4
  589. package/src/standalone/daemon-pg-stop.mjs +49 -0
  590. package/src/standalone/daemon-session-control.mjs +88 -0
  591. package/src/standalone/daemon-stop-budget.d.mts +2 -0
  592. package/src/standalone/daemon-stop-budget.mjs +18 -0
  593. package/src/standalone/daemon-stored-session-views.mjs +25 -3
  594. package/src/standalone/daemon-telemetry.mjs +19 -0
  595. package/src/standalone/daemon.mjs +63 -1
  596. package/src/standalone/desktop-service-registry.mjs +5 -0
  597. package/src/standalone/local-session-runtime.mjs +80 -30
  598. package/src/standalone/session-client.mjs +42 -0
  599. package/src/standalone/session-protocol.mjs +14 -0
  600. package/src/standalone/session-proxy/projection.mjs +41 -4
  601. package/src/standalone/session-runtime-inline-host/boot-loaders.mjs +15 -1
  602. package/src/standalone/session-runtime-inline-host.mjs +3 -0
  603. package/src/standalone/session-service/agent-tree/agent-cancel.mjs +91 -49
  604. package/src/standalone/session-service/agent-tree/agent-child.mjs +19 -1
  605. package/src/standalone/session-service/agent-tree/agent-registry.mjs +25 -0
  606. package/src/standalone/session-service/agent-tree/agent-turns.mjs +9 -1
  607. package/src/standalone/session-service/agent-tree.mjs +28 -2
  608. package/src/standalone/session-service/entries/session-loads.mjs +16 -5
  609. package/src/standalone/session-service/entries.mjs +1 -0
  610. package/src/standalone/session-service/projection/transcript-window.mjs +39 -0
  611. package/src/standalone/session-service/quota-resume.mjs +28 -13
  612. package/src/standalone/session-service/session-calls/session-action.mjs +18 -3
  613. package/src/standalone/session-service/session-calls/session-turns.mjs +17 -6
  614. package/src/standalone/session-service/session-calls/session-views.mjs +6 -0
  615. package/src/standalone/session-service-api.mjs +6 -1
  616. package/src/standalone/session-state-patch.d.mts +2 -1
  617. package/src/standalone/session-state-patch.mjs +41 -1
  618. package/src/standalone/session-tool-output.mjs +82 -0
  619. package/src/tui/App.jsx +25 -0
  620. package/src/tui/app/app-view/floating-panel.jsx +26 -1
  621. package/src/tui/app/app-view.jsx +2 -1
  622. package/src/tui/app/btw-controller.mjs +118 -0
  623. package/src/tui/app/create-app-pickers.mjs +2 -0
  624. package/src/tui/app/provider-setup/provider-items.mjs +8 -0
  625. package/src/tui/app/provider-setup-picker.mjs +15 -3
  626. package/src/tui/app/shell-layout/row-budgets.mjs +11 -1
  627. package/src/tui/app/shell-layout/surfaces.mjs +3 -1
  628. package/src/tui/app/slash-commands.mjs +19 -3
  629. package/src/tui/app/slash-dispatch/session-commands.mjs +68 -6
  630. package/src/tui/app/use-global-key-input/approval-shortcut.mjs +12 -0
  631. package/src/tui/app/use-global-key-input.mjs +5 -12
  632. package/src/tui/app/use-prompt-handlers.mjs +11 -0
  633. package/src/tui/components/BtwPanel.jsx +53 -0
  634. package/src/tui/components/QuestionPanel.jsx +275 -0
  635. package/src/tui/components/Spinner.jsx +4 -0
  636. package/src/tui/components/SpinnerByline.jsx +21 -2
  637. package/src/tui/components/question-panel-model.mjs +156 -0
  638. package/src/tui/components/status-line/local-line.mjs +10 -2
  639. package/src/tui/dist/index.mjs +2897 -1722
  640. package/src/tui/session/active-tool-summary.mjs +1 -1
  641. package/src/tui/session/context-state.mjs +4 -5
  642. package/src/tui/session/goal-continuation/continuation-queue.mjs +2 -3
  643. package/src/tui/session/goal-continuation/deadline-delivery.mjs +4 -2
  644. package/src/tui/session/goal-continuation/session-boundary.mjs +21 -0
  645. package/src/tui/session/quota-resume.mjs +140 -61
  646. package/src/tui/session/session-api/commands.mjs +14 -10
  647. package/src/tui/session/session-api/controls.mjs +14 -2
  648. package/src/tui/session/session-api/integrations.mjs +9 -2
  649. package/src/tui/session/session-api/lifecycle/dispose.mjs +3 -9
  650. package/src/tui/session/session-api/lifecycle/resume.mjs +2 -7
  651. package/src/tui/session/session-api/lifecycle.mjs +14 -11
  652. package/src/tui/session/session-api/media.mjs +2 -0
  653. package/src/tui/session/session-api/routes.mjs +81 -57
  654. package/src/tui/session/session-api/settings.mjs +9 -3
  655. package/src/tui/session/session-api/worktree.mjs +3 -2
  656. package/src/tui/session/session-api.mjs +1 -0
  657. package/src/tui/session/session-flow/auto-clear.mjs +1 -3
  658. package/src/tui/session/session-flow/drain.mjs +6 -4
  659. package/src/tui/session/session-flow/queue/entry-shape.mjs +2 -0
  660. package/src/tui/session/session-flow/queue/take-entries.mjs +2 -1
  661. package/src/tui/session/session-flow/queue.mjs +1 -1
  662. package/src/tui/session/tool-approval.mjs +20 -8
  663. package/src/tui/session/transcript-spill.mjs +14 -7
  664. package/src/tui/session/transcript-store/streaming-tail.mjs +1 -1
  665. package/src/tui/session/tui-steering-persist.mjs +3 -5
  666. package/src/tui/session/turn-quiet.mjs +53 -0
  667. package/src/tui/session/turn-stream.mjs +179 -32
  668. package/src/tui/session/turn.mjs +50 -36
  669. package/src/tui/session/worktree-setup-notice.mjs +38 -0
  670. package/src/tui/spinner-meta.mjs +10 -0
  671. package/src/tui/spinner-verbs.mjs +3 -0
  672. package/src/ui/statusline.mjs +13 -3
  673. package/src/workflows/default/WORKFLOW.md +3 -1
  674. package/src/runtime/agent/orchestrator/providers/model-pricing-rates.mjs +0 -1
  675. package/src/runtime/agent/orchestrator/session/manager/foreign-pending-messages.mjs +0 -346
  676. package/src/runtime/agent/orchestrator/session/manager/session-owner-liveness.mjs +0 -117
  677. package/src/runtime/agent/orchestrator/session/store/paths-heartbeat.mjs +0 -246
  678. package/src/session-runtime/services/agent-tool/terminal-reaper/reap-timers.mjs +0 -142
  679. package/src/session-runtime/turn/share-ops.mjs +0 -77
  680. package/src/tui/session/cross-surface-share.mjs +0 -406
  681. package/src/tui/session/live-share/delta.mjs +0 -153
  682. package/src/tui/session/live-share/mirror.mjs +0 -106
  683. package/src/tui/session/live-share/owner.mjs +0 -254
  684. package/src/tui/session/live-share/retry.mjs +0 -54
  685. package/src/tui/session/live-share/viewer/frame-router.mjs +0 -32
  686. package/src/tui/session/live-share/viewer/pipe-client.mjs +0 -108
  687. package/src/tui/session/live-share/viewer/submit-acks.mjs +0 -65
  688. package/src/tui/session/live-share/viewer/sync-waiters.mjs +0 -53
  689. package/src/tui/session/live-share/viewer.mjs +0 -99
  690. package/src/tui/session/live-share/wire.mjs +0 -44
  691. package/src/tui/session/live-share.mjs +0 -154
  692. package/src/tui/session/shared-dir-watch.mjs +0 -69
@@ -17,8 +17,11 @@ import {
17
17
  } from './media-normalization.mjs';
18
18
  import { customToolCallFromResponseItem, nativeToolSearchCallFromArguments } from './custom-tool-wire.mjs';
19
19
  import { providerReplayItems } from './lib/provider-replay.mjs';
20
+ import { acceptedWireTools } from './lib/claude-bridge-schema.mjs';
20
21
  import { ensureResponsesCallOutputs } from './lib/wire-pairing.mjs';
21
22
  import { responsesEffortUpdates } from './effort-configuration.mjs';
23
+ import { convertMessagesToResponsesInput } from './openai-responses-input.mjs';
24
+ import { COMPAT_REASONING_METADATA_KEY, contentWithThinkingChunk } from './openai-compat-reasoning-field.mjs';
22
25
 
23
26
  function positiveTokenInt(value) {
24
27
  const n = Number(value);
@@ -39,19 +42,23 @@ export function toOpenAIMessages(messages, providerName, options = {}) {
39
42
  // strict providers (xai) reject unknown roles/types and would 400 the
40
43
  // request. Documented in v0.1.160 (GPT reasoning replay).
41
44
  //
42
- // DeepSeek splits by model: thinking-mode models with tools REQUIRE the
43
- // prior turn's `reasoning_content` echoed back (400 without it), while
44
- // `deepseek-reasoner` REJECTS it with a 400. The caller decides per model
45
- // through options.replaysReasoningContent — see
46
- // deepseekReplaysReasoningContent below. xAI reasoning models preserve
47
- // their official multi-turn shape and cache prefix stability when prior
48
- // assistant reasoning_content is replayed; reasoning_effort itself remains
49
- // caller/user-selected.
45
+ // DeepSeek thinking-mode models with tools REQUIRE the prior turn's
46
+ // `reasoning_content` echoed back (400 without it); without tools it is
47
+ // ignored, so the caller (options.replaysReasoningContent) always replays it.
48
+ // xAI reasoning models preserve their official multi-turn shape and cache
49
+ // prefix stability when prior assistant reasoning_content is replayed;
50
+ // reasoning_effort itself remains caller/user-selected.
50
51
  //
51
52
  // Custom providers pass options.customReplay (custom-reasoning.mjs replay
52
53
  // eligibility). When it is a boolean it alone decides; a replaying custom
53
54
  // endpoint also needs a non-empty reasoning_content on every assistant
54
55
  // tool-call turn, so missing/empty reasoning there is padded with " ".
56
+ //
57
+ // options.reasoningShape (openai-compat-reasoning-field.mjs) names the
58
+ // endpoint families with their own reasoning fields; they decide the resend
59
+ // key and win over the flags above. options.developerRole keeps the
60
+ // `developer` role for endpoints that document it; every other chat endpoint
61
+ // only knows `system`, so developer instructions go out as system messages.
55
62
  const customReplay = typeof options.customReplay === 'boolean' ? options.customReplay : null;
56
63
  const replaysReasoningContent = customReplay ?? (options.replaysReasoningContent === true || providerName === 'xai');
57
64
  const out = [];
@@ -62,8 +69,25 @@ export function toOpenAIMessages(messages, providerName, options = {}) {
62
69
  const details = metadata?.reasoning_details ?? metadata?.reasoningDetails;
63
70
  return Array.isArray(details) && details.length ? details : null;
64
71
  };
72
+ const shape = options.reasoningShape || null;
73
+ // Receive and resend fields differ per endpoint family: the key a reply's
74
+ // reasoning arrived on is recorded in providerMetadata at receive time.
75
+ const receivedField = (message) => message?.providerMetadata?.[COMPAT_REASONING_METADATA_KEY]?.reasoningField;
76
+ const attachShapeReasoning = (msg, message, stored) => {
77
+ if (!stored) return;
78
+ if (shape.resend === 'same_key') {
79
+ msg[receivedField(message) === 'reasoning' ? 'reasoning' : 'reasoning_content'] = stored;
80
+ } else if (shape.resend === 'reasoning') {
81
+ // OpenRouter: reasoning_details replace the text when present.
82
+ if (!openRouterReasoningDetails(message)) msg.reasoning = stored;
83
+ } else if (shape.resend === 'content_chunks' && receivedField(message) === 'content_chunks') {
84
+ msg.content = contentWithThinkingChunk(msg.content, stored);
85
+ }
86
+ };
65
87
  const attachAssistantReasoning = (msg, message) => {
66
- if (customReplay) {
88
+ if (shape) {
89
+ attachShapeReasoning(msg, message, typeof message.reasoningContent === 'string' ? message.reasoningContent : '');
90
+ } else if (customReplay) {
67
91
  const stored = typeof message.reasoningContent === 'string' ? message.reasoningContent : '';
68
92
  if (stored) msg.reasoning_content = stored;
69
93
  else if (Array.isArray(msg.tool_calls) && msg.tool_calls.length) msg.reasoning_content = ' ';
@@ -104,8 +128,12 @@ export function toOpenAIMessages(messages, providerName, options = {}) {
104
128
  continue;
105
129
  }
106
130
  const msg = {
107
- role: m.role,
108
- content: normalizeContentForOpenAIChat(m.content, { role: m.role, nativePdf: options.nativePdf }),
131
+ role: m.role === 'developer' && options.developerRole !== true ? 'system' : m.role,
132
+ content: normalizeContentForOpenAIChat(m.content, {
133
+ role: m.role,
134
+ nativePdf: options.nativePdf,
135
+ cacheControl: options.cacheControl === true,
136
+ }),
109
137
  };
110
138
  out.push(m.role === 'assistant' ? attachAssistantReasoning(msg, m) : msg);
111
139
  }
@@ -113,18 +141,6 @@ export function toOpenAIMessages(messages, providerName, options = {}) {
113
141
  return out;
114
142
  }
115
143
 
116
- // deepseek-reasoner returns 400 when `reasoning_content` appears in the input
117
- // messages; every other DeepSeek thinking model needs it back once tools are in
118
- // play. Unknown DeepSeek ids default to replaying: a missing echo breaks the
119
- // tool loop, while a stray field on a non-thinking model is ignored.
120
- export function deepseekReplaysReasoningContent(model) {
121
- return !/reasoner/.test(
122
- String(model || '')
123
- .trim()
124
- .toLowerCase()
125
- );
126
- }
127
-
128
144
  export function toOpenAITools(tools) {
129
145
  return tools.map((t) => ({
130
146
  type: 'function',
@@ -146,9 +162,42 @@ function functionToolFromSessionTool(t, name = t?.name) {
146
162
  };
147
163
  }
148
164
 
149
- export function toResponsesTools(tools, options = {}) {
165
+ // xAI hosts tool search itself (docs.x.ai progressive tool disclosure): a
166
+ // `{type:'tool_search'}` server tool loads the definitions of function tools
167
+ // marked `defer_loading: true`, and the server returns the search as
168
+ // tool_search_call / tool_search_output items. The client loader (`load_tool`)
169
+ // is therefore replaced by that one server tool; with deferred tools but no
170
+ // loader the server tool is still added, or the deferred tools could never load.
171
+ function toServerToolSearchTools(tools) {
172
+ let hasSearch = false;
173
+ let hasDeferred = false;
174
+ const out = tools.map((t) => {
175
+ if (t?.name === 'load_tool' || t?.name === 'tool_search') {
176
+ if (hasSearch) return null;
177
+ hasSearch = true;
178
+ return { type: 'tool_search' };
179
+ }
180
+ if (t?.deferLoading === true || t?.defer_loading === true) {
181
+ hasDeferred = true;
182
+ return { ...functionToolFromSessionTool(t), defer_loading: true };
183
+ }
184
+ return functionToolFromSessionTool(t);
185
+ });
186
+ if (hasDeferred && !hasSearch) out.push({ type: 'tool_search' });
187
+ return out.filter(Boolean);
188
+ }
189
+
190
+ export function toResponsesTools(allTools, options = {}) {
150
191
  const provider = String(options?.provider || '').toLowerCase();
192
+ // A Responses endpoint rejects the whole request for one invalid
193
+ // `parameters`; a tool broken even after lowering is left out and reported.
194
+ const tools = acceptedWireTools(allTools, 'openai', options?.onToolExcluded, `[${provider || 'responses'}] tool`);
195
+ if (options?.serverToolSearch === true) return toServerToolSearchTools(tools);
196
+ // A route pinned with verified native deferred tools declares the native
197
+ // client tool_search tool and marks deferred definitions `defer_loading`.
198
+ const nativeDeferred = options?.nativeDeferredTools === true;
151
199
  const allowNativeToolSearch =
200
+ nativeDeferred ||
152
201
  options?.nativeToolSearch === true ||
153
202
  (options?.nativeToolSearch !== false && (provider === 'openai' || provider === 'openai-oauth'));
154
203
  return tools.map((t) => {
@@ -170,6 +219,9 @@ export function toResponsesTools(tools, options = {}) {
170
219
  // tools (e.g. apply_patch) as ordinary function tools instead. Grammar
171
220
  // tools may carry no usable inputSchema, so fall back to a permissive
172
221
  // object schema so grok still registers a valid function tool.
222
+ if (nativeDeferred && (t?.deferLoading === true || t?.defer_loading === true)) {
223
+ return { ...functionToolFromSessionTool(t), defer_loading: true };
224
+ }
173
225
  return functionToolFromSessionTool(t);
174
226
  });
175
227
  }
@@ -237,7 +289,7 @@ export function parseResponsesToolCalls(response, label) {
237
289
  } else if (item?.type === 'custom_tool_call') {
238
290
  const call = customToolCallFromResponseItem(item);
239
291
  if (call) out.push(call);
240
- } else if (item?.type === 'tool_search_call') {
292
+ } else if (item?.type === 'tool_search_call' && item.execution !== 'server') {
241
293
  const searchArgs =
242
294
  item.arguments && typeof item.arguments === 'object' && !Array.isArray(item.arguments)
243
295
  ? item.arguments
@@ -409,16 +461,41 @@ export function toXaiResponsesInput(messages, providerState, options = {}) {
409
461
  let history = [];
410
462
  if (Array.isArray(state?.encryptedReasoningHistory)) history = state.encryptedReasoningHistory;
411
463
  else if (Array.isArray(state?.encryptedReasoningItems)) {
412
- history = [{ messageIndex: seen, items: state.encryptedReasoningItems }];
464
+ history = [{ messageIndex: seen, items: state.encryptedReasoningItems, owner: state.owner }];
413
465
  }
414
466
  for (const entry of history) {
415
467
  const index = Number(entry?.messageIndex);
416
468
  if (!Number.isInteger(index) || index < 0 || !Array.isArray(entry?.items)) continue;
469
+ // Owner-tagged reasoning (compat routes) never replays under another
470
+ // owner, even when a caller passes provider state across providers.
471
+ if (entry.owner !== undefined && entry.owner !== replayProvider) continue;
417
472
  const bucket = reasoningByMessageIndex.get(index) || [];
418
473
  bucket.push(...entry.items.map((item) => ({ ...item })));
419
474
  reasoningByMessageIndex.set(index, bucket);
420
475
  }
421
476
  }
477
+ if (options.nativeLowering === true) {
478
+ // Native-item-capable Responses routes share the first-party lowering:
479
+ // native tool_search / custom calls keep their own output type, and only
480
+ // this route's own replay tag and reasoning state are replayed.
481
+ return {
482
+ input: convertMessagesToResponsesInput(messages, {
483
+ startIndex,
484
+ includeSystem,
485
+ nativePdf: options.nativePdf,
486
+ replayProvider,
487
+ // Compat-owned tool_search payloads are tagged with the route name.
488
+ nativeToolSearchProvider: options.providerName,
489
+ replayOwnedReasoning: true,
490
+ reasoningByMessageIndex,
491
+ effortProjection: options.effortProjection,
492
+ splitToolContent: (content) => splitToolContentForXaiResponses(content, { nativePdf: options.nativePdf }),
493
+ }),
494
+ previousResponseId,
495
+ startIndex,
496
+ continuationResetReason: resetReason,
497
+ };
498
+ }
422
499
  const pendingToolMedia = [];
423
500
  const flushToolMedia = () => {
424
501
  if (!pendingToolMedia.length) return;
@@ -5,6 +5,7 @@ import { consumeCompatResponsesStream } from './openai-compat-stream.mjs';
5
5
  import { PROVIDER_FIRST_BYTE_TIMEOUT_MS, createPassthroughSignal } from '../stall-policy.mjs';
6
6
  import {
7
7
  nativeResponsesTools,
8
+ resolveCompatMaxOutputTokens,
8
9
  toOpenAIMessages,
9
10
  toResponsesTools,
10
11
  toXaiResponsesInput,
@@ -26,17 +27,34 @@ import { applyCompatToolChoice, compatStreamRetryReporter } from './compat-reque
26
27
  import { envFlag as _envFlag } from '../../../shared/env.mjs';
27
28
  import { resolveResponsesTransportPolicy, RESPONSES_TRANSPORT_CAPABILITIES } from './openai-transport-policy.mjs';
28
29
 
30
+ // Server-side tool search is strictly opt-in, from the provider's own config
31
+ // (`xaiServerToolSearch`, shared by grok-oauth's inner xai provider) or the
32
+ // request opts. Unset, every xAI request body is unchanged: deferred tools go
33
+ // out as plain function tools and the client `load_tool` stays a function.
34
+ // Server-executed search items replay through the owner-tagged providerReplay
35
+ // envelope in either mode and are never dispatched locally.
36
+ function xaiServerToolSearchEnabled(provider, opts) {
37
+ return (opts.xaiServerToolSearch ?? provider.config?.xaiServerToolSearch) === true;
38
+ }
39
+
29
40
  // Tool list, parallel tool calls, tool choice and reasoning effort shared by
30
41
  // the HTTP/SSE and WebSocket Responses bodies.
31
42
  function applyXaiResponsesToolsAndEffort(params, { provider, tools, opts, useModel }) {
32
43
  const nativeTools = nativeResponsesTools(opts);
33
44
  if (tools?.length || nativeTools.length) {
34
- params.tools = [...nativeTools, ...toResponsesTools(tools || [], { provider: 'xai' })];
45
+ const toolOptions = xaiServerToolSearchEnabled(provider, opts)
46
+ ? { provider: 'xai', serverToolSearch: true, onToolExcluded: opts.onToolExcluded }
47
+ : { provider: 'xai', onToolExcluded: opts.onToolExcluded };
48
+ params.tools = [...nativeTools, ...toResponsesTools(tools || [], toolOptions)];
35
49
  }
36
50
  // Explicit parallel tool calls, matching the OpenAI Responses
37
51
  // reference shape. Probe-verified accepted by api.x.ai (HTTP 200,
38
- // 2026-08-16); absent, the service default decides per turn.
39
- if (params.tools?.length) params.parallel_tool_calls = true;
52
+ // 2026-08-16); absent, the service default decides per turn. An explicit
53
+ // caller `parallelToolCalls:false` is honored (docs.x.ai function-calling).
54
+ if (params.tools?.length) params.parallel_tool_calls = opts.parallelToolCalls !== false;
55
+ // Caller output cap (docs.x.ai text best-practices): max_output_tokens.
56
+ const maxOutputTokens = resolveCompatMaxOutputTokens(opts);
57
+ if (maxOutputTokens) params.max_output_tokens = maxOutputTokens;
40
58
  applyCompatToolChoice(params, opts);
41
59
  const reasoningEffort = normalizeXaiReasoningEffort(
42
60
  opts.xaiReasoningEffort ??
@@ -201,7 +219,8 @@ export async function sendXaiResponsesWebSocket(provider, messages, useModel, to
201
219
  onTextDelta: typeof opts.onTextDelta === 'function' ? opts.onTextDelta : null,
202
220
  onStageChange: typeof opts.onStageChange === 'function' ? opts.onStageChange : null,
203
221
  externalSignal: signal,
204
- poolKey: opts.sessionId || opts.session?.id || null,
222
+ // A forked request runs in its own transport scope (transport-scope.mjs).
223
+ poolKey: opts.transportScope || opts.sessionId || opts.session?.id || null,
205
224
  cacheKey: cacheRouting.key,
206
225
  iteration,
207
226
  useModel,
@@ -235,13 +235,18 @@ export function useXaiResponsesApi(opts, config) {
235
235
  }
236
236
 
237
237
  export function useXaiResponsesWebSocket(opts, config) {
238
+ // A pinned route (grok-oauth's cli-chat-proxy) takes its transport from the
239
+ // config alone: the xAI WebSocket connector targets api.x.ai, so no request
240
+ // option or env override may carry the OAuth bearer there.
238
241
  const raw =
239
- opts?.xaiResponsesTransport ??
240
- opts?.xaiTransport ??
241
- config?.responsesTransport ??
242
- config?.transport ??
243
- process.env.MIXDOG_XAI_RESPONSES_TRANSPORT ??
244
- process.env.MIXDOG_XAI_TRANSPORT;
242
+ config?.transportPinned === true
243
+ ? config.responsesTransport
244
+ : (opts?.xaiResponsesTransport ??
245
+ opts?.xaiTransport ??
246
+ config?.responsesTransport ??
247
+ config?.transport ??
248
+ process.env.MIXDOG_XAI_RESPONSES_TRANSPORT ??
249
+ process.env.MIXDOG_XAI_TRANSPORT);
245
250
  // Reference xAI/Grok parity is HTTP/SSE. WebSocket remains available only
246
251
  // when a caller explicitly selects a WS transport.
247
252
  if (raw == null || raw === '') return false;
@@ -15,7 +15,12 @@ import {
15
15
  import { withEffortRejectionFallback } from './effort-rejection.mjs';
16
16
  import { applyCompatErrorContract } from './openai-compat-error-contract.mjs';
17
17
  import { sendCompatResponses } from './openai-compat-responses.mjs';
18
- import { COMPAT_RETRY_POLICY, COMPAT_RETRY_PROFILES, XAI_COMPAT_RETRY_POLICY } from './openai-compat-retry-profile.mjs';
18
+ import {
19
+ COMPAT_RETRY_POLICY,
20
+ COMPAT_RETRY_PROFILES,
21
+ XAI_COMPAT_RETRY_POLICY,
22
+ compatFirstResponseBudget,
23
+ } from './openai-compat-retry-profile.mjs';
19
24
  import { sendCompatChat, recoverCompatNonStreaming } from './openai-compat-chat-send.mjs';
20
25
  import { sendXaiResponses, sendXaiResponsesWebSocket } from './openai-compat-xai-send.mjs';
21
26
  import {
@@ -78,6 +83,9 @@ export class OpenAICompatProvider {
78
83
  this.config = config;
79
84
  this.baseURL = baseURL;
80
85
  this.apiKey = apiKey;
86
+ // Whether Chat content blocks keep their Anthropic-style `cache_control`
87
+ // (OpenRouter documents it); a gateway that does not ignores or rejects it.
88
+ this.chatCacheControl = (config.chatCacheControl ?? preset?.chatCacheControl) === true;
81
89
  // Merge caller-supplied headers (config.extraHeaders) over the preset's.
82
90
  // Used e.g. by grok-oauth to inject the Grok CLI client headers for the
83
91
  // grok-build proxy. Backward-compatible: providers that pass no
@@ -97,6 +105,11 @@ export class OpenAICompatProvider {
97
105
  }
98
106
  }
99
107
  }
108
+ // First-response budget of a chat profile with its own first-byte window;
109
+ // null keeps the agent watchdog default.
110
+ firstResponseBudget() {
111
+ return compatFirstResponseBudget(this.name, this.config?.chatProfile);
112
+ }
100
113
  get _preconnectFn() {
101
114
  return typeof this.config?.preconnectFn === 'function' ? this.config.preconnectFn : preconnect;
102
115
  }
@@ -256,7 +269,9 @@ export class OpenAICompatProvider {
256
269
  return fetchCompatModelItems(this);
257
270
  }
258
271
  async listModels() {
259
- return listCompatModels(this);
272
+ // A failed /models request must surface; an empty list would be cached as
273
+ // a complete catalog by the shared catalog loader.
274
+ return listCompatModels(this, { throwOnError: true });
260
275
  }
261
276
  async isAvailable() {
262
277
  return isCompatProviderAvailable(this);
@@ -1,28 +1,20 @@
1
- import { getModelMetadataSync } from '../../../shared/llm/model-catalog.mjs';
1
+ import {
2
+ openAiCatalogMeta,
3
+ openAiSupportsExtendedRetention,
4
+ openAiUsesPromptCacheOptions,
5
+ } from './openai-model-capabilities.mjs';
2
6
 
3
- // Public Responses contracts are independent of the OAuth backend. Every
4
- // capability here comes from the model catalog (the service-tier price columns
5
- // and the cache-write rate), so a model the catalog lists works without an
6
- // edit. Only a model no catalog describes (cold install) falls back to the
7
- // documented ids known before the catalogs carried these columns.
8
- const SNAPSHOT_SUFFIX = /-\d{4}-\d{2}-\d{2}$/;
7
+ // Public Responses contracts are independent of the OAuth backend. Service
8
+ // tiers come from the model catalog (the service-tier price columns), so a
9
+ // model the catalog lists works without an edit. Only a model no catalog
10
+ // describes (cold install) falls back to the documented ids known before the
11
+ // catalogs carried these columns.
9
12
  const PRE_CATALOG_GPT_56_PLUS =
10
13
  /^(?:gpt-6-(?:astra|sol|luna)|gpt-6\.1-sol|gpt-5\.6-(?:sol|terra|luna))(?:-\d{4}-\d{2}-\d{2})?$/;
11
14
  const PRE_CATALOG_EARLIER_FAST = /^gpt-5\.(?:5|4|4-mini)(?:-\d{4}|$)/;
12
15
  const PRE_CATALOG_ULTRAFAST = /^(?:gpt-6-astra|gpt-6\.1-sol)(?:-\d{4}-\d{2}-\d{2})?$/;
13
16
  const modelId = (model) => String(model?.id || model || '').trim();
14
17
 
15
- // The catalog metadata of one model. A dated snapshot reads as its undated
16
- // alias when only the alias is listed.
17
- function openAiCatalogMeta(model) {
18
- const id = String(model?.id || model || '').trim();
19
- for (const candidate of new Set([id, id.replace(SNAPSHOT_SUFFIX, '')])) {
20
- const meta = candidate ? getModelMetadataSync(candidate, 'openai') : null;
21
- if (meta) return meta;
22
- }
23
- return null;
24
- }
25
-
26
18
  export function openAiDirectSupportsFast(model) {
27
19
  const meta = openAiCatalogMeta(model);
28
20
  // The catalog's declaration (true or false) decides; a published Priority
@@ -40,13 +32,13 @@ export function openAiDirectSupportsUltrafast(model) {
40
32
  return PRE_CATALOG_ULTRAFAST.test(modelId(model));
41
33
  }
42
34
 
43
- // OpenAI bills prompt-cache writes from GPT-5.6 on, and exactly those models
44
- // take prompt_cache_options in place of prompt_cache_retention, so a published
45
- // cache-write rate selects the new form.
46
35
  // https://developers.openai.com/api/docs/guides/prompt-caching
36
+ // GPT-5.6 and later: prompt_cache_options.ttl. Earlier models: 24h
37
+ // prompt_cache_retention only on the documented extended-retention list;
38
+ // every other model gets no lifetime field (never inferred from pricing).
47
39
  function promptCacheForm(model) {
48
- const writeRate = openAiCatalogMeta(model)?.cacheWriteCostPerM > 0;
49
- return writeRate || PRE_CATALOG_GPT_56_PLUS.test(modelId(model)) ? 'options' : 'retention';
40
+ if (openAiUsesPromptCacheOptions(model) || PRE_CATALOG_GPT_56_PLUS.test(modelId(model))) return 'options';
41
+ return openAiSupportsExtendedRetention(model) ? 'retention' : null;
50
42
  }
51
43
 
52
44
  export function applyOpenAIDirectCachePolicy(body, model, storeResponses) {
@@ -6,7 +6,16 @@
6
6
  * Returns an OK response whose body is ready to stream; every failure path
7
7
  * throws with the initial-response markers the retry classifier reads.
8
8
  */
9
+ import { promisify } from 'node:util';
9
10
  import zlib from 'node:zlib';
11
+ import {
12
+ REQ_COMPRESSION_MIN_BYTES,
13
+ compressBody,
14
+ createCompressionLatch,
15
+ hasContentEncoding,
16
+ resendIfEncodingRejected,
17
+ withContentEncoding,
18
+ } from './lib/request-compression.mjs';
10
19
  import { traceAgentFetch } from '../agent-trace.mjs';
11
20
  import { PROVIDER_HTTP_RESPONSE_TIMEOUT_MS, createTimeoutSignal } from '../stall-policy.mjs';
12
21
  import { CODEX_REQUEST_RETRY_BACKOFF_MS, CODEX_RETRY_JITTER_RATIO } from './openai-retry-policy.mjs';
@@ -37,7 +46,6 @@ const OPENAI_REQUEST_RETRY_OPTS = Object.freeze({
37
46
  retryJitterRatio: CODEX_RETRY_JITTER_RATIO,
38
47
  });
39
48
 
40
-
41
49
  // Request-layer retry: 5xx and typed transport
42
50
  // failures only. 408 and 429 are NOT retried here; they surface to the outer
43
51
  // stream-retry layer, which owns their budget and honors Retry-After.
@@ -52,31 +60,29 @@ function isRetryableHttpFailure(err) {
52
60
  }
53
61
  // Request-body zstd gate. Namespace import: on Node runtimes without zlib
54
62
  // zstd bindings the named export would fail at module load, so the call site
55
- // typeof-guards zlib.zstdCompressSync instead.
56
- const OPENAI_REQ_ZSTD_MIN_BYTES = 8 * 1024;
57
- let _openaiReqZstdLatch = false;
58
- function _openaiReqZstdDisabled() {
59
- return _openaiReqZstdLatch || process.env.MIXDOG_OPENAI_REQ_ZSTD === '0';
60
- }
61
- function _disableOpenaiReqZstd() {
62
- _openaiReqZstdLatch = true;
63
- }
64
- function _zstdHeaders(headers, bodyForSend) {
65
- return bodyForSend.encoding ? { ...headers, 'Content-Encoding': bodyForSend.encoding } : headers;
66
- }
63
+ // typeof-guards zlib.zstdCompress instead.
64
+ const _openaiReqZstdLatch = createCompressionLatch('MIXDOG_OPENAI_REQ_ZSTD');
65
+ export const _resetOpenaiReqZstdLatchForTest = _openaiReqZstdLatch.reset;
67
66
 
68
67
  // Request-body zstd: compression is enabled for the codex backend on the
69
68
  // OpenAI provider — the server decompresses Content-Encoding: zstd.
70
- // openai-direct is excluded: only the codex backend is verified. Env
71
- // kill-switch plus a process-wide latch flipped on the first 400 seen on
72
- // a compressed request, which then replays that attempt uncompressed.
73
- function encodeRequestBody(auth, rawBytes) {
74
- return auth?.type !== 'openai-direct' &&
75
- !_openaiReqZstdDisabled() &&
76
- typeof zlib.zstdCompressSync === 'function' &&
77
- rawBytes.length >= OPENAI_REQ_ZSTD_MIN_BYTES
78
- ? { bytes: zlib.zstdCompressSync(rawBytes), encoding: 'zstd' }
79
- : { bytes: rawBytes, encoding: null };
69
+ // openai-direct is excluded: only the codex backend is verified. Compression
70
+ // runs on the libuv threadpool (zlib.zstdCompress, promisified) so it never
71
+ // blocks the main thread; runtimes without the async zstd binding send plain.
72
+ // Env kill-switch; the 400/415 resend + latch policy is shared
73
+ // (lib/request-compression.mjs).
74
+ async function encodeRequestBody(auth, headers, rawBytes) {
75
+ const plain = { bytes: rawBytes, encoding: null };
76
+ if (
77
+ auth?.type === 'openai-direct' ||
78
+ _openaiReqZstdLatch.disabled() ||
79
+ typeof zlib.zstdCompress !== 'function' ||
80
+ rawBytes.length < REQ_COMPRESSION_MIN_BYTES ||
81
+ hasContentEncoding(headers)
82
+ ) {
83
+ return plain;
84
+ }
85
+ return compressBody(rawBytes, promisify(zlib.zstdCompress), 'zstd');
80
86
  }
81
87
 
82
88
  async function postWithRetries({
@@ -91,15 +97,32 @@ async function postWithRetries({
91
97
  _sleepFn,
92
98
  }) {
93
99
  const label = httpLabel(auth);
94
- let bodyForSend = encodeRequestBody(auth, rawBytes);
95
- let response;
96
- let httpError = null;
97
- for (let attempt = 0; attempt <= CODEX_REQUEST_MAX_RETRIES; attempt++) {
100
+ const bodyForSend = await encodeRequestBody(auth, headers, rawBytes);
101
+ const fetchOnce = async (bytes, sendHeaders) => {
98
102
  const headerTimeout = createTimeoutSignal(
99
103
  totalTimeout.signal,
100
104
  PROVIDER_HTTP_RESPONSE_TIMEOUT_MS,
101
105
  `${label} initial response`
102
106
  );
107
+ try {
108
+ return await fetchFn(responsesUrl, {
109
+ method: 'POST',
110
+ headers: sendHeaders,
111
+ body: bytes,
112
+ signal: headerTimeout.signal,
113
+ dispatcher: getLlmDispatcher(),
114
+ });
115
+ } catch (err) {
116
+ throw headerTimeout.signal?.aborted && headerTimeout.signal.reason instanceof Error
117
+ ? headerTimeout.signal.reason
118
+ : err;
119
+ } finally {
120
+ headerTimeout.cleanup();
121
+ }
122
+ };
123
+ let response;
124
+ let httpError = null;
125
+ for (let attempt = 0; attempt <= CODEX_REQUEST_MAX_RETRIES; attempt++) {
103
126
  let requestError = null;
104
127
  try {
105
128
  // Keep the established stage name for consumers, while making each
@@ -113,32 +136,20 @@ async function postWithRetries({
113
136
  retry: attempt > 0,
114
137
  });
115
138
  } catch {}
116
- response = await fetchFn(responsesUrl, {
117
- method: 'POST',
118
- headers: _zstdHeaders(headers, bodyForSend),
119
- body: bodyForSend.bytes,
120
- signal: headerTimeout.signal,
121
- dispatcher: getLlmDispatcher(),
139
+ response = bodyForSend.encoding
140
+ ? await fetchOnce(bodyForSend.bytes, withContentEncoding(headers, bodyForSend.encoding))
141
+ : await fetchOnce(rawBytes, headers);
142
+ // Encoding rejection (400/415): resent uncompressed inside this attempt,
143
+ // so it never consumes a retry; the latch flips only if that succeeds.
144
+ response = await resendIfEncodingRejected({
145
+ response,
146
+ encoded: Boolean(bodyForSend.encoding),
147
+ resend: () => fetchOnce(rawBytes, headers),
148
+ latch: _openaiReqZstdLatch,
122
149
  });
123
150
  } catch (err) {
124
- requestError =
125
- headerTimeout.signal?.aborted && headerTimeout.signal.reason instanceof Error
126
- ? headerTimeout.signal.reason
127
- : err;
128
- } finally {
129
- headerTimeout.cleanup();
130
- }
131
-
132
- // zstd rejection fallback: a 400 on a compressed request latches
133
- // compression OFF process-wide and replays this attempt uncompressed.
134
- if (response && response.status === 400 && bodyForSend.encoding) {
135
- _disableOpenaiReqZstd();
136
- bodyForSend = { bytes: rawBytes, encoding: null };
137
- await response.arrayBuffer().catch(() => {});
138
151
  response = undefined;
139
- // The uncompressed replay is not a retry: it must not consume an attempt.
140
- attempt--;
141
- continue;
152
+ requestError = err;
142
153
  }
143
154
  // The error body is read exactly once, here, into the contract fields.
144
155
  httpError = null;
@@ -183,8 +194,9 @@ async function postWithRetries({
183
194
  // Uncapped for retryable errors; the attempt count is
184
195
  // the bound, and the abort signal cancels the wait.
185
196
  // The shared schedule carries a leading duplicate (withRetry convention).
186
- const raw = OPENAI_REQUEST_RETRY_OPTS.backoffMs[attempt + 1];
187
- const delayMs = retryAfterMsFromError(attemptFailure) ?? jitterDelayMs(raw, OPENAI_REQUEST_RETRY_OPTS.retryJitterRatio);
197
+ const raw = OPENAI_REQUEST_RETRY_OPTS.backoffMs[attempt + 1];
198
+ const delayMs =
199
+ retryAfterMsFromError(attemptFailure) ?? jitterDelayMs(raw, OPENAI_REQUEST_RETRY_OPTS.retryJitterRatio);
188
200
  emitProviderRetryStage(onStageChange, {
189
201
  attempt: attempt + 2,
190
202
  maxAttempts: CODEX_REQUEST_MAX_RETRIES + 1,
@@ -6,6 +6,8 @@
6
6
  */
7
7
  import { recomputeToolInFlight } from '../response-state.mjs';
8
8
  import { parseJsonObject } from '../response-items.mjs';
9
+ import { withToolCallNamespace } from '../../custom-tool-wire.mjs';
10
+ import { isIncompleteToolItem } from '../../lib/responses-terminal-fields.mjs';
9
11
 
10
12
  function outputItemKind(item) {
11
13
  if (item.type === 'reasoning') return 'reasoning';
@@ -19,10 +21,10 @@ export function createOutputItemEvents({ state, items, meaningful }) {
19
21
  const onOutputItemAdded = (item) => {
20
22
  if (item?.type === 'function_call') {
21
23
  toolTracker.mark(item);
22
- state.pendingCalls.set(item.id || '', {
23
- name: item.name || '',
24
- callId: item.call_id || '',
25
- });
24
+ state.pendingCalls.set(
25
+ item.id || '',
26
+ withToolCallNamespace({ name: item.name || '', callId: item.call_id || '' }, item)
27
+ );
26
28
  state.toolInFlight = true;
27
29
  } else if (item?.type === 'tool_search_call') {
28
30
  // Mark tool_search as in-flight the moment the item is added,
@@ -66,12 +68,15 @@ export function createOutputItemEvents({ state, items, meaningful }) {
66
68
  meaningful('tool');
67
69
  return;
68
70
  }
69
- const call = {
70
- id: pending?.callId || event.call_id || '',
71
- name: pending?.name || event.name || '',
72
- arguments: parseJsonObject(event.arguments),
73
- _pendingItemId: itemId,
74
- };
71
+ const call = withToolCallNamespace(
72
+ {
73
+ id: pending?.callId || event.call_id || '',
74
+ name: pending?.name || event.name || '',
75
+ arguments: parseJsonObject(event.arguments),
76
+ _pendingItemId: itemId,
77
+ },
78
+ pending
79
+ );
75
80
  state.toolCalls.push(call);
76
81
  if (call.id && call.name) {
77
82
  delete call._pendingItemId;
@@ -81,9 +86,17 @@ export function createOutputItemEvents({ state, items, meaningful }) {
81
86
  };
82
87
 
83
88
  const onOutputItemDone = (item) => {
89
+ if (isIncompleteToolItem(item)) {
90
+ // Server-truncated call: stays in flight, never collected or replayed.
91
+ toolTracker.mark(item);
92
+ state.toolInFlight = true;
93
+ meaningful('tool');
94
+ return;
95
+ }
84
96
  items.pushResponseItem(item);
85
97
  items.pushReasoningItem(item);
86
98
  items.pushWebSearchCall(item);
99
+ state.refusals.absorbMessage(item);
87
100
  if (item.type === 'function_call') {
88
101
  const tc = state.toolCalls.find((t) => t._pendingItemId === (item.id || ''));
89
102
  if (tc) items.completePendingCall(tc, item);