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
package/src/tui/App.jsx CHANGED
@@ -16,13 +16,15 @@
16
16
  * layout, which <Static> collapses. The terminal handles scrollback itself as
17
17
  * the transcript column grows past the screen height.
18
18
  */
19
- import { useState, useCallback, useEffect, useLayoutEffect, useMemo, useRef } from 'react';
19
+ import { useState, useCallback, useEffect, useMemo, useRef } from 'react';
20
20
  import { useApp, useStdin, useStdout } from 'ink';
21
21
  import { useSession } from './hooks/useSession.mjs';
22
22
  import { pickFolder } from '../standalone/folder-dialog.mjs';
23
- import { deriveSlashPalette } from './app/slash-palette.mjs';
24
- import { createBtwController } from './app/btw-controller.mjs';
25
- import { skillMentionQuery, useSkillMentionSkills } from './app/skill-mention-palette.mjs';
23
+ import { useSlashPalette, useSlashPaletteState } from './app/use-slash-palette.mjs';
24
+ import { useBtwPanel } from './app/use-btw-panel.mjs';
25
+ import { useTuiReady } from './app/use-tui-ready.mjs';
26
+ import { useTranscriptSwapReset } from './app/use-transcript-swap-reset.mjs';
27
+ import { useContextPanelRefresh } from './app/use-context-panel-refresh.mjs';
26
28
  import { shouldSupersedePanelEpoch, supersedePanelEpoch } from './app/panel-epoch.mjs';
27
29
  import { createPanelSurface } from './app/panel-surface.mjs';
28
30
  import { resolvePickerState } from './app/picker-index-mode.mjs';
@@ -50,7 +52,6 @@ import { usePromptQueueHistory } from './app/use-prompt-queue-history.mjs';
50
52
  import { useMessageSelector } from './app/message-selector.mjs';
51
53
  import { useTerminalChrome } from './app/use-terminal-chrome.mjs';
52
54
  import { useTranscriptWindow } from './app/use-transcript-window.mjs';
53
- import { transcriptSwapReturnsToTail } from './app/transcript-window.mjs';
54
55
  import { terminalSize, projectNameFromPath } from './app/app-format.mjs';
55
56
  import { useWorkflowTabCycle } from './app/use-workflow-tab-cycle.mjs';
56
57
  import { createProjectPicker } from './app/project-picker.mjs';
@@ -59,67 +60,25 @@ import { useModelCatalogCache } from './app/use-model-catalog-cache.mjs';
59
60
  import { useDisabledSkills } from './app/use-disabled-skills.mjs';
60
61
  import { resolveOnboardingCompleted, useOnboardingStart } from './app/use-onboarding-start.mjs';
61
62
 
