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,9 @@
2
2
  // atomicWrite, and each written path runs the same post-write invalidation trio
3
3
  // the builtin edit adapters run (external-tool-adapters.mjs:16-26) — result
4
4
  // cache, code-graph dirty paths, read snapshot — so a formatted file is not
5
- // served from a stale cache or hidden behind "[file unchanged]".
5
+ // served from a stale cache or hidden behind "[file unchanged]". Every write
6
+ // also reaches the session's turn review as its own file change (counted and
7
+ // undoable like an edit-tool write).
6
8
  import { readFileSync, statSync } from 'node:fs';
7
9
  import { isAbsolute, resolve } from 'node:path';
8
10
  import { atomicWrite } from '../agent/orchestrator/tools/builtin/atomic-write.mjs';
@@ -15,6 +17,7 @@ import {
15
17
  isWindowsDevicePath,
16
18
  } from '../shared/device-paths.mjs';
17
19
  import { markCodeGraphDirtyPaths } from '../shared/code-graph-state.mjs';
20
+ import { reviewFileContent } from '../shared/bounded-file-read.mjs';
18
21
 
19
22
  /** Same write-target guards the builtin edit surfaces enforce. */
20
23
  export function guardTidyWritePath(fullPath) {
@@ -130,6 +133,8 @@ async function writeThroughPipeline(fullPath, content, { sessionId = null, signa
130
133
  export async function applyStructuralFixes({ cwd, matchesByFile, sessionId = null, signal = null } = {}) {
131
134
  const applied = [];
132
135
  const rejected = [];
136
+ // Every file written, with its exact before/after bytes, for the turn review.
137
+ const written = [];
133
138
  for (const [file, matches] of Object.entries(matchesByFile || {})) {
134
139
  const fixes = matches.filter((match) => match?.fix).map((match) => ({ ...match.fix, ruleId: match.ruleId }));
135
140
  if (fixes.length === 0) continue;
@@ -153,12 +158,52 @@ export async function applyStructuralFixes({ cwd, matchesByFile, sessionId = nul
153
158
  continue;
154
159
  }
155
160
  try {
156
- const next = applyReplacements(readFileSync(fullPath), plan.replacements);
161
+ const current = readFileSync(fullPath);
162
+ const next = applyReplacements(current, plan.replacements);
157
163
  await writeThroughPipeline(fullPath, next, { sessionId, signal });
164
+ written.push({ fullPath, before: current, after: next });
158
165
  applied.push({ file, fixes: plan.replacements.length });
159
166
  } catch (error) {
160
167
  rejected.push({ file, reason: error?.message || String(error) });
161
168
  }
162
169
  }
170
+ await recordTidyWrites(cwd, sessionId, written);
163
171
  return { applied, rejected };
164
172
  }
173
+
174
+ // The turn-review recorder is loaded on first use: it pulls in the edit-tool
175
+ // stack, which a tidy check never needs.
176
+ async function recordTidyWrites(cwd, sessionId, changes) {
177
+ if (!sessionId || changes.length === 0) return;
178
+ const { recordToolFileChanges } = await import('../agent/orchestrator/tools/patch/ui-diff.mjs');
179
+ recordToolFileChanges({ sessionId, basePath: cwd, changes });
180
+ }
181
+
182
+ /** Each file's state before an engine rewrites it in place, for the turn
183
+ * review (see reviewFileContent); a path that cannot be read is left out. */
184
+ export function captureWriteBaselines(fullPaths) {
185
+ const baselines = new Map();
186
+ for (const fullPath of fullPaths) {
187
+ try {
188
+ baselines.set(fullPath, reviewFileContent(fullPath));
189
+ } catch {
190
+ /* not a readable regular file: never recorded */
191
+ }
192
+ }
193
+ return baselines;
194
+ }
195
+
196
+ /** Record in-place engine rewrites of `fullPaths` as this session's own file
197
+ * changes: their captured before-states against the disk now. */
198
+ export async function recordEngineWrites({ cwd, sessionId, baselines, fullPaths }) {
199
+ const changes = [];
200
+ for (const fullPath of fullPaths) {
201
+ if (!baselines.has(fullPath)) continue;
202
+ try {
203
+ changes.push({ fullPath, before: baselines.get(fullPath), after: reviewFileContent(fullPath) });
204
+ } catch {
205
+ /* no longer a readable regular file: never recorded */
206
+ }
207
+ }
208
+ await recordTidyWrites(cwd, sessionId, changes);
209
+ }
@@ -8,7 +8,13 @@ import { filesForLanguages } from './languages.mjs';
8
8
  import { mapLimit } from './process.mjs';
9
9
  import { runnerFor } from './runners/index.mjs';
10
10
  import { DEFAULT_ENGINE_TIMEOUT_MS } from './runners/shared.mjs';
11
- import { fullPathFor, guardTidyWritePath, noteWrittenFiles } from './apply.mjs';
11
+ import {
12
+ captureWriteBaselines,
13
+ fullPathFor,
14
+ guardTidyWritePath,
15
+ noteWrittenFiles,
16
+ recordEngineWrites,
17
+ } from './apply.mjs';
12
18
 
13
19
  const CHECK_CONCURRENCY = 3;
14
20
 
@@ -75,6 +81,7 @@ async function runOne({ engine, files, cwd, mode, apply, timeoutMs, signal, sess
75
81
  return result;
76
82
  }
77
83
  const before = new Map(candidates.map((file) => [file, fileDigest(fullPathFor(cwd, file))]));
84
+ const baselines = sessionId ? captureWriteBaselines(candidates.map((file) => fullPathFor(cwd, file))) : null;
78
85
  let fixResult;
79
86
  try {
80
87
  fixResult = await runner.fix({
@@ -92,10 +99,9 @@ async function runOne({ engine, files, cwd, mode, apply, timeoutMs, signal, sess
92
99
  const changed = candidates.filter((file) => fileDigest(fullPathFor(cwd, file)) !== before.get(file));
93
100
  // The engine wrote in place; run the same invalidation trio a pipeline write
94
101
  // would have run for each file it touched.
95
- noteWrittenFiles(
96
- changed.map((file) => fullPathFor(cwd, file)),
97
- { sessionId }
98
- );
102
+ const changedPaths = changed.map((file) => fullPathFor(cwd, file));
103
+ noteWrittenFiles(changedPaths, { sessionId });
104
+ if (baselines) await recordEngineWrites({ cwd, sessionId, baselines, fullPaths: changedPaths });
99
105
  result.filesChanged = changed;
100
106
  if (fixResult?.error) result.error = fixResult.error;
101
107
  if (fixResult?.truncated) result.truncated = true;
@@ -15,19 +15,25 @@ export function createRoutedAgentTool({ rt, agentTool, executeAgentControl = nul
15
15
  if (typeof executeAgentControl !== 'function') {
16
16
  return agentTool.closeAll(reason, scope);
17
17
  }
18
- void executeAgentControl(
19
- {
20
- type: '__close_all',
21
- reason: String(reason || 'agent owner closed'),
22
- },
23
- {
24
- callerCwd: rt.currentCwd,
25
- invocationSource: 'runtime-lifecycle',
26
- callerSessionId: scope?.callerSessionId || rt.session?.id || null,
27
- clientHostPid: rt.session?.clientHostPid || process.pid,
28
- }
29
- ).catch(() => {});
30
- return undefined;
18
+ // The promise is returned so teardown can wait for closing to finish
19
+ // producing its final index writes before it drains them.
20
+ return Promise.resolve(
21
+ executeAgentControl(
22
+ {
23
+ type: '__close_all',
24
+ reason: String(reason || 'agent owner closed'),
25
+ },
26
+ {
27
+ callerCwd: rt.currentCwd,
28
+ invocationSource: 'runtime-lifecycle',
29
+ callerSessionId: scope?.callerSessionId || rt.session?.id || null,
30
+ clientHostPid: rt.session?.clientHostPid || process.pid,
31
+ }
32
+ )
33
+ ).then(
34
+ () => undefined,
35
+ () => undefined
36
+ );
31
37
  },
32
38
  };
33
39
  const agentStatusState = () => {
@@ -138,6 +138,7 @@ function wireToolPolicyRefresh(boot) {
138
138
  getMode: () => rt.mode,
139
139
  getConfig: () => rt.config,
140
140
  getDataDir: () => dataDirOf(cfgMod),
141
+ getActiveTurnCount: () => rt.activeTurnCount || 0,
141
142
  modelStandaloneTools: boot.modelStandaloneTools,
142
143
  featureDisallowedTools: boot.featureDisallowedTools,
143
144
  loadCoreMemoryContext: boot.loadCoreMemoryContext,
@@ -231,7 +232,11 @@ function developerAdapters(boot) {
231
232
  reg.disableProvider?.(provider);
232
233
  return;
233
234
  }
234
- await ensureProvidersReady(config?.providers || {});
235
+ // Provider init can take long (OAuth/network); the option is already saved
236
+ // and adopted, so the toggle must not wait on it.
237
+ void ensureProvidersReady(config?.providers || {}).catch((error) => {
238
+ console.warn(`[providers] ${provider} init after enabling failed: ${error?.message || error}`);
239
+ });
235
240
  },
236
241
  };
237
242
  }
@@ -488,6 +493,7 @@ function modelRouteApiFor(boot) {
488
493
  rt.route = v;
489
494
  },
490
495
  getSession: () => rt.session,
496
+ getSessionGeneration: () => rt.sessionGeneration,
491
497
  setSession: boot.adoptSession,
492
498
  getAddressedSessionId: () => rt.addressedSessionId,
493
499
  getConfigHasSecrets: () => rt.configHasSecrets,
@@ -562,12 +568,18 @@ function workspaceApiFor(boot) {
562
568
  getReservedSessionId: () => rt.reservedSessionId,
563
569
  getCurrentCwd: () => rt.currentCwd,
564
570
  getDesktopSession: () => rt.desktopSession,
571
+ setDesktopSession: (next) => {
572
+ rt.desktopSession = next;
573
+ },
565
574
  getConfig: () => rt.config,
566
575
  createCurrentSession: (reason) => boot.createCurrentSession(reason),
567
- applyResolvedCwd: (cwd) => boot.applyResolvedCwd(cwd),
568
- persistSession: (session) => saveSession(session, { immediate: true }),
569
- refreshWorkspaceContext: (session, cwd) =>
570
- refreshWorkspacePrompt(session, cwd, { loadCoreMemoryContext: boot.loadCoreMemoryContext }),
576
+ applyResolvedCwd: (cwd, options) => boot.applyResolvedCwd(cwd, options),
577
+ // Durable save: on disk when it returns, throws when the write fails
578
+ // (immediate mode only queues it). Synchronous, so a transition never
579
+ // waits on the save worker, which may never come up.
580
+ persistSession: (session) => saveSession(session, { sync: true }),
581
+ refreshWorkspaceContext: (session, cwd, move) =>
582
+ refreshWorkspacePrompt(session, cwd, { loadCoreMemoryContext: boot.loadCoreMemoryContext, move }),
571
583
  invalidateCaches: () => {
572
584
  boot.invalidateContextStatusCache();
573
585
  boot.invalidatePreSessionToolSurface();
@@ -583,6 +595,7 @@ function workspaceApiFor(boot) {
583
595
  function sessionTurnApiFor(boot) {
584
596
  const { rt, tunables, remoteTranscript, routePreparation } = boot;
585
597
  return createSessionTurnApi({
598
+ applyPendingRoute: () => boot.modelRouteApi.applyPendingRoute(),
586
599
  prepareTurnWorkspace: boot.workspaceApi.prepareTurnWorkspace,
587
600
  admitTurnWorkspace: boot.workspaceApi.admitTurnWorkspace,
588
601
  getSession: () => rt.session,
@@ -594,6 +607,7 @@ function sessionTurnApiFor(boot) {
594
607
  rt.mode = v;
595
608
  },
596
609
  getActiveTurnCount: () => rt.activeTurnCount,
610
+ takePendingCompact: (sessionId) => rt.pendingCompactSessionIds?.delete(sessionId) === true,
597
611
  setActiveTurnCount: (v) => {
598
612
  rt.activeTurnCount = v;
599
613
  },
@@ -631,7 +645,7 @@ function sessionTurnApiFor(boot) {
631
645
  invalidatePreSessionToolSurface: boot.invalidatePreSessionToolSurface,
632
646
  refreshEmptySessionToolPolicy: boot.refreshEmptySessionToolPolicy,
633
647
  activeToolSurface: boot.activeToolSurface,
634
- applyResolvedCwd: boot.applyResolvedCwd,
648
+ switchProject: boot.workspaceApi.switchProject,
635
649
  resolveCwdPath: boot.resolveCwdPath,
636
650
  agentStatusState: boot.agentStatusState,
637
651
  notificationListeners: boot.notificationListeners,
@@ -10,6 +10,7 @@ import { bootProfile } from '../boot-profile.mjs';
10
10
  import { createHookPayload } from '../hook-payload.mjs';
11
11
  import { readRuntimeTunables } from '../runtime-tunables.mjs';
12
12
  import { initSessionAddress } from '../session-address.mjs';
13
+ import { trackSessionGeneration } from '../model-route/route-ownership.mjs';
13
14
  import { resolveRoute } from './shared.mjs';
14
15
 
15
16
  export async function resolveConfig(boot) {
@@ -74,6 +75,7 @@ export async function resolveConfig(boot) {
74
75
 
75
76
  function initRuntimeState(rt, params) {
76
77
  rt.mode = normalizeToolMode(params.toolMode);
78
+ trackSessionGeneration(rt);
77
79
  rt.session = null;
78
80
  // A daemon-issued address may exist before provider setup. It is consumed by
79
81
  // createCurrentSession on the first actual turn, avoiding eager auth/model
@@ -38,16 +38,20 @@ export function buildFacade(boot) {
38
38
  },
39
39
  applyWorkspaceTransition: boot.workspaceApi.applyWorkspaceTransition,
40
40
  getWorkspace: boot.workspaceApi.getWorkspace,
41
+ getLiveWorkspace: boot.workspaceApi.getLiveWorkspace,
41
42
  getBranchMenu: boot.workspaceApi.getBranchMenu,
42
43
  getProjectBranchMenu: boot.workspaceApi.getProjectBranchMenu,
43
44
  selectBranch: boot.workspaceApi.selectBranch,
44
45
  selectProjectBranch: boot.workspaceApi.selectProjectBranch,
45
46
  mergeProjectBranch: boot.workspaceApi.mergeProjectBranch,
47
+ inspectProjectBranch: boot.workspaceApi.inspectProjectBranch,
48
+ manageProjectBranch: boot.workspaceApi.manageProjectBranch,
46
49
  requestWorktree: boot.workspaceApi.requestWorktree,
47
50
  mergeWorkspace: boot.workspaceApi.mergeWorkspace,
48
51
  removeWorktree: boot.workspaceApi.removeWorktree,
49
52
  listWorktrees: boot.workspaceApi.listWorktrees,
50
53
  pruneWorktrees: boot.workspaceApi.pruneWorktrees,
54
+ onWorktreeSetup: boot.workspaceApi.onWorktreeSetup,
51
55
  claimSetupRequest: setupTool.claimSetupRequest,
52
56
  isSetupRequestActive: setupTool.isSetupRequestActive,
53
57
  completeSetupRequest: setupTool.completeSetupRequest,
@@ -14,6 +14,8 @@ import { createSelfUpdateController } from '../self-update.mjs';
14
14
  import { createCompletionWakeScheduler, createNotificationBus } from '../notification-bus.mjs';
15
15
  import { createSkillsApi } from '../skills-api.mjs';
16
16
  import { createCwdPlugins } from '../cwd-plugins.mjs';
17
+ import { listProjectsStrict } from '../../runtime/shared/projects.mjs';
18
+ import { isWithin } from '../../runtime/shared/worktrees/paths.mjs';
17
19
  import { STANDALONE_DATA_DIR } from '../runtime-paths.mjs';
18
20
  import { SessionAddressError, isAdmissionOpen, ownerLifecycle } from '../session-address.mjs';
19
21
  import { dataDirOf } from './shared.mjs';
@@ -188,10 +190,12 @@ export function sessionAdopter(boot) {
188
190
  // Bind every adopted session, including a cold resume and a session
189
191
  // materialized before ask(). The shared tool executor must never fall
190
192
  // back to changing only a detached session object's cwd.
193
+ // The Lead's own `session set-project` call: the Project switch
194
+ // authority, tolerating the calling turn.
191
195
  Object.defineProperty(v, '_applyResolvedCwdForCaller', {
192
196
  value: (nextCwd) => {
193
197
  if (rt.session?.id !== v.id) throw new Error('cwd: the calling session is no longer active');
194
- return boot.applyResolvedCwd(nextCwd, { persistProjectSelection: true });
198
+ return boot.workspaceApi.switchProject(nextCwd, { ownTurn: true });
195
199
  },
196
200
  enumerable: false,
197
201
  configurable: true,
@@ -268,6 +272,7 @@ function wireCwdPlugins(boot) {
268
272
  onCwdChanged: () => {
269
273
  void boot.connectConfiguredMcp({ reconcile: true }).catch(() => {});
270
274
  },
275
+ isProjectFolder: (cwd) => listProjectsStrict().some((project) => isWithin(project.path, cwd)),
271
276
  countSkillFiles,
272
277
  writeLastSessionCwd,
273
278
  updateCurrentCwdOverride,
@@ -24,7 +24,6 @@ export function wireSessionLifecycle(boot) {
24
24
  params.modelParameters !== undefined,
25
25
  invalidatePreSessionToolSurface: boot.invalidatePreSessionToolSurface,
26
26
  invalidateOutputStyleStatusCache: boot.invalidateOutputStyleStatusCache,
27
- invalidateSkills: boot.invalidateSkills,
28
27
  connectConfiguredMcp: boot.connectConfiguredMcp,
29
28
  configureEmbedding,
30
29
  });
@@ -125,6 +124,7 @@ export function wireSessionLifecycle(boot) {
125
124
  scheduleModelCatalogWarmup();
126
125
  scheduleStatuslineUsageWarmup();
127
126
  scheduleAutomationAutostart(tunables.remoteAutoStartDelayMs);
128
- // Auto effort touches neither network nor memory at boot: the first judged
129
- // turn fetches/updates the model and loads the judge (judge-client.mjs).
127
+ // Auto effort touches neither network nor memory at boot: creating or
128
+ // opening a session loads the judge, and the first judged turn
129
+ // fetches/updates the model (judge-client.mjs).
130
130
  }
@@ -21,6 +21,7 @@ import { TOOL_DEFS as OFFICE_TOOL_DEFS } from '../../runtime/office/tool-defs.mj
21
21
  import { TOOL_DEFS as MEDIA_TOOL_DEFS } from '../../runtime/media/tool-defs.mjs';
22
22
  import { TOOL_DEFS as TIDY_TOOL_DEFS } from '../../runtime/tidy/tool-defs.mjs';
23
23
  import { TOOL_DEFS as VISUALIZE_BRIDGE_TOOL_DEFS } from '../../runtime/visualize-bridge/tool-defs.mjs';
24
+ import { ASK_USER_TOOL_DEFS } from '../../runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs';
24
25
  import { SETUP_TOOL_DEFS } from '../setup-tool/tool-defs.mjs';
25
26
  import { createSetupToolExecutor } from '../setup-tool/executor.mjs';
26
27
  import { bootProfile } from '../boot-profile.mjs';
@@ -70,6 +71,8 @@ function wireAgent(boot) {
70
71
  mcpScopeId: rt.mcpScopeId,
71
72
  awaitKeychainPrewarm,
72
73
  isKeychainPrewarmReady: () => rt.keychainPrewarmWaitDone,
74
+ // Lazy: wireProviders runs after wireTools and defines the catalog.
75
+ listProviderModels: (options) => boot.collectProviderModels(options),
73
76
  notifySessionCompletion,
74
77
  // SubagentStart/SubagentStop: bridge internal worker spawn/finish to the
75
78
  // standard hook bus. agent_type is passed top-level via hookCommonPayload.
@@ -159,6 +162,7 @@ function wireToolSurface(boot) {
159
162
  tidyToolDefs: TIDY_TOOL_DEFS,
160
163
  visualizeToolDefs: VISUALIZE_BRIDGE_TOOL_DEFS,
161
164
  setupToolDefs: SETUP_TOOL_DEFS,
165
+ askUserToolDefs: ASK_USER_TOOL_DEFS,
162
166
  goalTools: goalRuntime.tools,
163
167
  agentTools: agentTool.tools,
164
168
  skillToolEnabled: !envFlag('MIXDOG_DISABLE_SKILLS'),
@@ -246,10 +250,12 @@ function wireInternalTools(boot) {
246
250
  runNativeWebSearch: (...a) => boot.runNativeWebSearch(...a),
247
251
  activeToolSurface: boot.activeToolSurface,
248
252
  mcpStatus: boot.mcpStatus,
249
- applyResolvedCwd: boot.applyResolvedCwd,
250
253
  skillToolContent: boot.skillToolContent,
251
254
  // Late-bound: the workspace authority is built with the API slices.
252
255
  getWorkspaceApi: () => boot.workspaceApi || null,
256
+ getSessionManager: () => boot.mgr || null,
257
+ getLifecycleApi: () => boot.lifecycleApi || null,
258
+ executeSessionControl: boot.params.executeSessionControl,
253
259
  }),
254
260
  });
255
261
  Object.assign(boot, { setupTool, disposeInternalTools });
@@ -20,7 +20,7 @@ import {
20
20
  importOriginKey,
21
21
  } from '../../runtime/agent/orchestrator/session/conversation-import/imported-session.mjs';
22
22
  import { IMPORT_WARNING_CWD_MISSING } from '../../runtime/agent/orchestrator/session/conversation-import/turns.mjs';
23
- import { sessionPath } from '../../runtime/agent/orchestrator/session/store/paths-heartbeat.mjs';
23
+ import { sessionPath } from '../../runtime/agent/orchestrator/session/store/session-paths.mjs';
24
24
  import {
25
25
  cachedMeta,
26
26
  convertCandidateFile,
@@ -21,20 +21,21 @@ export function createCwdApply({
21
21
  updateCurrentCwdOverride,
22
22
  persistSession,
23
23
  onCwdChanged,
24
+ isProjectFolder,
24
25
  clean,
25
26
  resolve,
26
27
  statSync,
27
28
  }) {
28
29
  function resolveCwdPath(value) {
29
30
  const raw = clean(value);
30
- if (!raw) throw new Error('cwd: path is required for action=set');
31
+ if (!raw) throw new Error('session: path is required for action=set-project');
31
32
  const next = resolve(getCurrentCwd() || process.cwd(), raw);
32
33
  const stat = statSync(next);
33
34
  if (!stat.isDirectory()) throw new Error(`cwd: not a directory: ${next}`);
34
35
  return next;
35
36
  }
36
37
 
37
- function persistProjectSelection(session, currentCwd) {
38
+ function persistProjectSelection(session, currentCwd, classifyByMembership) {
38
39
  // A Lead in its worktree keeps the registered Project as projectPath; a
39
40
  // switch elsewhere leaves the worktree at a new workspace revision.
40
41
  const { workspace, projectPath } = workspaceForProjectSelection(session, currentCwd);
@@ -44,7 +45,13 @@ export function createCwdApply({
44
45
  }
45
46
  const desktop = getDesktopSession?.() || session?.desktopSession;
46
47
  if (desktop && typeof desktop === 'object') {
47
- const nextDesktop = { classification: 'project', projectPath };
48
+ // A desktop/remote move (classifyByMembership) names a registered
49
+ // Project or the task workspace: outside every registered Project it is
50
+ // a task again. The model's own set-project keeps any folder it picked.
51
+ const nextDesktop =
52
+ classifyByMembership && !isProjectFolder(projectPath)
53
+ ? { classification: 'task', projectPath: null }
54
+ : { classification: 'project', projectPath };
48
55
  setDesktopSession?.(nextDesktop);
49
56
  if (session) session.desktopSession = nextDesktop;
50
57
  }
@@ -59,7 +66,7 @@ export function createCwdApply({
59
66
  // message history. The live execution cwd is retargeted in place; the BP3
60
67
  // session snapshot remains the session-start environment. `onCwdChanged`
61
68
  // lets MCP reconnect only the plugin servers that run in the session cwd.
62
- function applyResolvedCwd(nextCwd, { persistProjectSelection: persist = false } = {}) {
69
+ function applyResolvedCwd(nextCwd, { persistProjectSelection: persist = false, classifyByMembership = false } = {}) {
63
70
  const resolved = resolve(nextCwd);
64
71
  const stat = statSync(resolved);
65
72
  if (!stat.isDirectory()) throw new Error(`cwd: not a directory: ${resolved}`);
@@ -70,7 +77,7 @@ export function createCwdApply({
70
77
  if (session) session.cwd = currentCwd;
71
78
  updateCurrentCwdOverride?.(currentCwd);
72
79
  writeLastSessionCwd(currentCwd, session?.clientHostPid);
73
- if (persist) persistProjectSelection(session, currentCwd);
80
+ if (persist) persistProjectSelection(session, currentCwd, classifyByMembership);
74
81
  // Lazy mode: before the first turn (e.g. the initial project-selection
75
82
  // cwd set), do NOT prewarm — that is exactly the post-first-frame freeze
76
83
  // we are avoiding. Once a turn has run, an in-session cwd switch DOES
@@ -44,9 +44,9 @@ export function createGoalFacadeApi({ agentStatusState, createCurrentSession, ge
44
44
  const sessionId = getSessionId();
45
45
  return sessionId ? goalRuntime.settleTurn(sessionId, detail) : null;
46
46
  },
47
- reactivateUsageLimitedGoal(goalId) {
47
+ reactivateUsageLimitedGoal(goalId, options) {
48
48
  const sessionId = getSessionId();
49
- return sessionId ? goalRuntime.reactivateUsageLimited(sessionId, goalId) : null;
49
+ return sessionId ? goalRuntime.reactivateUsageLimited(sessionId, goalId, options) : null;
50
50
  },
51
51
  archiveCompletedGoalOnUserInput() {
52
52
  const sessionId = getSessionId();
@@ -0,0 +1,91 @@
1
+ // ask_user: put 1-4 multiple-choice questions to the user through the session's
2
+ // tool-approval hook (kind: 'question') and report the answers to the model.
3
+ import {
4
+ validateAskUserQuestions,
5
+ ASK_USER_MAX_TEXT,
6
+ } from '../../runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs';
7
+ import { createCallerContextResolvers } from './caller-context.mjs';
8
+ import { runAbortable } from '../../runtime/shared/abort-race.mjs';
9
+
10
+ const NO_USER =
11
+ 'No user is available to answer in this session. Proceed with your best judgment and state the choices you made.';
12
+ const DISMISSED =
13
+ 'User closed the questions without answering. Proceed with your best judgment; ask again only if something new depends on it.';
14
+
15
+ /** Wire answers -> array aligned with questions; invalid entries become null. */
16
+ export function normalizeAskUserAnswers(answers, questions) {
17
+ const list = Array.isArray(answers) ? answers.slice(0, 4) : [];
18
+ return questions.map((q, i) => {
19
+ const entry = list[i];
20
+ if (!entry || typeof entry !== 'object') return null;
21
+ const labels = new Set(q.options.map((o) => o.label));
22
+ const rawSelected = entry.selected == null ? [] : entry.selected;
23
+ if (!Array.isArray(rawSelected) || !rawSelected.every((l) => typeof l === 'string' && labels.has(l))) return null;
24
+ if (entry.text != null && (typeof entry.text !== 'string' || entry.text.length > ASK_USER_MAX_TEXT)) return null;
25
+ const selected = q.multi_select === true ? [...new Set(rawSelected)] : rawSelected.slice(0, 1);
26
+ const text = typeof entry.text === 'string' ? entry.text.trim() : '';
27
+ if (!selected.length && !text) return null;
28
+ return text ? { selected, text } : { selected };
29
+ });
30
+ }
31
+
32
+ // Strings are JSON-quoted so a quote inside one cannot end it early; typed
33
+ // text stays apart from the picked labels (`"picked" + "typed" (typed)`).
34
+ export function formatAskUserAnswers(questions, answers) {
35
+ const quote = (text) => JSON.stringify(text);
36
+ const parts = questions.map((q, i) => {
37
+ const a = answers[i];
38
+ if (!a) return `${quote(q.question)}=(no answer)`;
39
+ const picked = a.selected.length ? quote(a.selected.join(', ')) : '';
40
+ const typed = a.text ? `${quote(a.text)} (typed)` : '';
41
+ return `${quote(q.question)}=${[picked, typed].filter(Boolean).join(' + ')}`;
42
+ });
43
+ return `User has answered your questions: ${parts.join('; ')}. You can now continue with these answers in mind.`;
44
+ }
45
+
46
+ /** A composer message sent instead of (or with) picking: kept when it is a
47
+ * non-empty string within the typed-answer limit, else dropped. */
48
+ export function normalizeAskUserReply(reply) {
49
+ if (typeof reply !== 'string' || reply.length > ASK_USER_MAX_TEXT) return '';
50
+ return reply.trim();
51
+ }
52
+
53
+ // `User replied in chat: "<reply>". ` leads, then the usual picks sentence
54
+ // when any question was answered, else just the closing sentence.
55
+ export function formatAskUserResult(questions, answers, reply) {
56
+ if (!reply) return formatAskUserAnswers(questions, answers);
57
+ const lead = `User replied in chat: ${JSON.stringify(reply)}. `;
58
+ if (answers.some(Boolean)) return `${lead}${formatAskUserAnswers(questions, answers)}`;
59
+ return `${lead}You can now continue with these answers in mind.`;
60
+ }
61
+
62
+ export function createAskUserToolHandlers({ rt }) {
63
+ const { sessionIdFor, signalFor } = createCallerContextResolvers(rt);
64
+ return {
65
+ ask_user: async (args, { callerCtx }) => {
66
+ const questions = validateAskUserQuestions(args);
67
+ const hook = callerCtx?.toolApprovalHook;
68
+ if (typeof hook !== 'function') return NO_USER;
69
+ // No wait limit (timeoutMs: null): the question settles when the user
70
+ // answers or dismisses it, or the turn is aborted.
71
+ const result = await runAbortable(signalFor(callerCtx), () =>
72
+ hook({
73
+ name: 'ask_user',
74
+ kind: 'question',
75
+ args: { questions },
76
+ reason: '',
77
+ timeoutMs: null,
78
+ sessionId: sessionIdFor(callerCtx),
79
+ toolCallId: callerCtx?.toolCallId || null,
80
+ })
81
+ );
82
+ if (result?.approved === true)
83
+ return formatAskUserResult(
84
+ questions,
85
+ normalizeAskUserAnswers(result.answers, questions),
86
+ normalizeAskUserReply(result.reply)
87
+ );
88
+ return DISMISSED;
89
+ },
90
+ };
91
+ }
@@ -40,13 +40,15 @@ export function createBridgeToolHandlers({ rt }) {
40
40
  });
41
41
  };
42
42
 
43
- // Read-only: no approval hook, no working directory.
43
+ // `run` is gated by the exec policy; the elevation approval comes from the
44
+ // runtime's gate (callerCtx), never from the model's args.
44
45
  const terminal = async (args, { callerCtx }) => {
45
46
  if (environmentDisabled(callerCtx, 'MIXDOG_FEATURE_TERMINAL')) {
46
47
  throw new Error('the terminal tool is disabled in this environment');
47
48
  }
48
49
  return await executeTerminalTool(args, {
49
50
  sessionId: sessionIdFor(callerCtx),
51
+ elevationApproved: callerCtx?.elevationApproved === true,
50
52
  signal: signalFor(callerCtx),
51
53
  });
52
54
  };
@@ -1,6 +1,10 @@
1
1
  // Tools that read rather than act: web search/fetch, memory, the code graph,
2
2
  // the deferred tool catalog, and skill bodies.
3
- import { refreshDeferredMcpToolCatalog, renderToolSearch } from '../../runtime/agent/orchestrator/runtime-core/tool-catalog.mjs';
3
+ import {
4
+ refreshDeferredMcpToolCatalog,
5
+ renderToolSearch,
6
+ } from '../../runtime/agent/orchestrator/runtime-core/tool-catalog.mjs';
7
+ import { resolveDeferredSelectMode } from '../../runtime/agent/orchestrator/session/loop/deferred-call-through.mjs';
4
8
  import { dispatchWebSearchRuntimeTool, memoryToolArgsForCaller } from '../runtime-tool-routing.mjs';
5
9
  import { createCallerContextResolvers } from './caller-context.mjs';
6
10
 
@@ -31,10 +35,16 @@ export function createKnowledgeToolHandlers({
31
35
  return await memoryMod.handleToolCall(name, memoryToolArgsForCaller(args, callerCwd), signalFor(callerCtx));
32
36
  };
33
37
 
34
- const toolSearch = (args) => {
35
- const surface = activeToolSurface();
36
- refreshDeferredMcpToolCatalog(surface, rt.config);
37
- return renderToolSearch(args, surface, rt.mode, { mcpStatus });
38
+ // Catalog tools answer for the calling session's own scope, bridge or
39
+ // native: a worker sees its own catalog (its own allow/deny), never the
40
+ // lead's. Only a call that names no session uses the active surface.
41
+ const scopeSession = (callerCtx) => callerCtx?.callerSession || activeToolSurface();
42
+ const scopeMode = (session) => session?.deferredSurfaceMode || resolveDeferredSelectMode(session) || rt.mode;
43
+
44
+ const toolSearch = (args, { callerCtx } = {}) => {
45
+ const session = scopeSession(callerCtx);
46
+ refreshDeferredMcpToolCatalog(session, rt.config);
47
+ return renderToolSearch(args, session, scopeMode(session), { mcpStatus });
38
48
  };
39
49
 
40
50
  return {