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
@@ -6,15 +6,22 @@
6
6
  * account-verification URL Google hides in the error details), and the
7
7
  * per-attempt hand-off of the live stream to the turn collector.
8
8
  */
9
- import { emitProviderRetryStage, markProviderRecoveryExhausted, sleepWithAbort, withRetry } from './retry-classifier.mjs';
9
+ import {
10
+ emitProviderRetryStage,
11
+ markProviderRecoveryExhausted,
12
+ sleepWithAbort,
13
+ withRetry,
14
+ } from './retry-classifier.mjs';
10
15
  import {
11
16
  ANTIGRAVITY_RETRY,
17
+ ANTIGRAVITY_UNCLASSED_FIRST_BYTE,
12
18
  antigravity429WaitMs,
13
19
  isAntigravityCapacityError,
14
20
  } from './antigravity-retry-policy.mjs';
15
- import { createTimeoutSignal } from '../stall-policy.mjs';
21
+ import { createTimeoutSignal, firstByteWindowMs } from '../stall-policy.mjs';
22
+ import { MODEL_THINKING_STAGE } from '../../../shared/quiet-progress.mjs';
23
+ import { TIMEOUT_PHASE, isFirstByteTimeout } from '../../../shared/provider-timeout-phase.mjs';
16
24
  import { getLlmDispatcher } from '../../../shared/llm/http-agent.mjs';
17
- import { GEMINI_FIRST_BYTE_TIMEOUT_MS } from './gemini-stream.mjs';
18
25
  import { _scrubTokens } from './antigravity-oauth-tokens.mjs';
19
26
  import { applyGeminiErrorContract } from './gemini-error-contract.mjs';
20
27
  import { DETERMINISTIC_KINDS, providerErrorKind } from './provider-error-kind.mjs';
