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
@@ -14,9 +14,11 @@ import { migrateMergedConnectorServers } from './connector-merge-migration.mjs';
14
14
  import {
15
15
  connectorAccountServers,
16
16
  connectorAccountsOf,
17
+ connectorAppPasswordOnly,
17
18
  connectorById,
18
- connectorMultiAccount,
19
+ connectorServerInput,
19
20
  gmailAppPasswordAccount,
21
+ gmailAppPasswordServerInput,
20
22
  mergeConnectorAccountServers,
21
23
  } from '../runtime/shared/connector-catalog.mjs';
22
24
  import { saveMcpOAuthClientSecret } from '../runtime/agent/orchestrator/mcp/oauth-client.mjs';
@@ -75,14 +77,24 @@ export function createMcpResourceApi({ deps, sync, decorate }) {
75
77
  resolveMcpCatalog,
76
78
  pluginMcpServer,
77
79
  });
78
- const { storeOAuthClientSecret, storeGmailAppPassword, releaseOAuth, forgetUnusedGmailAppPassword, releaseAccount } =
79
- createMcpServerSecrets({
80
- gmailAppPassword,
81
- saveOAuthClientSecret,
82
- clearMcpServerOAuth,
83
- resolveConfiguredMcpCatalog,
84
- });
85
- const { addConnectorAccount, saveConnectorAccount, setConnectorAccountEnabled } = createConnectorAccountEdits({
80
+ const {
81
+ storeOAuthClientSecret,
82
+ storeGmailAppPassword,
83
+ releaseOAuth,
84
+ forgetUnusedGmailAppPassword,
85
+ forgetStoredSecrets,
86
+ releaseAccount,
87
+ } = createMcpServerSecrets({
88
+ gmailAppPassword,
89
+ saveOAuthClientSecret,
90
+ clearMcpServerOAuth,
91
+ resolveConfiguredMcpCatalog,
92
+ });
93
+ const {
94
+ addConnectorAccount: joinConnectorAccount,
95
+ saveConnectorAccount,
96
+ setConnectorAccountEnabled,
97
+ } = createConnectorAccountEdits({
86
98
  normalizeMcpServerInput,
87
99
  pluginMcpServer,
88
100
  sync,
@@ -91,16 +103,65 @@ export function createMcpResourceApi({ deps, sync, decorate }) {
91
103
  storeOAuthClientSecret,
92
104
  storeGmailAppPassword,
93
105
  forgetUnusedGmailAppPassword,
106
+ forgetStoredSecrets,
94
107
  releaseOAuth,
95
108
  });
96
109
  // Peers reload config from disk on receipt: land the write before publishing.
97
110
  const persisted = async () => {
98
111
  await flushSkillsSave?.();
99
112
  };
113
+ // One account addition of a connector at a time, each reading the servers
114
+ // the one before it saved: two at once never take the same name, nor does
115
+ // one's save drop the other's account.
116
+ const connectorAdds = new Map();
117
+ const oneAddAtATime = (connector, run) => {
118
+ const next = (connectorAdds.get(connector) || Promise.resolve()).then(run, run);
119
+ const settled = next.then(
120
+ () => {},
121
+ () => {}
122
+ );
123
+ connectorAdds.set(connector, settled);
124
+ void settled.then(() => {
125
+ if (connectorAdds.get(connector) === settled) connectorAdds.delete(connector);
126
+ });
127
+ return next;
128
+ };
129
+
130
+ async function addMcpServer(input = {}) {
131
+ // A catalog connector's account (as its own server config) joins that
132
+ // connector's one server.
133
+ const connector = clean(input.connector);
134
+ if (connector && !Array.isArray(input.accounts)) return oneAddAtATime(connector, () => addServerNow(input));
135
+ return addServerNow(input);
136
+ }
137
+
138
+ async function addServerNow(input) {
139
+ const { name, config: serverConfig } = normalizeMcpServerInput(input);
140
+ // A catalog connector's server keeps its catalog id (connector-catalog.mjs).
141
+ const connector = clean(input.connector);
142
+ if (connector) {
143
+ if (!connectorById(connector)) throw new Error(`Unknown connector: ${connector}`);
144
+ serverConfig.connector = connector;
145
+ }
146
+ const servers = userServers();
147
+ if (connector && !Array.isArray(input.accounts)) {
148
+ return joinConnectorAccount(servers, connector, name, serverConfig, input);
149
+ }
150
+ if (Object.hasOwn(servers, name) || accountTarget(servers, name)) {
151
+ throw nameTakenError(servers, name);
152
+ }
153
+ const owned = pluginMcpServer(name);
154
+ if (owned) throw new Error(`MCP server already exists: ${name} (provided by plugin "${owned.owner.id}")`);
155
+ await storeOAuthClientSecret(input, serverConfig);
156
+ await storeGmailAppPassword(input, serverConfig, true);
157
+ saveServers({ ...servers, [name]: serverConfig });
158
+ const status = await sync.reconnectMcpAndAnnounce({ only: name, enabled: serverConfig.enabled !== false });
159
+ return { name, status };
160
+ }
100
161
 
101
162
  return {
102
- /** One-time, idempotent: merge the one-account servers of a multi-account
103
- * connector (`gmail`, `gmail-2`…) into one server holding the accounts
163
+ /** One-time, idempotent: merge the one-account servers of a catalog
164
+ * connector (`notion`, `notion-2`…) into one server holding the accounts
104
165
  * (connector-catalog.mjs mergeConnectorAccountServers). Every account
105
166
  * keeps its address, so its stored sign-in and app password stay as
106
167
  * they are. Settings keyed by a merged-away server name go with it:
@@ -155,30 +216,32 @@ export function createMcpResourceApi({ deps, sync, decorate }) {
155
216
  },
156
217
  // Sign-in / sign-out (resource-mcp-oauth-api.mjs), in this key position.
157
218
  ...oauthApi,
158
- async addMcpServer(input = {}) {
159
- const { name, config: serverConfig } = normalizeMcpServerInput(input);
160
- // A catalog connector's server keeps its catalog id (connector-catalog.mjs).
161
- const connector = clean(input.connector);
162
- if (connector) {
163
- if (!connectorById(connector)) throw new Error(`Unknown connector: ${connector}`);
164
- serverConfig.connector = connector;
165
- }
166
- const servers = userServers();
167
- // A multi-account connector's account (as its own server config) joins
168
- // that connector's one server.
169
- if (connector && connectorMultiAccount(connectorById(connector)) && !Array.isArray(input.accounts)) {
170
- return addConnectorAccount(servers, connector, name, serverConfig, input);
171
- }
172
- if (Object.hasOwn(servers, name) || accountTarget(servers, name)) {
173
- throw nameTakenError(servers, name);
174
- }
175
- const owned = pluginMcpServer(name);
176
- if (owned) throw new Error(`MCP server already exists: ${name} (provided by plugin "${owned.owner.id}")`);
177
- await storeOAuthClientSecret(input, serverConfig);
178
- await storeGmailAppPassword(input, serverConfig, true);
179
- saveServers({ ...servers, [name]: serverConfig });
180
- const status = await sync.reconnectMcpAndAnnounce({ only: name, enabled: serverConfig.enabled !== false });
181
- return { name, status };
219
+ addMcpServer,
220
+ /** One more account of catalog connector `input.connector`, connected as
221
+ * its catalog entry says: `key` for an API-key service (Hugging Face,
222
+ * Stripe; Postgres takes its connection string), `email` and
223
+ * `appPassword` for Gmail, nothing more for a sign-in service (the
224
+ * account then signs in with beginMcpOAuthLogin(account)); the user's own
225
+ * OAuth client rides on `oauthClientId` / `oauthClientSecret`. The account
226
+ * gets a free name (`notion`, `notion-2`…) and joins the connector's one
227
+ * server, which is made when there is none. Resolves `{ name, account,
228
+ * status }`: the server's name and the new account's (for a Gmail
229
+ * address already connected, that account, which took the new password). */
230
+ async addConnectorAccount(input = {}) {
231
+ const entry = connectorById(clean(input.connector));
232
+ if (!entry) throw new Error(`Unknown connector: ${clean(input.connector)}`);
233
+ // Its name is picked from the servers the additions before it saved.
234
+ return oneAddAtATime(entry.id, () => {
235
+ const name = freeName(userServers(), entry.id);
236
+ const account = connectorAppPasswordOnly(entry)
237
+ ? gmailAppPasswordServerInput(name, input.email, input.appPassword)
238
+ : connectorServerInput(entry, name, input.key);
239
+ const ownClient = clean(input.oauthClientId);
240
+ return addServerNow({
241
+ ...account,
242
+ ...(ownClient ? { oauthClientId: ownClient, oauthClientSecret: input.oauthClientSecret } : {}),
243
+ });
244
+ });
182
245
  },
183
246
  async saveMcpServer(input = {}) {
184
247
  const servers = userServers();
@@ -1,6 +1,7 @@
1
- // The accounts of a multi-account connector server as the MCP server API
2
- // edits them: adding one more account (into its server, or a new server
3
- // holding it) and editing one account's transport, app password or client.
1
+ // The accounts of a connector server as the MCP server API edits them: adding
2
+ // one more account (into its server, or a new server holding it) and editing
3
+ // one account's transport, app password or client.
4
+ import { randomUUID } from 'node:crypto';
4
5
  import { clean } from '../runtime/agent/orchestrator/runtime-core/session-text.mjs';
5
6
  import {
6
7
  mergeMcpServerConfig,
@@ -13,15 +14,16 @@ import {
13
14
  connectorAccountServers,
14
15
  connectorAccountsOf,
15
16
  connectorAccountsUrl,
16
- connectorById,
17
17
  connectorOfServer,
18
+ connectorServerSettings,
18
19
  gmailAppPasswordAccount,
19
20
  withConnectorAccountEnabled,
20
21
  } from '../runtime/shared/connector-catalog.mjs';
21
22
  import { forgetConnectorAccountHealth } from '../runtime/connectors/connector-accounts-mcp.mjs';
22
- import { accountTarget, mergedServerInput, nameTakenError, oauthUrlOf } from './resource-mcp-servers.mjs';
23
+ import { hasConfiguredMcpAuth } from '../runtime/agent/orchestrator/mcp/client-transport.mjs';
24
+ import { accountTarget, mergedServerInput, nameTakenError, oauthCredentialOf } from './resource-mcp-servers.mjs';
23
25
 
24
- /** The server of multi-account connector `connector` in `servers`, or ''. */
26
+ /** The server of connector `connector` in `servers`, or ''. */
25
27
  function connectorServerName(servers, connector) {
26
28
  return (
27
29
  Object.keys(servers).find(
@@ -36,7 +38,7 @@ function connectorServerName(servers, connector) {
36
38
  export const editsServerItself = (target, input) => {
37
39
  if (target.serverName !== target.account.name || !clean(input.url)) return false;
38
40
  try {
39
- return oauthUrlOf({ type: input.type || 'http', url: input.url }) === oauthUrlOf(target.cfg);
41
+ return oauthCredentialOf({ type: input.type || 'http', url: input.url }) === oauthCredentialOf(target.cfg);
40
42
  } catch {
41
43
  return false;
42
44
  }
@@ -51,12 +53,14 @@ export function createConnectorAccountEdits({
51
53
  storeOAuthClientSecret,
52
54
  storeGmailAppPassword,
53
55
  forgetUnusedGmailAppPassword,
56
+ forgetStoredSecrets,
54
57
  releaseOAuth,
55
58
  }) {
56
- /** One more account of multi-account connector `connector` (one-account
57
- * config `accountCfg` as normalized from `input`): into its server, or a
58
- * new server named `name` holding it. The same Gmail address again takes
59
- * the new app password. Resolves `{ name, account, status }`. */
59
+ /** One more account of connector `connector` (one-account config
60
+ * `accountCfg` as normalized from `input`): into its server, or a new
61
+ * server named `name` holding it. The same Gmail address again takes the
62
+ * new app password. `servers` is read under the caller's per-connector
63
+ * serialization (resource-mcp-api.mjs). Resolves `{ name, account, status }`. */
60
64
  async function addConnectorAccount(servers, connector, name, accountCfg, input) {
61
65
  const serverName = connectorServerName(servers, connector);
62
66
  const address = gmailAppPasswordAccount(accountCfg);
@@ -76,30 +80,41 @@ export function createConnectorAccountEdits({
76
80
  throw nameTakenError(servers, name);
77
81
  }
78
82
  const accountName = serverName ? freeName(servers, name) : name;
79
- const account = connectorAccountEntry(accountName, accountCfg);
80
- // Sign-in tokens are stored per exact URL: another account needs its own.
81
- const backendUrl = connectorById(connector)?.backend?.url;
82
- if (
83
- !address &&
84
- cfg &&
85
- connectorAccountServers(cfg).some((other) => oauthUrlOf(other) === oauthUrlOf({ type: 'http', url: account.url }))
86
- ) {
87
- account.url = `${backendUrl}?account=${encodeURIComponent(accountName)}`;
83
+ // A fresh identity: a conversation that used a removed account of this
84
+ // name never takes this one for it (connector-accounts-mcp.mjs).
85
+ const account = { ...connectorAccountEntry(accountName, accountCfg), id: randomUUID() };
86
+ // A sign-in is stored per exact URL: another account signing in at the
87
+ // same URL gets its own key, so the two never share tokens.
88
+ const asServer = connectorAccountServer({ connector }, account);
89
+ const signIn = hasConfiguredMcpAuth(asServer) ? null : oauthCredentialOf(asServer);
90
+ if (signIn && cfg && connectorAccountServers(cfg).some((other) => oauthCredentialOf(other) === signIn)) {
91
+ account.oauthKey = randomUUID();
88
92
  }
89
93
  const storedCfg = connectorAccountServer({ connector }, account);
90
- await storeOAuthClientSecret(input, storedCfg);
91
- await storeGmailAppPassword(input, storedCfg, true);
92
- forgetConnectorAccountHealth(accountName);
93
94
  let target = serverName;
94
- if (cfg) {
95
- servers[serverName] = { ...cfg, accounts: [...connectorAccountsOf(cfg), account] };
96
- } else {
97
- // The server's own settings (timeouts, enabled) ride on the input.
98
- const { type: _type, url: _url, headers: _headers, oauthClientId: _client, ...rest } = accountCfg;
99
- target = name;
100
- servers[name] = { ...rest, type: 'http', url: connectorAccountsUrl(connector), connector, accounts: [account] };
95
+ // Its secrets and its config land together: a failed step takes back the secrets.
96
+ try {
97
+ await storeOAuthClientSecret(input, storedCfg);
98
+ await storeGmailAppPassword(input, storedCfg, true);
99
+ if (cfg) {
100
+ servers[serverName] = { ...cfg, accounts: [...connectorAccountsOf(cfg), account] };
101
+ } else {
102
+ // The server's own settings (timeouts, enabled) ride on the input.
103
+ target = name;
104
+ servers[name] = {
105
+ ...connectorServerSettings(accountCfg),
106
+ type: 'http',
107
+ url: connectorAccountsUrl(connector),
108
+ connector,
109
+ accounts: [account],
110
+ };
111
+ }
112
+ saveServers(servers);
113
+ } catch (error) {
114
+ await forgetStoredSecrets(storedCfg);
115
+ throw error;
101
116
  }
102
- saveServers(servers);
117
+ forgetConnectorAccountHealth(accountName);
103
118
  const status = await sync.reconnectMcpAndAnnounce({ only: target, enabled: servers[target].enabled !== false });
104
119
  return { name: target, account: accountName, status };
105
120
  }
@@ -116,7 +131,7 @@ export function createConnectorAccountEdits({
116
131
  await storeOAuthClientSecret(input, next, accountCfg);
117
132
  await storeGmailAppPassword(input, next, false);
118
133
  // Settings that are not the account's transport (timeouts) are the server's.
119
- const { type: _type, url: _url, headers: _headers, oauthClientId: _client, ...serverFields } = config;
134
+ const serverFields = connectorServerSettings(config);
120
135
  const server = { ...cfg };
121
136
  for (const group of MCP_TIMEOUT_FIELD_GROUPS) {
122
137
  if (group.some((field) => Object.hasOwn(serverFields, field))) for (const field of group) delete server[field];
@@ -128,6 +143,8 @@ export function createConnectorAccountEdits({
128
143
  entry.name === account.name
129
144
  ? {
130
145
  ...connectorAccountEntry(account.name, next),
146
+ // An edit keeps the account's identity.
147
+ ...(entry.id ? { id: entry.id } : {}),
131
148
  ...(connectorAccountEnabled(entry) ? {} : { enabled: false }),
132
149
  }
133
150
  : entry
@@ -7,7 +7,7 @@ import {
7
7
  connectorAccountServers,
8
8
  } from '../runtime/shared/connector-catalog.mjs';
9
9
  import { forgetConnectorAccountHealth } from '../runtime/connectors/connector-accounts-mcp.mjs';
10
- import { oauthUrlOf } from './resource-mcp-servers.mjs';
10
+ import { oauthCredentialOf } from './resource-mcp-servers.mjs';
11
11
 
12
12
  /** Every config `servers` connects with, a multi-account server's accounts
13
13
  * as the one-account configs they are. */
@@ -44,15 +44,16 @@ export function createMcpServerSecrets({
44
44
  }
45
45
  };
46
46
  // A server's OAuth tokens and client registration go with it, unless another
47
- // configured server (plugin or disabled ones included, even with MCP
48
- // disabled for this runtime) still uses them through the same exact URL.
49
- // `signIn` tells the caller what happened to the sign-in: `removed` (local
50
- // secrets deleted, `revoked` when the provider confirmed the revocation
51
- // too), `shared` (another server still uses it), or none (null).
47
+ // configured server or account (plugin or disabled ones included, even with
48
+ // MCP disabled for this runtime) still uses them through the same exact URL
49
+ // (or the same account key). `signIn` tells the caller what happened to the
50
+ // sign-in: `removed` (local secrets deleted, `revoked` when the provider
51
+ // confirmed the revocation too), `shared` (another server still uses it),
52
+ // or none (null).
52
53
  const releaseOAuth = async (cfg) => {
53
- const url = oauthUrlOf(cfg);
54
- if (!url) return null;
55
- if (expandedConfigs(resolveConfiguredMcpCatalog().servers).some((other) => oauthUrlOf(other) === url)) {
54
+ const key = oauthCredentialOf(cfg);
55
+ if (!key) return null;
56
+ if (expandedConfigs(resolveConfiguredMcpCatalog().servers).some((other) => oauthCredentialOf(other) === key)) {
56
57
  return { signIn: 'shared', revoked: false };
57
58
  }
58
59
  const { revoked = false } = (await clearMcpServerOAuth(cfg, { revoke: true })) || {};
@@ -66,6 +67,15 @@ export function createMcpServerSecrets({
66
67
  await gmailAppPassword.forget(account);
67
68
  return true;
68
69
  };
70
+ // What storeOAuthClientSecret / storeGmailAppPassword stored for `cfg`, gone
71
+ // again unless a configured server uses it (an add that was not saved).
72
+ const forgetStoredSecrets = async (cfg) => {
73
+ await forgetUnusedGmailAppPassword(gmailAppPasswordAccount(cfg));
74
+ if (!cfg?.url || !cfg.oauthClientId) return;
75
+ const servers = expandedConfigs(resolveConfiguredMcpCatalog().servers);
76
+ if (!servers.some((other) => other.url === cfg.url && other.oauthClientId))
77
+ await saveOAuthClientSecret(cfg.url, '');
78
+ };
69
79
  // A removed account keeps no sign-in another configured server or account
70
80
  // does not share: `{ signIn, revoked }` as removeMcpServer reports it.
71
81
  const releaseAccount = async (accountCfg) => {
@@ -78,5 +88,12 @@ export function createMcpServerSecrets({
78
88
  return releaseOAuth(accountCfg);
79
89
  };
80
90
 
81
- return { storeOAuthClientSecret, storeGmailAppPassword, releaseOAuth, forgetUnusedGmailAppPassword, releaseAccount };
91
+ return {
92
+ storeOAuthClientSecret,
93
+ storeGmailAppPassword,
94
+ releaseOAuth,
95
+ forgetUnusedGmailAppPassword,
96
+ forgetStoredSecrets,
97
+ releaseAccount,
98
+ };
82
99
  }
@@ -3,7 +3,7 @@
3
3
  // name refusals and the merge of a partial server edit.
4
4
  import { clean } from '../runtime/agent/orchestrator/runtime-core/session-text.mjs';
5
5
  import { MCP_TIMEOUT_FIELD_GROUPS } from '../runtime/agent/orchestrator/runtime-core/plugin-mcp.mjs';
6
- import { resolveMcpOAuthUrl } from '../runtime/agent/orchestrator/mcp/client-config.mjs';
6
+ import { resolveMcpOAuthCredentialKey } from '../runtime/agent/orchestrator/mcp/client-config.mjs';
7
7
  import {
8
8
  connectorAccountServer,
9
9
  connectorAccountsOf,
@@ -11,10 +11,11 @@ import {
11
11
  connectorOfServer,
12
12
  } from '../runtime/shared/connector-catalog.mjs';
13
13
 
14
- /** The URL a server's OAuth credentials are stored under, or null. */
15
- export function oauthUrlOf(cfg) {
14
+ /** What a server's OAuth credentials are stored under (its URL, or a
15
+ * connector account's own key), or null. */
16
+ export function oauthCredentialOf(cfg) {
16
17
  try {
17
- return resolveMcpOAuthUrl(cfg);
18
+ return resolveMcpOAuthCredentialKey(cfg);
18
19
  } catch {
19
20
  // No valid remote URL: such a server never logged in.
20
21
  return null;
@@ -29,6 +29,7 @@ export function createPluginsResourceApi({ deps, sync, decorate }) {
29
29
  pluginsStatus,
30
30
  resolveMcpCatalog = () => ({ adoption: null }),
31
31
  flushSkillsSave,
32
+ invalidateSkills,
32
33
  } = deps;
33
34
  const pluginData = () => cfgMod.getPluginData?.();
34
35
 
@@ -59,6 +60,9 @@ export function createPluginsResourceApi({ deps, sync, decorate }) {
59
60
  return { plugin, status: pluginsStatus() };
60
61
  },
61
62
  async updatePlugin(plugin = {}) {
63
+ // Windows refuses to rename a directory holding an open recursive
64
+ // skill watch, so drop the watchers before the root is swapped.
65
+ invalidateSkills?.();
62
66
  const updated = registryUpdatePlugin(pluginKey(plugin), { dataDir: pluginData() });
63
67
  await adoptPluginServerCopies();
64
68
  await sync.reconcilePluginsAndAnnounce();
@@ -0,0 +1,152 @@
1
+ /**
2
+ * A routine (schedule or webhook) may name an executor: a workflow sub-agent
3
+ * (Worker, …) on its own configured route. Each fire is then carried out by
4
+ * that sub-agent first, headless and to its end, and only its final report
5
+ * goes to the owner bot's home thread, which relays it (routine-home-turn.mjs).
6
+ * No executor = the bot does the work itself, as before.
7
+ *
8
+ * The executor is a delegatable workflow agent: never a bot (contact agent) or
9
+ * Mixy, never one that is unknown or turned off — refused when the routine is
10
+ * saved (assertRoutineExecutor) and again when it fires (a sub-agent that
11
+ * disappeared or was turned off since fails the fire; nothing falls back).
12
+ *
13
+ * The run is unattended like the bot's own routine turn: it is created under a
14
+ * session id marked as that routine's run (held-requests.mjs markUnattendedRun)
15
+ * so the sub-agent's record carries the run stamp (human-gate/delegation.mjs):
16
+ * it never asks, payments and permanent deletes are refused
17
+ * (human-gate/run-policy.mjs). A sub-agent session has no `agent`, `session`
18
+ * or `ask_user` tool (AGENT_WORKER_DENIED_TOOLS), so it can start no task
19
+ * session and ask nobody.
20
+ */
21
+ import { randomUUID } from 'node:crypto';
22
+ import { MIXY_AGENT_ID } from '../runtime/agent/orchestrator/session/agent-home.mjs';
23
+ import {
24
+ BUILTIN_SLOT_AGENT_IDS,
25
+ normalizeWorkflowId,
26
+ } from '../runtime/agent/orchestrator/runtime-core/workflow-ids.mjs';
27
+ import { storeInlineDocumentPart, storeInlineImagePart } from '../runtime/attachments/store.mjs';
28
+ import { MIXY_BOT_ID } from '../runtime/shared/agent-store.mjs';
29
+ import { automationPromptContent } from '../runtime/shared/automation-attachments.mjs';
30
+ import { routineExecutorHeader } from '../runtime/shared/routine-trigger.mjs';
31
+ import { scheduleOwnerAgentId } from './agent-home-delivery.mjs';
32
+ import { markUnattendedRun } from './held-requests.mjs';
33
+
34
+ /** `routineExecutorProblem` codes and the error each one raises. */
35
+ export const ROUTINE_EXECUTOR_PROBLEMS = Object.freeze({
36
+ unknown: (id) => `executor agent "${id}" is not an available sub-agent: pick one from the workflow agents`,
37
+ 'not-agent': (id) =>
38
+ `executor agent "${id}" is a bot, not a workflow sub-agent: pick a sub-agent such as Worker, or leave it unset`,
39
+ disabled: (id) => `executor agent "${id}" is turned off: turn it on in the workflow agents or pick another`,
40
+ });
41
+
42
+ /** The stored form of an executor id: lower-cased with dashes; null for none. */
43
+ export function normalizeExecutorAgentId(value) {
44
+ const text = typeof value === 'string' ? value.trim() : '';
45
+ return text ? normalizeWorkflowId(text, text.toLowerCase()) : null;
46
+ }
47
+
48
+ async function defaultProbe(id) {
49
+ const [{ workflowHelpers }, { getPluginData, loadConfig }, { isAgentDisabled, isContactAgentId }] = await Promise.all(
50
+ [
51
+ import('./boot/shared.mjs'),
52
+ import('../runtime/agent/orchestrator/config.mjs'),
53
+ import('../runtime/shared/agent-route-config.mjs'),
54
+ ]
55
+ );
56
+ const dataDir = getPluginData();
57
+ // The fresh scan: an agent made a moment ago counts.
58
+ const listed = workflowHelpers.listCustomAgentIds(dataDir).includes(id) && !BUILTIN_SLOT_AGENT_IDS.has(id);
59
+ const definition = listed ? workflowHelpers.loadAgentDefinition(dataDir, id) : null;
60
+ return {
61
+ listed: Boolean(definition),
62
+ contact: Boolean(definition) && isContactAgentId(id, definition.kind),
63
+ disabled: isAgentDisabled(loadConfig({ secrets: false }), id),
64
+ };
65
+ }
66
+
67
+ /** Why `id` (normalized) cannot execute a routine: a ROUTINE_EXECUTOR_PROBLEMS
68
+ * code, '' when it can. `probe(id)` → `{ listed, contact, disabled }`. */
69
+ export async function routineExecutorProblem(id, probe = defaultProbe) {
70
+ if (id === MIXY_AGENT_ID || id === MIXY_BOT_ID) return 'not-agent';
71
+ const facts = await probe(id);
72
+ if (!facts.listed) return 'unknown';
73
+ if (facts.contact) return 'not-agent';
74
+ return facts.disabled ? 'disabled' : '';
75
+ }
76
+
77
+ /** The executor id to store for a save's `executorAgentId` (null/empty = none),
78
+ * or the error naming why it cannot be one. */
79
+ export async function assertRoutineExecutor(value, probe = defaultProbe) {
80
+ if (value == null) return null;
81
+ if (typeof value !== 'string') throw new Error('executorAgentId must be a sub-agent id (a string) or null');
82
+ const id = normalizeExecutorAgentId(value);
83
+ if (!id) return null;
84
+ const problem = await routineExecutorProblem(id, probe);
85
+ if (problem) throw new Error(ROUTINE_EXECUTOR_PROBLEMS[problem](id));
86
+ return id;
87
+ }
88
+
89
+ /** An inline image/PDF/Office part as the stored reference part a sub-agent's
90
+ * prompt may carry (handoff-attachments.mjs admits references only). */
91
+ const referencePart = (part) => (part.type === 'image' ? storeInlineImagePart(part) : storeInlineDocumentPart(part));
92
+
93
+ /**
94
+ * Carry out one fire of routine `name` with sub-agent `agentId` and resolve its
95
+ * final report (trimmed text). `prompt` is the routine's instructions (plus a
96
+ * webhook's fenced payload); `ownerAgentId` the bot whose run it is. Rejects
97
+ * when the executor is no longer valid, fails, is cancelled, or `signal` aborts.
98
+ */
99
+ export async function runRoutineExecutor(
100
+ {
101
+ agentId,
102
+ kind,
103
+ name,
104
+ ownerAgentId = null,
105
+ prompt,
106
+ // The trusted part of `prompt` (the routine's instructions): the only text
107
+ // the executor's skills are selected from, never a webhook payload.
108
+ skillSelection = '',
109
+ attachments = null,
110
+ cwd = null,
111
+ signal = null,
112
+ },
113
+ { surface, probe = defaultProbe } = {}
114
+ ) {
115
+ const problem = await routineExecutorProblem(agentId, probe);
116
+ if (problem) throw new Error(`${kind} "${name}" cannot run: ${ROUTINE_EXECUTOR_PROBLEMS[problem](agentId)}`);
117
+ if (typeof surface?.runAgent !== 'function') throw new Error('routine run: the agent service is not running');
118
+ const header = routineExecutorHeader({ kind, name, project: cwd ? String(cwd) : '' });
119
+ const content = automationPromptContent(`${header}\n\n${prompt}`, attachments);
120
+ const parts = Array.isArray(content) ? content : [{ type: 'text', text: content }];
121
+ const attachmentParts = parts.slice(1).map(referencePart).filter(Boolean);
122
+ // The id the executor is created under: marked as this routine's unattended
123
+ // run for as long as it works (its record keeps the run stamp afterwards).
124
+ const parentSessionId = `routine_exec_${randomUUID()}`;
125
+ const unmark = markUnattendedRun(parentSessionId, {
126
+ kind,
127
+ agentId: scheduleOwnerAgentId({ ownerAgentId }),
128
+ name,
129
+ });
130
+ try {
131
+ const result = await surface.runAgent(
132
+ {
133
+ agent: agentId,
134
+ prompt: parts[0].text,
135
+ skillSelection: String(skillSelection ?? ''),
136
+ ...(cwd ? { cwd: String(cwd) } : {}),
137
+ ...(attachmentParts.length ? { attachmentParts } : {}),
138
+ },
139
+ { callerSessionId: parentSessionId },
140
+ { signal }
141
+ );
142
+ return String(result?.content ?? '').trim();
143
+ } catch (error) {
144
+ // The caller's own cancellation stays as it is.
145
+ if (signal?.aborted) throw error;
146
+ throw new Error(`${kind} "${name}": executor agent "${agentId}" failed: ${error?.message || error}`, {
147
+ cause: error,
148
+ });
149
+ } finally {
150
+ unmark();
151
+ }
152
+ }