mixdog 1.4.2 → 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 (417) hide show
  1. package/package.json +2 -2
  2. package/scripts/build-shipped-history.mjs +15 -5
  3. package/scripts/gate-local.mjs +65 -19
  4. package/scripts/graph-parity.mjs +8 -3
  5. package/scripts/lib/gate-scheduler.mjs +2 -1
  6. package/scripts/lib/run-node-tests.mjs +17 -5
  7. package/scripts/lib/test-failure-summary.mjs +1 -8
  8. package/scripts/lib/test-spawn-ledger.mjs +33 -2
  9. package/scripts/post-release-check.mjs +26 -16
  10. package/scripts/provider-pingpong-live.mjs +1 -1
  11. package/scripts/prune-embedding-runtime.mjs +3 -1
  12. package/scripts/release-paths.mjs +7 -1
  13. package/src/defaults/shipped-history.json +20 -0
  14. package/src/defaults/skills/setup/SKILL.md +2 -2
  15. package/src/defaults/skills/setup/references/actions.md +16 -3
  16. package/src/defaults/skills/setup/references/surfaces.md +3 -0
  17. package/src/defaults/skills/setup-guide/SKILL.md +6 -1
  18. package/src/lib/instruction-text.cjs +36 -0
  19. package/src/lib/rules-builder.cjs +34 -20
  20. package/src/orchestration/balanced.md +23 -0
  21. package/src/orchestration/focused.md +22 -0
  22. package/src/orchestration/none.md +5 -0
  23. package/src/orchestration/swarm.md +24 -0
  24. package/src/rules/agent-mode/AGENT_MODE.md +3 -1
  25. package/src/rules/agent-mode/MIXY.md +2 -2
  26. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/session-prep.mjs +3 -3
  27. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch.mjs +0 -1
  28. package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +4 -2
  29. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +0 -9
  30. package/src/runtime/agent/orchestrator/agent-runtime/heartbeat-completion.mjs +2 -2
  31. package/src/runtime/agent/orchestrator/agent-runtime/session-builder.mjs +67 -0
  32. package/src/runtime/agent/orchestrator/agent-trace-format.mjs +1 -0
  33. package/src/runtime/agent/orchestrator/context/role-instructions.mjs +4 -4
  34. package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +3 -1
  35. package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +199 -46
  36. package/src/runtime/agent/orchestrator/mcp/client-config.mjs +3 -5
  37. package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +9 -3
  38. package/src/runtime/agent/orchestrator/mcp/client.mjs +3 -5
  39. package/src/runtime/agent/orchestrator/mcp/oauth-client.mjs +1 -1
  40. package/src/runtime/agent/orchestrator/mcp/oauth-credentials.mjs +8 -2
  41. package/src/runtime/agent/orchestrator/mcp/oauth-probe.mjs +1 -1
  42. package/src/runtime/agent/orchestrator/mcp/oauth-provider.mjs +14 -0
  43. package/src/runtime/agent/orchestrator/mcp/oauth.mjs +1 -1
  44. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
  45. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-stop.mjs +3 -3
  46. package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +1 -1
  47. package/src/runtime/agent/orchestrator/providers/gemini-thinking.mjs +2 -2
  48. package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +4 -6
  49. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-head-parity.json +2784 -2872
  50. package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +5 -8
  51. package/src/runtime/agent/orchestrator/providers/openai-responses-payload-parity.fixture.json +288 -300
  52. package/src/runtime/agent/orchestrator/providers/vertex-ai.mjs +10 -1
  53. package/src/runtime/agent/orchestrator/providers/xai-tool-search-head-parity.json +10 -30
  54. package/src/runtime/agent/orchestrator/runtime-core/builtin-features.mjs +30 -0
  55. package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +0 -11
  56. package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-availability.mjs +8 -0
  57. package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-delta.mjs +17 -3
  58. package/src/runtime/agent/orchestrator/runtime-core/goal-control.mjs +47 -27
  59. package/src/runtime/agent/orchestrator/runtime-core/goal-deadlines.mjs +141 -10
  60. package/src/runtime/agent/orchestrator/runtime-core/goal-mutations.mjs +26 -63
  61. package/src/runtime/agent/orchestrator/runtime-core/goal-reminder.mjs +28 -3
  62. package/src/runtime/agent/orchestrator/runtime-core/goal-runtime.mjs +36 -11
  63. package/src/runtime/agent/orchestrator/runtime-core/goal-state.mjs +88 -56
  64. package/src/runtime/agent/orchestrator/runtime-core/goal-storage.mjs +4 -1
  65. package/src/runtime/agent/orchestrator/runtime-core/goal-store.mjs +51 -32
  66. package/src/runtime/agent/orchestrator/runtime-core/goal-text.mjs +45 -145
  67. package/src/runtime/agent/orchestrator/runtime-core/goal-tool-defs.mjs +15 -98
  68. package/src/runtime/agent/orchestrator/runtime-core/goal-tool-exec.mjs +32 -99
  69. package/src/runtime/agent/orchestrator/runtime-core/goal-turns.mjs +23 -78
  70. package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +69 -48
  71. package/src/runtime/agent/orchestrator/runtime-core/todo-list.mjs +367 -0
  72. package/src/runtime/agent/orchestrator/runtime-core/todo-tool-defs.mjs +47 -0
  73. package/src/runtime/agent/orchestrator/runtime-core/tool-availability.mjs +155 -0
  74. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-data.mjs +9 -0
  75. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +119 -35
  76. package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +1 -1
  77. package/src/runtime/agent/orchestrator/runtime-core/workflow/context.mjs +1 -1
  78. package/src/runtime/agent/orchestrator/session/agent-loop.mjs +28 -22
  79. package/src/runtime/agent/orchestrator/session/agent-pool-progress.mjs +30 -0
  80. package/src/runtime/agent/orchestrator/session/attachment-preflight.mjs +1 -1
  81. package/src/runtime/agent/orchestrator/session/cache-warm.mjs +2 -2
  82. package/src/runtime/agent/orchestrator/session/catalog-db/index.mjs +2 -2
  83. package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +1 -1
  84. package/src/runtime/agent/orchestrator/session/compact/execution-tail.mjs +1 -1
  85. package/src/runtime/agent/orchestrator/session/compact/runner.mjs +3 -0
  86. package/src/runtime/agent/orchestrator/session/compact/summary-route.mjs +1 -1
  87. package/src/runtime/agent/orchestrator/session/context-utils.mjs +8 -12
  88. package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +1 -1
  89. package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +1 -1
  90. package/src/runtime/agent/orchestrator/session/conversation-import/convert.mjs +1 -1
  91. package/src/runtime/agent/orchestrator/session/conversation-import/imported-session.mjs +7 -3
  92. package/src/runtime/agent/orchestrator/session/human-gate/held-message.mjs +1 -1
  93. package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +1 -2
  94. package/src/runtime/agent/orchestrator/session/human-gate/run-policy.mjs +1 -1
  95. package/src/runtime/agent/orchestrator/session/image-strip-recovery.mjs +1 -1
  96. package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +11 -1
  97. package/src/runtime/agent/orchestrator/session/loop/context-overflow.mjs +1 -1
  98. package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +8 -1
  99. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/todo-check.mjs +196 -0
  100. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +116 -50
  101. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +8 -1
  102. package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +1 -1
  103. package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +1 -1
  104. package/src/runtime/agent/orchestrator/session/loop/steering.mjs +3 -1
  105. package/src/runtime/agent/orchestrator/session/loop/stored-tool-args.mjs +5 -6
  106. package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +6 -1
  107. package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +16 -2
  108. package/src/runtime/agent/orchestrator/session/loop/turn-report.mjs +35 -0
  109. package/src/runtime/agent/orchestrator/session/loop/usage.mjs +1 -1
  110. package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +57 -26
  111. package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +9 -7
  112. package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +21 -3
  113. package/src/runtime/agent/orchestrator/session/manager/ask-turn-failure.mjs +27 -11
  114. package/src/runtime/agent/orchestrator/session/manager/ask-turn-open.mjs +37 -34
  115. package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +15 -0
  116. package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +25 -15
  117. package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +79 -24
  118. package/src/runtime/agent/orchestrator/session/manager/ask-turn-steering-drain.mjs +3 -0
  119. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +12 -1
  120. package/src/runtime/agent/orchestrator/session/manager/context-meta.mjs +1 -1
  121. package/src/runtime/agent/orchestrator/session/manager/idle-cleanup.mjs +6 -1
  122. package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +9 -1
  123. package/src/runtime/agent/orchestrator/session/manager/pending-spool-path.mjs +2 -2
  124. package/src/runtime/agent/orchestrator/session/manager/pending-spool-shard.mjs +1 -1
  125. package/src/runtime/agent/orchestrator/session/manager/prompt-settings.mjs +598 -0
  126. package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +19 -0
  127. package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +19 -10
  128. package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +5 -0
  129. package/src/runtime/agent/orchestrator/session/manager/session-fallback-title.mjs +1 -1
  130. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +31 -0
  131. package/src/runtime/agent/orchestrator/session/manager/session-lock.mjs +31 -0
  132. package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +42 -6
  133. package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +2 -0
  134. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +11 -1
  135. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-context.mjs +8 -9
  136. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +339 -88
  137. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-recovery.mjs +135 -11
  138. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +377 -104
  139. package/src/runtime/agent/orchestrator/session/manager/turn-durability.mjs +144 -0
  140. package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +1 -1
  141. package/src/runtime/agent/orchestrator/session/manager/usage-metrics.mjs +4 -0
  142. package/src/runtime/agent/orchestrator/session/manager.mjs +6 -0
  143. package/src/runtime/agent/orchestrator/session/mixy-name.mjs +1 -1
  144. package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +8 -1
  145. package/src/runtime/agent/orchestrator/session/save-session-worker.mjs +5 -1
  146. package/src/runtime/agent/orchestrator/session/store/canonical-reader.mjs +1 -1
  147. package/src/runtime/agent/orchestrator/session/store/liveness-veto.mjs +2 -2
  148. package/src/runtime/agent/orchestrator/session/store/save-worker.mjs +23 -2
  149. package/src/runtime/agent/orchestrator/session/store/sweep/sub-agent-retention.mjs +3 -3
  150. package/src/runtime/agent/orchestrator/session/store/transcript-durability.mjs +88 -0
  151. package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +5 -0
  152. package/src/runtime/agent/orchestrator/session/store-summary-log.mjs +1 -1
  153. package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +14 -5
  154. package/src/runtime/agent/orchestrator/session/store-transcript-worker.mjs +2 -2
  155. package/src/runtime/agent/orchestrator/session/store.mjs +5 -0
  156. package/src/runtime/agent/orchestrator/session/synthetic-user-envelope.mjs +7 -1
  157. package/src/runtime/agent/orchestrator/session/tail-reminder-rules.mjs +9 -1
  158. package/src/runtime/agent/orchestrator/session/transcript-restore/agent-envelope.mjs +1 -1
  159. package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +3 -1
  160. package/src/runtime/agent/orchestrator/session/transcript-restore/user-text.mjs +2 -2
  161. package/src/runtime/agent/orchestrator/stall-policy.mjs +3 -5
  162. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/backgrounded-result.mjs +4 -1
  163. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/misuse-guard.mjs +21 -3
  164. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/result-format.mjs +1 -1
  165. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/worktree-add-guard.mjs +77 -0
  166. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +0 -1
  167. package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +7 -3
  168. package/src/runtime/agent/orchestrator/tools/builtin/git-worktree-tool.mjs +27 -9
  169. package/src/runtime/agent/orchestrator/tools/builtin/lib/search-input-helpers.mjs +2 -2
  170. package/src/runtime/agent/orchestrator/tools/builtin/read-range-index.mjs +1 -1
  171. package/src/runtime/agent/orchestrator/tools/builtin/read-single-fast-paths.mjs +0 -1
  172. package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +0 -10
  173. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +1 -2
  174. package/src/runtime/agent/orchestrator/tools/builtin.mjs +1 -24
  175. package/src/runtime/agent/orchestrator/tools/code-graph/graph-binary/child-kill.mjs +4 -3
  176. package/src/runtime/agent/orchestrator/tools/code-graph/graph-binary.mjs +1 -2
  177. package/src/runtime/agent/orchestrator/tools/code-graph/modes/calls.mjs +1 -1
  178. package/src/runtime/agent/orchestrator/tools/code-graph/modes/symbols.mjs +2 -2
  179. package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +4 -5
  180. package/src/runtime/agent/orchestrator/tools/code-graph/symbol-index.mjs +3 -4
  181. package/src/runtime/agent/orchestrator/tools/code-graph.mjs +4 -22
  182. package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +2 -2
  183. package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +1 -1
  184. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +0 -4
  185. package/src/runtime/agent/orchestrator/tools/shell-policy.mjs +0 -1
  186. package/src/runtime/attachments/attachment-reference.mjs +1 -1
  187. package/src/runtime/attachments/pdf-extract.mjs +1 -1
  188. package/src/runtime/attachments/store.d.mts +1 -0
  189. package/src/runtime/attachments/store.mjs +2 -2
  190. package/src/runtime/channels/lib/config-reload-watch.mjs +42 -0
  191. package/src/runtime/channels/lib/owned-runtime/config-reload.mjs +29 -9
  192. package/src/runtime/channels/lib/scheduler.mjs +33 -0
  193. package/src/runtime/channels/lib/schedules-db.mjs +11 -4
  194. package/src/runtime/channels/lib/webhook/session-dispatch.mjs +4 -1
  195. package/src/runtime/channels/lib/webhooks-db.mjs +9 -3
  196. package/src/runtime/channels/lib/whisper-server.mjs +12 -12
  197. package/src/runtime/channels/lib/worker-main.mjs +9 -31
  198. package/src/runtime/computer-bridge/linux-readiness.mjs +10 -14
  199. package/src/runtime/connectors/connector-accounts-mcp.mjs +169 -33
  200. package/src/runtime/connectors/gmail-app-password.mjs +2 -2
  201. package/src/runtime/connectors/google-mcp.mjs +1 -1
  202. package/src/runtime/effort-judge/judge-client.mjs +2 -2
  203. package/src/runtime/effort-judge/judge-input.mjs +4 -4
  204. package/src/runtime/explore/explorer.mjs +0 -5
  205. package/src/runtime/explore/tool.mjs +3 -3
  206. package/src/runtime/local-provider/hardware.mjs +1 -1
  207. package/src/runtime/media/adapters/codex-image.mjs +3 -3
  208. package/src/runtime/media/adapters/gemini-video.mjs +1 -1
  209. package/src/runtime/media/media-usage.mjs +1 -1
  210. package/src/runtime/media/store.mjs +1 -1
  211. package/src/runtime/memory/index.mjs +11 -1
  212. package/src/runtime/memory/lib/embedding-reindex.mjs +27 -0
  213. package/src/runtime/memory/lib/memory-embed.mjs +83 -14
  214. package/src/runtime/memory/lib/memory-process-lock.mjs +159 -36
  215. package/src/runtime/memory/lib/memory-text-utils.mjs +6 -1
  216. package/src/runtime/memory/lib/memory.mjs +17 -0
  217. package/src/runtime/memory/lib/pg/process.mjs +1 -1
  218. package/src/runtime/memory/lib/pg/supervisor.mjs +16 -96
  219. package/src/runtime/memory/lib/recall-hybrid/hybrid-sql.mjs +12 -3
  220. package/src/runtime/office/authoring/docx-html-runner.mjs +1 -1
  221. package/src/runtime/office/authoring/pptx-author-action.mjs +1 -1
  222. package/src/runtime/office/authoring/xlsx-html-build.mjs +1 -1
  223. package/src/runtime/office/authoring/xlsx-html-runner.mjs +1 -1
  224. package/src/runtime/office/capabilities.mjs +1 -1
  225. package/src/runtime/office/core/office-core.mjs +1 -1
  226. package/src/runtime/office/design/content-model.mjs +3 -3
  227. package/src/runtime/office/design/docx/design-docx/section.mjs +6 -6
  228. package/src/runtime/office/design/xlsx/design-xlsx-components.mjs +1 -1
  229. package/src/runtime/office/design/xlsx/design-xlsx.mjs +1 -1
  230. package/src/runtime/office/pdf/ocr-engine.mjs +1 -1
  231. package/src/runtime/office/pdf/pdf-writer.mjs +4 -4
  232. package/src/runtime/office/portable/portable-docx-operations.mjs +2 -2
  233. package/src/runtime/office/portable/portable-soffice.mjs +8 -6
  234. package/src/runtime/office/portable/xlsx-contract.mjs +1 -1
  235. package/src/runtime/shared/atomic-file.d.mts +8 -0
  236. package/src/runtime/shared/background-tasks.mjs +22 -4
  237. package/src/runtime/shared/background-wait.mjs +66 -0
  238. package/src/runtime/shared/child-guardian.mjs +17 -7
  239. package/src/runtime/shared/config.mjs +313 -16
  240. package/src/runtime/shared/connector-catalog.d.mts +4 -5
  241. package/src/runtime/shared/connector-catalog.mjs +11 -1
  242. package/src/runtime/shared/file-lock.mjs +8 -3
  243. package/src/runtime/shared/git-runner.mjs +7 -2
  244. package/src/runtime/shared/idle-gc.mjs +30 -7
  245. package/src/runtime/shared/llm/http-agent.mjs +8 -5
  246. package/src/runtime/shared/llm/system-proxy.mjs +2 -1
  247. package/src/runtime/shared/llm/usage-ledger-quota.mjs +31 -12
  248. package/src/runtime/shared/llm/usage-ledger-rollup.mjs +84 -8
  249. package/src/runtime/shared/llm/usage-ledger.mjs +3 -0
  250. package/src/runtime/shared/llm/usage-rollup.mjs +48 -0
  251. package/src/runtime/shared/maintenance-schedule.mjs +109 -0
  252. package/src/runtime/shared/process-runner.mjs +8 -4
  253. package/src/runtime/shared/routine-trigger.d.mts +13 -0
  254. package/src/runtime/shared/routine-trigger.mjs +34 -0
  255. package/src/runtime/shared/run-child.d.mts +2 -1
  256. package/src/runtime/shared/run-child.mjs +70 -18
  257. package/src/runtime/shared/session-scratch.mjs +14 -2
  258. package/src/runtime/shared/shipped-definitions.mjs +7 -1
  259. package/src/runtime/shared/tool-card-model.golden.json +3 -12
  260. package/src/runtime/shared/tool-execution-contract.mjs +2 -0
  261. package/src/runtime/shared/tool-work-units.mjs +31 -6
  262. package/src/runtime/shared/turn-snapshot.mjs +26 -4
  263. package/src/runtime/shared/turn-worktree-snapshot.mjs +6 -11
  264. package/src/runtime/shared/worker-requests.mjs +17 -3
  265. package/src/runtime/shared/worktrees/branch-management.mjs +1 -5
  266. package/src/runtime/shared/worktrees/contract.mjs +16 -6
  267. package/src/runtime/shared/worktrees/dependencies.mjs +127 -89
  268. package/src/runtime/shared/worktrees/disk.mjs +79 -2
  269. package/src/runtime/shared/worktrees/git.mjs +44 -11
  270. package/src/runtime/shared/worktrees/include.mjs +6 -4
  271. package/src/runtime/shared/worktrees/maintenance.mjs +422 -30
  272. package/src/runtime/shared/worktrees/manager.mjs +772 -75
  273. package/src/runtime/shared/worktrees/settings.mjs +33 -7
  274. package/src/runtime/shared/worktrees/test-support.mjs +5 -1
  275. package/src/runtime/shared/worktrees/worker-snapshots.mjs +82 -0
  276. package/src/runtime/tidy/process.mjs +2 -1
  277. package/src/runtime/web-search/index.mjs +3 -22
  278. package/src/runtime/web-search/lib/web-tools.mjs +2 -2
  279. package/src/runtime/web-search/tool-defs.mjs +17 -26
  280. package/src/session-runtime/agent-profile-changes.mjs +55 -4
  281. package/src/session-runtime/boot/apis.mjs +27 -4
  282. package/src/session-runtime/boot/begin.mjs +2 -0
  283. package/src/session-runtime/boot/config.mjs +10 -1
  284. package/src/session-runtime/boot/facade.mjs +1 -0
  285. package/src/session-runtime/boot/providers.mjs +70 -3
  286. package/src/session-runtime/boot/session.mjs +2 -0
  287. package/src/session-runtime/boot/tools.mjs +69 -25
  288. package/src/session-runtime/channel-config-api.mjs +1 -0
  289. package/src/session-runtime/config-change-effects.mjs +179 -0
  290. package/src/session-runtime/config-lifecycle/config-writers.mjs +1 -0
  291. package/src/session-runtime/config-lifecycle.mjs +160 -24
  292. package/src/session-runtime/conversation-import/discovery.mjs +86 -7
  293. package/src/session-runtime/conversation-import/service.mjs +3 -2
  294. package/src/session-runtime/goal-facade-api.mjs +49 -3
  295. package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +3 -0
  296. package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +3 -2
  297. package/src/session-runtime/internal-tool-executor/feature-tools.mjs +3 -11
  298. package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +18 -4
  299. package/src/session-runtime/internal-tool-executor.mjs +12 -19
  300. package/src/session-runtime/lifecycle/cold-heir.mjs +7 -0
  301. package/src/session-runtime/lifecycle/memory-ingest.mjs +3 -3
  302. package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +53 -5
  303. package/src/session-runtime/lifecycle/session-switch.mjs +13 -2
  304. package/src/session-runtime/lifecycle/teardown/session-close.mjs +4 -4
  305. package/src/session-runtime/lifecycle-api.mjs +1 -0
  306. package/src/session-runtime/mcp-glue/server-catalog.mjs +14 -3
  307. package/src/session-runtime/mcp-glue/server-connection.mjs +34 -8
  308. package/src/session-runtime/model-route/set-route.mjs +40 -7
  309. package/src/session-runtime/native-web-search/routes.mjs +3 -3
  310. package/src/session-runtime/provider-auth/refresh.mjs +6 -3
  311. package/src/session-runtime/provider-auth/setup.mjs +1 -1
  312. package/src/session-runtime/provider-readiness.mjs +53 -4
  313. package/src/session-runtime/resource-api.mjs +1 -1
  314. package/src/session-runtime/resource-extension-sync.mjs +4 -8
  315. package/src/session-runtime/resource-mcp-connector-accounts.mjs +5 -1
  316. package/src/session-runtime/resource-mcp-secrets.mjs +3 -3
  317. package/src/session-runtime/resource-plugins-api.mjs +4 -0
  318. package/src/session-runtime/routine-executor.mjs +152 -0
  319. package/src/session-runtime/routine-home-turn.mjs +46 -5
  320. package/src/session-runtime/runtime-facade.mjs +5 -0
  321. package/src/session-runtime/runtime-feature-gates.mjs +2 -11
  322. package/src/session-runtime/schedule-session-run.mjs +1 -0
  323. package/src/session-runtime/services/agent-tool/job-task-reconcile.mjs +6 -1
  324. package/src/session-runtime/services/agent-tool/job-views/session-progress.mjs +7 -0
  325. package/src/session-runtime/services/agent-tool/send-flow.mjs +110 -6
  326. package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +12 -0
  327. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-plan.mjs +5 -0
  328. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +24 -6
  329. package/src/session-runtime/services/agent-tool.mjs +51 -1
  330. package/src/session-runtime/services/channel-admin.mjs +18 -0
  331. package/src/session-runtime/services/hook-bus/command-handler.mjs +7 -11
  332. package/src/session-runtime/services/plugin-admin.mjs +4 -0
  333. package/src/session-runtime/services/seeds.mjs +7 -0
  334. package/src/session-runtime/services/usage-stats-model.mjs +32 -11
  335. package/src/session-runtime/session-create/materialize.mjs +4 -2
  336. package/src/session-runtime/session-create/session-options.mjs +2 -0
  337. package/src/session-runtime/settings-builtin-tools-api.mjs +1 -9
  338. package/src/session-runtime/setup-tool/connector-widen-approval.mjs +1 -1
  339. package/src/session-runtime/setup-tool/executor.mjs +8 -1
  340. package/src/session-runtime/setup-tool/extended-actions.mjs +2 -0
  341. package/src/session-runtime/setup-tool/settings-contract.mjs +28 -0
  342. package/src/session-runtime/setup-tool/tool-defs.mjs +26 -1
  343. package/src/session-runtime/tool-policy/agent-profile-fold.mjs +40 -43
  344. package/src/session-runtime/tool-policy/mode-switch.mjs +1 -1
  345. package/src/session-runtime/tool-policy/policy-stage.mjs +106 -8
  346. package/src/session-runtime/tool-policy/workflow-overlay.mjs +2 -1
  347. package/src/session-runtime/tool-policy-refresh.mjs +182 -5
  348. package/src/session-runtime/tool-surface.mjs +38 -1
  349. package/src/session-runtime/turn/agent-ops.mjs +10 -2
  350. package/src/session-runtime/turn/session-ops.mjs +2 -0
  351. package/src/session-runtime/turn/turn-run/turn-prepare.mjs +5 -0
  352. package/src/session-runtime/turn/turn-run.mjs +1 -1
  353. package/src/session-runtime/webhook-session-run.mjs +2 -0
  354. package/src/session-runtime/workflow-agents-api/agent-connectors.mjs +1 -4
  355. package/src/session-runtime/workflow-agents-api/agent-route.mjs +3 -10
  356. package/src/session-runtime/workflow-agents-api/instruction-files.mjs +165 -0
  357. package/src/session-runtime/workflow-agents-api/style-and-mode.mjs +5 -4
  358. package/src/session-runtime/workflow-agents-api/workflow-packs.mjs +2 -3
  359. package/src/session-runtime/workflow-agents-api.mjs +2 -0
  360. package/src/session-runtime/workspace/project-branches.mjs +1 -1
  361. package/src/session-runtime/workspace/session-view.mjs +1 -1
  362. package/src/session-runtime/workspace/transitions.mjs +20 -4
  363. package/src/session-runtime/workspace/worktree-maintenance.mjs +126 -6
  364. package/src/session-runtime/workspace/worktree-setup.mjs +13 -1
  365. package/src/session-runtime/workspace/worktree-tool.mjs +16 -0
  366. package/src/standalone/daemon-agent-control.mjs +25 -8
  367. package/src/standalone/daemon-desktop-runtime.mjs +6 -2
  368. package/src/standalone/daemon-lag-profiler.mjs +7 -7
  369. package/src/standalone/daemon.mjs +54 -2
  370. package/src/standalone/local-session-runtime.mjs +16 -0
  371. package/src/standalone/session-client/daemon-unavailable.mjs +1 -1
  372. package/src/standalone/session-protocol.mjs +11 -0
  373. package/src/standalone/session-service/agent-route-follow.mjs +23 -20
  374. package/src/standalone/session-service/agent-tree/agent-turns.mjs +18 -6
  375. package/src/standalone/session-service/quota-resume.mjs +9 -0
  376. package/src/standalone/session-service/session-calls/session-action.mjs +51 -1
  377. package/src/standalone/session-service/session-calls/session-turns.mjs +37 -18
  378. package/src/standalone/session-service/session-calls/turn-gate.mjs +34 -0
  379. package/src/standalone/session-service/session-calls.mjs +2 -1
  380. package/src/tui/App.jsx +8 -0
  381. package/src/tui/app/clipboard.mjs +1 -1
  382. package/src/tui/app/create-app-pickers.mjs +2 -0
  383. package/src/tui/app/doctor.mjs +2 -2
  384. package/src/tui/app/panel-signature.mjs +1 -1
  385. package/src/tui/app/settings-picker.mjs +53 -8
  386. package/src/tui/app/shell-layout/row-budgets.mjs +2 -2
  387. package/src/tui/app/slash-commands.mjs +1 -1
  388. package/src/tui/app/slash-dispatch/route-commands.mjs +1 -1
  389. package/src/tui/app/slash-dispatch/session-commands.mjs +1 -1
  390. package/src/tui/app/use-prompt-queue-history.mjs +2 -2
  391. package/src/tui/app/use-transcript-activity.mjs +1 -1
  392. package/src/tui/app/use-transcript-window/geometry.mjs +1 -1
  393. package/src/tui/components/prompt-input/escape-policy.d.mts +0 -1
  394. package/src/tui/components/prompt-input/escape-policy.mjs +1 -1
  395. package/src/tui/components/question-panel-model.mjs +4 -4
  396. package/src/tui/components/tool-execution/standard-card.jsx +3 -4
  397. package/src/tui/components/user-message-skills.mjs +1 -1
  398. package/src/tui/dist/index.mjs +309 -30
  399. package/src/tui/markdown/render-ansi.mjs +1 -1
  400. package/src/tui/session/agent-job-feed/notification-router.mjs +10 -0
  401. package/src/tui/session/agent-job-feed.mjs +2 -0
  402. package/src/tui/session/context-state.mjs +3 -0
  403. package/src/tui/session/quota-resume.mjs +1 -1
  404. package/src/tui/session/session-api/lifecycle/dispose.mjs +1 -0
  405. package/src/tui/session/session-api/lifecycle/session-reset.mjs +7 -0
  406. package/src/tui/session/session-api/routes-agent-definitions.mjs +5 -0
  407. package/src/tui/session/session-api/worktree.mjs +13 -1
  408. package/src/tui/session/session-flow/drain.mjs +11 -14
  409. package/src/tui/session/tool-card-results/grouped-result.mjs +2 -2
  410. package/src/tui/session/turn-quiet.mjs +1 -1
  411. package/src/tui/session/turn.mjs +3 -0
  412. package/src/tui/session/worktree-setup-notice.mjs +1 -1
  413. package/src/tui/spinner-meta.mjs +3 -3
  414. package/src/tui/spinner-verbs.mjs +2 -2
  415. package/src/defaults/skills/goal-management/SKILL.md +0 -169
  416. package/src/runtime/agent/orchestrator/runtime-core/goal-tasks.mjs +0 -156
  417. package/src/session-runtime/goal-tasks.mjs +0 -1
