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
@@ -51,6 +51,34 @@ export function genericCompletedDetail({ normalizedName, label, hasResult, first
51
51
  return '';
52
52
  }
53
53
 
54
+ const uniqueToolNames = (names) => [
55
+ ...new Set((Array.isArray(names) ? names : []).map((name) => String(name || '').trim()).filter(Boolean)),
56
+ ];
57
+
58
+ /**
59
+ * What a bridge load_tool result described, missed and blocked; null for a
60
+ * loader result (or anything that is not a describe result).
61
+ */
62
+ export function bridgeDescribeResult(resultText) {
63
+ let parsed;
64
+ try {
65
+ parsed = JSON.parse(String(resultText || ''));
66
+ } catch {
67
+ return null;
68
+ }
69
+ if (!Array.isArray(parsed?.entries)) return null;
70
+ return {
71
+ described: uniqueToolNames(parsed.entries.map((entry) => entry?.name)),
72
+ missing: uniqueToolNames(parsed.missing),
73
+ blocked: uniqueToolNames((Array.isArray(parsed.blocked) ? parsed.blocked : []).map((entry) => entry?.name)),
74
+ };
75
+ }
76
+
77
+ /** Names a bridge load_tool result described, or null for a loader result. */
78
+ export function bridgeDescribedToolNames(resultText) {
79
+ return bridgeDescribeResult(resultText)?.described ?? null;
80
+ }
81
+
54
82
  export function toolSearchLoadedSummary(resultText) {
55
83
  let parsed;
56
84
  try {
@@ -61,13 +89,19 @@ export function toolSearchLoadedSummary(resultText) {
61
89
  const already = /^Already active:\s*(.+)$/m.exec(text)?.[1] || '';
62
90
  return [...(loaded ? [`Loaded: ${loaded}`] : []), ...(already ? [`Already active: ${already}`] : [])].join(' · ');
63
91
  }
92
+ // Bridge describe result: nothing was loaded; report what was not described.
93
+ const describe = bridgeDescribeResult(resultText);
94
+ if (describe) {
95
+ const { missing, blocked } = describe;
96
+ return [
97
+ ...(missing.length ? [`Missing: ${missing.join(', ')}`] : []),
98
+ ...(blocked.length ? [`Blocked: ${blocked.join(', ')}`] : []),
99
+ ].join(' · ');
100
+ }
64
101
  const tools = parsed?.selected?.tools;
65
102
  if (!tools || typeof tools !== 'object') return '';
66
- const uniqueNames = (names) => [
67
- ...new Set((Array.isArray(names) ? names : []).map((name) => String(name || '').trim()).filter(Boolean)),
68
- ];
69
- const loaded = uniqueNames(tools.added);
70
- const already = uniqueNames(tools.already);
103
+ const loaded = uniqueToolNames(tools.added);
104
+ const already = uniqueToolNames(tools.already);
71
105
  return [
72
106
  ...(loaded.length ? [`Loaded: ${loaded.join(', ')}`] : []),
73
107
  ...(already.length ? [`Already active: ${already.join(', ')}`] : []),
@@ -23,7 +23,7 @@
23
23
  * tool-card-model/card-header.mjs — header label + arg summary
24
24
  */
25
25
  import { formatToolSurface } from './tool-surface.mjs';
26
- import { pluralize } from './tool-primitives.mjs';
26
+ import { pluralize, toolCallDisplayIdentity } from './tool-primitives.mjs';
27
27
  import { deriveAggregateCardModel } from './tool-card-model/aggregate-card.mjs';
28
28
  import { isShellTool } from './tool-card-model/shell-surface.mjs';
29
29
  import { SKILL_SURFACE_NAMES } from './tool-card-model/agent-surface.mjs';
@@ -77,6 +77,7 @@ export {
77
77
  resolveBackgroundTaskMeta,
78
78
  } from './tool-card-model/background-task.mjs';
79
79
  export {
80
+ bridgeDescribeResult,
80
81
  genericCompletedDetail,
81
82
  shouldPrefixSyncElapsed,
82
83
  toolSearchLoadedSummary,
@@ -95,7 +96,8 @@ export { pluralize as plural };
95
96
  * @param {object} options { truncate(text,width), maxResultChars }.
96
97
  */
97
98
  export function deriveToolCardModel(input = {}, options = {}) {
98
- const base = readCardInput(input, options);
99
+ const identity = toolCallDisplayIdentity(input.name, input.args);
100
+ const base = readCardInput({ ...input, name: identity.name, args: identity.args }, options);
99
101
  if (base.aggregate) return deriveAggregateCardModel(base);
100
102
 
101
103
  const { label, summary, normalizedName, args: parsedArgs } = formatToolSurface(base.name, base.args);
@@ -115,6 +117,7 @@ export function deriveToolCardModel(input = {}, options = {}) {
115
117
  return {
116
118
  aggregate: false,
117
119
  ...commonCardFields(base, status.terminalStatus),
120
+ ...(identity.via ? { via: identity.via } : {}),
118
121
  labelText: header.labelText,
119
122
  summaryText: header.summaryText,
120
123
  headerFailureText: status.headerFailureText,
@@ -0,0 +1,2 @@
1
+ export const TOOL_OUTPUT_PAGE_BYTES = 8 * 1024;
2
+ export const TOOL_OUTPUT_TAIL_BYTES = 12 * 1024;
@@ -22,6 +22,10 @@ export const RECALL_OUTPUT_MAX_BYTES = positiveEnvInt('MIXDOG_RECALL_OUTPUT_MAX_
22
22
  // github results after field reduction; the full response stays in a raw
23
23
  // artifact. Provisional: reduced pr.list/run.list pages measured ~2k tokens.
24
24
  export const GITHUB_OUTPUT_MAX_BYTES = positiveEnvInt('MIXDOG_GITHUB_OUTPUT_MAX_BYTES', 10 * 1024);
25
+ // setup results are compact JSON (a provider index, a 25-row model page, minimal
26
+ // status rows). The same figure is the setup inline-offload threshold, so one
27
+ // result can no longer sit just under the 50KB default (a 34-model catalog did).
28
+ export const SETUP_OUTPUT_MAX_BYTES = positiveEnvInt('MIXDOG_SETUP_OUTPUT_MAX_BYTES', 20 * 1024);
25
29
 
26
30
  function _prefixByBytes(value, maxBytes) {
27
31
  const text = String(value || '');
@@ -133,6 +133,19 @@ export function parseToolArgs(args) {
133
133
  return { value: args };
134
134
  }
135
135
 
136
+ /**
137
+ * Display identity of a tool call. A call_tool bridge request shows the tool
138
+ * it runs, with `via: 'call_tool'`; the transcript keeps the wire call.
139
+ */
140
+ export function toolCallDisplayIdentity(name, args) {
141
+ if (rawToolName(name) !== 'call_tool') return { name, args };
142
+ const parsed = parseToolArgs(args);
143
+ const target = typeof parsed?.name === 'string' ? parsed.name.trim() : '';
144
+ if (!target) return { name, args };
145
+ const targetArgs = parsed.arguments && typeof parsed.arguments === 'object' ? parsed.arguments : {};
146
+ return { name: target, args: targetArgs, via: 'call_tool' };
147
+ }
148
+
136
149
  export function displayToolPath(path) {
137
150
  const text = String(path ?? '');
138
151
  return text.replace(/\\/g, '/').split('/').filter(Boolean).at(-1) || text;
@@ -640,8 +640,28 @@ function summarizeAgentResult({ text, trimmed, translate }) {
640
640
 
641
641
  const summarizeGeneric = ({ text, translate }) => summarizeGenericResult(text, translate);
642
642
 
643
+ const summarizeAskUserResult = ({ text, translate }) => {
644
+ // A composer message answered: `User replied in chat: "<json>". ` then the
645
+ // picks sentence or only the closing one. Summarized as the reply itself.
646
+ const replied = /^User replied in chat: ("(?:[^"\\]|\\.)*")\. /s.exec(String(text ?? '').trim());
647
+ if (replied) {
648
+ let reply = '';
649
+ try {
650
+ reply = String(JSON.parse(replied[1]));
651
+ } catch {}
652
+ const label = translate('Answered in chat', 'Answered in chat', {});
653
+ return truncateSingleLine(reply ? `${label}: ${reply}` : label, AGENT_SURFACE_BRIEF_MAX);
654
+ }
655
+ const answers =
656
+ /^User has answered your questions:\s*(.*?)(?:\s*You can now continue with these answers in mind\.)?$/s.exec(
657
+ String(text ?? '').trim()
658
+ );
659
+ return truncateSingleLine(answers ? answers[1] : String(text ?? '').trim(), AGENT_SURFACE_BRIEF_MAX) || null;
660
+ };
661
+
643
662
  const TOOL_RESULT_SUMMARIZERS = new Map(
644
663
  [
664
+ [['ask_user'], summarizeAskUserResult],
645
665
  [['read', 'view_image', 'read_mcp_resource'], summarizeReadResult],
646
666
  [['apply_patch'], summarizePatchResult],
647
667
  [['grep'], summarizeGrepResult],
@@ -662,7 +682,8 @@ const TOOL_RESULT_SUMMARIZERS = new Map(
662
682
  'update_memory',
663
683
  'request_user_input',
664
684
  'update_plan',
665
- 'cwd',
685
+ 'cwd', // legacy: old transcripts
686
+ 'session',
666
687
  'list_mcp_resources',
667
688
  'list_mcp_resource_templates',
668
689
  ],
@@ -49,9 +49,10 @@ export function isUserControlCancellation(text) {
49
49
  }
50
50
 
51
51
  // A non-zero exit the tool itself marked as a signal (search no-match, a
52
- // `git diff --exit-code` difference) rather than a command failure.
52
+ // `git diff --exit-code` difference, a `git merge-tree` conflict report) rather
53
+ // than a command failure.
53
54
  export function hasBenignExitOutcome(text) {
54
- return /^\[outcome:\s*(?:no-match|no-change)\]\s*$/im.test(String(text || ''));
55
+ return /^\[outcome:\s*(?:no-match|no-change|conflicts)\]\s*$/im.test(String(text || ''));
55
56
  }
56
57
 
57
58
  // The status a task/bridge envelope reports in its leading block. A `<status>`
@@ -144,11 +144,14 @@ export function displayToolName(name, args = {}) {
144
144
  return 'Visualize';
145
145
  case 'list_mcp_resources':
146
146
  case 'list_mcp_resource_templates':
147
- case 'cwd':
147
+ case 'cwd': // legacy: old transcripts
148
+ case 'session':
148
149
  case 'setup':
149
150
  return 'Setup';
150
151
  case 'request_user_input':
151
152
  return 'Ask User';
153
+ case 'ask_user':
154
+ return 'Question';
152
155
  case 'update_plan':
153
156
  return 'Plan';
154
157
  case 'memory':
@@ -236,6 +239,14 @@ export function summarizeToolArgs(name, args, { max = DEFAULT_SUMMARY_MAX } = {}
236
239
  return summarizeGithub(a, max);
237
240
  case 'goal':
238
241
  return compactParts([String(a.action || ''), truncateToolText(a.objective, max)]);
242
+ case 'ask_user':
243
+ return truncateToolText(
244
+ (Array.isArray(a.questions) ? a.questions : [])
245
+ .map((q) => String(q?.header || q?.question || '').trim())
246
+ .filter(Boolean)
247
+ .join(', '),
248
+ max
249
+ );
239
250
  case 'list':
240
251
  case 'ls':
241
252
  if (Array.isArray(a.path) || Array.isArray(a.dir) || Array.isArray(a.cwd)) {
@@ -333,8 +344,12 @@ export function summarizeToolArgs(name, args, { max = DEFAULT_SUMMARY_MAX } = {}
333
344
  case 'list_mcp_resources':
334
345
  case 'list_mcp_resource_templates':
335
346
  return a.server ? `server "${truncateToolText(a.server, max)}"` : 'all servers';
336
- case 'cwd':
337
- return compactParts([String(a.action || a.type || ''), truncateToolText(firstText(a.path, a.cwd, a.dir), max)]);
347
+ case 'cwd': // legacy: old transcripts
348
+ case 'session':
349
+ return compactParts([
350
+ String(a.action || a.type || ''),
351
+ truncateToolText(firstText(a.title, a.path, a.cwd, a.dir), max),
352
+ ]);
338
353
  case 'setup':
339
354
  return compactParts([
340
355
  String(a.action || ''),
@@ -437,9 +452,8 @@ function summarizeGithub(a, max) {
437
452
  const id = a.number ?? a.id;
438
453
  const hasId = id != null && String(id).trim() !== '';
439
454
  const title = truncateToolText(firstText(a.title, a.workflow, a.tag), Math.min(max, 60));
440
- return hasId
441
- ? compactParts([`${phrase} ${String(id).trim()}`, repo, title])
442
- : compactParts([repo ? `${phrase} ${repo}` : phrase, title]);
455
+ if (hasId) return compactParts([`${phrase} ${String(id).trim()}`, repo, title]);
456
+ return compactParts([repo ? `${phrase} ${repo}` : phrase, title]);
443
457
  }
444
458
 
445
459
  export function formatToolSurface(name, args, opts = {}) {
@@ -85,10 +85,12 @@ const TOOL_CATEGORY = new Map([
85
85
  ['visualize', 'Visualize'],
86
86
  ['list_mcp_resources', 'Setup'],
87
87
  ['list_mcp_resource_templates', 'Setup'],
88
- ['cwd', 'Setup'],
88
+ ['cwd', 'Setup'], // legacy: old transcripts
89
+ ['session', 'Setup'],
89
90
  ['setup', 'Setup'],
90
91
  ['goal', 'Setup'],
91
92
  ['request_user_input', 'Setup'],
93
+ ['ask_user', 'Setup'],
92
94
  ['update_plan', 'Setup'],
93
95
  ['skill', 'Skill'],
94
96
  ['skill_execute', 'Skill'],
@@ -342,12 +344,18 @@ function officeUnit(a) {
342
344
 
343
345
  function visualizeUnit(a) {
344
346
  const action = String(a.action || '').toLowerCase();
345
- if (action === 'capture') return unitDescriptor('Visualize', { count: 1, active: 'Capturing', done: 'Captured', noun: 'screenshot' });
346
- if (action === 'export') return unitDescriptor('Visualize', { count: 1, active: 'Exporting', done: 'Exported', noun: 'file' });
347
- if (action === 'annotate') return unitDescriptor('Visualize', { count: 1, active: 'Marking', done: 'Marked', noun: 'annotation' });
348
- if (action === 'check') return unitDescriptor('Visualize', { count: 1, active: 'Checking', done: 'Checked', noun: 'page' });
349
- if (action === 'inspect') return unitDescriptor('Visualize', { count: 1, active: 'Inspecting', done: 'Inspected', noun: 'page' });
350
- if (action === 'close') return unitDescriptor('Visualize', { count: 1, active: 'Closing', done: 'Closed', noun: 'tab' });
347
+ if (action === 'capture')
348
+ return unitDescriptor('Visualize', { count: 1, active: 'Capturing', done: 'Captured', noun: 'screenshot' });
349
+ if (action === 'export')
350
+ return unitDescriptor('Visualize', { count: 1, active: 'Exporting', done: 'Exported', noun: 'file' });
351
+ if (action === 'annotate')
352
+ return unitDescriptor('Visualize', { count: 1, active: 'Marking', done: 'Marked', noun: 'annotation' });
353
+ if (action === 'check')
354
+ return unitDescriptor('Visualize', { count: 1, active: 'Checking', done: 'Checked', noun: 'page' });
355
+ if (action === 'inspect')
356
+ return unitDescriptor('Visualize', { count: 1, active: 'Inspecting', done: 'Inspected', noun: 'page' });
357
+ if (action === 'close')
358
+ return unitDescriptor('Visualize', { count: 1, active: 'Closing', done: 'Closed', noun: 'tab' });
351
359
  return unitDescriptor('Visualize', { count: 1, active: 'Showing', done: 'Showed', noun: 'artifact' });
352
360
  }
353
361
 
@@ -568,7 +576,7 @@ function gitStageUnit(a) {
568
576
  function cwdUnit(a) {
569
577
  const action = String(a.action || a.type || '').toLowerCase();
570
578
  // A bare `path` selects that Project even when action is omitted.
571
- if (action === 'set' || (!action && a.path)) {
579
+ if (action === 'set' || action === 'set-project' || (!action && a.path)) {
572
580
  return unitDescriptor('Setup', {
573
581
  active: 'Selecting',
574
582
  done: 'Selected',
@@ -576,10 +584,43 @@ function cwdUnit(a) {
576
584
  effect: true,
577
585
  });
578
586
  }
579
- if (action === 'list') {
587
+ if (action === 'list' || action === 'list-projects') {
580
588
  return unitDescriptor('Setup', { active: 'Listing', done: 'Listed', noun: 'project' });
581
589
  }
582
- return unitDescriptor('Setup', { active: 'Checking', done: 'Checked', noun: 'working directory', pluralNoun: 'working directories' });
590
+ if (action === 'rename') {
591
+ return unitDescriptor('Setup', { active: 'Renaming', done: 'Renamed', noun: 'session', effect: true });
592
+ }
593
+ if (action === 'compact') {
594
+ return unitDescriptor('Setup', { active: 'Scheduling', done: 'Scheduled', noun: 'compaction', effect: true });
595
+ }
596
+ if (action === 'fork') {
597
+ return unitDescriptor('Setup', { active: 'Forking', done: 'Forked', noun: 'session', effect: true });
598
+ }
599
+ if (action === 'favorite' || action === 'archive') {
600
+ const off = a.value === false;
601
+ let words;
602
+ if (action === 'favorite') words = off ? ['Unfavoriting', 'Unfavorited'] : ['Favoriting', 'Favorited'];
603
+ else words = off ? ['Unarchiving', 'Unarchived'] : ['Archiving', 'Archived'];
604
+ const [active, done] = words;
605
+ return unitDescriptor('Setup', { active, done, noun: 'session', effect: true });
606
+ }
607
+ if (action.endsWith('-worktree') || action.endsWith('-worktrees')) {
608
+ return unitDescriptor('Setup', {
609
+ active: 'Managing',
610
+ done: 'Managed',
611
+ noun: 'worktree',
612
+ effect: !action.startsWith('list'),
613
+ });
614
+ }
615
+ if (action === 'status') {
616
+ return unitDescriptor('Setup', { active: 'Checking', done: 'Checked', noun: 'session' });
617
+ }
618
+ return unitDescriptor('Setup', {
619
+ active: 'Checking',
620
+ done: 'Checked',
621
+ noun: 'working directory',
622
+ pluralNoun: 'working directories',
623
+ });
583
624
  }
584
625
 
585
626
  const TOOL_UNITS = new Map([
@@ -689,13 +730,15 @@ const TOOL_UNITS = new Map([
689
730
  ['use_skill', skillUnit],
690
731
  ['code_graph', codeGraphUnit],
691
732
  ['request_user_input', () => unitDescriptor('Setup', { active: 'Asking', done: 'Asked', noun: 'user' })],
733
+ ['ask_user', () => unitDescriptor('Setup', { active: 'Asking', done: 'Asked', noun: 'user' })],
692
734
  ['update_plan', () => unitDescriptor('Setup', { active: 'Updating', done: 'Updated', noun: 'plan' })],
693
735
  ['list_mcp_resources', () => unitDescriptor('Setup', { active: 'Listing', done: 'Listed', noun: 'MCP resource' })],
694
736
  [
695
737
  'list_mcp_resource_templates',
696
738
  () => unitDescriptor('Setup', { active: 'Listing', done: 'Listed', noun: 'MCP resource template' }),
697
739
  ],
698
- ['cwd', cwdUnit],
740
+ ['cwd', cwdUnit], // legacy: old transcripts
741
+ ['session', cwdUnit],
699
742
  ]);
700
743
 
701
744
  function mcpUnit(name, a) {
@@ -21,6 +21,37 @@ export function createTranscriptRouteMetadata(session, route = {}, at = Date.now
21
21
  return { at, ...transcriptRouteMetadataFields({ modelId, model, provider, agent }) };
22
22
  }
23
23
 
24
+ const ATTACHMENT_ID = /^[a-f0-9]{64}$/;
25
+ const ATTACHMENT_KINDS = new Set(['image', 'file', 'text']);
26
+
27
+ /**
28
+ * The attachments a user message carries (`meta.transcript.attachments`):
29
+ * `[{ id, attachmentRef, kind, name, mimeType, size }]`, the id being the
30
+ * content hash under which the attachment store keeps the bytes. Anything that
31
+ * is not a well-formed record is dropped, so a row never names an id the store
32
+ * could not hold. Each record repeats the hash under `attachmentRef` — the
33
+ * key the store's census marks as referenced.
34
+ */
35
+ export function normalizeMessageAttachments(value) {
36
+ if (!Array.isArray(value)) return [];
37
+ const seen = new Set();
38
+ const out = [];
39
+ for (const raw of value) {
40
+ const id = typeof raw?.id === 'string' ? raw.id : '';
41
+ if (!ATTACHMENT_ID.test(id) || seen.has(id) || out.length >= 64) continue;
42
+ seen.add(id);
43
+ out.push({
44
+ id,
45
+ attachmentRef: id,
46
+ kind: ATTACHMENT_KINDS.has(raw.kind) ? raw.kind : 'file',
47
+ name: String(raw.name || 'attachment').slice(0, 200),
48
+ mimeType: String(raw.mimeType || 'application/octet-stream').slice(0, 100),
49
+ size: Number.isFinite(Number(raw.size)) && Number(raw.size) >= 0 ? Number(raw.size) : 0,
50
+ });
51
+ }
52
+ return out;
53
+ }
54
+
24
55
  /** A new stable message id (`meta.transcript.messageId`). */
25
56
  export function newTranscriptMessageId() {
26
57
  return `msg_${globalThis.crypto.randomUUID().replaceAll('-', '')}`;
@@ -36,6 +67,7 @@ export function persistedUserTranscriptMetadata(value) {
36
67
  if (!value || typeof value !== 'object') return null;
37
68
  return {
38
69
  messageId: stableMessageId(value.messageId),
70
+ ...(typeof value.attemptId === 'string' && value.attemptId ? { attemptId: value.attemptId } : {}),
39
71
  ...(Number.isFinite(Number(value.at)) ? { at: Number(value.at) } : {}),
40
72
  ...transcriptRouteMetadataFields(value),
41
73
  ...(typeof value.sender === 'string' && value.sender ? { sender: value.sender } : {}),
@@ -44,14 +76,30 @@ export function persistedUserTranscriptMetadata(value) {
44
76
  // The turn's change-record key (the outer prompt id), so a restored user
45
77
  // row still addresses its turn's Undo/Reapply.
46
78
  ...(typeof value.checkpointId === 'string' && value.checkpointId ? { checkpointId: value.checkpointId } : {}),
79
+ ...attachmentsField(value.attachments),
47
80
  };
48
81
  }
49
82
 
83
+ function attachmentsField(value) {
84
+ const attachments = normalizeMessageAttachments(value);
85
+ return attachments.length ? { attachments } : {};
86
+ }
87
+
88
+ /** The `attachments` field of a transcript row (absent when there are none). */
89
+ export function transcriptAttachmentFields(value) {
90
+ return attachmentsField(value?.attachments);
91
+ }
92
+
50
93
  export function persistedAssistantTranscriptMetadata(value, fallbackAt = Date.now()) {
51
94
  if (!value || typeof value !== 'object') return null;
52
95
  const candidateAt = Number(value.assistantAt);
53
96
  const assistantAt = Number.isFinite(candidateAt) && candidateAt > 0 ? candidateAt : fallbackAt;
54
97
  value.assistantAt = assistantAt;
55
98
  value.assistantMessageId = stableMessageId(value.assistantMessageId);
56
- return { messageId: value.assistantMessageId, at: assistantAt, ...transcriptRouteMetadataFields(value) };
99
+ return {
100
+ messageId: value.assistantMessageId,
101
+ at: assistantAt,
102
+ ...(typeof value.attemptId === 'string' && value.attemptId ? { attemptId: value.attemptId } : {}),
103
+ ...transcriptRouteMetadataFields(value),
104
+ };
57
105
  }
@@ -0,0 +1,33 @@
1
+ function stableItemKey(item, index) {
2
+ if (item?.id !== undefined && item?.id !== null) return String(item.id);
3
+ return `${item?.kind || 'item'}:${item?.text || item?.label || item?.status || ''}:${index}`;
4
+ }
5
+
6
+ /** Completed attempts keep the same identity in live, full and tail projections. */
7
+ export function transcriptTurnKeys(items) {
8
+ const transcript = Array.isArray(items) ? items : [];
9
+ const keys = [];
10
+ let activeTurn = null;
11
+ let start = 0;
12
+ for (let index = 0; index < transcript.length; index += 1) {
13
+ const item = transcript[index];
14
+ if (item?.kind === 'user') {
15
+ activeTurn = `turn:${stableItemKey(item, index)}`;
16
+ start = index;
17
+ }
18
+ if (!activeTurn) {
19
+ activeTurn = `segment:${stableItemKey(item, index)}`;
20
+ start = index;
21
+ }
22
+ keys.push(activeTurn);
23
+ if (item?.kind === 'turndone') {
24
+ if (typeof item.attemptId === 'string' && item.attemptId) {
25
+ for (let row = start; row <= index; row += 1) keys[row] = `attempt:${item.attemptId}`;
26
+ } else if (typeof item.checkpointId === 'string' && item.checkpointId) {
27
+ for (let row = start; row <= index; row += 1) keys[row] = `checkpoint:${item.checkpointId}`;
28
+ }
29
+ activeTurn = null;
30
+ }
31
+ }
32
+ return keys;
33
+ }
@@ -0,0 +1,74 @@
1
+ /**
2
+ * transcript-writer/purge.mjs — removal of one deleted session's transcript.
3
+ *
4
+ * Per id, no folder scan: the paths this process's writers have used for the
5
+ * id, plus the paths the caller's known session cwds map to. A purged id is
6
+ * remembered so a still-running writer of the deleted session cannot recreate
7
+ * its file (session ids are never reused).
8
+ */
9
+ import { unlinkSync } from 'node:fs';
10
+ import { join, resolve } from 'node:path';
11
+ import { discardBuffered } from '../buffered-appender.mjs';
12
+ import { cwdToProjectSlug } from './transcript-file.mjs';
13
+
14
+ const MAX_TRACKED_SESSIONS = 4096;
15
+ const knownPaths = new Map(); // sessionId -> Set<transcriptPath>
16
+ const purgedSessions = new Set();
17
+
18
+ function boundedAdd(set, value) {
19
+ set.delete(value);
20
+ set.add(value);
21
+ if (set.size > MAX_TRACKED_SESSIONS) set.delete(set.values().next().value);
22
+ }
23
+
24
+ /** A writer of `sessionId` appends to `transcriptPath`. */
25
+ export function noteSessionTranscript(sessionId, transcriptPath) {
26
+ let paths = knownPaths.get(sessionId);
27
+ if (!paths) {
28
+ paths = new Set();
29
+ knownPaths.delete(sessionId);
30
+ knownPaths.set(sessionId, paths);
31
+ if (knownPaths.size > MAX_TRACKED_SESSIONS) knownPaths.delete(knownPaths.keys().next().value);
32
+ }
33
+ paths.add(transcriptPath);
34
+ }
35
+
36
+ export function isSessionTranscriptPurged(sessionId) {
37
+ return purgedSessions.has(sessionId);
38
+ }
39
+
40
+ function removeFile(path) {
41
+ discardBuffered(path);
42
+ try {
43
+ unlinkSync(path);
44
+ } catch (error) {
45
+ if (error?.code !== 'ENOENT') throw error;
46
+ }
47
+ }
48
+
49
+ /**
50
+ * Delete `<id>.jsonl` (and its rotated `.1`) of the session. Returns every
51
+ * primary transcript path considered (existing or not) so the caller can drop
52
+ * the memory ingest offsets keyed by them. A file that cannot be removed is
53
+ * reported through `onError` and does not stop the others.
54
+ */
55
+ export function purgeSessionTranscripts({ mixdogHome, sessionId, cwds = [], onError = () => {} }) {
56
+ if (!sessionId) return [];
57
+ boundedAdd(purgedSessions, sessionId);
58
+ const paths = new Set(knownPaths.get(sessionId) || []);
59
+ for (const cwd of cwds) {
60
+ if (typeof cwd !== 'string' || !cwd) continue;
61
+ paths.add(join(mixdogHome, 'projects', cwdToProjectSlug(resolve(cwd)), `${sessionId}.jsonl`));
62
+ }
63
+ knownPaths.delete(sessionId);
64
+ for (const path of paths) {
65
+ for (const target of [path, `${path}.1`]) {
66
+ try {
67
+ removeFile(target);
68
+ } catch (error) {
69
+ onError(target, error);
70
+ }
71
+ }
72
+ }
73
+ return [...paths];
74
+ }
@@ -29,7 +29,15 @@ export function conversationText(content) {
29
29
  .join('\n');
30
30
  }
31
31
 
32
- export function createTranscriptFile({ projectDir, transcriptPath, sessionId, resolvedCwd, logOnce, rotation }) {
32
+ export function createTranscriptFile({
33
+ projectDir,
34
+ transcriptPath,
35
+ sessionId,
36
+ resolvedCwd,
37
+ logOnce,
38
+ rotation,
39
+ memoryEligible = true,
40
+ }) {
33
41
  let projectDirReady = false;
34
42
  function ensureProjectDir() {
35
43
  if (projectDirReady) return;
@@ -81,6 +89,7 @@ export function createTranscriptFile({ projectDir, transcriptPath, sessionId, re
81
89
  const text = conversationText(message?.content);
82
90
  if (!text.trim()) continue;
83
91
  const entry = { type: role, sessionId, cwd: resolvedCwd };
92
+ if (!memoryEligible) entry.memoryEligible = false;
84
93
  if (message?.timestamp != null) entry.timestamp = message.timestamp;
85
94
  else if (message?.ts != null) entry.ts = message.ts;
86
95
  entry.message = { content: [{ type: 'text', text }] };
@@ -21,6 +21,7 @@ import { formatUtcTimestamp } from './time-format.mjs';
21
21
  import { createRotationTracker } from './transcript-writer/rotation.mjs';
22
22
  import { conversationText, createTranscriptFile, cwdToProjectSlug } from './transcript-writer/transcript-file.mjs';
23
23
  import { createFailureLog, createSessionRecord } from './transcript-writer/session-record.mjs';
24
+ import { isSessionTranscriptPurged, noteSessionTranscript } from './transcript-writer/purge.mjs';
24
25
 
25
26
  // A user prompt with pasted images arrives as a content block array; only its
26
27
  // text reaches the transcript (String(array) would store "[object Object]").
@@ -29,7 +30,7 @@ const textOrEmpty = (text) => {
29
30
  return text == null ? '' : String(text);
30
31
  };
31
32
 
32
- export function createTranscriptWriter({ mixdogHome, sessionId, cwd, pid } = {}) {
33
+ export function createTranscriptWriter({ mixdogHome, sessionId, cwd, pid, memoryEligible = true } = {}) {
33
34
  if (!mixdogHome) throw new Error('transcript-writer: mixdogHome is required');
34
35
  if (!sessionId) throw new Error('transcript-writer: sessionId is required');
35
36
  if (!cwd) throw new Error('transcript-writer: cwd is required');
@@ -41,10 +42,22 @@ export function createTranscriptWriter({ mixdogHome, sessionId, cwd, pid } = {})
41
42
 
42
43
  const logOnce = createFailureLog();
43
44
  const rotation = createRotationTracker({ transcriptPath, logOnce });
44
- const file = createTranscriptFile({ projectDir, transcriptPath, sessionId, resolvedCwd, logOnce, rotation });
45
+ const file = createTranscriptFile({
46
+ projectDir,
47
+ transcriptPath,
48
+ sessionId,
49
+ resolvedCwd,
50
+ logOnce,
51
+ rotation,
52
+ memoryEligible,
53
+ });
45
54
  const record = createSessionRecord({ sessionRecordPath, sessionId, resolvedCwd, transcriptPath, logOnce });
46
55
 
56
+ noteSessionTranscript(sessionId, transcriptPath);
57
+
47
58
  function appendLine(entry) {
59
+ // A deleted session's own writer must not bring its transcript back.
60
+ if (isSessionTranscriptPurged(sessionId)) return;
48
61
  file.ensureProjectDir();
49
62
  rotation.rotateIfNeeded();
50
63
  try {
@@ -54,6 +67,7 @@ export function createTranscriptWriter({ mixdogHome, sessionId, cwd, pid } = {})
54
67
  entry?.timestamp != null || entry?.ts != null
55
68
  ? { ...entry, cwd: resolvedCwd }
56
69
  : { ...entry, cwd: resolvedCwd, timestamp: formatUtcTimestamp() };
70
+ if (!memoryEligible) stampedEntry.memoryEligible = false;
57
71
  const line = `${JSON.stringify(stampedEntry)}\n`;
58
72
  appendBuffered(transcriptPath, line);
59
73
  rotation.noteAppended(Buffer.byteLength(line));
@@ -90,12 +104,16 @@ export function createTranscriptWriter({ mixdogHome, sessionId, cwd, pid } = {})
90
104
  return {
91
105
  transcriptPath,
92
106
  sessionRecordPath,
93
- writeSessionRecord: record.write,
94
- ensureConversationBackfill: file.ensureConversationBackfill,
95
- ensureTranscriptFile: file.ensureTranscriptFile,
107
+ // Agent runtimes can share a PID with their parent; never replace its discovery record.
108
+ writeSessionRecord: memoryEligible ? record.write : () => {},
109
+ ensureConversationBackfill: (messages) =>
110
+ isSessionTranscriptPurged(sessionId) ? false : file.ensureConversationBackfill(messages),
111
+ ensureTranscriptFile: () => {
112
+ if (!isSessionTranscriptPurged(sessionId)) file.ensureTranscriptFile();
113
+ },
96
114
  // Refresh only the session record's updatedAt so discovery keeps ranking
97
115
  // this session as live across long-lived remote sessions.
98
- refresh: record.write,
116
+ refresh: memoryEligible ? record.write : () => {},
99
117
  appendAssistant: (text) => appendText('assistant', text),
100
118
  // User prompt row. It exists so the memory transcript watcher ingests BOTH
101
119
  // sides of the conversation (user rows were previously never written,