mixdog 1.4.1 → 1.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (630) hide show
  1. package/package.json +4 -3
  2. package/scripts/build-shipped-history.mjs +125 -33
  3. package/scripts/gate-local.mjs +220 -63
  4. package/scripts/graph-parity.mjs +8 -3
  5. package/scripts/lib/gate-scheduler.mjs +139 -32
  6. package/scripts/lib/gate-timing-reporter.mjs +16 -0
  7. package/scripts/lib/run-node-tests.mjs +71 -34
  8. package/scripts/lib/scoped-temp.mjs +1 -0
  9. package/scripts/lib/test-failure-records.mjs +14 -1
  10. package/scripts/lib/test-failure-summary.mjs +9 -4
  11. package/scripts/lib/test-spawn-ledger.mjs +43 -3
  12. package/scripts/post-release-check.mjs +26 -16
  13. package/scripts/pptx-kit-index.mjs +5 -6
  14. package/scripts/provider-pingpong-live.mjs +1 -1
  15. package/scripts/prune-embedding-runtime.mjs +3 -1
  16. package/scripts/release-paths.mjs +7 -1
  17. package/scripts/suite-health.mjs +110 -28
  18. package/scripts/test.mjs +9 -14
  19. package/src/agents/advisor/AGENT.md +4 -4
  20. package/src/agents/advisor/agent.json +1 -1
  21. package/src/agents/explore/AGENT.md +22 -0
  22. package/src/agents/explore/agent.json +6 -0
  23. package/src/cli.mjs +7 -0
  24. package/src/defaults/agents.json +7 -0
  25. package/src/defaults/shipped-history.json +38 -2
  26. package/src/defaults/skills/browser-use/SKILL.md +4 -1
  27. package/src/defaults/skills/code-tidy/SKILL.md +71 -102
  28. package/src/defaults/skills/code-tidy/references/agent-cleanup.md +66 -114
  29. package/src/defaults/skills/code-tidy/references/cleanup-report.md +19 -35
  30. package/src/defaults/skills/code-tidy/references/dead-code.md +3 -9
  31. package/src/defaults/skills/code-tidy/references/test-suite-slop.md +16 -27
  32. package/src/defaults/skills/computer-use/SKILL.md +12 -2
  33. package/src/defaults/skills/setup/SKILL.md +2 -2
  34. package/src/defaults/skills/setup/references/actions.md +28 -9
  35. package/src/defaults/skills/setup/references/surfaces.md +5 -2
  36. package/src/defaults/skills/setup-guide/SKILL.md +11 -3
  37. package/src/defaults/skills/setup-guide/model-recommendations.json +13 -0
  38. package/src/defaults/skills/skill-creator/SKILL.md +85 -190
  39. package/src/defaults/skills/skill-creator/references/design.md +70 -162
  40. package/src/defaults/skills/skill-creator/references/evaluation.md +33 -92
  41. package/src/defaults/skills/test-suite/SKILL.md +194 -0
  42. package/src/defaults/skills/test-suite/references/case-management.md +51 -0
  43. package/src/defaults/skills/test-suite/references/flaky-policy.md +39 -0
  44. package/src/defaults/skills/test-suite/references/reliability.md +49 -0
  45. package/src/defaults/skills/test-suite/references/suite-design.md +78 -0
  46. package/src/defaults/skills/test-suite/scripts/inventory.mjs +335 -0
  47. package/src/defaults/skills/visualize/SKILL.md +6 -2
  48. package/src/lib/instruction-text.cjs +36 -0
  49. package/src/lib/rules-builder.cjs +40 -50
  50. package/src/orchestration/balanced.md +23 -0
  51. package/src/orchestration/focused.md +22 -0
  52. package/src/orchestration/none.md +5 -0
  53. package/src/orchestration/swarm.md +24 -0
  54. package/src/rules/agent-mode/AGENT_MODE.md +3 -1
  55. package/src/rules/agent-mode/MIXY.md +2 -2
  56. package/src/rules/lead/LEAD.md +3 -3
  57. package/src/rules/shared/20-research.md +3 -6
  58. package/src/rules/shared/40-editing.md +1 -0
  59. package/src/rules/shared/60-verification.md +10 -9
  60. package/src/rules/shared/70-delivery.md +4 -3
  61. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/abort-link.mjs +5 -1
  62. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/session-prep.mjs +3 -3
  63. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch.mjs +10 -2
  64. package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +132 -21
  65. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +13 -9
  66. package/src/runtime/agent/orchestrator/agent-runtime/heartbeat-completion.mjs +2 -2
  67. package/src/runtime/agent/orchestrator/agent-runtime/maintenance-route.mjs +4 -1
  68. package/src/runtime/agent/orchestrator/agent-runtime/session-builder.mjs +67 -0
  69. package/src/runtime/agent/orchestrator/agent-trace-format.mjs +1 -0
  70. package/src/runtime/agent/orchestrator/config.mjs +12 -7
  71. package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +7 -7
  72. package/src/runtime/agent/orchestrator/context/role-instructions.mjs +9 -30
  73. package/src/runtime/agent/orchestrator/internal-agents.mjs +3 -14
  74. package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +124 -12
  75. package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +204 -49
  76. package/src/runtime/agent/orchestrator/mcp/client-config.mjs +16 -7
  77. package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +157 -57
  78. package/src/runtime/agent/orchestrator/mcp/client.mjs +54 -23
  79. package/src/runtime/agent/orchestrator/mcp/oauth-client.mjs +1 -1
  80. package/src/runtime/agent/orchestrator/mcp/oauth-credentials.mjs +8 -2
  81. package/src/runtime/agent/orchestrator/mcp/oauth-login.mjs +83 -52
  82. package/src/runtime/agent/orchestrator/mcp/oauth-probe.mjs +1 -1
  83. package/src/runtime/agent/orchestrator/mcp/oauth-provider.mjs +14 -0
  84. package/src/runtime/agent/orchestrator/mcp/oauth.mjs +43 -27
  85. package/src/runtime/agent/orchestrator/providers/account-pool.mjs +43 -8
  86. package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +30 -28
  87. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
  88. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +31 -21
  89. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-stop.mjs +3 -3
  90. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-login.mjs +3 -1
  91. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-tokens.mjs +2 -2
  92. package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +1 -1
  93. package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +1 -1
  94. package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +40 -0
  95. package/src/runtime/agent/orchestrator/providers/custom-provider-keys.mjs +34 -0
  96. package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +3 -0
  97. package/src/runtime/agent/orchestrator/providers/devin-auth.mjs +14 -7
  98. package/src/runtime/agent/orchestrator/providers/devin-wire-transport.mjs +3 -2
  99. package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +2 -2
  100. package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +4 -1
  101. package/src/runtime/agent/orchestrator/providers/gemini-thinking.mjs +2 -2
  102. package/src/runtime/agent/orchestrator/providers/grok-oauth-login.mjs +48 -31
  103. package/src/runtime/agent/orchestrator/providers/lib/oauth-page.mjs +0 -18
  104. package/src/runtime/agent/orchestrator/providers/lib/oauth-token-utils.mjs +138 -6
  105. package/src/runtime/agent/orchestrator/providers/mimo-oauth.mjs +1 -1
  106. package/src/runtime/agent/orchestrator/providers/model-cache.mjs +100 -33
  107. package/src/runtime/agent/orchestrator/providers/muse-code-oauth.mjs +1 -1
  108. package/src/runtime/agent/orchestrator/providers/oauth-secret-fields.fixtures.mjs +45 -0
  109. package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +4 -6
  110. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-head-parity.json +2784 -2872
  111. package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +5 -8
  112. package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +26 -28
  113. package/src/runtime/agent/orchestrator/providers/openai-responses-payload-parity.fixture.json +288 -300
  114. package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +3 -1
  115. package/src/runtime/agent/orchestrator/providers/openai-ws-watchdogs.mjs +1 -0
  116. package/src/runtime/agent/orchestrator/providers/opencode-go-oauth.mjs +1 -1
  117. package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +3 -1
  118. package/src/runtime/agent/orchestrator/providers/registry.mjs +33 -2
  119. package/src/runtime/agent/orchestrator/providers/vertex-ai-auth.mjs +622 -0
  120. package/src/runtime/agent/orchestrator/providers/vertex-ai-maas.mjs +185 -0
  121. package/src/runtime/agent/orchestrator/providers/vertex-ai-models.mjs +445 -0
  122. package/src/runtime/agent/orchestrator/providers/vertex-ai.mjs +576 -0
  123. package/src/runtime/agent/orchestrator/providers/xai-tool-search-head-parity.json +10 -30
  124. package/src/runtime/agent/orchestrator/runtime-core/builtin-features.mjs +32 -0
  125. package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +0 -11
  126. package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-availability.mjs +8 -0
  127. package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-delta.mjs +17 -3
  128. package/src/runtime/agent/orchestrator/runtime-core/goal-control.mjs +47 -27
  129. package/src/runtime/agent/orchestrator/runtime-core/goal-deadlines.mjs +141 -10
  130. package/src/runtime/agent/orchestrator/runtime-core/goal-mutations.mjs +26 -63
  131. package/src/runtime/agent/orchestrator/runtime-core/goal-reminder.mjs +28 -3
  132. package/src/runtime/agent/orchestrator/runtime-core/goal-runtime.mjs +36 -11
  133. package/src/runtime/agent/orchestrator/runtime-core/goal-state.mjs +88 -56
  134. package/src/runtime/agent/orchestrator/runtime-core/goal-storage.mjs +4 -1
  135. package/src/runtime/agent/orchestrator/runtime-core/goal-store.mjs +51 -32
  136. package/src/runtime/agent/orchestrator/runtime-core/goal-text.mjs +45 -145
  137. package/src/runtime/agent/orchestrator/runtime-core/goal-tool-defs.mjs +15 -98
  138. package/src/runtime/agent/orchestrator/runtime-core/goal-tool-exec.mjs +32 -99
  139. package/src/runtime/agent/orchestrator/runtime-core/goal-turns.mjs +23 -78
  140. package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +69 -47
  141. package/src/runtime/agent/orchestrator/runtime-core/todo-list.mjs +367 -0
  142. package/src/runtime/agent/orchestrator/runtime-core/todo-tool-defs.mjs +47 -0
  143. package/src/runtime/agent/orchestrator/runtime-core/tool-availability.mjs +155 -0
  144. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-data.mjs +12 -0
  145. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +119 -35
  146. package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +4 -1
  147. package/src/runtime/agent/orchestrator/runtime-core/workflow/context.mjs +15 -6
  148. package/src/runtime/agent/orchestrator/runtime-core/workflow-ids.mjs +1 -0
  149. package/src/runtime/agent/orchestrator/session/agent-loop.mjs +28 -22
  150. package/src/runtime/agent/orchestrator/session/agent-pool-progress.mjs +30 -0
  151. package/src/runtime/agent/orchestrator/session/agent-room.d.mts +30 -5
  152. package/src/runtime/agent/orchestrator/session/agent-room.mjs +171 -37
  153. package/src/runtime/agent/orchestrator/session/attachment-preflight.mjs +1 -1
  154. package/src/runtime/agent/orchestrator/session/cache-warm.mjs +94 -10
  155. package/src/runtime/agent/orchestrator/session/catalog-db/index.mjs +2 -2
  156. package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +1 -1
  157. package/src/runtime/agent/orchestrator/session/compact/execution-tail.mjs +1 -1
  158. package/src/runtime/agent/orchestrator/session/compact/runner.mjs +3 -0
  159. package/src/runtime/agent/orchestrator/session/compact/summary-route.mjs +1 -1
  160. package/src/runtime/agent/orchestrator/session/context-utils.mjs +8 -12
  161. package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +4 -4
  162. package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +11 -6
  163. package/src/runtime/agent/orchestrator/session/conversation-import/convert.mjs +6 -6
  164. package/src/runtime/agent/orchestrator/session/conversation-import/imported-session.mjs +7 -3
  165. package/src/runtime/agent/orchestrator/session/conversation-import/turns.mjs +11 -1
  166. package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +4 -3
  167. package/src/runtime/agent/orchestrator/session/human-gate/held-message.mjs +1 -1
  168. package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +37 -8
  169. package/src/runtime/agent/orchestrator/session/human-gate/run-policy.mjs +1 -1
  170. package/src/runtime/agent/orchestrator/session/image-strip-recovery.mjs +1 -1
  171. package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +11 -1
  172. package/src/runtime/agent/orchestrator/session/loop/context-overflow.mjs +1 -1
  173. package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +5 -3
  174. package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +8 -1
  175. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/todo-check.mjs +196 -0
  176. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +116 -50
  177. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +8 -1
  178. package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +1 -1
  179. package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +1 -1
  180. package/src/runtime/agent/orchestrator/session/loop/steering.mjs +3 -1
  181. package/src/runtime/agent/orchestrator/session/loop/stored-tool-args.mjs +5 -6
  182. package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +27 -3
  183. package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +18 -2
  184. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +23 -1
  185. package/src/runtime/agent/orchestrator/session/loop/turn-limits.mjs +13 -8
  186. package/src/runtime/agent/orchestrator/session/loop/turn-report.mjs +35 -0
  187. package/src/runtime/agent/orchestrator/session/loop/usage.mjs +1 -1
  188. package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +103 -50
  189. package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +9 -7
  190. package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +21 -3
  191. package/src/runtime/agent/orchestrator/session/manager/ask-turn-failure.mjs +27 -11
  192. package/src/runtime/agent/orchestrator/session/manager/ask-turn-open.mjs +37 -34
  193. package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +15 -0
  194. package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +25 -15
  195. package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +79 -24
  196. package/src/runtime/agent/orchestrator/session/manager/ask-turn-steering-drain.mjs +3 -0
  197. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +12 -1
  198. package/src/runtime/agent/orchestrator/session/manager/context-meta.mjs +1 -1
  199. package/src/runtime/agent/orchestrator/session/manager/idle-cleanup.mjs +6 -1
  200. package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +9 -1
  201. package/src/runtime/agent/orchestrator/session/manager/pending-spool-path.mjs +2 -2
  202. package/src/runtime/agent/orchestrator/session/manager/pending-spool-shard.mjs +1 -1
  203. package/src/runtime/agent/orchestrator/session/manager/prompt-settings.mjs +598 -0
  204. package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +20 -0
  205. package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +22 -14
  206. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +2 -0
  207. package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +12 -0
  208. package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +15 -0
  209. package/src/runtime/agent/orchestrator/session/manager/session-fallback-title.mjs +1 -1
  210. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +56 -14
  211. package/src/runtime/agent/orchestrator/session/manager/session-lock.mjs +31 -0
  212. package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +59 -20
  213. package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +2 -0
  214. package/src/runtime/agent/orchestrator/session/manager/session-scratch-environment.mjs +70 -0
  215. package/src/runtime/agent/orchestrator/session/manager/session-tool-surface.mjs +0 -3
  216. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +18 -4
  217. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-context.mjs +8 -9
  218. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +339 -88
  219. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-recovery.mjs +135 -11
  220. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +377 -104
  221. package/src/runtime/agent/orchestrator/session/manager/turn-durability.mjs +144 -0
  222. package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +48 -30
  223. package/src/runtime/agent/orchestrator/session/manager/turn-reap.mjs +125 -0
  224. package/src/runtime/agent/orchestrator/session/manager/usage-metrics.mjs +4 -0
  225. package/src/runtime/agent/orchestrator/session/manager.mjs +6 -0
  226. package/src/runtime/agent/orchestrator/session/mixy-name.mjs +12 -6
  227. package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +8 -1
  228. package/src/runtime/agent/orchestrator/session/restart-prefix-parity.fixture.mjs +1 -1
  229. package/src/runtime/agent/orchestrator/session/save-session-worker.mjs +5 -1
  230. package/src/runtime/agent/orchestrator/session/store/canonical-reader.mjs +1 -1
  231. package/src/runtime/agent/orchestrator/session/store/liveness-veto.mjs +2 -2
  232. package/src/runtime/agent/orchestrator/session/store/save-worker.mjs +23 -2
  233. package/src/runtime/agent/orchestrator/session/store/sweep/sub-agent-retention.mjs +3 -3
  234. package/src/runtime/agent/orchestrator/session/store/transcript-durability.mjs +88 -0
  235. package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +5 -0
  236. package/src/runtime/agent/orchestrator/session/store-summary-log.mjs +1 -1
  237. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +243 -38
  238. package/src/runtime/agent/orchestrator/session/store-transcript-cache.mjs +163 -64
  239. package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +177 -8
  240. package/src/runtime/agent/orchestrator/session/store-transcript-worker.mjs +142 -18
  241. package/src/runtime/agent/orchestrator/session/store.mjs +5 -0
  242. package/src/runtime/agent/orchestrator/session/synthetic-user-envelope.mjs +7 -1
  243. package/src/runtime/agent/orchestrator/session/tail-reminder-rules.mjs +9 -1
  244. package/src/runtime/agent/orchestrator/session/transcript-restore/agent-envelope.mjs +1 -1
  245. package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +3 -1
  246. package/src/runtime/agent/orchestrator/session/transcript-restore/user-text.mjs +2 -2
  247. package/src/runtime/agent/orchestrator/stall-policy.mjs +3 -5
  248. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/backgrounded-result.mjs +4 -1
  249. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +6 -2
  250. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/misuse-guard.mjs +21 -3
  251. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/result-format.mjs +1 -1
  252. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/worktree-add-guard.mjs +77 -0
  253. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +0 -1
  254. package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +42 -28
  255. package/src/runtime/agent/orchestrator/tools/builtin/git-worktree-tool.mjs +30 -14
  256. package/src/runtime/agent/orchestrator/tools/builtin/lib/search-input-helpers.mjs +2 -2
  257. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +58 -20
  258. package/src/runtime/agent/orchestrator/tools/builtin/read-range-index.mjs +1 -1
  259. package/src/runtime/agent/orchestrator/tools/builtin/read-single-fast-paths.mjs +0 -1
  260. package/src/runtime/agent/orchestrator/tools/builtin/runtime-capabilities.mjs +20 -15
  261. package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +0 -10
  262. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +95 -20
  263. package/src/runtime/agent/orchestrator/tools/builtin/task-tool.mjs +59 -10
  264. package/src/runtime/agent/orchestrator/tools/builtin.mjs +1 -24
  265. package/src/runtime/agent/orchestrator/tools/code-graph/graph-binary/child-kill.mjs +4 -3
  266. package/src/runtime/agent/orchestrator/tools/code-graph/graph-binary.mjs +1 -2
  267. package/src/runtime/agent/orchestrator/tools/code-graph/modes/calls.mjs +1 -1
  268. package/src/runtime/agent/orchestrator/tools/code-graph/modes/symbols.mjs +2 -2
  269. package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +4 -5
  270. package/src/runtime/agent/orchestrator/tools/code-graph/symbol-index.mjs +3 -4
  271. package/src/runtime/agent/orchestrator/tools/code-graph.mjs +4 -22
  272. package/src/runtime/agent/orchestrator/tools/graph-manifest.json +13 -13
  273. package/src/runtime/agent/orchestrator/tools/lib/native-spawn-client.mjs +99 -2
  274. package/src/runtime/agent/orchestrator/tools/lib/owned-shell-trees.mjs +2 -0
  275. package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +105 -15
  276. package/src/runtime/agent/orchestrator/tools/lib/shell-run-background/promote-job.mjs +3 -1
  277. package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +49 -15
  278. package/src/runtime/agent/orchestrator/tools/lib/shell-run-spawn.mjs +45 -27
  279. package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +35 -11
  280. package/src/runtime/agent/orchestrator/tools/lib/shell-warm-standby.mjs +2 -0
  281. package/src/runtime/agent/orchestrator/tools/lib/wait-until-fixture.mjs +26 -0
  282. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +7 -6
  283. package/src/runtime/agent/orchestrator/tools/shell-policy.mjs +0 -1
  284. package/src/runtime/agent/orchestrator/tools/spawn-manifest.json +13 -13
  285. package/src/runtime/attachments/attachment-reference.mjs +1 -1
  286. package/src/runtime/attachments/pdf-extract.mjs +1 -1
  287. package/src/runtime/attachments/store.d.mts +1 -0
  288. package/src/runtime/attachments/store.mjs +2 -2
  289. package/src/runtime/channels/lib/config-reload-watch.mjs +42 -0
  290. package/src/runtime/channels/lib/owned-runtime/config-reload.mjs +29 -9
  291. package/src/runtime/channels/lib/scheduler.mjs +33 -0
  292. package/src/runtime/channels/lib/schedules-db.mjs +11 -4
  293. package/src/runtime/channels/lib/webhook/session-dispatch.mjs +4 -1
  294. package/src/runtime/channels/lib/webhooks-db.mjs +9 -3
  295. package/src/runtime/channels/lib/whisper-port.mjs +19 -10
  296. package/src/runtime/channels/lib/whisper-server.mjs +22 -13
  297. package/src/runtime/channels/lib/worker-main.mjs +9 -31
  298. package/src/runtime/computer-bridge/linux-readiness.mjs +10 -14
  299. package/src/runtime/connectors/connector-accounts-mcp.mjs +372 -103
  300. package/src/runtime/connectors/gmail-app-password.mjs +4 -4
  301. package/src/runtime/connectors/google-mcp.mjs +1 -1
  302. package/src/runtime/effort-judge/judge-client.mjs +2 -2
  303. package/src/runtime/effort-judge/judge-input.mjs +4 -4
  304. package/src/runtime/explore/explorer.mjs +88 -0
  305. package/src/runtime/explore/tool-defs.mjs +35 -0
  306. package/src/runtime/explore/tool.mjs +123 -0
  307. package/src/runtime/local-provider/hardware.mjs +1 -1
  308. package/src/runtime/media/adapters/codex-image.mjs +3 -3
  309. package/src/runtime/media/adapters/gemini-video.mjs +1 -1
  310. package/src/runtime/media/media-usage.mjs +1 -1
  311. package/src/runtime/media/store.mjs +1 -1
  312. package/src/runtime/memory/index.mjs +15 -1
  313. package/src/runtime/memory/lib/embedding-provider.mjs +4 -1
  314. package/src/runtime/memory/lib/embedding-reindex.mjs +27 -0
  315. package/src/runtime/memory/lib/embedding-worker.mjs +4 -0
  316. package/src/runtime/memory/lib/memory-embed.mjs +83 -14
  317. package/src/runtime/memory/lib/memory-process-lock.mjs +159 -36
  318. package/src/runtime/memory/lib/memory-text-utils.mjs +6 -1
  319. package/src/runtime/memory/lib/memory.mjs +17 -0
  320. package/src/runtime/memory/lib/pg/process.mjs +1 -1
  321. package/src/runtime/memory/lib/pg/supervisor.mjs +16 -96
  322. package/src/runtime/memory/lib/recall-hybrid/hybrid-sql.mjs +12 -3
  323. package/src/runtime/office/authoring/docx-html-runner.mjs +1 -1
  324. package/src/runtime/office/authoring/pptx-author-action.mjs +1 -1
  325. package/src/runtime/office/authoring/xlsx-html-build.mjs +1 -1
  326. package/src/runtime/office/authoring/xlsx-html-runner.mjs +1 -1
  327. package/src/runtime/office/capabilities.mjs +1 -1
  328. package/src/runtime/office/core/office-core.mjs +1 -1
  329. package/src/runtime/office/design/content-model.mjs +3 -3
  330. package/src/runtime/office/design/docx/design-docx/section.mjs +6 -6
  331. package/src/runtime/office/design/xlsx/design-xlsx-components.mjs +1 -1
  332. package/src/runtime/office/design/xlsx/design-xlsx.mjs +1 -1
  333. package/src/runtime/office/pdf/ocr-engine.mjs +1 -1
  334. package/src/runtime/office/pdf/pdf-writer.mjs +4 -4
  335. package/src/runtime/office/portable/portable-docx-operations.mjs +2 -2
  336. package/src/runtime/office/portable/portable-soffice.mjs +8 -6
  337. package/src/runtime/office/portable/xlsx-contract.mjs +1 -1
  338. package/src/runtime/office/quality/assurance-structure-docx.mjs +1 -1
  339. package/src/runtime/shared/agent-route-config.mjs +17 -2
  340. package/src/runtime/shared/atomic-file.d.mts +8 -0
  341. package/src/runtime/shared/atomic-file.mjs +103 -2
  342. package/src/runtime/shared/background-tasks.mjs +37 -10
  343. package/src/runtime/shared/background-wait.mjs +66 -0
  344. package/src/runtime/shared/child-guardian.mjs +17 -7
  345. package/src/runtime/shared/config.mjs +313 -16
  346. package/src/runtime/shared/connector-accounts.mjs +5 -5
  347. package/src/runtime/shared/connector-catalog.d.mts +14 -8
  348. package/src/runtime/shared/connector-catalog.mjs +70 -52
  349. package/src/runtime/shared/custom-provider-keys.mjs +20 -0
  350. package/src/runtime/shared/file-has-data.mjs +26 -2
  351. package/src/runtime/shared/file-lock.mjs +21 -18
  352. package/src/runtime/shared/git-launch.d.mts +9 -0
  353. package/src/runtime/shared/git-launch.mjs +213 -0
  354. package/src/runtime/shared/git-runner-worker.mjs +2 -1
  355. package/src/runtime/shared/git-runner.mjs +7 -2
  356. package/src/runtime/shared/idle-gc.mjs +30 -7
  357. package/src/runtime/shared/llm/cost.mjs +6 -1
  358. package/src/runtime/shared/llm/http-agent.mjs +316 -29
  359. package/src/runtime/shared/llm/model-catalog-projection.mjs +3 -2
  360. package/src/runtime/shared/llm/model-catalog.mjs +46 -6
  361. package/src/runtime/shared/llm/provider-catalog-registry.mjs +3 -0
  362. package/src/runtime/shared/llm/system-proxy.mjs +453 -0
  363. package/src/runtime/shared/llm/usage-ledger-quota.mjs +31 -12
  364. package/src/runtime/shared/llm/usage-ledger-rollup.mjs +84 -8
  365. package/src/runtime/shared/llm/usage-ledger.mjs +3 -0
  366. package/src/runtime/shared/llm/usage-rollup.mjs +48 -0
  367. package/src/runtime/shared/maintenance-schedule.mjs +109 -0
  368. package/src/runtime/shared/process-runner.mjs +8 -4
  369. package/src/runtime/shared/provider-accounts.mjs +52 -2
  370. package/src/runtime/shared/routine-trigger.d.mts +13 -0
  371. package/src/runtime/shared/routine-trigger.mjs +34 -0
  372. package/src/runtime/shared/run-child.d.mts +2 -1
  373. package/src/runtime/shared/run-child.mjs +70 -18
  374. package/src/runtime/shared/session-scratch.mjs +14 -2
  375. package/src/runtime/shared/shipped-definitions.mjs +7 -1
  376. package/src/runtime/shared/staged-install-worker.mjs +5 -0
  377. package/src/runtime/shared/staged-update.mjs +47 -2
  378. package/src/runtime/shared/tool-card-model.golden.json +3 -12
  379. package/src/runtime/shared/tool-execution-contract.mjs +2 -0
  380. package/src/runtime/shared/tool-surface.mjs +110 -36
  381. package/src/runtime/shared/tool-work-units.mjs +35 -6
  382. package/src/runtime/shared/turn-snapshot.mjs +26 -4
  383. package/src/runtime/shared/turn-worktree-snapshot.mjs +409 -54
  384. package/src/runtime/shared/worker-requests.mjs +17 -3
  385. package/src/runtime/shared/worktrees/activity-gate.mjs +215 -318
  386. package/src/runtime/shared/worktrees/activity-ledger-worker.mjs +56 -0
  387. package/src/runtime/shared/worktrees/activity-ledger.mjs +391 -0
  388. package/src/runtime/shared/worktrees/branch-management.mjs +5 -3
  389. package/src/runtime/shared/worktrees/contract.mjs +16 -6
  390. package/src/runtime/shared/worktrees/dependencies.mjs +127 -89
  391. package/src/runtime/shared/worktrees/disk.mjs +79 -2
  392. package/src/runtime/shared/worktrees/git.mjs +97 -7
  393. package/src/runtime/shared/worktrees/include.mjs +6 -4
  394. package/src/runtime/shared/worktrees/maintenance.mjs +422 -30
  395. package/src/runtime/shared/worktrees/manager.mjs +962 -197
  396. package/src/runtime/shared/worktrees/settings.mjs +33 -7
  397. package/src/runtime/shared/worktrees/test-support.mjs +5 -1
  398. package/src/runtime/shared/worktrees/worker-snapshots.mjs +82 -0
  399. package/src/runtime/tidy/install.mjs +95 -15
  400. package/src/runtime/tidy/languages.mjs +17 -15
  401. package/src/runtime/tidy/process.mjs +9 -5
  402. package/src/runtime/tidy/resolve.mjs +19 -16
  403. package/src/runtime/tidy/runners/biome.mjs +3 -3
  404. package/src/runtime/tidy/tool.mjs +1 -1
  405. package/src/runtime/tidy/worktree.mjs +10 -6
  406. package/src/runtime/visualize-bridge/client.mjs +4 -1
  407. package/src/runtime/visualize-bridge/tool-defs.mjs +7 -2
  408. package/src/runtime/web-search/index.mjs +4 -23
  409. package/src/runtime/web-search/lib/web-tools.mjs +2 -2
  410. package/src/runtime/web-search/tool-defs.mjs +17 -26
  411. package/src/session-runtime/agent-profile-changes.mjs +55 -4
  412. package/src/session-runtime/agent-task-sessions.mjs +410 -353
  413. package/src/session-runtime/boot/apis.mjs +27 -4
  414. package/src/session-runtime/boot/begin.mjs +2 -0
  415. package/src/session-runtime/boot/config.mjs +10 -1
  416. package/src/session-runtime/boot/facade.mjs +1 -0
  417. package/src/session-runtime/boot/providers.mjs +70 -3
  418. package/src/session-runtime/boot/session.mjs +2 -0
  419. package/src/session-runtime/boot/tools.mjs +71 -25
  420. package/src/session-runtime/bot-status.mjs +103 -103
  421. package/src/session-runtime/channel-config-api.mjs +1 -0
  422. package/src/session-runtime/config-change-effects.mjs +179 -0
  423. package/src/session-runtime/config-lifecycle/config-writers.mjs +1 -0
  424. package/src/session-runtime/config-lifecycle.mjs +160 -24
  425. package/src/session-runtime/connector-merge-migration.mjs +18 -15
  426. package/src/session-runtime/conversation-import/discovery.mjs +245 -47
  427. package/src/session-runtime/conversation-import/service.mjs +12 -5
  428. package/src/session-runtime/goal-facade-api.mjs +49 -3
  429. package/src/session-runtime/handoff-attachments.mjs +1 -1
  430. package/src/session-runtime/held-requests.mjs +3 -1
  431. package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +3 -0
  432. package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +3 -2
  433. package/src/session-runtime/internal-tool-executor/feature-tools.mjs +5 -11
  434. package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +8 -0
  435. package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +161 -120
  436. package/src/session-runtime/internal-tool-executor.mjs +12 -19
  437. package/src/session-runtime/lifecycle/cold-heir.mjs +7 -0
  438. package/src/session-runtime/lifecycle/memory-ingest.mjs +3 -3
  439. package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +53 -5
  440. package/src/session-runtime/lifecycle/session-switch.mjs +13 -2
  441. package/src/session-runtime/lifecycle/teardown/session-close.mjs +10 -5
  442. package/src/session-runtime/lifecycle/teardown.mjs +1 -1
  443. package/src/session-runtime/lifecycle-api.mjs +1 -0
  444. package/src/session-runtime/mcp-glue/server-catalog.mjs +27 -10
  445. package/src/session-runtime/mcp-glue/server-connection.mjs +34 -8
  446. package/src/session-runtime/mcp-glue/server-input.mjs +4 -1
  447. package/src/session-runtime/mixy-heartbeat.mjs +1 -1
  448. package/src/session-runtime/model-route/set-route.mjs +40 -7
  449. package/src/session-runtime/native-web-search/routes.mjs +3 -3
  450. package/src/session-runtime/provider-auth/login.mjs +2 -2
  451. package/src/session-runtime/provider-auth/refresh.mjs +6 -3
  452. package/src/session-runtime/provider-auth/setup.mjs +1 -1
  453. package/src/session-runtime/provider-readiness.mjs +53 -4
  454. package/src/session-runtime/resource-api.mjs +1 -1
  455. package/src/session-runtime/resource-extension-sync.mjs +4 -8
  456. package/src/session-runtime/resource-mcp-api.mjs +98 -35
  457. package/src/session-runtime/resource-mcp-connector-accounts.mjs +49 -32
  458. package/src/session-runtime/resource-mcp-secrets.mjs +27 -10
  459. package/src/session-runtime/resource-mcp-servers.mjs +5 -4
  460. package/src/session-runtime/resource-plugins-api.mjs +4 -0
  461. package/src/session-runtime/routine-executor.mjs +152 -0
  462. package/src/session-runtime/routine-home-turn.mjs +46 -5
  463. package/src/session-runtime/runtime-facade.mjs +5 -0
  464. package/src/session-runtime/runtime-feature-gates.mjs +2 -11
  465. package/src/session-runtime/schedule-session-run.mjs +1 -0
  466. package/src/session-runtime/services/agent-tool/job-task-reconcile.mjs +6 -1
  467. package/src/session-runtime/services/agent-tool/job-views/session-progress.mjs +7 -0
  468. package/src/session-runtime/services/agent-tool/send-flow.mjs +120 -8
  469. package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +12 -0
  470. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-plan.mjs +5 -0
  471. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +8 -3
  472. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +28 -7
  473. package/src/session-runtime/services/agent-tool.mjs +51 -1
  474. package/src/session-runtime/services/agent-watchdog-registry.mjs +32 -4
  475. package/src/session-runtime/services/channel-admin.mjs +18 -0
  476. package/src/session-runtime/services/channel-worker/daemon-spawn.mjs +2 -0
  477. package/src/session-runtime/services/daemon-candidate.mjs +4 -1
  478. package/src/session-runtime/services/hook-bus/command-handler.mjs +7 -11
  479. package/src/session-runtime/services/memory-runtime-proxy/daemon-spawn.mjs +4 -0
  480. package/src/session-runtime/services/plugin-admin.mjs +14 -6
  481. package/src/session-runtime/services/provider-admin.mjs +281 -10
  482. package/src/session-runtime/services/seeds.mjs +7 -0
  483. package/src/session-runtime/services/usage-stats-model.mjs +32 -11
  484. package/src/session-runtime/session-create/materialize.mjs +4 -2
  485. package/src/session-runtime/session-create/session-options.mjs +2 -0
  486. package/src/session-runtime/session-turn-api.mjs +2 -0
  487. package/src/session-runtime/settings-builtin-tools-api.mjs +5 -10
  488. package/src/session-runtime/settings-system-api.mjs +1 -1
  489. package/src/session-runtime/setup-tool/agent-settings-actions.mjs +13 -3
  490. package/src/session-runtime/setup-tool/connector-widen-approval.mjs +96 -0
  491. package/src/session-runtime/setup-tool/executor.mjs +14 -3
  492. package/src/session-runtime/setup-tool/extended-actions.mjs +2 -0
  493. package/src/session-runtime/setup-tool/settings-contract.mjs +28 -0
  494. package/src/session-runtime/setup-tool/tool-defs.mjs +28 -2
  495. package/src/session-runtime/tool-policy/agent-profile-fold.mjs +40 -43
  496. package/src/session-runtime/tool-policy/mode-switch.mjs +1 -1
  497. package/src/session-runtime/tool-policy/policy-stage.mjs +106 -8
  498. package/src/session-runtime/tool-policy/workflow-overlay.mjs +2 -1
  499. package/src/session-runtime/tool-policy-refresh.mjs +182 -5
  500. package/src/session-runtime/tool-surface.mjs +38 -1
  501. package/src/session-runtime/turn/agent-ops.mjs +33 -2
  502. package/src/session-runtime/turn/session-ops.mjs +2 -0
  503. package/src/session-runtime/turn/turn-run/turn-prepare.mjs +5 -0
  504. package/src/session-runtime/turn/turn-run.mjs +1 -1
  505. package/src/session-runtime/webhook-session-run.mjs +2 -0
  506. package/src/session-runtime/workflow-agents-api/agent-connectors.mjs +46 -11
  507. package/src/session-runtime/workflow-agents-api/agent-route.mjs +2 -0
  508. package/src/session-runtime/workflow-agents-api/instruction-files.mjs +165 -0
  509. package/src/session-runtime/workflow-agents-api/style-and-mode.mjs +5 -4
  510. package/src/session-runtime/workflow-agents-api/workflow-packs.mjs +2 -3
  511. package/src/session-runtime/workflow-agents-api.mjs +2 -0
  512. package/src/session-runtime/workspace/activity-guards.mjs +176 -0
  513. package/src/session-runtime/workspace/project-branches.mjs +1 -1
  514. package/src/session-runtime/workspace/session-view.mjs +149 -0
  515. package/src/session-runtime/workspace/side-checkouts.mjs +203 -0
  516. package/src/session-runtime/workspace/transition-runner.mjs +188 -0
  517. package/src/session-runtime/workspace/transitions.mjs +128 -1070
  518. package/src/session-runtime/workspace/workspace-merge.mjs +132 -0
  519. package/src/session-runtime/workspace/worktree-intents.mjs +242 -0
  520. package/src/session-runtime/workspace/worktree-maintenance.mjs +200 -0
  521. package/src/session-runtime/workspace/worktree-setup.mjs +97 -0
  522. package/src/session-runtime/workspace/worktree-tool.mjs +70 -54
  523. package/src/standalone/daemon-agent-control.mjs +25 -8
  524. package/src/standalone/daemon-desktop-runtime.mjs +8 -2
  525. package/src/standalone/daemon-lag-profiler.mjs +7 -7
  526. package/src/standalone/daemon-session-control.mjs +151 -136
  527. package/src/standalone/daemon.mjs +61 -2
  528. package/src/standalone/desktop-service-registry.mjs +9 -0
  529. package/src/standalone/local-session-runtime.mjs +21 -1
  530. package/src/standalone/session-client/daemon-unavailable.mjs +4 -1
  531. package/src/standalone/session-client.mjs +5 -1
  532. package/src/standalone/session-frame-stream.mjs +83 -11
  533. package/src/standalone/session-protocol.mjs +15 -0
  534. package/src/standalone/session-service/agent-route-follow.mjs +23 -20
  535. package/src/standalone/session-service/agent-tree/agent-turns.mjs +18 -6
  536. package/src/standalone/session-service/agent-tree.mjs +45 -9
  537. package/src/standalone/session-service/projection/transcript-window.mjs +700 -64
  538. package/src/standalone/session-service/quota-resume.mjs +9 -0
  539. package/src/standalone/session-service/session-calls/session-action.mjs +51 -1
  540. package/src/standalone/session-service/session-calls/session-turns.mjs +37 -18
  541. package/src/standalone/session-service/session-calls/session-views.mjs +160 -104
  542. package/src/standalone/session-service/session-calls/turn-gate.mjs +34 -0
  543. package/src/standalone/session-service/session-calls.mjs +2 -1
  544. package/src/standalone/session-service/stored-reader.mjs +127 -40
  545. package/src/tui/App.jsx +162 -164
  546. package/src/tui/app/app-view/floating-panel.jsx +3 -0
  547. package/src/tui/app/app-view/text-entry-labels.mjs +1 -0
  548. package/src/tui/app/clipboard.mjs +22 -11
  549. package/src/tui/app/create-app-pickers.mjs +2 -0
  550. package/src/tui/app/doctor.mjs +2 -2
  551. package/src/tui/app/panel-signature.mjs +1 -1
  552. package/src/tui/app/prompt-handlers/use-prompt-history-nav.mjs +1 -1
  553. package/src/tui/app/prompt-handlers/use-prompt-interrupt.mjs +3 -0
  554. package/src/tui/app/prompt-submit/provider-prompts.mjs +3 -1
  555. package/src/tui/app/provider-setup/api-key-actions.mjs +31 -1
  556. package/src/tui/app/provider-setup/oauth-actions.mjs +25 -6
  557. package/src/tui/app/provider-setup-picker.mjs +20 -13
  558. package/src/tui/app/settings-picker.mjs +53 -8
  559. package/src/tui/app/shell-layout/row-budgets.mjs +14 -12
  560. package/src/tui/app/slash-commands.mjs +2 -1
  561. package/src/tui/app/slash-dispatch/route-commands.mjs +1 -1
  562. package/src/tui/app/slash-dispatch/session-commands.mjs +47 -1
  563. package/src/tui/app/slash-dispatch.mjs +1 -1
  564. package/src/tui/app/use-btw-panel.mjs +29 -0
  565. package/src/tui/app/use-context-panel-refresh.mjs +31 -0
  566. package/src/tui/app/use-model-catalog-cache.mjs +13 -10
  567. package/src/tui/app/use-mouse-input.mjs +11 -0
  568. package/src/tui/app/use-onboarding-start.mjs +8 -3
  569. package/src/tui/app/use-panel-transition.mjs +10 -1
  570. package/src/tui/app/use-pasted-buffers.mjs +28 -20
  571. package/src/tui/app/use-prompt-draft-flow.mjs +7 -0
  572. package/src/tui/app/use-prompt-layout-rows.mjs +3 -3
  573. package/src/tui/app/use-prompt-queue-history.mjs +5 -4
  574. package/src/tui/app/use-selection-focus.mjs +11 -2
  575. package/src/tui/app/use-selection-geometry.mjs +18 -9
  576. package/src/tui/app/use-selection-paint.mjs +4 -4
  577. package/src/tui/app/use-selection-stitch.mjs +3 -3
  578. package/src/tui/app/use-slash-palette.mjs +62 -0
  579. package/src/tui/app/use-terminal-chrome.mjs +2 -2
  580. package/src/tui/app/use-transcript-activity.mjs +48 -33
  581. package/src/tui/app/use-transcript-follow.mjs +12 -4
  582. package/src/tui/app/use-transcript-scroll.mjs +46 -17
  583. package/src/tui/app/use-transcript-swap-reset.mjs +27 -0
  584. package/src/tui/app/use-transcript-window/geometry.mjs +20 -6
  585. package/src/tui/app/use-transcript-window/instance-state.mjs +4 -0
  586. package/src/tui/app/use-transcript-window/selection-shift.mjs +5 -1
  587. package/src/tui/app/use-transcript-window.mjs +21 -11
  588. package/src/tui/app/use-tui-ready.mjs +18 -0
  589. package/src/tui/app/use-welcome-prompt-hint.mjs +5 -0
  590. package/src/tui/app/use-workflow-tab-cycle.mjs +5 -3
  591. package/src/tui/components/Picker.jsx +27 -3
  592. package/src/tui/components/SignInUrl.jsx +68 -0
  593. package/src/tui/components/TextEntryPanel.jsx +76 -46
  594. package/src/tui/components/prompt-input/escape-policy.d.mts +0 -1
  595. package/src/tui/components/prompt-input/escape-policy.mjs +1 -1
  596. package/src/tui/components/question-panel-model.mjs +4 -4
  597. package/src/tui/components/sign-in-url-layout.mjs +24 -0
  598. package/src/tui/components/tool-execution/standard-card.jsx +3 -4
  599. package/src/tui/components/user-message-skills.mjs +1 -1
  600. package/src/tui/dist/index.mjs +2205 -1371
  601. package/src/tui/markdown/render-ansi.mjs +1 -1
  602. package/src/tui/session/agent-job-feed/notification-router.mjs +10 -0
  603. package/src/tui/session/agent-job-feed.mjs +2 -0
  604. package/src/tui/session/context-state.mjs +3 -0
  605. package/src/tui/session/goal-turn-state.mjs +6 -2
  606. package/src/tui/session/quota-resume.mjs +1 -1
  607. package/src/tui/session/session-api/controls.mjs +4 -0
  608. package/src/tui/session/session-api/extensions.mjs +8 -0
  609. package/src/tui/session/session-api/intake/abort.mjs +2 -1
  610. package/src/tui/session/session-api/intake.mjs +2 -0
  611. package/src/tui/session/session-api/integrations.mjs +2 -2
  612. package/src/tui/session/session-api/lifecycle/dispose.mjs +1 -0
  613. package/src/tui/session/session-api/lifecycle/session-reset.mjs +7 -0
  614. package/src/tui/session/session-api/routes-agent-definitions.mjs +6 -0
  615. package/src/tui/session/session-api/settings.mjs +2 -2
  616. package/src/tui/session/session-api/worktree.mjs +13 -1
  617. package/src/tui/session/session-flow/drain.mjs +11 -14
  618. package/src/tui/session/tool-card-results/grouped-result.mjs +2 -2
  619. package/src/tui/session/transcript-spill/spill-writer.mjs +15 -0
  620. package/src/tui/session/transcript-spill.mjs +92 -4
  621. package/src/tui/session/transcript-store.mjs +2 -0
  622. package/src/tui/session/turn-quiet.mjs +1 -1
  623. package/src/tui/session/turn.mjs +3 -0
  624. package/src/tui/session/worktree-setup-notice.mjs +1 -1
  625. package/src/tui/spinner-meta.mjs +3 -3
  626. package/src/tui/spinner-verbs.mjs +2 -2
  627. package/src/defaults/skills/goal-management/SKILL.md +0 -169
  628. package/src/defaults/skills/skill-creator/references/source-review.md +0 -94
  629. package/src/runtime/agent/orchestrator/runtime-core/goal-tasks.mjs +0 -156
  630. package/src/session-runtime/goal-tasks.mjs +0 -1
