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
@@ -2,7 +2,7 @@
2
2
  * src/tui/session/active-tool-summary.mjs - surfaced-tool activity summary.
3
3
  *
4
4
  * Status surfaces must react at tool start, before a shell is backgrounded or
5
- * an agent worker heartbeat exists. Track the three surfaced categories
5
+ * an agent worker row exists. Track the three surfaced categories
6
6
  * directly; background shell records and worker rows later dedupe by max.
7
7
  */
8
8
  // Tool category -> the activeTools key it publishes under. Iteration order is
@@ -47,9 +47,6 @@ export function createContextState({
47
47
  // (fresh id, copied transcript), hosts validating "resume returned the
48
48
  // requested session" must accept the fork by its origin id.
49
49
  sessionForkedFrom: runtime.session?.forkedFrom || null,
50
- // Remote-attach marker: this surface is a live viewer on a session owned
51
- // by another process; submits are injected, transcript follows disk.
52
- sessionRemoteAttached: runtime.session?.remoteAttached === true,
53
50
  clientHostPid: runtime.clientHostPid || null,
54
51
  model: runtime.model,
55
52
  provider: runtime.provider,
@@ -71,8 +68,10 @@ export function createContextState({
71
68
  // Lead workspace record (worktrees/contract.mjs SessionWorkspace): the
72
69
  // registered Project, the execution root, the worktree binding and its
73
70
  // revision. Null while the session has never left its project folder.
74
- // Identity-stable until a transition commits.
75
- workspace: runtime.getWorkspace?.() ?? null,
71
+ // Identity-stable until a transition commits. A project-folder session in a
72
+ // git repository publishes the folder's branch / detached commit too
73
+ // (getLiveWorkspace reads HEAD without spawning git).
74
+ workspace: runtime.getLiveWorkspace?.() ?? runtime.getWorkspace?.() ?? null,
76
75
  systemShell: runtime.systemShell || { source: 'auto', command: '', effective: '' },
77
76
  webSearchRoute: runtime.getWebSearchRoute?.() || runtime.webSearchRoute || null,
78
77
  autoClear: autoClearState(),
@@ -8,7 +8,7 @@ import { isGoalQueuedEntry } from '../queue-helpers.mjs';
8
8
  export function createContinuationQueue({ runtime, flags, getState, getPending, enqueue, visibility }) {
9
9
  let scheduled = null;
10
10
  let disposed = false;
11
- const halted = () => disposed || flags.disposed || flags.pendingSessionReset;
11
+ const halted = () => disposed || flags.disposed || flags.pendingSessionReset || flags.quotaResumePending;
12
12
 
13
13
  const cancelQueuedGoalContinuations = ({ keepCloseoutFor = null } = {}) => {
14
14
  const pending = getPending();
@@ -38,7 +38,6 @@ export function createContinuationQueue({ runtime, flags, getState, getPending,
38
38
 
39
39
  const shouldRunGoalContinuation = (entry) => {
40
40
  if (halted()) return false;
41
- if (getState().sessionRemoteAttached) return false;
42
41
  if (entry?.mode === 'goal-closeout') {
43
42
  const goal = visibility.refreshGoalState();
44
43
  return goal?.status === 'duration_reached' && clean(entry.goalId) === clean(goal.id);
@@ -55,7 +54,7 @@ export function createContinuationQueue({ runtime, flags, getState, getPending,
55
54
  scheduled = null;
56
55
  if (halted()) return;
57
56
  const state = getState();
58
- if (state.busy || state.commandBusy || state.sessionRemoteAttached) return;
57
+ if (state.busy || state.commandBusy) return;
59
58
  // Queued user work runs first, and a queued Goal entry already carries
60
59
  // the next continuation.
61
60
  if (getPending().length > 0) return;
@@ -1,7 +1,10 @@
1
1
  // Deadline notices for the running Goal: the advance warning and the closeout
2
2
  // once the duration is reached.
3
3
  import { clean } from '../../../runtime/shared/clean.mjs';
4
- import { goalDeadlineReached, goalDeadlineWarning } from '../../../runtime/agent/orchestrator/runtime-core/goal-text.mjs';
4
+ import {
5
+ goalDeadlineReached,
6
+ goalDeadlineWarning,
7
+ } from '../../../runtime/agent/orchestrator/runtime-core/goal-text.mjs';
5
8
  import { isGoalQueuedEntry } from '../queue-helpers.mjs';
6
9
 
7
10
  export function createDeadlineDelivery({ runtime, getState, getPending, enqueue, halted }) {
@@ -54,7 +57,6 @@ export function createDeadlineDelivery({ runtime, getState, getPending, enqueue,
54
57
  const deliverGoalCloseout = (goal) => {
55
58
  if (halted()) return;
56
59
  const state = getState();
57
- if (state.sessionRemoteAttached) return;
58
60
  if (!state.busy && getPending().some((entry) => !isGoalQueuedEntry(entry))) {
59
61
  runtime.markGoalReminder?.('deadline-reached');
60
62
  return;
@@ -0,0 +1,21 @@
1
+ /**
2
+ * src/tui/session/goal-continuation/session-boundary.mjs - a session boundary
3
+ * (resume, new session, context switch) changes which Goal is current, so the
4
+ * continuation queued for the previous session is dropped and the current
5
+ * session's Goal is re-read and re-armed once the boundary settles.
6
+ */
7
+ const SESSION_BOUNDARY_METHODS = ['resume', 'newSession', 'switchContext'];
8
+
9
+ export function rearmGoalContinuationOnSessionBoundaries({ api, bag }) {
10
+ for (const method of SESSION_BOUNDARY_METHODS) {
11
+ if (typeof api[method] !== 'function') continue;
12
+ const base = api[method].bind(api);
13
+ api[method] = async (...args) => {
14
+ const result = await base(...args);
15
+ bag.cancelQueuedGoalContinuations?.();
16
+ bag.refreshGoalState?.();
17
+ bag.scheduleGoalContinuation?.();
18
+ return result;
19
+ };
20
+ }
21
+ }
@@ -11,42 +11,23 @@
11
11
  import {
12
12
  cancelQuotaResumeEntry,
13
13
  forgetQuotaSuspendedGoal,
14
- isAgentOnlySession,
15
14
  noteQuotaSuspendedGoal,
16
15
  publicQuotaResume,
17
16
  quotaAutoResumeEnabled,
18
17
  quotaResumeEntry,
19
18
  quotaSuspendedGoal,
19
+ rekeyQuotaResumeTurn,
20
20
  scheduleQuotaResumeEntry,
21
21
  subscribeQuotaResume,
22
22
  } from '../../runtime/shared/quota-resume-store.mjs';
23
- import { createSubmissionIntake } from './session-api/intake/submission.mjs';
24
23
 
25
24
  export const RETRY_CONTINUE_INSTRUCTION = 'Continue from where you left off.';
25
+ import { transcriptTurnKeys } from '../../runtime/shared/transcript-turn-keys.mjs';
26
+ export { transcriptTurnKeys };
26
27
 
27
28
  // Rows that frame a turn rather than carry its output (desktop transcript-rows).
28
29
  const TURN_CHROME_KINDS = new Set(['user', 'turndone', 'statusdone', 'notice']);
29
30
 
30
- function stableItemKey(item, index) {
31
- if (item?.id !== undefined && item?.id !== null) return String(item.id);
32
- return `${item?.kind || 'item'}:${item?.text || item?.label || item?.status || ''}:${index}`;
33
- }
34
-
35
- /** Turn identity per transcript row — the same keys the desktop derives. */
36
- export function transcriptTurnKeys(items) {
37
- const transcript = Array.isArray(items) ? items : [];
38
- const keys = [];
39
- let activeTurn = null;
40
- for (let index = 0; index < transcript.length; index += 1) {
41
- const item = transcript[index];
42
- if (item?.kind === 'user') activeTurn = `turn:${stableItemKey(item, index)}`;
43
- if (!activeTurn) activeTurn = `segment:${stableItemKey(item, index)}`;
44
- keys.push(activeTurn);
45
- if (item?.kind === 'turndone') activeTurn = null;
46
- }
47
- return keys;
48
- }
49
-
50
31
  /** The failed turndone that ended the transcript on exhausted provider quota,
51
32
  * when no later turn has begun: { turnKey, quota: { provider, model, resetAt|null } }. */
52
33
  export function latestQuotaFailure(items) {
@@ -106,7 +87,7 @@ export function failedTurnRetryPrompt(items, turnKey) {
106
87
  }
107
88
  if (!TURN_CHROME_KINDS.has(String(item?.kind || ''))) sampled = true;
108
89
  }
109
- if (!prompt) return null;
90
+ if (!prompt) return sampled ? RETRY_CONTINUE_INSTRUCTION : null;
110
91
  // Transcript rows keep only attachment metadata, so a text-only replay
111
92
  // would drop the attachments and the rewind would delete the original row.
112
93
  if (hasAttachments && !sampled) return null;
@@ -116,11 +97,6 @@ export function failedTurnRetryPrompt(items, turnKey) {
116
97
  export function createQuotaResumeLane(bag) {
117
98
  const { runtime, flags, getState, set, pending } = bag;
118
99
  const currentId = () => String(getState().sessionId || '');
119
- let intake = null;
120
- const submitAsync = (...args) => {
121
- intake ??= createSubmissionIntake(bag);
122
- return intake.submitAsync(...args);
123
- };
124
100
 
125
101
  const publishQuotaResume = () => {
126
102
  const next = publicQuotaResume(quotaResumeEntry(currentId()));
@@ -140,8 +116,6 @@ export function createQuotaResumeLane(bag) {
140
116
  routeProvider: String(runtime.sessionProvider ?? runtime.provider ?? ''),
141
117
  routeModel: String(runtime.sessionModel ?? runtime.model ?? ''),
142
118
  });
143
- // A delegated agent child never owns a resume: the Lead decides its retries.
144
- const agentOnly = () => isAgentOnlySession({ id: currentId(), ...runtime.session });
145
119
  const queueResume = (sessionId, failure) =>
146
120
  scheduleQuotaResumeEntry({ sessionId, turnKey: failure.turnKey, ...failure.quota, ...sessionRoute() });
147
121
 
@@ -151,6 +125,7 @@ export function createQuotaResumeLane(bag) {
151
125
  // that window also keeps the settlement from recording the Goal.
152
126
  let settlement = null;
153
127
  let cancelEpoch = 0;
128
+ let retryClaim = '';
154
129
 
155
130
  const cancelFor = (sessionId) => {
156
131
  cancelEpoch += 1;
@@ -169,24 +144,107 @@ export function createQuotaResumeLane(bag) {
169
144
  state.commandBusy ||
170
145
  flags.autoClearRunning ||
171
146
  flags.draining ||
147
+ flags.quotaResumePending ||
172
148
  pending.length > 0
173
149
  );
174
150
  };
175
151
 
176
- /** The one retry operation. `automatic` is the scheduler's resume: it
177
- * enqueues directly, because the hours it waited must not trigger the idle
178
- * auto-clear a user submission starts. */
179
- function retryFailedTurn(turnKey, { automatic = false } = {}) {
152
+ /** A resume preserves its history rather than running idle auto-clear. */
153
+ function retainedRetryInput() {
154
+ const messages = runtime.readModelMessages?.().messages;
155
+ const message = Array.isArray(messages) ? messages.findLast((item) => item?.role !== 'system') : null;
156
+ const transcript = message?.meta?.transcript;
157
+ if (message?.role !== 'user' || !transcript?.messageId || transcript?.completion?.status !== 'failed') return null;
158
+ return { content: message.content, messageId: transcript.messageId, attemptId: transcript.completion.attemptId };
159
+ }
160
+
161
+ function retryFailedTurn(turnKey) {
162
+ const retained = retainedRetryInput();
163
+ if (retained) {
164
+ return bag.enqueue(retained.content, {
165
+ mode: 'prompt',
166
+ id: bag.nextId(),
167
+ retryFailedTurn: true,
168
+ retryTurnId: retained.messageId,
169
+ retryAttemptId: retained.attemptId,
170
+ suppressDisplay: true,
171
+ skipSlashCommands: true,
172
+ });
173
+ }
180
174
  const prompt = failedTurnRetryPrompt(getState().items, turnKey);
181
175
  if (!prompt) return false;
182
- if (automatic) {
183
- return bag.enqueue(prompt, { mode: 'prompt', id: bag.nextId(), displayText: prompt, retryFailedTurn: true });
176
+ return bag.enqueue(prompt, { mode: 'prompt', id: bag.nextId(), displayText: prompt, retryFailedTurn: true });
177
+ }
178
+
179
+ function finishResume(id, entry, goalId = '') {
180
+ if (entry) cancelQuotaResumeEntry(id, { generation: entry.generation });
181
+ if (goalId && quotaSuspendedGoal(id, entry?.turnKey || latestFailedTurnKey(getState().items)) === goalId) {
182
+ forgetQuotaSuspendedGoal(id);
183
+ }
184
+ }
185
+
186
+ async function resumeGoal(id, key, goalId, entry, claim) {
187
+ const token = { epoch: cancelEpoch, admitted: false };
188
+ const generation = entry?.generation ?? null;
189
+ const current = () =>
190
+ currentId() === id &&
191
+ cancelEpoch === token.epoch &&
192
+ !flags.disposed &&
193
+ (flags.admission || 'open') === 'open' &&
194
+ latestFailedTurnKey(getState().items) === key &&
195
+ (quotaResumeEntry(id)?.generation ?? null) === generation;
196
+ const prompt = failedTurnRetryPrompt(getState().items, key);
197
+ const retained = retainedRetryInput();
198
+ flags.quotaResumePending = token;
199
+ let accepted = false;
200
+ let recoveryFailed = false;
201
+ try {
202
+ if (typeof runtime.reactivateUsageLimitedGoal !== 'function') throw new Error('Goal resume is unavailable.');
203
+ const goal = await runtime.reactivateUsageLimitedGoal(goalId, {
204
+ isCurrent: current,
205
+ accept: () => {
206
+ if (!current()) return false;
207
+ if ((retained || prompt) && retryFailedTurn(key) === false) return false;
208
+ token.admitted = true;
209
+ return true;
210
+ },
211
+ });
212
+ accepted = goal?.status === 'active' && token.admitted;
213
+ if (accepted) finishResume(id, entry, goalId);
214
+ return accepted;
215
+ } catch (error) {
216
+ recoveryFailed = error?.quotaResumeRollbackFailed === true;
217
+ bag.pushNotice?.(`Goal resume failed: ${error?.message || error}`, 'warn', { transcript: true });
218
+ throw error;
219
+ } finally {
220
+ if (!accepted && retryClaim === claim) retryClaim = '';
221
+ if (!recoveryFailed && flags.quotaResumePending === token) {
222
+ flags.quotaResumePending = null;
223
+ void bag.drain?.();
224
+ if (accepted && !retained && !prompt) bag.scheduleGoalContinuation?.();
225
+ }
184
226
  }
185
- return submitAsync(prompt, { retryFailedTurn: true });
227
+ }
228
+
229
+ function hasResumeInput(key) {
230
+ if (retainedRetryInput()) return true;
231
+ if (failedTurnRetryPrompt(getState().items, key)) return true;
232
+ if (key.startsWith('turn:')) return false;
233
+ return Boolean(
234
+ quotaSuspendedGoal(currentId(), key) ||
235
+ (runtime.goalStatus?.()?.id && typeof runtime.reactivateUsageLimitedGoal === 'function')
236
+ );
186
237
  }
187
238
 
188
239
  return {
189
240
  publishQuotaResume,
241
+ reconcileQuotaResume() {
242
+ const items = getState().items;
243
+ const key = latestFailedTurnKey(items);
244
+ const failure = items?.findLast((item) => item?.kind === 'turndone');
245
+ if (!key || failure?.attemptId || !failure?.checkpointId) return false;
246
+ return rekeyQuotaResumeTurn(currentId(), `turn:${failure.checkpointId}`, key);
247
+ },
190
248
  disposeQuotaResume: unsubscribe,
191
249
 
192
250
  /** Turn close, synchronously with the failed turndone: with a known reset
@@ -198,7 +256,13 @@ export function createQuotaResumeLane(bag) {
198
256
  settlement = null;
199
257
  if (!id || !failure) return null;
200
258
  settlement = { sessionId: id, turnKey: failure.turnKey, epoch: cancelEpoch };
201
- if (failure.quota.resetAt === null || !quotaAutoResumeEnabled() || agentOnly()) return null;
259
+ if (failure.quota.resetAt === null || !quotaAutoResumeEnabled()) return null;
260
+ if (!hasResumeInput(failure.turnKey)) {
261
+ bag.pushNotice?.('This turn cannot be resumed automatically. Send a new message to continue.', 'warn', {
262
+ transcript: true,
263
+ });
264
+ return null;
265
+ }
202
266
  return queueResume(id, failure);
203
267
  },
204
268
 
@@ -220,22 +284,24 @@ export function createQuotaResumeLane(bag) {
220
284
  /** Explicit request to auto-resume the latest quota-failed turn. */
221
285
  scheduleQuotaResume(sessionId) {
222
286
  requireAddressed(sessionId);
223
- if (agentOnly()) throw new Error('agent sessions do not auto-resume; the Lead decides retries');
224
287
  const failure = latestQuotaFailure(getState().items);
225
288
  if (!failure || failure.quota.resetAt === null) {
226
289
  throw new Error('latest turn did not fail on exhausted provider quota with a known reset time');
227
290
  }
291
+ if (!hasResumeInput(failure.turnKey))
292
+ throw new Error('This turn cannot be resumed automatically. Send a new message to continue.');
228
293
  queueResume(sessionId, failure);
229
294
  return true;
230
295
  },
231
296
 
232
297
  cancelQuotaResume(sessionId) {
233
298
  requireAddressed(sessionId);
299
+ cancelEpoch += 1;
234
300
  cancelQuotaResumeEntry(sessionId);
235
301
  return true;
236
302
  },
237
303
 
238
- /** A route change or a session clear/delete supersedes the wait. */
304
+ /** A session clear/delete supersedes the wait. */
239
305
  supersedeQuotaResume(sessionId) {
240
306
  if (sessionId) cancelFor(String(sessionId));
241
307
  },
@@ -248,7 +314,23 @@ export function createQuotaResumeLane(bag) {
248
314
  requireAddressed(sessionId);
249
315
  const key = String(turnKey || '');
250
316
  if (!key || retryBlocked() || latestFailedTurnKey(getState().items) !== key) return false;
251
- return (await retryFailedTurn(key)) === true;
317
+ const claim = `${sessionId}\u0000${key}`;
318
+ if (retryClaim === claim) return false;
319
+ const goalId = quotaSuspendedGoal(sessionId, key);
320
+ if (!retainedRetryInput() && !failedTurnRetryPrompt(getState().items, key) && !goalId) {
321
+ return false;
322
+ }
323
+ retryClaim = claim;
324
+ const entry = quotaResumeEntry(sessionId);
325
+ if (goalId) return resumeGoal(sessionId, key, goalId, entry, claim);
326
+ let accepted = false;
327
+ try {
328
+ accepted = retryFailedTurn(key) !== false;
329
+ if (accepted) finishResume(sessionId, entry);
330
+ return accepted;
331
+ } finally {
332
+ if (!accepted && retryClaim === claim) retryClaim = '';
333
+ }
252
334
  },
253
335
 
254
336
  /** Scheduler fire for the entry of `generation`, after a usable reading.
@@ -258,10 +340,6 @@ export function createQuotaResumeLane(bag) {
258
340
  const id = currentId();
259
341
  const entry = quotaResumeEntry(id);
260
342
  if (!id || !entry || entry.generation !== generation) return 'stale';
261
- if (agentOnly()) {
262
- cancelQuotaResumeEntry(id, { generation });
263
- return 'agent-session';
264
- }
265
343
  const state = getState();
266
344
  if (retryBlocked()) return 'busy';
267
345
  const failure = latestQuotaFailure(state.items);
@@ -269,28 +347,29 @@ export function createQuotaResumeLane(bag) {
269
347
  cancelQuotaResumeEntry(id, { generation });
270
348
  return 'superseded';
271
349
  }
272
- const route = sessionRoute();
273
- if (route.routeProvider !== entry.routeProvider || route.routeModel !== entry.routeModel) {
274
- cancelQuotaResumeEntry(id, { generation });
275
- return 'route-changed';
276
- }
277
350
  const goalId = quotaSuspendedGoal(id, entry.turnKey);
278
351
  // A user turn replays its prompt; an automatic Goal turn has no user row
279
352
  // and resumes as its Goal's next continuation.
280
- const userTurn = entry.turnKey.startsWith('turn:');
281
- if (userTurn ? !failedTurnRetryPrompt(state.items, entry.turnKey) : !goalId) {
353
+ if (!retainedRetryInput() && !failedTurnRetryPrompt(state.items, entry.turnKey) && !goalId) {
354
+ bag.pushNotice?.('This turn cannot be resumed automatically. Send a new message to continue.', 'warn', {
355
+ transcript: true,
356
+ });
282
357
  cancelQuotaResumeEntry(id, { generation });
283
358
  return 'unreplayable';
284
359
  }
285
- if (!cancelQuotaResumeEntry(id, { generation })) return 'stale';
286
- forgetQuotaSuspendedGoal(id);
287
- // Queued on the Goal's mutation chain ahead of the retry turn's own
288
- // start, so that turn opens on the revived Goal; the retry is busy
289
- // before the revived Goal's continuation check runs, so it queues none.
290
- // Without a retry the revived Goal's continuation is the one turn.
291
- if (goalId) void Promise.resolve(runtime.reactivateUsageLimitedGoal?.(goalId)).catch(() => {});
292
- if (!userTurn) return 'fired';
293
- return retryFailedTurn(entry.turnKey, { automatic: true }) !== false ? 'fired' : 'rejected';
360
+ const claim = `${id}\u0000${entry.turnKey}`;
361
+ if (retryClaim === claim) return 'stale';
362
+ retryClaim = claim;
363
+ if (goalId)
364
+ return resumeGoal(id, entry.turnKey, goalId, entry, claim).then((accepted) =>
365
+ accepted ? 'fired' : 'rejected'
366
+ );
367
+ if (retryFailedTurn(entry.turnKey) === false) {
368
+ retryClaim = '';
369
+ return 'rejected';
370
+ }
371
+ finishResume(id, entry);
372
+ return 'fired';
294
373
  },
295
374
  };
296
375
  }
@@ -2,6 +2,7 @@
2
2
  * commands.mjs — the session object's long-running slash commands: memory
3
3
  * control, recall, doctor, and manual compaction (scheduled for turn end when
4
4
  * a turn is running). Each shows a command status while it holds the lock.
5
+ * /btw side questions (askSide/cancelSide) run beside them, lock-free.
5
6
  */
6
7
  import { compactEventDetail } from '../labels.mjs';
7
8
  import { archiveItemsForCompaction, compactionArchivedRows } from '../compaction-view.mjs';
@@ -92,16 +93,14 @@ export function createSessionCommandsApi(bag) {
92
93
  };
93
94
  };
94
95
 
95
- // The compaction pass itself, under a lock its caller holds. `quiet` (the
96
- // model switch's pre-compaction) asks the compactor to skip a pass that
97
- // would not reduce anything and then adds no row for it.
98
- async function runCompaction(startedAt, { quiet = false } = {}) {
96
+ // The explicit compaction pass, under a lock its caller holds.
97
+ async function runCompaction(startedAt) {
99
98
  // Give Ink one event-loop turn to paint the compacting spinner before
100
99
  // runtime.compact() starts synchronous session/transcript work (same
101
100
  // yield as the auto-clear path; without it /compact looks frozen with
102
101
  // no spinner until the compact already finished).
103
102
  await new Promise((resolve) => setTimeout(resolve, 0));
104
- const result = await runtime.compact({ recoverAgent: true, ...(quiet ? { requireReduction: true } : {}) });
103
+ const result = await runtime.compact({ recoverAgent: true });
105
104
  const compactChanged = Boolean(result && !result.error && result.changed !== false);
106
105
  syncContextStats({
107
106
  allowEstimated: true,
@@ -114,16 +113,12 @@ export function createSessionCommandsApi(bag) {
114
113
  archived: compactionArchivedRows(result),
115
114
  });
116
115
  set({ items: replaceItems(items, { preserveSpill: true }) });
117
- } else if (!quiet || result?.error) {
116
+ } else {
118
117
  pushItem(compactDoneItem(result, startedAt));
119
118
  }
120
119
  return result;
121
120
  }
122
121
 
123
- // An in-place model switch compacts first on the current model (routes.mjs
124
- // holds the command lock and shows the compacting status meanwhile).
125
- bag.compactBeforeModelSwitch = () => runCompaction(Date.now(), { quiet: true });
126
-
127
122
  async function compactCommand() {
128
123
  if (getState().commandBusy) return null;
129
124
  if (getState().busy) return scheduleCompactForTurnEnd(compactCommand);
@@ -175,5 +170,14 @@ export function createSessionCommandsApi(bag) {
175
170
  });
176
171
  },
177
172
  compact: compactCommand,
173
+ // /btw: answered from the conversation so far while a turn keeps running.
174
+ // No command lock and no transcript row: the answer is only returned.
175
+ askSide: (question) => runtime.askSide(question),
176
+ // `sessionId` names the session the side question was asked in (it may
177
+ // no longer be the current one after a switch); omitted, the current one.
178
+ cancelSide: (sessionId) => {
179
+ if (typeof sessionId === 'string' && sessionId) runtime.cancelSide(sessionId);
180
+ else runtime.cancelSide();
181
+ },
178
182
  };
179
183
  }
@@ -67,6 +67,18 @@ export function createSessionControlsApi(bag) {
67
67
  stopShellJob: async (taskId) => {
68
68
  return (await runtime.stopShellJob?.(taskId)) ?? { stopped: false, error: 'shell job control is unavailable' };
69
69
  },
70
+ // Explicit force-release of a shell whose termination is unconfirmed:
71
+ // { released, error? }. Surfaces confirm with the user before calling.
72
+ releaseShellJob: async (taskId) => {
73
+ return (
74
+ (await runtime.releaseShellJob?.(taskId)) ?? { released: false, error: 'shell job control is unavailable' }
75
+ );
76
+ },
77
+ // This session's live shell jobs, each flagged when its termination is
78
+ // unconfirmed: { jobs }.
79
+ listShellJobs: async () => {
80
+ return (await runtime.listShellJobs?.()) ?? { jobs: [] };
81
+ },
70
82
  goalControl: async (args = {}) => {
71
83
  const result = await runtime.goalControl?.(args);
72
84
  if (['pause', 'stop'].includes(result?.action)) {
@@ -91,8 +103,8 @@ export function createSessionControlsApi(bag) {
91
103
  );
92
104
  return result;
93
105
  },
94
- setCwd: (path, options = {}) => {
95
- const next = runtime.setCwd(path);
106
+ setCwd: async (path, options = {}) => {
107
+ const next = await runtime.setCwd(path);
96
108
  // Republish up-arrow history for the NEW project: current session prompts
97
109
  // merged with the cwd-scoped persisted store for the new cwd.
98
110
  const sessionList = recomputePromptHistory(getState().items);
@@ -38,8 +38,8 @@ export function createSessionIntegrationsApi(bag, { oauthFlows }) {
38
38
  getQuotaHistory: async (options = {}) => {
39
39
  return await runtime.getQuotaHistory?.(options);
40
40
  },
41
- getSessionUsage: async () => {
42
- return await runtime.getSessionUsage?.();
41
+ getSessionUsage: async (options = {}) => {
42
+ return await runtime.getSessionUsage?.(options);
43
43
  },
44
44
  consumeCodexRateLimitResetCredit: async (options = {}) => {
45
45
  // Desktop capability parity: without this delegation the session runtime
@@ -52,6 +52,12 @@ export function createSessionIntegrationsApi(bag, { oauthFlows }) {
52
52
  getSessionReviewDiff: async () => {
53
53
  return (await runtime.getSessionReviewDiff?.()) ?? { supported: false, files: [], patch: '' };
54
54
  },
55
+ getSessionReviewFilePatch: async (file, oldPath) => {
56
+ return (await runtime.getSessionReviewFilePatch?.(file, oldPath)) ?? { supported: false, patch: '' };
57
+ },
58
+ getTurnReviewFilePatch: async (file) => {
59
+ return (await runtime.getTurnReviewFilePatch?.(file)) ?? { supported: false, patch: '' };
60
+ },
55
61
  revertTurnReview: async (checkpointId) => {
56
62
  return await requireRuntimeMethod('revertTurnReview', 'Turn review revert is unavailable')(checkpointId);
57
63
  },
@@ -140,6 +146,7 @@ export function createSessionIntegrationsApi(bag, { oauthFlows }) {
140
146
  return result;
141
147
  },
142
148
  testCustomProvider: (input) => runtime.testCustomProvider(input),
149
+ checkCustomProviderKeyEnv: (name) => runtime.checkCustomProviderKeyEnv(name),
143
150
  discoverCustomProviderModels: (input) => runtime.discoverCustomProviderModels(input),
144
151
  saveOpenCodeGoUsageAuth: async (opts) => {
145
152
  await runtime.saveOpenCodeGoUsageAuth(opts);
@@ -1,4 +1,4 @@
1
- // Dispose: release presence, timers, subscriptions, approvals and OAuth flows,
1
+ // Dispose: release timers, subscriptions, approvals and OAuth flows,
2
2
  // persist steering, then close the runtime — once.
3
3
  import { flushTuiSteeringPersist } from '../../tui-steering-persist.mjs';
4
4
 
@@ -20,14 +20,6 @@ export function createDisposeAction(bag, { oauthFlows }) {
20
20
  if (flags.disposed) return;
21
21
  disposeEmit?.();
22
22
  flags.disposed = true;
23
- // Release the interactive-presence beacon so a cross-open after this
24
- // surface exits takes normal ownership instead of viewer-attaching to a
25
- // dead owner (crash paths fall back to the 2min staleness window).
26
- try {
27
- runtime.clearSessionPresence?.();
28
- } catch {
29
- /* best-effort */
30
- }
31
23
  clearToastTimers();
32
24
  disposeTranscriptSpill?.();
33
25
  disposeGoalContinuation?.();
@@ -40,6 +32,8 @@ export function createDisposeAction(bag, { oauthFlows }) {
40
32
  'unsubscribeAgentStatus',
41
33
  'unsubscribeRemoteState',
42
34
  'unsubscribeCompletionWakeGate',
35
+ 'unsubscribeGitHeadWatch',
36
+ 'unsubscribeWorktreeSetup',
43
37
  ]) {
44
38
  try {
45
39
  lifecycle[key]?.();
@@ -1,5 +1,5 @@
1
1
  // Resume: reopen a stored session, rebuild the visible transcript from its
2
- // messages and reconcile live-share and steering at the same boundary.
2
+ // messages and reconcile steering at the same boundary.
3
3
  import { primeContextEstimates } from '../../../../runtime/agent/orchestrator/session/context-utils.mjs';
4
4
  import { resumedTranscriptArchive } from '../../compaction-view.mjs';
5
5
 
@@ -63,12 +63,7 @@ export function createResumeAction(bag, { restoreTranscriptItems }) {
63
63
  ...routeState(),
64
64
  stats: { ...getState().stats },
65
65
  });
66
- // Reconcile the live-share legs NOW (viewer pipe attach / owner pipe
67
- // start). The 3s share tick otherwise leaves a live-owned session on
68
- // the stale disk snapshot and then full-swaps it seconds after entry —
69
- // the visible transcript lurch. Connecting here makes the owner's
70
- // full frame land at the resume boundary, so entry paints settled.
71
- bag.ensureLiveShare?.();
66
+ bag.reconcileQuotaResume?.();
72
67
  // A shard/process restart recreates the runtime before resuming its
73
68
  // durable session. Restore accepted steering while commandBusy is
74
69
  // still held so the central release hook drains it exactly once after