mixdog 1.2.1 → 1.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (557) hide show
  1. package/README.md +18 -0
  2. package/package.json +2 -1
  3. package/scripts/gate-local.mjs +19 -3
  4. package/scripts/model-catalog-audit.mjs +1 -15
  5. package/scripts/provider-pingpong-live.mjs +509 -0
  6. package/src/agents/advisor/AGENT.md +1 -1
  7. package/src/agents/advisor/agent.json +1 -1
  8. package/src/agents/reviewer/AGENT.md +3 -3
  9. package/src/agents/reviewer/agent.json +1 -1
  10. package/src/defaults/shipped-history.json +6 -0
  11. package/src/defaults/skills/setup/SKILL.md +6 -1
  12. package/src/defaults/skills/setup/references/actions.md +44 -22
  13. package/src/defaults/skills/setup/references/surfaces.md +10 -8
  14. package/src/headless-exec.mjs +15 -8
  15. package/src/lib/keychain-cjs.cjs +7 -4
  16. package/src/output-styles/common.md +11 -10
  17. package/src/repl/slash-commands.mjs +16 -1
  18. package/src/rules/agent/AGENT.md +5 -5
  19. package/src/rules/lead/LEAD.md +5 -5
  20. package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +29 -4
  21. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +10 -0
  22. package/src/runtime/agent/orchestrator/agent-trace-io.mjs +92 -61
  23. package/src/runtime/agent/orchestrator/cache-mtime.mjs +10 -1
  24. package/src/runtime/agent/orchestrator/config-providers-merge.mjs +7 -0
  25. package/src/runtime/agent/orchestrator/config.mjs +5 -0
  26. package/src/runtime/agent/orchestrator/context/collect.mjs +1 -0
  27. package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +26 -7
  28. package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +112 -7
  29. package/src/runtime/agent/orchestrator/mcp/client-config.mjs +36 -7
  30. package/src/runtime/agent/orchestrator/mcp/client-handshake.mjs +49 -10
  31. package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +40 -3
  32. package/src/runtime/agent/orchestrator/mcp/client.mjs +230 -96
  33. package/src/runtime/agent/orchestrator/mcp/oauth-callback.mjs +103 -0
  34. package/src/runtime/agent/orchestrator/mcp/oauth-credentials.mjs +150 -0
  35. package/src/runtime/agent/orchestrator/mcp/oauth-login.mjs +111 -0
  36. package/src/runtime/agent/orchestrator/mcp/oauth-probe.mjs +87 -0
  37. package/src/runtime/agent/orchestrator/mcp/oauth-provider.mjs +95 -0
  38. package/src/runtime/agent/orchestrator/mcp/oauth-request.mjs +122 -0
  39. package/src/runtime/agent/orchestrator/mcp/oauth-shared.mjs +9 -0
  40. package/src/runtime/agent/orchestrator/mcp/oauth.mjs +229 -0
  41. package/src/runtime/agent/orchestrator/providers/account-pool.mjs +188 -29
  42. package/src/runtime/agent/orchestrator/providers/anthropic-api-recovery.mjs +2 -1
  43. package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +48 -20
  44. package/src/runtime/agent/orchestrator/providers/anthropic-api-transport.mjs +94 -31
  45. package/src/runtime/agent/orchestrator/providers/anthropic-error-contract.mjs +98 -0
  46. package/src/runtime/agent/orchestrator/providers/anthropic-fast-mode.mjs +39 -18
  47. package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens-recovery.mjs +55 -0
  48. package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens.mjs +48 -37
  49. package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +10 -7
  50. package/src/runtime/agent/orchestrator/providers/anthropic-midstream-recovery.mjs +18 -4
  51. package/src/runtime/agent/orchestrator/providers/anthropic-model-resolve.mjs +13 -1
  52. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
  53. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-midstream.mjs +10 -1
  54. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-recovery.mjs +23 -9
  55. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/initial-status.mjs +46 -20
  56. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request.mjs +14 -9
  57. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +102 -45
  58. package/src/runtime/agent/orchestrator/providers/anthropic-overload-fallback.mjs +69 -0
  59. package/src/runtime/agent/orchestrator/providers/anthropic-server-fallback.mjs +4 -0
  60. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-blocks.mjs +20 -1
  61. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-delta.mjs +15 -2
  62. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-start.mjs +11 -4
  63. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/message-events.mjs +3 -0
  64. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events.mjs +12 -5
  65. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-outcome.mjs +1 -0
  66. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-state.mjs +14 -0
  67. package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +10 -1
  68. package/src/runtime/agent/orchestrator/providers/anthropic-turn-result.mjs +9 -0
  69. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +40 -7
  70. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-catalog.mjs +30 -9
  71. package/src/runtime/agent/orchestrator/providers/antigravity-oauth.mjs +7 -0
  72. package/src/runtime/agent/orchestrator/providers/antigravity-request.mjs +88 -21
  73. package/src/runtime/agent/orchestrator/providers/antigravity-response.mjs +30 -10
  74. package/src/runtime/agent/orchestrator/providers/antigravity-retry-policy.mjs +106 -0
  75. package/src/runtime/agent/orchestrator/providers/antigravity-stream.mjs +10 -61
  76. package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +94 -15
  77. package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +1 -1
  78. package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +117 -72
  79. package/src/runtime/agent/orchestrator/providers/compat-request-policy.mjs +78 -2
  80. package/src/runtime/agent/orchestrator/providers/cursor-auth.mjs +75 -10
  81. package/src/runtime/agent/orchestrator/providers/cursor-client-version.mjs +1 -1
  82. package/src/runtime/agent/orchestrator/providers/cursor-wire-guards.mjs +97 -2
  83. package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-bridge.mjs +103 -23
  84. package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-messages.mjs +43 -2
  85. package/src/runtime/agent/orchestrator/providers/cursor-wire-transport.mjs +103 -33
  86. package/src/runtime/agent/orchestrator/providers/cursor-wire.mjs +32 -6
  87. package/src/runtime/agent/orchestrator/providers/cursor.mjs +27 -3
  88. package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +64 -1
  89. package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +70 -6
  90. package/src/runtime/agent/orchestrator/providers/custom-reasoning.mjs +34 -7
  91. package/src/runtime/agent/orchestrator/providers/custom-tool-wire.mjs +32 -6
  92. package/src/runtime/agent/orchestrator/providers/deepseek.mjs +67 -0
  93. package/src/runtime/agent/orchestrator/providers/effort-configuration.mjs +80 -18
  94. package/src/runtime/agent/orchestrator/providers/gemini-cache-policy.mjs +11 -4
  95. package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +46 -8
  96. package/src/runtime/agent/orchestrator/providers/gemini-error-contract.mjs +273 -0
  97. package/src/runtime/agent/orchestrator/providers/gemini-family.mjs +9 -0
  98. package/src/runtime/agent/orchestrator/providers/gemini-history-signatures.mjs +9 -4
  99. package/src/runtime/agent/orchestrator/providers/gemini-request-body.mjs +41 -5
  100. package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +3 -1
  101. package/src/runtime/agent/orchestrator/providers/gemini-retry-policy.mjs +180 -0
  102. package/src/runtime/agent/orchestrator/providers/gemini-schema.mjs +369 -112
  103. package/src/runtime/agent/orchestrator/providers/gemini-sdk-request.mjs +3 -1
  104. package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +140 -35
  105. package/src/runtime/agent/orchestrator/providers/gemini-thinking.mjs +70 -24
  106. package/src/runtime/agent/orchestrator/providers/gemini.mjs +80 -29
  107. package/src/runtime/agent/orchestrator/providers/grok-client-version.mjs +1 -1
  108. package/src/runtime/agent/orchestrator/providers/grok-oauth-tokens.mjs +3 -0
  109. package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +69 -19
  110. package/src/runtime/agent/orchestrator/providers/lib/action-input-contract.mjs +60 -0
  111. package/src/runtime/agent/orchestrator/providers/lib/anthropic-native-blocks.mjs +1 -0
  112. package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +246 -42
  113. package/src/runtime/agent/orchestrator/providers/lib/anthropic-server-tool-usage.mjs +18 -0
  114. package/src/runtime/agent/orchestrator/providers/lib/anthropic-system-blocks.mjs +27 -6
  115. package/src/runtime/agent/orchestrator/providers/lib/claude-bridge-schema.mjs +388 -0
  116. package/src/runtime/agent/orchestrator/providers/lib/inclusive-usage.mjs +54 -0
  117. package/src/runtime/agent/orchestrator/providers/lib/origin-bound-fetch.mjs +16 -0
  118. package/src/runtime/agent/orchestrator/providers/lib/responses-terminal-fields.mjs +11 -0
  119. package/src/runtime/agent/orchestrator/providers/lib/usage-primitives.mjs +8 -0
  120. package/src/runtime/agent/orchestrator/providers/lib/wire-pairing.mjs +48 -22
  121. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +119 -18
  122. package/src/runtime/agent/orchestrator/providers/mimo-oauth-profile.mjs +13 -15
  123. package/src/runtime/agent/orchestrator/providers/mimo-oauth.mjs +3 -0
  124. package/src/runtime/agent/orchestrator/providers/model-list-sanitize.mjs +2 -1
  125. package/src/runtime/agent/orchestrator/providers/model-proxy-channel.d.mts +1 -1
  126. package/src/runtime/agent/orchestrator/providers/model-proxy-channel.mjs +1 -0
  127. package/src/runtime/agent/orchestrator/providers/model-proxy-provider.mjs +33 -1
  128. package/src/runtime/agent/orchestrator/providers/muse-code-oauth.mjs +4 -9
  129. package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +2 -0
  130. package/src/runtime/agent/orchestrator/providers/openai-codex-metadata.mjs +2 -0
  131. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +123 -61
  132. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/chunk-events.mjs +35 -14
  133. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-result.mjs +27 -2
  134. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +37 -7
  135. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/tool-call-acc.mjs +2 -9
  136. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream.mjs +1 -0
  137. package/src/runtime/agent/orchestrator/providers/openai-compat-error-contract.mjs +50 -0
  138. package/src/runtime/agent/orchestrator/providers/openai-compat-models.mjs +47 -2
  139. package/src/runtime/agent/orchestrator/providers/openai-compat-options.mjs +47 -25
  140. package/src/runtime/agent/orchestrator/providers/openai-compat-presets.mjs +5 -1
  141. package/src/runtime/agent/orchestrator/providers/openai-compat-reasoning-field.mjs +151 -0
  142. package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +64 -23
  143. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-events.mjs +79 -33
  144. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-head-parity.json +2901 -0
  145. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-parity.fixtures.mjs +172 -0
  146. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-state.mjs +3 -2
  147. package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +144 -15
  148. package/src/runtime/agent/orchestrator/providers/openai-compat-retry-profile.mjs +193 -0
  149. package/src/runtime/agent/orchestrator/providers/openai-compat-stream-common.mjs +66 -2
  150. package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +9 -2
  151. package/src/runtime/agent/orchestrator/providers/openai-compat-trace.mjs +2 -0
  152. package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +109 -26
  153. package/src/runtime/agent/orchestrator/providers/openai-compat-xai-send.mjs +27 -6
  154. package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +34 -20
  155. package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +23 -4
  156. package/src/runtime/agent/orchestrator/providers/openai-direct-request.mjs +37 -28
  157. package/src/runtime/agent/orchestrator/providers/openai-error-contract.mjs +274 -0
  158. package/src/runtime/agent/orchestrator/providers/openai-http-sse-request.mjs +72 -32
  159. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/output-items.mjs +23 -10
  160. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/terminal-frames.mjs +43 -15
  161. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events.mjs +10 -0
  162. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-items.mjs +18 -7
  163. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-outcome.mjs +5 -2
  164. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-stamps.mjs +2 -2
  165. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-state.mjs +7 -3
  166. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/text-relay.mjs +9 -1
  167. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state.mjs +2 -2
  168. package/src/runtime/agent/orchestrator/providers/openai-http-sse-watchdogs.mjs +1 -3
  169. package/src/runtime/agent/orchestrator/providers/openai-model-capabilities.mjs +80 -0
  170. package/src/runtime/agent/orchestrator/providers/openai-oauth-dispatch.mjs +37 -4
  171. package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +12 -1
  172. package/src/runtime/agent/orchestrator/providers/openai-oauth-tokens.mjs +22 -2
  173. package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +12 -1
  174. package/src/runtime/agent/orchestrator/providers/openai-responses-input.mjs +76 -33
  175. package/src/runtime/agent/orchestrator/providers/openai-responses-payload-parity.fixture.json +323 -0
  176. package/src/runtime/agent/orchestrator/providers/openai-responses-payload.mjs +44 -16
  177. package/src/runtime/agent/orchestrator/providers/openai-retry-policy.mjs +9 -0
  178. package/src/runtime/agent/orchestrator/providers/openai-ws-delta.mjs +7 -16
  179. package/src/runtime/agent/orchestrator/providers/openai-ws-handshake.mjs +16 -8
  180. package/src/runtime/agent/orchestrator/providers/openai-ws-response-state/refusals.mjs +60 -0
  181. package/src/runtime/agent/orchestrator/providers/openai-ws-response-state/tool-calls.mjs +51 -35
  182. package/src/runtime/agent/orchestrator/providers/openai-ws-response-state.mjs +30 -0
  183. package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/attempt-context.mjs +1 -2
  184. package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/policy.mjs +25 -14
  185. package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +12 -0
  186. package/src/runtime/agent/orchestrator/providers/openai-ws-stream/terminal-frames.mjs +25 -6
  187. package/src/runtime/agent/orchestrator/providers/openai-ws-terminal.mjs +18 -11
  188. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +41 -22
  189. package/src/runtime/agent/orchestrator/providers/opencode-go-gemini.mjs +170 -0
  190. package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +75 -70
  191. package/src/runtime/agent/orchestrator/providers/openrouter.mjs +75 -0
  192. package/src/runtime/agent/orchestrator/providers/provider-error-kind.mjs +720 -0
  193. package/src/runtime/agent/orchestrator/providers/registry.mjs +4 -1
  194. package/src/runtime/agent/orchestrator/providers/retry-backoff.mjs +46 -7
  195. package/src/runtime/agent/orchestrator/providers/retry-classification.mjs +123 -219
  196. package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +2 -0
  197. package/src/runtime/agent/orchestrator/providers/retry-executor.mjs +148 -45
  198. package/src/runtime/agent/orchestrator/providers/retry-midstream.mjs +81 -16
  199. package/src/runtime/agent/orchestrator/providers/transport-scope.d.mts +6 -0
  200. package/src/runtime/agent/orchestrator/providers/transport-scope.mjs +28 -0
  201. package/src/runtime/agent/orchestrator/providers/wire-gateway.mjs +157 -0
  202. package/src/runtime/agent/orchestrator/providers/wire-route.mjs +512 -0
  203. package/src/runtime/agent/orchestrator/providers/xai-tool-search-head-parity.json +1131 -0
  204. package/src/runtime/agent/orchestrator/providers/xai-tool-search.fixtures.mjs +183 -0
  205. package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +100 -0
  206. package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +3 -0
  207. package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-availability.mjs +21 -0
  208. package/src/runtime/agent/orchestrator/runtime-core/effort.mjs +15 -0
  209. package/src/runtime/agent/orchestrator/runtime-core/goal-reminder.mjs +0 -18
  210. package/src/runtime/agent/orchestrator/runtime-core/model-capabilities.mjs +57 -28
  211. package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +19 -16
  212. package/src/runtime/agent/orchestrator/runtime-core/plugin-mcp.mjs +1 -97
  213. package/src/runtime/agent/orchestrator/runtime-core/provider-request-snapshot.mjs +7 -3
  214. package/src/runtime/agent/orchestrator/runtime-core/session-title.mjs +21 -1
  215. package/src/runtime/agent/orchestrator/runtime-core/skill-tool-loading.mjs +14 -3
  216. package/src/runtime/agent/orchestrator/runtime-core/tool-bridge.mjs +526 -0
  217. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-data.mjs +3 -0
  218. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-schema.mjs +10 -7
  219. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +176 -71
  220. package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +62 -10
  221. package/src/runtime/agent/orchestrator/runtime-core/tool-exposure.mjs +96 -0
  222. package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +5 -1
  223. package/src/runtime/agent/orchestrator/session/compact/constants.mjs +3 -2
  224. package/src/runtime/agent/orchestrator/session/compact/messages.mjs +14 -93
  225. package/src/runtime/agent/orchestrator/session/compact/summary-anchor.mjs +5 -0
  226. package/src/runtime/agent/orchestrator/session/compact/user-message-kind.mjs +120 -0
  227. package/src/runtime/agent/orchestrator/session/context-tool-schema.mjs +17 -2
  228. package/src/runtime/agent/orchestrator/session/context-utils.mjs +8 -4
  229. package/src/runtime/agent/orchestrator/session/eager-dispatch/admission.mjs +2 -1
  230. package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +6 -1
  231. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +91 -1
  232. package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +1 -1
  233. package/src/runtime/agent/orchestrator/session/loop/context-overflow.mjs +56 -0
  234. package/src/runtime/agent/orchestrator/session/loop/deferred-call-through.mjs +18 -8
  235. package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +1 -0
  236. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +21 -10
  237. package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +132 -0
  238. package/src/runtime/agent/orchestrator/session/loop/request-boundary.mjs +30 -0
  239. package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +67 -20
  240. package/src/runtime/agent/orchestrator/session/loop/step-auto-effort.mjs +104 -19
  241. package/src/runtime/agent/orchestrator/session/loop/tool-call-resolution.mjs +95 -0
  242. package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +30 -3
  243. package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +15 -4
  244. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +15 -1
  245. package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +150 -0
  246. package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +7 -2
  247. package/src/runtime/agent/orchestrator/session/manager/ask-queue.mjs +30 -2
  248. package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +11 -2
  249. package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +2 -1
  250. package/src/runtime/agent/orchestrator/session/manager/ask-turn-commit.mjs +34 -12
  251. package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +57 -21
  252. package/src/runtime/agent/orchestrator/session/manager/ask-turn-loop-options.mjs +57 -25
  253. package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +6 -0
  254. package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +4 -0
  255. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +8 -0
  256. package/src/runtime/agent/orchestrator/session/manager/pending-message-entry.mjs +5 -10
  257. package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +208 -14
  258. package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +16 -4
  259. package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +25 -3
  260. package/src/runtime/agent/orchestrator/session/manager/session-fallback-title.mjs +82 -0
  261. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +19 -2
  262. package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +3 -0
  263. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +4 -1
  264. package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +18 -7
  265. package/src/runtime/agent/orchestrator/session/manager.mjs +2 -1
  266. package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +6 -0
  267. package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +168 -29
  268. package/src/runtime/agent/orchestrator/session/side-question-store.mjs +96 -0
  269. package/src/runtime/agent/orchestrator/session/side-question.mjs +192 -0
  270. package/src/runtime/agent/orchestrator/session/store/lifecycle-barriers.mjs +17 -3
  271. package/src/runtime/agent/orchestrator/session/store/live-state.mjs +23 -0
  272. package/src/runtime/agent/orchestrator/session/store/paths-heartbeat.mjs +58 -2
  273. package/src/runtime/agent/orchestrator/session/store/save-worker.mjs +6 -3
  274. package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +41 -28
  275. package/src/runtime/agent/orchestrator/session/store/session-observers.mjs +4 -2
  276. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-finish.mjs +12 -1
  277. package/src/runtime/agent/orchestrator/session/store/write-admission.mjs +3 -1
  278. package/src/runtime/agent/orchestrator/session/store/write-guards.mjs +16 -0
  279. package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +22 -10
  280. package/src/runtime/agent/orchestrator/session/store-summary-archived-agent.mjs +34 -15
  281. package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +6 -0
  282. package/src/runtime/agent/orchestrator/session/store-summary-fields.mjs +13 -0
  283. package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +13 -1
  284. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +10 -2
  285. package/src/runtime/agent/orchestrator/session/store.mjs +19 -3
  286. package/src/runtime/agent/orchestrator/session/tool-batch/execute-call.mjs +1 -0
  287. package/src/runtime/agent/orchestrator/session/tool-batch/finalize.mjs +1 -1
  288. package/src/runtime/agent/orchestrator/session/tool-batch/record-outcome.mjs +1 -1
  289. package/src/runtime/agent/orchestrator/session/tool-batch/state.mjs +7 -1
  290. package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +4 -0
  291. package/src/runtime/agent/orchestrator/session/tool-schema-rejection.mjs +77 -0
  292. package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +20 -1
  293. package/src/runtime/agent/orchestrator/tools/bash-policy-scan.mjs +8 -2
  294. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +2 -2
  295. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/command-preflight.mjs +3 -3
  296. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/deadline-plan.mjs +12 -15
  297. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +4 -1
  298. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +5 -5
  299. package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +14 -10
  300. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +49 -34
  301. package/src/runtime/agent/orchestrator/tools/builtin/runtime-capabilities.mjs +23 -1
  302. package/src/runtime/agent/orchestrator/tools/code-graph/dispatch/root-resolution.mjs +1 -1
  303. package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +1 -1
  304. package/src/runtime/agent/orchestrator/tools/patch/ui-diff.mjs +73 -39
  305. package/src/runtime/agent/orchestrator/tools/progress-message.mjs +18 -1
  306. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +7 -4
  307. package/src/runtime/agent/orchestrator/tools/shell-exec-policy.mjs +88 -12
  308. package/src/runtime/agent/orchestrator/tools/shell-policy.mjs +2 -0
  309. package/src/runtime/computer-bridge/action-schema.mjs +44 -21
  310. package/src/runtime/github/tool.mjs +92 -2
  311. package/src/runtime/memory/index.mjs +1 -0
  312. package/src/runtime/memory/lib/http-router/ingest-routes.mjs +22 -1
  313. package/src/runtime/memory/lib/ingest/transcript-offsets.mjs +2 -0
  314. package/src/runtime/memory/lib/pg/adapter.mjs +98 -1
  315. package/src/runtime/memory/lib/pg/process.mjs +65 -50
  316. package/src/runtime/memory/lib/pg/run-child.mjs +49 -0
  317. package/src/runtime/memory/lib/pg/supervisor.mjs +124 -16
  318. package/src/runtime/memory/lib/runtime-fetcher.mjs +12 -13
  319. package/src/runtime/memory/lib/transcript-ingest.mjs +14 -0
  320. package/src/runtime/office/README.md +2 -2
  321. package/src/runtime/office/authoring/html-document-author.mjs +2 -0
  322. package/src/runtime/office/authoring/pptx-contact-sheet.mjs +2 -0
  323. package/src/runtime/office/authoring/pptx-html-measure.mjs +2 -0
  324. package/src/runtime/office/authoring/pptx-html-runner.mjs +2 -0
  325. package/src/runtime/office/authoring/xlsx-html-runner.mjs +2 -0
  326. package/src/runtime/office/core/office-actions-read.mjs +3 -0
  327. package/src/runtime/office/core/office-render-preview.mjs +2 -0
  328. package/src/runtime/office/core/office-session-dispatch.mjs +7 -0
  329. package/src/runtime/office/core/office-sessionless-actions.mjs +8 -0
  330. package/src/runtime/office/core/office-sessions.mjs +5 -0
  331. package/src/runtime/office/core/office-transactions.mjs +3 -0
  332. package/src/runtime/office/core/office-write-ledger.mjs +98 -0
  333. package/src/runtime/office/design/library/templates/mixdog-executive.mixdog-edit.pptx +0 -0
  334. package/src/runtime/office/index.mjs +30 -0
  335. package/src/runtime/office/pdf/pdf-edit-document.mjs +2 -0
  336. package/src/runtime/office/pdf/pdf-render.mjs +23 -7
  337. package/src/runtime/office/pdf/pdf-security.mjs +2 -0
  338. package/src/runtime/office/portable/portable-opc.mjs +4 -1
  339. package/src/runtime/office/quality/visual-diff.mjs +2 -0
  340. package/src/runtime/office/shared/values.mjs +0 -5
  341. package/src/runtime/shared/background-tasks.mjs +92 -14
  342. package/src/runtime/shared/bounded-file-read.mjs +13 -0
  343. package/src/runtime/shared/bounded-line-diff.mjs +182 -0
  344. package/src/runtime/shared/buffered-appender.mjs +18 -0
  345. package/src/runtime/shared/config.mjs +78 -18
  346. package/src/runtime/shared/err-text.mjs +31 -0
  347. package/src/runtime/shared/error-presentation.mjs +159 -19
  348. package/src/runtime/shared/file-permissions.d.mts +6 -1
  349. package/src/runtime/shared/file-permissions.mjs +54 -6
  350. package/src/runtime/shared/llm/anthropic-betas.mjs +4 -3
  351. package/src/runtime/shared/llm/anthropic-effort.mjs +129 -134
  352. package/src/runtime/shared/llm/anthropic-thinking-contract.mjs +50 -14
  353. package/src/runtime/shared/llm/model-catalog.mjs +53 -40
  354. package/src/runtime/shared/llm/openai-daybreak.mjs +4 -16
  355. package/src/runtime/shared/llm/provider-catalog-registry.mjs +11 -0
  356. package/src/runtime/shared/llm/provider-model-identities.mjs +13 -4
  357. package/src/runtime/shared/llm/usage-accounting.mjs +5 -2
  358. package/src/runtime/shared/llm/usage-ledger-rollup.mjs +3 -0
  359. package/src/runtime/shared/llm/usage-rollup.mjs +0 -1
  360. package/src/runtime/shared/loopback-listener.mjs +9 -0
  361. package/src/runtime/shared/model-display.mjs +13 -0
  362. package/src/runtime/shared/provider-api-key.mjs +2 -0
  363. package/src/runtime/shared/quota-resume-store.mjs +11 -0
  364. package/src/runtime/shared/review-diff.mjs +52 -0
  365. package/src/runtime/shared/session-baseline-store.mjs +960 -0
  366. package/src/runtime/shared/session-sidebar-host.d.mts +4 -0
  367. package/src/runtime/shared/session-sidebar-host.mjs +38 -0
  368. package/src/runtime/shared/slow-span.mjs +114 -0
  369. package/src/runtime/shared/statusline/statusline-format.mjs +4 -4
  370. package/src/runtime/shared/statusline/statusline-segments.mjs +28 -4
  371. package/src/runtime/shared/task-notification-envelope.mjs +2 -2
  372. package/src/runtime/shared/tool-card-model/card-header.mjs +6 -1
  373. package/src/runtime/shared/tool-card-model/generic-detail.mjs +39 -5
  374. package/src/runtime/shared/tool-card-model.mjs +5 -2
  375. package/src/runtime/shared/tool-output-limit.mjs +4 -0
  376. package/src/runtime/shared/tool-primitives.mjs +13 -0
  377. package/src/runtime/shared/tool-result-summary.mjs +8 -1
  378. package/src/runtime/shared/tool-surface.mjs +18 -3
  379. package/src/runtime/shared/tool-work-units.mjs +40 -4
  380. package/src/runtime/shared/transcript-writer/purge.mjs +74 -0
  381. package/src/runtime/shared/transcript-writer.mjs +10 -2
  382. package/src/runtime/shared/turn-changes.mjs +670 -274
  383. package/src/runtime/shared/turn-review-reply.mjs +8 -39
  384. package/src/runtime/shared/turn-snapshot-store.mjs +94 -2
  385. package/src/runtime/shared/turn-snapshot.mjs +986 -690
  386. package/src/runtime/shared/turn-worktree-snapshot.mjs +279 -262
  387. package/src/runtime/shared/user-data-guard.mjs +262 -49
  388. package/src/runtime/shared/worktrees/carry.mjs +531 -0
  389. package/src/runtime/shared/worktrees/contract.mjs +34 -24
  390. package/src/runtime/shared/worktrees/file-recovery.mjs +68 -0
  391. package/src/runtime/shared/worktrees/git-head.mjs +205 -0
  392. package/src/runtime/shared/worktrees/git.mjs +8 -3
  393. package/src/runtime/shared/worktrees/maintenance.mjs +1 -1
  394. package/src/runtime/shared/worktrees/manager.mjs +156 -8
  395. package/src/runtime/shared/worktrees/merge.mjs +31 -21
  396. package/src/runtime/shared/worktrees/paths.d.mts +6 -0
  397. package/src/runtime/shared/worktrees/test-support.mjs +19 -4
  398. package/src/runtime/terminal-bridge/client.mjs +44 -11
  399. package/src/runtime/terminal-bridge/tool-defs.mjs +13 -6
  400. package/src/runtime/tidy/apply.mjs +47 -2
  401. package/src/runtime/tidy/run-engines.mjs +11 -5
  402. package/src/session-runtime/agent-tool-routing.mjs +19 -13
  403. package/src/session-runtime/boot/apis.mjs +19 -5
  404. package/src/session-runtime/boot/facade.mjs +1 -0
  405. package/src/session-runtime/boot/infrastructure.mjs +12 -1
  406. package/src/session-runtime/boot/session.mjs +0 -1
  407. package/src/session-runtime/boot/tools.mjs +4 -1
  408. package/src/session-runtime/cwd-plugins/cwd-apply.mjs +12 -5
  409. package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +65 -0
  410. package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +3 -1
  411. package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +11 -4
  412. package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +115 -18
  413. package/src/session-runtime/internal-tool-executor.mjs +6 -2
  414. package/src/session-runtime/lifecycle/cold-heir.mjs +188 -0
  415. package/src/session-runtime/lifecycle/inheritance.mjs +71 -27
  416. package/src/session-runtime/lifecycle/session-catalog.mjs +14 -3
  417. package/src/session-runtime/lifecycle/session-switch/resume.mjs +6 -0
  418. package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +29 -6
  419. package/src/session-runtime/lifecycle/teardown.mjs +73 -8
  420. package/src/session-runtime/lifecycle-api.mjs +1 -0
  421. package/src/session-runtime/mcp-glue/connect.mjs +46 -14
  422. package/src/session-runtime/mcp-glue/server-catalog.mjs +20 -3
  423. package/src/session-runtime/mcp-glue.mjs +3 -0
  424. package/src/session-runtime/mcp-oauth-login.mjs +174 -0
  425. package/src/session-runtime/model-route/model-switch-target.mjs +34 -0
  426. package/src/session-runtime/model-route/set-route.mjs +85 -17
  427. package/src/session-runtime/model-route/web-search-route.mjs +1 -1
  428. package/src/session-runtime/native-web-search/routes.mjs +22 -3
  429. package/src/session-runtime/native-web-search-usage.mjs +51 -0
  430. package/src/session-runtime/native-web-search.mjs +10 -1
  431. package/src/session-runtime/new-session-config.mjs +4 -2
  432. package/src/session-runtime/provider-auth/login.mjs +4 -0
  433. package/src/session-runtime/provider-models/model-meta.mjs +12 -3
  434. package/src/session-runtime/quick-model-rows/web-search-rows.mjs +13 -8
  435. package/src/session-runtime/quick-web-search-models.mjs +13 -38
  436. package/src/session-runtime/resource-extension-sync.mjs +4 -0
  437. package/src/session-runtime/resource-mcp-api.mjs +98 -2
  438. package/src/session-runtime/resource-scope-decorate.mjs +10 -3
  439. package/src/session-runtime/runtime-review-api.mjs +21 -2
  440. package/src/session-runtime/services/agent-tool/index-write-queue.mjs +81 -20
  441. package/src/session-runtime/services/agent-tool/job-task-reconcile.mjs +13 -1
  442. package/src/session-runtime/services/agent-tool/job-views/agent-list.mjs +7 -2
  443. package/src/session-runtime/services/agent-tool/lead-worker-index/forgotten-leads.mjs +29 -0
  444. package/src/session-runtime/services/agent-tool/lead-worker-index/index-file.mjs +1 -1
  445. package/src/session-runtime/services/agent-tool/lead-worker-index.mjs +73 -7
  446. package/src/session-runtime/services/agent-tool/send-flow.mjs +22 -4
  447. package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +2 -0
  448. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +22 -5
  449. package/src/session-runtime/services/agent-tool/tag-registry.mjs +15 -1
  450. package/src/session-runtime/services/agent-tool/worker-index/row-liveness.mjs +8 -1
  451. package/src/session-runtime/services/agent-tool/worker-index/row-shape.mjs +2 -2
  452. package/src/session-runtime/services/agent-tool/worker-index/row-store.mjs +10 -1
  453. package/src/session-runtime/services/agent-tool/worker-index.mjs +46 -7
  454. package/src/session-runtime/services/agent-tool/worker-rows.mjs +17 -0
  455. package/src/session-runtime/services/agent-tool.mjs +3 -0
  456. package/src/session-runtime/services/channel-admin.mjs +19 -3
  457. package/src/session-runtime/services/memory-runtime-proxy/calls.mjs +4 -0
  458. package/src/session-runtime/services/memory-runtime-proxy.mjs +1 -0
  459. package/src/session-runtime/services/provider-admin.mjs +81 -15
  460. package/src/session-runtime/session-transcript-purge.mjs +32 -0
  461. package/src/session-runtime/session-turn-api.mjs +14 -5
  462. package/src/session-runtime/settings-builtin-tools-api.mjs +9 -0
  463. package/src/session-runtime/settings-compaction-api.mjs +1 -0
  464. package/src/session-runtime/setup-tool/executor.mjs +36 -6
  465. package/src/session-runtime/setup-tool/extended-actions.mjs +86 -6
  466. package/src/session-runtime/setup-tool/settings-contract.mjs +13 -3
  467. package/src/session-runtime/setup-tool/tool-defs.mjs +13 -4
  468. package/src/session-runtime/skills-api.mjs +3 -5
  469. package/src/session-runtime/tool-surface.mjs +5 -1
  470. package/src/session-runtime/turn/compaction-gate.mjs +25 -0
  471. package/src/session-runtime/turn/session-ops.mjs +7 -5
  472. package/src/session-runtime/turn/side-question-ops.mjs +22 -0
  473. package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +5 -1
  474. package/src/session-runtime/turn/turn-run/turn-prepare.mjs +8 -3
  475. package/src/session-runtime/turn/turn-run/turn-settle.mjs +10 -0
  476. package/src/session-runtime/turn/turn-run/turn-timing.mjs +4 -3
  477. package/src/session-runtime/turn/turn-run.mjs +25 -9
  478. package/src/session-runtime/usage-stats-api.mjs +43 -11
  479. package/src/session-runtime/workspace/project-branches.mjs +7 -5
  480. package/src/session-runtime/workspace/transition-steps.mjs +129 -31
  481. package/src/session-runtime/workspace/transitions.mjs +190 -15
  482. package/src/standalone/daemon-agent-control.mjs +9 -1
  483. package/src/standalone/daemon-drain-policy.mjs +8 -0
  484. package/src/standalone/daemon-local-session-bridge.mjs +14 -1
  485. package/src/standalone/daemon-owner.mjs +17 -4
  486. package/src/standalone/daemon-pg-stop.mjs +51 -0
  487. package/src/standalone/daemon-stop-budget.d.mts +2 -0
  488. package/src/standalone/daemon-stop-budget.mjs +18 -0
  489. package/src/standalone/daemon-stored-session-views.mjs +2 -0
  490. package/src/standalone/daemon-telemetry.mjs +74 -0
  491. package/src/standalone/daemon.mjs +64 -8
  492. package/src/standalone/desktop-service-registry.mjs +5 -0
  493. package/src/standalone/local-session-runtime.mjs +70 -19
  494. package/src/standalone/session-client.mjs +42 -0
  495. package/src/standalone/session-protocol.mjs +14 -0
  496. package/src/standalone/session-proxy/projection.mjs +41 -4
  497. package/src/standalone/session-runtime-inline-host/boot-loaders.mjs +15 -1
  498. package/src/standalone/session-runtime-inline-host.mjs +1 -0
  499. package/src/standalone/session-service/agent-tree/agent-cancel.mjs +33 -2
  500. package/src/standalone/session-service/agent-tree/agent-turns.mjs +26 -10
  501. package/src/standalone/session-service/agent-tree.mjs +12 -0
  502. package/src/standalone/session-service/quota-resume.mjs +8 -0
  503. package/src/standalone/session-service/retention/busy.mjs +15 -1
  504. package/src/standalone/session-service/session-calls/session-action.mjs +18 -3
  505. package/src/standalone/session-service-api.mjs +11 -1
  506. package/src/standalone/session-service.mjs +1 -0
  507. package/src/standalone/session-state-patch.d.mts +2 -1
  508. package/src/standalone/session-state-patch.mjs +41 -1
  509. package/src/tui/App.jsx +25 -0
  510. package/src/tui/app/app-view/floating-panel.jsx +26 -1
  511. package/src/tui/app/app-view.jsx +1 -0
  512. package/src/tui/app/btw-controller.mjs +118 -0
  513. package/src/tui/app/create-app-pickers.mjs +6 -0
  514. package/src/tui/app/extension-pickers/mcp-login.mjs +107 -0
  515. package/src/tui/app/extension-pickers/mcp-servers-picker.mjs +2 -1
  516. package/src/tui/app/extension-pickers.mjs +2 -1
  517. package/src/tui/app/model-options.mjs +11 -16
  518. package/src/tui/app/shell-layout/row-budgets.mjs +11 -1
  519. package/src/tui/app/shell-layout/surfaces.mjs +3 -1
  520. package/src/tui/app/slash-commands.mjs +20 -5
  521. package/src/tui/app/slash-dispatch/panel-commands.mjs +16 -1
  522. package/src/tui/app/slash-dispatch/session-commands.mjs +19 -6
  523. package/src/tui/app/use-global-key-input/approval-shortcut.mjs +12 -0
  524. package/src/tui/app/use-global-key-input.mjs +5 -12
  525. package/src/tui/app/use-prompt-handlers.mjs +11 -0
  526. package/src/tui/components/BtwPanel.jsx +53 -0
  527. package/src/tui/components/QuestionPanel.jsx +275 -0
  528. package/src/tui/components/StatusLine.jsx +2 -0
  529. package/src/tui/components/question-panel-model.mjs +156 -0
  530. package/src/tui/components/status-line/local-line.mjs +5 -2
  531. package/src/tui/components/status-line/use-statusline-text.mjs +7 -1
  532. package/src/tui/dist/index.mjs +3221 -1500
  533. package/src/tui/session/context-state.mjs +4 -2
  534. package/src/tui/session/quota-resume.mjs +46 -14
  535. package/src/tui/session/session-api/commands.mjs +43 -24
  536. package/src/tui/session/session-api/controls.mjs +2 -2
  537. package/src/tui/session/session-api/extensions.mjs +22 -0
  538. package/src/tui/session/session-api/integrations.mjs +16 -2
  539. package/src/tui/session/session-api/lifecycle/dispose.mjs +1 -0
  540. package/src/tui/session/session-api/lifecycle.mjs +7 -2
  541. package/src/tui/session/session-api/routes.mjs +71 -7
  542. package/src/tui/session/session-api/settings.mjs +11 -14
  543. package/src/tui/session/session-api.mjs +1 -0
  544. package/src/tui/session/session-flow/drain.mjs +7 -1
  545. package/src/tui/session/session-flow/failed-turn-rewind.mjs +10 -4
  546. package/src/tui/session/tool-approval.mjs +10 -7
  547. package/src/tui/session/transcript-spill.mjs +14 -7
  548. package/src/tui/session/turn-stream.mjs +174 -31
  549. package/src/tui/session/turn.mjs +46 -16
  550. package/src/tui/statusline-ansi-bridge.mjs +1 -1
  551. package/src/ui/statusline-agents.mjs +15 -4
  552. package/src/ui/statusline.mjs +7 -3
  553. package/src/ui/streaming-markdown-heal.mjs +34 -3
  554. package/src/vendor/statusline/src/gateway/claude-current.mjs +14 -4
  555. package/src/workflows/default/WORKFLOW.md +3 -1
  556. package/src/runtime/memory/lib/memory-session-merge.mjs +0 -32
  557. package/src/runtime/shared/llm/usage-session-history.mjs +0 -266
