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
@@ -14,7 +14,10 @@
14
14
  * (outbound actions are allowed within the bot's permissions; payments and
15
15
  * permanent deletes are refused, human-gate/run-policy.mjs). Resolves with the
16
16
  * reply once the turn ends; rejects when the turn fails, is cancelled, or the
17
- * caller's `signal` aborts (which also aborts the turn once it runs). A
17
+ * caller's `signal` aborts (which also aborts the turn once it runs). With an
18
+ * `executorAgentId` the fire is first carried out by that sub-agent
19
+ * (routine-executor.mjs) and the turn holds only its final report, which the
20
+ * bot relays; the quiet marker as the report wakes nobody and resolves it. A
18
21
  * heartbeat turn past its wall-clock cap is aborted and resolves with no reply
19
22
  * (`timedOut`).
20
23
  */
@@ -25,12 +28,16 @@ import { automationPromptContent } from '../runtime/shared/automation-attachment
25
28
  import { ROUTINE_LIMITS } from '../runtime/shared/routine-limits.mjs';
26
29
  import {
27
30
  HEARTBEAT_TURN_LIMITS,
31
+ ROUTINE_QUIET,
28
32
  isHeartbeatSession,
33
+ isRoutineQuietReply,
29
34
  normalizeRoutineTrigger,
35
+ routineRelayHeader,
30
36
  routineTriggerHeader,
31
37
  } from '../runtime/shared/routine-trigger.mjs';
32
38
  import { agentHomeLiveSurface, scheduleOwnerAgentId } from './agent-home-delivery.mjs';
33
39
  import { markUnattendedRun, unattendedRunOf } from './held-requests.mjs';
40
+ import { runRoutineExecutor } from './routine-executor.mjs';
34
41
 
35
42
  // Routine turns waiting or running per home thread.
36
43
  const waiting = new Map();
@@ -72,6 +79,9 @@ export async function runRoutineTurn(
72
79
  // thread and the routine trigger header.
73
80
  sessionId = null,
74
81
  header = null,
82
+ // A workflow sub-agent that carries the fire out first (routine-executor.mjs):
83
+ // the bot's turn then holds only its final report, for the bot to relay.
84
+ executorAgentId = null,
75
85
  },
