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,63 +1,21 @@
1
1
  /**
2
- * goal-tool-exec.mjs — the model-facing `goal` tool: optimistic-concurrency
3
- * bookkeeping (the revision the model last observed) and one handler per
4
- * tool action, each replying with the compact or full Goal view.
2
+ * goal-tool-exec.mjs — the model-facing `goal` tool: status, create, and the
3
+ * model's two settlements (complete after its evidence audit, block on an
4
+ * impasse), each replying with the compact or full Goal view.
5
5
  */
6
6
  import { validateGoalToolCall } from './goal-tool-defs.mjs';
7
7
  import { assertSessionId, parseGoalDuration } from './goal-state.mjs';
8
- import { goalFinished } from './goal-mutations.mjs';
9
8
 
10
- export function observeGoal(ctx, id, goal) {
11
- if (goal) ctx.observedGoals.set(id, { id: goal.id, revision: goal.revision });
12
- else ctx.observedGoals.delete(id);
13
- }
14
-
15
- function toolReply(ctx, id, goal, { full = false, previousIds = null } = {}) {
16
- observeGoal(ctx, id, goal);
9
+ function toolReply(goal, { full = false } = {}) {
17
10
  let goalView = goal;
18
11
  if (goal && !full) {
19
- goalView = {
20
- id: goal.id,
21
- revision: goal.revision,
22
- status: goal.status,
23
- tasksCompleted: goal.tasksCompleted,
24
- tasksTotal: goal.tasksTotal,
25
- taskSlotsUsed: goal.taskSlotsUsed,
26
- tasksUpdatedAt: goal.tasksUpdatedAt,
27
- timeUsedMs: goal.timeUsedMs,
28
- };
12
+ goalView = { id: goal.id, status: goal.status, timeUsedMs: goal.timeUsedMs };
29
13
  if (goal.blocker) goalView.blocker = goal.blocker;
30
- if (goal.needsTaskReview) goalView.needsTaskReview = true;
31
- }
32
- const result = { goal: goalView, remaining_ms: goal?.remainingMs ?? null };
33
- if (!full && previousIds && goal) {
34
- const added = goal.tasks.filter((task) => !previousIds.has(task.id));
35
- if (added.length) result.assigned_tasks = added.map(({ id: taskId, text }) => ({ id: taskId, text }));
36
14
  }
37
- return JSON.stringify(result);
15
+ return JSON.stringify({ goal: goalView, remaining_ms: goal?.remainingMs ?? null });
38
16
  }
39
17
 
40
- function mutateObserved(ctx, id, args, operation) {
41
- const current = ctx.requireGoal(id);
42
- const expectedGoalId = ctx.turnGoalIds.get(id) || current.id;
43
- const observed = ctx.observedGoals.get(id);
44
- // Capture BEFORE queueing: two concurrent calls based on one snapshot must
45
- // not both overwrite it. Old frozen schemas use the last tool result.
46
- let expectedRevision = current.revision;
47
- if (args.revision != null && args.revision !== '') expectedRevision = args.revision;
48
- else if (observed?.id === expectedGoalId) expectedRevision = observed.revision;
49
- return ctx.withMutation(id, () => {
50
- const latest = ctx.requireGoal(id);
51
- if (latest.id !== expectedGoalId) throw new Error('stale Goal update rejected because the active Goal changed');
52
- if (latest.revision !== expectedRevision)
53
- throw new Error(
54
- `stale Goal revision: expected ${expectedRevision}, current ${latest.revision}; read goal status and reconcile before retrying`
55
- );
56
- return operation(expectedGoalId);
57
- });
58
- }
59
-
60
- /** create/resume budget in ms, or undefined when the call carries none. */
18
+ /** create budget in ms, or undefined when the call carries none. */
61
19
  function toolTimeLimitMs(args) {
62
20
  if (args.time_limit_minutes == null || args.time_limit_minutes === '') return undefined;
63
21
  const minutes = Number(args.time_limit_minutes);
@@ -67,75 +25,51 @@ function toolTimeLimitMs(args) {
67
25
  return parseGoalDuration(minutes * 60_000);
68
26
  }
69
27
 
70
- async function pauseOrResume(ctx, id, args, action) {
71
- const timeLimitMs = action === 'resume' ? toolTimeLimitMs(args) : undefined;
72
- const result = await mutateObserved(ctx, id, args, (expectedGoalId) => {
28
+ // A settlement applies to the Goal this turn worked on: one replaced
29
+ // meanwhile is refused instead of settled by mistake.
30
+ async function settleStatus(ctx, id, args, action) {
31
+ const expectedGoalId = ctx.turnGoalIds.get(id) || ctx.requireGoal(id).id;
32
+ const goal = await ctx.withMutation(id, () => {
73
33
  const current = ctx.requireGoal(id);
74
- if (goalFinished(current)) {
75
- throw new Error(`a ${current.status === 'complete' ? 'completed' : 'stopped'} Goal cannot be paused or resumed`);
34
+ // The objective was edited after this turn last saw it: the claim was made
35
+ // against old wording. Show the current text once; the next call, made
36
+ // with that text in view, settles normally.
37
+ const seen = ctx.turnObjectiveRevisions.get(id);
38
+ if (current.id === expectedGoalId && seen !== undefined && seen !== current.objectiveRevision) {
39
+ ctx.turnObjectiveRevisions.set(id, current.objectiveRevision);
40
+ throw new Error(
41
+ `The Goal objective changed since this turn began, so ${action} was not recorded. ` +
42
+ `Current objective: ${current.objective}\nCheck the work against it, then call goal ${action} again if it still holds.`
43
+ );
76
44
  }
77
- // The model pauses only at the user's explicit request, so its pause is the
78
- // user's pause; waits on the user go through block.
79
- const change =
80
- action === 'resume'
81
- ? { updates: args.updates, tasks: args.tasks, duration: timeLimitMs, timeMode: args.time_mode }
82
- : {};
83
- return ctx.control(id, { action, expectedGoalId, ...change });
84
- });
85
- return toolReply(ctx, id, result.goal, { full: action === 'resume' });
86
- }
87
-
88
- async function editTasks(ctx, id, args, action) {
89
- let previousIds;
90
- const goal = await mutateObserved(ctx, id, args, (expectedGoalId) => {
91
- previousIds = new Set(ctx.requireGoal(id).tasks.map((task) => task.id));
92
- return ctx.setGoalTasks(id, args, { expectedGoalId, partial: action === 'update_tasks' });
93
- });
94
- return toolReply(ctx, id, goal, { previousIds });
95
- }
96
-
97
- async function settleStatus(ctx, id, args, action) {
98
- const goal = await mutateObserved(ctx, id, args, (expectedGoalId) =>
99
- ctx.updateGoal(
45
+ return ctx.updateGoal(
100
46
  id,
101
- {
102
- status: action === 'block' ? 'blocked' : 'complete',
103
- ...(action === 'block' ? { blocker: args.blocker } : {}),
104
- },
47
+ { status: action === 'block' ? 'blocked' : 'complete', ...(action === 'block' ? { blocker: args.blocker } : {}) },
105
48
  { expectedGoalId }
106
- )
107
- );
108
- return toolReply(ctx, id, goal);
49
+ );
50
+ });
51
+ return toolReply(goal);
109
52
  }
110
53
 
111
54
  const GOAL_TOOL_ACTIONS = {
112
55
  status(ctx, id) {
113
56
  // Same view the user sees. Reading the stored record here showed the
114
57
  // model Goals the user had already archived away.
115
- ctx.readRecord(id); // A real I/O error is an actionable error, not "no Goal".
116
- return toolReply(ctx, id, ctx.visibleSnapshot(id), { full: true });
58
+ const record = ctx.readRecord(id).goal; // A real I/O error is an actionable error, not "no Goal".
59
+ if (record && ctx.turnGoalIds.get(id) === record.id) ctx.turnObjectiveRevisions.set(id, record.objectiveRevision);
60
+ return toolReply(ctx.visibleSnapshot(id), { full: true });
117
61
  },
118
62
  async create(ctx, id, args) {
119
63
  const timeLimitMs = toolTimeLimitMs(args);
120
64
  const goal = await ctx.withMutation(id, () =>
121
65
  ctx.createGoal(id, {
122
66
  objective: args.objective,
123
- tasks: args.tasks,
124
67
  startInCurrentTurn: true,
125
68
  ...(timeLimitMs != null ? { timeLimitMs } : {}),
126
- timeMode: args.time_mode,
127
69
  })
128
70
  );
129
- return toolReply(ctx, id, goal, { full: true });
130
- },
131
- async abandon(ctx, id, args) {
132
- const goal = await mutateObserved(ctx, id, args, (expectedGoalId) => ctx.abandonGoal(id, { expectedGoalId }));
133
- return toolReply(ctx, id, goal);
71
+ return toolReply(goal, { full: true });
134
72
  },
135
- pause: pauseOrResume,
136
- resume: pauseOrResume,
137
- set_tasks: editTasks,
138
- update_tasks: editTasks,
139
73
  block: settleStatus,
140
74
  complete: settleStatus,
141
75
  };
@@ -145,6 +79,5 @@ export async function executeGoalTool(ctx, name, args = {}, context = {}) {
145
79
  const id = assertSessionId(sessionId);
146
80
  if (name !== 'goal') throw new Error(`unknown Goal tool: ${name}`);
147
81
  const action = validateGoalToolCall(args);
148
- const handler = GOAL_TOOL_ACTIONS[action];
149
- return handler(ctx, id, args, action);
82
+ return GOAL_TOOL_ACTIONS[action](ctx, id, args, action);
150
83
  }
@@ -4,38 +4,21 @@
4
4
  * should continue, and retiring finished work on the next user prompt.
5
5
  */
6
6
  import { continuationPrompt } from './goal-text.mjs';
7
- import { GOAL_TASK_SETTLED } from './goal-tool-defs.mjs';
8
7
  import {
9
8
  assertSessionId,
10
9
  checkpointActiveClock,
11
10
  clearTurnFailures,
12
- publicGoal,
13
11
  resumeGoalState,
14
- runningAgentWork,
15
12
  startActiveClock,
16
13
  stopActiveClock,
17
14
  } from './goal-state.mjs';
18
15
  import { goalFinished } from './goal-mutations.mjs';
19
- import { observeGoal } from './goal-tool-exec.mjs';
16
+ import { awaitingBackgroundWork } from '../../../shared/background-wait.mjs';
20
17
  import { clean } from '../../../shared/clean.mjs';
21
18
 
22
- // Every recorded task is settled while a requested duration still has time.
23
- // Completed rows neither complete the objective nor shorten its duration, so
24
- // this state must not loop the model over an unchanged list.
25
- function settledDurationWait(goal) {
26
- return (
27
- goal?.status === 'active' &&
28
- goal.timeMode === 'duration' &&
29
- goal.remainingMs > 0 &&
30
- !goal.needsTaskReview &&
31
- goal.tasks.length > 0 &&
32
- goal.tasks.every((task) => GOAL_TASK_SETTLED.includes(task.status))
33
- );
34
- }
35
-
36
- // The review is spent per Goal, turn, and actionable revision: a resumed,
37
- // re-scoped, or re-planned Goal earns a fresh one without any extra clearing.
38
- const idleReviewKey = (goal) => `${goal.id}:${goal.turnCount}:${goal.revision}`;
19
+ // The no-progress wait is spent per Goal and turn: the next user turn (or a
20
+ // resume, which starts a new turn) earns a fresh continuation.
21
+ const idleReviewKey = (goal) => `${goal.id}:${goal.turnCount}`;
39
22
 
40
23
  // An automatic turn that called no tool answered its prompt without progress.
41
24
  // Asking again over the same list only repeats that answer every few seconds
@@ -52,16 +35,8 @@ function automaticTurnWithoutActivity(detail, goal) {
52
35
 
53
36
  // Continuation prompts are enqueued as meta user messages, so a delivered rules
54
37
  // block stays in the transcript until the context is compacted or rewound. The
55
- // marker records which Goal's rules are already there: a new session or Goal, a
56
- // reconciliation the rules must frame, or an explicit reset re-sends them.
57
- function needsFullContinuationRules(markedGoalId, goal) {
58
- return markedGoalId !== goal.id || goal.needsTaskReview === true;
59
- }
60
-
61
- // A durable list drifts out of attention after roughly ten quiet turns — the
62
- // staleness cadence task-reminder surfaces settle on across the industry — so
63
- // the state block returns on that count rather than on an arbitrary period.
64
- const GOAL_STATE_REMINDER_QUIET_TURNS = 10;
38
+ // marker records which Goal's rules are already there: a new session or Goal,
39
+ // or an explicit reset (compaction, objective edit) re-sends them.
65
40
 
66
41
  /** Fold a settled turn's outcome (usage limit, cancel, failure, or a clean
67
42
  * finish) into the Goal status and clocks. */
@@ -103,7 +78,7 @@ function applyTurnOutcome(goal, detail, at) {
103
78
  if (goal.timeLimitMs > 0 && goal.timeUsedMs >= goal.timeLimitMs) {
104
79
  stopActiveClock(goal, at);
105
80
  goal.status = 'duration_reached';
106
- goal.timeUsedMs = Math.max(goal.timeUsedMs, goal.timeLimitMs);
81
+ goal.timeUsedMs = goal.timeLimitMs;
107
82
  }
108
83
  }
109
84
 
@@ -112,6 +87,7 @@ export function createGoalTurnLifecycle(ctx) {
112
87
  now,
113
88
  turnGoalIds,
114
89
  turnStartedAt,
90
+ turnObjectiveRevisions,
115
91
  idleReviewTurns,
116
92
  continuationTiers,
117
93
  unsavedStops,
@@ -129,22 +105,19 @@ export function createGoalTurnLifecycle(ctx) {
129
105
  if (!goal || goal.archivedAt) {
130
106
  turnGoalIds.delete(id);
131
107
  turnStartedAt.delete(id);
108
+ turnObjectiveRevisions.delete(id);
132
109
  return null;
133
110
  }
134
111
  const at = now();
135
112
  turnGoalIds.set(id, goal.id);
136
113
  turnStartedAt.set(id, at);
137
- observeGoal(ctx, id, publicGoal(goal, at));
114
+ turnObjectiveRevisions.set(id, goal.objectiveRevision);
138
115
  if (goal.status !== 'active') return visibleSnapshot(id);
139
116
  goal.turnCount = Math.max(0, Math.floor(Number(goal.turnCount) || 0)) + 1;
140
117
  startActiveClock(goal, at);
141
118
  goal.updatedAt = at;
142
- const published = await commit(id, goal);
143
- // A turn that starts from the settled duration wait IS that review, so
144
- // the next continuation waits instead of asking again unchanged.
145
- if (settledDurationWait(published)) idleReviewTurns.set(id, idleReviewKey(published));
146
- else idleReviewTurns.delete(id);
147
- return published;
119
+ idleReviewTurns.delete(id);
120
+ return commit(id, goal);
148
121
  });
149
122
  },
150
123
  settleTurn(sessionId, detail = {}) {
@@ -152,6 +125,7 @@ export function createGoalTurnLifecycle(ctx) {
152
125
  const expectedGoalId = turnGoalIds.get(id) || '';
153
126
  turnGoalIds.delete(id);
154
127
  turnStartedAt.delete(id);
128
+ turnObjectiveRevisions.delete(id);
155
129
  const goal = readRecord(id).goal;
156
130
  // commit() returns the record even when it is archived, so a settled
157
131
  // turn on retired work would republish the capsule the user's prompt
@@ -192,50 +166,21 @@ export function createGoalTurnLifecycle(ctx) {
192
166
  return commit(id, goal, options);
193
167
  });
194
168
  },
195
- continuation(sessionId, { agentStatus = null } = {}) {
169
+ // `todo`: the session's open step list, carried in every continuation.
170
+ continuation(sessionId, { agentStatus = null, todo = '' } = {}) {
196
171
  const goal = visibleSnapshot(sessionId);
197
172
  if (goal?.status !== 'active') return { run: false, reason: goal?.status || 'missing', goal };
198
- if (runningAgentWork(agentStatus)) return { run: false, reason: 'agent-running', goal };
199
173
  const id = assertSessionId(sessionId);
174
+ // The same wait rule as the todo completion check: a running agent or
175
+ // an awaited background shell wakes the session when it ends.
176
+ if (awaitingBackgroundWork({ sessionId: id, agentStatus })) return { run: false, reason: 'awaiting-work', goal };
200
177
  if (unsavedStops.get(id) === goal.id) return { run: false, reason: 'unsaved-stop', goal };
201
- const answered = idleReviewTurns.get(id) === idleReviewKey(goal);
202
- if (settledDurationWait(goal)) {
203
- // The model already answered this exact list with no new work, so the
204
- // deadline timer owns the rest of the wait and delivers closeout;
205
- // task/scope changes still publish and wake newly actionable work.
206
- if (answered) return { run: false, reason: 'duration-wait', goal };
207
- // One turn to spend the remaining duration on new work or to park
208
- // approval-dependent work: idling it away is not the requested wait.
209
- // This turn has to decide the rest of the duration, so it carries the
210
- // full rules that decision is judged against.
211
- continuationTiers.set(id, { goalId: goal.id, revision: goal.revision, quietTurns: 0 });
212
- return { run: true, reason: 'idle-review', goal, prompt: continuationPrompt(goal, { idleReview: true }) };
213
- }
214
- // The same wait for an unfinished list: a task change, a user turn, or
178
+ // An automatic turn already answered with no tool call: a user turn or
215
179
  // the deadline's closeout starts the next Goal turn.
216
- if (answered) return { run: false, reason: 'no-progress-wait', goal };
217
- const entry = continuationTiers.get(id);
218
- if (needsFullContinuationRules(entry?.goalId, goal)) {
219
- continuationTiers.set(id, { goalId: goal.id, revision: goal.revision, quietTurns: 0 });
220
- return { run: true, reason: 'idle', goal, prompt: continuationPrompt(goal) };
221
- }
222
- // A changed revision means the model mutated tasks last turn and holds
223
- // the fresh list in its own tool result; repeating it buys nothing. The
224
- // state block returns only once the list has gone unread long enough to
225
- // drift out of attention.
226
- const quietTurns = entry.revision === goal.revision ? entry.quietTurns + 1 : 0;
227
- const includeState = quietTurns >= GOAL_STATE_REMINDER_QUIET_TURNS;
228
- continuationTiers.set(id, {
229
- goalId: goal.id,
230
- revision: goal.revision,
231
- quietTurns: includeState ? 0 : quietTurns,
232
- });
233
- return {
234
- run: true,
235
- reason: 'idle',
236
- goal,
237
- prompt: continuationPrompt(goal, { includeRules: false, includeState }),
238
- };
180
+ if (idleReviewTurns.get(id) === idleReviewKey(goal)) return { run: false, reason: 'no-progress-wait', goal };
181
+ const includeRules = continuationTiers.get(id) !== goal.id;
182
+ continuationTiers.set(id, goal.id);
183
+ return { run: true, reason: 'idle', goal, prompt: continuationPrompt(goal, { includeRules, todo }) };
239
184
  },
240
185
  resetContinuationRules(sessionId) {
241
186
  continuationTiers.delete(assertSessionId(sessionId));
@@ -1,59 +1,81 @@
1
+ import { readFileSync, statSync } from 'node:fs';
2
+ import { join } from 'node:path';
1
3
  import { normalizeOrchestrationMode } from '../../../shared/orchestration.mjs';
2
-
3
- const BATCHING = {
4
- focused: `Lead executes the main scope directly. Delegate only substantial,
5
- self-contained supporting work, one agent per role; batch related tasks
6
- rather than splitting them for parallelism.`,
7
- balanced: `Delegate independent work by coherent feature or module, one agent per
8
- scope; a scope is one verifiable deliverable. Batch related tasks within the
9
- same change scope rather than splitting every file or step.`,
10
- swarm: `Delegate every independent scope to its own agent; a scope is one
11
- verifiable deliverable, not a bundle of steps. Treat disjoint file or
12
- module sets as independent and merge scopes only on a true output
13
- dependency.`,
14
- };
15
-
16
- const SOLO = `# Orchestration Mode: Solo
17
-
18
- Lead executes all work directly and never delegates on its own judgment.
19
- Only when the user explicitly asks for delegation, load the deferred \`agent\`
20
- tool and brief each agent as the Lead rules describe.`;
4
+ import { mixdogRoot, resolvePluginData } from '../../../shared/plugin-paths.mjs';
5
+ import { decodeInstructionFile } from '../../../../lib/instruction-text.cjs';
21
6
 
22
7
  /** Agent mode's fixed delegation block, in place of the orchestration mode. */
23
8
  export const AGENT_MODE_DELEGATION = `# Delegation
24
9
 
25
- Handle conversation yourself. Delegate specialised work to sub-agents. Hand
26
- substantial coding to a new agent task session (\`session create\`) with
27
- a self-contained brief: start it when already requested, otherwise suggest it. Then relay the
28
- result in your own words. Promise a follow-up only when the session result allows it.`;
10
+ Handle conversation yourself. Do quick lookups and small edits yourself. Hand
11
+ self-contained investigation, writing or implementation to sub-agents
12
+ (\`agent\`); their reports return to this chat. Open a new agent task session
13
+ (\`session create\`) only for a big plan, multi-step work across many files or
14
+ stages that needs its own Lead, with a self-contained brief: start it when
15
+ already requested, otherwise suggest it. Then relay the result in your own
16
+ words. Promise a follow-up only when the session result allows it.`;
29
17
 
30
18
  /** An agent-mode Lead's contact catalog intro: the user's other bots. */
31
19
  export const MIXY_CONTACTS_INTRO = `The user's other bots. Hand one a request with \`session send\` to its chat and a
32
20
  self-contained brief.`;
33
21
 
34
- export function orchestrationInstructions(value) {
22
+ const modeFileName = (mode) => `${normalizeOrchestrationMode(mode)}.md`;
23
+
24
+ /** The shipped mode file (<root>/orchestration/<mode>.md). */
25
+ export const shippedOrchestrationPath = (mode) => join(mixdogRoot(), 'orchestration', modeFileName(mode));
26
+ /** The user's replacement (<data>/orchestration/<mode>.md). */
27
+ export const userOrchestrationPath = (mode) => join(resolvePluginData(), 'orchestration', modeFileName(mode));
28
+
29
+ // A file's text (CRLF → LF, trailing whitespace trimmed), null when it does not
30
+ // exist, or { problem } when it cannot serve as the prompt (instruction-text.cjs).
31
+ // promptRulesRevision reads every mode on each check, so a read is reused while
32
+ // the file's identity (mtime, ctime, inode, size) is unchanged — but only once
33
+ // the file is older than the timestamp granularity: a file written moments ago
34
+ // can change again within the same tick without any of those moving.
35
+ const SETTLED_MS = 2000;
36
+ const fileCache = new Map();
37
+ export function readInstructionFile(file) {
38
+ let stat;
39
+ try {
40
+ stat = statSync(file);
41
+ } catch (error) {
42
+ return error?.code === 'ENOENT' || error?.code === 'ENOTDIR' ? null : { problem: 'unreadable' };
43
+ }
44
+ const key = `${stat.mtimeMs}:${stat.ctimeMs}:${stat.ino}:${stat.size}`;
45
+ const hit = fileCache.get(file);
46
+ if (hit?.key === key && hit.settled) return hit.value;
47
+ let value;
48
+ try {
49
+ if (!stat.isFile()) value = { problem: 'unreadable' };
50
+ else {
51
+ const decoded = decodeInstructionFile(readFileSync(file));
52
+ value = decoded.problem ? decoded : { text: decoded.text.replace(/\r\n/g, '\n').trimEnd() };
53
+ }
54
+ } catch {
55
+ value = { problem: 'unreadable' };
56
+ }
57
+ fileCache.set(file, { key, value, settled: Date.now() - stat.mtimeMs > SETTLED_MS });
58
+ return value;
59
+ }
60
+
61
+ /**
62
+ * Where a mode's text comes from: the user's file when it is usable, else the
63
+ * shipped one. `problem` says why a user file that exists was passed over
64
+ * (empty, too-large, not-text, unreadable); `text` is the prompt text.
65
+ */
66
+ function orchestrationModeSource(value) {
35
67
  const mode = normalizeOrchestrationMode(value);
36
- if (mode === 'none') return SOLO;
37
- // Focused already says Lead executes the main scope directly.
38
- const oneScope =
39
- mode === 'focused' ? '' : '\nIf the plan has only one implementation scope, Lead executes it directly.';
40
- return `# Orchestration Mode: ${mode[0].toUpperCase()}${mode.slice(1)}
41
-
42
- ${BATCHING[mode]}
43
-
44
- The mode sets how work splits; an agent's description sets its role and when
45
- it runs. Splitting applies to every role alike — implementation, review,
46
- investigation, writing — by file, module, commit range or risk area.${oneScope}
47
-
48
- Delegation is for work whose size justifies a brief. When the brief would have
49
- to spell out the edits themselves — a few localized changes whose sites Lead
50
- already holds — Lead makes them directly in every mode; the number of files or
51
- scopes does not change this.
52
-
53
- Dispatch all ready independent scopes in one turn. Only a scope that requires
54
- another's output waits.
55
- A new independent need goes to a new agent. When scopes touch the same file, name one owner for
56
- that file in each brief.
57
- Use only available agents; when none fits a role, Lead does that work itself
58
- and never changes settings to enable one.`;
68
+ const user = readInstructionFile(userOrchestrationPath(mode));
69
+ if (user?.text) return { mode, source: 'user', text: user.text };
70
+ const shipped = readInstructionFile(shippedOrchestrationPath(mode));
71
+ return {
72
+ mode,
73
+ source: 'default',
74
+ text: shipped?.text ?? '',
75
+ ...(user?.problem ? { problem: user.problem } : {}),
76
+ };
77
+ }
78
+
79
+ export function orchestrationInstructions(value) {
80
+ return orchestrationModeSource(value).text;
59
81
  }