mixdog 1.4.2 → 1.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (417) hide show
  1. package/package.json +2 -2
  2. package/scripts/build-shipped-history.mjs +15 -5
  3. package/scripts/gate-local.mjs +65 -19
  4. package/scripts/graph-parity.mjs +8 -3
  5. package/scripts/lib/gate-scheduler.mjs +2 -1
  6. package/scripts/lib/run-node-tests.mjs +17 -5
  7. package/scripts/lib/test-failure-summary.mjs +1 -8
  8. package/scripts/lib/test-spawn-ledger.mjs +33 -2
  9. package/scripts/post-release-check.mjs +26 -16
  10. package/scripts/provider-pingpong-live.mjs +1 -1
  11. package/scripts/prune-embedding-runtime.mjs +3 -1
  12. package/scripts/release-paths.mjs +7 -1
  13. package/src/defaults/shipped-history.json +20 -0
  14. package/src/defaults/skills/setup/SKILL.md +2 -2
  15. package/src/defaults/skills/setup/references/actions.md +16 -3
  16. package/src/defaults/skills/setup/references/surfaces.md +3 -0
  17. package/src/defaults/skills/setup-guide/SKILL.md +6 -1
  18. package/src/lib/instruction-text.cjs +36 -0
  19. package/src/lib/rules-builder.cjs +34 -20
  20. package/src/orchestration/balanced.md +23 -0
  21. package/src/orchestration/focused.md +22 -0
  22. package/src/orchestration/none.md +5 -0
  23. package/src/orchestration/swarm.md +24 -0
  24. package/src/rules/agent-mode/AGENT_MODE.md +3 -1
  25. package/src/rules/agent-mode/MIXY.md +2 -2
  26. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/session-prep.mjs +3 -3
  27. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch.mjs +0 -1
  28. package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +4 -2
  29. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +0 -9
  30. package/src/runtime/agent/orchestrator/agent-runtime/heartbeat-completion.mjs +2 -2
  31. package/src/runtime/agent/orchestrator/agent-runtime/session-builder.mjs +67 -0
  32. package/src/runtime/agent/orchestrator/agent-trace-format.mjs +1 -0
  33. package/src/runtime/agent/orchestrator/context/role-instructions.mjs +4 -4
  34. package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +3 -1
  35. package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +199 -46
  36. package/src/runtime/agent/orchestrator/mcp/client-config.mjs +3 -5
  37. package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +9 -3
  38. package/src/runtime/agent/orchestrator/mcp/client.mjs +3 -5
  39. package/src/runtime/agent/orchestrator/mcp/oauth-client.mjs +1 -1
  40. package/src/runtime/agent/orchestrator/mcp/oauth-credentials.mjs +8 -2
  41. package/src/runtime/agent/orchestrator/mcp/oauth-probe.mjs +1 -1
  42. package/src/runtime/agent/orchestrator/mcp/oauth-provider.mjs +14 -0
  43. package/src/runtime/agent/orchestrator/mcp/oauth.mjs +1 -1
  44. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
  45. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-stop.mjs +3 -3
  46. package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +1 -1
  47. package/src/runtime/agent/orchestrator/providers/gemini-thinking.mjs +2 -2
  48. package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +4 -6
  49. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-head-parity.json +2784 -2872
  50. package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +5 -8
  51. package/src/runtime/agent/orchestrator/providers/openai-responses-payload-parity.fixture.json +288 -300
  52. package/src/runtime/agent/orchestrator/providers/vertex-ai.mjs +10 -1
  53. package/src/runtime/agent/orchestrator/providers/xai-tool-search-head-parity.json +10 -30
  54. package/src/runtime/agent/orchestrator/runtime-core/builtin-features.mjs +30 -0
  55. package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +0 -11
  56. package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-availability.mjs +8 -0
  57. package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-delta.mjs +17 -3
  58. package/src/runtime/agent/orchestrator/runtime-core/goal-control.mjs +47 -27
  59. package/src/runtime/agent/orchestrator/runtime-core/goal-deadlines.mjs +141 -10
  60. package/src/runtime/agent/orchestrator/runtime-core/goal-mutations.mjs +26 -63
  61. package/src/runtime/agent/orchestrator/runtime-core/goal-reminder.mjs +28 -3
  62. package/src/runtime/agent/orchestrator/runtime-core/goal-runtime.mjs +36 -11
  63. package/src/runtime/agent/orchestrator/runtime-core/goal-state.mjs +88 -56
  64. package/src/runtime/agent/orchestrator/runtime-core/goal-storage.mjs +4 -1
  65. package/src/runtime/agent/orchestrator/runtime-core/goal-store.mjs +51 -32
  66. package/src/runtime/agent/orchestrator/runtime-core/goal-text.mjs +45 -145
  67. package/src/runtime/agent/orchestrator/runtime-core/goal-tool-defs.mjs +15 -98
  68. package/src/runtime/agent/orchestrator/runtime-core/goal-tool-exec.mjs +32 -99
  69. package/src/runtime/agent/orchestrator/runtime-core/goal-turns.mjs +23 -78
  70. package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +69 -48
  71. package/src/runtime/agent/orchestrator/runtime-core/todo-list.mjs +367 -0
  72. package/src/runtime/agent/orchestrator/runtime-core/todo-tool-defs.mjs +47 -0
  73. package/src/runtime/agent/orchestrator/runtime-core/tool-availability.mjs +155 -0
  74. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-data.mjs +9 -0
  75. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +119 -35
  76. package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +1 -1
  77. package/src/runtime/agent/orchestrator/runtime-core/workflow/context.mjs +1 -1
  78. package/src/runtime/agent/orchestrator/session/agent-loop.mjs +28 -22
  79. package/src/runtime/agent/orchestrator/session/agent-pool-progress.mjs +30 -0
  80. package/src/runtime/agent/orchestrator/session/attachment-preflight.mjs +1 -1
  81. package/src/runtime/agent/orchestrator/session/cache-warm.mjs +2 -2
  82. package/src/runtime/agent/orchestrator/session/catalog-db/index.mjs +2 -2
  83. package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +1 -1
  84. package/src/runtime/agent/orchestrator/session/compact/execution-tail.mjs +1 -1
  85. package/src/runtime/agent/orchestrator/session/compact/runner.mjs +3 -0
  86. package/src/runtime/agent/orchestrator/session/compact/summary-route.mjs +1 -1
  87. package/src/runtime/agent/orchestrator/session/context-utils.mjs +8 -12
  88. package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +1 -1
  89. package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +1 -1
  90. package/src/runtime/agent/orchestrator/session/conversation-import/convert.mjs +1 -1
  91. package/src/runtime/agent/orchestrator/session/conversation-import/imported-session.mjs +7 -3
  92. package/src/runtime/agent/orchestrator/session/human-gate/held-message.mjs +1 -1
  93. package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +1 -2
  94. package/src/runtime/agent/orchestrator/session/human-gate/run-policy.mjs +1 -1
  95. package/src/runtime/agent/orchestrator/session/image-strip-recovery.mjs +1 -1
  96. package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +11 -1
  97. package/src/runtime/agent/orchestrator/session/loop/context-overflow.mjs +1 -1
  98. package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +8 -1
  99. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/todo-check.mjs +196 -0
  100. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +116 -50
  101. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +8 -1
  102. package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +1 -1
  103. package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +1 -1
  104. package/src/runtime/agent/orchestrator/session/loop/steering.mjs +3 -1
  105. package/src/runtime/agent/orchestrator/session/loop/stored-tool-args.mjs +5 -6
  106. package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +6 -1
  107. package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +16 -2
  108. package/src/runtime/agent/orchestrator/session/loop/turn-report.mjs +35 -0
  109. package/src/runtime/agent/orchestrator/session/loop/usage.mjs +1 -1
  110. package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +57 -26
  111. package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +9 -7
  112. package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +21 -3
  113. package/src/runtime/agent/orchestrator/session/manager/ask-turn-failure.mjs +27 -11
  114. package/src/runtime/agent/orchestrator/session/manager/ask-turn-open.mjs +37 -34
  115. package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +15 -0
  116. package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +25 -15
  117. package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +79 -24
  118. package/src/runtime/agent/orchestrator/session/manager/ask-turn-steering-drain.mjs +3 -0
  119. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +12 -1
  120. package/src/runtime/agent/orchestrator/session/manager/context-meta.mjs +1 -1
  121. package/src/runtime/agent/orchestrator/session/manager/idle-cleanup.mjs +6 -1
  122. package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +9 -1
  123. package/src/runtime/agent/orchestrator/session/manager/pending-spool-path.mjs +2 -2
  124. package/src/runtime/agent/orchestrator/session/manager/pending-spool-shard.mjs +1 -1
  125. package/src/runtime/agent/orchestrator/session/manager/prompt-settings.mjs +598 -0
  126. package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +19 -0
  127. package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +19 -10
  128. package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +5 -0
  129. package/src/runtime/agent/orchestrator/session/manager/session-fallback-title.mjs +1 -1
  130. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +31 -0
  131. package/src/runtime/agent/orchestrator/session/manager/session-lock.mjs +31 -0
  132. package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +42 -6
  133. package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +2 -0
  134. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +11 -1
  135. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-context.mjs +8 -9
  136. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +339 -88
  137. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-recovery.mjs +135 -11
  138. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +377 -104
  139. package/src/runtime/agent/orchestrator/session/manager/turn-durability.mjs +144 -0
  140. package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +1 -1
  141. package/src/runtime/agent/orchestrator/session/manager/usage-metrics.mjs +4 -0
  142. package/src/runtime/agent/orchestrator/session/manager.mjs +6 -0
  143. package/src/runtime/agent/orchestrator/session/mixy-name.mjs +1 -1
  144. package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +8 -1
  145. package/src/runtime/agent/orchestrator/session/save-session-worker.mjs +5 -1
  146. package/src/runtime/agent/orchestrator/session/store/canonical-reader.mjs +1 -1
  147. package/src/runtime/agent/orchestrator/session/store/liveness-veto.mjs +2 -2
  148. package/src/runtime/agent/orchestrator/session/store/save-worker.mjs +23 -2
  149. package/src/runtime/agent/orchestrator/session/store/sweep/sub-agent-retention.mjs +3 -3
  150. package/src/runtime/agent/orchestrator/session/store/transcript-durability.mjs +88 -0
  151. package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +5 -0
  152. package/src/runtime/agent/orchestrator/session/store-summary-log.mjs +1 -1
  153. package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +14 -5
  154. package/src/runtime/agent/orchestrator/session/store-transcript-worker.mjs +2 -2
  155. package/src/runtime/agent/orchestrator/session/store.mjs +5 -0
  156. package/src/runtime/agent/orchestrator/session/synthetic-user-envelope.mjs +7 -1
  157. package/src/runtime/agent/orchestrator/session/tail-reminder-rules.mjs +9 -1
  158. package/src/runtime/agent/orchestrator/session/transcript-restore/agent-envelope.mjs +1 -1
  159. package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +3 -1
  160. package/src/runtime/agent/orchestrator/session/transcript-restore/user-text.mjs +2 -2
  161. package/src/runtime/agent/orchestrator/stall-policy.mjs +3 -5
  162. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/backgrounded-result.mjs +4 -1
  163. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/misuse-guard.mjs +21 -3
  164. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/result-format.mjs +1 -1
  165. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/worktree-add-guard.mjs +77 -0
  166. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +0 -1
  167. package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +7 -3
  168. package/src/runtime/agent/orchestrator/tools/builtin/git-worktree-tool.mjs +27 -9
  169. package/src/runtime/agent/orchestrator/tools/builtin/lib/search-input-helpers.mjs +2 -2
  170. package/src/runtime/agent/orchestrator/tools/builtin/read-range-index.mjs +1 -1
  171. package/src/runtime/agent/orchestrator/tools/builtin/read-single-fast-paths.mjs +0 -1
  172. package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +0 -10
  173. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +1 -2
  174. package/src/runtime/agent/orchestrator/tools/builtin.mjs +1 -24
  175. package/src/runtime/agent/orchestrator/tools/code-graph/graph-binary/child-kill.mjs +4 -3
  176. package/src/runtime/agent/orchestrator/tools/code-graph/graph-binary.mjs +1 -2
  177. package/src/runtime/agent/orchestrator/tools/code-graph/modes/calls.mjs +1 -1
  178. package/src/runtime/agent/orchestrator/tools/code-graph/modes/symbols.mjs +2 -2
  179. package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +4 -5
  180. package/src/runtime/agent/orchestrator/tools/code-graph/symbol-index.mjs +3 -4
  181. package/src/runtime/agent/orchestrator/tools/code-graph.mjs +4 -22
  182. package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +2 -2
  183. package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +1 -1
  184. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +0 -4
  185. package/src/runtime/agent/orchestrator/tools/shell-policy.mjs +0 -1
  186. package/src/runtime/attachments/attachment-reference.mjs +1 -1
  187. package/src/runtime/attachments/pdf-extract.mjs +1 -1
  188. package/src/runtime/attachments/store.d.mts +1 -0
  189. package/src/runtime/attachments/store.mjs +2 -2
  190. package/src/runtime/channels/lib/config-reload-watch.mjs +42 -0
  191. package/src/runtime/channels/lib/owned-runtime/config-reload.mjs +29 -9
  192. package/src/runtime/channels/lib/scheduler.mjs +33 -0
  193. package/src/runtime/channels/lib/schedules-db.mjs +11 -4
  194. package/src/runtime/channels/lib/webhook/session-dispatch.mjs +4 -1
  195. package/src/runtime/channels/lib/webhooks-db.mjs +9 -3
  196. package/src/runtime/channels/lib/whisper-server.mjs +12 -12
  197. package/src/runtime/channels/lib/worker-main.mjs +9 -31
  198. package/src/runtime/computer-bridge/linux-readiness.mjs +10 -14
  199. package/src/runtime/connectors/connector-accounts-mcp.mjs +169 -33
  200. package/src/runtime/connectors/gmail-app-password.mjs +2 -2
  201. package/src/runtime/connectors/google-mcp.mjs +1 -1
  202. package/src/runtime/effort-judge/judge-client.mjs +2 -2
  203. package/src/runtime/effort-judge/judge-input.mjs +4 -4
  204. package/src/runtime/explore/explorer.mjs +0 -5
  205. package/src/runtime/explore/tool.mjs +3 -3
  206. package/src/runtime/local-provider/hardware.mjs +1 -1
  207. package/src/runtime/media/adapters/codex-image.mjs +3 -3
  208. package/src/runtime/media/adapters/gemini-video.mjs +1 -1
  209. package/src/runtime/media/media-usage.mjs +1 -1
  210. package/src/runtime/media/store.mjs +1 -1
  211. package/src/runtime/memory/index.mjs +11 -1
  212. package/src/runtime/memory/lib/embedding-reindex.mjs +27 -0
  213. package/src/runtime/memory/lib/memory-embed.mjs +83 -14
  214. package/src/runtime/memory/lib/memory-process-lock.mjs +159 -36
  215. package/src/runtime/memory/lib/memory-text-utils.mjs +6 -1
  216. package/src/runtime/memory/lib/memory.mjs +17 -0
  217. package/src/runtime/memory/lib/pg/process.mjs +1 -1
  218. package/src/runtime/memory/lib/pg/supervisor.mjs +16 -96
  219. package/src/runtime/memory/lib/recall-hybrid/hybrid-sql.mjs +12 -3
  220. package/src/runtime/office/authoring/docx-html-runner.mjs +1 -1
  221. package/src/runtime/office/authoring/pptx-author-action.mjs +1 -1
  222. package/src/runtime/office/authoring/xlsx-html-build.mjs +1 -1
  223. package/src/runtime/office/authoring/xlsx-html-runner.mjs +1 -1
  224. package/src/runtime/office/capabilities.mjs +1 -1
  225. package/src/runtime/office/core/office-core.mjs +1 -1
  226. package/src/runtime/office/design/content-model.mjs +3 -3
  227. package/src/runtime/office/design/docx/design-docx/section.mjs +6 -6
  228. package/src/runtime/office/design/xlsx/design-xlsx-components.mjs +1 -1
  229. package/src/runtime/office/design/xlsx/design-xlsx.mjs +1 -1
  230. package/src/runtime/office/pdf/ocr-engine.mjs +1 -1
  231. package/src/runtime/office/pdf/pdf-writer.mjs +4 -4
  232. package/src/runtime/office/portable/portable-docx-operations.mjs +2 -2
  233. package/src/runtime/office/portable/portable-soffice.mjs +8 -6
  234. package/src/runtime/office/portable/xlsx-contract.mjs +1 -1
  235. package/src/runtime/shared/atomic-file.d.mts +8 -0
  236. package/src/runtime/shared/background-tasks.mjs +22 -4
  237. package/src/runtime/shared/background-wait.mjs +66 -0
  238. package/src/runtime/shared/child-guardian.mjs +17 -7
  239. package/src/runtime/shared/config.mjs +313 -16
  240. package/src/runtime/shared/connector-catalog.d.mts +4 -5
  241. package/src/runtime/shared/connector-catalog.mjs +11 -1
  242. package/src/runtime/shared/file-lock.mjs +8 -3
  243. package/src/runtime/shared/git-runner.mjs +7 -2
  244. package/src/runtime/shared/idle-gc.mjs +30 -7
  245. package/src/runtime/shared/llm/http-agent.mjs +8 -5
  246. package/src/runtime/shared/llm/system-proxy.mjs +2 -1
  247. package/src/runtime/shared/llm/usage-ledger-quota.mjs +31 -12
  248. package/src/runtime/shared/llm/usage-ledger-rollup.mjs +84 -8
  249. package/src/runtime/shared/llm/usage-ledger.mjs +3 -0
  250. package/src/runtime/shared/llm/usage-rollup.mjs +48 -0
  251. package/src/runtime/shared/maintenance-schedule.mjs +109 -0
  252. package/src/runtime/shared/process-runner.mjs +8 -4
  253. package/src/runtime/shared/routine-trigger.d.mts +13 -0
  254. package/src/runtime/shared/routine-trigger.mjs +34 -0
  255. package/src/runtime/shared/run-child.d.mts +2 -1
  256. package/src/runtime/shared/run-child.mjs +70 -18
  257. package/src/runtime/shared/session-scratch.mjs +14 -2
  258. package/src/runtime/shared/shipped-definitions.mjs +7 -1
  259. package/src/runtime/shared/tool-card-model.golden.json +3 -12
  260. package/src/runtime/shared/tool-execution-contract.mjs +2 -0
  261. package/src/runtime/shared/tool-work-units.mjs +31 -6
  262. package/src/runtime/shared/turn-snapshot.mjs +26 -4
  263. package/src/runtime/shared/turn-worktree-snapshot.mjs +6 -11
  264. package/src/runtime/shared/worker-requests.mjs +17 -3
  265. package/src/runtime/shared/worktrees/branch-management.mjs +1 -5
  266. package/src/runtime/shared/worktrees/contract.mjs +16 -6
  267. package/src/runtime/shared/worktrees/dependencies.mjs +127 -89
  268. package/src/runtime/shared/worktrees/disk.mjs +79 -2
  269. package/src/runtime/shared/worktrees/git.mjs +44 -11
  270. package/src/runtime/shared/worktrees/include.mjs +6 -4
  271. package/src/runtime/shared/worktrees/maintenance.mjs +422 -30
  272. package/src/runtime/shared/worktrees/manager.mjs +772 -75
  273. package/src/runtime/shared/worktrees/settings.mjs +33 -7
  274. package/src/runtime/shared/worktrees/test-support.mjs +5 -1
  275. package/src/runtime/shared/worktrees/worker-snapshots.mjs +82 -0
  276. package/src/runtime/tidy/process.mjs +2 -1
  277. package/src/runtime/web-search/index.mjs +3 -22
  278. package/src/runtime/web-search/lib/web-tools.mjs +2 -2
  279. package/src/runtime/web-search/tool-defs.mjs +17 -26
  280. package/src/session-runtime/agent-profile-changes.mjs +55 -4
  281. package/src/session-runtime/boot/apis.mjs +27 -4
  282. package/src/session-runtime/boot/begin.mjs +2 -0
  283. package/src/session-runtime/boot/config.mjs +10 -1
  284. package/src/session-runtime/boot/facade.mjs +1 -0
  285. package/src/session-runtime/boot/providers.mjs +70 -3
  286. package/src/session-runtime/boot/session.mjs +2 -0
  287. package/src/session-runtime/boot/tools.mjs +69 -25
  288. package/src/session-runtime/channel-config-api.mjs +1 -0
  289. package/src/session-runtime/config-change-effects.mjs +179 -0
  290. package/src/session-runtime/config-lifecycle/config-writers.mjs +1 -0
  291. package/src/session-runtime/config-lifecycle.mjs +160 -24
  292. package/src/session-runtime/conversation-import/discovery.mjs +86 -7
  293. package/src/session-runtime/conversation-import/service.mjs +3 -2
  294. package/src/session-runtime/goal-facade-api.mjs +49 -3
  295. package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +3 -0
  296. package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +3 -2
  297. package/src/session-runtime/internal-tool-executor/feature-tools.mjs +3 -11
  298. package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +18 -4
  299. package/src/session-runtime/internal-tool-executor.mjs +12 -19
  300. package/src/session-runtime/lifecycle/cold-heir.mjs +7 -0
  301. package/src/session-runtime/lifecycle/memory-ingest.mjs +3 -3
  302. package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +53 -5
  303. package/src/session-runtime/lifecycle/session-switch.mjs +13 -2
  304. package/src/session-runtime/lifecycle/teardown/session-close.mjs +4 -4
  305. package/src/session-runtime/lifecycle-api.mjs +1 -0
  306. package/src/session-runtime/mcp-glue/server-catalog.mjs +14 -3
  307. package/src/session-runtime/mcp-glue/server-connection.mjs +34 -8
  308. package/src/session-runtime/model-route/set-route.mjs +40 -7
  309. package/src/session-runtime/native-web-search/routes.mjs +3 -3
  310. package/src/session-runtime/provider-auth/refresh.mjs +6 -3
  311. package/src/session-runtime/provider-auth/setup.mjs +1 -1
  312. package/src/session-runtime/provider-readiness.mjs +53 -4
  313. package/src/session-runtime/resource-api.mjs +1 -1
  314. package/src/session-runtime/resource-extension-sync.mjs +4 -8
  315. package/src/session-runtime/resource-mcp-connector-accounts.mjs +5 -1
  316. package/src/session-runtime/resource-mcp-secrets.mjs +3 -3
  317. package/src/session-runtime/resource-plugins-api.mjs +4 -0
  318. package/src/session-runtime/routine-executor.mjs +152 -0
  319. package/src/session-runtime/routine-home-turn.mjs +46 -5
  320. package/src/session-runtime/runtime-facade.mjs +5 -0
  321. package/src/session-runtime/runtime-feature-gates.mjs +2 -11
  322. package/src/session-runtime/schedule-session-run.mjs +1 -0
  323. package/src/session-runtime/services/agent-tool/job-task-reconcile.mjs +6 -1
  324. package/src/session-runtime/services/agent-tool/job-views/session-progress.mjs +7 -0
  325. package/src/session-runtime/services/agent-tool/send-flow.mjs +110 -6
  326. package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +12 -0
  327. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-plan.mjs +5 -0
  328. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +24 -6
  329. package/src/session-runtime/services/agent-tool.mjs +51 -1
  330. package/src/session-runtime/services/channel-admin.mjs +18 -0
  331. package/src/session-runtime/services/hook-bus/command-handler.mjs +7 -11
  332. package/src/session-runtime/services/plugin-admin.mjs +4 -0
  333. package/src/session-runtime/services/seeds.mjs +7 -0
  334. package/src/session-runtime/services/usage-stats-model.mjs +32 -11
  335. package/src/session-runtime/session-create/materialize.mjs +4 -2
  336. package/src/session-runtime/session-create/session-options.mjs +2 -0
  337. package/src/session-runtime/settings-builtin-tools-api.mjs +1 -9
  338. package/src/session-runtime/setup-tool/connector-widen-approval.mjs +1 -1
  339. package/src/session-runtime/setup-tool/executor.mjs +8 -1
  340. package/src/session-runtime/setup-tool/extended-actions.mjs +2 -0
  341. package/src/session-runtime/setup-tool/settings-contract.mjs +28 -0
  342. package/src/session-runtime/setup-tool/tool-defs.mjs +26 -1
  343. package/src/session-runtime/tool-policy/agent-profile-fold.mjs +40 -43
  344. package/src/session-runtime/tool-policy/mode-switch.mjs +1 -1
  345. package/src/session-runtime/tool-policy/policy-stage.mjs +106 -8
  346. package/src/session-runtime/tool-policy/workflow-overlay.mjs +2 -1
  347. package/src/session-runtime/tool-policy-refresh.mjs +182 -5
  348. package/src/session-runtime/tool-surface.mjs +38 -1
  349. package/src/session-runtime/turn/agent-ops.mjs +10 -2
  350. package/src/session-runtime/turn/session-ops.mjs +2 -0
  351. package/src/session-runtime/turn/turn-run/turn-prepare.mjs +5 -0
  352. package/src/session-runtime/turn/turn-run.mjs +1 -1
  353. package/src/session-runtime/webhook-session-run.mjs +2 -0
  354. package/src/session-runtime/workflow-agents-api/agent-connectors.mjs +1 -4
  355. package/src/session-runtime/workflow-agents-api/agent-route.mjs +3 -10
  356. package/src/session-runtime/workflow-agents-api/instruction-files.mjs +165 -0
  357. package/src/session-runtime/workflow-agents-api/style-and-mode.mjs +5 -4
  358. package/src/session-runtime/workflow-agents-api/workflow-packs.mjs +2 -3
  359. package/src/session-runtime/workflow-agents-api.mjs +2 -0
  360. package/src/session-runtime/workspace/project-branches.mjs +1 -1
  361. package/src/session-runtime/workspace/session-view.mjs +1 -1
  362. package/src/session-runtime/workspace/transitions.mjs +20 -4
  363. package/src/session-runtime/workspace/worktree-maintenance.mjs +126 -6
  364. package/src/session-runtime/workspace/worktree-setup.mjs +13 -1
  365. package/src/session-runtime/workspace/worktree-tool.mjs +16 -0
  366. package/src/standalone/daemon-agent-control.mjs +25 -8
  367. package/src/standalone/daemon-desktop-runtime.mjs +6 -2
  368. package/src/standalone/daemon-lag-profiler.mjs +7 -7
  369. package/src/standalone/daemon.mjs +54 -2
  370. package/src/standalone/local-session-runtime.mjs +16 -0
  371. package/src/standalone/session-client/daemon-unavailable.mjs +1 -1
  372. package/src/standalone/session-protocol.mjs +11 -0
  373. package/src/standalone/session-service/agent-route-follow.mjs +23 -20
  374. package/src/standalone/session-service/agent-tree/agent-turns.mjs +18 -6
  375. package/src/standalone/session-service/quota-resume.mjs +9 -0
  376. package/src/standalone/session-service/session-calls/session-action.mjs +51 -1
  377. package/src/standalone/session-service/session-calls/session-turns.mjs +37 -18
  378. package/src/standalone/session-service/session-calls/turn-gate.mjs +34 -0
  379. package/src/standalone/session-service/session-calls.mjs +2 -1
  380. package/src/tui/App.jsx +8 -0
  381. package/src/tui/app/clipboard.mjs +1 -1
  382. package/src/tui/app/create-app-pickers.mjs +2 -0
  383. package/src/tui/app/doctor.mjs +2 -2
  384. package/src/tui/app/panel-signature.mjs +1 -1
  385. package/src/tui/app/settings-picker.mjs +53 -8
  386. package/src/tui/app/shell-layout/row-budgets.mjs +2 -2
  387. package/src/tui/app/slash-commands.mjs +1 -1
  388. package/src/tui/app/slash-dispatch/route-commands.mjs +1 -1
  389. package/src/tui/app/slash-dispatch/session-commands.mjs +1 -1
  390. package/src/tui/app/use-prompt-queue-history.mjs +2 -2
  391. package/src/tui/app/use-transcript-activity.mjs +1 -1
  392. package/src/tui/app/use-transcript-window/geometry.mjs +1 -1
  393. package/src/tui/components/prompt-input/escape-policy.d.mts +0 -1
  394. package/src/tui/components/prompt-input/escape-policy.mjs +1 -1
  395. package/src/tui/components/question-panel-model.mjs +4 -4
  396. package/src/tui/components/tool-execution/standard-card.jsx +3 -4
  397. package/src/tui/components/user-message-skills.mjs +1 -1
  398. package/src/tui/dist/index.mjs +309 -30
  399. package/src/tui/markdown/render-ansi.mjs +1 -1
  400. package/src/tui/session/agent-job-feed/notification-router.mjs +10 -0
  401. package/src/tui/session/agent-job-feed.mjs +2 -0
  402. package/src/tui/session/context-state.mjs +3 -0
  403. package/src/tui/session/quota-resume.mjs +1 -1
  404. package/src/tui/session/session-api/lifecycle/dispose.mjs +1 -0
  405. package/src/tui/session/session-api/lifecycle/session-reset.mjs +7 -0
  406. package/src/tui/session/session-api/routes-agent-definitions.mjs +5 -0
  407. package/src/tui/session/session-api/worktree.mjs +13 -1
  408. package/src/tui/session/session-flow/drain.mjs +11 -14
  409. package/src/tui/session/tool-card-results/grouped-result.mjs +2 -2
  410. package/src/tui/session/turn-quiet.mjs +1 -1
  411. package/src/tui/session/turn.mjs +3 -0
  412. package/src/tui/session/worktree-setup-notice.mjs +1 -1
  413. package/src/tui/spinner-meta.mjs +3 -3
  414. package/src/tui/spinner-verbs.mjs +2 -2
  415. package/src/defaults/skills/goal-management/SKILL.md +0 -169
  416. package/src/runtime/agent/orchestrator/runtime-core/goal-tasks.mjs +0 -156
  417. package/src/session-runtime/goal-tasks.mjs +0 -1