76
86
  {
77
87
  surface = agentHomeLiveSurface(),
@@ -79,9 +89,10 @@ export async function runRoutineTurn(
79
89
  limit = ROUTINE_LIMITS.homeQueueLimit,
80
90
  log = (line) => process.stderr.write(`mixdog routines: ${line}\n`),
81
91
  timers = globalThis,
92
+ executor = runRoutineExecutor,
82
93
  } = {}
83
94
  ) {
84
- const body = String(prompt || '').trim();
95
+ let body = String(prompt || '').trim();
85
96
  if (!body) throw new Error(`${kind} "${name}" has no instructions`);
86
97
  if (signal?.aborted) throw abortError(signal);
87
98
  if (typeof surface?.submit !== 'function') throw new Error('routine run: the session service is not running');
@@ -91,12 +102,42 @@ export async function runRoutineTurn(
91
102
  if (!home || home.closed === true) {
92
103
  throw new Error(`the bot "${agentId}" has no chat yet: open it once in the app`);
93
104
  }
105
+ let opening = header || routineTriggerHeader({ kind, name, project: cwd ? String(cwd) : '' });
106
+ let selection = String(skillSelection ?? body);
107
+ let turnAttachments = attachments;
108
+ if (executorAgentId) {
109
+ const report = String(
110
+ (await executor(
111
+ {
112
+ agentId: executorAgentId,
113
+ kind,
114
+ name,
115
+ ownerAgentId: agentId,
116
+ prompt: body,
117
+ skillSelection: selection,
118
+ attachments,
119
+ cwd,
120
+ signal,
121
+ },
122
+ { surface }
123
+ )) ?? ''
124
+ ).trim();
125
+ if (signal?.aborted) throw abortError(signal);
126
+ if (!report) throw new Error(`${kind} "${name}": executor agent "${executorAgentId}" returned no report`);
127
+ // Nothing to tell: the bot is not woken.
128
+ if (isRoutineQuietReply(report)) return { sessionId: homeId, result: ROUTINE_QUIET };
129
+ // The bot only relays the report: it is derived from whatever the executor
130
+ // read (a webhook's payload included), so it selects no skill.
131
+ body = report;
132
+ opening = routineRelayHeader({ kind, name, executor: executorAgentId, project: cwd ? String(cwd) : '' });
133
+ selection = '';
134
+ turnAttachments = null;
135
+ }
94
136
  const queued = waiting.get(homeId) || 0;
95
137
  if (queued >= limit) throw new Error(`${limit} routine runs already wait in this bot's chat`);
96
138
  waiting.set(homeId, queued + 1);
97
139
  const trigger = normalizeRoutineTrigger({ kind, name, event });
98
- const opening = header || routineTriggerHeader({ kind, name, project: cwd ? String(cwd) : '' });
99
- const content = automationPromptContent(`${opening}\n\n${body}`, attachments);
140
+ const content = automationPromptContent(`${opening}\n\n${body}`, turnAttachments);
100
141
  return new Promise((resolve, reject) => {
101
142
  let started = false;
102
143
  let aborted = false;
@@ -150,7 +191,7 @@ export async function runRoutineTurn(
150
191
  restorable: false,
151
192
  // Esc ends this fire; it is never put back in the queue.
152
193
  abortDiscardOnAbort: true,
153
- skillSelection: String(skillSelection ?? body),
194
+ skillSelection: selection,
154
195
  transcriptMeta: { routineTrigger: trigger },
155
196
  onCommitted: () => {
156
197
  if (started) return;
@@ -24,6 +24,7 @@ export function createRuntimeFacade({
24
24
  getOrchestrationMode,
25
25
  getOutputStyle,
26
26
  getContextStatus,
27
+ getContextStatusSettled = async (options) => getContextStatus(options),
27
28
  getContextStatusForSession,
28
29
  renameSessionTitle,
29
30
  }) {
@@ -144,6 +145,10 @@ export function createRuntimeFacade({
144
145
  contextStatus(options) {
145
146
  return getContextStatus(options);
146
147
  },
148
+ /** The context status once an empty session took moved settings (async callers). */
149
+ contextStatusSettled(options) {
150
+ return getContextStatusSettled(options);
151
+ },
147
152
  contextStatusForSession(session) {
148
153
  return getContextStatusForSession(session);
149
154
  },
@@ -6,13 +6,10 @@
6
6
  // deps, so the runtime can hand them straight through.
7
7
  import {
8
8
  builtinFeatureActive,
9
- featureDisallowedToolsFor,
10
9
  localGitToolsActive,
11
10
  } from '../runtime/agent/orchestrator/runtime-core/builtin-features.mjs';
12
11
  import { recapEnabled } from '../runtime/agent/orchestrator/runtime-core/config-helpers.mjs';
13
- import { browserBridgeAvailableSync } from '../runtime/browser-bridge/client.mjs';
14
- import { computerBridgeAvailableSync } from '../runtime/computer-bridge/client.mjs';
15
- import { terminalBridgeAvailableSync } from '../runtime/terminal-bridge/client.mjs';
12
+ import { liveFeatureDisallowedTools } from '../runtime/agent/orchestrator/runtime-core/tool-availability.mjs';
16
13
 
17
14
  export function createRuntimeFeatureGates({ getConfig, getToolProfile }) {
18
15
  return {
@@ -29,12 +26,6 @@ export function createRuntimeFeatureGates({ getConfig, getToolProfile }) {
29
26
  tidyToolEnabledFn: () => builtinFeatureActive(getConfig(), 'tidy'),
30
27
  // Browser/Computer activate on live desktop-bridge presence, so the probe
31
28
  // runs per call instead of being captured at boot.
32
- featureDisallowedTools: () =>
33
- featureDisallowedToolsFor(getConfig(), {
34
- browserAvailable: browserBridgeAvailableSync(),
35
- computerAvailable: computerBridgeAvailableSync(),
36
- terminalAvailable: terminalBridgeAvailableSync(),
37
- toolProfile: getToolProfile(),
38
- }),
29
+ featureDisallowedTools: () => liveFeatureDisallowedTools(getConfig(), { toolProfile: getToolProfile() }),
39
30
  };
40
31
  }
@@ -26,6 +26,7 @@ export async function runScheduleSession(
26
26
  kind: 'schedule',
27
27
  name: schedule.name,
28
28
  ownerAgentId: schedule.ownerAgentId,
29
+ executorAgentId: schedule.executorAgentId || null,
29
30
  prompt: body,
30
31
  attachments: schedule.attachments,
31
32
  cwd: schedule.cwd || null,
@@ -84,11 +84,16 @@ export function reconcileJobCancelled(job, value) {
84
84
  } catch {}
85
85
  }
86
86
 
87
- export function reconcileJobStreamStalled(job, error) {
87
+ /** A turn that threw. `identity` is the owner-facing result shape: a failure
88
+ * after answers the turn went on past (error.carriedReport, turn-report.mjs)
89
+ * reports them with the failure. */
90
+ export function reconcileJobStreamStalled(job, error, identity = {}) {
88
91
  if (!job?.taskId || job._terminalResultValue !== undefined) return;
92
+ const report = typeof error?.carriedReport === 'string' ? error.carriedReport : '';
89
93
  try {
90
94
  reconcileBackgroundTask(job.taskId, {
91
95
  status: 'failed',
96
+ ...(report ? { result: { ...identity, content: report } } : {}),
92
97
  error,
93
98
  terminalReason: 'agent-stream-stalled',
94
99
  });
@@ -4,6 +4,8 @@
4
4
  import { resolveAgentWatchdogPolicy } from '../../../../runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs';
5
5
  import { buildAgentTaskProgressFields } from '../../agent-task-status.mjs';
6
6
  import { getProgressWatchdogState } from '../../agent-watchdog-registry.mjs';
7
+ import { _liveSessions } from '../../../../runtime/agent/orchestrator/session/store/live-state.mjs';
8
+ import { todoProgress } from '../../../../runtime/agent/orchestrator/runtime-core/todo-list.mjs';
7
9
 
8
10
  // Job statuses that can never progress again (mirrors TERMINAL_STATUSES in
9
11
  // runtime/shared/background-tasks.mjs; 'canceled' accepted defensively).
@@ -46,6 +48,11 @@ export function terminalJobFrozenFields(status, now = Date.now()) {
46
48
  * the diagnostics through renderJob/list directly. */
47
49
  export function liveAgentStatusRow(row) {
48
50
  if (!row || typeof row !== 'object') return row;
51
+ // The agent's own todo progress, from its live session only (an evicted
52
+ // idle worker is not re-read on every pulse).
53
+ const live = row.sessionId ? _liveSessions.get(row.sessionId) : null;
54
+ const todo = live ? todoProgress(live) : null;
55
+ if (todo) row = { ...row, todo };
49
56
  const {
50
57
  silent_for: _silentFor,
51
58
  staleSeconds: _staleSeconds,
@@ -1,12 +1,26 @@
1
1
  import {
2
2
  isAgentProgressWatchdogAbortError,
3
+ noteStoppedShellJobsOnError,
3
4
  resolveAgentWatchdogPolicy,
4
5
  resolveHandoffMessageStartIndex,
5
6
  turnPartialHandoff,
6
7
  watchdogPartialHandoffFromError,
7
8
  watchdogStoppedHandoff,
8
9
  } from '../../../runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs';
9
- import { clean, normalizeAgentName, resolvePrompt } from './helpers.mjs';
10
+ import { reconcileAgentSession } from '../../../runtime/agent/orchestrator/agent-runtime/session-builder.mjs';
11
+ import {
12
+ agentPresetName,
13
+ clean,
14
+ normalizeAgentName,
15
+ presetKey,
16
+ readAgentFrontmatterPermission,
17
+ resolvePrompt,
18
+ } from './helpers.mjs';
19
+ import { normalizeAgentPermission } from '../../../runtime/shared/markdown-frontmatter.mjs';
20
+ import { resolveAgentSessionPermission } from '../../../runtime/agent/orchestrator/internal-agents.mjs';
21
+ import { resolveAgentSpawnPreset } from './spawn-preset.mjs';
22
+ import { flushPendingSessionConfigWrites } from '../../config-lifecycle/config-writers.mjs';
23
+ import { AGENT_ROUTE_KEYS } from '../../agent-profile-changes.mjs';
10
24
  import { abnormalEmptyFinishError, renderResult } from './render.mjs';
11
25
  import {
12
26
  reconcileJobCancelled,
@@ -20,15 +34,39 @@ import { handoffContent } from '../../handoff-attachments.mjs';
20
34
  import { rebindDelegation } from '../../../runtime/agent/orchestrator/session/human-gate/delegation.mjs';
21
35
  import { settledWorkerStatus } from './worker-index/row-liveness.mjs';
22
36
  import { whileTurnDispatched } from '../../../runtime/agent/orchestrator/session/manager/runtime-state.mjs';
37
+ import { takeStoppedShellJobs } from '../../../runtime/agent/orchestrator/session/manager/turn-reap.mjs';
38
+ import { turnReportText } from '../../../runtime/agent/orchestrator/session/loop/turn-report.mjs';
23
39
 
24
40
  function workerResultIdentity({ session, tag, sessionId }) {
25
41
  return { tag, sessionId, agent: session.agent || null, provider: session.provider, model: session.model };
26
42
  }
27
43
 
44
+ /** A reused worker runs with the permission its agent's definition grants
45
+ * now, resolved as a spawn resolves it (spawn-plan.mjs). */
46
+ export function followAgentPermission(session, { dataDir, sourceRoot }) {
47
+ const agent = normalizeAgentName(session?.agent);
48
+ if (!agent || !dataDir) return;
49
+ const defined = normalizeAgentPermission(readAgentFrontmatterPermission(agent, dataDir, sourceRoot));
50
+ const permission = resolveAgentSessionPermission(agent, defined || null);
51
+ if (permission) session.permission = permission;
52
+ else delete session.permission;
53
+ }
54
+
28
55
  // `send` to an existing worker: resolve the live session, run one follow-up
29
56
  // turn under the progress watchdog, and reconcile the job/worker row. Busy
30
57
  // sessions queue the prompt instead.
31
- export function createSendFlow({ mgr, defaultCwd, sessionSurface, canUseSessionSurface, registry, views, spawnFlow }) {
58
+ export function createSendFlow({
59
+ mgr,
60
+ cfgMod = null,
61
+ dataDir = null,
62
+ STANDALONE_SOURCE_ROOT = null,
63
+ defaultCwd,
64
+ sessionSurface,
65
+ canUseSessionSurface,
66
+ registry,
67
+ views,
68
+ spawnFlow,
69
+ }) {
32
70
  async function prepareSend(args, context = {}) {
33
71
  registry.refreshTagsFromSessions({ scanSessions: registry.wantsSessionScan(args), context });
34
72
  const target = clean(args.tag || args.sessionId);
@@ -49,7 +87,7 @@ export function createSendFlow({ mgr, defaultCwd, sessionSurface, canUseSessionS
49
87
  const abnormalError = abnormalEmptyFinishError(result, session.agent || sendAgent);
50
88
  return {
51
89
  ...workerResultIdentity({ session, tag, sessionId }),
52
- content: result?.content || '',
90
+ content: turnReportText(result),
53
91
  ...(sessionSurface?.canonical === true ? { handoffOnly: true } : {}),
54
92
  ...(abnormalError ? { error: abnormalError } : {}),
55
93
  };
@@ -80,6 +118,13 @@ export function createSendFlow({ mgr, defaultCwd, sessionSurface, canUseSessionS
80
118
  if (canUseSessionSurface(session)) {
81
119
  return sessionSurface.runTurn({ session, prompt, context: args.context || null, cwd, ...turnHooks });
82
120
  }
121
+ // An in-process session has no turn start of its own to reconcile it
122
+ // (a canonical child's runtime does, reconcileTurnSettings): bring its
123
+ // settings-gated tools, connectors, compaction, prompt settings and its
124
+ // agent's permission (as its definition stands: a narrowed one applies)
125
+ // to the settings now.
126
+ reconcileAgentSession(session);
127
+ followAgentPermission(session, { dataDir, sourceRoot: STANDALONE_SOURCE_ROOT });
83
128
  return mgr.askSession(sessionId, prompt, args.context || null, null, cwd, null, turnHooks);
84
129
  });
85
130
  }
@@ -92,7 +137,12 @@ export function createSendFlow({ mgr, defaultCwd, sessionSurface, canUseSessionS
92
137
  // the watchdog sweep re-stamps turnStartedAt at each turn boundary.
93
138
  const watchdogPolicy = resolveAgentWatchdogPolicy(
94
139
  sendAgent,
95
- spawnFlow.agentWatchdogOverrides({ agent: sendAgent, provider: session.provider, model: session.model })
140
+ spawnFlow.agentWatchdogOverrides({
141
+ agent: sendAgent,
142
+ provider: session.provider,
143
+ model: session.model,
144
+ ...(session.modelParameters ? { modelParameters: session.modelParameters } : {}),
145
+ })
96
146
  );
97
147
  const watchdog = spawnFlow.startProgressIdleWatchdog(sessionId, watchdogPolicy, sendAgent, {
98
148
  onTurnStart: spawnFlow.turnStartStamper(session, tag),
@@ -122,7 +172,7 @@ export function createSendFlow({ mgr, defaultCwd, sessionSurface, canUseSessionS
122
172
  handoffMsgStart = resolveHandoffMessageStartIndex(mgr.getSession(sessionId));
123
173
  const turnHooks = buildTurnHooks({ sessionId, notifyContext, job, turnReview, completionValue });
124
174
  const result = await runTurn(prepared, turnHooks);
125
- // Early preview no longer suppresses the canonical body notification;
175
+ // The early preview does not suppress the canonical body notification;
126
176
  // notifyTaskCompletion fires once with output via resolve/reconcile.
127
177
  const finalValue = completionValue(result);
128
178
  if (job?.status === 'cancelled') {
@@ -146,7 +196,7 @@ export function createSendFlow({ mgr, defaultCwd, sessionSurface, canUseSessionS
146
196
  finalStatus = 'idle';
147
197
  const value = {
148
198
  ...workerResultIdentity({ session, tag, sessionId }),
149
- content: watchdogStoppedHandoff(error, partial),
199
+ content: watchdogStoppedHandoff(error, partial, await takeStoppedShellJobs(sessionId)),
150
200
  stallAbort: true,
151
201
  };
152
202
  if (job) job._terminalResultValue = value;
@@ -154,7 +204,8 @@ export function createSendFlow({ mgr, defaultCwd, sessionSurface, canUseSessionS
154
204
  return value;
155
205
  }
156
206
  finalStatus = 'error';
157
- reconcileJobStreamStalled(job, error);
207
+ noteStoppedShellJobsOnError(error, await takeStoppedShellJobs(sessionId));
208
+ reconcileJobStreamStalled(job, error, workerResultIdentity({ session, tag, sessionId }));
158
209
  throw error;
159
210
  } finally {
160
211
  turnReview.complete();
@@ -196,8 +247,69 @@ export function createSendFlow({ mgr, defaultCwd, sessionSurface, canUseSessionS
196
247
  // `send` branch AND by the `spawn` branch when an explicit tag maps to a
197
248
  // live session (reuse path). Busy sessions queue the prompt; idle ones run a
198
249
  // background send job that continues the existing session (context kept).
250
+ // A worker that runs on its agent's configured route follows that route, as
251
+ // a bot's home chat does (agent-route-follow.mjs): a model picked for the
252
+ // agent since the spawn applies from this send. A worker started on an
253
+ // explicit model or preset keeps it.
254
+ async function agentRouteToFollow({ session }) {
255
+ const agent = normalizeAgentName(session?.agent);
256
+ if (!agent || !cfgMod?.loadConfig) return null;
257
+ await flushPendingSessionConfigWrites();
258
+ let current;
259
+ try {
260
+ current = resolveAgentSpawnPreset(cfgMod.loadConfig(), { agent });
261
+ } catch {
262
+ return null;
263
+ }
264
+ const spawnedOn = clean(session.presetName || session.preset);
265
+ const own = new Set([`agent-${agent}`, agentPresetName(agent), presetKey(current.preset), current.presetName]);
266
+ if (!spawnedOn || !own.has(spawnedOn)) return null;
267
+ const preset = current.preset;
268
+ if (!preset.provider || !preset.model) return null;
269
+ // Every route key the agent's route sets (an effort or Fast change alone
270
+ // included); a key it leaves unset is the route default either way.
271
+ const value = (key, source) => {
272
+ if (key === 'fast') return source?.fast === true;
273
+ if (key === 'autoEffort') return source?.autoEffort !== false;
274
+ return source?.[key] == null ? null : JSON.stringify(source[key]);
275
+ };
276
+ const set = AGENT_ROUTE_KEYS.filter(
277
+ (key) => key === 'fast' || key === 'autoEffort' || (preset[key] !== undefined && preset[key] !== null)
278
+ );
279
+ const matches = (target) => set.every((key) => value(key, preset) === value(key, target));
280
+ // Against the route the session's next turn runs on: one held for it
281
+ // (heldRoute, an in-process worker that was busy), else its own.
282
+ if (matches(session)) {
283
+ // Saved back to the running route: an earlier hold is obsolete.
284
+ if (session.heldRoute) mgr.holdSessionRoute?.(session.id, null);
285
+ return null;
286
+ }
287
+ if (session.heldRoute && matches({ ...session, ...session.heldRoute })) return null;
288
+ const route = {};
289
+ for (const key of set) {
290
+ if (key === 'fast') route.fast = preset.fast === true;
291
+ else if (key === 'autoEffort') {
292
+ if (preset.autoEffort === false) route.autoEffort = false;
293
+ } else route[key] = preset[key];
294
+ }
295
+ return route;
296
+ }
297
+
199
298
  async function dispatchToExistingSession(requested, notifyContext, extras = {}) {
200
- const prepared = requested.route ? await applyRequestedRoute(requested) : requested;
299
+ let followed = requested.route ? null : await agentRouteToFollow(requested);
300
+ if (followed && !canUseSessionSurface(requested.session)) {
301
+ // An in-process session takes the followed route in place, between
302
+ // turns; a running one finishes on the route it started on and holds
303
+ // the new one for its next turn, which runs the queued work.
304
+ if (!views.isSessionBusy(requested.sessionId)) {
305
+ const { session } = requested;
306
+ const crossProvider = followed.provider !== session.provider || followed.model !== session.model;
307
+ mgr.updateSessionRoute?.(requested.sessionId, followed, { session, crossProvider });
308
+ } else mgr.holdSessionRoute?.(requested.sessionId, followed);
309
+ followed = null;
310
+ }
311
+ const routed = followed ? { ...requested, route: followed } : requested;
312
+ const prepared = routed.route ? await applyRequestedRoute(routed) : routed;
201
313
  const { session, sessionId, prompt } = prepared;
202
314
  const tag = registry.tagForSession(sessionId);
203
315
  if (canUseSessionSurface(session) && views.isSessionBusy(sessionId)) {
@@ -10,6 +10,7 @@ import { clean, terminalPidForContext } from '../helpers.mjs';
10
10
  import { renderResult } from '../render.mjs';
11
11
  import { closeManagedSession } from '../../../lifecycle/shared.mjs';
12
12
  import { hopOf } from '../../../../runtime/shared/bot-hops.mjs';
13
+ import { notDoneReport } from '../../../../runtime/agent/orchestrator/runtime-core/todo-list.mjs';
13
14
 
14
15
  /** The completion callback that hands a worker's result back to its caller session; null without a handoff. */
15
16
  function handoffNotifier(handoffSessionId, notifySessionCompletion) {
@@ -86,6 +87,17 @@ export function createJobStarter({ mgr, notifyStatusChange, notifySessionComplet
86
87
  }
87
88
  },
88
89
  });
90
+ // Success, failure or cancellation: the report names what the agent's own
91
+ // todo list leaves undone. The Lead never receives the list otherwise.
92
+ task.reportAppendix = () => {
93
+ const sessionId = task.meta?.sessionId || jobMeta?.sessionId;
94
+ if (!sessionId) return '';
95
+ try {
96
+ return notDoneReport(mgr.getSession(sessionId));
97
+ } catch {
98
+ return '';
99
+ }
100
+ };
89
101
  // The model's tool call that started this job owns it (its result message
90
102
  // carries the id: agent-task-starts.mjs).
91
103
  recordAgentTaskStart(notifyContext?.toolCallId, task.taskId);
@@ -22,6 +22,7 @@ import { workspaceCwdLock } from '../../../workspace/admission-gate.mjs';
22
22
  import { isContactAgentId } from '../../../../runtime/agent/orchestrator/runtime-core/workflow-ids.mjs';
23
23
  import { assertBotChainTarget } from '../../../../runtime/shared/bot-hops.mjs';
24
24
  import { actingAgentOf, delegationChainOf } from '../../../bot-chain.mjs';
25
+ import { flushPendingSessionConfigWrites } from '../../../config-lifecycle/config-writers.mjs';
25
26
 
26
27
  export function createSpawnPlanner({
27
28
  mgr = null,
@@ -36,6 +37,10 @@ export function createSpawnPlanner({
36
37
  }) {
37
38
  /** Shared spawn-prep validations (agent/preset/tag/cwd/prompt). */
38
39
  async function resolveSpawnPlan(args, callerCwd, context, prepState) {
40
+ // A setting a runtime of this process adopted (an agent's model picked a
41
+ // moment ago) is written behind a debounce: drain it so the read below
42
+ // sees what the runtimes hold in memory.
43
+ await flushPendingSessionConfigWrites();
39
44
  const config = cfgMod.loadConfig();
40
45
  const agent = normalizeAgentName(args.agent);
41
46
  if (!agent) throw new Error('agent spawn: agent is required');
@@ -77,8 +77,8 @@ export function createSpawnPreparer({
77
77
  * first-response deadline and the provider's first-response budget for the
78
78
  * routed model (headers, and first output), handed to
79
79
  * resolveAgentWatchdogPolicy. A provider on the shared window names none. */
80
- function agentWatchdogOverrides({ agent, provider, model }) {
81
- const budget = getProvider(provider)?.firstResponseBudget?.(model);
80
+ function agentWatchdogOverrides({ agent, provider, model, modelParameters }) {
81
+ const budget = getProvider(provider)?.firstResponseBudget?.(model, { modelParameters });
82
82
  return {
83
83
  firstResponseTimeoutMs: readAgentFirstResponseTimeoutMs(agent, dataDir, STANDALONE_SOURCE_ROOT) ?? undefined,
84
84
  providerFirstByteTimeoutMs: budget?.transportMs,
@@ -145,7 +145,12 @@ export function createSpawnPreparer({
145
145
  prompt: plan.prompt,
146
146
  watchdogPolicy: resolveAgentWatchdogPolicy(
147
147
  plan.agent,
148
- agentWatchdogOverrides({ agent: plan.agent, provider: plan.preset.provider, model: plan.preset.model })
148
+ agentWatchdogOverrides({
149
+ agent: plan.agent,
150
+ provider: plan.preset.provider,
151
+ model: plan.preset.model,
152
+ modelParameters: plan.preset.modelParameters,
153
+ })
149
154
  ),
150
155
  };
151
156
  }
@@ -16,6 +16,7 @@ import { abnormalEmptyFinishError } from '../render.mjs';
16
16
  import { createProgressWatchdogRegistry } from '../../agent-watchdog-registry.mjs';
17
17
  import {
18
18
  isAgentProgressWatchdogAbortError,
19
+ noteStoppedShellJobsOnError,
19
20
  resolveHandoffMessageStartIndex,
20
21
  turnPartialHandoff,
21
22
  watchdogPartialHandoffFromError,
@@ -27,6 +28,8 @@ import { presetDescriptor } from './spawn-prep.mjs';
27
28
  import { workerStageForStatus } from '../worker-rows.mjs';
28
29
  import { handoffContent } from '../../../handoff-attachments.mjs';
29
30
  import { whileTurnDispatched } from '../../../../runtime/agent/orchestrator/session/manager/runtime-state.mjs';
31
+ import { takeStoppedShellJobs } from '../../../../runtime/agent/orchestrator/session/manager/turn-reap.mjs';
32
+ import { turnReportText } from '../../../../runtime/agent/orchestrator/session/loop/turn-report.mjs';
30
33
 
31
34
  // Mid-turn worker persistence cadence. The watchdog sweep runs every second;
32
35
  // a transcript save is far more expensive than a bookkeeping stamp, so the
@@ -112,7 +115,7 @@ export function createSpawnRunner({
112
115
  tag,
113
116
  sessionId: session.id,
114
117
  ...presetDescriptor(agent, preset, presetName),
115
- content: result?.content || '',
118
+ content: turnReportText(result),
116
119
  ...(sessionSurface?.canonical === true ? { handoffOnly: true } : {}),
117
120
  ...(abnormalError ? { error: abnormalError } : {}),
118
121
  };
@@ -122,11 +125,24 @@ export function createSpawnRunner({
122
125
  const { args, session, workerCwd } = prepared;
123
126
  // The caller's forwarded files ride along as attachment parts.
124
127
  const prompt = handoffContent(prepared.prompt, args.attachmentParts);
128
+ // Host-set only (a routine executor, routine-executor.mjs): the trusted
129
+ // text skills are selected from, so nothing else in the prompt selects one.
130
+ const selection = typeof args.skillSelection === 'string' ? { skillSelection: args.skillSelection } : {};
125
131
  return whileTurnDispatched(session.id, () => {
126
132
  if (typeof sessionSurface?.runTurn === 'function' && sessionSurface.canRun?.(session) !== false) {
127
- return sessionSurface.runTurn({ session, prompt, context: args.context || null, cwd: workerCwd, ...turnHooks });
133
+ return sessionSurface.runTurn({
134
+ session,
135
+ prompt,
136
+ context: args.context || null,
137
+ cwd: workerCwd,
138
+ ...selection,
139
+ ...turnHooks,
140
+ });
128
141
  }
129
- return mgr.askSession(session.id, prompt, args.context || null, null, workerCwd, null, turnHooks);
142
+ return mgr.askSession(session.id, prompt, args.context || null, null, workerCwd, null, {
143
+ ...turnHooks,
144
+ ...selection,
145
+ });
130
146
  });
131
147
  }
132
148
 
@@ -178,8 +194,8 @@ export function createSpawnRunner({
178
194
  : {}),
179
195
  };
180
196
  const result = await runTurn(prepared, turnHooks);
181
- // The early preview no longer promises body suppression, so the canonical
182
- // notifyTaskCompletion is left to fire exactly once with output via the
197
+ // The early preview does not promise body suppression, so the canonical
198
+ // notifyTaskCompletion fires exactly once with output via the
183
199
  // resolve/reconcile/finally path.
184
200
  const finalValue = completionValue(result);
185
201
  if (job?.status === 'cancelled') {
@@ -209,7 +225,7 @@ export function createSpawnRunner({
209
225
  tag,
210
226
  sessionId: session.id,
211
227
  ...presetDescriptor(agent, preset, presetName),
212
- content: watchdogStoppedHandoff(error, partial),
228
+ content: watchdogStoppedHandoff(error, partial, await takeStoppedShellJobs(session.id)),
213
229
  stallAbort: true,
214
230
  };
215
231
  if (job) job._terminalResultValue = value;
@@ -217,7 +233,12 @@ export function createSpawnRunner({
217
233
  return value;
218
234
  }
219
235
  finalStatus = 'error';
220
- reconcileJobStreamStalled(job, error);
236
+ noteStoppedShellJobsOnError(error, await takeStoppedShellJobs(session.id));
237
+ reconcileJobStreamStalled(job, error, {
238
+ tag,
239
+ sessionId: session.id,
240
+ ...presetDescriptor(agent, preset, presetName),
241
+ });
221
242
  throw error;
222
243
  } finally {
223
244
  turnReview.complete();
@@ -2,7 +2,15 @@ import { dirname, resolve } from 'node:path';
2
2
  import { fileURLToPath } from 'node:url';
3
3
  import { ensureProcessListenerHeadroom } from '../../runtime/shared/process-listener-headroom.mjs';
4
4
  import { AGENT_TOOL } from './agent-tool/tool-def.mjs';
5
- import { agentScope, envTimeoutMs, callerSessionForContext, terminalPidForContext } from './agent-tool/helpers.mjs';
5
+ import { cancelBackgroundTask } from '../../runtime/shared/background-tasks.mjs';
6
+ import { closeManagedSession } from '../lifecycle/shared.mjs';
7
+ import {
8
+ agentScope,
9
+ clean,
10
+ envTimeoutMs,
11
+ callerSessionForContext,
12
+ terminalPidForContext,
13
+ } from './agent-tool/helpers.mjs';
6
14
  import { createTagRegistry } from './agent-tool/tag-registry.mjs';
7
15
  import { createJobViews } from './agent-tool/job-views.mjs';
8
16
  import { liveAgentStatusRow } from './agent-tool/job-views/session-progress.mjs';
@@ -106,6 +114,9 @@ export function createStandaloneAgent({
106
114
  });
107
115
  const sendFlow = createSendFlow({
108
116
  mgr,
117
+ cfgMod,
118
+ dataDir,
119
+ STANDALONE_SOURCE_ROOT,
109
120
  defaultCwd,
110
121
  sessionSurface,
111
122
  canUseSessionSurface,
@@ -129,6 +140,44 @@ export function createStandaloneAgent({
129
140
  listProviderModels,
130
141
  });
131
142
 
143
+ /**
144
+ * Run one workflow agent (`args.agent`, `args.prompt`, optional `cwd` and
145
+ * `attachmentParts`) to completion and resolve `{ sessionId, content }` —
146
+ * for a caller that has no session to hand the result to (a routine's
147
+ * executor, routine-executor.mjs). `context.callerSessionId` is the id the
148
+ * agent is created under: its run stamp and unattended policy come from it.
149
+ * Rejects when the agent fails or is cancelled, or `signal` aborts (which
150
+ * cancels it). The agent's session is closed afterwards.
151
+ */
152
+ async function runToCompletion(args = {}, context = {}, { signal = null } = {}) {
153
+ await awaitKeychainPrewarm();
154
+ const abortError = () =>
155
+ signal?.reason instanceof Error ? signal.reason : new Error(String(signal?.reason || 'agent run aborted'));
156
+ if (signal?.aborted) throw abortError();
157
+ const job = spawnFlow.startDeferredSpawnJob({ ...args, type: 'spawn' }, clean(context.callerCwd), context, context);
158
+ const onAbort = () => cancelBackgroundTask(job.taskId, 'agent run aborted', { notify: false });
159
+ signal?.addEventListener?.('abort', onAbort, { once: true });
160
+ let value = null;
161
+ try {
162
+ value = await job.promise;
163
+ } finally {
164
+ signal?.removeEventListener?.('abort', onAbort);
165
+ }
166
+ const sessionId = clean(job.meta?.sessionId) || clean(value?.sessionId);
167
+ if (sessionId) {
168
+ try {
169
+ await closeManagedSession(mgr, sessionId, 'routine-executor-finished');
170
+ } catch {
171
+ /* the run's result stands; a close that fails is swept with idle agents */
172
+ }
173
+ }
174
+ if (signal?.aborted) throw abortError();
175
+ if (job.status === 'cancelled') throw new Error('the agent run was cancelled');
176
+ if (job.status !== 'completed') throw new Error(job.error || 'the agent run failed');
177
+ const result = value ?? job.result;
178
+ return { sessionId: sessionId || null, content: String(result?.content ?? '') };
179
+ }
180
+
132
181
  function getStatus(context = {}) {
133
182
  if (!isKeychainPrewarmReady()) {
134
183
  void awaitKeychainPrewarm();
@@ -162,6 +211,7 @@ export function createStandaloneAgent({
162
211
  return {
163
212
  tools: [AGENT_TOOL],
164
213
  execute,
214
+ runToCompletion,
165
215
  onStatusChange: (listener) => {
166
216
  if (typeof listener !== 'function') return () => {};
167
217
  statusListeners.add(listener);