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
@@ -90,9 +90,19 @@ export function inlineModelProxyAttachments(messages, { maxBytes = MODEL_PROXY_I
90
90
  return out ?? messages;
91
91
  }
92
92
 
93
+ /** A first-response budget the PC reported, or null for anything malformed. */
94
+ function reportedBudget(value) {
95
+ const transportMs = Number(value?.transportMs);
96
+ const semanticMs = Number(value?.semanticMs);
97
+ return transportMs > 0 && semanticMs > 0 && Number.isFinite(transportMs) && Number.isFinite(semanticMs)
98
+ ? { transportMs, semanticMs }
99
+ : null;
100
+ }
101
+
93
102
  export class ModelProxyProvider {
94
103
  #channel;
95
104
  #modelInfo = new Map();
105
+ #noWireRoute = new Set();
96
106
 
97
107
  constructor(name, config = {}, channel = getModelProxyChannel()) {
98
108
  this.name = name;
@@ -100,6 +110,7 @@ export class ModelProxyProvider {
100
110
  this.#channel = channel;
101
111
  // Adapter traits are reported by the PC's real instance.
102
112
  if (typeof this.config.modelProxy?.nativePdf === 'boolean') this.nativePdf = this.config.modelProxy.nativePdf;
113
+ if (this.config.modelProxy?.consumesReadWindows === true) this.consumesReadWindows = true;
103
114
  }
104
115
 
105
116
  #call(method, fields = {}, options = {}) {
@@ -109,18 +120,32 @@ export class ModelProxyProvider {
109
120
  async send(messages, model, tools, sendOpts) {
110
121
  const { options, callbacks } = splitModelProxySendOptions(sendOpts);
111
122
  const finalized = isFinalizedProviderRequestTools(tools);
112
- return this.#call(
113
- 'send',
114
- {
115
- model: model ?? null,
116
- messages: inlineModelProxyAttachments(messages),
117
- tools: Array.isArray(tools) ? tools : null,
118
- toolsFinalized: finalized,
119
- nativePrefixCount: finalized ? providerNativeToolPrefixCount(tools) : 0,
120
- options,
121
- },
122
- { signal: sendOpts?.signal || null, callbacks }
123
- );
123
+ const fields = {
124
+ model: model ?? null,
125
+ messages: inlineModelProxyAttachments(messages),
126
+ tools: Array.isArray(tools) ? tools : null,
127
+ toolsFinalized: finalized,
128
+ nativePrefixCount: finalized ? providerNativeToolPrefixCount(tools) : 0,
129
+ options,
130
+ };
131
+ const signal = sendOpts?.signal || null;
132
+ const result = await this.#call('send', fields, { signal, callbacks });
133
+ // The PC rerouted the wire (a clear "unsupported" refusal) and reports the
134
+ // route it used: the daemon's own session adopts it, so the next proxied
135
+ // turn starts on the new wire instead of repeating the refusal.
136
+ const rerouted = result?.wireReroute;
137
+ const session = sendOpts?.session;
138
+ if (
139
+ rerouted?.source === 'reroute' &&
140
+ session?.wireRoute &&
141
+ session.wireRoute.provider === this.name &&
142
+ session.wireRoute.model === (model ?? null) &&
143
+ rerouted.provider === this.name &&
144
+ rerouted.model === session.wireRoute.model
145
+ ) {
146
+ session.wireRoute = rerouted;
147
+ }
148
+ return result;
124
149
  }
125
150
 
126
151
  #adoptCatalog(catalog) {
@@ -145,6 +170,31 @@ export class ModelProxyProvider {
145
170
  getCachedModelInfo(model) {
146
171
  return this.#modelInfo.get(String(model ?? '')) ?? null;
147
172
  }
173
+
174
+ /** The PC adapter's first-response budget for `model`: the catalog's
175
+ * model-specific figure, else the adapter's own from its provider config;
176
+ * null keeps the agent watchdog default. */
177
+ firstResponseBudget(model) {
178
+ return (
179
+ reportedBudget(this.getCachedModelInfo(model)?.firstResponseBudget) ??
180
+ reportedBudget(this.config.modelProxy?.firstResponseBudget)
181
+ );
182
+ }
183
+
184
+ /** The PC adapter's wire route for `model` (its config and roster decide);
185
+ * null for a single-wire adapter, which is remembered so every later turn
186
+ * skips the round trip. */
187
+ async resolveWireRoute(model, ctx = {}) {
188
+ const key = String(model ?? '');
189
+ if (this.#noWireRoute.has(key)) return null;
190
+ const route = await this.#call('resolveWireRoute', {
191
+ model: model ?? null,
192
+ context: { agent: ctx.agent === true, legacy: ctx.legacy === true },
193
+ });
194
+ if (route && typeof route === 'object') return route;
195
+ this.#noWireRoute.add(key);
196
+ return null;
197
+ }
148
198
  }
149
199
 
150
200
  /** A proxy instance whose class carries the PC adapter's usage convention. */
@@ -190,10 +240,12 @@ export function loadModelProxyProviderConfig({
190
240
  channel = getModelProxyChannel(),
191
241
  now = Date.now,
192
242
  waitMs = MODEL_PROXY_CONFIG_WAIT_MS,
243
+ force = false,
193
244
  } = {}) {
194
245
  const generation = channel.generation;
195
246
  const cached = _providerConfigCache;
196
247
  if (
248
+ !force &&
197
249
  cached &&
198
250
  cached.channel === channel &&
199
251
  cached.generation === generation &&
@@ -202,7 +254,16 @@ export function loadModelProxyProviderConfig({
202
254
  return Promise.resolve(cached.value);
203
255
  }
204
256
  const inFlight = _providerConfigInFlight;
205
- if (inFlight && inFlight.channel === channel && inFlight.generation === generation) return inFlight.promise;
257
+ // A forced read starts after the caller's change, never reuses an older
258
+ // snapshot. Short setup reads also cannot inherit a registry init's budget.
259
+ if (
260
+ !force &&
261
+ inFlight &&
262
+ inFlight.channel === channel &&
263
+ inFlight.generation === generation &&
264
+ inFlight.waitMs === waitMs
265
+ )
266
+ return inFlight.promise;
206
267
  const promise = (async () => {
207
268
  const deadline = Date.now() + waitMs;
208
269
  let delay = CONFIG_RETRY_FIRST_MS;
@@ -215,12 +276,27 @@ export function loadModelProxyProviderConfig({
215
276
  }
216
277
  }
217
278
  try {
218
- const reply = await channel.request({ provider: '', method: 'providerConfig' });
279
+ const remaining = deadline - Date.now();
280
+ if (remaining <= 0) throw new ModelProxyUnavailableError('the desktop provider request timed out');
281
+ const controller = new AbortController();
282
+ const timer = setTimeout(
283
+ () => controller.abort(new ModelProxyUnavailableError('the desktop provider request timed out')),
284
+ remaining
285
+ );
286
+ timer.unref?.();
287
+ let reply;
288
+ try {
289
+ reply = await channel.request({ provider: '', method: 'providerConfig' }, { signal: controller.signal });
290
+ } finally {
291
+ clearTimeout(timer);
292
+ }
219
293
  const raw = reply?.providers && typeof reply.providers === 'object' ? reply.providers : {};
220
294
  // Defense in depth: the PC already strips secrets before sending.
221
295
  const value = stripModelProxySecrets(raw);
222
296
  if (providerConfigReady(reply, value)) {
223
- if (channel.generation === generation) {
297
+ // An older read may finish after a forced refresh; only the newest
298
+ // request may publish to the shared cache.
299
+ if (channel.generation === generation && _providerConfigInFlight === entry) {
224
300
  _providerConfigCache = { at: now(), value, channel, generation };
225
301
  }
226
302
  return value;
@@ -236,7 +312,7 @@ export function loadModelProxyProviderConfig({
236
312
  delay = Math.min(delay * 2, CONFIG_RETRY_MAX_MS);
237
313
  }
238
314
  })();
239
- const entry = { channel, generation, promise };
315
+ const entry = { channel, generation, waitMs, promise };
240
316
  _providerConfigInFlight = entry;
241
317
  const clear = () => {
242
318
  if (_providerConfigInFlight === entry) _providerConfigInFlight = null;
@@ -56,11 +56,6 @@ function resolveProbeState(paths, evaluate) {
56
56
  return sawUnreadable ? 'unreadable' : 'absent';
57
57
  }
58
58
 
59
- function pushUnique(list, value) {
60
- if (!value || typeof value !== 'string') return;
61
- if (!list.includes(value)) list.push(value);
62
- }
63
-
64
59
  // Short-TTL memo. Under simultaneous multi-agent launch, buildDefaultConfig
65
60
  // and registry lazy-init call these probes in bursts; each probe does
66
61
  // synchronous existsSync + readFileSync disk work. Cache the STATE per key
@@ -113,9 +108,11 @@ function memoProbe(key, paths, compute, extraSignature = '') {
113
108
  }
114
109
 
115
110
  function anthropicOAuthState() {
116
- const paths = [];
117
- pushUnique(paths, process.env.ANTHROPIC_OAUTH_CREDENTIALS_PATH);
118
- pushUnique(paths, ANTHROPIC_DEFAULT_CREDENTIALS_PATH);
111
+ const paths = [
112
+ boundProviderAuthPath('anthropic-oauth') ||
113
+ process.env.ANTHROPIC_OAUTH_CREDENTIALS_PATH ||
114
+ ANTHROPIC_DEFAULT_CREDENTIALS_PATH,
115
+ ];
119
116
  return memoProbe('anthropic-oauth', paths, () => {
120
117
  return resolveProbeState(paths, (docs) => {
121
118
  const candidates = [];
@@ -176,9 +173,7 @@ function mimoOAuthState() {
176
173
  process.env.MIMO_OAUTH_CREDENTIALS_PATH ||
177
174
  join(resolvePluginData(), 'mimo-oauth.json'),
178
175
  ];
179
- return memoProbe('mimo-oauth', paths, () =>
180
- resolveProbeState(paths, (docs) => docs.some((own) => !!own?.apiKey))
181
- );
176
+ return memoProbe('mimo-oauth', paths, () => resolveProbeState(paths, (docs) => docs.some((own) => !!own?.apiKey)));
182
177
  }
183
178
 
184
179
  function commandCodeOAuthState() {
@@ -230,7 +225,10 @@ function cursorEnvTokenFingerprint() {
230
225
  }
231
226
 
232
227
  function cursorOAuthState() {
233
- const paths = [process.env.CURSOR_OAUTH_CREDENTIALS_PATH, join(resolvePluginData(), 'cursor-oauth.json')];
228
+ // Match the adapter: selected account, then explicit path, then legacy file.
229
+ // An environment token must not authenticate a different selected account.
230
+ const bound = boundProviderAuthPath('cursor-oauth');
231
+ const paths = [bound || process.env.CURSOR_OAUTH_CREDENTIALS_PATH || join(resolvePluginData(), 'cursor-oauth.json')];
234
232
  // The env token is the whole answer on this branch and has no file metadata
235
233
  // behind it, so its VALUE is what the memo signature has to track: a length
236
234
  // (or a bare present/absent flag) let a swap to an equal-length expired token
@@ -245,13 +243,15 @@ function cursorOAuthState() {
245
243
  // Expiry is read by the one shared JWT reader (cursor-auth.cursorTokenExpiry),
246
244
  // which answers 0 for a non-JWT or unparseable token — exactly the "assume
247
245
  // usable" outcome this branch already took for those shapes.
248
- if (process.env.CURSOR_ACCESS_TOKEN) {
246
+ if (process.env.CURSOR_ACCESS_TOKEN && !bound) {
249
247
  const expiresAt = cursorTokenExpiry(process.env.CURSOR_ACCESS_TOKEN);
250
248
  return expiresAt === 0 || expiresAt > Date.now() ? 'present' : 'absent';
251
249
  }
252
250
  return resolveProbeState(paths, (docs) =>
253
251
  docs.some((own) => {
254
252
  if (!own?.access_token) return false;
253
+ // Cursor permanently rejected the refresh token: signed out until a new login.
254
+ if (own.reauth_required === true) return false;
255
255
  const expiresAt = Number(own.expires_at) || 0;
256
256
  return expiresAt === 0 || expiresAt > Date.now() || Boolean(own.refresh_token);
257
257
  })
@@ -101,6 +101,8 @@ function _codexMetadataBase({ poolKey, cacheKey, sendOpts, handshake = false } =
101
101
  sendOpts?.codexSessionId ||
102
102
  sendOpts?.session?.codexWireSessionId ||
103
103
  sendOpts?.session?.codexSessionId ||
104
+ // A forked transport scope keeps its session's wire identity.
105
+ (sendOpts?.transportScope ? sendOpts?.sessionId : '') ||
104
106
  poolKey ||
105
107
  cacheKey
106
108
  ) || 'mixdog-session';
@@ -14,16 +14,37 @@ import {
14
14
  toOpenAITools,
15
15
  parseToolCalls,
16
16
  knownToolNamesFromOpenAITools,
17
- deepseekReplaysReasoningContent,
18
17
  } from './openai-compat-wire.mjs';
19
- import { applyCompatProviderChatOptions } from './openai-compat-options.mjs';
18
+ import { applyCompatProviderChatOptions, deepseekThinkingMode } from './openai-compat-options.mjs';
20
19
  import { normalizeCompatChatResponse } from './openai-compat-response-normalization.mjs';
21
20
  import { applyCompatToolChoice, compatStreamRetryReporter } from './compat-request-policy.mjs';
22
21
  import { ensureChatToolPairs } from './lib/wire-pairing.mjs';
23
22
  import { xaiCacheRouting } from './openai-compat-xai.mjs';
24
- import { compatRetryOptions, withCompatRetryProfile } from './openai-compat-retry-profile.mjs';
23
+ import { compatFirstByteWindowMs, compatRetryOptions, withCompatRetryProfile } from './openai-compat-retry-profile.mjs';
24
+ import { TIMEOUT_PHASE } from '../../../shared/provider-timeout-phase.mjs';
25
25
  import { preparePdfTextForProvider } from './media-normalization.mjs';
26
- import { isCustomProviderName, resolveCustomReasoning } from './custom-reasoning.mjs';
26
+ import { customWireFormat, isCustomProviderName, resolveCustomReasoning } from './custom-reasoning.mjs';
27
+ import { geminiAcceptedTools } from './gemini-schema.mjs';
28
+ import { acceptedWireTools } from './lib/claude-bridge-schema.mjs';
29
+ import { isGeminiFamilyModel } from './gemini-family.mjs';
30
+ import { compatReasoningShape, isTogetherBaseURL, readChatMessage } from './openai-compat-reasoning-field.mjs';
31
+
32
+ // Endpoint families with their own reasoning field (Together, vLLM, Groq,
33
+ // Mistral, OpenRouter); a custom provider's row may declare the vLLM format.
34
+ function reasoningShapeFor(provider, modelInfo) {
35
+ return compatReasoningShape({
36
+ providerName: provider.name,
37
+ baseURL: provider.baseURL,
38
+ wireFormat: isCustomProviderName(provider.name) ? customWireFormat(modelInfo, provider.baseURL) : undefined,
39
+ });
40
+ }
41
+
42
+ // The `developer` role is documented by MiMo and by Together's gpt-oss models;
43
+ // every other chat endpoint only knows `system`.
44
+ function keepsDeveloperRole(provider, profile, useModel) {
45
+ if (profile?.developerRole === true) return true;
46
+ return isTogetherBaseURL(provider.baseURL) && /gpt-oss/i.test(String(useModel || ''));
47
+ }
27
48
 
28
49
  export async function sendCompatChat(provider, messages, useModel, tools, opts) {
29
50
  const signal = opts.signal || null;
@@ -49,13 +70,17 @@ export async function sendCompatChat(provider, messages, useModel, tools, opts)
49
70
  protocol: 'openai-chat',
50
71
  model: modelInfo,
51
72
  effort: opts.effort ?? provider.config?.reasoningEffort,
73
+ baseURL: provider.baseURL,
52
74
  })
53
75
  : null;
76
+ // DeepSeek thinking models need the prior reasoning_content back once tools
77
+ // are in play and ignore it otherwise, so it always goes back.
54
78
  const replaysReasoningContent = isCustom
55
79
  ? customReasoning.replay
56
80
  : modelInfo?.reasoningContentField === 'reasoning_content' ||
57
81
  profile?.replaysReasoningContent === true ||
58
- (provider.name === 'deepseek' && deepseekReplaysReasoningContent(useModel));
82
+ provider.name === 'deepseek';
83
+ const reasoningShape = reasoningShapeFor(provider, modelInfo);
59
84
  messages = await preparePdfTextForProvider(messages, provider);
60
85
  const params = {
61
86
  model: useModel,
@@ -65,82 +90,123 @@ export async function sendCompatChat(provider, messages, useModel, tools, opts)
65
90
  messages: ensureChatToolPairs(
66
91
  toOpenAIMessages(messages, provider.name, {
67
92
  replaysReasoningContent,
93
+ ...(reasoningShape ? { reasoningShape } : {}),
68
94
  ...(isCustom ? { customReplay: customReasoning.replay } : {}),
95
+ ...(keepsDeveloperRole(provider, profile, useModel) ? { developerRole: true } : {}),
69
96
  nativePdf: provider.nativePdf,
97
+ cacheControl: provider.chatCacheControl === true,
70
98
  })
71
99
  ),
72
100
  };
73
101
  const maxOutputTokens = resolveCompatMaxOutputTokens(opts);
74
102
  if (maxOutputTokens) params.max_tokens = maxOutputTokens;
75
- if (tools?.length) params.tools = toOpenAITools(tools);
76
- applyCompatToolChoice(params, opts);
103
+ // A Gemini-family model behind this route (google/gemini-* on OpenRouter)
104
+ // fails the whole request on one schema Google rejects; such a tool is left
105
+ // out and reported like on the native Gemini routes.
106
+ // Every other model's `parameters` must be a valid 2020-12 object schema;
107
+ // a draft-07 one is lowered and a broken one left out and reported.
108
+ let sendTools = tools;
109
+ if (tools?.length) {
110
+ sendTools = isGeminiFamilyModel(useModel)
111
+ ? geminiAcceptedTools(tools, opts.onToolExcluded)
112
+ : acceptedWireTools(tools, 'openai', opts.onToolExcluded, `[${provider.name}] tool`);
113
+ }
114
+ if (sendTools?.length) params.tools = toOpenAITools(sendTools);
115
+ // A forced tool_choice goes out only on the documented providers; DeepSeek
116
+ // gets it only with thinking explicitly disabled (never silently in thinking
117
+ // mode, and never as an error for a turn whose thinking is enabled).
118
+ applyCompatToolChoice(params, opts, {
119
+ provider: provider.name,
120
+ baseURL: provider.baseURL,
121
+ wire: 'chat',
122
+ thinking:
123
+ provider.name === 'deepseek' && deepseekThinkingMode(opts, provider.config) === 'disabled' ? 'disabled' : null,
124
+ });
77
125
  applyCompatProviderChatOptions(params, provider.name, opts, provider.config, modelInfo);
78
126
  profile?.applyParams?.(params, { opts, config: provider.config, modelInfo });
79
127
  const firstByteTimeoutMs = profile?.firstByteTimeoutMs || PROVIDER_FIRST_BYTE_TIMEOUT_MS;
80
128
  const totalSignal = createPassthroughSignal(signal);
81
129
  const cacheRouting = provider.name === 'xai' ? xaiCacheRouting(opts, params, tools || [], useModel) : null;
82
130
  const cacheRoutingKey = cacheRouting?.key || null;
131
+ // xAI Chat pins a conversation to the server holding its cached prefix with
132
+ // the x-grok-conv-id header (the Responses equivalent is prompt_cache_key).
133
+ const requestHeaders = cacheRoutingKey
134
+ ? { 'x-grok-conv-id': cacheRoutingKey, ...(opts.requestHeaders || {}) }
135
+ : opts.requestHeaders;
83
136
  params.stream = true;
84
137
  params.stream_options = { include_usage: true };
85
138
  let assembled;
86
139
  try {
87
140
  try {
88
141
  assembled = await withRetry(
89
- withCompatRetryProfile(provider.name, refineAttemptErrors(profile, async ({ signal: attemptSignal }) => {
90
- try {
91
- opts.onStageChange?.('requesting');
92
- } catch {
93
- /* heartbeat best-effort */
94
- }
95
- const stream = await withRetry(
96
- ({ signal: openSignal }) =>
97
- provider.client.chat.completions.create(params, {
98
- signal: openSignal,
99
- ...(opts.requestHeaders ? { headers: opts.requestHeaders } : {}),
100
- }),
101
- {
102
- signal: attemptSignal,
103
- // Single attempt: this inner wrapper exists only to
104
- // apply the first-byte per-attempt timeout. Retry is
105
- // owned by the outer withRetry — nesting retry loops
106
- // here multiplied tail latency (5x5).
107
- maxAttempts: 1,
108
- perAttemptTimeoutMs: firstByteTimeoutMs,
109
- perAttemptLabel: `${provider.name} first byte`,
142
+ withCompatRetryProfile(
143
+ provider.name,
144
+ refineAttemptErrors(profile, async ({ signal: attemptSignal, firstByteTimeouts = 0 }) => {
145
+ try {
146
+ opts.onStageChange?.('requesting');
147
+ } catch {
148
+ /* heartbeat best-effort */
149
+ }
150
+ const windowMs = compatFirstByteWindowMs(provider.name, firstByteTimeoutMs, firstByteTimeouts);
151
+ let stream;
152
+ try {
153
+ stream = await withRetry(
154
+ ({ signal: openSignal }) =>
155
+ provider.client.chat.completions.create(params, {
156
+ signal: openSignal,
157
+ ...(requestHeaders ? { headers: requestHeaders } : {}),
158
+ }),
159
+ {
160
+ signal: attemptSignal,
161
+ // Single attempt: this inner wrapper exists only to
162
+ // apply the first-byte per-attempt timeout. Retry is
163
+ // owned by the outer withRetry — nesting retry loops
164
+ // here multiplied tail latency (5x5).
165
+ maxAttempts: 1,
166
+ perAttemptTimeoutMs: windowMs,
167
+ perAttemptLabel: `${provider.name} first byte`,
168
+ }
169
+ );
170
+ } catch (error) {
171
+ // The per-attempt window (the only timer here) expired before headers.
172
+ if (error?.code === 'EPROVIDERTIMEOUT' && !attemptSignal?.aborted) {
173
+ error.timeoutPhase = TIMEOUT_PHASE.HEADERS;
174
+ }
175
+ throw error;
110
176
  }
111
- );
112
- try {
113
- opts.onStageChange?.('streaming');
114
- } catch {
115
- /* heartbeat best-effort */
116
- }
117
- try {
118
- return await consumeCompatChatCompletionStream(stream, {
119
- signal: attemptSignal,
120
- label: provider.name,
121
- providerName: provider.name,
122
- onStreamDelta: opts.onStreamDelta,
123
- onToolCall: opts.onToolCall,
124
- onTextDelta: opts.onTextDelta,
125
- parseToolCalls,
126
- // Known tool names for the leaked-tool-call guard:
127
- // recovered leaked calls only synthesize when they name
128
- // a tool actually offered to this request.
129
- knownToolNames: knownToolNamesFromOpenAITools(params.tools),
130
- ...(profile?.firstByteTimeoutMs ? { firstByteTimeoutMs: profile.firstByteTimeoutMs } : {}),
131
- ...(profile?.semanticIdleTimeoutMs ? { semanticIdleTimeoutMs: profile.semanticIdleTimeoutMs } : {}),
132
- });
133
- } catch (error) {
134
- // Grok's reference sampler treats content-idle as a
135
- // terminal sampling decision, not a resample signal.
136
- if (provider.name === 'xai' && error?.streamStalled === true) {
137
- throw markProviderRecoveryExhausted(error, {
138
- owner: 'xai-content-idle-policy',
177
+ try {
178
+ opts.onStageChange?.('streaming');
179
+ } catch {
180
+ /* heartbeat best-effort */
181
+ }
182
+ try {
183
+ return await consumeCompatChatCompletionStream(stream, {
184
+ signal: attemptSignal,
185
+ label: provider.name,
186
+ providerName: provider.name,
187
+ onStreamDelta: opts.onStreamDelta,
188
+ onToolCall: opts.onToolCall,
189
+ onTextDelta: opts.onTextDelta,
190
+ parseToolCalls,
191
+ // Known tool names for the leaked-tool-call guard:
192
+ // recovered leaked calls only synthesize when they name
193
+ // a tool actually offered to this request.
194
+ knownToolNames: knownToolNamesFromOpenAITools(params.tools),
195
+ ...(profile?.firstByteTimeoutMs ? { firstByteTimeoutMs: windowMs } : {}),
196
+ ...(profile?.semanticIdleTimeoutMs ? { semanticIdleTimeoutMs: profile.semanticIdleTimeoutMs } : {}),
139
197
  });
198
+ } catch (error) {
199
+ // Grok's reference sampler treats content-idle as a
200
+ // terminal sampling decision, not a resample signal.
201
+ if (provider.name === 'xai' && error?.streamStalled === true) {
202
+ throw markProviderRecoveryExhausted(error, {
203
+ owner: 'xai-content-idle-policy',
204
+ });
205
+ }
206
+ throw error;
140
207
  }
141
- throw error;
142
- }
143
- })),
208
+ })
209
+ ),
144
210
  {
145
211
  signal: totalSignal.signal,
146
212
  onRetry: compatStreamRetryReporter(provider.name, opts),
@@ -152,7 +218,7 @@ export async function sendCompatChat(provider, messages, useModel, tools, opts)
152
218
  const recovered = await provider._recoverCompatNonStreaming({
153
219
  streamErr,
154
220
  params,
155
- opts,
221
+ opts: requestHeaders === opts.requestHeaders ? opts : { ...opts, requestHeaders },
156
222
  signal: totalSignal.signal,
157
223
  useModel,
158
224
  });
@@ -172,6 +238,7 @@ export async function sendCompatChat(provider, messages, useModel, tools, opts)
172
238
  cacheRoutingKey,
173
239
  cacheRouting,
174
240
  replaysReasoningContent,
241
+ reasoningShape,
175
242
  });
176
243
  }
177
244
 
@@ -236,13 +303,17 @@ export async function recoverCompatNonStreaming(provider, { streamErr, params, o
236
303
  /* best-effort */
237
304
  }
238
305
  traceNonStreamingFallback({ provider: provider.name, model: useModel, opts, streamErr });
306
+ const { content, reasoningContent, reasoningSource } = readChatMessage(message, {
307
+ shape: reasoningShapeFor(provider, provider.getCachedModelInfo?.(useModel) || null),
308
+ });
239
309
  return {
240
310
  response,
241
311
  model: response.model || useModel,
242
- content: typeof message.content === 'string' ? message.content : '',
312
+ content,
243
313
  toolCalls,
244
314
  stopReason: choice.finish_reason || null,
245
- reasoningContent: typeof message.reasoning_content === 'string' ? message.reasoning_content : null,
315
+ reasoningContent,
316
+ reasoningSource,
246
317
  rawUsage: response.usage || null,
247
318
  };
248
319
  }
@@ -4,7 +4,18 @@
4
4
  * reasoning aliases, tool_calls deltas, finish reason and usage.
5
5
  */
6
6
  import { mergeToolCallDelta } from './tool-call-acc.mjs';
7
- import { appendText, relayText, reportProgress, reportTransport } from './stream-state.mjs';
7
+ import { appendText, drainLeakedCalls, relayText, reportProgress, reportTransport } from './stream-state.mjs';
8
+ import { chatContentParts } from '../openai-compat-reasoning-field.mjs';
9
+
10
+ function appendReasoning(state, text, source) {
11
+ state.sawReasoningContent = true;
12
+ state.reasoningSource = source;
13
+ state.reasoningContent += text;
14
+ if (text) {
15
+ state.emittedReasoning = true;
16
+ reportProgress(state, 'reasoning');
17
+ }
18
+ }
8
19
 
9
20
  function applyReasoning(state, delta) {
10
21
  if (Array.isArray(delta?.reasoning_details) && delta.reasoning_details.length) {
@@ -12,14 +23,22 @@ function applyReasoning(state, delta) {
12
23
  reportProgress(state, 'reasoning');
13
24
  }
14
25
  // These provider fields are aliases, never independent text segments.
15
- const reasoningDelta =
16
- [delta?.reasoning_content, delta?.reasoning, delta?.thinking].find((value) => typeof value === 'string') ?? null;
17
- if (reasoningDelta === null) return;
18
- state.sawReasoningContent = true;
19
- state.reasoningContent += reasoningDelta;
20
- if (reasoningDelta) {
21
- state.emittedReasoning = true;
22
- reportProgress(state, 'reasoning');
26
+ const source = ['reasoning_content', 'reasoning', 'thinking'].find((key) => typeof delta?.[key] === 'string');
27
+ if (source === undefined) return;
28
+ appendReasoning(state, delta[source], source);
29
+ }
30
+
31
+ function applyContent(state, content) {
32
+ if (state.leakGuard.enabled) relayText(state, content);
33
+ else appendText(state, content);
34
+ }
35
+
36
+ // Mistral-style typed chunk lists: thinking → reasoning, text → assistant
37
+ // text, applied in arrival order.
38
+ function applyContentParts(state, parts) {
39
+ for (const part of parts) {
40
+ if (part.kind === 'reasoning') appendReasoning(state, part.text, 'content_chunks');
41
+ else if (part.text) applyContent(state, part.text);
23
42
  }
24
43
  }
25
44
 
@@ -32,15 +51,17 @@ export function applyCompatChunk(state, chunk) {
32
51
  if (typeof delta?.role === 'string' && delta.role) {
33
52
  reportProgress(state, 'semantic');
34
53
  }
35
- if (delta?.content) {
36
- if (state.leakGuard.enabled) relayText(state, delta.content);
37
- else appendText(state, delta.content);
38
- }
54
+ const contentParts = chatContentParts(delta?.content);
55
+ if (contentParts) applyContentParts(state, contentParts);
56
+ else if (delta?.content) applyContent(state, delta.content);
39
57
  applyReasoning(state, delta);
40
58
  if (Array.isArray(delta?.tool_calls) && delta.tool_calls.length) {
41
59
  reportProgress(state, 'tool');
42
60
  }
43
61
  mergeToolCallDelta(state.toolAcc, delta?.tool_calls);
44
- if (choice?.finish_reason) state.stopReason = choice.finish_reason;
62
+ if (choice?.finish_reason) {
63
+ state.stopReason = choice.finish_reason;
64
+ drainLeakedCalls(state);
65
+ }
45
66
  if (chunk?.usage) state.rawUsage = chunk.usage;
46
67
  }
@@ -13,7 +13,7 @@ import {
13
13
  markUnsafeRetryIfToolEmitted,
14
14
  } from '../openai-compat-stream-common.mjs';
15
15
  import { orderedToolCalls, toolCallsFromStreamAcc } from './tool-call-acc.mjs';
16
- import { attachPartial, attachReportedUsage, stampCompatOutcome } from './stream-state.mjs';
16
+ import { attachPartial, attachReportedUsage, isIncompleteFinishReason, stampCompatOutcome } from './stream-state.mjs';
17
17
 
18
18
  /** Rejection for a stream that ended without a terminal event. */
19
19
  export function incompleteStreamError(state, label) {
@@ -86,7 +86,9 @@ export function settleCompatStream(state, { label, parseToolCalls }) {
86
86
  if (failing) throw finishReasonInterruption(state, failing);
87
87
  const response = buildResponse(state);
88
88
  let toolCalls = parseAccumulatedToolCalls(state, { label, parseToolCalls });
89
- if (Array.isArray(toolCalls) && toolCalls.length) {
89
+ // A length-truncated or content-filtered call is a partial result that
90
+ // normalizeCompatChatResponse rejects: it must never reach the executor.
91
+ if (!isIncompleteFinishReason(state.stopReason) && Array.isArray(toolCalls) && toolCalls.length) {
90
92
  for (const call of toolCalls) emitCompatToolCallOnce(state.streamEmitState, call, state.onToolCall);
91
93
  }
92
94
  if (state.leakedCalls.length) {
@@ -99,6 +101,7 @@ export function settleCompatStream(state, { label, parseToolCalls }) {
99
101
  toolCalls,
100
102
  stopReason: state.stopReason,
101
103
  reasoningContent: state.sawReasoningContent ? state.reasoningContent : null,
104
+ reasoningSource: state.sawReasoningContent ? state.reasoningSource : null,
102
105
  reasoningDetails: state.reasoningDetails.length ? state.reasoningDetails : null,
103
106
  rawUsage: state.rawUsage,
104
107
  };