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
@@ -15,10 +15,12 @@ import { createGoalContinuation } from '../tui/session/goal-continuation.mjs';
15
15
  import { createToolApproval } from '../tui/session/tool-approval.mjs';
16
16
  import { createToolCardResults } from '../tui/session/tool-card-results.mjs';
17
17
  import { createAgentJobFeed } from '../tui/session/agent-job-feed.mjs';
18
+ import { createWorktreeSetupNotices } from '../tui/session/worktree-setup-notice.mjs';
18
19
  import { createContextState } from '../tui/session/context-state.mjs';
19
20
  import { createSessionFlow } from '../tui/session/session-flow.mjs';
20
21
  import { createRunTurn } from '../tui/session/turn.mjs';
21
22
  import { createQuotaResumeLane } from '../tui/session/quota-resume.mjs';
23
+ import { createGitHeadWatcher } from '../runtime/shared/worktrees/git-head.mjs';
22
24
  import { publicQuotaResume, quotaResumeEntry } from '../runtime/shared/quota-resume-store.mjs';
23
25
  import { createSessionApi } from '../tui/session/session-api.mjs';
24
26
  import { createSessionDraftStore } from '../tui/session/draft-store.mjs';
@@ -27,24 +29,60 @@ import { createActiveToolTracker } from '../tui/session/active-tool-summary.mjs'
27
29
  import { createTranscriptStore } from '../tui/session/transcript-store.mjs';
28
30
  import { createTranscriptIntake } from '../tui/session/transcript-intake.mjs';
29
31
  import { createNoticeSurface } from '../tui/session/notice-surface.mjs';
30
- import { attachCrossSurfaceShare } from '../tui/session/cross-surface-share.mjs';
32
+ import { rearmGoalContinuationOnSessionBoundaries } from '../tui/session/goal-continuation/session-boundary.mjs';
31
33
  import { createTranscriptRouteMetadata } from '../runtime/shared/transcript-metadata.mjs';
32
34
  import { formatDoctorReport, runDoctorChecks } from '../tui/app/doctor.mjs';
33
35
  // tuiDebug is an opt-in diagnostic trace for the hang chain (runTurn start/end,
34
36
  // busy-queue enqueue/drain). Quiet by default so it can never tear through
35
37
  // the alternate-screen render; enable with MIXDOG_TUI_DEBUG=1.
36
- import { tuiDebug, nextId, createTranscriptSpillBuffer } from '../tui/session/transcript-spill.mjs';
38
+ import {
39
+ tuiDebug,
40
+ nextId,
41
+ createTranscriptSpillBuffer,
42
+ sweepStaleTranscriptSpillDirsOnce,
43
+ } from '../tui/session/transcript-spill.mjs';
37
44
 
38
45
  const SESSION_RUNTIME_MODULE = '../mixdog-session-runtime.mjs';
39
46
 
40
47
  // Shared across create calls so concurrent session startups import the
41
48
  // runtime graph once.
42
49
  let sessionRuntimeModulePromise = null;
50
+ let sessionRuntimeImporter = () => import(SESSION_RUNTIME_MODULE);
43
51
  function importSessionRuntimeModule() {
44
- sessionRuntimeModulePromise ??= import(SESSION_RUNTIME_MODULE);
52
+ // A failed import is forgotten so the next caller retries lazily.
53
+ sessionRuntimeModulePromise ??= Promise.resolve()
54
+ .then(() => sessionRuntimeImporter())
55
+ .catch((error) => {
56
+ sessionRuntimeModulePromise = null;
57
+ throw error;
58
+ });
45
59
  return sessionRuntimeModulePromise;
46
60
  }
47
61
 
