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
@@ -118,6 +118,8 @@ export function wireApis(boot) {
118
118
  console.warn(`[connectors] merging connector accounts failed: ${error?.message || error}`);
119
119
  bootProfile('connector-accounts:merge-failed', { error: error?.message || String(error) });
120
120
  }
121
+ // After the merge: every account has its identity before anything connects.
122
+ if (boot.ensureConnectorAccountIds()) boot.reloadFullConfig();
121
123
  }
122
124
  boot.disposeGlobalExtensionSubscription = () => {
123
125
  boot.disposeConfigSync?.();
@@ -164,12 +166,18 @@ export function wireApis(boot) {
164
166
  getSession: () => boot.rt.session,
165
167
  getSessionId: getFacadeSessionId,
166
168
  goalRuntime: boot.goalRuntime,
169
+ persistSession: (session) => saveSessionAsync(session, { expectedGeneration: session.generation }),
167
170
  });
168
171
  }
169
172
 
170
173
  function wireToolPolicyRefresh(boot) {
171
174
  const { rt, cfgMod } = boot;
172
175
  const {
176
+ reconcileTurnSettings,
177
+ reconcileEmptySession,
178
+ emptySessionStale,
179
+ noteToolAvailability,
180
+ settingsReachCurrentSession,
173
181
  refreshEmptySessionToolPolicy,
174
182
  switchSessionWorkflow,
175
183
  switchSessionOrchestrationMode,
@@ -196,7 +204,14 @@ function wireToolPolicyRefresh(boot) {
196
204
  // A switch is acknowledged only once saved; a session closed or replaced
197
205
  // since (its generation moved) is not resurrected.
198
206
  persistSession: (session) => saveSessionAsync(session, { expectedGeneration: session.generation }),
207
+ toolDefinitionsFor: boot.toolDefinitionsFor,
208
+ getSurfaceGeneration: boot.surfaceGeneration,
199
209
  });
210
+ boot.reconcileTurnSettings = reconcileTurnSettings;
211
+ boot.reconcileEmptySession = reconcileEmptySession;
212
+ boot.emptySessionStale = emptySessionStale;
213
+ boot.noteToolAvailability = noteToolAvailability;
214
+ boot.settingsReachCurrentSession = settingsReachCurrentSession;
200
215
  boot.refreshEmptySessionToolPolicy = refreshEmptySessionToolPolicy;
201
216
  boot.switchSessionWorkflow = switchSessionWorkflow;
202
217
  boot.switchSessionOrchestrationMode = switchSessionOrchestrationMode;
@@ -347,7 +362,6 @@ function settingsApiFor(boot) {
347
362
  getUpdateProcessState: () => selfUpdate.getProcessState(),
348
363
  invalidateContextStatusCache: (...a) => boot.invalidateContextStatusCache(...a),
349
364
  invalidatePreSessionToolSurface: (...a) => boot.invalidatePreSessionToolSurface(...a),
350
- refreshEmptySessionToolPolicy: boot.refreshEmptySessionToolPolicy,
351
365
  scheduleChannelStart: (...a) => boot.scheduleChannelStart(...a),
352
366
  channels: boot.channels,
353
367
  clearChannelStartTimer: () => {
@@ -410,6 +424,7 @@ function providerAuthApiFor(boot) {
410
424
  saveConfigAndAdopt: boot.saveConfigAndAdopt,
411
425
  displayConfig: boot.displayConfig,
412
426
  reloadFullConfig: boot.reloadFullConfig,
427
+ applyConfigChange: boot.applyConfigChange,
413
428
  awaitKeychainPrewarm: boot.awaitKeychainPrewarm,
414
429
  isKeychainPrewarmReady: () => rt.keychainPrewarmWaitDone,
415
430
  hasProviderSetupCached: boot.hasProviderSetupCached,
@@ -527,7 +542,6 @@ function resourceApiFor(boot) {
527
542
  getMcpServerOAuthState: (cfg) => boot.mcpClient.getMcpServerOAuthState(cfg),
528
543
  probeMcpServerAuth: (cfg) => boot.mcpClient.probeMcpServerAuth(cfg),
529
544
  invalidatePreSessionToolSurface: boot.invalidatePreSessionToolSurface,
530
- refreshEmptySessionToolPolicy: boot.refreshEmptySessionToolPolicy,
531
545
  normalizeMcpServerInput: boot.normalizeMcpServerInput,
532
546
  mcpStatus: boot.mcpStatus,
533
547
  getMcpServerConfig: boot.getMcpServerConfig,
@@ -561,6 +575,8 @@ function modelRouteApiFor(boot) {
561
575
  getSession: () => rt.session,
562
576
  getSessionGeneration: () => rt.sessionGeneration,
563
577
  setSession: boot.adoptSession,
578
+ // A held model pick is saved with its session (a replaced one is not resurrected).
579
+ persistSession: (session) => saveSessionAsync(session, { expectedGeneration: session.generation }).catch(() => {}),
564
580
  getAddressedSessionId: () => rt.addressedSessionId,
565
581
  getConfigHasSecrets: () => rt.configHasSecrets,
566
582
  getWebSearchRouteState: () => rt.webSearchRoute,
@@ -626,7 +642,7 @@ function workflowAgentsApiFor(boot) {
626
642
  scheduleOutputStyleSave: boot.scheduleOutputStyleSave,
627
643
  invalidateContextStatusCache: boot.invalidateContextStatusCache,
628
644
  invalidatePreSessionToolSurface: boot.invalidatePreSessionToolSurface,
629
- refreshEmptySessionToolPolicy: boot.refreshEmptySessionToolPolicy,
645
+ settingsReachCurrentSession: () => boot.settingsReachCurrentSession(),
630
646
  switchSessionWorkflow: boot.switchSessionWorkflow,
631
647
  switchSessionOrchestrationMode: boot.switchSessionOrchestrationMode,
632
648
  });
@@ -653,7 +669,12 @@ function workspaceApiFor(boot) {
653
669
  // waits on the save worker, which may never come up.
654
670
  persistSession: (session) => saveSession(session, { sync: true }),
655
671
  refreshWorkspaceContext: (session, cwd, move) =>
656
- refreshWorkspacePrompt(session, cwd, { loadCoreMemoryContext: boot.loadCoreMemoryContext, move }),
672
+ refreshWorkspacePrompt(session, cwd, {
673
+ loadCoreMemoryContext: boot.loadCoreMemoryContext,
674
+ move,
675
+ // The runtime's in-memory setting, not the debounced file.
676
+ instructionFilesMode: rt.config?.instructionFiles,
677
+ }),
657
678
  invalidateCaches: () => {
658
679
  boot.invalidateContextStatusCache();
659
680
  boot.invalidatePreSessionToolSurface();
@@ -671,6 +692,8 @@ function sessionTurnApiFor(boot) {
671
692
  return createSessionTurnApi({
672
693
  applyPendingRoute: () => boot.modelRouteApi.applyPendingRoute(),
673
694
  applyPendingAgentProfile: boot.applyPendingAgentProfile,
695
+ reconcileTurnSettings: boot.reconcileTurnSettings,
696
+ reconcileEmptySession: () => boot.reconcileEmptySession(),
674
697
  currentAgents: boot.currentAgents,
675
698
  applyPendingSessionSwitches: boot.applyPendingSessionSwitches,
676
699
  prepareTurnWorkspace: boot.workspaceApi.prepareTurnWorkspace,
@@ -35,6 +35,7 @@ export function beginBoot(params) {
35
35
  const {
36
36
  awaitKeychainPrewarm,
37
37
  invalidateProviderCaches,
38
+ reinitProviders,
38
39
  ensureProvidersReady,
39
40
  modelMetaByRoute,
40
41
  providerModelCaches,
@@ -54,6 +55,7 @@ export function beginBoot(params) {
54
55
  return Object.assign(boot, {
55
56
  awaitKeychainPrewarm,
56
57
  invalidateProviderCaches,
58
+ reinitProviders,
57
59
  ensureProvidersReady,
58
60
  modelMetaByRoute,
59
61
  providerModelCaches,
@@ -1,6 +1,7 @@
1
1
  // Boot stage 3: the initial config/route state, the runtime scalars, the
2
2
  // timer/prewarm holders teardown sweeps, and the env-tunable boot delays.
3
3
  import { performance } from 'node:perf_hooks';
4
+ import { SessionClosedError } from '../../runtime/agent/orchestrator/session/manager/session-errors.mjs';
4
5
  import { setConfiguredShell } from '../../runtime/agent/orchestrator/tools/builtin/shell-runtime.mjs';
5
6
  import { LOCAL_PROVIDER_ID, configureLocalProviderIdleTtl } from '../../runtime/local-provider/managed-runtime.mjs';
6
7
  import { normalizeToolMode } from '../../runtime/agent/orchestrator/runtime-core/effort.mjs';
@@ -26,6 +27,7 @@ export async function resolveConfig(boot) {
26
27
  } = resolveInitialConfigState({
27
28
  initialConfig: params.initialConfig,
28
29
  loadConfig: () => cfgMod.loadConfig({ secrets: false }),
30
+ readStoredOutputStyle: () => sharedCfgMod.readConfig?.()?.outputStyle,
29
31
  resolveRoute,
30
32
  provider: params.provider,
31
33
  model: params.model,
@@ -97,9 +99,16 @@ function initRuntimeState(rt, params) {
97
99
  rt.startupProviderCatalogRefreshPending = false;
98
100
  }
99
101
 
100
- function activeTurnControls(rt) {
102
+ export function activeTurnControls(rt) {
101
103
  return {
102
104
  registerActiveTurnController: (controller) => {
105
+ // Close aborts the turns registered when it starts; a turn opened after
106
+ // that (a caller already past its own checks) starts aborted, so a
107
+ // closing runtime never reaches the provider again.
108
+ if (rt.closeRequested && !controller.signal.aborted) {
109
+ const sessionId = rt.session?.id || rt.reservedSessionId || 'pending';
110
+ controller.abort(new SessionClosedError(sessionId, 'runtime is closing', 'runtime-close'));
111
+ }
103
112
  rt.activeTurnAbortControllers.add(controller);
104
113
  return () => rt.activeTurnAbortControllers.delete(controller);
105
114
  },
@@ -118,6 +118,7 @@ function facadeGetters(boot) {
118
118
  : configuredOrchestrationMode(rt.config),
119
119
  getOutputStyle: () => boot.getOutputStyleStatusCached().current,
120
120
  getContextStatus: boot.computeContextStatus,
121
+ getContextStatusSettled: boot.computeContextStatusSettled,
121
122
  getContextStatusForSession: boot.computeContextStatusForSession,
122
123
  renameSessionTitle: (sessionId, title) => mgr.updateSessionManualTitle(sessionId, title),
123
124
  };
@@ -31,13 +31,27 @@ import {
31
31
  } from '../model-recency.mjs';
32
32
  import { createNativeWebSearch } from '../native-web-search.mjs';
33
33
  import { createConfigLifecycle } from '../config-lifecycle.mjs';
34
+ import { createConfigChangeEffects, SETTINGS_CHANGED_SETUP_ACTION } from '../config-change-effects.mjs';
35
+ import { resetProviderAdmissionCooldowns } from '../../runtime/agent/orchestrator/providers/admission-scheduler.mjs';
34
36
  import { usesInjectedConfig } from '../session-compaction-sync.mjs';
35
37
  import { createQuickModelRows } from '../quick-model-rows.mjs';
36
38
  import { createProviderModels } from '../provider-models.mjs';
37
39
  import { createProviderUsage } from '../provider-usage.mjs';
38
40
  import { bootProfile } from '../boot-profile.mjs';
39
41
  import { standaloneDataDir } from '../runtime-paths.mjs';
40
- import { outputStyleStatus, resolveRoute, webSearchCapableFor } from './shared.mjs';
42
+ import { noteCacheWarmingEnabled } from '../../runtime/agent/orchestrator/session/cache-warm.mjs';
43
+ import { refreshLiveSessionsProviderCacheOpts } from '../../runtime/agent/orchestrator/session/manager/session-lifecycle.mjs';
44
+ import { publishStoredAgentRoute } from '../agent-profile-changes.mjs';
45
+ import {
46
+ ensureConnectorAccountIds,
47
+ forgetConversationConnectorAccounts,
48
+ } from '../../runtime/connectors/connector-accounts-mcp.mjs';
49
+ import { registerSessionPurgeHook } from '../../runtime/agent/orchestrator/session/store/session-observers.mjs';
50
+ import { effectiveAgentRoute } from '../workflow-agents-api/shared.mjs';
51
+ import { agentRouteFromConfig, outputStyleStatus, resolveRoute, webSearchCapableFor } from './shared.mjs';
52
+
53
+ // A conversation's connector accounts go with its session (once per process).
54
+ registerSessionPurgeHook((sessionId) => forgetConversationConnectorAccounts(sessionId));
41
55
 
42
56
  export function wireProviders(boot) {
43
57
  wireConfigLifecycle(boot);
@@ -52,6 +66,17 @@ export function wireProviders(boot) {
52
66
  // injection.
53
67
  function wireConfigLifecycle(boot) {
54
68
  const { rt, cfgMod, sharedCfgMod } = boot;
69
+ // Every stored connector account gets its identity (an injected config is
70
+ // not the stored one). True when the stored config changed.
71
+ boot.ensureConnectorAccountIds = () => {
72
+ if (usesInjectedConfig(boot.params)) return false;
73
+ try {
74
+ return ensureConnectorAccountIds();
75
+ } catch (error) {
76
+ console.warn(`[connectors] giving accounts their identity failed: ${error?.message || error}`);
77
+ return false;
78
+ }
79
+ };
55
80
  const lifecycle = createConfigLifecycle({
56
81
  getConfig: () => rt.config,
57
82
  setConfig: (next) => {
@@ -68,7 +93,7 @@ function wireConfigLifecycle(boot) {
68
93
  },
69
94
  getRoute: () => rt.route,
70
95
  getSession: () => rt.session,
71
- fixedSessionCompaction: usesInjectedConfig(boot.params),
96
+ injectedConfig: usesInjectedConfig(boot.params),
72
97
  setRouteState: (next) => {
73
98
  rt.route = next;
74
99
  },
@@ -82,7 +107,47 @@ function wireConfigLifecycle(boot) {
82
107
  LAZY_SECRET_PROVIDERS,
83
108
  clean,
84
109
  resolve,
85
- onConfigReloaded: () => boot.invalidateContextStatusCache?.(),
110
+ // Late-bound: the effect targets (notification bus, MCP connect, context
111
+ // status) are wired by later boot stages.
112
+ onConfigChanged: createConfigChangeEffects({
113
+ invalidateContextStatusCache: () => boot.invalidateContextStatusCache?.(),
114
+ reinitProviders: () => boot.reinitProviders(),
115
+ releaseAdmissionCooldowns: resetProviderAdmissionCooldowns,
116
+ // Fails (so the change step retries it) when a server failed to connect
117
+ // (other than needing a sign-in, which waits on the user) or the
118
+ // identities failed; the servers reconcile either way.
119
+ reconcileMcp: async () => {
120
+ // An account written by hand gets its identity; that write is one
121
+ // more change, reconciled in turn.
122
+ let idsError = null;
123
+ if (!usesInjectedConfig(boot.params)) {
124
+ try {
125
+ ensureConnectorAccountIds();
126
+ } catch (error) {
127
+ idsError = error;
128
+ }
129
+ }
130
+ const status = await boot.connectConfiguredMcp?.({ reconcile: true });
131
+ if (idsError) throw idsError;
132
+ const failed = (status?.servers || []).filter((row) => row.enabled !== false && row.status === 'failed');
133
+ if (failed.length) {
134
+ throw new Error(
135
+ `MCP servers failed to connect: ${failed.map((row) => `${row.name} (${row.error})`).join(', ')}`
136
+ );
137
+ }
138
+ },
139
+ noteCacheWarmingEnabled,
140
+ refreshLiveSessionsCacheOpts: (config) => refreshLiveSessionsProviderCacheOpts(config),
141
+ // A bot whose stored route was cleared follows Main.
142
+ publishAgentRoute: (id, config) =>
143
+ publishStoredAgentRoute(id, effectiveAgentRoute({ agentRouteFromConfig, resolveRoute }, config, id)),
144
+ // Attached surfaces (TUI, desktop session lanes) re-read open settings.
145
+ announceSettingsChange: () =>
146
+ boot.emitRuntimeNotification?.('Settings changed', {
147
+ kind: 'setup-changed',
148
+ action: SETTINGS_CHANGED_SETUP_ACTION,
149
+ }),
150
+ }),
86
151
  STANDALONE_DATA_DIR: standaloneDataDir(),
87
152
  });
88
153
  const {
@@ -98,11 +163,13 @@ function wireConfigLifecycle(boot) {
98
163
  scheduleOutputStyleSave,
99
164
  flushAllConfigSavesAsync,
100
165
  reloadFullConfig,
166
+ applyConfigChange,
101
167
  ensureFullConfig,
102
168
  displayConfig,
103
169
  ensureConfigForRouteProvider,
104
170
  } = lifecycle;
105
171
  Object.assign(boot, {
172
+ applyConfigChange,
106
173
  disposeConfigSync,
107
174
  getOutputStyleStatusCached,
108
175
  invalidateOutputStyleStatusCache,
@@ -51,6 +51,8 @@ export function wireSessionLifecycle(boot) {
51
51
  schemaAllowedTools: modelToolSchemaAllowlist(rt.toolProfile),
52
52
  featureDisallowedTools: boot.featureDisallowedTools,
53
53
  applyPreSessionToolSelection: boot.applyPreSessionToolSelection,
54
+ // Late-bound: the tool policy refresh is wired with the API slices.
55
+ noteToolAvailability: (session, coreMemory) => boot.noteToolAvailability?.(session, coreMemory),
54
56
  statusRoutes: boot.statusRoutes,
55
57
  warmupTimers: boot.warmupTimers,
56
58
  providerModelCaches: boot.providerModelCaches,
@@ -22,6 +22,7 @@ import { TOOL_DEFS as OFFICE_TOOL_DEFS } from '../../runtime/office/tool-defs.mj
22
22
  import { TOOL_DEFS as MEDIA_TOOL_DEFS } from '../../runtime/media/tool-defs.mjs';
23
23
  import { TOOL_DEFS as TIDY_TOOL_DEFS } from '../../runtime/tidy/tool-defs.mjs';
24
24
  import { TOOL_DEFS as VISUALIZE_BRIDGE_TOOL_DEFS } from '../../runtime/visualize-bridge/tool-defs.mjs';
25
+ import { TOOL_DEFS as EXPLORE_TOOL_DEFS } from '../../runtime/explore/tool-defs.mjs';
25
26
  import {
26
27
  ASK_USER_TOOL_DEFS,
27
28
  HANDOFF_USER_TOOL_DEFS,
@@ -40,6 +41,7 @@ import {
40
41
  } from '../../runtime/agent/orchestrator/runtime-core/context-status.mjs';
41
42
  import { createInternalToolExecutor } from '../internal-tool-executor.mjs';
42
43
  import { registerWorktreeToolHost } from '../../runtime/shared/worktrees/tool-host.mjs';
44
+ import { registerLiveFeatureGates } from '../../runtime/agent/orchestrator/runtime-core/tool-availability.mjs';
43
45
  import { createWorktreeToolHost } from '../workspace/worktree-tool.mjs';
44
46
  import { STANDALONE_ROOT, standaloneDataDir } from '../runtime-paths.mjs';
45
47
  import { dataDirOf, workflowHelpers } from './shared.mjs';
@@ -60,8 +62,14 @@ export function wireTools(boot) {
60
62
  })
61
63
  )
62
64
  .catch((error) => bootProfile('mcp:failed', { error: error?.message || String(error) }));
65
+ // A lost reload leaves the old timers armed; the scheduler re-reads each
66
+ // schedule before it fires (scheduler.mjs fireTimed), so it is only reported.
63
67
  boot.reloadChannelsSoon = () => {
64
- boot.channels.execute('reload_config', {}).catch(() => {});
68
+ boot.channels
69
+ .execute('reload_config', {})
70
+ .catch((error) =>
71
+ process.stderr.write(`[channels] schedule reload failed: ${error?.message || String(error)}\n`)
72
+ );
65
73
  };
66
74
  }
67
75
 
@@ -172,6 +180,7 @@ function wireToolSurface(boot) {
172
180
  mediaToolDefs: MEDIA_TOOL_DEFS,
173
181
  tidyToolDefs: TIDY_TOOL_DEFS,
174
182
  visualizeToolDefs: VISUALIZE_BRIDGE_TOOL_DEFS,
183
+ exploreToolDefs: EXPLORE_TOOL_DEFS,
175
184
  setupToolDefs: SETUP_TOOL_DEFS,
176
185
  askUserToolDefs: ASK_USER_TOOL_DEFS,
177
186
  handoffUserToolDefs: HANDOFF_USER_TOOL_DEFS,
@@ -181,23 +190,29 @@ function wireToolSurface(boot) {
181
190
  skillToolEnabled: !envFlag('MIXDOG_DISABLE_SKILLS'),
182
191
  });
183
192
  bootProfile('tools:ready', { ms: (performance.now() - toolsStartedAt).toFixed(1), count: standaloneTools.length });
184
- const { modelStandaloneTools, invalidatePreSessionToolSurface, activeToolSurface, applyPreSessionToolSelection } =
185
- createToolSurface({
186
- mgr,
187
- mode: rt.mode,
188
- standaloneTools,
189
- agentToolNames,
190
- getSession: () => rt.session,
191
- getRoute: () => rt.route,
192
- getConfig: () => rt.config,
193
- getToolProfile: () => rt.toolProfile,
194
- getMcpScopeId: () => rt.mcpScopeId,
195
- getCurrentCwd: () => rt.currentCwd,
196
- cfgMod,
197
- delegatableAgentIds: workflowHelpers.delegatableAgentIds,
198
- dataDir: standaloneDataDir(),
199
- getFeatureDisallowedTools: featureDisallowedTools,
200
- });
193
+ const {
194
+ modelStandaloneTools,
195
+ invalidatePreSessionToolSurface,
196
+ activeToolSurface,
197
+ applyPreSessionToolSelection,
198
+ toolDefinitionsFor,
199
+ surfaceGeneration,
200
+ } = createToolSurface({
201
+ mgr,
202
+ mode: rt.mode,
203
+ standaloneTools,
204
+ agentToolNames,
205
+ getSession: () => rt.session,
206
+ getRoute: () => rt.route,
207
+ getConfig: () => rt.config,
208
+ getToolProfile: () => rt.toolProfile,
209
+ getMcpScopeId: () => rt.mcpScopeId,
210
+ getCurrentCwd: () => rt.currentCwd,
211
+ cfgMod,
212
+ delegatableAgentIds: workflowHelpers.delegatableAgentIds,
213
+ dataDir: standaloneDataDir(),
214
+ getFeatureDisallowedTools: featureDisallowedTools,
215
+ });
201
216
  Object.assign(boot, {
202
217
  standaloneTools,
203
218
  internalToolDefs,
@@ -206,10 +221,15 @@ function wireToolSurface(boot) {
206
221
  invalidatePreSessionToolSurface,
207
222
  activeToolSurface,
208
223
  applyPreSessionToolSelection,
224
+ toolDefinitionsFor,
225
+ surfaceGeneration,
209
226
  });
210
227
  }
211
228
 
212
- function wireContextStatus(boot) {
229
+ /** The setup-changed action of a context status an empty session's reconcile moved. */
230
+ export const CONTEXT_STATUS_REFRESHED_ACTION = 'context_status_refreshed';
231
+
232
+ export function wireContextStatus(boot) {
213
233
  const { rt } = boot;
214
234
  const { contextStatus: computeContextStatus, invalidateContextStatusCache } = createContextStatus({
215
235
  getSession: () => rt.session,
@@ -219,7 +239,33 @@ function wireContextStatus(boot) {
219
239
  getMode: () => rt.mode,
220
240
  });
221
241
  Object.assign(boot, {
222
- computeContextStatus,
242
+ // The synchronous accessor (the local TUI): an empty session whose
243
+ // settings gates moved starts the shared turn-start reconcile
244
+ // (late-bound); when it rebuilt anything the cache is dropped and the
245
+ // attached surfaces are told to read again.
246
+ computeContextStatus: (...args) => {
247
+ if (boot.emptySessionStale?.()) {
248
+ boot
249
+ .reconcileEmptySession()
250
+ .then((result) => {
251
+ if (!result) return;
252
+ invalidateContextStatusCache();
253
+ boot.emitRuntimeNotification?.('Context status refreshed', {
254
+ kind: 'setup-changed',
255
+ action: CONTEXT_STATUS_REFRESHED_ACTION,
256
+ });
257
+ })
258
+ .catch(() => {});
259
+ }
260
+ return computeContextStatus(...args);
261
+ },
262
+ // Async boundaries (desktop, remote, IPC) wait for the same reconcile.
263
+ computeContextStatusSettled: async (...args) => {
264
+ if (boot.emptySessionStale?.()) {
265
+ if (await boot.reconcileEmptySession()) invalidateContextStatusCache();
266
+ }
267
+ return computeContextStatus(...args);
268
+ },
223
269
  invalidateContextStatusCache,
224
270
  computeContextStatusForSession: (session) =>
225
271
  contextStatusForSession(session, {
@@ -253,11 +299,7 @@ function wireInternalTools(boot) {
253
299
  goalRuntime: boot.goalRuntime,
254
300
  agentTool: boot.routedAgentTool,
255
301
  setupTool,
256
- webSearchEnabled: boot.webSearchEnabled,
257
- memoryToolsEnabled: boot.memoryToolsEnabledFn,
258
- officeToolsEnabled: boot.officeToolsEnabledFn,
259
- mediaToolEnabled: boot.mediaToolEnabledFn,
260
- tidyToolEnabled: boot.tidyToolEnabledFn,
302
+ featureDisallowedTools: boot.featureDisallowedTools,
261
303
  getWebSearchModule: boot.getWebSearchModule,
262
304
  getMemoryModule: boot.getMemoryModule,
263
305
  getCodeGraphModule: boot.getCodeGraphModule,
@@ -286,9 +328,13 @@ function wireInternalTools(boot) {
286
328
  executeSessionControl: boot.params.executeSessionControl || null,
287
329
  }).run,
288
330
  });
331
+ // Dispatch refuses a model call of a tool a setting turned off from this
332
+ // runtime's live gates (a turn already running when it changed included).
333
+ const disposeLiveGates = registerLiveFeatureGates(rt.mcpScopeId, boot.featureDisallowedTools);
289
334
  Object.assign(boot, {
290
335
  setupTool,
291
336
  disposeInternalTools: () => {
337
+ disposeLiveGates();
292
338
  disposeWorktreeToolHost();
293
339
  // Its turn snapshot cleanups stop with the runtime (maintenance finishes them).
294
340
  boot.workspaceApi?.dispose();
@@ -204,6 +204,109 @@ function routineDetail(routine, now) {
204
204
  return cut(`${routine.kind} ${quotedText(routine.name, 64)}: ${parts.join(', ')}`, 240);
205
205
  }
206
206
 
207
+ /** Everything known about one bot, from the gathered state. */
208
+ function botState(bot, ctx) {
209
+ const homeId = agentHomeSessionId(bot.id);
210
+ const owned = ctx.owned.get(bot.id) || [];
211
+ const home = ctx.rows.get(homeId) || null;
212
+ // Work this bot sent that is running now: a session working with the bot's
213
+ // send in flight (`handedBy`, bot-owned-work.mjs). A turn the user typed
214
+ // in the bot's task session is the user's, not the bot working.
215
+ const sentWork = (row) => isWorking(row) && row.handedBy?.includes(bot.id);
216
+ // Running task sessions: a turn whose report is still owed, or the bot's
217
+ // work running now.
218
+ const tasks = new Map();
219
+ const addTask = (id, title, at) => {
220
+ const known = tasks.get(id);
221
+ if (!known) tasks.set(id, { id, title, at });
222
+ else if (at && (!known.at || at < known.at)) known.at = at;
223
+ };
224
+ for (const watch of ctx.watches) {
225
+ if (watch.agentId !== bot.id || watch.target === 'session' || !watch.taskSessionId) continue;
226
+ addTask(watch.taskSessionId, watch.title, Number(watch.at) || 0);
227
+ }
228
+ for (const row of owned) {
229
+ if (row.id === homeId || roomMemberOfSession(row.id) || !sentWork(row)) continue;
230
+ addTask(row.id, row.title, Number(row.createdAt) || 0);
231
+ }
232
+ const running = [...tasks.values()].sort((left, right) => left.at - right.at || (left.id < right.id ? -1 : 1));
233
+ const held = ctx.held.filter((entry) => entry.agentId === bot.id);
234
+ const approvals = held.length + [homeId, ...running.map((task) => task.id)].filter(ctx.awaitingApproval).length;
235
+ const routines = ctx.routines.rows
236
+ .filter((routine) => (routine.owner || MIXY_AGENT_ID) === bot.id)
237
+ .sort((left, right) => (left.name < right.name ? -1 : left.name > right.name ? 1 : 0));
238
+ const flags = [];
239
+ if (approvals) flags.push(`${plural(approvals, 'approval')} waiting`);
240
+ for (const routine of routines) {
241
+ const trouble = routineTrouble(routine);
242
+ if (trouble.length) flags.push(`${quotedText(routine.name, 20)} ${trouble.join(', ')}`);
243
+ }
244
+ if (bot.disabled) flags.push('disabled');
245
+ return {
246
+ bot,
247
+ homeId,
248
+ home,
249
+ owned,
250
+ running,
251
+ held,
252
+ approvals,
253
+ routines,
254
+ flags,
255
+ working: isWorking(home) || running.some((task) => sentWork(ctx.rows.get(task.id))),
256
+ lastAt: activityOf(home),
257
+ };
258
+ }
259
+
260
+ function botLine(state, now) {
261
+ const { bot } = state;
262
+ const parts = [`${quotedText(bot.name, 40)} (${bot.id})`, `chat ${state.homeId}`];
263
+ if (bot.self) parts.push('you');
264
+ parts.push(state.working ? 'working' : 'idle');
265
+ if (state.flags.length) parts.push(`attention: ${state.flags.join('; ')}`);
266
+ parts.push(state.lastAt ? `last ${ago(state.lastAt, now)}` : 'no chat yet');
267
+ if (state.running.length) {
268
+ const [first] = state.running;
269
+ const more = state.running.length > 1 ? ` +${state.running.length - 1}` : '';
270
+ const count = state.running.length > 1 ? `${state.running.length} tasks:` : 'task';
271
+ parts.push(`${count} "${quotedText(first.title, 24)}"${first.at ? ` ${span(now - first.at)}` : ''}${more}`);
272
+ }
273
+ if (state.routines.length) {
274
+ const next = state.routines
275
+ .filter((routine) => routine.enabled !== false && epoch(routine.nextFireAt))
276
+ .sort((left, right) => epoch(left.nextFireAt) - epoch(right.nextFireAt))[0];
277
+ parts.push(
278
+ `${plural(state.routines.length, 'routine')}${next ? `, next ${quotedText(next.name, 20)} ${until(epoch(next.nextFireAt), now)}` : ''}`
279
+ );
280
+ }
281
+ const fixed = parts.join(' · ');
282
+ const preview = oneLine(state.home?.lastMessagePreview || state.home?.preview);
283
+ const room = BOT_LINE_LIMIT - fixed.length - 5;
284
+ return cut(preview && room >= MIN_PREVIEW ? `${fixed} · "${quotedText(preview, room)}"` : fixed, BOT_LINE_LIMIT);
285
+ }
286
+
287
+ const mixyBot = (ctx) => ({ id: MIXY_AGENT_ID, name: ctx.mixy, self: true });
288
+
289
+ /** The bots the caller sees: every bot then Mixy when she has something to
290
+ * show, or just the caller's own bot. */
291
+ function visibleStates(ctx) {
292
+ if (ctx.own) {
293
+ const bot = ctx.own === MIXY_AGENT_ID ? mixyBot(ctx) : ctx.bots[0];
294
+ return bot ? [botState(bot, ctx)] : [];
295
+ }
296
+ const states = ctx.bots
297
+ .map((bot) => botState(bot, ctx))
298
+ .sort(
299
+ (left, right) =>
300
+ Number(right.flags.length > 0) - Number(left.flags.length > 0) ||
301
+ Number(right.working) - Number(left.working) ||
302
+ right.lastAt - left.lastAt ||
303
+ (left.bot.id < right.bot.id ? -1 : 1)
304
+ );
305
+ const mixy = botState(mixyBot(ctx), ctx);
306
+ if (mixy.routines.length || mixy.running.length || mixy.approvals) states.push(mixy);
307
+ return states;
308
+ }
309
+
207
310
  export function createBotStatus({
208
311
  getSessionService,
209
312
  listBots = defaultListBots,
@@ -260,109 +363,6 @@ export function createBotStatus({
260
363
  };
261
364
  }
262
365
 
263
- /** Everything known about one bot, from the gathered state. */
264
- function botState(bot, ctx) {
265
- const homeId = agentHomeSessionId(bot.id);
266
- const owned = ctx.owned.get(bot.id) || [];
267
- const home = ctx.rows.get(homeId) || null;
268
- // Work this bot sent that is running now: a session working with the bot's
269
- // send in flight (`handedBy`, bot-owned-work.mjs). A turn the user typed
270
- // in the bot's task session is the user's, not the bot working.
271
- const sentWork = (row) => isWorking(row) && row.handedBy?.includes(bot.id) === true;
272
- // Running task sessions: a turn whose report is still owed, or the bot's
273
- // work running now.
274
- const tasks = new Map();
275
- const addTask = (id, title, at) => {
276
- const known = tasks.get(id);
277
- if (!known) tasks.set(id, { id, title, at });
278
- else if (at && (!known.at || at < known.at)) known.at = at;
279
- };
280
- for (const watch of ctx.watches) {
281
- if (watch.agentId !== bot.id || watch.target === 'session' || !watch.taskSessionId) continue;
282
- addTask(watch.taskSessionId, watch.title, Number(watch.at) || 0);
283
- }
284
- for (const row of owned) {
285
- if (row.id === homeId || roomMemberOfSession(row.id) || !sentWork(row)) continue;
286
- addTask(row.id, row.title, Number(row.createdAt) || 0);
287
- }
288
- const running = [...tasks.values()].sort((left, right) => left.at - right.at || (left.id < right.id ? -1 : 1));
289
- const held = ctx.held.filter((entry) => entry.agentId === bot.id);
290
- const approvals = held.length + [homeId, ...running.map((task) => task.id)].filter(ctx.awaitingApproval).length;
291
- const routines = ctx.routines.rows
292
- .filter((routine) => (routine.owner || MIXY_AGENT_ID) === bot.id)
293
- .sort((left, right) => (left.name < right.name ? -1 : left.name > right.name ? 1 : 0));
294
- const flags = [];
295
- if (approvals) flags.push(`${plural(approvals, 'approval')} waiting`);
296
- for (const routine of routines) {
297
- const trouble = routineTrouble(routine);
298
- if (trouble.length) flags.push(`${quotedText(routine.name, 20)} ${trouble.join(', ')}`);
299
- }
300
- if (bot.disabled) flags.push('disabled');
301
- return {
302
- bot,
303
- homeId,
304
- home,
305
- owned,
306
- running,
307
- held,
308
- approvals,
309
- routines,
310
- flags,
311
- working: isWorking(home) || running.some((task) => sentWork(ctx.rows.get(task.id))),
312
- lastAt: activityOf(home),
313
- };
314
- }
315
-
316
- function botLine(state, now) {
317
- const { bot } = state;
318
- const parts = [`${quotedText(bot.name, 40)} (${bot.id})`, `chat ${state.homeId}`];
319
- if (bot.self) parts.push('you');
320
- parts.push(state.working ? 'working' : 'idle');
321
- if (state.flags.length) parts.push(`attention: ${state.flags.join('; ')}`);
322
- parts.push(state.lastAt ? `last ${ago(state.lastAt, now)}` : 'no chat yet');
323
- if (state.running.length) {
324
- const [first] = state.running;
325
- const more = state.running.length > 1 ? ` +${state.running.length - 1}` : '';
326
- const count = state.running.length > 1 ? `${state.running.length} tasks:` : 'task';
327
- parts.push(`${count} "${quotedText(first.title, 24)}"${first.at ? ` ${span(now - first.at)}` : ''}${more}`);
328
- }
329
- if (state.routines.length) {
330
- const next = state.routines
331
- .filter((routine) => routine.enabled !== false && epoch(routine.nextFireAt))
332
- .sort((left, right) => epoch(left.nextFireAt) - epoch(right.nextFireAt))[0];
333
- parts.push(
334
- `${plural(state.routines.length, 'routine')}${next ? `, next ${quotedText(next.name, 20)} ${until(epoch(next.nextFireAt), now)}` : ''}`
335
- );
336
- }
337
- const fixed = parts.join(' · ');
338
- const preview = oneLine(state.home?.lastMessagePreview || state.home?.preview);
339
- const room = BOT_LINE_LIMIT - fixed.length - 5;
340
- return cut(preview && room >= MIN_PREVIEW ? `${fixed} · "${quotedText(preview, room)}"` : fixed, BOT_LINE_LIMIT);
341
- }
342
-
343
- const mixyBot = (ctx) => ({ id: MIXY_AGENT_ID, name: ctx.mixy, self: true });
344
-
345
- /** The bots the caller sees: every bot then Mixy when she has something to
346
- * show, or just the caller's own bot. */
347
- function visibleStates(ctx) {
348
- if (ctx.own) {
349
- const bot = ctx.own === MIXY_AGENT_ID ? mixyBot(ctx) : ctx.bots[0];
350
- return bot ? [botState(bot, ctx)] : [];
351
- }
352
- const states = ctx.bots
353
- .map((bot) => botState(bot, ctx))
354
- .sort(
355
- (left, right) =>
356
- Number(right.flags.length > 0) - Number(left.flags.length > 0) ||
357
- Number(right.working) - Number(left.working) ||
358
- right.lastAt - left.lastAt ||
359
- (left.bot.id < right.bot.id ? -1 : 1)
360
- );
361
- const mixy = botState(mixyBot(ctx), ctx);
362
- if (mixy.routines.length || mixy.running.length || mixy.approvals) states.push(mixy);
363
- return states;
364
- }
365
-
366
366
  async function overview(own) {
367
367
  const ctx = await gather(own);
368
368
  const states = visibleStates(ctx);