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
@@ -1,8 +1,10 @@
1
1
  // Deferred-tool catalog: measured-usage ordering, kind/bucket classification,
2
2
  // tool_search ranking + auto-selection, and the session tool-surface
3
3
  // application/selection logic. Pure module (session objects passed in).
4
+ import { createHash } from 'node:crypto';
4
5
  import { clean } from './session-text.mjs';
5
- import { mergePendingDeferredToolDelta } from './deferred-tool-delta.mjs';
6
+ import { dropPendingDeferredToolAdds, mergePendingDeferredToolDelta } from './deferred-tool-delta.mjs';
7
+ import { isAgentOwner } from '../agent-owner.mjs';
6
8
  import { applyInitialDeferredToolManifestToBp2 } from '../context/collect.mjs';
7
9
  import {
8
10
  listedDeferredToolNames,
@@ -12,7 +14,11 @@ import {
12
14
  import { parseMcpToolName } from '../../../shared/tool-primitives.mjs';
13
15
  import { getMcpServerInstructionsMap, getMcpTools, getMcpToolGeneration } from '../mcp/client.mjs';
14
16
  import { filterMcpToolsForSession } from './extension-scopes.mjs';
15
- import { isDeferredToolAvailable, isToolPermittedBySessionPolicy } from './deferred-tool-availability.mjs';
17
+ import {
18
+ isDeferredToolAvailable,
19
+ isToolPermittedBySessionPolicy,
20
+ sessionFeatureDenies,
21
+ } from './deferred-tool-availability.mjs';
16
22
  import { routeToolExclusionReason } from '../session/loop/provider-tool-exclusions.mjs';
17
23
  import { isResponsesFreeformTool, toResponsesCustomTool } from '../providers/custom-tool-wire.mjs';
18
24
  import {
@@ -46,21 +52,8 @@ import {
46
52
  toolExposureModeForProvider,
47
53
  } from './tool-exposure.mjs';
48
54
  import { TOOL_BRIDGE_TOOLS } from './tool-defs.mjs';
49
- export {
50
- toolKind,
51
- toolSchemaBucket,
52
- estimateToolSchemaBreakdown,
53
- measuredToolUsage,
54
- parseToolSelection,
55
- sortedCatalogByMeasuredUsage,
56
- } from './tool-catalog-schema.mjs';
55
+ export { estimateToolSchemaBreakdown } from './tool-catalog-schema.mjs';
57
56
  export { snapshotProviderRequestTools } from './provider-request-snapshot.mjs';
58
- export {
59
- DEFERRED_DEFAULT_FULL_TOOLS,
60
- DEFERRED_DEFAULT_LEAD_TOOLS,
61
- DEFERRED_DEFAULT_READONLY_TOOLS,
62
- MEASURED_TOOL_USAGE,
63
- } from './tool-catalog-data.mjs';
64
57
 
65
58
  // Provider modes without native tool search. Their bridge-v1 sessions
66
59
  // (tool-exposure.mjs) get the native roster and late delta notices; only a
@@ -548,24 +541,30 @@ export function rebuildDeferredToolSurfaceForProvider(session, provider) {
548
541
  // <available-deferred-tools> manifest IN PLACE and pre-mark names announced;
549
542
  // bridge-v1 sessions do the same (roster + bridge guidance). Only a fixed
550
543
  // surface not yet on the bridge updates its scoped catalog alone. Fully sync
551
- // and idempotent: no genuinely-new MCP name => no-op / no mutation.
544
+ // and idempotent: no MCP name added or gone => no-op / no mutation.
552
545
  export function refreshInitialDeferredMcpSurface(session, liveMcpTools) {
553
546
  if (!session || !Array.isArray(session.messages)) return false;
554
547
  if (session.deferredProviderMode === 'full') return false;
555
548
  const live = filterDisallowedTools(Array.isArray(liveMcpTools) ? liveMcpTools : [], session.disallowedTools);
549
+ const liveNames = new Set(live.map((tool) => clean(tool?.name)).filter(isMcpToolName));
556
550
  const byName = new Map();
551
+ // Nothing was sent yet: a server gone since create leaves the initial surface.
552
+ let changed = false;
557
553
  for (const tool of Array.isArray(session.deferredToolCatalog) ? session.deferredToolCatalog : []) {
558
554
  const name = clean(tool?.name);
555
+ if (isMcpToolName(name) && !liveNames.has(name)) {
556
+ changed = true;
557
+ continue;
558
+ }
559
559
  if (name && !byName.has(name)) byName.set(name, tool);
560
560
  }
561
- let added = false;
562
561
  for (const tool of live) {
563
562
  const name = clean(tool?.name);
564
563
  if (!name || !isMcpToolName(name) || byName.has(name)) continue;
565
564
  byName.set(name, activeToolForSurface(tool));
566
- added = true;
565
+ changed = true;
567
566
  }
568
- if (!added) return false;
567
+ if (!changed) return false;
569
568
  session.deferredToolCatalog = sortedCatalogByMeasuredUsage([...byName.values()]);
570
569
  if (fixedSurfaceSession(session)) {
571
570
  session.updatedAt = Date.now();
@@ -720,10 +719,12 @@ function reconcileDeferredMcpToolCatalogUncached(session, liveMcpTools) {
720
719
  // connected OR the tool is already loaded, including native history-only
721
720
  // discoveries. Availability is determined by deferredMcpToolNames, not this pool.
722
721
  const nextByName = new Map();
722
+ // A built-in a settings gate opened (tool-availability.mjs) is no MCP tool:
723
+ // its availability is the session's deny set, so it stays.
723
724
  for (const tool of lateCatalog) {
724
725
  const name = clean(tool?.name);
725
726
  if (!name || nextByName.has(name)) continue;
726
- if (!liveMcpByName.has(name) && !active.has(name)) continue;
727
+ if (isMcpToolName(name) && !liveMcpByName.has(name) && !active.has(name)) continue;
727
728
  nextByName.set(name, tool);
728
729
  }
729
730
  for (const [name, tool] of liveMcpByName) nextByName.set(name, tool);
@@ -773,28 +774,84 @@ function reconcileDeferredMcpToolCatalogUncached(session, liveMcpTools) {
773
774
  * connected tool the boot manifest never listed and the session has not loaded
774
775
  * or discovered rides the next real prompt as one more delta, acknowledged
775
776
  * only once the provider accepts that turn.
777
+ * Only a session whose prompt is never rebuilt at a cold point (a delegated
778
+ * worker, or a prompt without a recorded identity) is re-armed, by name; any
779
+ * other session folds its late tools into the rebuilt manifest instead
780
+ * (foldLateDeferredTools).
776
781
  * Returns the re-armed names, or null when there are none.
777
782
  */
778
783
  export function rearmLateDeferredTools(session) {
779
784
  // The compaction also drops the load results that carried a server's
780
- // instruction text, so the next load of its tools delivers it again.
781
- if (session) delete session.mcpInstructionsAnnounced;
785
+ // instruction text (the account and configuration guidance, which no prompt
786
+ // manifest carries), so the next load of its tools delivers it again. It
787
+ // rides a tool result, never the cached prefix, and ordinary turns still
788
+ // send it once.
789
+ if (session) {
790
+ delete session.mcpInstructionsAnnounced;
791
+ delete session.mcpInstructionHashes;
792
+ }
782
793
  if (!session || !Array.isArray(session.tools) || fixedSurfaceSession(session)) return null;
783
- if (!Array.isArray(session.deferredMcpToolNames) || !Array.isArray(session.deferredAnnouncedTools)) return null;
794
+ if (session.promptIdentity && !isAgentOwner(session)) return null;
795
+ if (!Array.isArray(session.deferredAnnouncedTools)) return null;
784
796
  // Listed in the boot manifest, or already loaded/discovered: still visible.
785
797
  const listed = new Set([...session.deferredAnnouncedTools, ...persistentToolSurfaceNames(session)]);
786
- const connected = new Set(session.deferredMcpToolNames);
798
+ const connected = new Set(Array.isArray(session.deferredMcpToolNames) ? session.deferredMcpToolNames : []);
787
799
  const added = [];
788
800
  for (const tool of Array.isArray(session.deferredLateToolCatalog) ? session.deferredLateToolCatalog : []) {
789
801
  const name = clean(tool?.name);
790
- if (!name || !connected.has(name) || listed.has(name) || !rosterPermits(session, tool)) continue;
791
- added.push({ name, description: lateAnnouncementDescription(tool?.description) });
802
+ if (!name || listed.has(name) || !rosterPermits(session, tool)) continue;
803
+ // MCP tools while connected; a built-in a settings gate opened while permitted.
804
+ if (isMcpToolName(name) ? !connected.has(name) : !isToolPermittedBySessionPolicy(session, name)) continue;
805
+ // Names only: the model was told the description before.
806
+ added.push({ name, description: '' });
792
807
  }
793
808
  if (!added.length) return null;
794
809
  mergePendingDeferredToolDelta(session, { added });
795
810
  return added.map((entry) => entry.name);
796
811
  }
797
812
 
813
+ /**
814
+ * A cold point (a compaction, a rebuilt prompt): the late tools join the boot
815
+ * catalog and the rebuilt BP2 manifest lists them, so nothing about them rides
816
+ * a notice. Pending
817
+ * announcements the manifest now carries are dropped. Returns the folded names.
818
+ */
819
+ export function foldLateDeferredTools(session) {
820
+ if (!session || !Array.isArray(session.tools) || fixedSurfaceSession(session)) return [];
821
+ const late = Array.isArray(session.deferredLateToolCatalog) ? session.deferredLateToolCatalog : [];
822
+ const connected = new Set(Array.isArray(session.deferredMcpToolNames) ? session.deferredMcpToolNames : []);
823
+ const byName = new Map();
824
+ for (const tool of Array.isArray(session.deferredToolCatalog) ? session.deferredToolCatalog : []) {
825
+ const name = clean(tool?.name);
826
+ if (name && !byName.has(name)) byName.set(name, tool);
827
+ }
828
+ const folded = [];
829
+ for (const tool of late) {
830
+ const name = clean(tool?.name);
831
+ if (!name || byName.has(name) || !rosterPermits(session, tool)) continue;
832
+ if (isMcpToolName(name) ? !connected.has(name) : !isToolPermittedBySessionPolicy(session, name)) continue;
833
+ byName.set(name, activeToolForSurface(tool));
834
+ folded.push(name);
835
+ }
836
+ session.deferredToolCatalog = sortedCatalogByMeasuredUsage([...byName.values()]);
837
+ // Whatever the boot catalog holds now (folded here, or by the rebuilt surface) leaves the late pool.
838
+ session.deferredLateToolCatalog = late.filter((tool) => !byName.has(clean(tool?.name)));
839
+ session.mcpServerInstructions = getMcpServerInstructionsMap(session.mcpScopeId);
840
+ if (Array.isArray(session.messages) && session.messages.some((m) => m?.role === 'system')) {
841
+ applyInitialDeferredToolManifestToBp2(session, deferredPoolToolNames(session), { rebuild: true });
842
+ session.deferredAnnouncedTools = listedDeferredToolNames(
843
+ session,
844
+ deferredPoolToolNames(session),
845
+ renderedDeferredManifest(session)
846
+ );
847
+ }
848
+ // The manifest lists only short triggers, never a server's instruction text:
849
+ // what a load has told stays as recorded (a compaction clears it).
850
+ const listed = new Set(Array.isArray(session.deferredAnnouncedTools) ? session.deferredAnnouncedTools : []);
851
+ dropPendingDeferredToolAdds(session, listed);
852
+ return folded;
853
+ }
854
+
798
855
  export function scopedMcpToolsFor(session, config = null) {
799
856
  return filterMcpToolsForSession(getMcpTools(session?.mcpScopeId), session?.cwd || null, config);
800
857
  }
@@ -916,24 +973,41 @@ function resolvableCatalog(session) {
916
973
  return filterSessionToolPolicy(tools, session);
917
974
  }
918
975
 
976
+ const instructionHash = (text) =>
977
+ createHash('sha256')
978
+ .update(String(text || ''))
979
+ .digest('hex')
980
+ .slice(0, 16);
981
+
919
982
  // A server's instruction text rides the first load_tool naming any of its
920
- // tools (loaded now, already active, or described on the bridge), once until
921
- // compaction (`mcpInstructionsAnnounced`; rearmLateDeferredTools clears it with
922
- // the transcript that held the text): `## <server>` + body, sanitized and
923
- // capped like the BP2 block it replaces. No text, nothing sent or recorded.
983
+ // tools (loaded now, already active, or described on the bridge), once per
984
+ // text (`mcpInstructionsAnnounced`, `mcpInstructionHashes`: a connector whose
985
+ // accounts changed sends its new text again; a compaction clears the record,
986
+ // rearmLateDeferredTools): `## <server>` + body,
987
+ // sanitized and capped (sanitizeMcpInstructionText, well under 4 KB). No
988
+ // text, nothing sent or recorded.
924
989
  function pendingMcpInstructions(session, catalog, names) {
925
990
  const map = session?.mcpServerInstructions;
926
991
  if (!map || typeof map !== 'object' || !names.length) return [];
927
992
  const byName = new Map(catalog.map((tool) => [clean(tool?.name), tool]));
928
993
  const announced = new Set(Array.isArray(session.mcpInstructionsAnnounced) ? session.mcpInstructionsAnnounced : []);
994
+ const hashes =
995
+ session.mcpInstructionHashes && typeof session.mcpInstructionHashes === 'object'
996
+ ? session.mcpInstructionHashes
997
+ : {};
998
+ const seen = new Set();
929
999
  const pending = [];
930
1000
  for (const name of names) {
931
1001
  const server = parseMcpToolName(byName.get(name) || name)?.server;
932
- if (!server || announced.has(server) || !mcpServerManifestLabel(server)) continue;
1002
+ if (!server || seen.has(server) || !mcpServerManifestLabel(server)) continue;
933
1003
  const text = sanitizeMcpInstructionText(map[server]);
934
1004
  if (!text) continue;
935
- announced.add(server);
936
- pending.push({ server, block: `## ${server}\n${text}` });
1005
+ const hash = instructionHash(text);
1006
+ // Told already, and the text is the one told. A record from before hashes
1007
+ // were kept cannot tell which text it carried: sent once more, and hashed.
1008
+ if (announced.has(server) && hashes[server] === hash) continue;
1009
+ seen.add(server);
1010
+ pending.push({ server, hash, block: `## ${server}\n${text}` });
937
1011
  }
938
1012
  return pending;
939
1013
  }
@@ -943,6 +1017,10 @@ function announceMcpServers(session, pending) {
943
1017
  session.mcpInstructionsAnnounced = [
944
1018
  ...new Set([...(session.mcpInstructionsAnnounced || []), ...pending.map((entry) => entry.server)]),
945
1019
  ];
1020
+ session.mcpInstructionHashes = {
1021
+ ...(session.mcpInstructionHashes || {}),
1022
+ ...Object.fromEntries(pending.map((entry) => [entry.server, entry.hash])),
1023
+ };
946
1024
  }
947
1025
 
948
1026
  function claimMcpServerInstructions(session, catalog, names) {
@@ -1016,7 +1094,9 @@ export function renderToolSearch(args = {}, session, mode = 'full', options = {}
1016
1094
  ]);
1017
1095
  const loaded = toolSelection.added || [];
1018
1096
  const alreadyActive = toolSelection.already || [];
1019
- const missing = toolSelection.missing || [];
1097
+ // A tool a settings gate closed is named as such, not as unknown.
1098
+ const disabledInSettings = (toolSelection.missing || []).filter((name) => sessionFeatureDenies(session, name));
1099
+ const missing = (toolSelection.missing || []).filter((name) => !disabledInSettings.includes(name));
1020
1100
  const blocked = toolSelection.blocked || [];
1021
1101
  // Native discovery is history-driven: an explicit re-selection must emit
1022
1102
  // the tool reference/spec again even when the callable registry already has
@@ -1040,6 +1120,9 @@ export function renderToolSearch(args = {}, session, mode = 'full', options = {}
1040
1120
  ? { ...nativeToolSearchBase, summary: nativeSummary || nativeToolSearchBase.summary }
1041
1121
  : null;
1042
1122
  const notes = [];
1123
+ if (disabledInSettings.length) {
1124
+ notes.push(`Disabled in settings: ${disabledInSettings.join(', ')}. Do not retry unless the user turns it on.`);
1125
+ }
1043
1126
  if (missing.length && pendingMcpServers.length) {
1044
1127
  notes.push('Some requested names may belong to an MCP server still connecting — retry next turn.');
1045
1128
  }
@@ -1059,6 +1142,7 @@ export function renderToolSearch(args = {}, session, mode = 'full', options = {}
1059
1142
  alreadyActive,
1060
1143
  ...(alreadyActiveSchemas.length ? { alreadyActiveSchemas } : {}),
1061
1144
  missing,
1145
+ ...(disabledInSettings.length ? { disabledInSettings } : {}),
1062
1146
  ...(blocked.length ? { blocked } : {}),
1063
1147
  ...mcpFields,
1064
1148
  activeTools: sortedNamesByMeasuredUsage(
@@ -101,7 +101,7 @@ export const SESSION_TOOL = {
101
101
  'suggest',
102
102
  ],
103
103
  description:
104
- 'status defaults to current; list pages sessions, without sub-agent or archived ones unless include_agents/include_archived; bots shows each bot’s activity, work, approvals, routines and attention flags, or with session_id (a bot id or its chat) its routines and recent sessions; read returns latest items; send queues prompt (reportsBack: the turn result reports back here); cancel stops the turn; delete removes the session. create (bot conversations) starts a visible agent task session from brief (started, not done yet); unknown Project: list-projects first, still ambiguous: ask the user. compact runs after this turn; fork copies it without switching. suggest (Mixy’s chat only) records a proposal made to the user under key; value false records that the user declined it.',
104
+ 'status defaults to current; list pages sessions, without sub-agent or archived ones unless include_agents/include_archived; bots shows each bot’s activity, work, approvals, routines and attention flags, or with session_id (a bot id or its chat) its routines and recent sessions; read returns latest items; send queues prompt (reportsBack: the turn result reports back here); cancel stops the turn; delete removes the session. create (bot conversations; only for a big multi-step plan, smaller work goes to agent) starts a visible agent task session from brief (started, not done yet); unknown Project: list-projects first, still ambiguous: ask the user. compact runs after this turn; fork copies it without switching. suggest (Mixy’s chat only) records a proposal made to the user under key; value false records that the user declined it.',
105
105
  },
106
106
  title: {
107
107
  type: 'string',
@@ -240,6 +240,7 @@ const OFFICE_RUNTIME_TOOLS = ['office'];
240
240
  const MEDIA_RUNTIME_TOOLS = ['media'];
241
241
  const TIDY_RUNTIME_TOOLS = ['tidy'];
242
242
  const VISUALIZE_RUNTIME_TOOLS = ['visualize'];
243
+ const EXPLORE_RUNTIME_TOOLS = ['explore'];
243
244
 
244
245
  const admitted = (tools, names) => (tools || []).filter((tool) => names.includes(tool?.name));
245
246
 
@@ -262,6 +263,7 @@ export function collectStandaloneToolDefs({
262
263
  mediaToolDefs = [],
263
264
  tidyToolDefs = [],
264
265
  visualizeToolDefs = [],
266
+ exploreToolDefs = [],
265
267
  setupToolDefs = [],
266
268
  askUserToolDefs = [],
267
269
  handoffUserToolDefs = [],
@@ -285,6 +287,7 @@ export function collectStandaloneToolDefs({
285
287
  ...admitted(mediaToolDefs, MEDIA_RUNTIME_TOOLS),
286
288
  ...admitted(tidyToolDefs, TIDY_RUNTIME_TOOLS),
287
289
  ...admitted(visualizeToolDefs, VISUALIZE_RUNTIME_TOOLS),
290
+ ...admitted(exploreToolDefs, EXPLORE_RUNTIME_TOOLS),
288
291
  ...setupToolDefs,
289
292
  ...askUserToolDefs,
290
293
  ...handoffUserToolDefs,
@@ -4,6 +4,8 @@ import { clean } from '../session-text.mjs';
4
4
  import { configuredOrchestrationMode } from '../../../../shared/orchestration.mjs';
5
5
  import { AGENT_MODE_DELEGATION, MIXY_CONTACTS_INTRO, orchestrationInstructions } from '../orchestration.mjs';
6
6
  import { DEFAULT_WORKFLOW_ID, isContactAgentId, normalizeWorkflowId } from '../workflow-ids.mjs';
7
+ import { MIXY_AGENT_ID } from '../../session/agent-home.mjs';
8
+ import { mixyDisplayName } from '../../session/mixy-name.mjs';
7
9
 
8
10
  export function createWorkflowContext({ packs, agents }) {
9
11
  function workflowSummary(pack, { hasAgents = true } = {}) {
@@ -30,7 +32,7 @@ export function createWorkflowContext({ packs, agents }) {
30
32
  function workflowContextBlockFromPack(pack) {
31
33
  if (!pack) return '';
32
34
  // The pack body opens with its own `# <name>` title, so header + description
33
- // + body used to repeat the workflow name three times in the prompt. Emit one
35
+ // + body would repeat the workflow name three times in the prompt. Emit one
34
36
  // header line and drop the body's duplicate title (only when it matches).
35
37
  const rawBody = String(pack.body || '');
36
38
  const firstBreak = rawBody.indexOf('\n');
@@ -59,7 +61,9 @@ export function createWorkflowContext({ packs, agents }) {
59
61
  // - coding: the orchestration mode block and the full agent catalog;
60
62
  // - agent mode: the fixed delegation block (no per-agent setting) and the
61
63
  // sub-agent catalog — identical for every agent, so their prompts share
62
- // it — plus the contact-agent catalog: every bot but `agentId` itself.
64
+ // it — plus the contact-agent catalog: every bot but `agentId` itself,
65
+ // and for any bot but Mixy, Mixy first under her display name, so a bot
66
+ // asked to hand work to her by that name finds her (session send lead).
63
67
  function leadPromptParts(config, dir, { agentMode = false, agentId = '' } = {}) {
64
68
  const mode = configuredOrchestrationMode(config);
65
69
  const ids = agents.delegatableAgentIds(config, dir);
@@ -79,10 +83,15 @@ export function createWorkflowContext({ packs, agents }) {
79
83
  dir,
80
84
  ids.filter((id) => !isContact(id))
81
85
  );
82
- const contacts = agentCatalog(
83
- dir,
84
- ids.filter((id) => isContact(id) && id !== agentId)
85
- );
86
+ const contacts = [
87
+ agentId === MIXY_AGENT_ID ? '' : `- ${mixyDisplayName()} (${MIXY_AGENT_ID}): the user's representative bot`,
88
+ agentCatalog(
89
+ dir,
90
+ ids.filter((id) => isContact(id) && id !== agentId)
91
+ ),
92
+ ]
93
+ .filter(Boolean)
94
+ .join('\n');
86
95
  return {
87
96
  // An agent-mode Lead without agents has no one to delegate to at all.
88
97
  orchestrationContext: subAgents || contacts ? AGENT_MODE_DELEGATION : '',
@@ -7,6 +7,7 @@ export const AGENT_DELETED_MARKER = '.deleted';
7
7
  export const FIXED_AGENT_SLOTS = Object.freeze([
8
8
  // Short one-liners on purpose: these render inside the 260px sidebar rail.
9
9
  { id: 'maintainer', label: 'Maintainer', description: 'Memory and upkeep', workflowSlot: 'memory' },
10
+ { id: 'explore', label: 'Explore', description: 'Codebase exploration', workflowSlot: 'explore' },
10
11
  ]);
11
12
  export const AGENT_ROLE_IDS = new Set(FIXED_AGENT_SLOTS.map((agent) => agent.id));
12
13
  // Slot-backed built-ins run through dedicated maintenance channels, so they are never
@@ -14,6 +14,7 @@ import { clearReactionTargets } from '../runtime-core/reaction-tool-defs.mjs';
14
14
  import { applyRetryAction, beginIteration, sendProviderRequest, settleSendResult } from './loop/send-phase.mjs';
15
15
  import { runToolPhase } from './loop/tool-phase.mjs';
16
16
  import { endedWithoutReply } from './loop/turn-limits.mjs';
17
+ import { carryReportOnError } from './loop/turn-report.mjs';
17
18
 
18
19
  // Facade re-exports: these symbols live in ./loop/ modules and are part of
19
20
  // loop.mjs's public surface (imported by scripts/tests and other runtime
@@ -62,29 +63,34 @@ async function runAgentLoop(provider, messages, model, tools, onToolCall, cwd, s
62
63
  resetAccountProbePacing();
63
64
  const state = createLoopState({ provider, messages, model, tools, cwd, sendOpts });
64
65
  // Completion, cancellation, and terminal failures end execution.
65
- while (true) {
66
- const round = await beginIteration(state);
67
- const sent = await sendProviderRequest(state, round);
68
- if (applyRetryAction(state, sent.result)) continue;
69
- settleSendResult(state, round, sent);
70
- // A turn without client tool calls is not automatically the final answer:
71
- // the provider may have hit its output ceiling, been cut by a safety
72
- // classifier, declared the turn unfinished, or returned nothing. Each case
73
- // owns a bounded recovery ladder in ./loop/no-tool-turn.mjs, which either
74
- // appended a recovery turn ('continue') or produced the terminal response.
75
- if (!state.response.toolCalls?.length) {
76
- const outcome = await state.noToolTurn.resolve(state.response, state.iterations);
77
- state.response = outcome.response;
78
- if (outcome.action === 'continue') continue;
79
- break;
80
- }
81
- await runToolPhase(state, round, sent, onToolCall);
82
- // A capped turn that kept calling tools after it was told to reply ends
83
- // here with no reply (./loop/turn-limits.mjs).
84
- if (state.turnLimitEnded) {
85
- state.response = endedWithoutReply(state.response);
86
- break;
66
+ try {
67
+ while (true) {
68
+ const round = await beginIteration(state);
69
+ const sent = await sendProviderRequest(state, round);
70
+ if (applyRetryAction(state, sent.result)) continue;
71
+ settleSendResult(state, round, sent);
72
+ // A turn without client tool calls is not automatically the final answer:
73
+ // the provider may have hit its output ceiling, been cut by a safety
74
+ // classifier, declared the turn unfinished, or returned nothing. Each case
75
+ // owns a bounded recovery ladder in ./loop/no-tool-turn.mjs, which either
76
+ // appended a recovery turn ('continue') or produced the terminal response.
77
+ if (!state.response.toolCalls?.length) {
78
+ const outcome = await state.noToolTurn.resolve(state.response, state.iterations);
79
+ state.response = outcome.response;
80
+ if (outcome.action === 'continue') continue;
81
+ break;
82
+ }
83
+ await runToolPhase(state, round, sent, onToolCall);
84
+ // A capped turn that kept calling tools after it was told to reply ends
85
+ // here with no reply (./loop/turn-limits.mjs), keeping the answers it
86
+ // went past.
87
+ if (state.turnLimitEnded) {
88
+ state.response = state.noToolTurn.finalize(endedWithoutReply(state.response));
89
+ break;
90
+ }
87
91
  }
92
+ } catch (error) {
93
+ throw carryReportOnError(error, state.noToolTurn.endedReport());
88
94
  }
89
95
  return finishLoop(state);
90
96
  }
@@ -4,6 +4,36 @@
4
4
  // only — nothing here reads or changes the watchdog's abort policy.
5
5
  import { displayProgressStage, lastProgressAt } from '../../../shared/quiet-progress.mjs';
6
6
  import { resolveAgentStallThresholds } from '../stall-policy.mjs';
7
+ import { todoProgress } from '../runtime-core/todo-list.mjs';
8
+ import { sessionUsageTotals } from '../../../shared/session-usage-totals.mjs';
9
+
10
+ /** `rows` with each agent's todo progress taken from its live session when
11
+ * this process holds one: the list changes before the session is saved, and
12
+ * the stored copy lags. A live session is authoritative, so one without a
13
+ * list (cleared) drops the row's stored `todo`; rows with no live session
14
+ * keep the stored one. */
15
+ export function withLiveTodo(rows, liveSession) {
16
+ return rows.map((row) => {
17
+ const live = row?.sessionId ? liveSession(row.sessionId) : null;
18
+ if (!live) return row;
19
+ const { todo: _stored, ...rest } = row;
20
+ const todo = todoProgress(live);
21
+ return todo ? { ...rest, todo } : rest;
22
+ });
23
+ }
24
+
25
+ /** `rows` with each agent's running token and tool-call totals taken from its
26
+ * live session when this process holds one: the counters advance with every
27
+ * model response, while the stored copy follows a throttled save. A total the
28
+ * live session does not know keeps the stored one. */
29
+ export function withLiveUsage(rows, liveSession) {
30
+ return rows.map((row) => {
31
+ const live = row?.sessionId ? liveSession(row.sessionId) : null;
32
+ if (!live) return row;
33
+ const { usage, toolCalls } = sessionUsageTotals(live);
34
+ return { ...row, ...(usage ? { usage } : {}), ...(toolCalls === null ? {} : { toolCalls }) };
35
+ });
36
+ }
7
37
 
8
38
  /** `rows` with progress fields on every row `runtimeEntry(sessionId)` reports
9
39
  * in flight. `awaitingTask` marks a row whose agent waits on its background
@@ -9,12 +9,19 @@ export interface RoomRow {
9
9
  to?: string[] | string;
10
10
  toName?: string[] | string;
11
11
  failed?: boolean;
12
+ /** A failed pass row: every member it stands for (a run of failures collapses
13
+ * into one row), and why they failed. */
14
+ names?: string[];
15
+ /** Stored as one string; a host may hand the distinct reasons as a list. */
16
+ reason?: string | string[];
17
+ /** A usage-limit stop (`limit: 'usage'` on a cap row): what ran out, on which model. */
18
+ usage?: RoomUsageLimit;
12
19
  /** A user-kind row another session sent: its session, the sending bot
13
20
  * (none for the user's Lead) and the name it is shown under. */
14
21
  fromSession?: string;
15
22
  fromAgent?: string;
16
23
  fromName?: string;
17
- limit?: 'rounds' | 'messages';
24
+ limit?: 'rounds' | 'messages' | 'usage';
18
25
  rounds?: number;
19
26
  messages?: number;
20
27
  tools?: Array<{ name: string; summary: string }>;
@@ -66,11 +73,27 @@ export interface RoomMemberLabel {
66
73
  name: string;
67
74
  }
68
75
  export type RoomTurnResult = 'speech' | 'pass' | 'stopped' | 'superseded';
69
- /** A turn's answer; a speech may name the one peer it addressed. */
70
- export type RoomTurnAnswer = RoomTurnResult | { result: RoomTurnResult; mention?: string };
76
+ /** What stopped a turn on the provider's usage limit (roomUsageLimit). */
77
+ export interface RoomUsageLimit {
78
+ kind: 'quota_exhausted' | 'entitlement' | 'billing';
79
+ provider: string;
80
+ model: string;
81
+ /** Epoch ms the limit resets; null when unknown. */
82
+ resetAt: number | null;
83
+ }
84
+ /** The usage-limit stop a failed `turndone` item records, or null. */
85
+ export function roomUsageLimit(done: unknown, route?: { provider?: string; model?: string }): RoomUsageLimit | null;
86
+ /** A turn's answer; a speech may name the one peer it addressed, a failed
87
+ * pass says so (`failed`) and, on a usage limit, why (`usage`). */
88
+ export type RoomTurnAnswer =
89
+ | RoomTurnResult
90
+ | 'unavailable'
91
+ | { result: RoomTurnResult | 'unavailable'; mention?: string; failed?: boolean; usage?: RoomUsageLimit | null };
71
92
  export interface RoomExchangeResult {
72
- outcome: 'done' | 'capped' | 'stopped' | 'superseded';
93
+ outcome: 'done' | 'capped' | 'stopped' | 'superseded' | 'limited' | 'failed';
73
94
  limit?: 'rounds' | 'messages';
95
+ /** A 'limited' end: the usage limit the turn met. */
96
+ usage?: RoomUsageLimit;
74
97
  rounds: number;
75
98
  /** Supervisor steps taken. */
76
99
  steps: number;
@@ -118,7 +141,7 @@ export type RoomScene = 'casual' | 'work';
118
141
  /** What one supervisor step is told. */
119
142
  export interface RoomStep {
120
143
  mustPick: boolean;
121
- turns: Array<{ id: string; result: RoomTurnResult }>;
144
+ turns: Array<{ id: string; result: RoomTurnResult; failed?: boolean }>;
122
145
  last: string;
123
146
  mention: string;
124
147
  remaining: { messages: number; steps: number };
@@ -144,6 +167,8 @@ export function runRoomExchange(options: {
144
167
  waiting?: boolean;
145
168
  /** The called members (`to`) answer and nobody else follows. */
146
169
  only?: boolean;
170
+ /** The sender stated that the request also addressed the whole room; unset, only an empty `to` does. */
171
+ wholeRoom?: boolean;
147
172
  }): Promise<RoomExchangeResult>;
148
173
  export function roomDataLabel(value: unknown): string;
149
174
  export function roomDataLines(text: unknown): string[];