@@ -1,16 +1,25 @@
1
1
  // Per-session scratch directory under Mixdog's data directory. Processes the
2
2
  // `shell` tool starts see it as TEMP/TMP/TMPDIR, so scratch files never land in
3
3
  // the project, and it is removed with its session (session-delete.mjs).
4
+ import { createHash } from 'node:crypto';
4
5
  import { mkdirSync, rmSync } from 'node:fs';
5
6
  import { join } from 'node:path';
6
7
  import { resolvePluginData } from './plugin-paths.mjs';
7
8
 
8
9
  const SESSION_ID = /^[A-Za-z0-9_-]+$/;
9
10
 
11
+ // The folder is named by a short digest of the id, not the id itself: a desktop
12
+ // session id is 77 characters, and a TEMP that long leaves too little of
13
+ // Windows' 260-character path limit for what runs under it (Git refuses a
14
+ // $GIT_DIR over 220 characters, LibreOffice crashes on a profile past ~150).
15
+ // The "." is a character no session id has, so no id's legacy folder (named
16
+ // after the id itself) can ever be another session's digest folder.
17
+ const scratchName = (id) => `s.${createHash('sha256').update(id).digest('hex').slice(0, 16)}`;
18
+
10
19
  /** The session's scratch path (not created), or '' for an unusable id. */