@@ -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,
@@ -41,6 +41,7 @@ import {
41
41
  } from '../../runtime/agent/orchestrator/runtime-core/context-status.mjs';
42
42
  import { createInternalToolExecutor } from '../internal-tool-executor.mjs';
43
43
  import { registerWorktreeToolHost } from '../../runtime/shared/worktrees/tool-host.mjs';
44
+ import { registerLiveFeatureGates } from '../../runtime/agent/orchestrator/runtime-core/tool-availability.mjs';
44
45
  import { createWorktreeToolHost } from '../workspace/worktree-tool.mjs';
45
46
  import { STANDALONE_ROOT, standaloneDataDir } from '../runtime-paths.mjs';
46
47
  import { dataDirOf, workflowHelpers } from './shared.mjs';
@@ -61,8 +62,14 @@ export function wireTools(boot) {
61
62
  })
62
63
  )
63
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.
64
67
  boot.reloadChannelsSoon = () => {
65
- 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
+ );
66
73
  };
67
74
  }
68
75
 
@@ -183,23 +190,29 @@ function wireToolSurface(boot) {
183
190
  skillToolEnabled: !envFlag('MIXDOG_DISABLE_SKILLS'),
184
191
  });
185
192
  bootProfile('tools:ready', { ms: (performance.now() - toolsStartedAt).toFixed(1), count: standaloneTools.length });