@@ -23,6 +23,7 @@ import {
23
23
  _clearSessionRuntime,
24
24
  } from './runtime-liveness.mjs';
25
25
  import { clearTurnCheckpoint } from './turn-checkpoint.mjs';
26
+ import { forgetUnsettledTurn } from './turn-durability.mjs';
26
27
  import { forgetSessionSaveBaseline } from '../store/save-worker.mjs';
27
28
  import { publishSessionPersistence } from '../store/session-persistence-events.mjs';
28
29
  import { forgetSessionLoadCache } from '../store/load-cache.mjs';
@@ -31,6 +32,7 @@ import { cancelOwnedShellTrees } from '../../tools/lib/owned-shell-trees.mjs';
31
32
  import { noteShellOwnerSessionClosed } from '../../tools/builtin/lib/shell-job-records.mjs';
32
33
  import { forgetSideQuestion } from '../side-question-store.mjs';
33
34
  import { cancelBackgroundTasks } from '../../../../shared/background-tasks.mjs';
35
+ import { releaseWorkerSnapshots } from '../../../../shared/worktrees/worker-snapshots.mjs';
34
36
 
35
37
  /**
36
38
  * Close a session. Plants a `closed=true` tombstone on disk with a bumped
@@ -148,6 +150,7 @@ function finishClose({ id, reason, tombstone, entry, closeSnapshot, newGen, outc
148
150
  _stopToolActivityHeartbeat(id);
149
151
  cancelOwnedShellProcesses({ id, reason, tombstone });
150
152
  clearTurnCheckpoint(id);
153
+ forgetUnsettledTurn(id);
151
154
  teardownSessionRuntime({ id, entry, reason, tombstone, newGen });
152
155
  return true;
153
156
  }
@@ -377,6 +380,8 @@ export function unloadSessionRuntime(id, reason = 'runtime-unload') {
377
380
  closeProviderConnections(id, `runtime-unload:${reason}`);
378
381
  releaseSessionReadCaches(id);
379
382
  _clearSessionRuntime(id);
383
+ // A settled worker turn's read-only snapshots go with it (only ones it made).
384
+ void releaseWorkerSnapshots(id).catch(() => {});
380
385
  if (process.env.MIXDOG_DEBUG_SESSION_LOG) {
381
386
  try {
382
387
  process.stderr.write(`[agent-unload] session=${id} reason=${reason}\n`);
@@ -68,7 +68,7 @@ export function fallbackTitleFromMessages(messages) {
68
68
  /** Fills `session.title` only when missing. Never touches a locked (manual/AI)
69
69
  * or generated title, and leaves generatedTitleStage unset so
70
70
  * updateSessionGeneratedTitle can still upgrade it. The caller persists. */