@@ -178,6 +178,9 @@ export async function askSession(sessionId, prompt, context, onToolCall, cwdOver
178
178
  ...claimed,
179
179
  ...armTurnDurability({ sessionId, ...claimed, pendingEntries: input.pendingEntries }),
180
180
  };
181
+ // From here the turn's own unwind (ask-turn-failure) acks or releases
182
+ // its entries; the queue keeps owning only the not-yet-started ones.
183
+ queue.markStarted();
181
184
  const turn = await runAskTurn({
182
185
  sessionId,
183
186
  opened,
@@ -193,9 +196,12 @@ export async function askSession(sessionId, prompt, context, onToolCall, cwdOver
193
196
  // that arrived while this turn was in flight runs next, in order, as a
194
197
  // follow-up user turn. The mutex is still held, so a send racing this
195
198
  // drain either landed before (picked up here) or enqueues for the next
196
- // loop. When the queue is empty we return the latest turn's result.
199
+ // loop. Follow-ups an idle ask already drained wait in the queue's
200
+ // tail and run before anything new. When both are empty we return the
201
+ // latest turn's result.
197
202
  const drained = turn.drained.length > 0 ? turn.drained : drainPendingMessages(sessionId);
198
- if (queue.pushDrained(drained)) {
203
+ queue.pushDrained(drained);
204
+ if (queue.hasQueuedTurns()) {
199
205
  // Carry the just-committed in-memory session into the follow-up
200
206
  // turn so the queued tail sees the preceding assistant/tool
201
207
  // context. loadSession() would return this same live snapshot
@@ -216,6 +222,9 @@ export async function askSession(sessionId, prompt, context, onToolCall, cwdOver
216
222
  return result;
217
223
  }
218
224
  } finally {
225
+ // A failed/cancelled turn ends the ask: the follow-up turns drained
226
+ // behind it never ran, so their entries go back to the pending queue.
227
+ queue.releaseUnstarted();
219
228
  // A thrown setup/provider path must never leave a delayed checkpoint
220
229
  // writer alive after the turn lock is released.
221
230
  // Clear the controller only if it's still ours (closeSession may have
@@ -15,7 +15,7 @@ import {
15
15
  resolveAutoEffort,
16
16
  } from '../../providers/auto-effort.mjs';
17
17
  import { builtinFeatureActive } from '../../runtime-core/builtin-features.mjs';
18
- import { effortOptionsFor } from '../../runtime-core/effort.mjs';
18
+ import { effortOptionsFor, warnEmptyAutoEffortLadder } from '../../runtime-core/effort.mjs';
19
19
  import { effortJudgeSupportsSteps, judgeTurn, recordEffortDecision } from '../../../../effort-judge/judge-client.mjs';
20
20
  import { promptContentText } from './prompt-utils.mjs';
21
21
 
@@ -98,6 +98,7 @@ export async function resolveTurnAutoEffort({ sessionId, session, provider, inpu
98
98
  // the judge is not asked (in observe mode too: nothing would be logged).
99
99
  if (!autoEffortApplicable({ base, options })) {
100
100
  recordEffortDecision({ ...record, skipped: 'default-outside-auto-range' });
101
+ warnEmptyAutoEffortLadder(session.provider, session.model, base);
101
102
  return null;
102
103
  }
103
104
  // The previous user request shows the work a short follow-up continues.
@@ -120,22 +120,44 @@ function recordAgentRuntimeCall(session, result) {
120
120
  export async function recordAskUsage({ session, result, askStartedAt, turnSignal }) {
121
121
  const prefixHashForLog = recordAgentRuntimeCall(session, result);
122
122
  if (!result.usage) return;
123
- const inputTokens = result.usage.inputTokens || 0;
124
- const outputTokens = result.usage.outputTokens || 0;
125
- const cacheReadTokens = result.usage.cachedTokens || 0;
126
- const cacheWriteTokens = result.usage.cacheWriteTokens || 0;
123
+ await logSessionLlmUsage({
124
+ session,
125
+ usage: result.usage,
126
+ startedAt: askStartedAt,
127
+ signal: turnSignal,
128
+ prefixHash: prefixHashForLog,
129
+ transportTiming: result.transportTiming || null,
130
+ });
131
+ recordStandaloneStatusTelemetry(session, result, Date.now() - askStartedAt);
132
+ }
133
+
134
+ /** The usage-ledger row of one provider call billed to `session`. `mode`
135
+ * labels a call made outside the turn loop (a /btw side question). */
136
+ export async function logSessionLlmUsage({
137
+ session,
138
+ usage,
139
+ startedAt,
140
+ signal = null,
141
+ prefixHash = null,
142
+ transportTiming = null,
143
+ mode = null,
144
+ }) {
145
+ const inputTokens = usage.inputTokens || 0;
146
+ const outputTokens = usage.outputTokens || 0;
147
+ const cacheReadTokens = usage.cachedTokens || 0;
148
+ const cacheWriteTokens = usage.cacheWriteTokens || 0;
127
149
  // Unified total-prompt field. Anthropic = input+cache_read+cache_write
128
150
  // (additive); OpenAI OAuth/API/Gemini = input_tokens already includes the
129
151
  // cached portion (inclusive), so the fallback must not double-count.
130
152
  const { isInclusiveProvider, computeCostUsd } = await runAbortable(
131
- turnSignal,
153
+ signal,
132
154
  () => import('../../../../shared/llm/cost.mjs')
133
155
  );
134
156
  const inclusive = isInclusiveProvider(session.provider);
135
157
  let promptTokens = inputTokens + cacheReadTokens + cacheWriteTokens;
136
- if (typeof result.usage.promptTokens === 'number') promptTokens = result.usage.promptTokens;
158
+ if (typeof usage.promptTokens === 'number') promptTokens = usage.promptTokens;
137
159
  else if (inclusive) promptTokens = Math.max(inputTokens, cacheReadTokens + cacheWriteTokens);
138
- let costUsd = result.usage.costUsd || 0;
160
+ let costUsd = usage.costUsd || 0;
139
161
  if (!costUsd) {
140
162
  try {
141
163
  costUsd = computeCostUsd({
@@ -145,7 +167,7 @@ export async function recordAskUsage({ session, result, askStartedAt, turnSignal
145
167
  outputTokens,
146
168
  cacheReadTokens,
147
169
  cacheWriteTokens,
148
- cacheWrite1hTokens: result.usage.cacheWrite1hTokens || 0,
170
+ cacheWrite1hTokens: usage.cacheWrite1hTokens || 0,
149
171
  });
150
172
  } catch {
151
173
  /* best-effort */
@@ -158,7 +180,8 @@ export async function recordAskUsage({ session, result, askStartedAt, turnSignal
158
180
  preset: session.presetName || null,
159
181
  model: session.model,
160
182
  provider: session.provider,
161
- duration: Date.now() - askStartedAt,
183
+ ...(mode ? { mode } : {}),
184
+ duration: Date.now() - startedAt,
162
185
  profileId: session.profileId || null,
163
186
  sessionId: session.id,
164
187
  inputTokens,
@@ -166,11 +189,10 @@ export async function recordAskUsage({ session, result, askStartedAt, turnSignal
166
189
  cacheReadTokens,
167
190
  cacheWriteTokens,
168
191
  promptTokens,
169
- prefixHash: prefixHashForLog,
192
+ prefixHash,
170
193
  costUsd,
171
- transportTiming: result.transportTiming || null,
194
+ transportTiming,
172
195
  });
173
- recordStandaloneStatusTelemetry(session, result, Date.now() - askStartedAt);
174
196
  }
175
197
 
176
198
  /** Persist opaque providerState for stateful providers. The update bit
@@ -5,6 +5,7 @@
5
5
  // (runAskAgentLoop). Provider-not-available and trim failures throw here so
6
6
  // the caller marks the session errored instead of leaving stage='connecting'.
7
7
  import { getProvider } from '../../providers/registry.mjs';
8
+ import { pinSessionWireRoute } from '../../providers/wire-route.mjs';
8
9
  import { notifySkillsApplied, prepareExplicitSkills, recordAppliedSkills } from '../explicit-skills.mjs';
9
10
  import { prepareTurnEffortConfiguration } from '../../providers/effort-configuration.mjs';
10
11
  import { resolveTurnAutoEffort, turnStepAutoEffort } from './ask-turn-auto-effort.mjs';
@@ -17,6 +18,7 @@ import { applyTurnContextMeta, buildUserTurn, startProviderPrewarm, traceTurnCon
17
18
  import { rewindUnansweredPrompt } from './failed-turn-rewind.mjs';
18
19
  import { buildAgentLoopOptions, trackedToolCallHook } from './ask-turn-loop-options.mjs';
19
20
  import { _api_call_with_interrupt } from './ask-call-interrupt.mjs';
21
+ import { backfillFallbackSessionTitle } from './session-fallback-title.mjs';
20
22
 
21
23
  /** Resolves the provider, builds the user turn and pre-commits it; returns
22
24
  * what the loop and the commit need from this preparation. */
@@ -27,16 +29,16 @@ export async function prepareAskTurn({ sessionId, opened, input, cwdOverride, tr
27
29
  // Register the live session object for synchronous close snapshots.
28
30
  runtime.session = session;
29
31
  if (!provider) throw new Error(`Provider "${session.provider}" not available`);
30
- const autoEffort = await resolveTurnAutoEffort({ sessionId, session, provider, input });
31
- const turnEffort = autoEffort?.applied ? autoEffort.effort : session.effort || null;
32
- const effortConfiguration = prepareTurnEffortConfiguration(
33
- session,
34
- provider,
35
- autoEffort?.applied ? autoEffort.effort : undefined
36
- );
37
- // Auto effort also judges every tool-result step of the turn when the
38
- // installed judge was trained on steps (session/loop/step-auto-effort.mjs).
39
- const stepAutoEffort = turnStepAutoEffort(autoEffort, effortConfiguration);
32
+ // The session's wire is pinned before its first request (an existing
33
+ // session keeps the wire it started on); read from the history as the turn
34
+ // found it, awaited with the user turn below.
35
+ const wireRoutePending = pinSessionWireRoute(session, provider);
36
+ // The turn-level judgment runs while the rest of the turn is prepared; it
37
+ // reads the session as the turn found it (synchronously, on this call).
38
+ // The first request still carries its decision: it is awaited below,
39
+ // together with the user turn, before the effort configuration is stamped.
40
+ const autoEffortPending = resolveTurnAutoEffort({ sessionId, session, provider, input });
41
+ autoEffortPending.catch(() => {});
40
42
  applyTurnContextMeta(session, provider);
41
43
  const effectiveCwd = cwdOverride || session.cwd;
42
44
  // A failed-turn retry resubmits the prompt the failure left unanswered;
@@ -46,25 +48,50 @@ export async function prepareAskTurn({ sessionId, opened, input, cwdOverride, tr
46
48
  if (session.sessionStartMetaInjected !== true && !hasUserConversationMessage(session.messages)) {
47
49
  refreshSessionBp3Environment(session, effectiveCwd);
48
50
  }
51
+ // The prewarm only opens the transport (effort never shapes the socket), so
52
+ // it starts now instead of after the judgment.
49
53
  const startupProviderPrewarm = startProviderPrewarm({
50
54
  sessionId,
51
55
  session,
52
56
  provider,
53
- turnEffort,
54
- effortConfiguration,
57
+ turnEffort: session.effort || null,
58
+ effortConfiguration: null,
55
59
  codexTurnId,
56
60
  startedAtMs: startedAt,
57
61
  });
58
- const userTurn = await buildUserTurn({
62
+ const [autoEffort, userTurn] = await Promise.all([
63
+ autoEffortPending,
64
+ buildUserTurn({
65
+ session,
66
+ prompt: input.prompt,
67
+ context: input.context,
68
+ explicitPrefetch: input.explicitPrefetch,
69
+ turnSignal,
70
+ transcriptMeta,
71
+ turnPromptSource: input.promptSource,
72
+ effortConfiguration: null,
73
+ }),
74
+ wireRoutePending,
75
+ ]);
76
+ const turnEffort = autoEffort?.applied ? autoEffort.effort : session.effort || null;
77
+ const effortConfiguration = prepareTurnEffortConfiguration(
59
78
  session,
60
- prompt: input.prompt,
61
- context: input.context,
62
- explicitPrefetch: input.explicitPrefetch,
63
- turnSignal,
64
- transcriptMeta,
65
- turnPromptSource: input.promptSource,
66
- effortConfiguration,
67
- });
79
+ provider,
80
+ autoEffort?.applied ? autoEffort.effort : undefined
81
+ );
82
+ // Auto effort also judges every tool-result step of the turn when the
83
+ // installed judge was trained on steps (session/loop/step-auto-effort.mjs).
84
+ const stepAutoEffort = turnStepAutoEffort(autoEffort, effortConfiguration);
85
+ if (effortConfiguration) {
86
+ // Stamp the turn's effort on the user message (same meta order as when it
87
+ // was built with it: before the runtime-context provenance).
88
+ const { runtimeUserContext, ...meta } = userTurn.userTurnMessage.meta || {};
89
+ userTurn.userTurnMessage.meta = {
90
+ ...meta,
91
+ effortConfiguration,
92
+ ...(runtimeUserContext ? { runtimeUserContext } : {}),
93
+ };
94
+ }
68
95
  const { historyMessages, outgoing } = userTurn;
69
96
  turn.userTurnContent = userTurn.userTurnMessage.content;
70
97
  turn.outgoing = outgoing;
@@ -87,6 +114,14 @@ export async function prepareAskTurn({ sessionId, opened, input, cwdOverride, tr
87
114
  // user turn is introduced.
88
115
  session.messages = filterModelVisibleSessionMessages(outgoing);
89
116
  session.liveTurnMessages = outgoing;
117
+ // Name a titleless session from its first human prompt before the first
118
+ // save, so the title outlives any later compaction of the transcript. The
119
+ // earliest human turn already in the history wins; this turn's prompt is the
120
+ // fallback (runtime-injected turns carrying a promptSource never name it).
121
+ backfillFallbackSessionTitle(session, [
122
+ ...historyMessages,
123
+ ...(input.promptSource ? [] : [{ role: 'user', content: input.prompt }]),
124
+ ]);
90
125
  session.activeTurnCheckpoint = {
91
126
  version: 1,
92
127
  turnToken,
@@ -127,6 +162,7 @@ export async function prepareAskTurn({ sessionId, opened, input, cwdOverride, tr
127
162
  beforeCount: historyMessages.length + 1,
128
163
  deferredToolDelta: userTurn.deferredToolDelta,
129
164
  goalReminder: userTurn.goalReminder,
165
+ workspaceNotice: userTurn.workspaceNotice,
130
166
  };
131
167
  }
132
168
 
@@ -18,6 +18,53 @@ const relay = (fn, ...args) => {
18
18
  }
19
19
  };
20
20
 
21
+ /**
22
+ * The callback-free send options that shape a turn's provider request (effort,
23
+ * model parameters, cache routing, continuation state, Codex wire identity and
24
+ * the session's provider cache settings). agentLoop's options spread them, and
25
+ * a /btw request built before any turn has run uses them as they are.
26
+ */
27
+ export function buildRequestSendOptions({
28
+ sessionId,
29
+ session,
30
+ turnEffort,
31
+ effortConfiguration,
32
+ stepAutoEffort,
33
+ codexTurnId,
34
+ startedAtMs,
35
+ signal,
36
+ }) {
37
+ return {
38
+ effort: turnEffort,
39
+ effortConfiguration,
40
+ // { request, base } when each tool-result step is judged (step-auto-effort.mjs).
41
+ stepAutoEffort: stepAutoEffort || null,
42
+ fast: session.fast === true,
43
+ modelParameters: session.modelParameters || {},
44
+ selectedContextWindow: session.selectedContextWindow || session.contextWindow || null,
45
+ sessionId,
46
+ // Same projection compaction uses, so a session presents one identity on
47
+ // every request it makes.
48
+ ...(codexWireSendOpts(session, { turnId: codexTurnId, startedAtMs }) || {}),
49
+ promptCacheKey: session.promptCacheKey || sessionId,
50
+ // Provider-scoped cache key (mixdog-codex, mixdog-claude…). Distinct
51
+ // from sessionId — providers that pool sockets per-session (openai-oauth
52
+ // WS) use sessionId as the pool bucket and providerCacheKey as the
53
+ // server-side prompt-cache shard so parallel callers don't collide on a
54
+ // mid-turn socket while still sharing prefix cache.
55
+ providerCacheKey: session.promptCacheKey || null,
56
+ signal,
57
+ providerState: session.providerState ?? undefined,
58
+ // The wire this session is pinned to (wire-route.mjs).
59
+ wireRoute: session.wireRoute ?? undefined,
60
+ session,
61
+ // Agent Runtime cache settings — merged last so session overrides don't
62
+ // get overridden by defaults. When session has no profile,
63
+ // providerCacheOpts is null and this spread is a no-op.
64
+ ...(session.providerCacheOpts || {}),
65
+ };
66
+ }
67
+
21
68
  /**
22
69
  * @param {object} input
23
70
  * @param {string} input.sessionId
@@ -49,14 +96,6 @@ export function buildAgentLoopOptions({
49
96
  // (ask-turn-steering-drain.mjs).
50
97
  const drainSteering = createAskSteeringDrain({ sessionId, turn, askOpts });
51
98
  return {
52
- effort: turnEffort,
53
- effortConfiguration,
54
- // { request, base } when each tool-result step is judged (step-auto-effort.mjs).
55
- stepAutoEffort: stepAutoEffort || null,
56
- fast: session.fast === true,
57
- modelParameters: session.modelParameters || {},
58
- selectedContextWindow: session.selectedContextWindow || session.contextWindow || null,
59
- sessionId,
60
99
  onTextDelta: (chunk) => {
61
100
  interruption.recordTextDelta(chunk);
62
101
  checkpoint.schedule();
@@ -157,23 +196,16 @@ export function buildAgentLoopOptions({
157
196
  relay(askOpts?.onSkillsApplied, names, detail);
158
197
  },
159
198
  notifyFn: optionalFn(askOpts?.notifyFn),
160
- // Same projection compaction uses, so a session presents one identity on
161
- // every request it makes.
162
- ...(codexWireSendOpts(session, { turnId: codexTurnId, startedAtMs }) || {}),
163
- promptCacheKey: session.promptCacheKey || sessionId,
164
- // Provider-scoped cache key (mixdog-codex, mixdog-claude…). Distinct
165
- // from sessionId — providers that pool sockets per-session (openai-oauth
166
- // WS) use sessionId as the pool bucket and providerCacheKey as the
167
- // server-side prompt-cache shard so parallel callers don't collide on a
168
- // mid-turn socket while still sharing prefix cache.
169
- providerCacheKey: session.promptCacheKey || null,
170
- signal,
171
- providerState: session.providerState ?? undefined,
172
- session,
173
- // Agent Runtime cache settings — merged last so session overrides don't
174
- // get overridden by defaults. When session has no profile,
175
- // providerCacheOpts is null and this spread is a no-op.
176
- ...(session.providerCacheOpts || {}),
199
+ ...buildRequestSendOptions({
200
+ sessionId,
201
+ session,
202
+ turnEffort,
203
+ effortConfiguration,
204
+ stepAutoEffort,
205
+ codexTurnId,
206
+ startedAtMs,
207
+ signal,
208
+ }),
177
209
  onStageChange: (stage, detail) => {
178
210
  updateSessionStage(sessionId, stage);
179
211
  relay(askOpts?.onStageChange, stage, detail);
@@ -16,6 +16,7 @@ import {
16
16
  prefixUserTurnContent,
17
17
  suffixUserTurnReminders,
18
18
  buildCurrentTimeBlock,
19
+ snapshotPendingWorkspaceNotice,
19
20
  } from './prompt-utils.mjs';
20
21
  import { codexWireSendOpts } from './session-id.mjs';
21
22
  import { _tryBridgeExplicitPrefetch } from './prefetch-bridge.mjs';
@@ -173,7 +174,11 @@ export async function buildUserTurn({
173
174
  // input intake: either can precede the previous turn's pause.
174
175
  // This supplies context only; it never resumes the Goal.
175
176
  const goalReminder = snapshotPendingGoalReminder(session, { includePaused: true });
177
+ // A mid-conversation working-folder change: the system prompt keeps its
178
+ // old root (cache intact) and the new folder's facts ride this turn.
179
+ const workspaceNotice = snapshotPendingWorkspaceNotice(session);
176
180
  const reminderBlock = [
181
+ workspaceNotice?.content || '',
177
182
  currentTimeBlock ? `<system-reminder>\n# Current Time\n${currentTimeBlock}\n</system-reminder>` : '',
178
183
  deferredToolDelta?.content || '',
179
184
  goalReminder?.content || '',
@@ -200,6 +205,7 @@ export async function buildUserTurn({
200
205
  historyMessages,
201
206
  deferredToolDelta,
202
207
  goalReminder,
208
+ workspaceNotice,
203
209
  userTurnMessage,
204
210
  outgoing: [...historyMessages, userTurnMessage],
205
211
  };
@@ -8,6 +8,7 @@ import { ingestSessionTurn } from '../../../../session-search/session-search-ing
8
8
  import { persistedAssistantTranscriptMetadata } from '../../../../shared/transcript-metadata.mjs';
9
9
  import { acknowledgePendingDeferredToolDelta } from '../../runtime-core/deferred-tool-delta.mjs';
10
10
  import { acknowledgePendingGoalReminder } from '../../runtime-core/goal-reminder.mjs';
11
+ import { acknowledgePendingWorkspaceNotice } from './prompt-utils.mjs';
11
12
  import {
12
13
  finalizePendingMessageDelivery,
13
14
  drainPendingMessages,
@@ -121,6 +122,9 @@ export async function commitAskTurn({ sessionId, opened, prepared, result, rawTr
121
122
  if (prepared.goalReminder) {
122
123
  acknowledgePendingGoalReminder(session, prepared.goalReminder.revision);
123
124
  }
125
+ if (prepared.workspaceNotice) {
126
+ acknowledgePendingWorkspaceNotice(session, prepared.workspaceNotice.revision);
127
+ }
124
128
  return {
125
129
  ...result,
126
130
  trimmed: messagesDropped > 0,
@@ -21,7 +21,9 @@ import { uncachedInputTokensForProvider } from './usage-metrics.mjs';
21
21
  import { pruneOffloadSession } from '../tool-result-offload.mjs';
22
22
  import { _getPendingMessagesForSession } from './pending-messages.mjs';
23
23
  import { isSessionCompactionBlocked } from './runtime-liveness.mjs';
24
+ import { backfillFallbackSessionTitle } from './session-fallback-title.mjs';
24
25
  import { resetReadStateAfterCompaction } from '../read-dedup.mjs';
26
+ import { applyPendingWorkspaceReroot } from './prompt-utils.mjs';
25
27
  import {
26
28
  compactTargetBudget as compactTargetBudgetForPolicy,
27
29
  compactDisplayBeforeTokens,
@@ -629,7 +631,13 @@ async function commitSessionCompaction(plan, run, compactStartedAt) {
629
631
  let unchangedReason = null;
630
632
  if (!changed) unchangedReason = force ? 'nothing to compact' : 'below threshold';
631
633
  const now = Date.now();
634
+ // Older titleless sessions: keep a name before the transcript that carries
635
+ // the first prompt is replaced.
636
+ if (changed) backfillFallbackSessionTitle(session, messages);
632
637
  session.messages = transcript;
638
+ // The compacted transcript breaks the cache anyway: a staged working-folder
639
+ // change re-roots the system prompt now and needs no notice any more.
640
+ if (changed) applyPendingWorkspaceReroot(session);
633
641
  if (changed) resetReadStateAfterCompaction(resolvedSessionId);
634
642
  await pruneCompactedOffloads(session, resolvedSessionId);
635
643
  if (changed) session.providerState = undefined;
@@ -1,7 +1,7 @@
1
1
  import { createHash, randomBytes } from 'node:crypto';
2
2
  import { mergeNormalizedContentEntries } from '../loop/steering.mjs';
3
3
  import { isDeliveredCompletion, logDuplicateSkip } from './delivered-completions.mjs';
4
- import { isInternalRuntimeNotificationText, promptContentText } from './prompt-utils.mjs';
4
+ import { promptContentText } from './prompt-utils.mjs';
5
5
  import { parseTaskNotification, taskNotificationId } from '../../../../shared/task-notification-envelope.mjs';
6
6
 
7
7
  const STALE_USER_INJECTION_TTL_MS = 30 * 60 * 1000;
@@ -295,15 +295,10 @@ function normalizePersistedEntryBase(entry) {
295
295
  }
296
296
 
297
297
  export function modelVisiblePendingMessages(messages) {
298
- return (Array.isArray(messages) ? messages : [])
299
- .map(pendingMessageQueueEntry)
300
- .filter(Boolean)
301
- .filter(
302
- (message) =>
303
- !isInternalRuntimeNotificationText(
304
- message && typeof message === 'object' && Object.hasOwn(message, 'content') ? message.content : message
305
- )
306
- );
298
+ // No content filter: isInternalRuntimeNotificationText is a display-only
299
+ // predicate. Every canonical completion envelope matches it, and a drained
300
+ // entry the model never sees is never claimed/acked/released.
301
+ return (Array.isArray(messages) ? messages : []).map(pendingMessageQueueEntry).filter(Boolean);
307
302
  }
308
303
 
309
304
  export function _mergePendingMessageEntries(entries) {