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
@@ -6,9 +6,13 @@ import { openInBrowser } from '../../../runtime/shared/open-url.mjs';
6
6
  import { providerDetailText } from '../app-format.mjs';
7
7
  import { forgetProviderAuth, keyConsoleUrl, providerStatusFooter } from './provider-items.mjs';
8
8
 
9
- const setApiKeyPrompt = (flow, providerItem) => {
9
+ const VERTEX_EXPRESS_HINT =
10
+ 'Express mode API keys serve Gemini models on the global location only. Claude and MaaS models need a service-account key or the gcloud login.';
11
+
12
+ const setApiKeyPrompt = (flow, providerItem, extra = {}) => {
10
13
  if (!flow.ownsSurface()) return;
11
14
  flow.setProviderPrompt({
15
+ ...extra,
12
16
  kind: 'api-key',
13
17
  providerId: providerItem._providerId,
14
18
  label: providerItem._providerName,
@@ -51,6 +55,28 @@ function apiKeyActions(providerItem, provider) {
51
55
  return { apiActions, keyUrl };
52
56
  }
53
57
 
58
+ // Vertex AI takes either a service-account key or an express-mode API key.
59
+ function openVertexModePicker(flow, providerItem) {
60
+ flow.paint({
61
+ title: `Provider · ${providerItem._providerName}`,
62
+ description: 'Choose the Vertex AI key type.',
63
+ help: '↑/↓ Select · Enter Choose · Esc Back',
64
+ indexMode: 'always',
65
+ labelWidth: 22,
66
+ pickerKey: `providers-vertex-mode:${providerItem.value}`,
67
+ initialIndex: 0,
68
+ items: [
69
+ { value: 'service-account', label: 'Service account key', description: 'service-account JSON' },
70
+ { value: 'api-key', label: 'API key (express mode)', description: 'Gemini only · global location' },
71
+ ],
72
+ onSelect: (mode) => {
73
+ flow.releaseSurface();
74
+ setApiKeyPrompt(flow, providerItem, mode === 'api-key' ? { authMode: 'api-key', hint: VERTEX_EXPRESS_HINT } : {});
75
+ },
76
+ onCancel: () => openApiProviderActions(flow, providerItem),
77
+ });
78
+ }
79
+
54
80
  export function openApiProviderActions(flow, providerItem) {
55
81
  // Reached from acks (a failed forget-key) as well as key presses: prove
56
82
  // ownership at the sink so every caller is covered.
@@ -69,6 +95,10 @@ export function openApiProviderActions(flow, providerItem) {
69
95
  initialIndex: 0,
70
96
  items: apiActions,
71
97
  onSelect: (_detailValue, detail) => {
98
+ if (detail._action === 'set-key' && providerItem._providerId === 'vertex-ai') {
99
+ openVertexModePicker(flow, providerItem);
100
+ return;
101
+ }
72
102
  flow.releaseSurface();
73
103
  if (detail._action === 'set-key') {
74
104
  setApiKeyPrompt(flow, providerItem);
@@ -16,11 +16,21 @@ const panelFrame = (providerItem, provider, pickerKey) => ({
16
16
  initialIndex: 0,
17
17
  });
18
18
 
19
- function showOAuthProgress(flow, providerItem, message, onBack) {
19
+ // Shown with every device code: a code someone else hands you signs THEM in to your account.
20
+ // One row that fits 80 columns: it takes the row the status footer did, so the URL
21
+ // keeps its copy-hint row and the "Enter code" line is never replaced by the copy note.
22
+ const DEVICE_CODE_WARNING = [
23
+ { glyph: '!', text: 'Continue only if you started this. Never enter a code someone sent you.' },
24
+ ];
25
+
26
+ function showOAuthProgress(flow, providerItem, message, onBack, detail = '', footer = null) {
20
27
  const provider = providerItem._provider || {};
28
+ const frame = panelFrame(providerItem, provider, `providers-oauth-progress:${providerItem.value}`);
21
29
  flow.paint({
22
- ...panelFrame(providerItem, provider, `providers-oauth-progress:${providerItem.value}`),
30
+ ...frame,
31
+ ...(footer ? { footer } : {}),
23
32
  description: message,
33
+ detail,
24
34
  help: '↑/↓ Select · Enter Choose · Esc Providers',
25
35
  indexMode: 'never',
26
36
  items: [
@@ -80,10 +90,11 @@ function oauthCodeHint(manualUrl, loginUrl, providerName) {
80
90
  return `Paste the authorization code or full redirect URL for ${providerName}.`;
81
91
  }
82
92
 
93
+ // The URL goes in the picker's wrapped `detail` block, never the one-line description.
83
94
  function pollingLoginMessage(userCode, loginUrl, opened) {
84
- if (userCode) return `Enter code ${userCode} at:\n${loginUrl}${opened}`;
85
- if (loginUrl) return `Open this URL to sign in:\n${loginUrl}${opened}`;
86
- return 'Finish signing in for this provider.';
95
+ if (userCode) return { message: `Enter code ${userCode} at${opened}:`, detail: loginUrl };
96
+ if (loginUrl) return { message: `Open this URL to sign in${opened}:`, detail: loginUrl };
97
+ return { message: 'Finish signing in for this provider.', detail: '' };
87
98
  }
88
99
 
89
100
  /** Login through store.beginOAuthProviderLogin: a code-completing login hands
@@ -148,7 +159,15 @@ function beginInteractiveOAuthLogin(flow, providerItem, login) {
148
159
  // Device-code and URL-only polling logins stay in the progress panel,
149
160
  // with the code and URL, until the result panel replaces it or Back.
150
161
  const opened = openBrowser ? ' (browser opened)' : '';
151
- showOAuthProgress(flow, providerItem, pollingLoginMessage(started?.userCode, loginUrl, opened), login.onBack);
162
+ const { message, detail } = pollingLoginMessage(started?.userCode, loginUrl, opened);
163
+ showOAuthProgress(
164
+ flow,
165
+ providerItem,
166
+ message,
167
+ login.onBack,
168
+ detail,
169
+ started?.userCode ? () => DEVICE_CODE_WARNING : null
170
+ );
152
171
  }
153
172
  started.waitForCallback
154
173
  ?.then((result) => {
@@ -18,6 +18,25 @@ import {
18
18
 
19
19
  const providerFooter = (item) => providerStatusFooter(item?._provider);
20
20
 
21
+ /** The rows of the main provider list: the continue row, one row per provider,
22
+ * and the client refresh row. */
23
+ function mainListItems(setup, options, canContinue) {
24
+ const items = [];
25
+ if (canContinue && !options.confirmBar) {
26
+ items.push({
27
+ value: 'continue-setup',
28
+ label: options.continueLabel || 'Continue setup',
29
+ description: options.continueDescription || 'return to setup',
30
+ _type: 'continue',
31
+ });
32
+ }
33
+ items.push(...buildProviderItems(setup));
34
+ if (setup.managedByClient === true) {
35
+ items.push({ value: 'refresh-client-providers', label: 'Refresh', _type: 'refresh-client-providers' });
36
+ }
37
+ return items;
38
+ }
39
+
21
40
  export function createProviderSetupPicker({
22
41
  store,
23
42
  surface,
@@ -87,19 +106,7 @@ export function createProviderSetupPicker({
87
106
  if (!setup) return;
88
107
  }
89
108
 
90
- const items = [];
91
- if ((returnTo || onContinue) && !options.confirmBar) {
92
- items.push({
93
- value: 'continue-setup',
94
- label: options.continueLabel || 'Continue setup',
95
- description: options.continueDescription || 'return to setup',
96
- _type: 'continue',
97
- });
98
- }
99
- items.push(...buildProviderItems(setup));
100
- if (setup.managedByClient === true) {
101
- items.push({ value: 'refresh-client-providers', label: 'Refresh', _type: 'refresh-client-providers' });
102
- }
109
+ const items = mainListItems(setup, options, Boolean(returnTo || onContinue));
103
110
 
104
111
  const flow = {
105
112
  store,
@@ -13,6 +13,16 @@ import { settingsHandoffPanel, createSettingsNavigation } from './settings-picke
13
13
  import { buildSettingsItems, readSettingsView } from './settings-picker/settings-rows.mjs';
14
14
  import { createSettingsToggles } from './settings-picker/settings-toggles.mjs';
15
15
 
16
+ // The factory is rebuilt every render, so the heavy-read gate lives beside the
17
+ // App-owned cache ref it protects: `running` is the one heavy read in flight,
18
+ // `queued` the single follow-up owed to changes that arrived meanwhile, and
19
+ // `freshWrites` counts heavy reads that wrote the cache.
20
+ const heavyGates = new WeakMap();
21
+ const heavyGateOf = (cacheRef) => {
22
+ if (!heavyGates.has(cacheRef)) heavyGates.set(cacheRef, { running: false, queued: false, freshWrites: 0 });
23
+ return heavyGates.get(cacheRef);
24
+ };
25
+
16
26
  export function createSettingsPicker({
17
27
  store,
18
28
  state,
@@ -21,6 +31,7 @@ export function createSettingsPicker({
21
31
  setSettingsPrompt,
22
32
  settingsHeavyCacheRef,
23
33
  settingsRequestRef,
34
+ settingsLiveRefreshRef,
24
35
  formatDuration,
25
36
  displayModelName,
26
37
  routeModelLabel,
@@ -51,16 +62,31 @@ export function createSettingsPicker({
51
62
  // destination synchronously before the daemon snapshot so the empty-chat
52
63
  // welcome logo cannot appear between the old panel and Settings.
53
64
  if (!light && !own.paint(settingsHandoffPanel())) return;
54
- const heavyCache = light ? settingsHeavyCacheRef.current : null;
65
+ // `heavy` re-reads MCP/plugin/skill status even on a light (no handoff
66
+ // paint) build: the cached values would otherwise win over a fresh snapshot.
67
+ const heavyCache = light && opts.heavy !== true ? settingsHeavyCacheRef.current : null;
55
68
  // ONE round-trip for the whole panel: on a daemon-backed store each getter
56
69
  // below is a serialized remote call, and reading them synchronously handed
57
70
  // back promises (every row rendered its default). getSettingsSnapshot runs
58
71
  // the same getters engine-side and answers once.
72
+ const gate = heavyGateOf(settingsHeavyCacheRef);
73
+ const freshWritesAtStart = gate.freshWrites;
59
74
  const snapshot = (await store.getSettingsSnapshot?.({ heavy: !heavyCache })) || {};
60
- const view = readSettingsView({ snapshot, heavyCache, state });
75
+ const view = readSettingsView({ snapshot, heavyCache, state }); // A superseded build (newer open/refresh) or one whose panel was already
76
+ // closed with Esc must never paint, clear prompts or write the cache: an
77
+ // older response settling late would otherwise roll the cache back for
78
+ // every later light refresh.
79
+ if (!isCurrentSettingsRequest(requestId)) {
80
+ // Its fresh heavy rows were dropped; unless a newer heavy read already
81
+ // refreshed the cache, owe the still-open panel one follow-up read.
82
+ if (!heavyCache && own.owns() && gate.freshWrites === freshWritesAtStart) gate.queued = true;
83
+ return;
84
+ }
85
+ if (!own.owns()) return;
61
86
  // Refresh the cache every build (light or full) so the next light
62
87
  // refresh reuses whatever was most recently known.
63
88
  settingsHeavyCacheRef.current = { mcp: view.mcp, plugins: view.plugins, skills: view.skills };
89
+ if (!heavyCache) gate.freshWrites += 1;
64
90
  const toggles = createSettingsToggles({
65
91
  store,
66
92
  view,
@@ -85,10 +111,6 @@ export function createSettingsPicker({
85
111
  routeModelLabel,
86
112
  workflowDisplayName,
87
113
  });
88
- // A superseded build (newer open/refresh) or one whose panel was already
89
- // closed with Esc must never paint or clear prompts.
90
- if (!isCurrentSettingsRequest(requestId)) return;
91
- if (!own.owns()) return;
92
114
  setProviderPrompt(null);
93
115
  setSettingsPrompt(null);
94
116
  own.paint({
@@ -116,6 +138,11 @@ export function createSettingsPicker({
116
138
  own.close();
117
139
  },
118
140
  });
141
+ // A settings change from elsewhere re-reads this panel while it is still
142
+ // the one on screen (the claim's epoch guards a closed or replaced panel).
143
+ // The change names no section (MCP servers, plugins and skills may have
144
+ // moved), so unlike a post-write refresh it re-reads the heavy rows too.
145
+ if (settingsLiveRefreshRef) settingsLiveRefreshRef.current = own.defer(() => refreshSettings({ heavy: true }));
119
146
  };
120
147
 
121
148
  // Public entry point. NEVER rejects: callers fire it detached
@@ -130,8 +157,26 @@ export function createSettingsPicker({
130
157
  store.pushNotice(`settings unavailable: ${error?.message || error}`, 'error');
131
158
  }
132
159
  };
133
- const refreshSettings = () => {
134
- void openSettingsPicker({ light: true });
160
+ // One heavy read at a time; changes arriving meanwhile share a single
161
+ // follow-up, which goes through the live-refresh callback so it is a no-op
162
+ // once the panel was closed or replaced.
163
+ const refreshHeavy = () => {
164
+ const gate = heavyGateOf(settingsHeavyCacheRef);
165
+ if (gate.running) {
166
+ gate.queued = true;
167
+ return;
168
+ }
169
+ gate.running = true;
170
+ void openSettingsPicker({ light: true, heavy: true }).finally(() => {
171
+ gate.running = false;
172
+ if (!gate.queued) return;
173
+ gate.queued = false;
174
+ settingsLiveRefreshRef?.current?.();
175
+ });
176
+ };
177
+ const refreshSettings = ({ heavy = false } = {}) => {
178
+ if (heavy) refreshHeavy();
179
+ else void openSettingsPicker({ light: true });
135
180
  };
136
181
  const navigation = createSettingsNavigation({ openers, openSettingsPicker, setSettingsPrompt });
137
182
 
@@ -4,8 +4,9 @@
4
4
  * welcome banner, floating panel, and the layout signature that names them.
5
5
  */
6
6
  import { isLiveSpinnerMetaVisible } from '../live-spinner-visibility.mjs';
7
- import { promptContentRows, wrappedDetailRows, queuedBandRows } from '../text-layout.mjs';
7
+ import { promptContentRows, queuedBandRows } from '../text-layout.mjs';
8
8
  import { questionPanelRows, questionsOf } from '../../components/question-panel-model.mjs';
9
+ import { signInUrlLayout } from '../../components/sign-in-url-layout.mjs';
9
10
  import { CORE_MULTILINE_TEXT_ENTRY_KINDS } from '../panel-signature.mjs';
10
11
  import { btwPanelRows } from '../btw-controller.mjs';
11
12
 
@@ -49,24 +50,25 @@ function promptBoxBudget(inputBoxHidden, promptLayoutValueRef, promptContentColu
49
50
 
50
51
  // TextEntryPanel content is one prompt line (chrome + 1) for single-line
51
52
  // prompts, or up to PANEL_MAX_VISIBLE wrapped rows for core memory add/edit.
52
- // PLUS an optional wrapped detail block (blank spacer + N wrapped rows — e.g.
53
- // the manual OAuth URL). The floating container clips from the TOP (flex-end +
53
+ // PLUS an optional borderless sign-in URL block under the panel (the manual
54
+ // OAuth URL). The floating container clips from the TOP (flex-end +
54
55
  // overflow hidden), so under-reserving here pushed the bordered title off
55
- // the top of the panel. Width matches the panel interior: frame − 2 border
56
- // − 2 paddingX, same wrap-ansi math ink uses for wrap="wrap".
57
- function textEntryBudget(textEntryPrompt, textEntryLayoutRows, frameColumns) {
56
+ // the top of the panel. The block gets only the rows the terminal leaves
57
+ // (maxFloatingPanelRows minus chrome and content) and TextEntryPanel degrades
58
+ // it to fit, using the same sign-in-url-layout math.
59
+ function textEntryBudget(textEntryPrompt, textEntryLayoutRows, frameColumns, maxFloatingPanelRows) {
58
60
  const textEntryKind = String(textEntryPrompt?.kind || '');
59
61
  const textEntryMultiline = CORE_MULTILINE_TEXT_ENTRY_KINDS.has(textEntryKind);
60
62
  const textEntryDetailText = String(textEntryPrompt?.detail || '').trim();
61
- const textEntryDetailRows = textEntryDetailText
62
- ? 1 + wrappedDetailRows(textEntryDetailText, Math.max(1, frameColumns - 4))
63
- : 0;
64
63
  const textEntryContentRows = textEntryMultiline ? textEntryLayoutRows : 1;
64
+ const textEntryUrlMaxRows = Math.max(0, maxFloatingPanelRows - PANEL_CHROME_ROWS - textEntryContentRows);
65
+ const textEntryDetailRows = signInUrlLayout(textEntryDetailText, frameColumns, textEntryUrlMaxRows).rows;
65
66
  return {
66
67
  textEntryKind,
67
68
  textEntryMultiline,
68
69
  textEntryDetailText,
69
70
  textEntryDetailRows,
71
+ textEntryUrlMaxRows,
70
72
  textEntryContentRows,
71
73
  TEXT_ENTRY_ROWS: PANEL_CHROME_ROWS + textEntryContentRows + textEntryDetailRows,
72
74
  };
@@ -137,8 +139,8 @@ function floatingPanelBudget({
137
139
  else if (btwPanel) desiredFloatingPanelRows = btwPanelRows(btwPanel, frameColumns);
138
140
  const floatingPanelRows = desiredFloatingPanelRows > 0 ? Math.min(desiredFloatingPanelRows, maxFloatingPanelRows) : 0;
139
141
  // Give the list every content row the panel exposes. The panel already grew
140
- // by OPTION_PANEL_EXTRA_ROWS; previously that growth was subtracted back out
141
- // here, so the rows leaked into an empty flexGrow gap instead of the list.
142
+ // by OPTION_PANEL_EXTRA_ROWS; subtracting that growth back out would leak the
143
+ // rows into an empty flexGrow gap instead of the list.
142
144
  // Reserving only PICKER_CHROME_ROWS lets the list occupy the full interior
143
145
  // (the footer's own reservation is handled inside Picker).
144
146
  const pickerVisibleRows = picker ? Math.max(1, floatingPanelRows - PICKER_CHROME_ROWS) : PANEL_MAX_VISIBLE;
@@ -187,7 +189,6 @@ export function computeRowBudgets({
187
189
  const { textEntryPrompt, hasTextEntryPrompt, hasFloatingPanel, expandedOptionPanel, inputBoxHidden } = surfaces;
188
190
  const { liveSpinner, liveSpinnerIsCommand, latestTranscriptItem, inputHint } = hints;
189
191
  const prompt = promptBoxBudget(inputBoxHidden, promptLayoutValueRef, promptContentColumns);
190
- const textEntry = textEntryBudget(textEntryPrompt, textEntryLayoutRows, frameColumns);
191
192
  const OPTION_PANEL_EXTRA_ROWS = expandedOptionPanel ? 3 : 0;
192
193
  const queuedVisible = !hasFloatingPanel && !inputBoxHidden && state.queued?.length > 0;
193
194
  // While the slash palette is open it owns the area above the prompt, so the
@@ -214,6 +215,7 @@ export function computeRowBudgets({
214
215
  const baseReserve =
215
216
  welcome.WELCOME_ROWS + SCROLL_HINT_ROWS + LIVE_STATUS_ROWS + INPUT_BOX_ROWS + STATUSLINE_ROWS + queued.queuedRows;
216
217
  const maxFloatingPanelRows = Math.max(0, resizeState.rows - baseReserve - 1);
218
+ const textEntry = textEntryBudget(textEntryPrompt, textEntryLayoutRows, frameColumns, maxFloatingPanelRows);
217
219
  const panel = floatingPanelBudget({
218
220
  toolApproval,
219
221
  picker,
@@ -24,7 +24,7 @@ export const SLASH_COMMANDS = [
24
24
  {
25
25
  name: 'goal',
26
26
  usage: '/goal',
27
- params: '[objective --time 1h --time-mode max|status|pause|resume|edit|stop]',
27
+ params: '[objective --time 1h|status|pause|resume|edit|stop]',
28
28
  description: 'Run and manage a durable session Goal',
29
29
  },
30
30
  {
@@ -41,6 +41,7 @@ export const SLASH_COMMANDS = [
41
41
  params: '[release <task_id> [--confirm]]',
42
42
  description: 'List shells; release one whose termination is unconfirmed',
43
43
  },
44
+ { name: 'stop', usage: '/stop', description: 'Stop every background shell of this session' },
44
45
  {
45
46
  name: 'fork',
46
47
  usage: '/fork',
@@ -139,7 +139,7 @@ export const routeCommands = {
139
139
 
140
140
  effort(ctx, arg) {
141
141
  const { state, store, openSlashPanel, deps } = ctx;
142
- // A running turn no longer blocks the switch: the in-flight turn keeps
142
+ // A running turn does not block the switch: the in-flight turn keeps
143
143
  // the effort it started with, and the new level applies from the next
144
144
  // turn. Same for /fast below.
145
145
  const pendingTurn = state.busy ? ' (applies from the next turn)' : '';
@@ -4,6 +4,7 @@
4
4
  // while a turn or session command is running.
5
5
  import { presentErrorText } from '../../../runtime/shared/err-text.mjs';
6
6
  import { BTW_USAGE_HINT } from '../btw-controller.mjs';
7
+ import { theme } from '../../theme.mjs';
7
8
 
8
9
  function compactFailureNotice(error) {
9
10
  if (error == null || String(error).trim() === '') return 'Compact failed.';
@@ -84,7 +85,7 @@ export const sessionCommands = {
84
85
  store.pushNotice('Goal is unavailable.', 'warn');
85
86
  return;
86
87
  }
87
- store.pushNotice(result.message || 'Goal updated.', 'info');
88
+ store.pushNotice(result.message || 'Goal updated.', result.ok === false ? 'warn' : 'info');
88
89
  })
89
90
  .catch((error) => store.pushNotice(`Goal failed: ${error?.message || error}`, 'error'));
90
91
  return true;
@@ -168,6 +169,51 @@ export const sessionCommands = {
168
169
  return true;
169
170
  },
170
171
 
172
+ // /stop — stop every background shell of this session (never the running
173
+ // foreground command, agents or other sessions) after one confirmation.
174
+ stop(ctx) {
175
+ const { store, surface } = ctx;
176
+ const stopAll = () =>
177
+ Promise.resolve(store.stopShellJobs?.())
178
+ .then((result) => {
179
+ const stopped = result?.stopped || 0;
180
+ const stopping = result?.stopping || 0;
181
+ store.pushNotice(
182
+ stopping
183
+ ? `Stopped background shells: ${stopped} · still stopping: ${stopping}`
184
+ : `Stopped background shells: ${stopped}`,
185
+ stopping ? 'warn' : 'info'
186
+ );
187
+ })
188
+ .catch((error) => store.pushNotice(String(error?.message || error), 'error'));
189
+ void Promise.resolve(store.listStoppableShellJobs?.())
190
+ .then((result) => {
191
+ const jobs = Array.isArray(result?.jobs) ? result.jobs : [];
192
+ if (!jobs.length) {
193
+ store.pushNotice('No background shells are running.', 'info');
194
+ return;
195
+ }
196
+ const own = surface.claim();
197
+ own.paint({
198
+ title: `Stop background shells (${jobs.length})?`,
199
+ indexMode: 'always',
200
+ labelWidth: 12,
201
+ items: [
202
+ { value: 'cancel', label: 'Cancel' },
203
+ { value: 'stop', label: 'Stop' },
204
+ ],
205
+ footer: jobs.map((job) => ({ glyph: '·', color: theme.warning, text: job.command })),
206
+ onSelect: (value) => {
207
+ own.close();
208
+ if (value === 'stop') void stopAll();
209
+ },
210
+ onCancel: () => own.close(),
211
+ });
212
+ })
213
+ .catch((error) => store.pushNotice(String(error?.message || error), 'error'));
214
+ return true;
215
+ },
216
+
171
217
  doctor(ctx) {
172
218
  const { state, store, deps } = ctx;
173
219
  if (state.commandBusy) {
@@ -17,7 +17,7 @@ import { createSlashPanelOpener } from './slash-dispatch/slash-panel.mjs';
17
17
  const commands = { ...routeCommands, ...sessionCommands, ...panelCommands };
18
18
 
19
19
  export function createSlashDispatch({ state, store, normalizeSlashCommandName, surface, closeUsagePanel, ...deps }) {
20
- const ctx = { state, store, deps, openSlashPanel: createSlashPanelOpener({ surface, store }) };
20
+ const ctx = { state, store, deps, surface, openSlashPanel: createSlashPanelOpener({ surface, store }) };
21
21
  const runSlashCommand = (cmd, arg = '') => {
22
22
  const rawName = String(cmd || '').toLowerCase();
23
23
  cmd = normalizeSlashCommandName(cmd);
@@ -0,0 +1,29 @@
1
+ /*
2
+ * app/use-btw-panel.mjs — the /btw side-question panel: its state, the
3
+ * controller that fills it, and the controller's session/unmount lifecycle.
4
+ */
5
+ import { useEffect, useRef, useState } from 'react';
6
+ import { createBtwController } from './btw-controller.mjs';
7
+
8
+ export function useBtwPanel({ store, sessionId }) {
9
+ const [btwPanel, setBtwPanel] = useState(null);
10
+ const btwRef = useRef(null);
11
+ const sessionIdRef = useRef('');
12
+ sessionIdRef.current = sessionId || '';
13
+ if (!btwRef.current) {
14
+ btwRef.current = createBtwController({
15
+ getStore: () => store,
16
+ setPanel: setBtwPanel,
17
+ getSessionId: () => sessionIdRef.current,
18
+ });
19
+ }
20
+ const btw = btwRef.current;
21
+ // A side answer belongs to the conversation it was asked in: drop it on a
22
+ // session change (new/resume/clear/switch) and cancel it on unmount.
23
+ // biome-ignore lint/correctness/useExhaustiveDependencies(sessionId): session-change trigger; the controller reads the id through its getter
24
+ useEffect(() => {
25
+ btw.sync();
26
+ }, [btw, sessionId]);
27
+ useEffect(() => () => btw.dispose(), [btw]);
28
+ return { btwPanel, btw };
29
+ }
@@ -0,0 +1,31 @@
1
+ /*
2
+ * app/use-context-panel-refresh.mjs — keeps an open /context breakdown panel
3
+ * current: it is rebuilt whenever one of the session fields it summarizes
4
+ * changes.
5
+ */
6
+ import { useEffect } from 'react';
7
+
8
+ export function useContextPanelRefresh({ contextPanelKind, state, openContextPicker }) {
9
+ // The deps are the refresh triggers (the fields the breakdown summarizes),
10
+ // not the reads; openContextPicker is rebuilt by its factory every render
11
+ // and must not re-trigger the rebuild.
12
+ // biome-ignore lint/correctness/useExhaustiveDependencies: trigger-keyed refresh over the summarized session fields
13
+ useEffect(() => {
14
+ if (contextPanelKind === 'context') openContextPicker();
15
+ }, [
16
+ contextPanelKind,
17
+ state.stats,
18
+ state.contextWindow,
19
+ state.rawContextWindow,
20
+ state.sessionId,
21
+ state.toolMode,
22
+ state.agentWorkers,
23
+ state.agentJobs,
24
+ state.provider,
25
+ state.model,
26
+ state.effort,
27
+ state.fast,
28
+ state.cwd,
29
+ state.clientHostPid,
30
+ ]);
31
+ }
@@ -20,16 +20,19 @@ export function useModelCatalogCache({ store, onboardingRef }) {
20
20
  // provider-scope cache clear (e.g. after auth) so a stale in-flight
21
21
  // listProviderModels() cannot repopulate the ref after invalidation.
22
22
  const onboardingPrefetchSeqRef = useRef(0);
23
- const clearModelCaches = useCallback((scope = 'all') => {
24
- if (scope === 'all' || scope === 'provider') {
25
- providerModelsCacheRef.current = { models: null, at: 0 };
26
- onboardingRef.current.providerModels = [];
27
- onboardingPrefetchSeqRef.current += 1;
28
- }
29
- if (scope === 'all' || scope === 'webSearch') {
30
- webSearchModelsCacheRef.current = { models: null, at: 0 };
31
- }
32
- }, []);
23
+ const clearModelCaches = useCallback(
24
+ (scope = 'all') => {
25
+ if (scope === 'all' || scope === 'provider') {
26
+ providerModelsCacheRef.current = { models: null, at: 0 };
27
+ onboardingRef.current.providerModels = [];
28
+ onboardingPrefetchSeqRef.current += 1;
29
+ }
30
+ if (scope === 'all' || scope === 'webSearch') {
31
+ webSearchModelsCacheRef.current = { models: null, at: 0 };
32
+ }
33
+ },
34
+ [onboardingRef]
35
+ );
33
36
  // Boot-time catalog prefetch: warm the /model & /agents provider catalog and
34
37
  // the /websearch catalog once at startup so those pickers open instantly from
35
38
  // cache (openModelPicker still TTL-refreshes stale rows in the background).
@@ -316,6 +316,17 @@ export function useMouseInput({
316
316
  isRawModeSupported,
317
317
  store,
318
318
  stdout,
319
+ dragRef,
320
+ lastClickRef,
321
+ slashPaletteRef,
322
+ scrollFocusRef,
323
+ promptMouseSelectionRef,
324
+ frameRowsRef,
325
+ promptBoxRectRef,
326
+ transcriptViewportRef,
327
+ scrollTargetRef,
328
+ setSlashIndex,
329
+ setMeasuredRowsVersion,
319
330
  passthroughCtrlWheelZoom,
320
331
  frameColumns,
321
332
  statuslineBandRows,
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  * app/use-onboarding-start.mjs — first-run onboarding gate + wizard launch.
3
3
  */
4
- import { useEffect } from 'react';
4
+ import { useEffect, useRef } from 'react';
5
5
 
6
6
  // First-run gate. The daemon-backed engine store answers any method it does
7
7
  // not implement locally with an async remote call, so a synchronous
@@ -25,10 +25,15 @@ export function useOnboardingStart({
25
25
  store,
26
26
  forceOnboarding,
27
27
  onboardingCompleted,
28
- onboardingStartedRef,
29
28
  setOnboardingActive,
30
29
  openOnboardingAuthStep,
31
30
  }) {
31
+ // Latches the launch so the wizard opens at most once per mount.
32
+ const onboardingStartedRef = useRef(false);
33
+ // openOnboardingAuthStep is rebuilt by the picker factory every render;
34
+ // depending on it would re-run this launch (and cancel its deferred open)
35
+ // on every commit. The launch keys on the gate inputs only.
36
+ // biome-ignore lint/correctness/useExhaustiveDependencies(openOnboardingAuthStep): per-render factory callback; launch keys on gate inputs
32
37
  useEffect(() => {
33
38
  if (onboardingStartedRef.current) return undefined;
34
39
  if (resolveOnboardingCompleted(store, onboardingCompleted) && !forceOnboarding) return undefined;
@@ -41,5 +46,5 @@ export function useOnboardingStart({
41
46
  return () => {
42
47
  canceled = true;
43
48
  };
44
- }, [store, forceOnboarding, onboardingCompleted]);
49
+ }, [store, forceOnboarding, onboardingCompleted, setOnboardingActive]);
45
50
  }
@@ -30,7 +30,16 @@ export function usePanelTransition({
30
30
  if (!hadTransitionClearance) return undefined;
31
31
  const timer = setTimeout(() => setPanelTransitionEpoch((epoch) => epoch + 1), 0);
32
32
  return () => clearTimeout(timer);
33
- }, [panelLayoutSignature, bottomClusterRows, panelTransitionClearRows, panelTransitionGuardRows]);
33
+ }, [
34
+ panelTransitionRef,
35
+ panelCloseInkMaskRowsRef,
36
+ panelLayoutSignature,
37
+ bottomClusterRows,
38
+ panelTransitionClearRows,
39
+ panelTransitionGuardRows,
40
+ setPanelInkMaskEpoch,
41
+ setPanelTransitionEpoch,
42
+ ]);
34
43
  // Record the transcript tail id AFTER every commit so the next render's
35
44
  // spinner-meta-collapse gate (doneTailAppendedThisCommit) can tell a freshly
36
45
  // appended done row from a stale one that was already at the tail.