62
- export function App({ store, initialStatusLine = '', forceOnboarding = false, onboardingCompleted = undefined }) {
63
- const state = useSession(store);
64
- const [toolOutputExpanded, setToolOutputExpanded] = useState(false);
65
- // True for the entire first-run onboarding wizard (every step + nested depth)
66
- // so the welcome banner stays reserved and the layout doesn't jump when the
67
- // step pickers mount. Cleared on finish/cancel.
68
- const [onboardingActive, setOnboardingActive] = useState(false);
69
- const { exit } = useApp();
70
- // internal_eventEmitter is ink's parsed-input bus. ink 7 consumes stdin via
71
- // the 'readable' event + stdin.read() (see ink's App.js), draining the buffer
72
- // so a plain stdin.on('data') listener of ours never sees mouse bytes. Instead
73
- // we subscribe to ink's 'input' events, which carry every parsed sequence —
74
- // including raw SGR mouse sequences (\x1b[<…M/m), since ink's input-parser
75
- // passes CSI sequences through untouched and emitInput forwards them verbatim.
76
- const { isRawModeSupported, internal_eventEmitter: inkInput } = useStdin();
77
- const { stdout } = useStdout();
78
- const [exiting, setExiting] = useState(false);
79
- // tuiReady stays false across the first render + commit. A setTimeout(0) in
80
- // the first effect defers the flip until one event-loop poll has drained any
81
- // keystrokes that the OS buffered during terminal setup / initial mount.
82
- const [tuiReady, setTuiReady] = useState(false);
83
- const exitRequestedRef = useRef(false);
84
- const [resizeState, setResizeState] = useState(() => ({ ...terminalSize(stdout), epoch: 0 }));
85
- const [panelTransitionEpoch, setPanelTransitionEpoch] = useState(0);
86
- const [panelInkMaskEpoch, setPanelInkMaskEpoch] = useState(0);
87
- // Keep a universal one-cell margin at the right edge: terminals may clip or
88
- // wrap their final cell, including macOS terminals rendering rounded borders.
89
- const rightSafetyColumns = 1;
90
- const frameColumns = Math.max(1, resizeState.columns - rightSafetyColumns);
91
- const {
92
- scrollOffset,
93
- setScrollOffset,
94
- scrollPositionRef,
95
- scrollTargetRef,
96
- maxScrollRowsRef,
97
- transcriptBottomSlackRowsRef,
98
- transcriptAnchorRef,
99
- transcriptAnchorDirtyRef,
100
- transcriptGeomRef,
101
- measuredRowsVersion,
102
- setMeasuredRowsVersion,
103
- followingRef,
104
- lastItemsCountRef,
105
- lastFirstItemIdRef,
106
- } = useTranscriptScrollState();
63
+ // Statusline band height (bottom rows); mirrors the layout reserve.
64
+ const STATUSLINE_BAND_ROWS = 3;
65
+
66
+ // OWNING LAYER for the raw panel sinks (with app/panel-surface.mjs): the picker
67
+ // and the context/usage panel setters are handed to the surface exactly once
68
+ // and never leave this file. Every panel factory gets `surface` instead, so
69
+ // painting or delegating without a claim that proves ownership is not
70
+ // expressible elsewhere. The surface is stable across renders — the usage
71
+ // generation lives inside it.
72
+ function usePanelOwnership() {
107
73
  // picker = null | { type, title, items, onSelect }
108
74
  // Rendered as an option panel attached directly above the bottom prompt.
109
75
  const pickerOpenedFromEnterRef = useRef(false);
110
76
  const pickerOpenedFromEnterTimerRef = useRef(null);
111
- // Late-bound handle to the project-picker cluster (created after the picker
112
- // and prompt setters exist, below). Referencing it via a ref lets the
113
- // `useState` initializer build the first-mount picker state before the
114
- // factory is instantiated: the factory's onSelect/onKey/onCancel closures
115
- // resolve `projectPicker.current` at call time, not at build time.
116
- const projectPickerRef = useRef(null);
117
- // NOTE: the initial project-picker state CANNOT be built inside this
118
- // useState initializer — it runs before projectPickerRef is populated
119
- // (createProjectPicker below), so buildProjectPickerState would deref null.
120
- // The first-mount build happens as a render-phase update right after the
121
- // factory is instantiated (see initialPickerBuiltRef below), which React
122
- // applies before the first commit — no picker-less flash frame.
77
+ // NOTE: the initial project-picker state is NOT built in this useState
78
+ // initializer — the project-picker factory does not exist yet. The
79
+ // first-mount build happens as a render-phase update right after the factory
80
+ // is instantiated (useProjectPickerBoot), which React applies before the
81
+ // first commit — no picker-less flash frame.
123
82
  const [picker, setPickerState] = useState(null);
124
83
  // Live handle to the current picker state so async callbacks (e.g. the MCP
125
84
  // toggle settle guard in extension-pickers) read the picker actually on
@@ -153,52 +112,41 @@ export function App({ store, initialStatusLine = '', forceOnboarding = false, on
153
112
  livePickerRef.current = picker;
154
113
  const [contextPanel, setContextPanel] = useState(null);
155
114
  const [usagePanel, setUsagePanel] = useState(null);
156
- const [btwPanel, setBtwPanel] = useState(null);
157
- const btwRef = useRef(null);
158
- const sessionIdRef = useRef('');
159
- sessionIdRef.current = state.sessionId || '';
160
- if (!btwRef.current) {
161
- btwRef.current = createBtwController({
162
- getStore: () => store,
163
- setPanel: setBtwPanel,
164
- getSessionId: () => sessionIdRef.current,
165
- });
166
- }
167
- const btw = btwRef.current;
168
- // A side answer belongs to the conversation it was asked in: drop it on a
169
- // session change (new/resume/clear/switch) and cancel it on unmount.
170
- useEffect(() => {
171
- btw.sync();
172
- }, [btw, state.sessionId]);
173
- useEffect(() => () => btw.dispose(), [btw]);
174
- // OWNING LAYER (app/panel-surface.mjs): the three sinks above are handed over
175
- // exactly once and never leave that module. Every panel factory below gets
176
- // `surface` instead, so painting or delegating without a claim that proves
177
- // ownership is not expressible outside this file. Stable across renders — the
178
- // usage generation lives inside it.
179
115
  const surfaceRef = useRef(null);
180
116
  if (!surfaceRef.current) {
181
117
  surfaceRef.current = createPanelSurface({ setPicker, setContextPanel, setUsagePanel });
182
118
  }
183
119
  const surface = surfaceRef.current;
184
- // Cache of the last computed heavy settings-picker status objects (MCP,
185
- // plugins, skills, channel provider). ←/→ cycle/toggle handlers in
186
- // openSettingsPicker() pass { light: true } to reuse this cache instead of
187
- // re-querying these heavy getters on every keystroke; only a full open
188
- // (initial /config or Esc-return) recomputes them.
189
- const settingsHeavyCacheRef = useRef(null);
190
- // Settings build generation: every open/refresh takes a ticket and Esc bumps
191
- // it, so a slow (daemon) snapshot from a superseded build cannot re-open the
192
- // panel after it was closed.
193
- const settingsRequestRef = useRef(0);
194
120
  const closeUsagePanel = useCallback(() => surface.closeUsage(), [surface]);
195
- const [providerPrompt, setProviderPrompt] = useState(null);
196
- const oauthSubmitRef = useRef(false);
197
- const [settingsPrompt, setSettingsPrompt] = useState(null);
198
- // Instantiate the project-picker cluster now that the surface + every prompt
199
- // setter and the usage-panel closer exist. projectPickerRef (declared above,
200
- // before the picker useState) is populated here so first-mount build and all
201
- // later callers resolve the same set of builders.
121
+ return {
122
+ picker,
123
+ setPicker,
124
+ livePickerRef,
125
+ pickerOpenedFromEnterRef,
126
+ pickerOpenedFromEnterTimerRef,
127
+ contextPanel,
128
+ usagePanel,
129
+ surface,
130
+ closeUsagePanel,
131
+ };
132
+ }
133
+
134
+ // Project-picker cluster plus its first-mount entry. The factory's
135
+ // onSelect/onKey/onCancel closures resolve the builders at call time; the
136
+ // initial open goes through projectPickerRef so it reaches the latest ones.
137
+ function useProjectPickerBoot({
138
+ state,
139
+ store,
140
+ surface,
141
+ setProviderPrompt,
142
+ setSettingsPrompt,
143
+ closeUsagePanel,
144
+ setPicker,
145
+ livePickerRef,
146
+ forceOnboarding,
147
+ onboardingCompleted,
148
+ }) {
149
+ const projectPickerRef = useRef(null);
202
150
  const projectPicker = createProjectPicker({
203
151
  state,
204
152
  store,
@@ -221,11 +169,103 @@ export function App({ store, initialStatusLine = '', forceOnboarding = false, on
221
169
  setPicker(projectPicker.buildProjectPickerState({ initialEntry: true, loading: true }));
222
170
  }
223
171
  }
172
+ // biome-ignore lint/correctness/useExhaustiveDependencies(store): a new store re-runs the pending initial open
224
173
  useEffect(() => {
225
174
  if (livePickerRef.current?._projectInitialPending !== true) return;
226
175
  void projectPickerRef.current?.openProjectPicker({ initialEntry: true });
227
- }, [store]);
228
- const { registerProject, enterProject, openProjectPicker } = projectPicker;
176
+ }, [store, livePickerRef]);
177
+ return projectPicker;
178
+ }
179
+
180
+ export function App({ store, initialStatusLine = '', forceOnboarding = false, onboardingCompleted = undefined }) {
181
+ const state = useSession(store);
182
+ const [toolOutputExpanded, setToolOutputExpanded] = useState(false);
183
+ // True for the entire first-run onboarding wizard (every step + nested depth)
184
+ // so the welcome banner stays reserved and the layout doesn't jump when the
185
+ // step pickers mount. Cleared on finish/cancel.
186
+ const [onboardingActive, setOnboardingActive] = useState(false);
187
+ const { exit } = useApp();
188
+ // internal_eventEmitter is ink's parsed-input bus. ink 7 consumes stdin via
189
+ // the 'readable' event + stdin.read() (see ink's App.js), draining the buffer
190
+ // so a plain stdin.on('data') listener of ours never sees mouse bytes. Instead
191
+ // we subscribe to ink's 'input' events, which carry every parsed sequence —
192
+ // including raw SGR mouse sequences (\x1b[<…M/m), since ink's input-parser
193
+ // passes CSI sequences through untouched and emitInput forwards them verbatim.
194
+ const { isRawModeSupported, internal_eventEmitter: inkInput } = useStdin();
195
+ const { stdout } = useStdout();
196
+ const [exiting, setExiting] = useState(false);
197
+ const exitRequestedRef = useRef(false);
198
+ const [resizeState, setResizeState] = useState(() => ({ ...terminalSize(stdout), epoch: 0 }));
199
+ const [panelTransitionEpoch, setPanelTransitionEpoch] = useState(0);
200
+ const [panelInkMaskEpoch, setPanelInkMaskEpoch] = useState(0);
201
+ // Keep a universal one-cell margin at the right edge: terminals may clip or
202
+ // wrap their final cell, including macOS terminals rendering rounded borders.
203
+ const rightSafetyColumns = 1;
204
+ const frameColumns = Math.max(1, resizeState.columns - rightSafetyColumns);
205
+ const {
206
+ scrollOffset,
207
+ setScrollOffset,
208
+ scrollPositionRef,
209
+ scrollTargetRef,
210
+ maxScrollRowsRef,
211
+ transcriptBottomSlackRowsRef,
212
+ transcriptAnchorRef,
213
+ transcriptAnchorDirtyRef,
214
+ transcriptGeomRef,
215
+ measuredRowsVersion,
216
+ setMeasuredRowsVersion,
217
+ followingRef,
218
+ lastItemsCountRef,
219
+ lastFirstItemIdRef,
220
+ } = useTranscriptScrollState();
221
+ // Picker + context/usage panels and the surface that owns them (owning layer).
222
+ const {
223
+ picker,
224
+ setPicker,
225
+ livePickerRef,
226
+ pickerOpenedFromEnterRef,
227
+ pickerOpenedFromEnterTimerRef,
228
+ contextPanel,
229
+ usagePanel,
230
+ surface,
231
+ closeUsagePanel,
232
+ } = usePanelOwnership();
233
+ // /btw side-question panel + controller lifecycle: app/use-btw-panel.mjs.
234
+ const { btwPanel, btw } = useBtwPanel({ store, sessionId: state.sessionId });
235
+ // Cache of the last computed heavy settings-picker status objects (MCP,
236
+ // plugins, skills, channel provider). ←/→ cycle/toggle handlers in
237
+ // openSettingsPicker() pass { light: true } to reuse this cache instead of
238
+ // re-querying these heavy getters on every keystroke; only a full open
239
+ // (initial /config or Esc-return) recomputes them.
240
+ const settingsHeavyCacheRef = useRef(null);
241
+ // Settings build generation: every open/refresh takes a ticket and Esc bumps
242
+ // it, so a slow (daemon) snapshot from a superseded build cannot re-open the
243
+ // panel after it was closed.
244
+ const settingsRequestRef = useRef(0);
245
+ // The open Settings panel's re-read (null-op once another panel took over or
246
+ // it closed): a settings change applied by the runtime (any writer) or the
247
+ // setup tool repaints it.
248
+ const settingsLiveRefreshRef = useRef(null);
249
+ useEffect(() => {
250
+ if (state.setupChanged) settingsLiveRefreshRef.current?.();
251
+ }, [state.setupChanged]);
252
+ const [providerPrompt, setProviderPrompt] = useState(null);
253
+ const oauthSubmitRef = useRef(false);
254
+ const [settingsPrompt, setSettingsPrompt] = useState(null);
255
+ // Project-picker cluster, instantiated now that the surface + every prompt
256
+ // setter and the usage-panel closer exist, plus its first-mount entry.
257
+ const { registerProject, enterProject, openProjectPicker } = useProjectPickerBoot({
258
+ state,
259
+ store,
260
+ surface,
261
+ setProviderPrompt,
262
+ setSettingsPrompt,
263
+ closeUsagePanel,
264
+ setPicker,
265
+ livePickerRef,
266
+ forceOnboarding,
267
+ onboardingCompleted,
268
+ });
229
269
  // Disabled-Skill set (async load + persist on change):
230
270
  // app/use-disabled-skills.mjs.
231
271
  const { disabledSkills, setDisabledSkills } = useDisabledSkills({ store });
@@ -287,11 +327,10 @@ export function App({ store, initialStatusLine = '', forceOnboarding = false, on
287
327
  welcomePromptHintVisibleRef,
288
328
  dismissWelcomePromptHint,
289
329
  } = useWelcomePromptHint({ store, state, toastErrorSignature });
290
- const [slashIndex, setSlashIndex] = useState(0);
291
- const [slashDismissedFor, setSlashDismissedFor] = useState('');
292
- const slashPaletteRef = useRef({ open: false, count: 0 });
330
+ // Slash palette index / dismissal state: app/use-slash-palette.mjs.
331
+ const { slashIndex, setSlashIndex, slashDismissedFor, setSlashDismissedFor, slashPaletteRef } =
332
+ useSlashPaletteState();
293
333
  const scrollFocusRef = useRef({});
294
- const onboardingStartedRef = useRef(false);
295
334
  const onboardingRef = useRef({
296
335
  defaultRoute: null,
297
336
  webSearchRoute: null,
@@ -339,6 +378,7 @@ export function App({ store, initialStatusLine = '', forceOnboarding = false, on
339
378
  onboardingPrefetchSeqRef,
340
379
  settingsHeavyCacheRef,
341
380
  settingsRequestRef,
381
+ settingsLiveRefreshRef,
342
382
  livePickerRef,
343
383
  disabledSkills,
344
384
  setDisabledSkills,
@@ -365,7 +405,6 @@ export function App({ store, initialStatusLine = '', forceOnboarding = false, on
365
405
  selectionTextRef,
366
406
  lastClickRef,
367
407
  } = useInteractionRefs();
368
- const STATUSLINE_BAND_ROWS = 3;
369
408
  const promptContentColumns = Math.max(1, frameColumns - 4);
370
409
  // Prompt + text-entry layout rows: app/use-prompt-layout-rows.mjs.
371
410
  const syncPromptLayoutRows = usePromptLayoutRows({
@@ -377,14 +416,8 @@ export function App({ store, initialStatusLine = '', forceOnboarding = false, on
377
416
  setTextEntryLayoutRows,
378
417
  });
379
418
 
380
- // ── Post-mount input gate ──────────────────────────────────────────────
381
- // Let one event-loop poll pass so Ink processes (and discards, because
382
- // PromptInput is still disabled) any keystrokes queued during boot/first
383
- // render. After the tick, enable the input — new keystrokes land normally.
384
- useEffect(() => {
385
- const timer = setTimeout(() => setTuiReady(true), 0);
386
- return () => clearTimeout(timer);
387
- }, []);
419
+ // Post-mount input gate: app/use-tui-ready.mjs.
420
+ const tuiReady = useTuiReady();
388
421
 
389
422
  // Resize debounce + extended-keyboard enable: app/use-terminal-chrome.mjs.
390
423
  useTerminalChrome({ stdout, isRawModeSupported, setResizeState });
@@ -471,23 +504,8 @@ export function App({ store, initialStatusLine = '', forceOnboarding = false, on
471
504
  clearStitchBuffer,
472
505
  });
473
506
 
474
- // Item-count changes never infer follow permission from scrollTarget=0. A
475
- // first read-back input can be waiting one frame for committed row geometry;
476
- // only prompt submit, session reset, or an explicit return to bottom arms
477
- // follow. Pure streaming height growth is handled in the row-delta effect.
478
- useLayoutEffect(() => {
479
- const count = state.items.length;
480
- const previousCount = lastItemsCountRef.current;
481
- lastItemsCountRef.current = count;
482
- const firstId = count > 0 ? (state.items[0]?.id ?? null) : null;
483
- const previousFirstId = lastFirstItemIdRef.current;
484
- lastFirstItemIdRef.current = firstId;
485
- // A bulk swap (compaction included) is an explicit return to the tail: the
486
- // rows the reader was anchored to no longer exist.
487
- if (transcriptSwapReturnsToTail({ count, previousCount, firstId, previousFirstId })) {
488
- resetTranscriptScroll();
489
- }
490
- }, [state.items, resetTranscriptScroll]);
507
+ // Bulk transcript swap → back to the tail: app/use-transcript-swap-reset.mjs.
508
+ useTranscriptSwapReset({ items: state.items, lastItemsCountRef, lastFirstItemIdRef, resetTranscriptScroll });
491
509
 
492
510
  // Exit + queued-restore + prompt history: app/use-prompt-queue-history.mjs.
493
511
  const { requestExit, restoreQueuedToPrompt, recentPromptHistory, resetPromptHistoryNav } = usePromptQueueHistory({
@@ -594,31 +612,14 @@ export function App({ store, initialStatusLine = '', forceOnboarding = false, on
594
612
  closeUsagePanel,
595
613
  });
596
614
 
597
- useEffect(() => {
598
- if (contextPanel?.kind === 'context') openContextPicker();
599
- }, [
600
- contextPanel?.kind,
601
- state.stats,
602
- state.contextWindow,
603
- state.rawContextWindow,
604
- state.sessionId,
605
- state.toolMode,
606
- state.agentWorkers,
607
- state.agentJobs,
608
- state.provider,
609
- state.model,
610
- state.effort,
611
- state.fast,
612
- state.cwd,
613
- state.clientHostPid,
614
- ]);
615
+ // Open /context breakdown stays current: app/use-context-panel-refresh.mjs.
616
+ useContextPanelRefresh({ contextPanelKind: contextPanel?.kind, state, openContextPicker });
615
617
 
616
618
  // First-run onboarding wizard launch: app/use-onboarding-start.mjs.
617
619
  useOnboardingStart({
618
620
  store,
619
621
  forceOnboarding,
620
622
  onboardingCompleted,
621
- onboardingStartedRef,
622
623
  setOnboardingActive,
623
624
  openOnboardingAuthStep,
624
625
  });
@@ -652,8 +653,14 @@ export function App({ store, initialStatusLine = '', forceOnboarding = false, on
652
653
  pastedTextsRef,
653
654
  });
654
655
 
655
- const mentionSkills = useSkillMentionSkills(store, skillMentionQuery(promptDraft, promptCaret) !== null);
656
- const { activeSlashQuery, slashCommands, slashPaletteOpen, paletteKind } = deriveSlashPalette({
656
+ // Slash / `$skill` palette for this render: app/use-slash-palette.mjs.
657
+ const { activeSlashQuery, slashCommands, slashPaletteOpen, paletteKind } = useSlashPalette({
658
+ store,
659
+ slashPaletteRef,
660
+ setSlashIndex,
661
+ slashDismissedFor,
662
+ promptDraft,
663
+ promptCaret,
657
664
  providerPrompt,
658
665
  settingsPrompt,
659
666
  toolApproval,
@@ -662,12 +669,7 @@ export function App({ store, initialStatusLine = '', forceOnboarding = false, on
662
669
  picker,
663
670
  exiting,
664
671
  commandBusy: state.commandBusy,
665
- promptDraft,
666
- slashDismissedFor,
667
- skills: mentionSkills,
668
- promptCaret,
669
672
  });
670
- slashPaletteRef.current = { open: slashPaletteOpen, count: slashCommands.length };
671
673
  scrollFocusRef.current = {
672
674
  slashPaletteOpen,
673
675
  picker: !!picker,
@@ -679,10 +681,6 @@ export function App({ store, initialStatusLine = '', forceOnboarding = false, on
679
681
  settingsPrompt: !!settingsPrompt,
680
682
  };
681
683
 
682
- useEffect(() => {
683
- setSlashIndex((index) => Math.min(index, Math.max(0, slashCommands.length - 1)));
684
- }, [slashCommands.length, activeSlashQuery]);
685
-
686
684
  // Draft/slash flow (draft sync, prompt cancels, palette accept/cancel):
687
685
  // app/use-prompt-draft-flow.mjs.
688
686
  const {
@@ -124,6 +124,7 @@ function renderPicker({
124
124
  onHighlight={picker.onHighlight}
125
125
  title={picker.title}
126
126
  description={picker.description}
127
+ detail={picker.detail}
127
128
  footer={picker.footer}
128
129
  footerGapRows={picker.footerGapRows}
129
130
  help={picker.help}
@@ -159,6 +160,7 @@ export function renderFloatingPanel(ctx) {
159
160
  slashCommands,
160
161
  slashIndex,
161
162
  slashPaletteOpen,
163
+ textEntryUrlMaxRows,
162
164
  toolApproval,
163
165
  usagePanel,
164
166
  btwPanel,
@@ -212,6 +214,7 @@ export function renderFloatingPanel(ctx) {
212
214
  title={title}
213
215
  hint={hint}
214
216
  detail={providerPrompt.detail || ''}
217
+ urlMaxRows={textEntryUrlMaxRows}
215
218
  mask={providerPrompt.kind === 'api-key' || providerPrompt.kind === 'openai-usage-session'}
216
219
  columns={frameColumns}
217
220
  // Restored after a REJECTED daemon save so the entered secret
@@ -17,6 +17,7 @@ export function providerPromptFields(providerPrompt) {
17
17
  providerPrompt.envName ? `Env: ${providerPrompt.envName}` : '',
18
18
  providerPrompt.source ? `Current: ${providerPrompt.source}` : '',
19
19
  providerPrompt.keyUrl ? `Get a key: ${providerPrompt.keyUrl}` : '',
20
+ providerPrompt.hint || '',
20
21
  'Stored in the OS keychain.',
21
22
  ]
22
23
  .filter(Boolean)
@@ -47,7 +47,7 @@ const LINUX_CLIPBOARD_HINT =
47
47
  'install wl-clipboard (Wayland) or xclip (X11), for example `sudo apt install wl-clipboard xclip`';
48
48
 
49
49
  /** A clipboard helper that is not installed, named with the package to add. */
50
- export function clipboardHelperError(cmd, error) {
50
+ function clipboardHelperError(cmd, error) {
51
51
  if (error?.code !== 'ENOENT' || process.platform !== 'linux') return error;
52
52
  return new Error(`${cmd} is not installed; ${LINUX_CLIPBOARD_HINT}`);
53
53
  }
@@ -71,11 +71,21 @@ function nativeClipboardCommand(text) {
71
71
  };
72
72
  }
73
73
  if (process.platform === 'darwin') return { cmd: 'pbcopy', args: [], input: value };
74
+ // WAYLAND_DISPLAY is the variable a Wayland client connects by; set means a
75
+ // Wayland session. A helper that is not installed fails with ENOENT, which
76
+ // clipboardHelperError turns into the install hint.
74
77
  if (process.env.WAYLAND_DISPLAY) return { cmd: 'wl-copy', args: [], input: value };
75
78
  return { cmd: 'xclip', args: ['-selection', 'clipboard'], input: value };
76
79
  }
77
80
 
78
- export function copyToClipboard(text) {
81
+ /**
82
+ * Resolves 'copied' once a native helper confirmed the write, or 'terminal' when
83
+ * only OSC 52 was emitted (the terminal may ignore it, so it is unconfirmed).
84
+ * Rejects when no path was available. By default a successful OSC 52 resolves
85
+ * at once without awaiting the helper; `confirm` waits for the helper so the
86
+ * caller can tell which of the two happened.
87
+ */
88
+ export function copyToClipboard(text, { confirm = false } = {}) {
79
89
  const value = String(text ?? '');
80
90
  const wroteOsc52 = writeOsc52Clipboard(value);
81
91
  // When OSC 52 already wrote the clipboard, fire-and-forget the native helper
@@ -84,24 +94,25 @@ export function copyToClipboard(text) {
84
94
  // skipped (payload too large), the native helper is the ONLY writer, so we
85
95
  // must await its exit to report real success/failure instead of a false
86
96
  // "copied" hint.
97
+ const waitForHelper = !wroteOsc52 || confirm;
87
98
  return new Promise((resolve, reject) => {
99
+ // A helper failure only matters when OSC 52 did not cover us.
100
+ const helperFailed = (error) => (wroteOsc52 ? resolve('terminal') : reject(error));
88
101
  const { cmd, args, input } = nativeClipboardCommand(value);
89
102
  let child;
90
103
  try {
91
104
  child = spawn(cmd, args, { stdio: ['pipe', 'ignore', 'ignore'], windowsHide: true });
92
105
  } catch (e) {
93
- if (wroteOsc52) resolve();
94
- else reject(clipboardHelperError(cmd, e));
106
+ helperFailed(clipboardHelperError(cmd, e));
95
107
  return;
96
108
  }
97
109
  child.on('error', (e) => {
98
- // Surface only if OSC 52 didn't cover us; otherwise the copy still landed.
99
- if (!wroteOsc52) reject(clipboardHelperError(cmd, e));
110
+ if (waitForHelper) helperFailed(clipboardHelperError(cmd, e));
100
111
  });
101
- if (!wroteOsc52) {
112
+ if (waitForHelper) {
102
113
  child.on('close', (code) => {
103
- if (code === 0) resolve();
104
- else reject(new Error(`${cmd} exited with code ${code}`));
114
+ if (code === 0) resolve('copied');
115
+ else helperFailed(new Error(`${cmd} exited with code ${code}`));
105
116
  });
106
117
  }
107
118
  child.stdin.on('error', () => {
@@ -109,9 +120,9 @@ export function copyToClipboard(text) {
109
120
  });
110
121
  child.stdin.end(input);
111
122
  // OSC 52 covered us: resolve now, don't await the child's exit.
112
- if (wroteOsc52) {
123
+ if (!waitForHelper) {
113
124
  child.unref?.();
114
- resolve();
125
+ resolve('terminal');
115
126
  }
116
127
  });
117
128
  }
@@ -47,6 +47,7 @@ export function createAppPickers({
47
47
  onboardingPrefetchSeqRef,
48
48
  settingsHeavyCacheRef,
49
49
  settingsRequestRef,
50
+ settingsLiveRefreshRef,
50
51
  livePickerRef,
51
52
  disabledSkills,
52
53
  setDisabledSkills,
@@ -180,6 +181,7 @@ export function createAppPickers({
180
181
  setSettingsPrompt,
181
182
  settingsHeavyCacheRef,
182
183
  settingsRequestRef,
184
+ settingsLiveRefreshRef,
183
185
  formatDuration,
184
186
  displayModelName,
185
187
  routeModelLabel,
@@ -23,10 +23,10 @@ import { dirname, join } from 'node:path';
23
23
  import { fileURLToPath } from 'node:url';
24
24
 
25
25
  const GLYPH = { ok: '✓', warn: '⚠', fail: '✗' };
26
- export const DOCTOR_CHECK_TIMEOUT_MS = 8000;
26
+ const DOCTOR_CHECK_TIMEOUT_MS = 8000;
27
27
  // Per-process log siblings are pruned by the channel worker; far above its
28
28
  // cap means pruning is not running.
29
- export const DOCTOR_LOG_FILE_WARN = 300;
29
+ const DOCTOR_LOG_FILE_WARN = 300;
30
30
 
31
31
  // Only the stable ^major.minor.patch and >=major.minor.patch alternatives
32
32
  // used by our Node engine contract are supported. Fail open to "unverified",
@@ -20,7 +20,7 @@ export const PANEL_LAYOUT_SIG = {
20
20
  // Queued steering band rows (full wrapped height, see queuedBandRows).
21
21
  QUEUED: 10,
22
22
  };
23
- export const PROJECT_TEXT_ENTRY_KINDS = new Set(['project-new', 'project-create-confirm', 'project-rename']);
23
+ const PROJECT_TEXT_ENTRY_KINDS = new Set(['project-new', 'project-create-confirm', 'project-rename']);
24
24
  export const CORE_MULTILINE_TEXT_ENTRY_KINDS = new Set(['core-add', 'core-edit']);
25
25
 
26
26
  export function panelSignatureFlags(signature) {
@@ -26,6 +26,6 @@ export function usePromptHistoryNavigation({
26
26
  if (outcome.draftChanged) promptHistoryDraftChangeRef.current = true;
27
27
  return outcome.value;
28
28
  },
29
- [recentPromptHistory, resetPromptHistoryNav, clearPromptHint]
29
+ [promptHistoryNavRef, promptHistoryDraftChangeRef, recentPromptHistory, resetPromptHistoryNav, clearPromptHint]
30
30
  );
31
31
  }
@@ -47,6 +47,9 @@ export function usePromptInterrupt({
47
47
  [store, promptValueRef, restoreAttachments, clearPromptHint, syncPromptLayoutRows, setPromptDraftOverride]
48
48
  );
49
49
 
50
+ // `busy` is the trigger, not a read: a parked restore re-checks the store
51
+ // each time the turn's busy flag flips.
52
+ // biome-ignore lint/correctness/useExhaustiveDependencies(busy): busy-flip trigger for the parked restore
50
53
  useEffect(() => {
51
54
  const pending = pendingRestoreRef.current;
52
55
  if (!pending) return;
@@ -36,7 +36,9 @@ function saveApiKey(ctx, target, commandText) {
36
36
  requiredNotice: `API key is required for ${target.providerId}`,
37
37
  busyNotice: 'API key is already being saved',
38
38
  method: 'saveProviderApiKey',
39
- args: [target.providerId, commandText],
39
+ args: target.authMode
40
+ ? [target.providerId, commandText, { authMode: target.authMode }]
41
+ : [target.providerId, commandText],
40
42
  onSaved: () => ctx.clearModelCaches('all'),
41
43
  failurePrefix: 'api key save failed',
42
44
  });