11
20
  export function sessionScratchDir(sessionId) {
12
21
  const id = typeof sessionId === 'string' ? sessionId : '';
13
- return SESSION_ID.test(id) ? join(resolvePluginData(), 'scratch', id) : '';
22
+ return SESSION_ID.test(id) ? join(resolvePluginData(), 'scratch', scratchName(id)) : '';
14
23
  }
15
24
 
16
25
  /** Create the session's scratch directory if absent; returns its path ('' without a session id). */
@@ -22,7 +31,10 @@ export function ensureSessionScratchDir(sessionId) {
22
31
 
23
32
  export function removeSessionScratchDir(sessionId) {
24
33
  const dir = sessionScratchDir(sessionId);
25
- if (dir) rmSync(dir, { recursive: true, force: true });
34
+ if (!dir) return;
35
+ rmSync(dir, { recursive: true, force: true });
36
+ // Earlier versions named the folder after the full id.
37
+ rmSync(join(resolvePluginData(), 'scratch', sessionId), { recursive: true, force: true });
26
38
  }
27
39
 
28
40
  /** Point an env's temp variables at the session's scratch directory. */
@@ -9,7 +9,13 @@ import { dirname, join, relative } from 'node:path';
9
9
  import { readMarkdownDocument } from './markdown-frontmatter.mjs';
10
10
 
11
11
  export const SHIPPED_HISTORY_FILE = ['defaults', 'shipped-history.json'];
12
- export const EMPTY_HISTORY = Object.freeze({ agents: {}, workflows: {}, outputStyles: {}, skills: {} });
12
+ export const EMPTY_HISTORY = Object.freeze({
13
+ agents: {},
14
+ workflows: {},
15
+ outputStyles: {},
16
+ orchestration: {},
17
+ skills: {},
18
+ });
13
19
 
14
20
  // Leftovers from hand edits or editors that never belong to a definition.
15
21
  const IGNORABLE_STRAY = /(\.(bak|orig|tmp)|~)$/i;
@@ -6,8 +6,13 @@
6
6
  * quitting mid-install. Does its work and exits; the swap happens on a later
7
7
  * clean launch via performPendingSwap().
8
8
  */
9
+ import { adoptSystemProxy } from './llm/system-proxy.mjs';
9
10
  import { runStagedInstall } from './staged-update.mjs';
10
11
 
12
+ // Consume the system proxy handed over by the launcher (removing it from this
13
+ // env); only the npm install below receives it, as npm settings.
14
+ adoptSystemProxy();
15
+
11
16
  const version = process.argv[2] || process.env.MIXDOG_STAGE_VERSION || '';
12
17
  runStagedInstall(version)
13
18
  .then((r) => process.exit(r?.ok || r?.alreadyStaged || r?.inProgress ? 0 : 1))
@@ -46,6 +46,7 @@ import { dirname, basename, join } from 'node:path';
46
46
  import { fileURLToPath } from 'node:url';
47
47
  import { spawn } from 'node:child_process';
48
48
  import { resolvePluginData } from './plugin-paths.mjs';
49
+ import { systemProxyHandoffEnv, systemProxyNpmEnv } from './llm/system-proxy.mjs';
49
50
  // Same probe every discovery/lock reader uses; `process.pid` is trivially alive.
50
51
  import { isPidAlive as pidAlive } from './pid-liveness.mjs';
51
52
  import { sleepSync } from './sleep.mjs';
@@ -222,6 +223,38 @@ function releaseStagingLock(verDir) {
222
223
  }
223
224
  }