71
- export function applyFallbackSessionTitle(session, title) {
71
+ function applyFallbackSessionTitle(session, title) {
72
72
  if (!session || !isUsableTitle(title) || isUsableTitle(session.title)) return false;
73
73
  if (session.titleLocked === true || session.generatedTitleStage) return false;
74
74
  session.title = title;
@@ -7,6 +7,7 @@ import { getProvider } from '../../providers/registry.mjs';
7
7
  import { invalidateContextUsageSnapshot, invalidateProviderContextBaseline } from '../loop/compact-policy.mjs';
8
8
  import { saveSession, saveSessionAsync, saveSessionAsyncDeferred, loadSession, setLiveSession } from '../store.mjs';
9
9
  import { _liveSessions } from '../store/live-state.mjs';
10
+ import { _getRuntimeEntry } from './runtime-liveness.mjs';
10
11
  import { _recoverTurnCheckpointDurably } from './turn-checkpoint-recovery.mjs';
11
12
  import { isAgentOwner } from '../../agent-owner.mjs';
12
13
  import { AGENT_MODE, resolveSessionMode, sessionModeOf } from '../agent-mode.mjs';
@@ -522,6 +523,36 @@ export function updateSessionRoute(id, route = {}, options = {}) {
522
523
  return session;
523
524
  }
524
525
 
526
+ /**
527
+ * A route saved for a session while its turn runs: held as
528
+ * `session.heldRoute` (on the object the running turn commits, so its save
529
+ * persists it) and applied at the session's next turn boundary
530
+ * (applyHeldSessionRoute). A later hold replaces an earlier one; `route`
531
+ * null drops the hold (the route was saved back to the running one).
532
+ */
533
+ export function holdSessionRoute(id, route = {}) {
534
+ if (!id) return null;
535
+ const targets = new Set([_getRuntimeEntry(id)?.session, loadSession(id)]);
536
+ let held = null;
537
+ for (const session of targets) {
538
+ if (session?.id !== id || session.closed === true) continue;
539
+ if (route) session.heldRoute = { ...route };
540
+ else delete session.heldRoute;
541
+ held = session;
542
+ }
543
+ return held;
544
+ }
545
+
546
+ /** A held route takes effect before the turn opens on `session`. */
547
+ export function applyHeldSessionRoute(session) {
548
+ const route = session?.heldRoute;
549
+ if (!route) return session;
550
+ delete session.heldRoute;
551
+ const crossProvider =
552
+ (route.provider && route.provider !== session.provider) || (route.model && route.model !== session.model);
553
+ return updateSessionRoute(session.id, route, { session, crossProvider }) || session;
554
+ }
555
+
525
556
  // --- resume (reload tools for a stored session) ---
526
557
  // Interrupted-turn recovery lives in turn-checkpoint-recovery.mjs; the
527
558
  // prepared tool surface it consumes is cached in prepared-resume-cache.mjs.
@@ -29,7 +29,38 @@ export function acquireSessionLock(sessionId, signal = null) {
29
29
  };
30
30
  const unlock = () => releaseSlot();
31
31
  if (!signal) return previousReady.then(() => unlock);
32
+ return waitForSlot(sessionId, signal, previousReady, releaseSlot, unlock);
33
+ }
34
+
35
+ /** The lock only when nobody holds it or waits for it: the unlock now, or
36
+ * null. Synchronous, so a caller can check and act with no turn starting
37
+ * in between (askSession takes this lock for every turn). */
38
+ export function tryAcquireSessionLock(sessionId) {
39
+ if (_sessionLocks.has(sessionId)) return null;
40
+ let release;
41
+ const entry = {
42
+ promise: new Promise((r) => {
43
+ release = r;
44
+ }),
45
+ count: 1,
46
+ };
47
+ _sessionLocks.set(sessionId, entry);
48
+ let released = false;
49
+ return () => {
50
+ if (released) return;
51
+ released = true;
52
+ entry.count--;
53
+ if (entry.count === 0 && _sessionLocks.get(sessionId) === entry) _sessionLocks.delete(sessionId);
54
+ release();
55
+ };
56
+ }
57
+
58
+ /** Someone waits for the lock behind its holder (a turn about to start). */
59
+ export function sessionLockContended(sessionId) {
60
+ return (_sessionLocks.get(sessionId)?.count ?? 0) > 1;
61
+ }
32
62
 
63
+ function waitForSlot(sessionId, signal, previousReady, releaseSlot, unlock) {
33
64
  // A cancelled waiter must reject immediately without opening a hole in the
34
65
  // mutex. Its reserved slot is skipped only after the previous holder exits,
35
66
  // so later waiters still cannot overlap the live owner.
@@ -4,6 +4,8 @@
4
4
  // carry all four to the provider with their cache tiers.
5
5
  import { buildSkillManifest, composeSystemPrompt } from '../../context/collect.mjs';
6
6
  import { configuredInstructionFilesMode, loadInstructionFilesContext } from '../../context/instruction-files.mjs';
7
+ import { normalizeInstructionFilesMode } from '../../../../shared/instruction-files-mode.mjs';
8
+ import { promptConfigSlice, promptSettingsRecord } from './prompt-settings.mjs';
7
9
  import { agentModeIdentityLine } from '../../context/role-instructions.mjs';
8
10
  import { AGENT_MODE, sessionModeOf } from '../agent-mode.mjs';
9
11
  import { MIXY_AGENT_ID } from '../agent-home.mjs';
@@ -13,6 +15,7 @@ import {
13
15
  _buildAgentModeRules,
14
16
  _buildLeadRules,
15
17
  _buildLeadMetaContext,
18
+ _buildLeadLanguage,
16
19
  _buildLeadLanguageContext,
17
20
  } from './rules-cache.mjs';
18
21
  import {
@@ -88,7 +91,7 @@ function buildShellEnvironmentContext(opts, ownerIsAgent, toolsForRouting, sessi
88
91
  * none.
89
92
  * @returns {{ environmentContext: string|undefined, instructionFilesContext: string|undefined }}
90
93
  */
91
- export function buildWorkspacePromptContext(session, cwd) {
94
+ export function buildWorkspacePromptContext(session, cwd, { instructionFilesMode } = {}) {
92
95
  const ownerIsAgent = session?.owner === 'agent';
93
96
  const toolFreeRole =
94
97
  ownerIsAgent && Array.isArray(session?.schemaAllowedTools) && session.schemaAllowedTools.length === 0;
@@ -103,7 +106,14 @@ export function buildWorkspacePromptContext(session, cwd) {
103
106
  instructionFilesContext:
104
107
  session?.skipInstructionFiles === true || sessionModeOf(session) === AGENT_MODE
105
108
  ? undefined
106
- : loadInstructionFilesContext({ mode: configuredInstructionFilesMode(), cwd }),
109
+ : loadInstructionFilesContext({
110
+ // A session runtime passes its in-memory setting; others read the file.
111
+ mode:
112
+ instructionFilesMode === undefined
113
+ ? configuredInstructionFilesMode()
114
+ : normalizeInstructionFilesMode(instructionFilesMode),
115
+ cwd,
116
+ }),
107
117
  };
108
118
  }
109
119
 
@@ -184,10 +194,13 @@ export function composeSessionSystem(opts, { profile, providerName, modelName, s
184
194
  sessionMode,
185
195
  });
186
196
  const leadOnly = !skipAgentRules && !ownerIsAgent;
187
- const metaContext = leadOnly ? _buildLeadMetaContext({ includeOutputStyle: !agentMode }) : '';
197
+ // The runtime's in-memory settings (a session runtime passes its config;
198
+ // other callers read the config file).
199
+ const config = promptConfigSlice(opts.promptConfig);
200
+ const metaContext = leadOnly ? _buildLeadMetaContext({ includeOutputStyle: !agentMode, config }) : '';
188
201
  // Lead-only response language; closes the environment block so no English
189
202
  // system text (session/shell/git lines) follows it.
190
- const languageContext = leadOnly ? _buildLeadLanguageContext({ includeOutputStyle: !agentMode }) : '';
203
+ const languageContext = leadOnly ? _buildLeadLanguageContext({ includeOutputStyle: !agentMode, config }) : '';
191
204
  // Cwd, shell and repository facts only serve tool calls; a tool-free role
192
205
  // gets none, which also keeps its prompt identical across projects.
193
206
  const shellEnvironmentContext = toolFreeRole
@@ -203,7 +216,10 @@ export function composeSessionSystem(opts, { profile, providerName, modelName, s
203
216
  const instructionFilesContext =
204
217
  toolFreeRole || profile?.skip?.claudemd || agentMode
205
218
  ? ''
206
- : loadInstructionFilesContext({ mode: configuredInstructionFilesMode(), cwd: opts.cwd });
219
+ : loadInstructionFilesContext({
220
+ mode: config ? normalizeInstructionFilesMode(config.instructionFiles) : configuredInstructionFilesMode(),
221
+ cwd: opts.cwd,
222
+ });
207
223
  const composed = composeSystemPrompt({
208
224
  ...roleFields,
209
225
  agentRules: injectedRules || undefined,
@@ -218,7 +234,27 @@ export function composeSessionSystem(opts, { profile, providerName, modelName, s
218
234
  environmentContext: shellEnvironmentContext,
219
235
  provider: providerName || null,
220
236
  });
221
- return { ...composed, environmentTailContext, promptIdentity };
237
+ // What the prompt presents of the prompt settings (prompt-settings.mjs).
238
+ const promptSettings = promptSettingsRecord({
239
+ meta: metaContext,
240
+ workflow: opts.workflowContext || '',
241
+ // A coding Lead's mode text (an agent-mode Lead's delegation block is fixed).
242
+ ...(ownerIsAgent || agentMode
243
+ ? {}
244
+ : {
245
+ orchestration: String(opts.leadWorkflowParts?.orchestrationContext || ''),
246
+ orchestrationMode: opts.orchestrationMode || '',
247
+ }),
248
+ skills: buildSkillManifest(skills),
249
+ language: languageContext,
250
+ instructionFiles: profile?.skip?.claudemd ? '' : instructionFilesContext,
251
+ coreMemory: profile?.skip?.memory ? '' : opts.coreMemoryContext || '',
252
+ instructionFilesMode: config
253
+ ? normalizeInstructionFilesMode(config.instructionFiles)
254
+ : configuredInstructionFilesMode(),
255
+ });
256
+ const responseLanguage = leadOnly ? _buildLeadLanguage({ config }) || null : null;
257
+ return { ...composed, environmentTailContext, promptIdentity, promptSettings, responseLanguage };
222
258
  }
223
259
 
224
260
  // 4-BP layout (see composeSystemPrompt docs):
@@ -168,6 +168,8 @@ export function buildSessionRecord({ opts, route, presetObj, surface, prompt, me
168
168
  sessionMode: opts.sessionMode,
169
169
  bp3CoreContext: prompt.sessionMarkerCore,
170
170
  promptIdentity: prompt.promptIdentity,
171
+ ...(prompt.promptSettings ? { promptSettings: prompt.promptSettings } : {}),
172
+ ...(prompt.responseLanguage !== undefined ? { responseLanguage: prompt.responseLanguage } : {}),
171
173
  callerDisallowedTools: [...(opts.callerDisallowedTools ?? opts.disallowedTools ?? [])],
172
174
  bp3EnvironmentContext: prompt.environmentTailContext,
173
175
  // BP3 core and the volatile environment live in SEPARATE system
@@ -11,6 +11,7 @@ import { buildSkillToolDefs } from '../../context/collect.mjs';
11
11
  import { filterModelEditTools } from '../../../../shared/edit-tool-dialect.mjs';
12
12
  import { filterMcpToolsForSession } from '../../runtime-core/extension-scopes.mjs';
13
13
  import { ROUTE_TOOL_ORDER } from '../../runtime-core/tool-catalog-data.mjs';
14
+ import { TODO_TOOL } from '../../runtime-core/todo-tool-defs.mjs';
14
15
 
15
16
  // Merge externally-connected MCP tools with the plugin's in-process tools
16
17
  // (registered by agent's toolExecutor adapter). Internal tools are exposed
@@ -110,10 +111,19 @@ export function resolveSessionTools(
110
111
  // The shell text follows the system shell the runtime actually resolves
111
112
  // (Git Bash/WSL on Windows, pwsh on POSIX), before the edit-dialect rewrite.
112
113
  const shellKind = resolveShellFor('default')?.shellType;
113
- const base = _computeBaseTools(toolSpec, mcp, skillTools).map((tool) => bindShellKind(tool, shellKind));
114
+ const base = withTodoTool(_computeBaseTools(toolSpec, mcp, skillTools), toolSpec).map((tool) =>
115
+ bindShellKind(tool, shellKind)
116
+ );
114
117
  return filterModelEditTools(base, modelName);
115
118
  }
116
119
 
120
+ // Every session that has tools at all owns a step list (the Lead and each
121
+ // agent alike); an explicit "no tools" spec stays without one.
122
+ function withTodoTool(tools, toolSpec) {
123
+ if (Array.isArray(toolSpec) && toolSpec.length === 0) return tools;
124
+ return _dedupByName([...tools, TODO_TOOL]);
125
+ }
126
+
117
127
  export function previewSessionTools(toolSpec, skills = [], options = {}) {
118
128
  return resolveSessionTools(toolSpec, skills, options);
119
129
  }
@@ -1,5 +1,5 @@
1
1
  import { contextMessagesSignature } from '../context-utils.mjs';
2
- import { checkpointMessage, findTurnStart, turnMessagesForCheckpoint } from './turn-checkpoint-journal.mjs';
2
+ import { checkpointMessage } from './turn-checkpoint-journal.mjs';
3
3
 
4
4
  const TURN_CONTEXT_STATE_VERSION = 1;
5
5
 
@@ -29,9 +29,11 @@ function compactCheckpointState(compaction) {
29
29
 
30
30
  /**
31
31
  * Capture provider usage or a post-compact replacement reading against the
32
- * same canonical message representation persisted by the checkpoint.
32
+ * same canonical message representation persisted by the checkpoint:
33
+ * `messages[0..boundary)` is the part recovery takes from the durable record,
34
+ * the rest is the checkpoint's own (boundary 0 for a self-contained one).
33
35
  */
34
- export function captureTurnCheckpointContextState(session, messages, currentUserContent) {
36
+ export function captureTurnCheckpointContextState(session, messages, boundary) {
35
37
  if (!session || !Array.isArray(messages)) return null;
36
38
  const providerCount = nonNegativeCount(session.contextPressureBaselineMessageCount);
37
39
  const providerTokens = Number(session.contextPressureBaselineTokens);
@@ -54,12 +56,9 @@ export function captureTurnCheckpointContextState(session, messages, currentUser
54
56
  }
55
57
  if (!kind || anchorCount === null || anchorCount > messages.length) return null;
56
58
 
57
- const start = findTurnStart(messages, currentUserContent);
58
- const fullTranscript = start < 0;
59
- const committedPrefixCount = fullTranscript ? 0 : start;
60
- const canonicalTurnMessages = fullTranscript
61
- ? messages.map(checkpointMessage)
62
- : turnMessagesForCheckpoint(messages, currentUserContent);
59
+ const committedPrefixCount =
60
+ Number.isInteger(boundary) && boundary >= 0 && boundary <= messages.length ? boundary : 0;
61
+ const canonicalTurnMessages = messages.slice(committedPrefixCount).map(checkpointMessage);
63
62
  const turnMessageCount = anchorCount - committedPrefixCount;
64
63
  if (turnMessageCount < 0 || turnMessageCount > canonicalTurnMessages.length) return null;
65
64