186
- const { modelStandaloneTools, invalidatePreSessionToolSurface, activeToolSurface, applyPreSessionToolSelection } =
187
- createToolSurface({
188
- mgr,
189
- mode: rt.mode,
190
- standaloneTools,
191
- agentToolNames,
192
- getSession: () => rt.session,
193
- getRoute: () => rt.route,
194
- getConfig: () => rt.config,
195
- getToolProfile: () => rt.toolProfile,
196
- getMcpScopeId: () => rt.mcpScopeId,
197
- getCurrentCwd: () => rt.currentCwd,
198
- cfgMod,
199
- delegatableAgentIds: workflowHelpers.delegatableAgentIds,
200
- dataDir: standaloneDataDir(),
201
- getFeatureDisallowedTools: featureDisallowedTools,
202
- });
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
+ });
203
216
  Object.assign(boot, {
204
217
  standaloneTools,
205
218
  internalToolDefs,
@@ -208,10 +221,15 @@ function wireToolSurface(boot) {
208
221
  invalidatePreSessionToolSurface,
209
222
  activeToolSurface,
210
223
  applyPreSessionToolSelection,
224
+ toolDefinitionsFor,
225
+ surfaceGeneration,
211
226
  });
212
227
  }
213
228
 
214
- 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) {
215
233
  const { rt } = boot;
216
234
  const { contextStatus: computeContextStatus, invalidateContextStatusCache } = createContextStatus({
217
235
  getSession: () => rt.session,
@@ -221,7 +239,33 @@ function wireContextStatus(boot) {
221
239
  getMode: () => rt.mode,
222
240
  });
223
241
  Object.assign(boot, {
224
- 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
+ },
225
269
  invalidateContextStatusCache,
226
270
  computeContextStatusForSession: (session) =>
227
271
  contextStatusForSession(session, {
@@ -255,11 +299,7 @@ function wireInternalTools(boot) {
255
299
  goalRuntime: boot.goalRuntime,
256
300
  agentTool: boot.routedAgentTool,
257
301
  setupTool,
258
- webSearchEnabled: boot.webSearchEnabled,
259
- memoryToolsEnabled: boot.memoryToolsEnabledFn,
260
- officeToolsEnabled: boot.officeToolsEnabledFn,
261
- mediaToolEnabled: boot.mediaToolEnabledFn,
262
- tidyToolEnabled: boot.tidyToolEnabledFn,
302
+ featureDisallowedTools: boot.featureDisallowedTools,
263
303
  getWebSearchModule: boot.getWebSearchModule,
264
304
  getMemoryModule: boot.getMemoryModule,
265
305
  getCodeGraphModule: boot.getCodeGraphModule,
@@ -288,9 +328,13 @@ function wireInternalTools(boot) {
288
328
  executeSessionControl: boot.params.executeSessionControl || null,
289
329
  }).run,
290
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);
291
334
  Object.assign(boot, {
292
335
  setupTool,
293
336
  disposeInternalTools: () => {
337
+ disposeLiveGates();
294
338
  disposeWorktreeToolHost();
295
339
  // Its turn snapshot cleanups stop with the runtime (maintenance finishes them).
296
340
  boot.workspaceApi?.dispose();
@@ -167,6 +167,7 @@ export function createChannelConfigApi({ channels, reloadChannelsSoon, ensureAut
167
167
  {
168
168
  name: endpoint.name,
169
169
  ownerAgentId: endpoint.ownerAgentId,
170
+ executorAgentId: endpoint.executorAgentId || null,
170
171
  cwd: endpoint.cwd || null,
171
172
  attachments: endpoint.attachments || null,
172
173
  event: webhookEventSummary(payload.headers ?? {}, payload.body ?? {}),
@@ -0,0 +1,179 @@
1
+ // The change-driven effect step of one runtime. Every persisted change (a
2
+ // config write or a keychain write, by this runtime, another runtime, another
3
+ // process or a hand edit) reaches each subscribing runtime as one
4
+ // notification; the runtime reloads, compares the result with the snapshot it
5
+ // last applied, and runs only the effects keyed by what changed. The writer
6
+ // takes the same step, so no effect depends on which process wrote.
7
+
8
+ /** The setup-changed action announcing a settings change this runtime applied. */
9
+ export const SETTINGS_CHANGED_SETUP_ACTION = 'settings_changed';
10
+
11
+ // Provider credentials: `agent.<id>.apiKey` and a custom provider's extra keys
12
+ // `agent.<id>.apiKey.<keyId>` (custom-provider-keys.mjs).
13
+ // A deletion (config.mjs `#deleted`) may remove a secret the marker never
14
+ // listed (stored before it existed), so it counts for providers and MCP alike.
15
+ const PROVIDER_SECRET_ACCOUNT = /^(agent\.[^.]+\.apiKey(\.|$)|#deleted$)/;
16
+ // What an MCP connection depends on beside its config: OAuth sign-ins and
17
+ // client secrets, Gmail app passwords, and the plugin registry (plugin
18
+ // servers). Token refreshes are not announced (oauth-credentials.mjs).
19
+ const MCP_STATE_ACCOUNT = /^(mcp-oauth\.|mcp-oauth-client\.|gmail-app-password\.|#plugins$|#deleted$)/;
20
+
21
+ // Secret values are compared through their change tokens, never by value.
22
+ function tokensSignature(tokens, filter = () => true) {
23
+ const entries = Object.entries(tokens && typeof tokens === 'object' ? tokens : {});
24
+ return JSON.stringify(entries.filter(([account]) => filter(account)).sort(([a], [b]) => a.localeCompare(b)));
25
+ }
26
+
27
+ /** What a runtime last applied: the persisted root (the desktop section has
28
+ * its own owners), the applied secret change tokens and the effective MCP
29
+ * servers. Provider and settings changes are judged on the stored state, not
30
+ * the effective provider entries: those depend on whether a load read secrets
31
+ * and ran credential probes (boot loads without), so the boot config is an
32
+ * exact first baseline. MCP servers load the same either way. */
33
+ export function configChangeSnapshot({ config, root, secretTokens }) {
34
+ const { desktop: _desktop, ...settingsRoot } = root && typeof root === 'object' ? root : {};
35
+ const agents = config?.agents && typeof config.agents === 'object' ? config.agents : {};
36
+ return {
37
+ providers: JSON.stringify([
38
+ settingsRoot.agent?.providers ?? null,
39
+ // Developer provider options (e.g. cursorOAuth) shape provider clients.
40
+ config?.developer ?? null,
41
+ tokensSignature(secretTokens, (account) => PROVIDER_SECRET_ACCOUNT.test(account)),
42
+ ]),
43
+ cacheWarming: config?.promptCacheWarming === true,
44
+ autoClear: JSON.stringify(config?.autoClear ?? null),
45
+ agentRoutes: Object.fromEntries(Object.entries(agents).map(([id, route]) => [id, JSON.stringify(route ?? null)])),
46
+ mcp: JSON.stringify([
47
+ config?.mcpServers ?? null,
48
+ config?.pluginMcp ?? null,
49
+ tokensSignature(secretTokens, (account) => MCP_STATE_ACCOUNT.test(account)),
50
+ ]),
51
+ settings: JSON.stringify([settingsRoot, tokensSignature(secretTokens)]),
52
+ };
53
+ }
54
+
55
+ export function diffConfigSnapshots(before, after) {
56
+ const routes = new Set([...Object.keys(before.agentRoutes || {}), ...Object.keys(after.agentRoutes || {})]);
57
+ return {
58
+ providers: before.providers !== after.providers,
59
+ mcp: before.mcp !== after.mcp,
60
+ settings: before.settings !== after.settings,
61
+ // The new value when it changed, else null.
62
+ cacheWarming: before.cacheWarming !== after.cacheWarming ? after.cacheWarming : null,
63
+ autoClear: before.autoClear !== after.autoClear,
64
+ // Bots whose stored route was set, changed or cleared.
65
+ agentRoutes: [...routes].filter((id) => before.agentRoutes?.[id] !== after.agentRoutes?.[id]).sort(),
66
+ };
67
+ }
68
+
69
+ /** Whether a diff found nothing changed. */
70
+ export function configChangeIsEmpty(change) {
71
+ return (
72
+ !change.providers &&
73
+ !change.mcp &&
74
+ !change.settings &&
75
+ change.cacheWarming === null &&
76
+ !change.autoClear &&
77
+ !change.agentRoutes.length
78
+ );
79
+ }
80
+
81
+ // A domain whose effect failed: it differs from every snapshot value, so the
82
+ // next diff carries the domain again and its effect is retried.
83
+ const PENDING = Symbol('pending');
84
+
85
+ /** The effect domains a diff carries (`agentRoutes:<id>` per bot). */
86
+ export function configChangeDomains(change) {
87
+ return [
88
+ ...['providers', 'mcp', 'autoClear', 'settings'].filter((domain) => change[domain]),
89
+ ...(change.cacheWarming !== null && change.cacheWarming !== undefined ? ['cacheWarming'] : []),
90
+ ...(change.agentRoutes || []).map((id) => `agentRoutes:${id}`),
91
+ ];
92
+ }
93
+
94
+ /** `snapshot` with `domain` marked not applied. */
95
+ export function withConfigDomainPending(snapshot, domain) {
96
+ if (domain.startsWith('agentRoutes:')) {
97
+ const id = domain.slice('agentRoutes:'.length);
98
+ return { ...snapshot, agentRoutes: { ...snapshot.agentRoutes, [id]: PENDING } };
99
+ }
100
+ return { ...snapshot, [domain]: PENDING };
101
+ }
102
+
103
+ /** The effects themselves, keyed by the diff. `change` may be all-false (a
104
+ * rewrite of identical content): only the always-on invalidation runs.
105
+ * `config` is the reloaded effective config the diff was taken against.
106
+ * Answers a promise of the domains whose effect failed. One domain's effects
107
+ * never overlap: a later one starts once the earlier settled (it runs at
108
+ * once when none is in flight), so the latest change is applied last. */
109
+ export function createConfigChangeEffects({
110
+ invalidateContextStatusCache,
111
+ reinitProviders,
112
+ releaseAdmissionCooldowns,
113
+ reconcileMcp,
114
+ announceSettingsChange,
115
+ noteCacheWarmingEnabled = () => {},
116
+ refreshLiveSessionsCacheOpts = () => {},
117
+ publishAgentRoute = () => {},
118
+ }) {
119
+ const inFlight = new Map();
120
+ // domain → the failure last warned about: a retry failing the same way is
121
+ // not warned about again until the domain recovers.
122
+ const warned = new Map();
123
+ function run(domain, effect) {
124
+ const attempt = () => {
125
+ try {
126
+ return Promise.resolve(effect()).then(
127
+ () => {
128
+ warned.delete(domain);
129
+ return null;
130
+ },
131
+ (error) => failed(domain, error)
132
+ );
133
+ } catch (error) {
134
+ return Promise.resolve(failed(domain, error));
135
+ }
136
+ };
137
+ const prior = inFlight.get(domain);
138
+ const done = prior ? prior.then(attempt) : attempt();
139
+ inFlight.set(domain, done);
140
+ void done.then(() => {
141
+ if (inFlight.get(domain) === done) inFlight.delete(domain);
142
+ });
143
+ return done;
144
+ }
145
+ function failed(domain, error) {
146
+ const message = error?.message || String(error);
147
+ if (warned.get(domain) !== message) {
148
+ warned.set(domain, message);
149
+ console.warn(`[config] applying the ${domain} change failed: ${message}`);
150
+ }
151
+ return domain;
152
+ }
153
+
154
+ return function applyConfigChangeEffects(change, config) {
155
+ invalidateContextStatusCache();
156
+ const runs = [];
157
+ if (change.providers) {
158
+ // Cooldowns and initialized clients belong to the old credentials.
159
+ runs.push(
160
+ run('providers', () => {
161
+ releaseAdmissionCooldowns();
162
+ return reinitProviders();
163
+ })
164
+ );
165
+ }
166
+ if (change.mcp) runs.push(run('mcp', reconcileMcp));
167
+ // Every session of this process warms (or stops warming, armed chains
168
+ // included) as the setting now says.
169
+ if (change.cacheWarming !== null && change.cacheWarming !== undefined) {
170
+ runs.push(run('cacheWarming', () => noteCacheWarmingEnabled(change.cacheWarming)));
171
+ }
172
+ // Live sessions take the new idle window as their cache lifetime.
173
+ if (change.autoClear) runs.push(run('autoClear', () => refreshLiveSessionsCacheOpts(config)));
174
+ // The bots' chats this process hosts move onto their new routes.
175
+ for (const id of change.agentRoutes || []) runs.push(run(`agentRoutes:${id}`, () => publishAgentRoute(id, config)));
176
+ if (change.settings) runs.push(run('settings', announceSettingsChange));
177
+ return Promise.all(runs).then((results) => results.filter(Boolean));
178
+ };
179
+ }
@@ -150,5 +150,6 @@ export function createConfigWriters({ cfgMod, sharedCfgMod }) {
150
150
  hasPendingConfigChanges: () => configWriter.hasPending(),
151
151
  pendingConfigChanges: () => pendingConfigChanges,
152
152
  pendingSkills: () => skillsWriter.getPending(),
153
+ pendingOutputStyle: () => outputStyleWriter.getPending(),
153
154
  };
154
155
  }