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
@@ -57,7 +57,7 @@ export function createSystemSettings({
57
57
  },
58
58
  getHeartbeatSettings() {
59
59
  return {
60
- heartbeat: getConfig()?.heartbeat !== false,
60
+ heartbeat: getConfig()?.heartbeat === true,
61
61
  intervalMinutes: normalizeHeartbeatIntervalMinutes(getConfig()?.heartbeatIntervalMinutes),
62
62
  };
63
63
  },
@@ -3,8 +3,12 @@
3
3
  * prompt-cache warming. Each goes through the runtime method its settings
4
4
  * surface uses. Permission and connector writes are made as a remote client's
5
5
  * are (`noWiden`): a chat may take authority away, never give an agent more
6
- * without asking — that stays with the person in the desktop app. */
6
+ * without asking — that stays with the person: in the desktop app, or on
7
+ * the approval card a connector tool's widening raises
8
+ * (connector-widen-approval.mjs). */
9
+ import { CONNECTOR_POLICY_WIDENS } from '../../runtime/agent/orchestrator/mcp/agent-connectors.mjs';
7
10
  import { agentPermissions, setAgentPermission } from '../../runtime/agent/orchestrator/session/human-gate/store.mjs';
11
+ import { askToWidenConnectorTool } from './connector-widen-approval.mjs';
8
12
  import { clean } from '../../runtime/agent/orchestrator/runtime-core/session-text.mjs';
9
13
 
10
14
  const NO_WIDEN = Object.freeze({ noWiden: true });
@@ -38,11 +42,17 @@ export const AGENT_SETTINGS_HANDLERS = {
38
42
  const name = requireText(args.name, 'name');
39
43
  return { agent, connectors: await rt.setAgentConnectorEnabled(agent, name, args.enabled, NO_WIDEN) };
40
44
  },
41
- async set_agent_connector_tool(rt, args) {
45
+ // A narrowing applies at once; a widening waits on the person's card.
46
+ async set_agent_connector_tool(rt, args, context) {
42
47
  const agent = requireText(args.agent, 'agent');
43
48
  const name = requireText(args.name, 'name');
44
49
  const tool = requireText(args.tool, 'tool');
45
- await rt.setAgentConnectorToolPermission(agent, name, tool, args.permission, NO_WIDEN);
50
+ try {
51
+ await rt.setAgentConnectorToolPermission(agent, name, tool, args.permission, NO_WIDEN);
52
+ } catch (error) {
53
+ if (error?.code !== CONNECTOR_POLICY_WIDENS) throw error;
54
+ return askToWidenConnectorTool(rt, { agent, server: name, tool, requested: args.permission }, context);
55
+ }
46
56
  return { agent, connector: name, tool, permission: args.permission };
47
57
  },
48
58
  async set_project_connector(rt, args) {
@@ -0,0 +1,96 @@
1
+ /** A bot's request for more authority on one connector tool (setup
2
+ * set_agent_connector_tool toward auto or needs_approval): the model cannot
3
+ * tell the user's words from text it read, so the change waits on an
4
+ * approval card (human-gate/requests.mjs kind `connector`) that only a
5
+ * person answers. The card offers each level above the tool's current one
6
+ * (needs_approval, auto) and Deny; nothing is remembered, so every widening
7
+ * asks again. The picked level is applied to that one tool, re-judged on the
8
+ * stored policy inside its write (mcp/agent-connectors.mjs
9
+ * withApprovedConnectorToolChange): a restriction that landed meanwhile stays. */
10
+ import {
11
+ CONNECTOR_TOOL_ALREADY,
12
+ CONNECTOR_TOOL_NARROWED,
13
+ NO_WIDEN_MESSAGE,
14
+ PERMISSION_RANK,
15
+ agentConnectors,
16
+ connectorGroupId,
17
+ connectorToolPermission,
18
+ withApprovedConnectorToolChange,
19
+ } from '../../runtime/agent/orchestrator/mcp/agent-connectors.mjs';
20
+ import { recordHumanDecision } from '../../runtime/agent/orchestrator/session/human-gate/gate.mjs';
21
+ import { CONNECTOR_WIDEN_LEVELS } from '../../runtime/agent/orchestrator/session/human-gate/requests.mjs';
22
+ import { runAbortable } from '../../runtime/shared/abort-race.mjs';
23
+
24
+ const NO_WIDEN = Object.freeze({ noWiden: true });
25
+
26
+ /** The tool's effective level for `agent` now, as dispatch reads it. */
27
+ function currentLevel(agent, server, tool) {
28
+ return connectorToolPermission(agentConnectors(agent), {
29
+ name: `mcp__${server}__${tool}`,
30
+ mcpServerName: server,
31
+ mcpToolName: tool,
32
+ });
33
+ }
34
+
35
+ /** Ask the person on a card, then apply the level they picked.
36
+ * `requestApproval` is the calling turn's approval hook. */
37
+ export async function askToWidenConnectorTool(
38
+ rt,
39
+ { agent, server, tool, requested },
40
+ { requestApproval, signal, sessionId, toolCallId } = {}
41
+ ) {
42
+ const from = currentLevel(agent, server, tool);
43
+ const receipt = { agent, connector: server, tool, requested };
44
+ if (PERMISSION_RANK[from] >= PERMISSION_RANK[requested]) {
45
+ return { ...receipt, saved: false, permission: from, note: `The tool is already ${from}; nothing changed.` };
46
+ }
47
+ // Nobody can be shown a card here: the person makes it in the desktop app.
48
+ if (typeof requestApproval !== 'function') throw new Error(NO_WIDEN_MESSAGE);
49
+ const choices = CONNECTOR_WIDEN_LEVELS.filter((level) => PERMISSION_RANK[level] > PERMISSION_RANK[from]);
50
+ const answer = await runAbortable(signal, () =>
51
+ requestApproval({
52
+ name: 'setup',
53
+ kind: 'connector',
54
+ agentId: agent,
55
+ // The card names the connector, not one of its accounts.
56
+ connector: { server: connectorGroupId(server), tool, from, requested, choices },
57
+ args: { action: 'set_agent_connector_tool', agent, name: server, tool, permission: requested },
58
+ reason: `Bot "${agent}" asks to change the permission of ${tool} (${connectorGroupId(server)}) from ${from} to ${requested}.`,
59
+ remember: ['once'],
60
+ sessionId,
61
+ toolCallId,
62
+ })
63
+ );
64
+ const level = answer?.approved === true && choices.includes(answer.scope) ? answer.scope : '';
65
+ // Audited with the answering device; no grant is ever stored (no action kind).
66
+ await recordHumanDecision(
67
+ { agentId: agent, kind: 'connector', tool: `${server}/${tool}`, target: `${from}>${level || requested}` },
68
+ answer
69
+ );
70
+ // A decision that settles after its turn was cancelled authorizes nothing.
71
+ signal?.throwIfAborted();
72
+ if (!level) {
73
+ const why = answer?.timedOut ? 'The approval card timed out' : 'The user did not approve this change';
74
+ return { ...receipt, saved: false, approved: false, permission: from, note: `${why}; nothing changed.` };
75
+ }
76
+ try {
77
+ await withApprovedConnectorToolChange({ server, tool, from, to: level }, () =>
78
+ rt.setAgentConnectorToolPermission(agent, server, tool, level, NO_WIDEN)
79
+ );
80
+ } catch (error) {
81
+ if (error?.code !== CONNECTOR_TOOL_NARROWED && error?.code !== CONNECTOR_TOOL_ALREADY) throw error;
82
+ return {
83
+ ...receipt,
84
+ saved: false,
85
+ approved: true,
86
+ permission: currentLevel(agent, server, tool),
87
+ note: `The user approved ${level}, but it was not applied: ${error.message}`,
88
+ };
89
+ }
90
+ return {
91
+ ...receipt,
92
+ approved: true,
93
+ permission: level,
94
+ note: `The user approved on the card; ${tool} is now ${level}.`,
95
+ };
96
+ }
@@ -92,7 +92,14 @@ const ACTION_APPLIES_TO = {
92
92
  set_heartbeat_interval:
93
93
  "Mixy's heartbeat from the next tick: the next check is due the new interval after the last one; no restart required",
94
94
  set_reactions_enabled:
95
- "bots' chats; while off a reaction is refused at once and new chats are not offered the tool; reactions already left stay visible",
95
+ "bots' chats, this conversation included, from their next turn; while off a reaction is refused at once; reactions already left stay visible",
96
+ set_profile: 'every conversation, this one included, from its next turn',
97
+ set_instruction_files: 'every conversation, this one included, from its next turn',
98
+ set_memory_enabled: 'every conversation, this one included, from its next turn',
99
+ set_web_search_enabled: 'every conversation, this one included, from its next turn',
100
+ set_builtin_enabled: 'every conversation, this one included, from its next turn',
101
+ install_builtin: 'every conversation, this one included, from its next turn',
102
+ set_output_style: 'every conversation, this one included, from its next turn',
96
103
  set_worktree_settings: 'new tasks and worktrees created afterwards; existing worktrees are unchanged',
97
104
  set_system_shell: 'subsequent shell calls',
98
105
  save_automation: 'the automation worker; scheduled runs follow the saved timing',
@@ -364,7 +371,7 @@ async function featureStatus(rt, getConfig) {
364
371
  computer: { active: builtinFeatureActive(config, 'computer') },
365
372
  terminal: { active: builtinFeatureActive(config, 'terminal') },
366
373
  heartbeat: {
367
- enabled: config?.heartbeat !== false,
374
+ enabled: config?.heartbeat === true,
368
375
  intervalMinutes: normalizeHeartbeatIntervalMinutes(config?.heartbeatIntervalMinutes),
369
376
  },
370
377
  reactions: { enabled: config?.reactions !== false },
@@ -909,7 +916,7 @@ export function createSetupToolExecutor({
909
916
  };
910
917
  }
911
918
 
912
- async function execute(args, { signal, callerSessionId }) {
919
+ async function execute(args, { signal, callerSessionId, requestApproval = null, toolCallId = null }) {
913
920
  signal?.throwIfAborted();
914
921
  const requestDesktop = (request) => desktop.request(request, { signal });
915
922
  const action = validateSetupInput(args);
@@ -948,6 +955,10 @@ export function createSetupToolExecutor({
948
955
  getSession: getCallerSession,
949
956
  getConfig: () => getConfig?.() || {},
950
957
  executeSessionControl,
958
+ // The calling turn's approval card (a connector tool's widening asks the person).
959
+ requestApproval,
960
+ signal,
961
+ toolCallId,
951
962
  });
952
963
  }
953
964
 
@@ -307,6 +307,8 @@ export const EXTENDED_SETUP_HANDLERS = Object.freeze({
307
307
  owner: input.owner,
308
308
  });
309
309
  const next = { ...pick(previous, entryKeys), ...input };
310
+ // Omitted keeps the saved executor without checking it again (channel-admin.mjs).
311
+ if (!own(input, 'executorAgentId')) delete next.executorAgentId;
310
312
  if (kind === 'schedule') {
311
313
  if (previous.whenAt && !own(input, 'time') && !own(input, 'at')) {
312
314
  next.at = new Date(previous.whenAt).toISOString();
@@ -212,6 +212,11 @@ export const SETUP_EXTENDED_PROPERTIES = Object.freeze({
212
212
  description:
213
213
  "The bot id that owns the schedule or webhook; each run is a turn in that bot's chat, where it replies with the result. The bot must exist (no representative bot yet = refused). New entries default to the bot of the calling thread (the representative bot = lead); on overwrite, omission keeps the owner.",
214
214
  },
215
+ executorAgentId: {
216
+ ...removableText,
217
+ description:
218
+ 'The workflow sub-agent id (Worker, …) that carries out each run first, on its own model; only its final report goes to the owner bot, which relays it in its own words. Must be an enabled workflow sub-agent: never a bot (the representative bot included); unknown or turned-off ids are refused. Set it for recurring work that suits a sub-agent; leave it unset for trivial chat-only routines (the owner bot then does the work itself). null or "" clears it; on overwrite, omission keeps it.',
219
+ },
215
220
  overwrite: { ...boolean, description: 'Explicitly update an existing entry; omitted fields are preserved.' },
216
221
  },
217
222
  ['name']
@@ -238,6 +243,16 @@ export const SETUP_EXTENDED_PROPERTIES = Object.freeze({
238
243
  maximum: 400,
239
244
  description: 'Windows only: notification sound volume percent.',
240
245
  },
246
+ sessionAutoArchiveDays: {
247
+ type: 'integer',
248
+ enum: [0, 1, 7, 14, 30, 90],
249
+ description: 'Days without conversation before a session is archived; 0 = never (default 7).',
250
+ },
251
+ sessionAutoDeleteDays: {
252
+ type: 'integer',
253
+ enum: [0, 7, 30, 90],
254
+ description: 'Days archived before a session is deleted; 0 = never (default 90).',
255
+ },
241
256
  botOverlay: object(
242
257
  {
243
258
  enabled: {
@@ -302,6 +317,17 @@ export const SETUP_EXTENDED_PROPERTIES = Object.freeze({
302
317
  markdownDefaultView: { type: 'string', enum: ['preview', 'rich', 'source'] },
303
318
  linkPreview: boolean,
304
319
  toolActivityExpansion: { type: 'string', enum: ['collapsed', 'commands', 'all'] },
320
+ composerStyle: {
321
+ type: 'string',
322
+ enum: ['simple', 'basic', 'detail'],
323
+ description:
324
+ 'How much the composer shows: simple = the model only; basic (UI label "Normal") = plus usage; detail = plus workflow and delegation (default detail).',
325
+ },
326
+ questionAnswerConfirm: {
327
+ ...boolean,
328
+ description:
329
+ 'On: picking a single-choice question option only selects it until Send/Next; off: the pick answers at once (default off).',
330
+ },
305
331
  uiFont: { ...text, description: 'Installed font family for the UI; "" restores the built-in font.' },
306
332
  codeFont: { ...text, description: 'Installed font family for code; "" restores the built-in font.' },
307
333
  skinTransparency: {
@@ -377,4 +403,6 @@ export const SETUP_HANDOFFS = Object.freeze({
377
403
  notifications: 'Notification permission/subscription requires a user gesture on the device receiving notifications.',
378
404
  pairing: 'Pairing credentials and OS permission approvals remain in the visible UI.',
379
405
  memoryContent: 'Use the memory tool for Core Memory, not setup.',
406
+ instructionTexts:
407
+ 'The Delegation and Output style instruction texts are edited in Settings → Delegation / Output style (revision-checked free text); choose the active output style with set_output_style.',
380
408
  });
@@ -447,13 +447,38 @@ export const SETUP_TOOL_DEFS = Object.freeze([
447
447
  enum: [...WORKTREE_NEW_TASK_DEFAULTS],
448
448
  description: 'branch = new tasks use the current branch (default); worktree = a new worktree.',
449
449
  },
450
- branchPrefix: { type: 'string', description: 'Ref prefix ending with "/"; default "mixdog/".' },
450
+ branchPrefix: {
451
+ type: 'string',
452
+ description:
453
+ 'Optional ref prefix ending with "/", e.g. "mixdog/"; "" (default) names branches after the task alone.',
454
+ },
451
455
  sizeWarnBytes: {
452
456
  type: 'integer',
453
457
  minimum: 0,
454
458
  description: 'Repository size that asks for confirmation first; 0 never asks.',
455
459
  },
456
460
  autoCleanup: { type: 'boolean', description: 'Remove clean, merged worktrees when their task ends.' },
461
+ maxWorktrees: {
462
+ type: 'integer',
463
+ minimum: 0,
464
+ maximum: 1000,
465
+ description:
466
+ 'With autoCleanup: keep at most this many worktrees, least recently used cleaned first; 0 = no limit. Default 15.',
467
+ },
468
+ unusedDays: {
469
+ type: 'integer',
470
+ minimum: 0,
471
+ maximum: 3650,
472
+ description: 'With autoCleanup: clean up worktrees unused this many days; 0 = never. Default 30.',
473
+ },
474
+ cleanupArchived: {
475
+ type: 'boolean',
476
+ description: 'With autoCleanup: archiving a session cleans up its worktrees. Default true.',
477
+ },
478
+ deleteBranch: {
479
+ type: 'boolean',
480
+ description: 'Cleanup also deletes the branch (its tip stays under a recovery ref). Default false.',
481
+ },
457
482
  },
458
483
  description: 'set_worktree_settings: only the given fields change.',
459
484
  },
@@ -477,7 +502,8 @@ export const SETUP_TOOL_DEFS = Object.freeze([
477
502
  permission: {
478
503
  type: 'string',
479
504
  enum: [...CONNECTOR_PERMISSIONS],
480
- description: 'set_agent_connector_tool: needs_approval or disabled; auto is made in the desktop app.',
505
+ description:
506
+ 'set_agent_connector_tool: a narrowing (toward disabled) applies at once; a widening (disabled → needs_approval/auto, needs_approval → auto) waits on an approval card the user answers (needs_approval, auto or deny, whatever was asked) and the result says what was applied.',
481
507
  },
482
508
  botOrder: {
483
509
  type: 'array',
@@ -13,10 +13,7 @@ import {
13
13
  } from '../../runtime/agent/orchestrator/session/manager/workflow-switch-notice.mjs';
14
14
  import { sessionTailCacheExpired } from '../../runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs';
15
15
  import { mergePendingDeferredToolDelta } from '../../runtime/agent/orchestrator/runtime-core/deferred-tool-delta.mjs';
16
- import {
17
- agentMcpToolPermission,
18
- connectorPolicyAgentOf,
19
- } from '../../runtime/agent/orchestrator/mcp/agent-connectors.mjs';
16
+ import { foldLateDeferredTools } from '../../runtime/agent/orchestrator/runtime-core/tool-catalog.mjs';
20
17
  import { agentListEntries } from '../../runtime/agent/orchestrator/session/manager/prompt-utils.mjs';
21
18
  import { markToolSurfaceMigrated } from '../../runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs';
22
19
  import { resetBp2StableContext } from '../../runtime/agent/orchestrator/context/collect.mjs';
@@ -92,24 +89,14 @@ function cacheCold(session) {
92
89
  );
93
90
  }
94
91
 
95
- // The connector tools among `names` the session's agent may run now.
96
- function connectorTools(session, names) {
97
- const agent = connectorPolicyAgentOf(session);
98
- return [...names]
99
- .filter((name) => name.startsWith('mcp__') && agentMcpToolPermission(agent, name) !== 'disabled')
100
- .sort();
101
- }
102
-
103
- // A bot thread's tools that changed without its prompt: feature gates that
104
- // opened (or closed) and connectors added or removed. Nothing in the request
105
- // prefix moves. An opened tool joins the deferred catalog — reachable by
92
+ // A bot thread's tools that changed without its prompt: workflow and
93
+ // reaction gates that opened (or closed). Nothing in the request prefix
94
+ // moves. An opened tool joins the late deferred catalog — reachable by
106
95
  // deferred loading, which brings its schema into the conversation — and a
107
96
  // gone one is refused at call time; the next turn's deferred_tools_delta
108
97
  // notice names both. Gate changes are folded into the prompt at the next
109
- // cold point (promptFoldPending). Connectors live in the bot's agent.json,
110
- // so they are compared only when its profile stamp moved (`edited`).
111
- // Returns true when anything changed.
112
- function stageLiveToolChanges({ liveDeniedTools, modelStandaloneTools }, session, workflow, { edited = false } = {}) {
98
+ // cold point (promptFoldPending). Returns true when anything changed.
99
+ function stageLiveToolChanges({ liveDeniedTools, modelStandaloneTools }, session, workflow) {
113
100
  const added = [];
114
101
  const removed = [];
115
102
  const known = new Map(schemaTools(session).map((tool) => [toolName(tool), tool]));
@@ -121,24 +108,17 @@ function stageLiveToolChanges({ liveDeniedTools, modelStandaloneTools }, session
121
108
  const fresh = modelStandaloneTools().filter(
122
109
  (tool) => opened.includes(toolName(tool)) && !known.has(toolName(tool))
123
110
  );
124
- if (fresh.length) session.deferredToolCatalog = [...(session.deferredToolCatalog || []), ...fresh];
111
+ // The late pool, never the boot catalog a native request keeps byte-stable.
112
+ if (fresh.length) session.deferredLateToolCatalog = [...(session.deferredLateToolCatalog || []), ...fresh];
125
113
  for (const tool of fresh) known.set(toolName(tool), tool);
126
114
  session.disallowedTools = [...live];
127
115
  added.push(...opened.filter((name) => known.has(name)));
128
116
  removed.push(...closed);
129
117
  session.promptFoldPending = true;
130
118
  }
131
- // Connectors gate MCP tools at call time only (pre-dispatch-deny.mjs).
132
- const previous = session.agentConnectorTools;
133
- const permitted = edited || !Array.isArray(previous) ? connectorTools(session, known.keys()) : previous;
134
- session.agentConnectorTools = permitted;
135
- if (edited && Array.isArray(previous)) {
136
- added.push(...permitted.filter((name) => !previous.includes(name)));
137
- removed.push(...previous.filter((name) => !permitted.includes(name)));
138
- }
139
- if (!added.length && !removed.length) {
140
- return opened.length + closed.length > 0 || !Array.isArray(previous);
141
- }
119
+ // Connector moves are staged at every turn start, for every session kind
120
+ // (tool-availability.mjs stageConnectorAvailability).
121
+ if (!added.length && !removed.length) return opened.length + closed.length > 0;
142
122
  mergePendingDeferredToolDelta(session, {
143
123
  added: added.map((name) => ({ name, description: known.get(name)?.description || '' })),
144
124
  removed,
@@ -162,7 +142,8 @@ function liftAgentDenial({ liveDeniedTools, modelStandaloneTools }, session) {
162
142
  if (!known.has('agent')) {
163
143
  const fresh = modelStandaloneTools().filter((tool) => toolName(tool) === 'agent');
164
144
  if (!fresh.length) return false;
165
- session.deferredToolCatalog = [...(session.deferredToolCatalog || []), ...fresh];
145
+ // The late pool, never the boot catalog a native request keeps byte-stable.
146
+ session.deferredLateToolCatalog = [...(session.deferredLateToolCatalog || []), ...fresh];
166
147
  known.set('agent', fresh[0]);
167
148
  }
168
149
  session.disallowedTools = disallowed.filter((name) => name !== 'agent');
@@ -185,6 +166,7 @@ export function createAgentProfileFold({
185
166
  liveDeniedTools,
186
167
  stagePolicy,
187
168
  applyPolicy,
169
+ presentPromptSettings = () => {},
188
170
  turnInFlight,
189
171
  }) {
190
172
  // An agent profile edit that met a running turn: the next turn applies it.
@@ -206,7 +188,13 @@ export function createAgentProfileFold({
206
188
  // re-appends its deferred manifest.
207
189
  if (typeof staged.stableContext === 'string') resetBp2StableContext(session, staged.stableContext);
208
190
  applyPolicy(session, staged);
191
+ // Late tools join the rebuilt manifest (MCP instructions return with the
192
+ // server's next tool load): no notice.
193
+ foldLateDeferredTools(session);
209
194
  rewriteConversationBp3Core(session, staged.core);
195
+ // Every prompt setting as it stands — style, profile, language, core
196
+ // memory, instruction files — so no part of the prompt contradicts another.
197
+ presentPromptSettings(session, staged);
210
198
  if (session.agentProfileRevision !== undefined) {
211
199
  session.agentProfileRevision = agentProfileRevision(identity.agent, { mixy: agentMode });
212
200
  const { leadPromptParts } = activeWorkflowContext(config, getDataDir());
@@ -231,7 +219,9 @@ export function createAgentProfileFold({
231
219
  // prompt they were created with; they are task-scoped, and their skill
232
220
  // bodies are still restored from current sources at Compact.
233
221
  if (!session?.id || !session.promptIdentity || isAgentOwner(session)) return false;
234
- const compacted = COLD_INTENTS.has(session.pendingCacheBreakIntent);
222
+ // A compaction is a cold point: the prompt is rebuilt instead of the
223
+ // dropped notices being sent again (pre-send compaction marks it).
224
+ const compacted = COLD_INTENTS.has(session.pendingCacheBreakIntent) || session.compactionFoldPending === true;
235
225
  if (!compacted && !(foldPending(session) && cacheCold(session))) return false;
236
226
  return foldPrompt(session, PROMPT_FOLD_INTENT);
237
227
  }
@@ -256,7 +246,7 @@ export function createAgentProfileFold({
256
246
  * release changed wait silently; both are folded in at the next cold point
257
247
  * (foldPromptIfCold). Returns true when the session changed (save it).
258
248
  */
259
- async function refreshAgentProfile({ trigger = 'save' } = {}) {
249
+ async function refreshAgentProfile({ trigger = 'save', onlyIfEdited = false } = {}) {
260
250
  const session = getSession?.();
261
251
  const identity = session?.promptIdentity;
262
252
  const agent = identity?.agent;
@@ -276,15 +266,14 @@ export function createAgentProfileFold({
276
266
  const edited =
277
267
  recoverMode || session.agentProfileRevision !== revision || (agentMode && session.agentRosterRevision !== roster);
278
268
  // At a turn's start its own turn is the one counted; nothing runs yet.
269
+ if (onlyIfEdited && !edited) return false;
279
270
  const busy = () => getSession?.() !== session || (trigger !== 'turn' && turnInFlight(session));
280
271
  if (busy()) {
281
272
  agentProfilePending = true;
282
273
  return false;
283
274
  }
284
275
  const toolsChanged = agentMode
285
- ? stageLiveToolChanges({ liveDeniedTools, modelStandaloneTools }, session, workflow, {
286
- edited: session.agentProfileRevision !== revision,
287
- })
276
+ ? stageLiveToolChanges({ liveDeniedTools, modelStandaloneTools }, session, workflow)
288
277
  : trigger === 'resume' && syncAgentListing(session);
289
278
  if (!edited) return (trigger === 'resume' && (await foldPromptIfCold())) || toolsChanged;
290
279
  // A coding session from before profile stamps keeps its prompt when it
@@ -315,14 +304,22 @@ export function createAgentProfileFold({
315
304
  * fold pending prompt changes if the cache is cold anyway. */
316
305
  async function applyPendingAgentProfile() {
317
306
  let changed = false;
318
- // A bot thread's connector baseline, before any edit can be compared to it.
319
307
  const session = getSession?.();
320
- if (session?.id && sessionModeOf(session) === AGENT_MODE && !Array.isArray(session.agentConnectorTools)) {
321
- session.agentConnectorTools = connectorTools(session, schemaTools(session).map(toolName));
322
- }
323
- if (agentProfilePending || orchestrationRecoveryNeeded(session)) {
308
+ // A bot thread compares its profile and roster stamps every turn, so hand
309
+ // edits and other processes' saves of AGENT.md, PERSONA.md and the roster
310
+ // reach it too.
311
+ // A thread from before profile stamps keeps its prompt until a save.
312
+ const botThread = Boolean(
313
+ session?.id &&
314
+ session.promptIdentity?.agent &&
315
+ sessionModeOf(session) === AGENT_MODE &&
316
+ session.agentProfileRevision !== undefined
317
+ );
318
+ const pending = agentProfilePending || orchestrationRecoveryNeeded(session);
319
+ if (pending || botThread) {
324
320
  agentProfilePending = false;
325
- changed = await refreshAgentProfile({ trigger: 'turn' });
321
+ // A turn with nothing pending acts only on moved stamps.
322
+ changed = await refreshAgentProfile({ trigger: 'turn', onlyIfEdited: !pending });
326
323
  }
327
324
  changed = (await foldPromptIfCold()) || changed;
328
325
  return syncAgentListing(session) || changed;
@@ -17,7 +17,7 @@ function modeLoadableTools(session, mode) {
17
17
  ...toolNames(session.deferredCallableTools),
18
18
  ...toolNames(session.deferredDiscoveredTools),
19
19
  ]);
20
- const deferred = new Set(toolNames(session.deferredToolCatalog));
20
+ const deferred = new Set([...toolNames(session.deferredToolCatalog), ...toolNames(session.deferredLateToolCatalog)]);
21
21
  const denied = new Set(
22
22
  [...(session.disallowedTools || []), ...(session.workflowOverlay?.deniedTools || [])].map(String)
23
23
  );