224
225
 
226
+ const DEFAULT_NPM_REGISTRY = 'https://registry.npmjs.org/';
227
+
228
+ /** The registry npm installs from (its .npmrc files included); npm's default when npm cannot say. */
229
+ function npmRegistry(cliJs) {
230
+ return new Promise((resolve) => {
231
+ let out = '';
232
+ let child;
233
+ try {
234
+ child = spawn(process.execPath, [cliJs, 'config', 'get', 'registry'], {
235
+ stdio: ['ignore', 'pipe', 'ignore'],
236
+ shell: false,
237
+ timeout: 10_000,
238
+ ...hiddenSpawnOpts,
239
+ });
240
+ } catch {
241
+ resolve(DEFAULT_NPM_REGISTRY);
242
+ return;
243
+ }
244
+ child.stdout?.on('data', (chunk) => {
245
+ out += chunk;
246
+ });
247
+ child.once('error', () => resolve(DEFAULT_NPM_REGISTRY));
248
+ child.once('close', (code) => {
249
+ try {
250
+ resolve(code === 0 ? new URL(out.trim()).href : DEFAULT_NPM_REGISTRY);
251
+ } catch {
252
+ resolve(DEFAULT_NPM_REGISTRY);
253
+ }
254
+ });
255
+ });
256
+ }
257
+
225
258
  /**
226
259
  * runStagedInstall(version) — perform the full staging install for one version
227
260
  * into ~/.mixdog/data/staging/<version>. Runs to completion (awaits the npm
@@ -259,10 +292,17 @@ export async function runStagedInstall(version) {
259
292
  // shell spawn (AV constraint — no shell spawns).
260
293
  const cliJs = npmCliJsPath();
261
294
  if (!cliJs) return { ok: false, error: 'npm-cli.js unresolved — staging skipped' };
295
+ // The system proxy of npm's registry, as npm's own settings for this one install.
296
+ const npmProxyEnv = await systemProxyNpmEnv(() => npmRegistry(cliJs));
262
297
  const code = await new Promise((res) => {
263
298
  let child;
264
299
  try {
265
- child = spawn(process.execPath, [cliJs, ...installArgs], { stdio: 'ignore', shell: false, ...hiddenSpawnOpts });
300
+ child = spawn(process.execPath, [cliJs, ...installArgs], {
301
+ stdio: 'ignore',
302
+ shell: false,
303
+ env: { ...process.env, ...npmProxyEnv },
304
+ ...hiddenSpawnOpts,
305
+ });
266
306
  } catch {
267
307
  res(-1);
268
308
  return;
@@ -319,7 +359,12 @@ export function spawnStagedInstall(version) {
319
359
  if (isStagedComplete(v)) return false;
320
360
  try {
321
361
  const worker = join(_MODULE_DIR, 'staged-install-worker.mjs');
322
- const child = spawn(process.execPath, [worker, v], { stdio: 'ignore', ...detachedSpawnOpts });
362
+ // The worker gets the system proxy decision privately (it consumes it).
363
+ const child = spawn(process.execPath, [worker, v], {
364
+ stdio: 'ignore',
365
+ env: { ...process.env, ...systemProxyHandoffEnv() },
366
+ ...detachedSpawnOpts,
367
+ });
323
368
  child.once?.('error', () => {});
324
369
  child.unref?.();
325
370
  return true;
@@ -513,10 +513,7 @@
513
513
  "normalizedName": "load_tool",
514
514
  "label": "Load Tools",
515
515
  "parsedArgs": {
516
- "names": [
517
- "office",
518
- "media"
519
- ]
516
+ "names": ["office", "media"]
520
517
  },
521
518
  "isShellSurface": false,
522
519
  "isSkillSurface": false,
@@ -752,10 +749,7 @@
752
749
  "normalizedName": "",
753
750
  "label": "",
754
751
  "parsedArgs": {
755
- "categoryOrder": [
756
- "read",
757
- "search"
758
- ]
752
+ "categoryOrder": ["read", "search"]
759
753
  },
760
754
  "isShellSurface": false,
761
755
  "isSkillSurface": false,
@@ -825,10 +819,7 @@
825
819
  "normalizedName": "",
826
820
  "label": "",
827
821
  "parsedArgs": {
828
- "loadingTargets": [
829
- "office",
830
- "media"
831
- ]
822
+ "loadingTargets": ["office", "media"]
832
823
  },
833
824
  "isShellSurface": false,
834
825
  "isSkillSurface": false,
@@ -193,6 +193,8 @@ const TRANSCRIPT_HIDDEN_CONTROL_TOOL_NAMES = new Set([
193
193
  'get_goal',
194
194
  'set_goal_tasks',
195
195
  'update_goal',
196
+ // The step list shows in its own composer panel, not as transcript cards.
197
+ 'todo',
196
198
  'load_tool',
197
199
  'tool_search',
198
200
  // A bot's reaction shows as its emoji under the user's message, not as a card.
@@ -83,7 +83,7 @@ export function isTaskWaitToolCall(name, args = {}) {
83
83
  );
84
84
  }
85
85
 
86
- export function displayToolName(name, args = {}) {
86
+ function displayToolName(name, args = {}) {
87
87
  if (isExternalMcpToolName(name)) {
88
88
  const mcp = parseMcpToolName(name);
89
89
  return `MCP ${titleCaseMcpServer(mcp.server)}`;
@@ -127,6 +127,8 @@ export function displayToolName(name, args = {}) {
127
127
  case 'web_fetch':
128
128
  case 'fetch':
129
129
  return 'Fetch';
130
+ case 'explore':
131
+ return 'Explore';
130
132
  case 'browser':
131
133
  case 'browser_devtools':
132
134
  return 'Browser';
@@ -213,18 +215,14 @@ export function summarizeToolArgs(name, args, { max = DEFAULT_SUMMARY_MAX } = {}
213
215
  }
214
216
  switch (normalized) {
215
217
  case 'read':
216
- if (!a.path && !a.file_path) return '';
217
- if (Array.isArray(a.path) || Array.isArray(a.file_path)) {
218
- return formatCountedUnit(collectionCount(a.path, a.file_path), 'file');
219
- }
220
- return compactParts([
221
- displayToolPath(a.path ?? a.file_path),
222
- a.pages ? `pages ${a.pages}` : summarizeLineWindow(a),
223
- ]);
224
218
  case 'view_image':
225
- return displayToolPath(a.path || a.file_path || '');
226
219
  case 'apply_patch':
227
- return summarizePatch(a.patch, a.base_path);
220
+ case 'list':
221
+ case 'ls':
222
+ case 'grep':
223
+ case 'glob':
224
+ case 'find':
225
+ return summarizeFileToolArgs(normalized, a, max);
228
226
  case 'shell':
229
227
  case 'bash':
230
228
  case 'bash_session':
@@ -250,6 +248,82 @@ export function summarizeToolArgs(name, args, { max = DEFAULT_SUMMARY_MAX } = {}
250
248
  .join(', '),
251
249
  max
252
250
  );
251
+ case 'search_query':
252
+ case 'image_query':
253
+ case 'web_search':
254
+ case 'web_search_call':
255
+ case 'load_tool':
256
+ case 'web_fetch':
257
+ case 'fetch':
258
+ return summarizeWebToolArgs(normalized, a, max);
259
+ case 'browser':
260
+ case 'browser_devtools':
261
+ case 'computer':
262
+ case 'terminal':
263
+ case 'visualize':
264
+ case 'office':
265
+ case 'media':
266
+ case 'tidy':
267
+ return summarizeInterfaceToolArgs(normalized, a, args, max);
268
+ case 'explore':
269
+ if (Array.isArray(a.query)) return formatCountedUnit(collectionCount(a.query), 'query', 'queries');
270
+ return truncateToolText(a.query || '', Math.min(max, 80));
271
+ case 'read_mcp_resource':
272
+ return truncateToolText(a.uri || '', max);
273
+ case 'list_mcp_resources':
274
+ case 'list_mcp_resource_templates':
275
+ return a.server ? `server "${truncateToolText(a.server, max)}"` : 'all servers';
276
+ case 'cwd':
277
+ case 'session':
278
+ case 'setup':
279
+ case 'memory':
280
+ case 'remember':
281
+ case 'save_memory':
282
+ case 'update_memory':
283
+ case 'recall_memory':
284
+ case 'recall':
285
+ case 'search_memories':
286
+ return summarizeStateToolArgs(normalized, a, max);
287
+ case 'bridge':
288
+ case 'agent': {
289
+ const agentModel = bridgeAgentModelSummary(a);
290
+ if (agentModel) return agentModel;
291
+ const bridgeAction = a.type || a.action || a.mode || '';
292
+ const showTarget = !/^(status|read)$/i.test(String(bridgeAction || ''));
293
+ return compactParts([bridgeAction, showTarget ? a.tag || a.sessionId || a.task_id || '' : '']);
294
+ }
295
+ case 'code_graph':
296
+ return codeGraphSummary(a, max);
297
+ case 'skill':
298
+ case 'skill_execute':
299
+ case 'skill_view':
300
+ case 'skills_list':
301
+ case 'use_skill':
302
+ return truncateToolText(
303
+ firstText(a.name, a.skill, a.skill_name, a.query, a.q, normalized === 'skills_list' ? 'all skills' : ''),
304
+ max
305
+ );
306
+ default:
307
+ return genericArgsSummary(a, max);
308
+ }
309
+ }
310
+
311
+ // Files, directories and patches.
312
+ function summarizeFileToolArgs(normalized, a, max) {
313
+ switch (normalized) {
314
+ case 'read':
315
+ if (!a.path && !a.file_path) return '';
316
+ if (Array.isArray(a.path) || Array.isArray(a.file_path)) {
317
+ return formatCountedUnit(collectionCount(a.path, a.file_path), 'file');
318
+ }
319
+ return compactParts([
320
+ displayToolPath(a.path ?? a.file_path),
321
+ a.pages ? `pages ${a.pages}` : summarizeLineWindow(a),
322
+ ]);
323
+ case 'view_image':
324
+ return displayToolPath(a.path || a.file_path || '');
325
+ case 'apply_patch':
326
+ return summarizePatch(a.patch, a.base_path);
253
327
  case 'list':
254
328
  case 'ls':
255
329
  if (Array.isArray(a.path) || Array.isArray(a.dir) || Array.isArray(a.cwd)) {
@@ -284,6 +358,14 @@ export function summarizeToolArgs(name, args, { max = DEFAULT_SUMMARY_MAX } = {}
284
358
  return formatCountedUnit(collectionCount(a.query, a.fuzzy), 'query', 'queries');
285
359
  }
286
360
  return compactParts([quoted(a.query ?? a.fuzzy, max), a.path ? `path: ${displayToolPath(a.path)}` : '']);
361
+ default:
362
+ return '';
363
+ }
364
+ }
365
+
366
+ // Search, fetch and tool-search loading.
367
+ function summarizeWebToolArgs(normalized, a, max) {
368
+ switch (normalized) {
287
369
  case 'search_query':
288
370
  case 'image_query':
289
371
  case 'web_search':
@@ -303,6 +385,14 @@ export function summarizeToolArgs(name, args, { max = DEFAULT_SUMMARY_MAX } = {}
303
385
  return formatCountedUnit(collectionCount(a.url, a.uri), 'URL', 'URLs');
304
386
  }
305
387
  return truncateToolText(a.url || a.uri || '', max);
388
+ default:
389
+ return '';
390
+ }
391
+ }
392
+
393
+ // Bridge and interface tools: browser, computer, terminal, visualize, office, media, tidy.
394
+ function summarizeInterfaceToolArgs(normalized, a, args, max) {
395
+ switch (normalized) {
306
396
  case 'browser':
307
397
  case 'browser_devtools': {
308
398
  const call = bridgeToolCall(args);
@@ -342,11 +432,14 @@ export function summarizeToolArgs(name, args, { max = DEFAULT_SUMMARY_MAX } = {}
342
432
  Array.isArray(a.paths) && a.paths.length ? truncateToolText(a.paths.join(' '), max) : '',
343
433
  a.apply === true ? 'apply' : '',
344
434
  ]);
345
- case 'read_mcp_resource':
346
- return truncateToolText(a.uri || '', max);
347
- case 'list_mcp_resources':
348
- case 'list_mcp_resource_templates':
349
- return a.server ? `server "${truncateToolText(a.server, max)}"` : 'all servers';
435
+ default:
436
+ return '';
437
+ }
438
+ }
439
+
440
+ // Sessions, setup and memory.
441
+ function summarizeStateToolArgs(normalized, a, max) {
442
+ switch (normalized) {
350
443
  case 'cwd': // legacy: old transcripts
351
444
  case 'session':
352
445
  return compactParts([
@@ -396,27 +489,8 @@ export function summarizeToolArgs(name, args, { max = DEFAULT_SUMMARY_MAX } = {}
396
489
  a.limit || a.topK ? `top ${a.limit ?? a.topK}` : '',
397
490
  ]);
398
491
  }
399
- case 'bridge':
400
- case 'agent': {
401
- const agentModel = bridgeAgentModelSummary(a);
402
- if (agentModel) return agentModel;
403
- const bridgeAction = a.type || a.action || a.mode || '';
404
- const showTarget = !/^(status|read)$/i.test(String(bridgeAction || ''));
405
- return compactParts([bridgeAction, showTarget ? a.tag || a.sessionId || a.task_id || '' : '']);
406
- }
407
- case 'code_graph':
408
- return codeGraphSummary(a, max);
409
- case 'skill':
410
- case 'skill_execute':
411
- case 'skill_view':
412
- case 'skills_list':
413
- case 'use_skill':
414
- return truncateToolText(
415
- firstText(a.name, a.skill, a.skill_name, a.query, a.q, normalized === 'skills_list' ? 'all skills' : ''),
416
- max
417
- );
418
492
  default:
419
- return genericArgsSummary(a, max);
493
+ return '';
420
494
  }
421
495
  }
422
496
 
@@ -20,6 +20,7 @@ export const CATEGORY_ORDER = [
20
20
  'Skill',
21
21
  'Web Research',
22
22
  'Memory',
23
+ 'Explore',
23
24
  'Patch',
24
25
  'Git',
25
26
  'Shell',
@@ -58,6 +59,7 @@ const TOOL_CATEGORY = new Map([
58
59
  ['save_memory', 'Memory'],
59
60
  ['update_memory', 'Memory'],
60
61
  ['memory', 'Memory'],
62
+ ['explore', 'Explore'],
61
63
  ['apply_patch', 'Patch'],
62
64
  ['edit', 'Patch'],
63
65
  ['strreplace', 'Patch'],
@@ -116,6 +118,7 @@ const CATEGORY_COPY = new Map([
116
118
  ['Skill', { active: 'Loading', done: 'Loaded', noun: 'skill' }],
117
119
  ['Web Research', { active: 'Researching', done: 'Researched', noun: 'query', pluralNoun: 'queries' }],
118
120
  ['Memory', { active: 'Checking', done: 'Checked', noun: 'memory item' }],
121
+ ['Explore', { active: 'Exploring', done: 'Explored', noun: 'query', pluralNoun: 'queries' }],
119
122
  ['Patch', { active: 'Editing', done: 'Edited', noun: 'file' }],
120
123
  ['Git', { active: 'Running', done: 'Ran', noun: 'Git command' }],
121
124
  ['Shell', { active: 'Running', done: 'Ran', noun: 'command' }],
@@ -417,13 +420,8 @@ function goalUnit(a) {
417
420
  const verbs = {
418
421
  status: ['Checking', 'Checked'],
419
422
  create: ['Creating', 'Created'],
420
- pause: ['Pausing', 'Paused'],
421
- resume: ['Resuming', 'Resumed'],
422
- set_tasks: ['Planning', 'Planned'],
423
- update_tasks: ['Updating', 'Updated'],
424
423
  complete: ['Completing', 'Completed'],
425
424
  block: ['Blocking', 'Blocked'],
426
- abandon: ['Abandoning', 'Abandoned'],
427
425
  }[action] || ['Updating', 'Updated'];
428
426
  return unitDescriptor('Setup', {
429
427
  count: 1,
@@ -523,6 +521,14 @@ function agentUnit(a) {
523
521
  if (/^(?:status|read|list)$/.test(type)) {
524
522
  return unitDescriptor('Agent', { count, active: 'Checking', done: 'Checked', noun: 'agent' });
525
523
  }
524
+ // Stopping an agent is not calling it, and ending a finished agent's
525
+ // session (close) is not cancelling its work.
526
+ if (type === 'cancel') {
527
+ return unitDescriptor('Agent', { count, active: 'Cancelling', done: 'Cancelled', noun: 'agent', effect: true });
528
+ }
529
+ if (type === 'close') {
530
+ return unitDescriptor('Agent', { count, active: 'Ending', done: 'Ended', noun: 'agent', effect: true });
531
+ }
526
532
  return unitDescriptor('Agent', { count, noun: 'agent' });
527
533
  }
528
534
 
@@ -625,6 +631,28 @@ function cwdUnit(a) {
625
631
  });
626
632
  }
627
633
 
634
+ /** The `session` tool: its session actions are about sessions, not the legacy
635
+ * `cwd` tool's working directory (which cwdUnit's fallback names). */
636
+ function sessionUnit(a) {
637
+ const action = String(a.action || a.type || '').toLowerCase();
638
+ if (action === 'create') {
639
+ return unitDescriptor('Setup', { active: 'Creating', done: 'Created', noun: 'session', effect: true });
640
+ }
641
+ if (action === 'send') {
642
+ return unitDescriptor('Setup', { active: 'Sending to', done: 'Sent to', noun: 'session', effect: true });
643
+ }
644
+ if (action === 'cancel') {
645
+ return unitDescriptor('Setup', { active: 'Cancelling', done: 'Cancelled', noun: 'session', effect: true });
646
+ }
647
+ if (action === 'delete') {
648
+ return unitDescriptor('Setup', { active: 'Deleting', done: 'Deleted', noun: 'session', effect: true });
649
+ }
650
+ if (/^(?:list|bots|read|suggest)$/.test(action)) {
651
+ return unitDescriptor('Setup', { active: 'Checking', done: 'Checked', noun: 'session' });
652
+ }
653
+ return cwdUnit(a);
654
+ }
655
+
628
656
  const TOOL_UNITS = new Map([
629
657
  [
630
658
  'read',
@@ -689,6 +717,7 @@ const TOOL_UNITS = new Map([
689
717
  pluralNoun: 'URLs',
690
718
  }),
691
719
  ],
720
+ ['explore', (a) => unitDescriptor('Explore', { count: queryCount(a, 'query') || 1 })],
692
721
  ['browser', browserUnit],
693
722
  ['browser_devtools', browserUnit],
694
723
  ['computer', () => unitDescriptor('Computer', { count: 1, active: 'Operating', done: 'Operated', noun: 'action' })],
@@ -743,7 +772,7 @@ const TOOL_UNITS = new Map([
743
772
  () => unitDescriptor('Setup', { active: 'Listing', done: 'Listed', noun: 'MCP resource template' }),
744
773
  ],
745
774
  ['cwd', cwdUnit], // legacy: old transcripts
746
- ['session', cwdUnit],
775
+ ['session', sessionUnit],
747
776
  ]);
748
777
 
749
778
  function mcpUnit(name, a) {
@@ -98,6 +98,9 @@ let _writeSeq = 0;
98
98
  // `${sessionId}\0${checkpointId}` → seals in flight. A sealing turn's change
99
99
  // record is `pending` and its session refuses Undo/Reapply until it lands.
100
100
  const _pendingFreezes = new Map();
101
+ // `${sessionId}\0${checkpointId}` → getTurnChanges reads in flight. A seal of
102
+ // that checkpoint landing marks them: each may hold the record from before it.
103
+ const _changeReads = new Map();
101
104
  // Per-session Undo/Reapply chain.
102
105
  const _changeMutations = new Map();
103
106
  // `${sessionId}\0${checkpointId}` → path keys whose worktree state is unknown
@@ -1241,6 +1244,7 @@ function sealTurn(ownerSessionId, tracker) {
1241
1244
  const count = (_pendingFreezes.get(key) || 1) - 1;
1242
1245
  if (count > 0) _pendingFreezes.set(key, count);
1243
1246
  else _pendingFreezes.delete(key);
1247
+ for (const read of _changeReads.get(key) || []) read.sealLanded = true;
1244
1248
  });
1245
1249
  tracker.freezing = run;
1246
1250
  return run;
@@ -1788,9 +1792,26 @@ function requiredCheckpointId(value) {
1788
1792
  export async function getTurnChanges(sessionId, options = {}) {
1789
1793
  const ownerSessionId = clean(sessionId);
1790
1794
  const checkpointId = requiredCheckpointId(options?.checkpointId);
1791
- let record = ownerSessionId
1792
- ? withUnknownChangeStates(ownerSessionId, await loadTurnChangeRecord(ownerSessionId, checkpointId))
1793
- : null;
1795
+ // Settled only when no seal of this checkpoint was in flight at any point of
1796
+ // the record read: one in flight before or after it (a completion wake
1797
+ // reopened the turn meanwhile), or one that landed during it, answers
1798
+ // pending instead of the record from before that seal.
1799
+ const inFlight = () => Boolean(ownerSessionId) && turnChangesPending(ownerSessionId, checkpointId);
1800
+ const key = pendingFreezeKey(ownerSessionId, checkpointId);
1801
+ const read = { sealLanded: false };
1802
+ const reads = _changeReads.get(key) || new Set();
1803
+ _changeReads.set(key, reads.add(read));
1804
+ let pending = inFlight();
1805
+ let record;
1806
+ try {
1807
+ record = ownerSessionId
1808
+ ? withUnknownChangeStates(ownerSessionId, await loadTurnChangeRecord(ownerSessionId, checkpointId))
1809
+ : null;
1810
+ } finally {
1811
+ reads.delete(read);
1812
+ if (reads.size === 0 && _changeReads.get(key) === reads) _changeReads.delete(key);
1813
+ }
1814
+ pending ||= read.sealLanded || inFlight();
1794
1815
  // An old record's outside-root file kept no counts: measure it so the card
1795
1816
  // agrees with the session review and the island.
1796
1817
  if (record?.files?.length) {
@@ -1801,7 +1822,7 @@ export async function getTurnChanges(sessionId, options = {}) {
1801
1822
  };
1802
1823
  }
1803
1824
  let status = 'missing';
1804
- if (ownerSessionId && turnChangesPending(ownerSessionId, checkpointId)) status = 'pending';
1825
+ if (pending) status = 'pending';
1805
1826
  else if (record) status = record.files?.length || record.outside?.length ? 'ready' : 'none';
1806
1827
  const reply = turnChangesReply({
1807
1828
  status,
@@ -2083,6 +2104,7 @@ export function _resetTurnSnapshotForTest() {
2083
2104
  _turnsBySession.clear();
2084
2105
  _diffTrackersBySession.clear();
2085
2106
  _pendingFreezes.clear();
2107
+ _changeReads.clear();
2086
2108
  _changeMutations.clear();
2087
2109
  _unknownChangeStates.clear();
2088
2110
  _parkedWorkerReviews.clear();