@@ -70,13 +77,21 @@ export function antigravityError(res, text, endpoint) {
70
77
  // Account verification is terminal and actionable: surface the URL Google
71
78
  // returns instead of a raw API body the user cannot act on.
72
79
  // Google puts the link in the error details, not the message text.
73
- const validationDetail = Array.isArray(detail?.details)
74
- ? detail.details.find(
75
- (entry) => entry?.reason === 'VALIDATION_REQUIRED' && typeof entry.metadata?.validation_url === 'string'
76
- )
77
- : null;
80
+ // Order: google.rpc.Help.links, metadata.validation_url, metadata.validation_link.
81
+ const detailEntries = Array.isArray(detail?.details) ? detail.details : [];
82
+ const helpUrl = detailEntries
83
+ .flatMap((entry) => (Array.isArray(entry?.links) ? entry.links : []))
84
+ .map((link) => link?.url)
85
+ .find((url) => typeof url === 'string' && url.length > 0);
86
+ const metadataUrl = (key) =>
87
+ detailEntries.find(
88
+ (entry) =>
89
+ entry?.reason === 'VALIDATION_REQUIRED' && typeof entry.metadata?.[key] === 'string' && entry.metadata[key]
90
+ )?.metadata[key];
78
91
  const validationUrl =
79
- validationDetail?.metadata.validation_url ||
92
+ helpUrl ||
93
+ metadataUrl('validation_url') ||
94
+ metadataUrl('validation_link') ||
80
95
  /https:\/\/\S*(?:accounts|console)\.google\.com\/\S+/.exec(message || '')?.[0] ||
81
96
  '';
82
97
  if (res.status === 403 && /VALIDATION_REQUIRED/i.test(text || '')) {
@@ -99,19 +114,53 @@ export function antigravityError(res, text, endpoint) {
99
114
  * @param {object} deps.opts send options (stage heartbeat)
100
115
  * @param {AbortSignal|null} deps.signal retry-loop signal (session pass-through)
101
116
  * @param {{ beginAttempt: Function, consume: Function }} deps.collector
117
+ * @param {{ timeoutMs: number, maxMs: number, retries: number|null }} [deps.firstByte]
118
+ * first-byte window per attempt (antigravityFirstBytePolicy)
102
119
  * @returns {() => Promise<object>} one retried request that resolves the final payload
103
120
  */
104
- export function createAntigravityRequest({ fetchFn, endpoint, headers, body, opts, signal, collector, sleepFn }) {
121
+ export function createAntigravityRequest({
122
+ fetchFn,
123
+ endpoint,
124
+ headers,
125
+ body,
126
+ opts,
127
+ signal,
128
+ collector,
129
+ sleepFn,
130
+ firstByte = ANTIGRAVITY_UNCLASSED_FIRST_BYTE,
131
+ }) {
105
132
  const log = (attempt, lastErr, delayMs) => {
133
+ // A first-byte timeout runs on its own, shorter retry budget.
134
+ const firstByteLimited = isFirstByteTimeout(lastErr) && firstByte.retries != null;
106
135
  emitProviderRetryStage(opts.onStageChange, {
107
136
  attempt: attempt + 1,
108
- maxAttempts: ANTIGRAVITY_RETRY.maxAttempts,
137
+ maxAttempts: firstByteLimited
138
+ ? Math.min(ANTIGRAVITY_RETRY.maxAttempts, firstByte.retries + 1)
139
+ : ANTIGRAVITY_RETRY.maxAttempts,
109
140
  lastErr,
110
141
  delayMs,
111
142
  });
112
143
  process.stderr.write(`[antigravity] retry ${attempt + 1} after ${lastErr?.message || 'transient error'}\n`);
113
144
  };
114
- const attemptOnce = () =>
145
+ // Stamps what the attempt tells the user: how many attempts ran and, for a
146
+ // first-byte timeout, how long the model was given in total. A timeout past
147
+ // the first-byte retry budget ends the ladder here. A caller's cancellation
148
+ // reason may be shared by other requests and is never stamped.
149
+ const noteFailure = (err, { attemptSignal, windowMs, send }) => {
150
+ if (!err || typeof err !== 'object' || attemptSignal?.aborted) return err;
151
+ send.attempts += 1;
152
+ err.attempts = send.attempts;
153
+ if (!isFirstByteTimeout(err)) return err;
154
+ send.firstByteTimeouts += 1;
155
+ send.firstByteWaitedMs += windowMs;
156
+ err.waitedMs = send.firstByteWaitedMs;
157
+ err.providerLabel = 'Antigravity';
158
+ if (firstByte.retries != null && send.firstByteTimeouts > firstByte.retries) {
159
+ markProviderRecoveryExhausted(err, { owner: 'antigravity-first-byte', attempts: send.attempts, terminal: true });
160
+ }
161
+ return err;
162
+ };
163
+ const attemptOnce = (send) =>
115
164
  withRetry(
116
165
  async ({ signal: attemptSignal }) => {
117
166
  try {
@@ -119,37 +168,63 @@ export function createAntigravityRequest({ fetchFn, endpoint, headers, body, opt
119
168
  } catch {
120
169
  /* heartbeat */
121
170
  }
122
- const firstByte = createTimeoutSignal(attemptSignal, GEMINI_FIRST_BYTE_TIMEOUT_MS, 'Antigravity first byte');
123
- let res;
171
+ const windowMs = firstByteWindowMs(firstByte, send.firstByteTimeouts);
124
172
  try {
125
- res = await fetchFn(`${endpoint}/v1internal:streamGenerateContent?alt=sse`, {
126
- method: 'POST',
127
- headers,
128
- body,
129
- signal: firstByte.signal,
130
- dispatcher: getLlmDispatcher(),
131
- });
132
- } catch (err) {
133
- // Fetch surfaces AbortError; rethrow the timer/parent
134
- // reason so same-host retry sees EPROVIDERTIMEOUT and
135
- // a caller cancel stays a cancel.
136
- if (firstByte.signal.aborted && firstByte.signal.reason instanceof Error) {
137
- throw firstByte.signal.reason;
173
+ const firstByteTimer = createTimeoutSignal(attemptSignal, windowMs, 'Antigravity first byte');
174
+ let res;
175
+ try {
176
+ const response = fetchFn(`${endpoint}/v1internal:streamGenerateContent?alt=sse`, {
177
+ method: 'POST',
178
+ headers,
179
+ body,
180
+ signal: firstByteTimer.signal,
181
+ dispatcher: getLlmDispatcher(),
182
+ });
183
+ // The request is on the wire and its headers are pending: the
184
+ // gateway sends them only with the first chunk, so this wait is
185
+ // the model's queueing and thinking time.
186
+ try {
187
+ opts.onStageChange?.(MODEL_THINKING_STAGE);
188
+ } catch {
189
+ /* heartbeat */
190
+ }
191
+ res = await response;
192
+ } catch (err) {
193
+ // Fetch surfaces AbortError; rethrow the timer/parent
194
+ // reason so same-host retry sees EPROVIDERTIMEOUT and
195
+ // a caller cancel stays a cancel.
196
+ if (firstByteTimer.signal.aborted && firstByteTimer.signal.reason instanceof Error) {
197
+ const reason = firstByteTimer.signal.reason;
198
+ if (!attemptSignal?.aborted) reason.timeoutPhase = TIMEOUT_PHASE.HEADERS;
199
+ throw reason;
200
+ }
201
+ throw err;
202
+ } finally {
203
+ firstByteTimer.cleanup();
138
204
  }
139
- throw err;
140
- } finally {
141
- firstByte.cleanup();
142
- }
143
- if (!res.ok) {
144
- const text = await res.text().catch(() => '');
145
- const failure = antigravityError(res, text, endpoint);
146
- // Capacity is paced by the local schedule below; the generic loop
147
- // would sleep whatever wait the server names.
148
- if (isCapacityFailure(failure)) markProviderRecoveryExhausted(failure, { owner: 'antigravity-capacity' });
149
- throw failure;
205
+ // Headers arrived: the connection is live even while the model
206
+ // has not produced its first chunk.
207
+ try {
208
+ opts.onStreamDelta?.('transport');
209
+ } catch {}
210
+ if (!res.ok) {
211
+ const text = await res.text().catch(() => '');
212
+ const failure = antigravityError(res, text, endpoint);
213
+ // Capacity is paced by the local schedule below; the generic loop
214
+ // would sleep whatever wait the server names.
215
+ if (isCapacityFailure(failure)) markProviderRecoveryExhausted(failure, { owner: 'antigravity-capacity' });
216
+ throw failure;
217
+ }
218
+ try {
219
+ opts.onStageChange?.('streaming');
220
+ } catch {
221
+ /* heartbeat */
222
+ }
223
+ collector.beginAttempt();
224
+ return await collector.consume(res, attemptSignal, { firstByteTimeoutMs: windowMs });
225
+ } catch (err) {
226
+ throw noteFailure(err, { attemptSignal, windowMs, send });
150
227
  }
151
- collector.beginAttempt();
152
- return collector.consume(res, attemptSignal);
153
228
  },
154
229
  {
155
230
  ...ANTIGRAVITY_RETRY,
@@ -164,9 +239,10 @@ export function createAntigravityRequest({ fetchFn, endpoint, headers, body, opt
164
239
  // gets one quick retry, a spent quota surfaces.
165
240
  return async () => {
166
241
  const state = { capacityRetries: 0, quickRetried: false };
242
+ const send = { attempts: 0, firstByteTimeouts: 0, firstByteWaitedMs: 0 };
167
243
  for (let tried = 1; ; tried++) {
168
244
  try {
169
- return await attemptOnce();
245
+ return await attemptOnce(send);
170
246
  } catch (err) {
171
247
  const waitMs = antigravity429WaitMs(err, state);
172
248
  if (waitMs == null) {
@@ -20,7 +20,7 @@ import { createNpmVersionSource, maxSemver } from './npm-cli-version.mjs';
20
20
  // version (gpt-6.1-sol requires >= 0.159.0, measured 2026-10-09), so the
21
21
  // release workflow raises this to the published CLI version on every release
22
22
  // (scripts/sync-client-version-floors.mjs).
23
- export const CODEX_CLIENT_VERSION_FLOOR = '0.162.1';
23
+ export const CODEX_CLIENT_VERSION_FLOOR = '0.163.0';
24
24
  export const CODEX_CLI_NPM_PACKAGE = '@openai/codex';
25
25
  const live = createNpmVersionSource(CODEX_CLI_NPM_PACKAGE, { persistKey: 'codex-cli' });
26
26
 
@@ -2,23 +2,25 @@
2
2
  * Command Code provider (commandcode.ai Provider API).
3
3
  *
4
4
  * Credentials are a Studio-issued API key (command-code-oauth-tokens.mjs).
5
- * Each model is served on the endpoint its /models row declares: Chat
6
- * Completions through the OpenAI-compatible engine, Messages-only models
7
- * (Claude) through the Anthropic engine. Both clients are pinned to the
8
- * Command Code API host. The key never expires and has no refresh grant: a
9
- * 401 means the user must sign in again.
5
+ * Each model is served on a wire its /models row declares (wire-route.mjs
6
+ * picks among them): Chat Completions and Responses through the
7
+ * OpenAI-compatible engine, Messages through the Anthropic engine. Both
8
+ * clients are pinned to the Command Code API host. The key never expires and
9
+ * has no refresh grant: a 401 means the user must sign in again.
10
10
  */
11
11
  import { noteErrorUsage } from './lib/note-error-usage.mjs';
12
12
  import { fileMtimeMs, normalizeExpiresAtMs, scrubOAuthSecrets } from './lib/oauth-token-utils.mjs';
13
+ import { originBoundFetch } from './lib/origin-bound-fetch.mjs';
14
+ import { withInclusiveUsage } from './lib/inclusive-usage.mjs';
13
15
  import { OpenAICompatProvider, preloadOpenAICompatRuntime } from './openai-compat.mjs';
14
16
  import { COMPAT_RETRY_POLICY } from './openai-compat-retry-profile.mjs';
15
17
  import { listCompatModels } from './openai-compat-models.mjs';
16
18
  import { AnthropicProvider } from './anthropic.mjs';
17
- import { toInclusiveOpenCodeGoUsage as toInclusiveUsage } from './opencode-go.mjs';
18
19
  import { sanitizeToolPairs } from '../session/context-utils.mjs';
19
20
  import { preparePdfTextForProvider } from './media-normalization.mjs';
20
- import { currentUsageContext } from '../../../shared/llm/usage-context.mjs';
21
21
  import { makeModelCache } from './model-cache.mjs';
22
+ import { resolveWireRoute, sendOnRoute } from './wire-route.mjs';
23
+ import { gatewayMessagesOpts } from './wire-gateway.mjs';
22
24
  import {
23
25
  API_ORIGIN,
24
26
  CREDITS_URL,
@@ -38,8 +40,11 @@ export {
38
40
  export { beginOAuthLogin, loginOAuth } from './command-code-oauth-login.mjs';
39
41
 
40
42
  export const DEFAULT_MODEL = 'deepseek/deepseek-v4-flash';
41
- const CHAT_ENDPOINT = '/chat/completions';
42
- const MESSAGES_ENDPOINT = '/messages';
43
+ const ENDPOINT_WIRES = Object.freeze({
44
+ '/chat/completions': 'chat',
45
+ '/messages': 'messages',
46
+ '/responses': 'responses',
47
+ });
43
48
  // The Anthropic SDK appends /v1/messages itself.
44
49
  const MESSAGES_BASE_URL = `${API_ORIGIN}/provider`;
45
50
  const FIVE_HOURS_MS = 5 * 60 * 60 * 1000;
@@ -56,35 +61,45 @@ const commandCodeModelCache = makeModelCache({
56
61
  });
57
62
 
58
63
  /**
59
- * The wire a /models row is served on: 'chat' when it declares Chat
60
- * Completions or declares no endpoints at all, 'messages' when it declares
61
- * only Messages, null when it declares neither.
64
+ * The wires a /models row declares (`supported_endpoints`), or null when it
65
+ * declares none — such a row is served on Chat Completions by convention.
66
+ */
67
+ export function modelEndpoints(item) {
68
+ const declared = item?.supported_endpoints;
69
+ if (!Array.isArray(declared)) return null;
70
+ const wires = [];
71
+ for (const endpoint of declared) {
72
+ const path = String(endpoint).replace(/^\/?(?:provider\/)?(?:v1\/)?/, '/');
73
+ const wire = Object.hasOwn(ENDPOINT_WIRES, path) ? ENDPOINT_WIRES[path] : null;
74
+ if (wire && !wires.includes(wire)) wires.push(wire);
75
+ }
76
+ return wires;
77
+ }
78
+
79
+ // The route for a model with these declared endpoints (null: undeclared, Chat).
80
+ // `undefined`: nothing describes the model, so no wire is ruled out.
81
+ function commandCodeRoute(model, endpoints, ctx = {}) {
82
+ return resolveWireRoute(PROVIDER_ID, model, {
83
+ ...ctx,
84
+ endpoints: endpoints === undefined ? null : (endpoints ?? ['chat']),
85
+ });
86
+ }
87
+
88
+ /**
89
+ * The wire a /models row is served on (wire-route.mjs over its declared
90
+ * endpoints): Responses for GPT / Muse / Grok when advertised, otherwise Chat
91
+ * when declared or undeclared, Messages when it is the only one, Responses
92
+ * for a Responses-only row; null when it declares none of them.
62
93
  */
63
94
  export function modelWire(item) {
64
95
  if (typeof item?.id !== 'string' || !item.id) return null;
65
- const endpoints = item.supported_endpoints;
66
- if (!Array.isArray(endpoints)) return 'chat';
67
- const declared = endpoints.map((endpoint) => String(endpoint).replace(/^\/?(?:provider\/)?(?:v1\/)?/, '/'));
68
- if (declared.includes(CHAT_ENDPOINT)) return 'chat';
69
- if (declared.includes(MESSAGES_ENDPOINT)) return 'messages';
70
- return null;
96
+ return commandCodeRoute(item.id, modelEndpoints(item))?.wire || null;
71
97
  }
72
98
 
73
- // Every request either engine makes goes through this fetch: anything outside
74
- // the Command Code API origin is refused before the key leaves the process,
75
- // and redirects are never followed (any 3xx is an error).
99
+ // Every request either engine makes goes through this fetch: only the Command
100
+ // Code API origin, never a redirect.
76
101
  function apiOnlyFetch(fetchImpl) {
77
- return async (input, init) => {
78
- const url = new URL(String(input?.url ?? input));
79
- if (url.origin !== API_ORIGIN) {
80
- throw new Error(`[command-code-oauth] refusing to send the API key to ${url.host}`);
81
- }
82
- const res = await (fetchImpl || globalThis.fetch)(input, { ...init, redirect: 'manual' });
83
- if (res.status >= 300 && res.status < 400) {
84
- throw new Error(`[command-code-oauth] refusing to follow a redirect from ${url.host}`);
85
- }
86
- return res;
87
- };
102
+ return originBoundFetch(API_ORIGIN, fetchImpl, PROVIDER_ID);
88
103
  }
89
104
 
90
105
  // Anthropic engine bound to this credential: only the Command Code key is
@@ -98,15 +113,11 @@ class CommandCodeMessagesEngine extends AnthropicProvider {
98
113
  client.fetch = apiOnlyFetch(this.config.fetchImpl);
99
114
  return client;
100
115
  }
101
- }
102
-
103
- const normalizeUsageError = (err) => {
104
- if (err && typeof err === 'object') {
105
- if (err.usage) err.usage = toInclusiveUsage(err.usage);
106
- if (err.partialUsage) err.partialUsage = toInclusiveUsage(err.partialUsage);
116
+ // The roster's output ceiling reaches the shared request builder.
117
+ _sendOnce(messages, model, tools, opts) {
118
+ return super._sendOnce(messages, model, tools, gatewayMessagesOpts(this.config, model, messages, opts));
107
119
  }
108
- return err;
109
- };
120
+ }
110
121
 
111
122
  function rosterRow(item) {
112
123
  const contextWindow = Number(item.context_window ?? item.max_context_window ?? item.context_length ?? 0);
@@ -118,6 +129,11 @@ function rosterRow(item) {
118
129
  ...(name ? { name: name.trim() } : {}),
119
130
  ...(contextWindow > 0 ? { contextWindow } : {}),
120
131
  ...(outputTokens > 0 ? { outputTokens } : {}),
132
+ // The full declared endpoint set: the cached route metadata a later
133
+ // send falls back on when the live roster cannot be read.
134
+ ...(Array.isArray(item.supported_endpoints)
135
+ ? { supportedEndpoints: item.supported_endpoints.map((endpoint) => String(endpoint)) }
136
+ : {}),
121
137
  };
122
138
  }
123
139
 
@@ -147,11 +163,16 @@ function scrubErrorSecrets(err, apiKey) {
147
163
  }
148
164
 
149
165
  // Redact where the transport first surfaces errors (request open and stream
150
- // iteration), so the shared retry reporter never logs the key.
166
+ // iteration) on the Chat and Responses endpoints, so the shared retry
167
+ // reporter never logs the key.
151
168
  function redactClientErrors(client, apiKey) {
152
- const completions = client?.chat?.completions;
153
- if (!completions || !apiKey || completions.create?.commandCodeRedacting === apiKey) return;
154
- const create = completions.create.bind(completions);
169
+ redactCreateErrors(client?.chat?.completions, apiKey);
170
+ redactCreateErrors(client?.responses, apiKey);
171
+ }
172
+
173
+ function redactCreateErrors(endpoint, apiKey) {
174
+ if (!endpoint || !apiKey || endpoint.create?.commandCodeRedacting === apiKey) return;
175
+ const create = endpoint.create.bind(endpoint);
155
176
  const wrapped = async (...args) => {
156
177
  try {
157
178
  const stream = await create(...args);
@@ -177,7 +198,7 @@ function redactClientErrors(client, apiKey) {
177
198
  }
178
199
  };
179
200
  wrapped.commandCodeRedacting = apiKey;
180
- completions.create = wrapped;
201
+ endpoint.create = wrapped;
181
202
  }
182
203
 
183
204
  // Same for the Anthropic client's streaming request (read through
@@ -253,8 +274,9 @@ export class CommandCodeOAuthProvider {
253
274
  _defaultModelKey = null;
254
275
  _messages = null;
255
276
  _messagesKey = null;
256
- // Model id → wire ('chat' | 'messages') from the roster fetched with `_wiresKey`.
257
- _wires = new Map();
277
+ // Model id → declared endpoint wires (null: undeclared) from the roster
278
+ // fetched with `_wiresKey`.
279
+ _endpoints = new Map();
258
280
  _wiresKey = null;
259
281
 
260
282
  constructor(config) {
@@ -315,6 +337,8 @@ export class CommandCodeOAuthProvider {
315
337
  apiKey,
316
338
  baseURL: MESSAGES_BASE_URL,
317
339
  disableBetaHeaders: true,
340
+ modelMaxOutputTokens: (model) =>
341
+ commandCodeModelCache.loadSync({ allowStale: true })?.find((row) => row?.id === model)?.outputTokens,
318
342
  // x-api-key from the SDK plus the bearer form of the same key.
319
343
  extraHeaders: { Authorization: `Bearer ${apiKey}` },
320
344
  });
@@ -324,8 +348,9 @@ export class CommandCodeOAuthProvider {
324
348
  return engine;
325
349
  }
326
350
 
327
- // Servable rows from /models; only the latest fetch with the still-active
328
- // key publishes the roster and the per-model wire map.
351
+ // Servable rows from /models (any declared Chat, Messages or Responses
352
+ // endpoint, or none declared); only the latest fetch with the still-active
353
+ // key publishes the roster and the per-model endpoint map.
329
354
  async _fetchRoster(apiKey, signal = null) {
330
355
  const publish = commandCodeModelCache.beginSave(() => loadTokens()?.apiKey === apiKey);
331
356
  const body = await requestCommandCodeJson(`${PROVIDER_BASE_URL}/models`, apiKey, {
@@ -338,16 +363,30 @@ export class CommandCodeOAuthProvider {
338
363
  const items = list.filter((item) => modelWire(item));
339
364
  publish(items.map(rosterRow));
340
365
  if (this.tokens?.apiKey === apiKey) {
341
- this._wires = new Map(items.map((item) => [item.id, modelWire(item)]));
366
+ // Rows accumulate for one key: a later roster that misses a model
367
+ // leaves the endpoints it was last listed with.
368
+ const known = this._wiresKey === apiKey ? this._endpoints : new Map();
369
+ for (const item of items) known.set(item.id, modelEndpoints(item));
370
+ this._endpoints = known;
342
371
  this._wiresKey = apiKey;
343
372
  }
344
373
  return items;
345
374
  }
346
375
 
347
- // The wire for a model, from this credential's roster (fetched once when
348
- // missing). A model the roster does not know, or a roster that cannot be
349
- // read right now, stays on Chat Completions; a rejected key is surfaced.
350
- async _wireFor(inner, model) {
376
+ // A model's declared endpoints: what this credential's rosters listed,
377
+ // then the persisted roster (a roster miss or a roster that cannot be read
378
+ // right now must not move a known Messages-only model to Chat). null is a
379
+ // row declaring none (Chat); undefined is a model nothing describes.
380
+ _endpointsFor(apiKey, model) {
381
+ if (this._wiresKey === apiKey && this._endpoints.has(model)) return this._endpoints.get(model);
382
+ const cached = commandCodeModelCache.loadSync({ allowStale: true })?.find((row) => row?.id === model);
383
+ return cached ? modelEndpoints({ supported_endpoints: cached.supportedEndpoints }) : undefined;
384
+ }
385
+
386
+ // This credential's route for a model (the roster is fetched once when
387
+ // missing; a roster that cannot be read falls back on the persisted rows);
388
+ // a rejected key is surfaced.
389
+ async _routeFor(inner, model, ctx = {}) {
351
390
  if (this._wiresKey !== inner.apiKey) {
352
391
  try {
353
392
  await listCompatModels(inner, { throwOnError: true });
@@ -355,7 +394,16 @@ export class CommandCodeOAuthProvider {
355
394
  if (isUnauthorized(err)) throw err;
356
395
  }
357
396
  }
358
- return (this._wiresKey === inner.apiKey && this._wires.get(model)) || 'chat';
397
+ const endpoints = this._endpointsFor(inner.apiKey, model);
398
+ return commandCodeRoute(model, endpoints, {
399
+ ...ctx,
400
+ override: this.config?.modelWires?.[model] ?? null,
401
+ known: endpoints !== undefined,
402
+ });
403
+ }
404
+
405
+ resolveWireRoute(model, ctx = {}) {
406
+ return this._routeFor(this._ensureInner(), model, ctx);
359
407
  }
360
408
 
361
409
  // A rejected key needs a fresh sign-in; the gateway's own detail stays attached.
@@ -382,17 +430,21 @@ export class CommandCodeOAuthProvider {
382
430
  throw this._shapeError(err, this.tokens?.apiKey);
383
431
  }
384
432
  const apiKey = this._innerKey;
385
- // The model's declared endpoint picks the wire; a caller cannot move a
386
- // model to Responses.
387
- const { compatWireApi: _wire, responsesTransport: _transport, ...opts } = sendOpts || {};
433
+ // The model's route (the session's pinned one, else its declared
434
+ // endpoints) picks the wire; a caller's compat wire flag cannot move it.
435
+ const { compatWireApi: _wire, responsesTransport: _transport, ...callerOpts } = sendOpts || {};
388
436
  try {
389
437
  const useModel = model || (await this._pickDefaultModel(inner));
390
- if ((await this._wireFor(inner, useModel)) === 'messages') {
391
- return await this._sendMessages(apiKey, messages, useModel, tools, opts);
392
- }
393
- // _doSend directly: the compat wrapper's 401 handler reloads a static
394
- // config key, which does not apply to this credential.
395
- return await inner._doSend(messages, useModel, tools, opts);
438
+ // One clear "unsupported" refusal moves the send to the next wire once.
439
+ return await sendOnRoute(this, useModel, tools, callerOpts, messages, (wire, history, opts) => {
440
+ if (wire === 'messages') return this._sendMessages(apiKey, history, useModel, tools, opts);
441
+ // _doSend directly: the compat wrapper's 401 handler reloads a static
442
+ // config key, which does not apply to this credential.
443
+ if (wire === 'responses') {
444
+ return inner._doSend(history, useModel, tools, { ...opts, compatWireApi: 'responses' });
445
+ }
446
+ return inner._doSend(history, useModel, tools, opts);
447
+ });
396
448
  } catch (err) {
397
449
  throw this._shapeError(err, apiKey);
398
450
  }
@@ -405,14 +457,7 @@ export class CommandCodeOAuthProvider {
405
457
  async _sendMessages(apiKey, messages, model, tools, opts) {
406
458
  const engine = this._ensureMessages(apiKey);
407
459
  const prepared = await preparePdfTextForProvider(sanitizeToolPairs(messages), engine);
408
- const identity = currentUsageContext();
409
- if (identity) identity.normalizeAbandonedUsage = toInclusiveUsage;
410
- try {
411
- const result = await engine._doSend(prepared, model, tools, opts);
412
- return result?.usage ? { ...result, usage: toInclusiveUsage(result.usage) } : result;
413
- } catch (err) {
414
- throw normalizeUsageError(err);
415
- }
460
+ return withInclusiveUsage(() => engine._doSend(prepared, model, tools, opts));
416
461
  }
417
462
 
418
463
  async listModels() {
@@ -1,5 +1,6 @@
1
1
  // Shared request controls for Chat Completions and Responses gateways.
2
2
  import { emitProviderRetryStage, retryDelayLabel } from './retry-classifier.mjs';
3
+ import { isTogetherBaseURL } from './openai-compat-reasoning-field.mjs';
3
4
 
4
5
  // withRetry onRetry for the compat stream sends: one stderr line plus a
5
6
  // display-only 'reconnecting' stage for the UI.
@@ -13,8 +14,83 @@ export function compatStreamRetryReporter(label, opts) {
13
14
  };
14
15
  }
15
16
 
16
- export function applyCompatToolChoice(body, opts = {}) {
17
- if (body.tools?.length && opts.toolChoice === 'none') body.tool_choice = 'none';
17
+ // Providers whose docs accept `required` / named tool_choice, and the subset
18
+ // that also documents `parallel_tool_calls`. DeepSeek documents no
19
+ // parallel_tool_calls, and rejects forced choices in thinking mode.
20
+ const FORCED_CHOICE_PROVIDERS = new Set([
21
+ 'xai',
22
+ 'deepseek',
23
+ 'openrouter',
24
+ 'mistral',
25
+ 'groq',
26
+ 'fireworks',
27
+ 'together',
28
+ 'command-code-oauth',
29
+ ]);
30
+ const PARALLEL_CALLS_PROVIDERS = new Set([
31
+ 'xai',
32
+ 'openrouter',
33
+ 'mistral',
34
+ 'groq',
35
+ 'fireworks',
36
+ 'together',
37
+ 'command-code-oauth',
38
+ ]);
39
+
40
+ function hostMatches(baseURL, domain) {
41
+ try {
42
+ const host = new URL(String(baseURL || '')).hostname.toLowerCase();
43
+ return host === domain || host.endsWith(`.${domain}`);
44
+ } catch {
45
+ return false;
46
+ }
47
+ }
48
+
49
+ function compatToolFamily(provider, baseURL) {
50
+ if (FORCED_CHOICE_PROVIDERS.has(provider)) return provider;
51
+ if (isTogetherBaseURL(baseURL)) return 'together';
52
+ if (hostMatches(baseURL, 'fireworks.ai')) return 'fireworks';
53
+ if (hostMatches(baseURL, 'mistral.ai')) return 'mistral';
54
+ if (hostMatches(baseURL, 'groq.com')) return 'groq';
55
+ return null;
56
+ }
57
+
58
+ function forcedToolChoice(choice, wire) {
59
+ if (choice === 'required') return 'required';
60
+ if (!choice || typeof choice !== 'object') return null;
61
+ const name = choice.function?.name || choice.name;
62
+ if (typeof name !== 'string' || !name) return null;
63
+ return wire === 'responses' ? { type: 'function', name } : { type: 'function', function: { name } };
64
+ }
65
+
66
+ /**
67
+ * Tool-choice controls. `none` is universal. With `ctx` ({ provider, baseURL,
68
+ * wire: 'chat'|'responses', thinking: 'enabled'|'disabled'|null }) the
69
+ * documented providers also get explicit `required` / named tool_choice and an
70
+ * explicit boolean `opts.parallelToolCalls`; without it only `none` applies.
71
+ * DeepSeek rejects forced choices while thinking is explicitly enabled and
72
+ * keeps omitting them when thinking is left to the server default.
73
+ */
74
+ export function applyCompatToolChoice(body, opts = {}, ctx = null) {
75
+ if (!(body.tools?.length > 0)) return body;
76
+ if (opts.toolChoice === 'none') body.tool_choice = 'none';
77
+ const family = ctx?.provider ? compatToolFamily(ctx.provider, ctx.baseURL) : null;
78
+ if (!family) return body;
79
+ const forced = forcedToolChoice(opts.toolChoice, ctx.wire);
80
+ if (forced) {
81
+ if (family === 'deepseek' && ctx.thinking === 'enabled') {
82
+ throw Object.assign(
83
+ new Error(
84
+ '[deepseek] tool_choice "required" or a named tool is not supported in thinking mode; disable thinking (effort none) to force a tool call'
85
+ ),
86
+ { code: 'unsupported_tool_choice' }
87
+ );
88
+ }
89
+ if (family !== 'deepseek' || ctx.thinking === 'disabled') body.tool_choice = forced;
90
+ }
91
+ if (typeof opts.parallelToolCalls === 'boolean' && PARALLEL_CALLS_PROVIDERS.has(family)) {
92
+ body.parallel_tool_calls = opts.parallelToolCalls;
93
+ }
18
94
  return body;
19
95
  }
20
96