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
@@ -1,30 +1,49 @@
1
1
  import { randomUUID } from 'node:crypto';
2
2
  import { AnthropicProvider } from './anthropic.mjs';
3
3
  import { OpenAICompatProvider, OPENAI_COMPAT_PRESETS } from './openai-compat.mjs';
4
- import { currentUsageContext } from '../../../shared/llm/usage-context.mjs';
5
4
  import { getModelMetadataSync, getModelsDevRowSync } from './model-catalog.mjs';
5
+ import { toInclusiveUsage, withInclusiveUsage } from './lib/inclusive-usage.mjs';
6
+ import { providerOffersWire, resolveWireRoute, sendOnRoute } from './wire-route.mjs';
7
+ import { gatewayMessagesOpts } from './wire-gateway.mjs';
8
+
9
+ // The Go Anthropic route: the shared request builder gets the model's output
10
+ // ceiling (models.dev limit) through the gateway options.
11
+ class OpenCodeGoMessagesEngine extends AnthropicProvider {
12
+ _sendOnce(messages, model, tools, opts) {
13
+ return super._sendOnce(messages, model, tools, gatewayMessagesOpts(this.config, model, messages, opts));
14
+ }
15
+ }
6
16
 
7
17
  // OpenCode Go publishes OpenAI chat/completions, OpenAI Responses, and
8
18
  // Anthropic Messages endpoints, and each upstream brand answers on only one
9
- // of them (muse-spark / gpt / grok 500 on chat/completions; minimax expects
10
- // Messages). models.dev names the SDK package per model, which is the
11
- // authoritative wire selector; the prefix tables are the cold-catalog fallback.
12
- const ANTHROPIC_MODEL_PREFIXES = ['minimax-', 'qwen'];
13
- const RESPONSES_MODEL_PREFIXES = ['muse-spark-', 'gpt-', 'grok-'];
19
+ // of them (muse-spark / gpt / grok 500 on chat/completions; minimax and
20
+ // Claude expect Messages). models.dev names the SDK package per model, which
21
+ // is the authoritative wire selector; wire-route.mjs holds the cold-catalog
22
+ // prefix fallback. `@ai-sdk/google` names the Gemini generateContent wire
23
+ // (opencode-go-gemini.mjs).
14
24
  const WIRE_API_BY_NPM = Object.freeze({
15
25
  '@ai-sdk/openai': 'responses',
16
26
  '@ai-sdk/anthropic': 'messages',
17
27
  '@ai-sdk/openai-compatible': 'chat',
28
+ '@ai-sdk/google': 'gemini',
18
29
  });
19
30
 
31
+ function openCodeGoCatalogWire(model) {
32
+ const npm = getModelsDevRowSync(String(model || ''), 'opencode-go')?.npm;
33
+ return typeof npm === 'string' && Object.hasOwn(WIRE_API_BY_NPM, npm) ? WIRE_API_BY_NPM[npm] : null;
34
+ }
35
+
36
+ function resolveOpenCodeGoWireRoute(model, ctx = {}) {
37
+ const catalogWire = openCodeGoCatalogWire(model);
38
+ // Each Go model answers on the one wire the catalog names: it narrows the
39
+ // offered endpoints, so an override cannot pick a wire the model lacks.
40
+ const endpoints = providerOffersWire('opencode-go', catalogWire) ? [catalogWire] : null;
41
+ return resolveWireRoute('opencode-go', model, { ...ctx, catalogWire, endpoints });
42
+ }
43
+
20
44
  /** Wire API for a Go model: 'responses' | 'messages' | 'chat'. */
21
45
  function openCodeGoWireApi(model) {
22
- const id = String(model || '').toLowerCase();
23
- const npm = getModelsDevRowSync(String(model || ''), 'opencode-go')?.npm;
24
- if (npm && WIRE_API_BY_NPM[npm]) return WIRE_API_BY_NPM[npm];
25
- if (RESPONSES_MODEL_PREFIXES.some((prefix) => id.startsWith(prefix))) return 'responses';
26
- if (ANTHROPIC_MODEL_PREFIXES.some((prefix) => id.startsWith(prefix))) return 'messages';
27
- return 'chat';
46
+ return resolveOpenCodeGoWireRoute(model).wire;
28
47
  }
