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
@@ -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
  }
@@ -18,7 +18,14 @@ import {
18
18
  withDefaultPresets,
19
19
  } from '../runtime/agent/orchestrator/config-presets.mjs';
20
20
  import { syncSessionCompaction } from './session-compaction-sync.mjs';
21
- import { createConfigWriters } from './config-lifecycle/config-writers.mjs';
21
+ import {
22
+ configChangeDomains,
23
+ configChangeIsEmpty,
24
+ configChangeSnapshot,
25
+ diffConfigSnapshots,
26
+ withConfigDomainPending,
27
+ } from './config-change-effects.mjs';
28
+ import { configWithOutputStyle, createConfigWriters } from './config-lifecycle/config-writers.mjs';
22
29
  import { createLeadRouteSync } from './config-lifecycle/lead-route-sync.mjs';
23
30
  import { createOutputStyleStatusCache } from './config-lifecycle/output-style-cache.mjs';
24
31
 
@@ -45,9 +52,19 @@ function seedChanges(config, changes) {
45
52
  .map((key) => ({ path: [key], value: structuredClone(config[key]), ifAbsent: true }));
46
53
  }
47
54
 
55
+ // The agent config load carries no root `outputStyle`; the stored root value
56
+ // is laid on it (absent: the default style applies).
57
+ function withStoredOutputStyle(config, storedOutputStyle) {
58
+ return typeof storedOutputStyle === 'string' && storedOutputStyle.trim()
59
+ ? { ...config, outputStyle: storedOutputStyle.trim() }
60
+ : config;
61
+ }
62
+
48
63
  // The config just read from disk with this runtime's still-pending edits laid
49
64
  // back on it (the config and skills writers hold the only copy of them).