62
+ /**
63
+ * Background warm-up for the daemon (scheduled after the ready signal): loads
64
+ * the session-runtime module tree and runs the one-per-process transcript
65
+ * spill sweep, so the first session.create pays for neither. Failures are
66
+ * swallowed — create falls back to the same lazy import.
67
+ */
68
+ export async function warmLocalSessionRuntime() {
69
+ try {
70
+ await importSessionRuntimeModule();
71
+ // Separate turn: let queued I/O run between the import and the sync sweep.
72
+ await new Promise((resolve) => setImmediate(resolve));
73
+ sweepStaleTranscriptSpillDirsOnce();
74
+ return true;
75
+ } catch {
76
+ return false;
77
+ }
78
+ }
79
+
80
+ /** Test seam: replace the dynamic import of the session-runtime module. */
81
+ export function setSessionRuntimeImporterForTest(importer) {
82
+ sessionRuntimeImporter = importer || (() => import(SESSION_RUNTIME_MODULE));
83
+ sessionRuntimeModulePromise = null;
84
+ }
85
+
48
86
  const TOOL_APPROVAL_TIMEOUT_MS = (() => {
49
87
  const value = Number(process.env.MIXDOG_TOOL_APPROVAL_TIMEOUT_MS);
50
88
  return Number.isFinite(value) && value > 0 ? Math.max(1000, Math.round(value)) : 120_000;
@@ -72,7 +110,6 @@ export { parseBackgroundTaskEnvelope } from '../tui/session/agent-envelope.mjs';
72
110
  */
73
111
  export function createRuntimePulse({
74
112
  flags,
75
- liveShareMirroring,
76
113
  getState,
77
114
  getPublishedState,
78
115
  set,
@@ -98,16 +135,9 @@ export function createRuntimePulse({
98
135
  if (!set(changed)) emit();
99
136
  return true;
100
137
  };
101
- return () => {
138
+ const pulse = () => {
102
139
  if (flags.disposed) return;
103
140
  if (flags.pendingSessionReset) return;
104
- // Attached viewer with a live pipe: the owner's frames are authoritative
105
- // for stats/agent/tool state. Recomputing them locally here would stomp
106
- // the mirror with this process's empty registries every 2s.
107
- if (liveShareMirroring()) {
108
- publishChanged({ ...routeState() });
109
- return;
110
- }
111
141
  syncContextStats({ allowEstimated: true });
112
142
  publishChanged({
113
143
  ...routeState(),
@@ -115,6 +145,12 @@ export function createRuntimePulse({
115
145
  ...agentStatusState(),
116
146
  });
117
147
  };
148
+ /** Publishes just the workspace (a HEAD change): no stats or agent recompute. */
149
+ pulse.publishWorkspace = () => {
150
+ if (flags.disposed || flags.pendingSessionReset) return;
151
+ publishChanged({ workspace: routeState().workspace });
152
+ };
153
+ return pulse;
118
154
  }
119
155
 
120
156
  export async function createLocalSessionRuntime({
@@ -134,6 +170,7 @@ export async function createLocalSessionRuntime({
134
170
  sessionProfile,
135
171
  worktree,
136
172
  executeAgentControl,
173
+ executeSessionControl,
137
174
  } = {}) {
138
175
  const startedAt = performance.now();
139
176
  bootProfile('session:create:start', { provider: providerName, model, toolMode, remote });
@@ -166,6 +203,7 @@ export async function createLocalSessionRuntime({
166
203
  // Session creation worktree intent; consumed by the workspace transition scope.
167
204
  ...(worktree && typeof worktree === 'object' ? { worktree } : {}),
168
205
  ...(typeof executeAgentControl === 'function' ? { executeAgentControl } : {}),
206
+ ...(typeof executeSessionControl === 'function' ? { executeSessionControl } : {}),
169
207
  });
170
208
  bootProfile('session:create:runtime-ready', { ms: (performance.now() - startedAt).toFixed(1) });
171
209
  const runtimeCwd = runtime.cwd || process.cwd();
@@ -277,20 +315,28 @@ export async function createLocalSessionRuntime({
277
315
  timeoutMs: TOOL_APPROVAL_TIMEOUT_MS,
278
316
  }
279
317
  );
280
- lifecycle.runtimePulseTimer = setInterval(
281
- createRuntimePulse({
282
- flags,
283
- liveShareMirroring: () => bag.liveShareMirroring?.() === true,
284
- getState,
285
- getPublishedState,
286
- set,
287
- emit: store.emit,
288
- routeState,
289
- agentStatusState,
290
- syncContextStats,
291
- }),
292
- 2000
293
- );
318
+ const runtimePulse = createRuntimePulse({
319
+ flags,
320
+ getState,
321
+ getPublishedState,
322
+ set,
323
+ emit: store.emit,
324
+ routeState,
325
+ agentStatusState,
326
+ syncContextStats,
327
+ });
328
+ // A `git switch` from any terminal reaches the island within ~a frame; the
329
+ // pulse retargets the watch when the session's folder moves.
330
+ const headWatch = createGitHeadWatcher({
331
+ getCwd: () => runtime.getLiveWorkspace?.()?.cwd || runtime.cwd,
332
+ onChange: runtimePulse.publishWorkspace,
333
+ });
334
+ headWatch.retarget();
335
+ lifecycle.unsubscribeGitHeadWatch = headWatch.dispose;
336
+ lifecycle.runtimePulseTimer = setInterval(() => {
337
+ headWatch.retarget();
338
+ runtimePulse();
339
+ }, 2000);
294
340
  lifecycle.runtimePulseTimer.unref?.();
295
341
 
296
342
  const {
@@ -322,9 +368,14 @@ export async function createLocalSessionRuntime({
322
368
  itemIndexById,
323
369
  });
324
370
  lifecycle.unsubscribeRuntimeNotifications = subscribeRuntimeNotifications();
371
+ if (typeof runtime.onWorktreeSetup === 'function') {
372
+ lifecycle.unsubscribeWorktreeSetup = runtime.onWorktreeSetup(
373
+ createWorktreeSetupNotices({ pushItem, patchItem, nextId })
374
+ );
375
+ }
325
376
  if (typeof runtime.onAgentStatusChange === 'function') {
326
377
  lifecycle.unsubscribeAgentStatus = runtime.onAgentStatusChange(() => {
327
- if (flags.disposed || flags.pendingSessionReset || bag.liveShareMirroring?.()) return;
378
+ if (flags.disposed || flags.pendingSessionReset) return;
328
379
  set({ ...agentStatusState({ force: true }) });
329
380
  bag.scheduleGoalContinuation?.();
330
381
  });
@@ -405,8 +456,7 @@ export async function createLocalSessionRuntime({
405
456
  Object.assign(bag, createSessionFlow(bag));
406
457
  // Runtime-driven completion wakes (no attached surface acked the completion)
407
458
  // get the same idle auto-clear as a user submit.
408
- lifecycle.unsubscribeCompletionWakeGate =
409
- runtime.setCompletionWakeGate?.(() => bag.autoClearBeforeWake()) || null;
459
+ lifecycle.unsubscribeCompletionWakeGate = runtime.setCompletionWakeGate?.(() => bag.autoClearBeforeWake()) || null;
410
460
  Object.assign(
411
461
  bag,
412
462
  createGoalContinuation({
@@ -423,7 +473,7 @@ export async function createLocalSessionRuntime({
423
473
  bag.runTurn = createRunTurn(bag);
424
474
  bag.doctor = { runDoctorChecks, formatDoctorReport };
425
475
  const api = createSessionApi(bag);
426
- attachCrossSurfaceShare({ runtime, api, bag, flags, getState, getPublishedState, listeners, set });
476
+ rearmGoalContinuationOnSessionBoundaries({ api, bag });
427
477
  void Promise.resolve(bag.restoreLeadSteeringFromDisk())
428
478
  .catch(() => {})
429
479
  .finally(() => {
@@ -21,6 +21,7 @@ import { withHeapCap } from '../runtime/shared/heap-cap.mjs';
21
21
  import { daemonCrashCaptureDir, daemonDataDir } from '../session-runtime/services/daemon-crash-capture.mjs';
22
22
  import { forkDaemonCandidate } from '../session-runtime/services/daemon-candidate.mjs';
23
23
  import { daemonOwnerIsStale, proveDaemonOwnerRecord } from './daemon-owner.mjs';
24
+ import { IN_TREE_DAEMON_STOP_GRACE_MS } from './daemon-stop-budget.mjs';
24
25
  import { createAttachmentCalls } from './session-client/attachment-calls.mjs';
25
26
  import { daemonUnavailableError } from './session-client/daemon-unavailable.mjs';
26
27
  import { createLeaseHeartbeat } from './session-client/lease-heartbeat.mjs';
@@ -324,6 +325,12 @@ async function replaceLowerDaemon(discovery, initialHealth, { log, onUpgradeWait
324
325
  * caller then re-reads discovery and attaches to whoever won. The shared fork
325
326
  * and crash capture live in ./daemon-candidate.mjs.
326
327
  * `entry` is a test seam; production always forks the real daemon. */
328
+ // Daemons this process forked into its own process tree (daemonShouldDetach
329
+ // false: the packaged Windows Desktop). Such a child is killed with its
330
+ // launcher (libuv's kill-on-close job), which skips its whole teardown —
331
+ // PostgreSQL stop included — so the launcher's quit stops it first.
332
+ const inTreeDaemons = new Map();
333
+
327
334
  export function spawnDaemonCandidate({ cwd, log, timeoutMs = 30_000, entry = daemonEntry() }) {
328
335
  const t0 = performance.now();
329
336
  const at = () => Math.round(performance.now() - t0);
@@ -353,6 +360,10 @@ export function spawnDaemonCandidate({ cwd, log, timeoutMs = 30_000, entry = dae
353
360
  const forkMs = at();
354
361
  child.once('spawn', () => {
355
362
  log(`daemon fork: forkMs=${forkMs} spawnEventMs=${at()}`);
363
+ if (!detached && child.pid) {
364
+ inTreeDaemons.set(child.pid, child);
365
+ child.once('exit', () => inTreeDaemons.delete(child.pid));
366
+ }
356
367
  });
357
368
  },
358
369
  onReady: () => log(`daemon ready at=${at()}ms`),
@@ -634,6 +645,37 @@ export async function shutdownDaemon(
634
645
  return true;
635
646
  }
636
647
 
648
+ /** Launcher quit: a daemon this process forked into its own tree would die
649
+ * with it, so ask the serving one to stop (forced — its work cannot outlive
650
+ * this tree anyway) and wait, bounded, for every such child's graceful exit.
651
+ * One that already unpublished its endpoint is mid-teardown: only waited on.
652
+ * False when no such child is alive (detached, or another launcher's). */
653
+ export async function stopInTreeDaemon({
654
+ timeoutMs = IN_TREE_DAEMON_STOP_GRACE_MS,
655
+ discovery = readSessionDiscovery(),
656
+ } = {}) {
657
+ const pids = [...inTreeDaemons.keys()].filter((pid) => isPidAlive(pid));
658
+ if (!pids.length) return false;
659
+ if (discovery?.port && pids.includes(Number(discovery.pid))) {
660
+ try {
661
+ await request({
662
+ port: discovery.port,
663
+ token: discovery.token,
664
+ method: 'POST',
665
+ path: '/stop',
666
+ body: { force: true },
667
+ timeoutMs: 3000,
668
+ control: true,
669
+ });
670
+ } catch {
671
+ // Past its front door already: only the wait remains.
672
+ }
673
+ }
674
+ const deadline = Date.now() + Math.max(1, Number(timeoutMs) || IN_TREE_DAEMON_STOP_GRACE_MS);
675
+ while (pids.some((pid) => isPidAlive(pid)) && Date.now() < deadline) await delay(50);
676
+ return !pids.some((pid) => isPidAlive(pid));
677
+ }
678
+
637
679
  export async function shutdownDaemonForRuntimeRoot(root, options = {}) {
638
680
  const runtimeRoot = String(root || '').trim();
639
681
  if (!runtimeRoot) return false;
@@ -6,6 +6,8 @@
6
6
  */
7
7
 
8
8
  export const SESSION_READ_ACTIONS = Object.freeze([
9
+ 'inspectProjectBranch',
10
+ 'isSessionTerminal',
9
11
  'contextStatus',
10
12
  'getAgentDefinition',
11
13
  'getAutoClear',
@@ -18,6 +20,7 @@ export const SESSION_READ_ACTIONS = Object.freeze([
18
20
  'getDisabledSkills',
19
21
  'getMediaDefault',
20
22
  'getMediaJob',
23
+ 'getMediaPins',
21
24
  'getMcpServerConfig',
22
25
  'getMcpOAuthLoginStatus',
23
26
  'getOnboardingStatus',
@@ -30,6 +33,7 @@ export const SESSION_READ_ACTIONS = Object.freeze([
30
33
  'getQuotaAutoResume',
31
34
  'getQuotaHistory',
32
35
  'getRecapSettings',
36
+ 'getSessionTitleSettings',
33
37
  'getWebSearchRoute',
34
38
  'getSettingsSnapshot',
35
39
  'getSystemShell',
@@ -41,9 +45,11 @@ export const SESSION_READ_ACTIONS = Object.freeze([
41
45
  'inspectHuggingFaceModel',
42
46
  'getLocalProviderModelDetails',
43
47
  'getSessionReviewDiff',
48
+ 'getSessionReviewFilePatch',
44
49
  'getSessionUsage',
45
50
  'getTurnChanges',
46
51
  'getTurnReviewDiff',
52
+ 'getTurnReviewFilePatch',
47
53
  'getTurnLiveness',
48
54
  'getUpdateSettings',
49
55
  'getUpdateStatus',
@@ -68,6 +74,7 @@ export const SESSION_READ_ACTIONS = Object.freeze([
68
74
  'listProviders',
69
75
  'listWebSearchModels',
70
76
  'listThemes',
77
+ 'listShellJobs',
71
78
  'listWorkflows',
72
79
  'mcpStatus',
73
80
  'pluginsStatus',
@@ -84,6 +91,7 @@ export const SESSION_CONFIGURE_ACTIONS = Object.freeze([
84
91
  'addPlugin',
85
92
  'addSkill',
86
93
  'agentControl',
94
+ 'askSide',
87
95
  'authenticateProvider',
88
96
  'beginOAuthProviderLogin',
89
97
  'beginMcpOAuthLogin',
@@ -93,6 +101,7 @@ export const SESSION_CONFIGURE_ACTIONS = Object.freeze([
93
101
  'cancelOAuthProviderLogin',
94
102
  'cancelMcpOAuthLogin',
95
103
  'cancelConversationImport',
104
+ 'cancelSide',
96
105
  'checkForUpdate',
97
106
  'clear',
98
107
  'compact',
@@ -110,6 +119,7 @@ export const SESSION_CONFIGURE_ACTIONS = Object.freeze([
110
119
  'removeCustomProvider',
111
120
  'updateCustomProviderModel',
112
121
  'testCustomProvider',
122
+ 'checkCustomProviderKeyEnv',
113
123
  'discoverCustomProviderModels',
114
124
  'deleteSession',
115
125
  'deleteWebhook',
@@ -188,12 +198,14 @@ export const SESSION_CONFIGURE_ACTIONS = Object.freeze([
188
198
  'startLocalProviderModelMaintenance',
189
199
  'deleteLocalProviderModel',
190
200
  'setMediaDefault',
201
+ 'setMediaPin',
191
202
  'setModel',
192
203
  'setOutputStyle',
193
204
  'setPluginEnabled',
194
205
  'setProfile',
195
206
  'setProgressHint',
196
207
  'setRecapEnabled',
208
+ 'setAiSessionTitles',
197
209
  'setRoute',
198
210
  'setScheduleEnabled',
199
211
  'setWebSearchRoute',
@@ -212,6 +224,7 @@ export const SESSION_CONFIGURE_ACTIONS = Object.freeze([
212
224
  'startConversationImport',
213
225
  'startMediaJob',
214
226
  'stopShellJob',
227
+ 'releaseShellJob',
215
228
  'switchContext',
216
229
  'taskControl',
217
230
  'testWebhook',
@@ -226,6 +239,7 @@ export const SESSION_CONFIGURE_ACTIONS = Object.freeze([
226
239
  'selectBranch',
227
240
  'selectProjectBranch',
228
241
  'mergeProjectBranch',
242
+ 'manageProjectBranch',
229
243
  'requestWorktree',
230
244
  'mergeWorkspace',
231
245
  'removeWorktree',
@@ -8,6 +8,35 @@
8
8
  */
9
9
  import { applySessionStatePatch } from '../session-state-patch.mjs';
10
10
 
11
+ // Desktop-only live fields: `streamingPartial` is the unfinished streamed
12
+ // line the desktop paints ahead of the line-gated tail. This terminal view
13
+ // keeps the line-gated text, so it never holds the field nor re-renders for it.
14
+ const DESKTOP_ONLY_FIELDS = ['streamingPartial'];
15
+
16
+ function terminalState(full) {
17
+ if (!full || typeof full !== 'object' || !DESKTOP_ONLY_FIELDS.some((key) => Object.hasOwn(full, key))) return full;
18
+ const next = { ...full };
19
+ for (const key of DESKTOP_ONLY_FIELDS) delete next[key];
20
+ return next;
21
+ }
22
+
23
+ /** The patch without desktop-only fields, or null when nothing else moved. */
24
+ function terminalPatch(patch) {
25
+ const set = patch.set && typeof patch.set === 'object' ? patch.set : {};
26
+ const remove = Array.isArray(patch.remove) ? patch.remove : [];
27
+ if (!patch.partialAppend && !DESKTOP_ONLY_FIELDS.some((key) => Object.hasOwn(set, key) || remove.includes(key))) {
28
+ return patch;
29
+ }
30
+ const nextSet = { ...set };
31
+ for (const key of DESKTOP_ONLY_FIELDS) delete nextSet[key];
32
+ const nextRemove = remove.filter((key) => !DESKTOP_ONLY_FIELDS.includes(key));
33
+ if (Object.keys(nextSet).length === 0 && nextRemove.length === 0 && !patch.itemsAppend && !patch.itemsPrepend) {
34
+ return null;
35
+ }
36
+ const { partialAppend: _desktopOnly, ...rest } = patch;
37
+ return { ...rest, set: nextSet, remove: nextRemove };
38
+ }
39
+
11
40
  export function createProjection({ binding, log }) {
12
41
  let state = {};
13
42
  let revision = 0;
@@ -40,7 +69,7 @@ export function createProjection({ binding, log }) {
40
69
  const incomingRevision = Number(body.revision);
41
70
  if (revisionAttachment !== sourceAttachment || revisionSessionId !== binding.sessionId) {
42
71
  if (body.full === undefined || body.full === null) return false;
43
- state = body.full;
72
+ state = terminalState(body.full);
44
73
  revision = Number.isFinite(incomingRevision) ? incomingRevision : 0;
45
74
  revisionAttachment = sourceAttachment;
46
75
  revisionSessionId = binding.sessionId;
@@ -49,7 +78,7 @@ export function createProjection({ binding, log }) {
49
78
  }
50
79
  if (Number.isFinite(incomingRevision) && incomingRevision < revision) return true;
51
80
  if (body.full !== undefined && body.full !== null) {
52
- state = body.full;
81
+ state = terminalState(body.full);
53
82
  revision = Number.isFinite(incomingRevision) ? incomingRevision : revision;
54
83
  emit();
55
84
  return true;
@@ -57,8 +86,16 @@ export function createProjection({ binding, log }) {
57
86
  if (body.patch) {
58
87
  if (Number(body.revision) === revision && Number(body.baseRevision) === revision - 1) return true;
59
88
  if (Number(body.baseRevision) !== revision) return false;
60
- state = applySessionStatePatch(state, body.patch);
89
+ const patch = terminalPatch(body.patch);
90
+ // Only a desktop-only field moved: the terminal view advances silently.
91
+ if (!patch) {
92
+ revision = Number(body.revision) || revision;
93
+ return true;
94
+ }
95
+ const patched = applySessionStatePatch(state, patch);
96
+ if (!patched) return false;
61
97
  revision = Number(body.revision) || revision;
98
+ state = patched;
62
99
  emit();
63
100
  return true;
64
101
  }
@@ -76,7 +113,7 @@ export function createProjection({ binding, log }) {
76
113
  return {
77
114
  // The create result seeds the projection for the current binding.
78
115
  seed(created) {
79
- state = created?.full ?? {};
116
+ state = terminalState(created?.full ?? {});
80
117
  revision = Number(created?.revision) || 0;
81
118
  revisionAttachment = binding.attachment;
82
119
  revisionSessionId = binding.sessionId;
@@ -50,6 +50,20 @@ export function createInlineBootLoaders({
50
50
  return localModulePromise;
51
51
  }
52
52
 
53
+ // Background warm-up of the session-local module graph. Independent of the
54
+ // keychain gate (the ESM cache makes the later localModule() import free);
55
+ // never throws — a failed warm-up leaves create on its lazy path.
56
+ async function warmLocalRuntime() {
57
+ if (isClosed()) return false;
58
+ try {
59
+ const module = await loadLocalModule();
60
+ if (isClosed()) return false;
61
+ return (await module.warmLocalSessionRuntime?.()) !== false;
62
+ } catch {
63
+ return false;
64
+ }
65
+ }
66
+
53
67
  function agentGraph() {
54
68
  agentGraphPromise ??= measured('agent-dispatch-graph-import', () => {
55
69
  assertOpen();
@@ -92,5 +106,5 @@ export function createInlineBootLoaders({
92
106
  await tracked;
93
107
  }
94
108
 
95
- return { prewarmKeychain, localModule, agentGraph, prepareAgentProviders };
109
+ return { prewarmKeychain, warmLocalRuntime, localModule, agentGraph, prepareAgentProviders };
96
110
  }
@@ -27,6 +27,7 @@ export function createInlineSessionRuntimeHost({
27
27
  await keychain.prewarmSecrets();
28
28
  },
29
29
  executeAgentControl = null,
30
+ executeSessionControl = null,
30
31
  } = {}) {
31
32
  let closed = false;
32
33
  let closePromise = null;
@@ -59,6 +60,7 @@ export function createInlineSessionRuntimeHost({
59
60
  ...options,
60
61
  ...(options.cwd ? {} : { cwd }),
61
62
  ...(typeof executeAgentControl === 'function' ? { executeAgentControl } : {}),
63
+ ...(typeof executeSessionControl === 'function' ? { executeSessionControl } : {}),
62
64
  });
63
65
  if (closed) {
64
66
  try {
@@ -74,6 +76,7 @@ export function createInlineSessionRuntimeHost({
74
76
  return {
75
77
  create,
76
78
  prewarmKeychain: loaders.prewarmKeychain,
79
+ warmLocalRuntime: loaders.warmLocalRuntime,
77
80
  agentDispatch: dispatch.agentDispatch,
78
81
  async agentControl(args = {}, context = {}) {
79
82
  if (closed) throw new Error('session runtime host is closed');
@@ -24,7 +24,7 @@ export function createAgentCancellation({
24
24
  log,
25
25
  rememberCancelTranscript,
26
26
  }) {
27
- const agentCancelRuns = new Map();
27
+ const agentCloseRuns = new Map();
28
28
 
29
29
  /** The runtime entry that can close this descriptor: the live owner, else a
30
30
  * freshly loaded one (null when loading fails, which is logged). */
@@ -44,66 +44,108 @@ export function createAgentCancellation({
44
44
  }
45
45
  };
46
46
 
47
- function cancelAgentTree(sessionId, reason = 'agent session cancelled') {
48
- const id = String(sessionId || '').trim();
49
- if (!id) return Promise.resolve(false);
50
- const active = agentCancelRuns.get(id);
47
+ function closeOne(id, reason, options) {
48
+ const active = agentCloseRuns.get(id);
51
49
  if (active) return active;
52
50
  let run;
53
- run = (async () => {
54
- await rehydrateAgentSessions();
55
- cancelBackgroundTasks({
56
- surface: 'agent',
57
- callerSessionId: id,
58
- reason,
51
+ run = Promise.resolve()
52
+ .then(async () => {
53
+ cancelBackgroundTasks({
54
+ surface: 'agent',
55
+ callerSessionId: id,
56
+ reason,
57
+ });
58
+ cancelOwnAgentTasks(id, reason);
59
+ const descriptor = registry.get(id);
60
+ if (!descriptor) return false;
61
+ if ((await sessionOwner(id)?.runtime?.isSessionTerminal?.()) === true) return true;
62
+ const entry = await closableEntry(id, descriptor);
63
+ const closeCanonical = entry?.runtime?.closeCanonicalSession;
64
+ if (typeof closeCanonical !== 'function') {
65
+ throw new TypeError('session runtime must implement closeCanonicalSession');
66
+ }
67
+ // The close clears the transcript: capture a running turn's transcript
68
+ // first so the cancelled turn still hands off its partial output.
69
+ if (descriptor.status === 'running') {
70
+ try {
71
+ const { messages } = await entry.runtime.readModelMessages(0);
72
+ rememberCancelTranscript(id, messages);
73
+ } catch (error) {
74
+ log(`agent cancel transcript read failed session=${id}: ${error?.message || error}`);
75
+ }
76
+ }
77
+ const closed = await closeCanonical.call(entry.runtime, reason, { tombstone: options.tombstone === true });
78
+ if (closed !== true) throw new Error(`agent session ${id} could not be durably closed`);
79
+ descriptor.closed = options.tombstone === true;
80
+ descriptor.status = descriptor.closed ? 'closed' : 'cancelled';
81
+ descriptor.stage = descriptor.status;
82
+ descriptor.updatedAt = Date.now();
83
+ return true;
84
+ })
85
+ .finally(() => {
86
+ if (agentCloseRuns.get(id) === run) agentCloseRuns.delete(id);
59
87
  });
60
- const children = registry.childrenOf(id);
61
- await Promise.all(children.map((childId) => cancelAgentTree(childId, reason)));
62
- cancelOwnAgentTasks(id, reason);
63
- const descriptor = registry.get(id);
64
- if (!descriptor) return children.length > 0;
65
- if (descriptor.closed) return true;
66
- const entry = await closableEntry(id, descriptor);
67
- const closeCanonical = entry?.runtime?.closeCanonicalSession;
68
- if (typeof closeCanonical !== 'function') {
69
- throw new TypeError('session runtime must implement closeCanonicalSession');
70
- }
71
- // The close clears the transcript: capture a running turn's transcript
72
- // first so the cancelled turn still hands off its partial output.
73
- if (descriptor.status === 'running') {
88
+ agentCloseRuns.set(id, run);
89
+ return run;
90
+ }
91
+
92
+ async function cancelAgentTree(sessionId, reason = 'agent session cancelled', options = {}) {
93
+ const id = String(sessionId || '').trim();
94
+ if (!id) return false;
95
+ await rehydrateAgentSessions();
96
+ const seen = new Set();
97
+ const ordered = [];
98
+ const visit = (current) => {
99
+ if (seen.has(current)) return;
100
+ seen.add(current);
101
+ for (const child of registry.childrenOf(current)) visit(child);
102
+ ordered.push(current);
103
+ };
104
+ visit(id);
105
+ const release = registry.beginCancellation(ordered);
106
+ try {
107
+ let closed = false;
108
+ const failures = [];
109
+ // Descendant-first, one at a time; a failed member never skips the rest.
110
+ for (const current of ordered) {
74
111
  try {
75
- const { messages } = await entry.runtime.readModelMessages(0);
76
- rememberCancelTranscript(id, messages);
112
+ closed = (await closeOne(current, reason, options)) || closed;
77
113
  } catch (error) {
78
- log(`agent cancel transcript read failed session=${id}: ${error?.message || error}`);
114
+ log(`agent cancel failed session=${current}: ${error?.message || error}`);
115
+ failures.push(error);
79
116
  }
80
117
  }
81
- const closed = await closeCanonical.call(entry.runtime, reason);
82
- if (closed !== true) throw new Error(`agent session ${id} could not be durably closed`);
83
- descriptor.closed = true;
84
- descriptor.status = 'closed';
85
- descriptor.stage = 'closed';
86
- descriptor.updatedAt = Date.now();
87
- return true;
88
- })().finally(() => {
89
- if (agentCancelRuns.get(id) === run) agentCancelRuns.delete(id);
90
- });
91
- agentCancelRuns.set(id, run);
92
- return run;
118
+ if (failures.length === 1) throw failures[0];
119
+ if (failures.length) {
120
+ const details = failures.map((error) => error?.message || String(error)).join('; ');
121
+ throw new AggregateError(
122
+ failures,
123
+ `agent tree cancel failed for ${failures.length} of ${ordered.length} sessions: ${details}`
124
+ );
125
+ }
126
+ return closed;
127
+ } finally {
128
+ release();
129
+ }
93
130
  }
94
131
 
95
132
  async function cancelAgentDescendants(parentSessionId, reason = 'parent session cancelled') {
96
133
  await rehydrateAgentSessions();
97
134
  const parentId = String(parentSessionId || '');
98
- cancelBackgroundTasks({
99
- surface: 'agent',
100
- callerSessionId: parentId,
101
- reason,
102
- });
103
- const children = registry.childrenOf(parentId);
104
- if (!children.length) return false;
105
- await Promise.all(children.map((childId) => cancelAgentTree(childId, reason)));
106
- return true;
135
+ const release = registry.beginCancellation([parentId]);
136
+ try {
137
+ cancelBackgroundTasks({
138
+ surface: 'agent',
139
+ callerSessionId: parentId,
140
+ reason,
141
+ });
142
+ const children = registry.childrenOf(parentId);
143
+ if (!children.length) return false;
144
+ await Promise.all(children.map((childId) => cancelAgentTree(childId, reason)));
145
+ return true;
146
+ } finally {
147
+ release();
148
+ }
107
149
  }
108
150
 
109
151
  return { cancelAgentTree, cancelAgentDescendants };