29
48
 
30
49
  export function isAnthropicGoModel(model) {
@@ -48,42 +67,8 @@ export function openCodeGoEndpointForModel(model, configuredBaseURL) {
48
67
  return `${bases.openai}/chat/completions`;
49
68
  }
50
69
 
51
- // Usage objects already converted to the inclusive convention; a converted
52
- // object passing through another normalization (nested send) stays as is,
53
- // and one source object always converts to the same object, so an abandoned
54
- // attempt and the error that later carries it stay one record.
55
- const inclusiveUsage = new WeakSet();
56
- const convertedUsage = new WeakMap();
57
-
58
- export function toInclusiveOpenCodeGoUsage(usage) {
59
- if (!usage || inclusiveUsage.has(usage)) return usage;
60
- if (convertedUsage.has(usage)) return convertedUsage.get(usage);
61
- const input = Number(usage.inputTokens) || 0;
62
- const cached = Number(usage.cachedTokens) || 0;
63
- const cacheWrite = Number(usage.cacheWriteTokens) || 0;
64
- const inclusiveInput = input + cached + cacheWrite;
65
- const converted = {
66
- ...usage,
67
- inputTokens: inclusiveInput,
68
- promptTokens: Math.max(Number(usage.promptTokens) || 0, inclusiveInput),
69
- };
70
- inclusiveUsage.add(converted);
71
- convertedUsage.set(usage, converted);
72
- return converted;
73
- }
74
-
75
- function normalizeOpenCodeGoResultUsage(result, anthropicRoute) {
76
- if (!anthropicRoute || !result?.usage) return result;
77
- return { ...result, usage: toInclusiveOpenCodeGoUsage(result.usage) };
78
- }
79
-
80
- function normalizeOpenCodeGoError(error) {
81
- if (error && typeof error === 'object') {
82
- if (error.usage) error.usage = toInclusiveOpenCodeGoUsage(error.usage);
83
- if (error.partialUsage) error.partialUsage = toInclusiveOpenCodeGoUsage(error.partialUsage);
84
- }
85
- return error;
86
- }
70
+ // The Messages route reports usage in the provider's inclusive convention.
71
+ export const toInclusiveOpenCodeGoUsage = toInclusiveUsage;
87
72
 
88
73
  function opencodeGoContextWindow(modelId, current = 0) {
89
74
  const native = Number(current);
@@ -118,11 +103,15 @@ export class OpenCodeGoProvider {
118
103
  const preset = OPENAI_COMPAT_PRESETS['opencode-go'];
119
104
  const bases = resolveOpenCodeGoBaseURLs(config.baseURL || preset.baseURL);
120
105
  this.openai = new OpenAICompatProvider('opencode-go', { ...config, baseURL: bases.openai });
121
- this.anthropic = new AnthropicProvider({
106
+ this.anthropic = new OpenCodeGoMessagesEngine({
122
107
  ...config,
123
108
  name: 'opencode-go',
124
109
  baseURL: bases.anthropic,
125
110
  disableBetaHeaders: true,
111
+ // The preset's identifying headers (User-Agent) ride the Messages wire
112
+ // too; the user's own headers win.
113
+ extraHeaders: { ...(preset.extraHeaders || {}), ...(config.extraHeaders || {}) },
114
+ modelMaxOutputTokens: (model) => this.getCachedModelInfo(model)?.outputTokens,
126
115
  });
127
116
  // The Anthropic route answers for this provider: PDFs lower to text.
128
117
  this.anthropic.nativePdf = this.nativePdf;
@@ -142,29 +131,48 @@ export class OpenCodeGoProvider {
142
131
  'x-opencode-session': sessionId,
143
132
  },
144
133
  };
145
- const wire = openCodeGoWireApi(model);
146
- if (wire === 'responses') {
147
- // OpenAI-family brands on the gateway (Muse Spark, GPT, Grok)
148
- // only answer on /responses; the compat transport switches wire
149
- // shape per request via this flag.
150
- return this.openai.send(messages, model, tools, { ...(sendOpts || {}), compatWireApi: 'responses' });
151
- }
152
- if (wire === 'messages') {
153
- // The Anthropic-style Go endpoint reports cached read/write usage
154
- // and accepts the standard message shape. Preserve the caller's
155
- // cache strategy so the shared Anthropic live-tail marker advances
156
- // through tool loops instead of forcing every request fully cold.
157
- // Abandoned attempts noted by the inner provider use the same conversion.
158
- const identity = currentUsageContext();
159
- if (identity) identity.normalizeAbandonedUsage = toInclusiveOpenCodeGoUsage;
160
- try {
161
- const result = await this.anthropic.send(messages, model, tools, sendOpts);
162
- return normalizeOpenCodeGoResultUsage(result, true);
163
- } catch (error) {
164
- throw normalizeOpenCodeGoError(error);
134
+ // The session's pinned route, else this model's route (wire-route.mjs);
135
+ // the resolved route is the only wire authority (a caller's own wire
136
+ // switches never reach an engine), and one clear "unsupported" refusal
137
+ // moves the send to the next wire once.
138
+ return sendOnRoute(this, model, tools, sendOpts, messages, async (wire, history, opts) => {
139
+ if (wire === 'responses') {
140
+ // OpenAI-family brands on the gateway (Muse Spark, GPT, Grok)
141
+ // only answer on /responses; the compat transport switches wire
142
+ // shape per request via this flag.
143
+ return this.openai.send(history, model, tools, { ...opts, compatWireApi: 'responses' });
144
+ }
145
+ if (wire === 'messages') {
146
+ // The Anthropic-style Go endpoint reports cached read/write usage
147
+ // and accepts the standard message shape. Preserve the caller's
148
+ // cache strategy so the shared Anthropic live-tail marker advances
149
+ // through tool loops instead of forcing every request fully cold.
150
+ // Abandoned attempts noted by the inner provider use the same conversion.
151
+ return withInclusiveUsage(() => this.anthropic.send(history, model, tools, opts));
165
152
  }
153
+ if (wire === 'gemini') return (await this._geminiEngine()).send(history, model, tools, opts);
154
+ return this.openai.send(history, model, tools, opts);
155
+ });
156
+ }
157
+
158
+ // The Gemini generateContent route; the Google SDK loads only when a Gemini model is used.
159
+ async _geminiEngine() {
160
+ if (!this.gemini) {
161
+ const { OpenCodeGoGeminiEngine } = await import('./opencode-go-gemini.mjs');
162
+ this.gemini = new OpenCodeGoGeminiEngine({
163
+ ...this.config,
164
+ baseURL: this.openai.baseURL,
165
+ extraHeaders: {
166
+ ...(OPENAI_COMPAT_PRESETS['opencode-go'].extraHeaders || {}),
167
+ ...(this.config.extraHeaders || {}),
168
+ },
169
+ });
166
170
  }
167
- return this.openai.send(messages, model, tools, sendOpts);
171
+ return this.gemini;
172
+ }
173
+
174
+ resolveWireRoute(model, ctx = {}) {
175
+ return resolveOpenCodeGoWireRoute(model, { ...ctx, override: this.config?.modelWires?.[model] ?? null });
168
176
  }
169
177
 
170
178
  async listModels() {
@@ -0,0 +1,74 @@
1
+ /**
2
+ * OpenRouter: one API key, three wires. Claude (`anthropic/*`, `~anthropic/*`)
3
+ * goes through the Anthropic Messages engine at https://openrouter.ai/api (the
4
+ * SDK appends /v1/messages); OpenAI GPT / o-series (`openai/gpt-*`,
5
+ * `openai/o*`, `~openai/*`) through the OpenAI-compatible engine's Responses
6
+ * wire; openrouter/auto and every other model through Chat Completions.
7
+ * Account-level provider-routing preferences stay OpenRouter's: no request
8
+ * names a provider order.
9
+ */
10
+ import { WireGatewayProvider, messagesBaseFromOpenAIBase } from './wire-gateway.mjs';
11
+ import { OPENAI_COMPAT_PRESETS } from './openai-compat-presets.mjs';
12
+ import { openRouterReasoning } from './openai-compat-options.mjs';
13
+
14
+ /**
15
+ * The Claude id a routing slug stands for: an alias (`~anthropic/claude-opus-latest`)
16
+ * reads its catalog `alias_target`, the vendor prefix and a `:variant` suffix
17
+ * drop. Capability lookup only — the request still names the routing slug.
18
+ */
19
+ export function openRouterCapabilityModel(model, aliasTarget = null) {
20
+ return String(aliasTarget || model || '')
21
+ .replace(/^~/, '')
22
+ .replace(/^anthropic\//i, '')
23
+ .replace(/:[^/]*$/, '');
24
+ }
25
+
26
+ // Responses requests carry the same reasoning control as Chat requests
27
+ // (`openRouterReasoningEffort`, else the turn effort, else the configured
28
+ // effort; `none` disables reasoning).
29
+ function openRouterResponsesParams(config) {
30
+ return (params, { opts }) => {
31
+ const reasoning = openRouterReasoning(opts, config);
32
+ if (reasoning) params.reasoning = reasoning;
33
+ else delete params.reasoning;
34
+ };
35
+ }
36
+
37
+ // The Messages route takes the same control: the effort to send ('none' = no
38
+ // thinking), or null to keep the engine's own handling.
39
+ function openRouterMessagesEffort(config) {
40
+ return (opts) => {
41
+ const reasoning = openRouterReasoning(opts, config);
42
+ if (!reasoning) return null;
43
+ return reasoning.enabled === false ? 'none' : reasoning.effort;
44
+ };
45
+ }
46
+
47
+ /** A roster row carrying `top_provider.max_completion_tokens` as its output ceiling. */
48
+ export function withTopProviderOutputCeiling(item) {
49
+ const ceiling = Number(item?.top_provider?.max_completion_tokens);
50
+ if (!(ceiling > 0) || item.max_output_tokens !== undefined) return item;
51
+ return { ...item, max_output_tokens: ceiling };
52
+ }
53
+
54
+ export class OpenRouterProvider extends WireGatewayProvider {
55
+ constructor(config = {}) {
56
+ const baseURL = config.baseURL || OPENAI_COMPAT_PRESETS.openrouter.baseURL;
57
+ super(
58
+ 'openrouter',
59
+ config,
60
+ {
61
+ baseURL: messagesBaseFromOpenAIBase(baseURL),
62
+ authScheme: 'bearer',
63
+ // OpenRouter Messages takes PDFs natively as document blocks.
64
+ nativePdf: true,
65
+ messagesEffort: openRouterMessagesEffort(config),
66
+ capabilityModel: (model) => openRouterCapabilityModel(model, this.getCachedModelInfo(model)?.aliasTarget),
67
+ },
68
+ { responsesParamsHook: openRouterResponsesParams(config) }
69
+ );
70
+ // The roster's output ceiling is `top_provider.max_completion_tokens`.
71
+ const fetchItems = this.openai._fetchModelItems.bind(this.openai);
72
+ this.openai._fetchModelItems = async (options) => (await fetchItems(options)).map(withTopProviderOutputCeiling);
73
+ }
74
+ }
@@ -37,6 +37,26 @@ export function boundedCauseChain(err) {
37
37
  return chain;
38
38
  }
39
39
 
40
+ const TOOL_SURFACE_EXCEEDS_CONTEXT = 'TOOL_SURFACE_EXCEEDS_CONTEXT';
41
+ const TOOL_SURFACE_MARKER = `(${TOOL_SURFACE_EXCEEDS_CONTEXT})`;
42
+
43
+ /**
44
+ * The local fixed-overhead refusal (session/loop/context-overflow.mjs), bare,
45
+ * wrapped as a cause, or persisted as its text. Never a provider overflow:
46
+ * its diagnostic names tools, and a tool named like a provider error code
47
+ * must not turn it into one.
48
+ */
49
+ export function isToolSurfaceExceedsContextError(err) {
50
+ if (!err || (typeof err !== 'string' && typeof err !== 'object' && typeof err !== 'function')) return false;
51
+ // Every node of the chain: an Error, or persisted failure text kept as a cause.
52
+ return boundedCauseChain(err).some((item) =>
53
+ typeof item === 'string'
54
+ ? item.includes(TOOL_SURFACE_MARKER)
55
+ : item?.code === TOOL_SURFACE_EXCEEDS_CONTEXT ||
56
+ (typeof item?.message === 'string' && item.message.includes(TOOL_SURFACE_MARKER))
57
+ );
58
+ }
59
+
40
60
  export function headerValue(headers, name) {
41
61
  if (!headers) return null;
42
62
  const lower = name.toLowerCase();
@@ -78,6 +98,8 @@ export function errorHeaderValue(err, name) {
78
98
 
79
99
  export function typedErrorCode(err) {
80
100
  const detail = wireDetail(err);
101
+ const canonical = err && typeof err === 'object' ? codeFields(err).canonical.find(Boolean) : null;
102
+ if (canonical) return canonical;
81
103
  for (const field of [detail?.code, detail?.type, err?.providerErrorCode, err?.code, err?.error?.code]) {
82
104
  if (typeof field === 'string' && field.trim()) return field.trim().toLowerCase();
83
105
  }
@@ -375,9 +397,66 @@ const KIND_RANK = [
375
397
  'invalid_request',
376
398
  ];
377
399
 
400
+ // OpenRouter's canonical `error_type` vocabulary, stable across its Chat,
401
+ // Responses and Messages skins (the native code beside it is lossy: on
402
+ // Responses an auth failure arrives as `server_error`, a context overflow as
403
+ // `invalid_prompt`), mapped onto the typed codes classified here.
404
+ const GATEWAY_ERROR_TYPE_CODES = Object.freeze({
405
+ authentication: 'authentication_error',
406
+ permission_denied: 'permission_denied',
407
+ payment_required: 'payment_required',
408
+ context_length_exceeded: 'context_length_exceeded',
409
+ payload_too_large: 'payload_too_large',
410
+ image_too_large: 'request_too_large',
411
+ rate_limit_exceeded: 'rate_limit_exceeded',
412
+ provider_overloaded: 'overloaded',
413
+ provider_unavailable: 'service_unavailable',
414
+ timeout: 'timeout',
415
+ server: 'server_error',
416
+ content_policy_violation: 'content_policy_violation',
417
+ refusal: 'content_policy_violation',
418
+ invalid_request: 'invalid_request',
419
+ invalid_prompt: 'invalid_request',
420
+ unprocessable: 'invalid_request',
421
+ not_found: 'not_found',
422
+ precondition_failed: 'failed_precondition',
423
+ });
424
+
425
+ /** The typed code a gateway `error_type` names, or null for an absent/unmapped one. */
426
+ export function gatewayErrorTypeCode(errorType) {
427
+ const key = typeof errorType === 'string' ? errorType.trim().toLowerCase() : '';
428
+ return key && Object.hasOwn(GATEWAY_ERROR_TYPE_CODES, key) ? GATEWAY_ERROR_TYPE_CODES[key] : null;
429
+ }
430
+
431
+ /**
432
+ * Pre-classification normalizer for a wire error detail: when the envelope
433
+ * (or the detail itself) carries a gateway `error_type`, its typed code
434
+ * replaces the lossy native code (kept as `native_code`). Any other detail is
435
+ * returned unchanged.
436
+ */
437
+ export function normalizeGatewayErrorDetail(detail, envelope = null) {
438
+ const errorType =
439
+ envelope?.response?.error_type ?? envelope?.error_type ?? detail?.error_type ?? detail?.metadata?.error_type;
440
+ const code = gatewayErrorTypeCode(errorType);
441
+ if (!code) return detail;
442
+ const nativeCode = detail?.code;
443
+ return {
444
+ ...(detail && typeof detail === 'object' ? detail : {}),
445
+ code,
446
+ error_type: errorType,
447
+ ...(nativeCode != null && nativeCode !== code ? { native_code: nativeCode } : {}),
448
+ };
449
+ }
450
+
378
451
  function codeFields(item) {
379
452
  const detail = wireDetail(item);
380
- return [
453
+ const canonical = [
454
+ gatewayErrorTypeCode(detail?.error_type ?? detail?.metadata?.error_type),
455
+ gatewayErrorTypeCode(item?.error_type),
456
+ gatewayErrorTypeCode(item?.error?.error_type ?? item?.error?.metadata?.error_type),
457
+ gatewayErrorTypeCode(item?.error?.error?.error_type),
458
+ ];
459
+ const native = [
381
460
  detail?.code,
382
461
  detail?.type,
383
462
  detail?.status,
@@ -396,19 +475,25 @@ function codeFields(item) {
396
475
  item?.geminiStatus,
397
476
  item?.status,
398
477
  ];
478
+ return { canonical, native };
399
479
  }
400
480
 
481
+ // A gateway's canonical `error_type` supersedes every native code in the chain.
401
482
  function typedCodes(chain) {
402
- const codes = [];
483
+ const canonical = [];
484
+ const native = [];
485
+ const add = (codes, field) => {
486
+ if (typeof field !== 'string') return;
487
+ const code = field.trim().toLowerCase();
488
+ if (code && !codes.includes(code)) codes.push(code);
489
+ };
403
490
  for (const item of chain) {
404
491
  if (!item || typeof item !== 'object') continue;
405
- for (const field of codeFields(item)) {
406
- if (typeof field !== 'string') continue;
407
- const code = field.trim().toLowerCase();
408
- if (code && !codes.includes(code)) codes.push(code);
409
- }
492
+ const fields = codeFields(item);
493
+ for (const field of fields.canonical) add(canonical, field);
494
+ for (const field of fields.native) add(native, field);
410
495
  }
411
- return codes;
496
+ return canonical.length ? canonical : native;
412
497
  }
413
498
 
414
499
  const VALID_STATUS = (n) => Number.isFinite(n) && n >= 100 && n <= 599;
@@ -421,6 +506,56 @@ function statusOf(err) {
421
506
  return 0;
422
507
  }
423
508
 
509
+ // OpenRouter answers a 402 with this marker when concurrent in-flight spend is
510
+ // capped; it clears as requests finish (Retry-After), unlike a spent balance.
511
+ const IN_FLIGHT_BUDGET = 'openrouter_in_flight_budget';
512
+
513
+ const IN_FLIGHT_BUDGET_MAX_WAIT_MS = 60_000;
514
+
515
+ // Retry-After advice for the budget exception: a valid `0` ("retry now") is
516
+ // advice here, although retryAfterMsFromError treats zero as none.
517
+ function inFlightAdviceMs(err) {
518
+ const advised = retryAfterMsFromError(err);
519
+ if (advised != null) return advised;
520
+ for (const [name, unitMs] of [
521
+ ['retry-after-ms', 1],
522
+ ['retry-after', 1000],
523
+ ]) {
524
+ const value = errorHeaderValue(err, name);
525
+ const n = Number(value);
526
+ if (value != null && String(value).trim() !== '' && Number.isFinite(n) && n >= 0) return n * unitMs;
527
+ }
528
+ return null;
529
+ }
530
+
531
+ // Only a 402 that names the marker AND carries Retry-After advice of 0..60s
532
+ // inclusive is a wait; without advice (or with a long one) it stays billing.
533
+ function isInFlightBudget402(chain, status, adviceMs) {
534
+ if (status !== 402 || adviceMs == null || adviceMs > IN_FLIGHT_BUDGET_MAX_WAIT_MS) return false;
535
+ return chain.some((item) => {
536
+ if (!item || typeof item !== 'object') return false;
537
+ const detail = wireDetail(item);
538
+ return [
539
+ detail?.code,
540
+ detail?.type,
541
+ detail?.metadata?.code,
542
+ detail?.metadata?.type,
543
+ detail?.metadata?.reason,
544
+ detail?.metadata?.limit_source,
545
+ item.code,
546
+ item.type,
547
+ item.error?.code,
548
+ item.error?.type,
549
+ item.error?.metadata?.code,
550
+ item.error?.metadata?.type,
551
+ item.error?.metadata?.reason,
552
+ item.error?.metadata?.limit_source,
553
+ item.error?.error?.code,
554
+ item.error?.error?.type,
555
+ ].some((value) => typeof value === 'string' && value.trim().toLowerCase() === IN_FLIGHT_BUDGET);
556
+ });
557
+ }
558
+
424
559
  function kindFromStatus(status) {
425
560
  if (status === 401) return 'auth';
426
561
  if (status === 402) return 'billing';
@@ -513,17 +648,22 @@ export function providerErrorKind(err, options = {}) {
513
648
  const codes = typedCodes(chain);
514
649
  const describe = (kind, code = typedErrorCode(err)) => ({ kind, code: code || '', status, retryAfterMs, resetAt });
515
650
 
651
+ // A local fixed-overhead refusal is no provider kind, whatever its text names.
652
+ if (isToolSurfaceExceedsContextError(err)) return describe('unknown', TOOL_SURFACE_EXCEEDS_CONTEXT);
516
653
  // Validated account-pool evidence and boundary-stamped re-auth decide first.
517
654
  if (err.quotaExhausted && typeof err.quotaExhausted === 'object') return describe('quota_exhausted');
518
655
  if (chain.some((item) => item?.reauthRequired === true)) return describe('auth');
656
+ if (isInFlightBudget402(chain, status, inFlightAdviceMs(err))) return describe('transient', IN_FLIGHT_BUDGET);
657
+ // Every other 402 is a billing refusal, whatever generic retryable code
658
+ // (server_error, rate_limit_exceeded) its body also carries.
659
+ if (status === 402) return describe('billing');
519
660
 
520
661
  let { kind, code } = kindFromCodes(codes, scope);
521
662
  // Explicit quota flags (Anthropic unified-status rejected headers) outrank a
522
663
  // generic rate-limit code or status; they never turn an overload (or a more
523
664
  // specific refusal) into quota.
524
665
  const quotaFlagged =
525
- options.quotaFlags !== false &&
526
- chain.some((item) => item?.providerQuota === true || item?.quotaExceeded === true);
666
+ options.quotaFlags !== false && chain.some((item) => item?.providerQuota === true || item?.quotaExceeded === true);
527
667
  if (quotaFlagged && (!kind || kind === 'rate_limited')) kind = 'quota_exhausted';
528
668
  // Wordings, for untyped errors only (a typed code always decides).
529
669
  const text = options.text !== false && (!kind || kind === 'invalid_request') ? messageOf(err, chain) : '';
@@ -24,7 +24,7 @@ const signatures = new Map();
24
24
  // preservation guard and the getProvider self-heal read it through these two
25
25
  // helpers so "usable right now" and "genuinely gone" are answered identically
26
26
  // in both places.
27
- const OAUTH_PROVIDER_NAMES = new Set([
27
+ export const OAUTH_PROVIDER_NAMES = new Set([
28
28
  'anthropic-oauth',
29
29
  'openai-oauth',
30
30
  'grok-oauth',
@@ -179,6 +179,9 @@ const PROVIDER_MODULES = {
179
179
  openai: ['./openai-ws.mjs', 'OpenAIDirectProvider'],
180
180
  'mixdog-local': ['./mixdog-local.mjs', 'MixdogLocalProvider'],
181
181
  'opencode-go': ['./opencode-go.mjs', 'OpenCodeGoProvider'],
182
+ // Multi-wire preset gateways (wire-route.mjs picks the wire per model).
183
+ openrouter: ['./openrouter.mjs', 'OpenRouterProvider'],
184
+ deepseek: ['./deepseek.mjs', 'DeepSeekProvider'],
182
185
  };
183
186
 
184
187
  // User-defined providers (cfg.type === 'custom') are keyed by a generated
@@ -209,7 +212,7 @@ async function instantiateProvider(name, Ctor, cfg, proxyChannel = null) {
209
212
  return wrapProviderAdmission(createModelProxyProvider(name, cfg, proxyChannel ?? getModelProxyChannel()), name);
210
213
  }
211
214
  if (isCustomProviderConfig(name, cfg)) return wrapProviderAdmission(await Ctor(name, cfg), name);
212
- if (Object.hasOwn(OPENAI_COMPAT_PRESETS, name) && name !== 'opencode-go') {
215
+ if (Object.hasOwn(OPENAI_COMPAT_PRESETS, name) && !Object.hasOwn(PROVIDER_MODULES, name)) {
213
216
  return wrapProviderAdmission(new Ctor(name, cfg), name);
214
217
  }
215
218
  return createAccountPoolProvider(name, () => wrapProviderAdmission(new Ctor(cfg), name));
@@ -495,6 +498,14 @@ export function providerInputExcludesCache(name) {
495
498
  export function providerNativePdf(name) {
496
499
  return providerTakesNativePdf(providers.get(String(name || '').toLowerCase()));
497
500
  }
501
+ /**
502
+ * Whether the named provider's adapter declares `consumesReadWindows`: it
503
+ * needs the structured clip report of read results. A pure lookup; a proxy
504
+ * stand-in carries the PC adapter's declared trait.
505
+ */
506
+ export function providerConsumesReadWindows(name) {
507
+ return providers.get(String(name || '').toLowerCase())?.consumesReadWindows === true;
508
+ }
498
509
  export function getAllProviders() {
499
510
  // Defensive copy — callers must not mutate the live registry or retain
500
511
  // stale entries across re-init (initProviders rebuilds the map in place).
@@ -10,6 +10,7 @@ import {
10
10
  TOKEN_CONTEXT_OVERFLOW_PATTERNS,
11
11
  TRANSIENT_SDK_NAMES,
12
12
  boundedCauseChain,
13
+ isToolSurfaceExceedsContextError,
13
14
  isTransientErrorCode,
14
15
  providerErrorKind,
15
16
  typedCodeKind,
@@ -463,6 +464,10 @@ const REQUEST_TOO_LARGE_KIND = 'request_too_large';
463
464
  */
464
465
  export function isContextOverflowError(err, _depth = 0) {
465
466
  if (!err || _depth > 2) return false;
467
+ // A local fixed-overhead refusal (anywhere in the chain, at any recursion
468
+ // level) is never a provider overflow: compacting history cannot help it,
469
+ // whatever its text names.
470
+ if (isToolSurfaceExceedsContextError(err)) return false;
466
471
  const code = typedErrorCode(err);
467
472
  if (code && CONTEXT_OVERFLOW_CODES.has(code)) return true;
468
473
  // A typed byte/media-size refusal (a size code, or HTTP 413 without a
@@ -471,7 +476,8 @@ export function isContextOverflowError(err, _depth = 0) {
471
476
  const sizeTyped =
472
477
  typeof err === 'object' &&
473
478
  boundedCauseChain(err).some(
474
- (item) => item && typeof item === 'object' && providerErrorKind(item, { text: false }).kind === REQUEST_TOO_LARGE_KIND
479
+ (item) =>
480
+ item && typeof item === 'object' && providerErrorKind(item, { text: false }).kind === REQUEST_TOO_LARGE_KIND
475
481
  );
476
482
  const patterns = sizeTyped ? TOKEN_CONTEXT_OVERFLOW_PATTERNS : CONTEXT_OVERFLOW_PATTERNS;
477
483
  const msg = (typeof err === 'string' ? err : err?.message) || '';
@@ -0,0 +1,6 @@
1
+ export const TRANSPORT_SCOPE_DISPOSED: 'transport_scope_disposed';
2
+ export function forkTransportScope(sessionId: string, label?: string): string;
3
+ export function disposeTransportScope(
4
+ scope: string,
5
+ provider?: { releaseTransportScope?(scope: string): void } | null
6
+ ): void;
@@ -0,0 +1,28 @@
1
+ // transport-scope.mjs — a send's transport state scope, apart from its
2
+ // session identity. Providers key their session-scoped transport and
3
+ // continuation state (pooled sockets and their previous_response_id anchor,
4
+ // Codex turn-state routing tokens, sticky HTTP fallback, Cursor runs and
5
+ // conversations) by `opts.transportScope || opts.sessionId`, while prompt
6
+ // cache routing (prompt_cache_key, handshake session id) stays on
7
+ // `opts.sessionId`. A request forked from a session (/btw) runs in a scope of
8
+ // its own: it shares the session's prompt cache but reads and writes none of
9
+ // its transport state, and its scope is disposed once it is answered.
10
+ import { randomUUID } from 'node:crypto';
11
+
12
+ /** The reason a scope's provider connections are closed when it is disposed. */
13
+ export const TRANSPORT_SCOPE_DISPOSED = 'transport_scope_disposed';
14
+
15
+ /** A fresh transport scope for one request forked from `sessionId`. */
16
+ export function forkTransportScope(sessionId, label = 'fork') {
17
+ return `${sessionId}#${label}:${randomUUID()}`;
18
+ }
19
+
20
+ /** Close every connection and drop every transport record of `scope`. */
21
+ export function disposeTransportScope(scope, provider) {
22
+ if (!scope) return;
23
+ try {
24
+ globalThis.__mixdogCloseProviderConnectionsForSession?.(scope, TRANSPORT_SCOPE_DISPOSED);
25
+ } finally {
26
+ provider?.releaseTransportScope?.(scope);
27
+ }
28
+ }