50
- function withPendingEdits(loaded, writers) {
65
+ // The agent config load carries no root `outputStyle`: the stored root value
66
+ // (`storedOutputStyle`) is laid on it, and this runtime's pending pick wins.
67
+ function withPendingEdits(loaded, writers, storedOutputStyle) {
51
68
  let next = loaded;
52
69
  if (writers.hasPendingConfigChanges()) {
53
70
  // Preserve only our pending edits. Peer changes and fresh secret overlays
@@ -67,6 +84,9 @@ function withPendingEdits(loaded, writers) {
67
84
  if (pendingSkills !== null) {
68
85
  next = { ...next, skills: { ...(next.skills || {}), disabled: pendingSkills } };
69
86
  }
87
+ const pendingOutputStyle = writers.pendingOutputStyle();
88
+ if (pendingOutputStyle !== null) next = configWithOutputStyle(next, pendingOutputStyle);
89
+ else next = withStoredOutputStyle(next, storedOutputStyle);
70
90
  return next;
71
91
  }
72
92
 
@@ -85,6 +105,7 @@ function withPendingEdits(loaded, writers) {
85
105
  export function resolveInitialConfigState({
86
106
  initialConfig,
87
107
  loadConfig,
108
+ readStoredOutputStyle = null,
88
109
  resolveRoute,
89
110
  provider,
90
111
  model,
@@ -97,8 +118,12 @@ export function resolveInitialConfigState({
97
118
  selectedContextWindow,
98
119
  agentOwned = false,
99
120
  }) {
121
+ // An injected config is complete as given; a loaded one takes the stored
122
+ // root output style (`readStoredOutputStyle`) as every reload does.
100
123
  const config = withGrandfatheredBuiltins(
101
- initialConfig && typeof initialConfig === 'object' ? initialConfig : loadConfig()
124
+ initialConfig && typeof initialConfig === 'object'
125
+ ? initialConfig
126
+ : withStoredOutputStyle(loadConfig(), readStoredOutputStyle?.())
102
127
  );
103
128
  // A requested percent replaces a saved token window; requested tokens
104
129
  // replace both (resolveRouteContextState lets tokens win).
@@ -135,10 +160,12 @@ export function createConfigLifecycle({
135
160
  getConfigHasSecrets,
136
161
  setConfigHasSecrets,
137
162
  getRoute,
138
- // The live session follows the reloaded global compaction settings, unless
139
- // the runtime runs on an injected (headless) config.
163
+ // The live session follows the reloaded global compaction settings.
140
164
  getSession,
141
- fixedSessionCompaction = false,
165
+ // A headless caller injects a complete, deliberately isolated config: it
166
+ // never reloads from disk (no change subscription either), and its sessions
167
+ // keep the compaction they were created with.
168
+ injectedConfig = false,
142
169
  // Main route sync on reload (both optional: a lifecycle without them never syncs)
143
170
  setRouteState,
144
171
  resolveRoute,
@@ -153,9 +180,14 @@ export function createConfigLifecycle({
153
180
  clean,
154
181
  resolve,
155
182
  performanceNow = () => performance.now(),
156
- onConfigReloaded,
183
+ // The runtime's change-driven effects (config-change-effects.mjs), given the
184
+ // diff against the snapshot this runtime last applied.
185
+ onConfigChanged,
186
+ // The backoff of a failed effect's retries; the last delay repeats.
187
+ effectRetryDelaysMs = [1000, 4000, 15000, 60000],
157
188
  STANDALONE_DATA_DIR,
158
189
  }) {
190
+ let disposed = false;
159
191
  const outputStyleCache = createOutputStyleStatusCache({
160
192
  cfgMod,
161
193
  STANDALONE_DATA_DIR,
@@ -217,25 +249,125 @@ export function createConfigLifecycle({
217
249
  }
218
250
 
219
251
  // --- reload / ensure --------------------------------------------------------
220
- function reloadFullConfig() {
221
- // A pending debounced write holds the only copy of the latest change.
222
- // Flush it before re-reading from disk so loadConfig() observes (and the
223
- // subsequent adopt preserves) that change instead of reverting to a stale
224
- // on-disk snapshot.
252
+ const changeSnapshot = (config) =>
253
+ configChangeSnapshot({
254
+ config,
255
+ root: sharedCfgMod?.readConfig?.(),
256
+ secretTokens: sharedCfgMod?.secretChangeTokens?.(),
257
+ });
258
+ // What this runtime's effects last ran against, starting from the boot
259
+ // config (the snapshot does not depend on whether a load read secrets).
260
+ let appliedSnapshot = changeSnapshot(getConfig());
261
+ // The stored settings the current config object was taken from (never
262
+ // marked pending): the object is replaced only when they changed, so a
263
+ // retry of a failed effect alone keeps it.
264
+ let loadedSnapshot = appliedSnapshot;
265
+
266
+ // A pending debounced write holds the only copy of the latest change.
267
+ // Flush it before re-reading from disk so loadConfig() observes (and the
268
+ // subsequent adopt preserves) that change instead of reverting to a stale
269
+ // on-disk snapshot.
270
+ function loadFullConfig() {
225
271
  writers.flushConfigSave();
226
- const next = withPendingEdits(cfgMod.loadConfig(), writers);
272
+ if (injectedConfig) return null;
273
+ return withPendingEdits(cfgMod.loadConfig(), writers, sharedCfgMod?.readConfig?.()?.outputStyle);
274
+ }
275
+
276
+ function reloadFullConfig() {
277
+ return adoptFullConfig(loadFullConfig());
278
+ }
279
+
280
+ function adoptFullConfig(next) {
281
+ if (!next) return getConfig();
227
282
  const adopted = adoptConfig(next, { hasSecrets: true });
228
283
  configSaveBaseline = structuredClone(adopted);
229
284
  leadRoute.syncEmptyMainRoute(adopted);
230
- if (!fixedSessionCompaction) syncSessionCompaction(getSession?.(), adopted);
285
+ syncSessionCompaction(getSession?.(), adopted);
231
286
  return adopted;
232
287
  }
233
288
 
234
289
  function ensureFullConfig() {
235
- if (getConfigHasSecrets()) return getConfig();
290
+ if (injectedConfig || getConfigHasSecrets()) return getConfig();
236
291
  return reloadFullConfig();
237
292
  }
238
293
 
294
+ /** The change step: reload, then run the effects keyed by what differs from
295
+ * the last applied snapshot. A writer that runs it right after its own write
296
+ * has applied the change, so the notification that follows finds nothing.
297
+ * The config object is replaced only when the stored settings changed (a
298
+ * retry of a failed effect alone keeps it): consumers key turn-start
299
+ * reconciles on its identity. */
300
+ function applyConfigChange() {
301
+ // A load that throws changes nothing: pending domains stay pending.
302
+ const loaded = loadFullConfig();
303
+ // Every pending domain is in this step's diff, so it runs again here (and
304
+ // a scheduled retry is this step).
305
+ pendingDomains = new Set();
306
+ clearTimeout(retryTimer);
307
+ retryTimer = null;
308
+ outputStyleCache.invalidateOutputStyleStatusCache();
309
+ const next = changeSnapshot(loaded ?? getConfig());
310
+ const change = diffConfigSnapshots(appliedSnapshot, next);
311
+ appliedSnapshot = next;
312
+ const settingsChanged = !configChangeIsEmpty(diffConfigSnapshots(loadedSnapshot, next));
313
+ loadedSnapshot = next;
314
+ const config = settingsChanged ? adoptFullConfig(loaded) : getConfig();
315
+ let outcome;
316
+ try {
317
+ outcome = onConfigChanged?.(change, config);
318
+ } catch {
319
+ outcome = configChangeDomains(change);
320
+ }
321
+ void Promise.resolve(outcome).then(
322
+ (failedDomains) => settleConfigEffects(failedDomains),
323
+ () => settleConfigEffects(configChangeDomains(change))
324
+ );
325
+ return change;
326
+ }
327
+
328
+ // A domain whose effect failed is marked not applied, so the next change
329
+ // step (any notification, a writer's own step, or the retry below) runs it
330
+ // again; the applied snapshot otherwise advances as the step runs, which
331
+ // keeps a step overlapping an in-flight effect from repeating it. The retry
332
+ // backs off to the last delay and keeps going until the domain succeeds or
333
+ // the sync is disposed.
334
+ let pendingDomains = new Set();
335
+ let retryTimer = null;
336
+ let retryAttempt = 0;
337
+ function settleConfigEffects(failedDomains) {
338
+ for (const domain of Array.isArray(failedDomains) ? failedDomains : []) {
339
+ appliedSnapshot = withConfigDomainPending(appliedSnapshot, domain);
340
+ pendingDomains.add(domain);
341
+ }
342
+ if (!pendingDomains.size) {
343
+ retryAttempt = 0;
344
+ return;
345
+ }
346
+ if (retryTimer || disposed) return;
347
+ const delay = effectRetryDelaysMs[Math.min(retryAttempt, effectRetryDelaysMs.length - 1)];
348
+ retryTimer = setTimeout(() => {
349
+ retryTimer = null;
350
+ retryAttempt += 1;
351
+ try {
352
+ applyConfigChange();
353
+ } catch {
354
+ // The reload failed (e.g. a config mid-write): still pending, retry later.
355
+ settleConfigEffects([]);
356
+ }
357
+ }, delay);
358
+ retryTimer.unref?.();
359
+ }
360
+
361
+ // The output style this runtime selected but has not yet persisted wins over
362
+ // a status read from disk, so a concurrent write never shows the old style.
363
+ function getOutputStyleStatusCached(options) {
364
+ const status = outputStyleCache.getOutputStyleStatusCached(options);
365
+ const pending = writers.pendingOutputStyle();
366
+ if (pending === null || status?.configured === pending) return status;
367
+ const current = (status?.styles || []).find((style) => style.id === pending) || status?.current;
368
+ return { ...status, configured: pending, current };
369
+ }
370
+
239
371
  function ensureConfigForRouteProvider() {
240
372
  const config = getConfig();
241
373
  const providerId = clean(getRoute().provider);
@@ -246,19 +378,22 @@ export function createConfigLifecycle({
246
378
  return ensureFullConfig();
247
379
  }
248
380
 
249
- // Settings persisted by any other runtime (or process) reach this runtime's
250
- // in-memory config. reloadFullConfig keeps our own pending edits, and the
251
- // shared layer coalesces bursts into one pass per subscriber.
252
- const unsubscribeConfigChange = sharedCfgMod?.subscribeConfigChange?.(() => {
253
- reloadFullConfig();
254
- outputStyleCache.invalidateOutputStyleStatusCache();
255
- onConfigReloaded?.();
256
- });
381
+ // Settings and secrets persisted by this or any other runtime (or process)
382
+ // reach this runtime's config and effects. reloadFullConfig keeps our own
383
+ // pending edits, and the shared layer coalesces bursts into one pass per
384
+ // subscriber. An injected config never follows the disk.
385
+ const unsubscribeConfigChange = injectedConfig ? null : sharedCfgMod?.subscribeConfigChange?.(applyConfigChange);
257
386
 
258
387
  return {
259
- disposeConfigSync: () => unsubscribeConfigChange?.(),
388
+ disposeConfigSync: () => {
389
+ disposed = true;
390
+ clearTimeout(retryTimer);
391
+ retryTimer = null;
392
+ unsubscribeConfigChange?.();
393
+ },
260
394
  // output-style cache
261
395
  ...outputStyleCache,
396
+ getOutputStyleStatusCached,
262
397
  // adopt / save
263
398
  adoptConfig,
264
399
  saveConfigAndAdopt,
@@ -270,6 +405,7 @@ export function createConfigLifecycle({
270
405
  flushAllConfigSavesAsync: writers.flushAllConfigSavesAsync,
271
406
  // reload / ensure
272
407
  reloadFullConfig,
408
+ applyConfigChange,
273
409
  ensureFullConfig,
274
410
  displayConfig: () => getConfig(),
275
411
  ensureConfigForRouteProvider,
@@ -1,6 +1,6 @@
1
- // After the multi-account connector merge (connector-catalog.mjs
2
- // mergeConnectorAccountServers) `gmail-2`, `google-calendar-2`… are accounts of
3
- // one server, no longer servers. Every store of ours that keys a setting by
1
+ // After the connector merge (connector-catalog.mjs mergeConnectorAccountServers)
2
+ // `gmail-2`, `notion-2`, `postgres-2`… are accounts of their connector's one
3
+ // server, no longer servers. Every store of ours that keys a setting by
4
4
  // MCP server name must name the surviving server instead:
5
5
  // agents/<id>/agent.json, bots/<id>/agent.json connectors.off / connectors.tools
6
6
  // (a legacy allow list too)
@@ -11,14 +11,15 @@
11
11
  // name models, not servers.) Project and plugin hook files are the user's or
12
12
  // the plugin's own and are never rewritten here.
13
13
  //
14
- // Rule: the merged connector is OFF for an agent/project only when EVERY
15
- // merged server was off (the same rule as the merged server's `enabled`: one
16
- // working account keeps the connector usable). Per-tool permissions move to
17
- // the surviving name; where two merged servers disagree on a tool the MORE
18
- // PERMISSIVE permission wins, as "on beats off" does at server level. Entries
19
- // of a server that was off are dormant and are dropped when the connector
20
- // stays on, so they never become live. A setting that names no merged-away
21
- // server is never touched, which makes every run after the first a no-op.
14
+ // Rule: differences are ignored and the topmost server decides. The merged
15
+ // connector is on or off for an agent/project as the surviving server was
16
+ // there when the setting names it, else as the lowest-numbered merged server
17
+ // it names (so a switched-off `-N` server never becomes reachable through the
18
+ // merge). Per-tool permissions move to the surviving name; where merged
19
+ // servers disagree on a tool the surviving server's own entry wins, else the
20
+ // first merged server's. Entries of a server that was off are dormant and
21
+ // dropped when the connector stays on. A setting that names no merged-away
22
+ // server is never touched, so every run after the first is a no-op.
22
23
  //
23
24
  // The merge is saved to the config once, so the rename mapping outlives it:
24
25
  // `<data>/connector-merge-pending.json` ({ merged: [{ name, from }] }) is
@@ -35,7 +36,6 @@ import { readdirSync, readFileSync, rmSync } from 'node:fs';
35
36
  import { join } from 'node:path';
36
37
  import { normalizeRules, standardConfigReport } from './services/hook-bus/config.mjs';
37
38
  import {
38
- PERMISSION_RANK,
39
39
  PROJECT_CONNECTORS_FILE,
40
40
  connectorEnabled,
41
41
  parseConnectorPolicy,
@@ -56,7 +56,8 @@ function mapMergedConnectorPolicy(policy, merged) {
56
56
  current.off.includes(server) || current.allow?.includes(server) || Object.hasOwn(current.tools, server);
57
57
  if (!gone.some(named)) continue;
58
58
  const live = from.filter((server) => connectorEnabled(current, server));
59
- const on = live.length > 0;
59
+ // `from` lists the surviving server first, then the others lowest-numbered first.
60
+ const on = connectorEnabled(current, from.find(named));
60
61
  const off = current.off.filter((server) => !from.includes(server));
61
62
  const allow = current.allow?.filter((server) => !from.includes(server));
62
63
  if (allow && on) allow.push(name);
@@ -64,9 +65,11 @@ function mapMergedConnectorPolicy(policy, merged) {
64
65
  const tools = { ...current.tools };
65
66
  for (const server of from) delete tools[server];
66
67
  const moved = {};
67
- for (const server of on ? live : from) {
68
+ const sources = on ? live : from;
69
+ for (const server of [name, ...sources.filter((id) => id !== name)]) {
70
+ if (!sources.includes(server)) continue;
68
71
  for (const [tool, permission] of Object.entries(current.tools[server] || {})) {
69
- if (!(tool in moved) || PERMISSION_RANK[permission] > PERMISSION_RANK[moved[tool]]) moved[tool] = permission;
72
+ if (!(tool in moved)) moved[tool] = permission;
70
73
  }
71
74
  }
72
75
  if (Object.keys(moved).length) tools[name] = moved;