mixdog 0.9.172 → 0.9.173

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 (623) hide show
  1. package/package.json +3 -3
  2. package/scripts/code-graph-description-contract.mjs +1 -2
  3. package/scripts/context-renewal-live-check.mjs +1 -1
  4. package/scripts/coverage-query.mjs +27 -0
  5. package/scripts/generate-runtime-manifest.mjs +12 -16
  6. package/scripts/graph-parity.mjs +108 -75
  7. package/scripts/lib/coverage.mjs +309 -0
  8. package/scripts/lib/embedding-model-bench-core.mjs +4 -2
  9. package/scripts/lib/recall-bench-eval.mjs +4 -4
  10. package/scripts/lib/run-node-tests.mjs +137 -13
  11. package/scripts/lib/test-failure-records.mjs +46 -0
  12. package/scripts/lib/test-failure-summary.mjs +59 -0
  13. package/scripts/lib/test-summary-reporter.mjs +7 -3
  14. package/scripts/mouse-probe.mjs +1 -3
  15. package/scripts/office/build-pptx-icons.mjs +0 -1
  16. package/scripts/perf/transcript-runtime-probe.mjs +20 -4
  17. package/scripts/pg-memory-diet.mjs +2 -4
  18. package/scripts/routing-corpus.mjs +0 -2
  19. package/scripts/session-diag.mjs +0 -7
  20. package/scripts/session-sweep.mjs +102 -56
  21. package/scripts/test.mjs +113 -37
  22. package/scripts/tui-frame-harness.mjs +1 -1
  23. package/src/app.mjs +79 -74
  24. package/src/cli.mjs +0 -2
  25. package/src/defaults/skills/browser-use/SKILL.md +8 -6
  26. package/src/defaults/skills/code-tidy/SKILL.md +67 -17
  27. package/src/defaults/skills/code-tidy/references/agent-cleanup.md +26 -3
  28. package/src/defaults/skills/computer-use/SKILL.md +12 -5
  29. package/src/defaults/skills/goal-management/SKILL.md +16 -9
  30. package/src/defaults/skills/pdf/SKILL.md +2 -1
  31. package/src/defaults/skills/xlsx/SKILL.md +3 -3
  32. package/src/headless-exec.mjs +1 -2
  33. package/src/help.mjs +2 -2
  34. package/src/lib/rules-builder.cjs +0 -23
  35. package/src/repl/slash-commands.mjs +1 -5
  36. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/turn.mjs +4 -4
  37. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +25 -41
  38. package/src/runtime/agent/orchestrator/agent-trace-format.mjs +25 -24
  39. package/src/runtime/agent/orchestrator/agent-trace-io.mjs +15 -22
  40. package/src/runtime/agent/orchestrator/agent-trace.mjs +0 -22
  41. package/src/runtime/agent/orchestrator/config-providers-merge.mjs +56 -0
  42. package/src/runtime/agent/orchestrator/config.mjs +34 -76
  43. package/src/runtime/agent/orchestrator/context/role-instructions.mjs +1 -1
  44. package/src/runtime/agent/orchestrator/providers/admission-scheduler.mjs +40 -39
  45. package/src/runtime/agent/orchestrator/providers/anthropic-api-recovery.mjs +75 -0
  46. package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +152 -0
  47. package/src/runtime/agent/orchestrator/providers/anthropic-api-transport.mjs +168 -0
  48. package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +2 -1
  49. package/src/runtime/agent/orchestrator/providers/anthropic-midstream-recovery.mjs +248 -0
  50. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-midstream.mjs +16 -206
  51. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-recovery.mjs +11 -63
  52. package/src/runtime/agent/orchestrator/providers/anthropic-recovery-guards.mjs +86 -0
  53. package/src/runtime/agent/orchestrator/providers/anthropic-turn-result.mjs +88 -0
  54. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +87 -591
  55. package/src/runtime/agent/orchestrator/providers/antigravity-oauth.mjs +32 -288
  56. package/src/runtime/agent/orchestrator/providers/antigravity-response.mjs +101 -0
  57. package/src/runtime/agent/orchestrator/providers/antigravity-stream.mjs +161 -0
  58. package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +114 -0
  59. package/src/runtime/agent/orchestrator/providers/gemini-cache-policy.mjs +266 -0
  60. package/src/runtime/agent/orchestrator/providers/gemini-request-body.mjs +54 -0
  61. package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +145 -0
  62. package/src/runtime/agent/orchestrator/providers/gemini-schema.mjs +56 -39
  63. package/src/runtime/agent/orchestrator/providers/gemini-sdk-request.mjs +107 -0
  64. package/src/runtime/agent/orchestrator/providers/gemini.mjs +23 -533
  65. package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +10 -4
  66. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +83 -32
  67. package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +41 -25
  68. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-outcome.mjs +4 -98
  69. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-stamps.mjs +114 -0
  70. package/src/runtime/agent/orchestrator/providers/openai-oauth-dispatch.mjs +258 -0
  71. package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +48 -214
  72. package/src/runtime/agent/orchestrator/providers/openai-responses-input.mjs +80 -60
  73. package/src/runtime/agent/orchestrator/providers/openai-ws-handshake.mjs +108 -0
  74. package/src/runtime/agent/orchestrator/providers/openai-ws-pool.mjs +8 -87
  75. package/src/runtime/agent/orchestrator/providers/openai-ws-send-outcome.mjs +52 -293
  76. package/src/runtime/agent/orchestrator/providers/openai-ws-send-trace.mjs +316 -0
  77. package/src/runtime/agent/orchestrator/providers/opencode-go-usage.mjs +76 -253
  78. package/src/runtime/agent/orchestrator/session/cache/scoped-cache.mjs +1 -7
  79. package/src/runtime/agent/orchestrator/session/compact/budget.mjs +17 -16
  80. package/src/runtime/agent/orchestrator/session/compact/runner.mjs +6 -4
  81. package/src/runtime/agent/orchestrator/session/compact/summary-schema.mjs +1 -1
  82. package/src/runtime/agent/orchestrator/session/context-compaction-policy.mjs +9 -13
  83. package/src/runtime/agent/orchestrator/session/context-utils.mjs +1 -2
  84. package/src/runtime/agent/orchestrator/session/evidence-union.mjs +6 -9
  85. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +2 -3
  86. package/src/runtime/agent/orchestrator/session/loop/diagnostics.mjs +1 -8
  87. package/src/runtime/agent/orchestrator/session/loop/tool-classify.mjs +1 -3
  88. package/src/runtime/agent/orchestrator/session/loop/tool-exec/call-prep.mjs +1 -5
  89. package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +0 -1
  90. package/src/runtime/agent/orchestrator/session/manager/ask-turn-loop-options.mjs +4 -55
  91. package/src/runtime/agent/orchestrator/session/manager/ask-turn-steering-drain.mjs +63 -0
  92. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +1 -1
  93. package/src/runtime/agent/orchestrator/session/manager/foreign-pending-messages.mjs +80 -65
  94. package/src/runtime/agent/orchestrator/session/manager/pending-claim-ledger.mjs +68 -0
  95. package/src/runtime/agent/orchestrator/session/manager/pending-delivered-ledger.mjs +56 -0
  96. package/src/runtime/agent/orchestrator/session/manager/pending-lifecycle-epoch.mjs +84 -0
  97. package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +51 -651
  98. package/src/runtime/agent/orchestrator/session/manager/pending-persist-queue.mjs +264 -0
  99. package/src/runtime/agent/orchestrator/session/manager/pending-spool-file.mjs +131 -0
  100. package/src/runtime/agent/orchestrator/session/manager/pending-spool-sweep.mjs +73 -0
  101. package/src/runtime/agent/orchestrator/session/manager/prepared-resume-cache.mjs +122 -0
  102. package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +2 -1
  103. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +5 -4
  104. package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +60 -35
  105. package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +3 -2
  106. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +22 -646
  107. package/src/runtime/agent/orchestrator/session/manager/session-owner-liveness.mjs +135 -0
  108. package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +150 -0
  109. package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +154 -0
  110. package/src/runtime/agent/orchestrator/session/manager/session-tool-surface.mjs +135 -0
  111. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +4 -11
  112. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +0 -6
  113. package/src/runtime/agent/orchestrator/session/manager/usage-metrics.mjs +1 -3
  114. package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +11 -12
  115. package/src/runtime/agent/orchestrator/session/provider-prefix-guard.mjs +23 -32
  116. package/src/runtime/agent/orchestrator/session/store/lifecycle-barriers.mjs +275 -0
  117. package/src/runtime/agent/orchestrator/session/store/lifecycle-read.mjs +67 -0
  118. package/src/runtime/agent/orchestrator/session/store/listing.mjs +1 -1
  119. package/src/runtime/agent/orchestrator/session/store/live-cache-eviction.mjs +72 -0
  120. package/src/runtime/agent/orchestrator/session/store/liveness-veto.mjs +53 -0
  121. package/src/runtime/agent/orchestrator/session/store/load-session.mjs +60 -0
  122. package/src/runtime/agent/orchestrator/session/store/pending-saves.mjs +55 -0
  123. package/src/runtime/agent/orchestrator/session/store/serialize.mjs +7 -15
  124. package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +149 -0
  125. package/src/runtime/agent/orchestrator/session/store/session-observers.mjs +55 -0
  126. package/src/runtime/agent/orchestrator/session/store/write-admission.mjs +108 -0
  127. package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +531 -0
  128. package/src/runtime/agent/orchestrator/session/store-summary-archived-agent.mjs +126 -0
  129. package/src/runtime/agent/orchestrator/session/store-summary-fields.mjs +24 -0
  130. package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +2 -10
  131. package/src/runtime/agent/orchestrator/session/store-summary-locations.mjs +46 -0
  132. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +11 -791
  133. package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +126 -0
  134. package/src/runtime/agent/orchestrator/session/store.mjs +33 -771
  135. package/src/runtime/agent/orchestrator/session/tool-batch/finalize.mjs +1 -1
  136. package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +13 -7
  137. package/src/runtime/agent/orchestrator/stable-hash-stringify.mjs +10 -0
  138. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +50 -75
  139. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +2 -1
  140. package/src/runtime/agent/orchestrator/tools/builtin/cache-layers.mjs +22 -21
  141. package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +0 -2
  142. package/src/runtime/agent/orchestrator/tools/builtin/git-command-policy.mjs +44 -27
  143. package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +36 -54
  144. package/src/runtime/agent/orchestrator/tools/builtin/git-partial-stage.mjs +8 -5
  145. package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-context-expander.mjs +8 -5
  146. package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-output.mjs +18 -9
  147. package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-request.mjs +2 -3
  148. package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-single-file-rescue.mjs +80 -67
  149. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-task-output.mjs +12 -4
  150. package/src/runtime/agent/orchestrator/tools/builtin/native-search-client.mjs +1 -4
  151. package/src/runtime/agent/orchestrator/tools/builtin/path-diagnostics.mjs +61 -72
  152. package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +0 -5
  153. package/src/runtime/agent/orchestrator/tools/builtin/read-office-files.mjs +3 -3
  154. package/src/runtime/agent/orchestrator/tools/builtin/read-range-index.mjs +11 -14
  155. package/src/runtime/agent/orchestrator/tools/builtin/read-single-render.mjs +3 -6
  156. package/src/runtime/agent/orchestrator/tools/builtin/read-special-files.mjs +1 -2
  157. package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +124 -94
  158. package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-dispatch.mjs +6 -3
  159. package/src/runtime/agent/orchestrator/tools/builtin/read-tool/reach-preflight.mjs +1 -1
  160. package/src/runtime/agent/orchestrator/tools/builtin/read-tool.mjs +1 -1
  161. package/src/runtime/agent/orchestrator/tools/builtin/read-windows.mjs +2 -2
  162. package/src/runtime/agent/orchestrator/tools/builtin/search-builders.mjs +1 -1
  163. package/src/runtime/agent/orchestrator/tools/builtin/search-glob-tool.mjs +6 -6
  164. package/src/runtime/agent/orchestrator/tools/builtin/search-grep-tool.mjs +2 -2
  165. package/src/runtime/agent/orchestrator/tools/builtin/shell-analysis.mjs +21 -35
  166. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +0 -3
  167. package/src/runtime/agent/orchestrator/tools/builtin/shell-lossless-compact.mjs +1 -3
  168. package/src/runtime/agent/orchestrator/tools/builtin/shell-output.mjs +1 -1
  169. package/src/runtime/agent/orchestrator/tools/builtin/shell-runtime.mjs +0 -2
  170. package/src/runtime/agent/orchestrator/tools/builtin/task-tool.mjs +4 -3
  171. package/src/runtime/agent/orchestrator/tools/builtin/text-stats.mjs +6 -3
  172. package/src/runtime/agent/orchestrator/tools/builtin.mjs +0 -4
  173. package/src/runtime/agent/orchestrator/tools/code-graph/aggregate-roots.mjs +7 -7
  174. package/src/runtime/agent/orchestrator/tools/code-graph/ast-calls.mjs +0 -3
  175. package/src/runtime/agent/orchestrator/tools/code-graph/build-file-infos.mjs +182 -0
  176. package/src/runtime/agent/orchestrator/tools/code-graph/build.mjs +14 -159
  177. package/src/runtime/agent/orchestrator/tools/code-graph/constants.mjs +2 -3
  178. package/src/runtime/agent/orchestrator/tools/code-graph/dispatch.mjs +21 -8
  179. package/src/runtime/agent/orchestrator/tools/code-graph/graph-binary.mjs +0 -3
  180. package/src/runtime/agent/orchestrator/tools/code-graph/search-references.mjs +5 -3
  181. package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +2 -3
  182. package/src/runtime/agent/orchestrator/tools/code-graph/symbol-index.mjs +1 -2
  183. package/src/runtime/agent/orchestrator/tools/code-graph/text-mask.golden.json +1 -1
  184. package/src/runtime/agent/orchestrator/tools/code-graph/text-mask.mjs +0 -1
  185. package/src/runtime/agent/orchestrator/tools/graph-manifest.json +11 -11
  186. package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +1 -1
  187. package/src/runtime/agent/orchestrator/tools/lib/shell-warm-standby.mjs +1 -1
  188. package/src/runtime/agent/orchestrator/tools/patch/dispatch.mjs +3 -6
  189. package/src/runtime/agent/orchestrator/tools/patch/mutation-output.mjs +1 -1
  190. package/src/runtime/agent/orchestrator/tools/patch/native-server.mjs +25 -39
  191. package/src/runtime/agent/orchestrator/tools/patch/parsing.mjs +9 -14
  192. package/src/runtime/agent/orchestrator/tools/patch/paths.mjs +11 -6
  193. package/src/runtime/agent/orchestrator/tools/patch/replay-capture.mjs +5 -6
  194. package/src/runtime/agent/orchestrator/tools/patch/text-lines.mjs +4 -4
  195. package/src/runtime/agent/orchestrator/tools/patch/v4a-anchors.mjs +10 -7
  196. package/src/runtime/agent/orchestrator/tools/patch/v4a-convert.mjs +20 -30
  197. package/src/runtime/agent/orchestrator/tools/patch/v4a-windows.mjs +4 -19
  198. package/src/runtime/agent/orchestrator/tools/patch/wave.mjs +13 -2
  199. package/src/runtime/agent/orchestrator/tools/patch.mjs +0 -19
  200. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +60 -36
  201. package/src/runtime/agent/orchestrator/tools/shell-exec-output.mjs +0 -4
  202. package/src/runtime/agent/orchestrator/tools/shell-policy.mjs +6 -7
  203. package/src/runtime/attachments/store.mjs +13 -12
  204. package/src/runtime/browser-bridge/client.mjs +19 -9
  205. package/src/runtime/channels/index.mjs +1 -1
  206. package/src/runtime/channels/lib/event-pipeline.mjs +8 -8
  207. package/src/runtime/channels/lib/event-queue.mjs +15 -20
  208. package/src/runtime/channels/lib/executor.mjs +10 -7
  209. package/src/runtime/channels/lib/owner-heartbeat.mjs +0 -4
  210. package/src/runtime/channels/lib/runtime-paths.mjs +30 -33
  211. package/src/runtime/channels/lib/scheduler.mjs +11 -20
  212. package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +0 -4
  213. package/src/runtime/channels/lib/voice-transcription.mjs +127 -104
  214. package/src/runtime/channels/lib/webhook/verification.mjs +33 -20
  215. package/src/runtime/channels/lib/worker-bootstrap.mjs +0 -2
  216. package/src/runtime/channels/lib/worker-main.mjs +2 -2
  217. package/src/runtime/computer-bridge/action-schema.mjs +20 -0
  218. package/src/runtime/computer-bridge/core-actions.mjs +15 -0
  219. package/src/runtime/github/client.mjs +2 -3
  220. package/src/runtime/github/commands.mjs +9 -3
  221. package/src/runtime/github/contract.mjs +7 -0
  222. package/src/runtime/local-provider/catalog.mjs +4 -3
  223. package/src/runtime/local-provider/hardware.mjs +7 -20
  224. package/src/runtime/local-provider/resumable-installations.mjs +12 -19
  225. package/src/runtime/media/auth.mjs +16 -13
  226. package/src/runtime/media/catalog.mjs +14 -6
  227. package/src/runtime/media/lanes.mjs +2 -1
  228. package/src/runtime/memory/index.mjs +5 -10
  229. package/src/runtime/memory/lib/core-memory-store.mjs +3 -7
  230. package/src/runtime/memory/lib/embedding-provider.mjs +9 -19
  231. package/src/runtime/memory/lib/embedding-worker.mjs +24 -28
  232. package/src/runtime/memory/lib/http-router/admin-routes.mjs +5 -51
  233. package/src/runtime/memory/lib/http-router/admin-trace-routes.mjs +65 -0
  234. package/src/runtime/memory/lib/memory-action-handlers/cycle-actions.mjs +18 -143
  235. package/src/runtime/memory/lib/memory-action-handlers/cycle-backfill-action.mjs +84 -0
  236. package/src/runtime/memory/lib/memory-action-handlers/cycle-rebuild-action.mjs +94 -0
  237. package/src/runtime/memory/lib/memory-action-handlers/manage-actions.mjs +92 -53
  238. package/src/runtime/memory/lib/memory-categories.mjs +13 -0
  239. package/src/runtime/memory/lib/memory-chunk-quality.mjs +134 -74
  240. package/src/runtime/memory/lib/memory-cycle-requests.mjs +64 -70
  241. package/src/runtime/memory/lib/memory-cycle1.mjs +17 -33
  242. package/src/runtime/memory/lib/memory-embed.mjs +10 -2
  243. package/src/runtime/memory/lib/memory-ops-policy.mjs +3 -2
  244. package/src/runtime/memory/lib/memory-recall-scope-filter.mjs +1 -1
  245. package/src/runtime/memory/lib/memory.mjs +7 -35
  246. package/src/runtime/memory/lib/pg/adapter.mjs +3 -4
  247. package/src/runtime/memory/lib/pg/process.mjs +23 -28
  248. package/src/runtime/memory/lib/pg/supervisor.mjs +10 -11
  249. package/src/runtime/memory/lib/query-hybrid-search.mjs +2 -2
  250. package/src/runtime/memory/lib/query-maintenance-handlers.mjs +112 -89
  251. package/src/runtime/memory/lib/query-ranking.mjs +8 -11
  252. package/src/runtime/memory/lib/recall-format.mjs +6 -12
  253. package/src/runtime/memory/lib/recall-hybrid/plan.mjs +1 -1
  254. package/src/runtime/memory/lib/runtime-fetcher.mjs +73 -65
  255. package/src/runtime/memory/lib/trace-store.mjs +10 -19
  256. package/src/runtime/memory/lib/transcript-ingest.mjs +7 -4
  257. package/src/runtime/memory/tool-defs.mjs +5 -8
  258. package/src/runtime/office/authoring/pptx-author-action.mjs +2 -2
  259. package/src/runtime/office/authoring/pptx-author-session.mjs +6 -9
  260. package/src/runtime/office/authoring/pptx-brief.mjs +11 -4
  261. package/src/runtime/office/authoring/pptx-receipt.mjs +79 -60
  262. package/src/runtime/office/bench/benchmark.mjs +102 -82
  263. package/src/runtime/office/capabilities-catalog.mjs +2 -0
  264. package/src/runtime/office/capabilities-signatures.mjs +8 -0
  265. package/src/runtime/office/capabilities.mjs +3 -4
  266. package/src/runtime/office/com/com-adapter.mjs +13 -1
  267. package/src/runtime/office/com/office-com-host.ps1 +63 -1
  268. package/src/runtime/office/core/office-actions-batch.mjs +12 -12
  269. package/src/runtime/office/core/office-actions-open.mjs +2 -7
  270. package/src/runtime/office/core/office-core.mjs +20 -1
  271. package/src/runtime/office/core/office-finalize/session-save.mjs +9 -6
  272. package/src/runtime/office/core/office-session-dispatch.mjs +86 -0
  273. package/src/runtime/office/core/office-sessionless-actions.mjs +115 -0
  274. package/src/runtime/office/core/office-sessions.mjs +2 -2
  275. package/src/runtime/office/core/office-transactions.mjs +2 -4
  276. package/src/runtime/office/core/tabular.mjs +13 -16
  277. package/src/runtime/office/design/composition-system.mjs +32 -28
  278. package/src/runtime/office/design/content-model.mjs +2 -1
  279. package/src/runtime/office/design/design-art-direction.mjs +17 -14
  280. package/src/runtime/office/design/design-creative-director.mjs +1 -1
  281. package/src/runtime/office/design/design-discipline.mjs +8 -0
  282. package/src/runtime/office/design/design-tokens.mjs +9 -5
  283. package/src/runtime/office/design/docx/design-docx-components.mjs +88 -156
  284. package/src/runtime/office/design/library/design-library-pack.mjs +11 -23
  285. package/src/runtime/office/design/library/design-library.mjs +15 -37
  286. package/src/runtime/office/design/library/design-template-index.mjs +1 -9
  287. package/src/runtime/office/design/library/design-template-induct.mjs +2 -1
  288. package/src/runtime/office/design/native-design.mjs +2 -3
  289. package/src/runtime/office/index.mjs +7 -160
  290. package/src/runtime/office/pdf/pdf-adapter.mjs +17 -2
  291. package/src/runtime/office/pdf/pdf-ocr.mjs +2 -1
  292. package/src/runtime/office/pdf/pdf-render.mjs +12 -13
  293. package/src/runtime/office/pdf/pdf-writer.mjs +135 -6
  294. package/src/runtime/office/portable/docx-revisions.mjs +5 -5
  295. package/src/runtime/office/portable/docx-runs.mjs +4 -7
  296. package/src/runtime/office/portable/docx-tracked-edits.mjs +14 -9
  297. package/src/runtime/office/portable/font-provisioner.mjs +2 -2
  298. package/src/runtime/office/portable/ooxml-validator.mjs +4 -1
  299. package/src/runtime/office/portable/portable-docx-edits.mjs +61 -45
  300. package/src/runtime/office/portable/portable-docx-operations.mjs +13 -4
  301. package/src/runtime/office/portable/portable-docx-parts.mjs +59 -70
  302. package/src/runtime/office/portable/portable-docx-xml.mjs +3 -5
  303. package/src/runtime/office/portable/portable-opc.mjs +63 -39
  304. package/src/runtime/office/portable/portable-package.mjs +5 -23
  305. package/src/runtime/office/portable/portable-pptx-chart.mjs +7 -6
  306. package/src/runtime/office/portable/portable-pptx-charts.mjs +27 -20
  307. package/src/runtime/office/portable/portable-pptx-core.mjs +10 -21
  308. package/src/runtime/office/portable/portable-pptx-deck.mjs +5 -8
  309. package/src/runtime/office/portable/portable-pptx-package.mjs +23 -30
  310. package/src/runtime/office/portable/portable-pptx-shapes.mjs +21 -57
  311. package/src/runtime/office/portable/portable-sheet-audits.mjs +14 -36
  312. package/src/runtime/office/portable/portable-sheet-page.mjs +22 -23
  313. package/src/runtime/office/portable/portable-sheet-parts.mjs +4 -5
  314. package/src/runtime/office/portable/portable-sheet-styles.mjs +11 -19
  315. package/src/runtime/office/portable/portable-sheet-xml.mjs +15 -7
  316. package/src/runtime/office/portable/portable-slide-shapes.mjs +4 -0
  317. package/src/runtime/office/portable/portable-snapshot-pptx.mjs +2 -2
  318. package/src/runtime/office/portable/portable-snapshot-shared.mjs +1 -1
  319. package/src/runtime/office/portable/portable-snapshot-xlsx.mjs +16 -17
  320. package/src/runtime/office/portable/portable-soffice.mjs +176 -13
  321. package/src/runtime/office/portable/portable-validation-package.mjs +16 -18
  322. package/src/runtime/office/portable/portable-validation.mjs +57 -31
  323. package/src/runtime/office/portable/portable-xlsx-cell-values.mjs +15 -0
  324. package/src/runtime/office/portable/portable-xlsx-charts.mjs +192 -0
  325. package/src/runtime/office/portable/portable-xlsx-drawings.mjs +323 -0
  326. package/src/runtime/office/portable/portable-xlsx-operations.mjs +29 -627
  327. package/src/runtime/office/portable/portable-xlsx-pivot-ops.mjs +94 -0
  328. package/src/runtime/office/portable/portable-xlsx-range-layout.mjs +236 -0
  329. package/src/runtime/office/portable/portable-xlsx-sheet-edits.mjs +19 -14
  330. package/src/runtime/office/portable/portable-xlsx.mjs +32 -0
  331. package/src/runtime/office/portable/portable-xml.mjs +9 -0
  332. package/src/runtime/office/portable/pptx-relations.mjs +11 -0
  333. package/src/runtime/office/portable/pptx-targets.mjs +2 -1
  334. package/src/runtime/office/portable/review-editability.mjs +4 -11
  335. package/src/runtime/office/portable/text-metrics.mjs +35 -55
  336. package/src/runtime/office/portable/xlsx-assertions.mjs +2 -15
  337. package/src/runtime/office/portable/xlsx-audit-support.mjs +2 -6
  338. package/src/runtime/office/portable/xlsx-contract.mjs +4 -0
  339. package/src/runtime/office/portable/xlsx-formula-audit.mjs +11 -4
  340. package/src/runtime/office/portable/xlsx-recalculate.mjs +1 -1
  341. package/src/runtime/office/portable/xlsx-sheet-hygiene.mjs +5 -1
  342. package/src/runtime/office/quality/assurance-rendered.mjs +3 -2
  343. package/src/runtime/office/quality/assurance-structure-pptx.mjs +16 -15
  344. package/src/runtime/office/quality/assurance-trust.mjs +25 -10
  345. package/src/runtime/office/quality/design-aesthetics.mjs +172 -145
  346. package/src/runtime/office/quality/design-deck-diversity.mjs +2 -5
  347. package/src/runtime/office/quality/design-review-authored.mjs +2 -2
  348. package/src/runtime/office/quality/design-review-critique.mjs +36 -37
  349. package/src/runtime/office/quality/design-review.mjs +113 -96
  350. package/src/runtime/office/quality/document-acceptance.mjs +10 -3
  351. package/src/runtime/office/quality/inline-audit.mjs +7 -2
  352. package/src/runtime/office/quality/pptx-deck-rubric.mjs +14 -6
  353. package/src/runtime/office/quality/pptx-slide-roles.mjs +7 -9
  354. package/src/runtime/office/quality/presentation-acceptance.mjs +2 -6
  355. package/src/runtime/office/quality/quality-pipeline.mjs +21 -14
  356. package/src/runtime/office/quality/quality-score.mjs +2 -2
  357. package/src/runtime/office/quality/render-air.mjs +12 -5
  358. package/src/runtime/shared/atomic-file.mjs +19 -8
  359. package/src/runtime/shared/config.mjs +7 -13
  360. package/src/runtime/shared/err-text.mjs +11 -6
  361. package/src/runtime/shared/file-lock.mjs +10 -6
  362. package/src/runtime/shared/inline-file-kind.mjs +51 -0
  363. package/src/runtime/shared/llm/usage-accounting.mjs +9 -6
  364. package/src/runtime/shared/llm/usage-ledger-rollup.mjs +272 -0
  365. package/src/runtime/shared/llm/usage-ledger.mjs +8 -218
  366. package/src/runtime/shared/pristine-execution.mjs +2 -6
  367. package/src/runtime/shared/process-lifecycle.mjs +34 -52
  368. package/src/runtime/shared/process-shutdown.mjs +1 -1
  369. package/src/runtime/shared/schedule-model-ref.mjs +14 -0
  370. package/src/runtime/shared/schedule-session-run.mjs +3 -13
  371. package/src/runtime/shared/schedules-db.mjs +16 -39
  372. package/src/runtime/shared/staged-child-result.mjs +2 -7
  373. package/src/runtime/shared/staged-update.mjs +1 -5
  374. package/src/runtime/shared/tool-card-model/agent-surface.mjs +8 -3
  375. package/src/runtime/shared/tool-card-model/card-status.mjs +2 -1
  376. package/src/runtime/shared/tool-card-model/displayed-result.mjs +2 -3
  377. package/src/runtime/shared/tool-card-model/generic-detail.mjs +5 -3
  378. package/src/runtime/shared/tool-card-model.golden-cases.mjs +10 -2
  379. package/src/runtime/shared/tool-card-model.golden.json +3 -12
  380. package/src/runtime/shared/tool-execution-contract.mjs +22 -26
  381. package/src/runtime/shared/tool-result-summary.mjs +7 -14
  382. package/src/runtime/shared/tool-surface.mjs +30 -33
  383. package/src/runtime/shared/tool-work-units.mjs +12 -8
  384. package/src/runtime/shared/turn-snapshot-store.mjs +2 -4
  385. package/src/runtime/shared/turn-worktree-snapshot.mjs +13 -16
  386. package/src/runtime/shared/update-checker.mjs +5 -0
  387. package/src/runtime/shared/user-data-guard.mjs +10 -17
  388. package/src/runtime/shared/webhook-session-run.mjs +3 -15
  389. package/src/runtime/tidy/history-comment.mjs +32 -27
  390. package/src/runtime/tidy/process.mjs +18 -21
  391. package/src/runtime/tidy/report.mjs +50 -9
  392. package/src/runtime/tidy/resolve.mjs +13 -14
  393. package/src/runtime/tidy/runners/air.mjs +2 -20
  394. package/src/runtime/tidy/runners/biome.mjs +4 -6
  395. package/src/runtime/tidy/runners/dprint.mjs +2 -23
  396. package/src/runtime/tidy/runners/mago.mjs +2 -20
  397. package/src/runtime/tidy/runners/ruff.mjs +2 -8
  398. package/src/runtime/tidy/runners/shared.mjs +35 -9
  399. package/src/runtime/tidy/runners/stylua.mjs +2 -20
  400. package/src/runtime/tidy/shadow.mjs +138 -0
  401. package/src/runtime/tidy/tool.mjs +33 -0
  402. package/src/runtime/tidy/worktree.mjs +114 -0
  403. package/src/runtime/web-search/index.mjs +64 -68
  404. package/src/runtime/web-search/lib/http-fetch.mjs +39 -54
  405. package/src/runtime/web-search/lib/ssrf-guard.mjs +19 -52
  406. package/src/runtime/web-search/lib/web-tools.mjs +2 -2
  407. package/src/session-runtime/config-helpers.mjs +9 -9
  408. package/src/session-runtime/context-inspection.mjs +64 -23
  409. package/src/session-runtime/context-status-cache.mjs +0 -2
  410. package/src/session-runtime/context-status-inspection.mjs +54 -25
  411. package/src/session-runtime/context-status-shape.mjs +1 -18
  412. package/src/session-runtime/goal-facade-api.mjs +15 -12
  413. package/src/session-runtime/goal-mutations.mjs +4 -3
  414. package/src/session-runtime/goal-runtime.mjs +5 -0
  415. package/src/session-runtime/goal-tasks.mjs +5 -10
  416. package/src/session-runtime/goal-text.mjs +46 -9
  417. package/src/session-runtime/goal-tool-defs.mjs +7 -8
  418. package/src/session-runtime/goal-tool-exec.mjs +1 -1
  419. package/src/session-runtime/goal-turns.mjs +54 -3
  420. package/src/session-runtime/hook-payload.mjs +2 -1
  421. package/src/session-runtime/inheritance-fit.mjs +3 -3
  422. package/src/session-runtime/lifecycle/teardown.mjs +9 -1
  423. package/src/session-runtime/mcp-glue/server-catalog.mjs +4 -6
  424. package/src/session-runtime/model-capabilities.mjs +1 -3
  425. package/src/session-runtime/notification-bus.mjs +30 -7
  426. package/src/session-runtime/plugin-mcp.mjs +0 -2
  427. package/src/session-runtime/provider-auth/accounts.mjs +2 -2
  428. package/src/session-runtime/provider-auth/login.mjs +0 -7
  429. package/src/session-runtime/provider-usage.mjs +1 -1
  430. package/src/session-runtime/runtime-paths.mjs +1 -3
  431. package/src/session-runtime/session-hooks.mjs +37 -96
  432. package/src/session-runtime/statusline-route.mjs +1 -4
  433. package/src/session-runtime/tool-catalog-schema.mjs +0 -6
  434. package/src/session-runtime/tool-catalog.mjs +10 -15
  435. package/src/session-runtime/workflow-ids.mjs +1 -2
  436. package/src/standalone/agent-task-status.mjs +1 -2
  437. package/src/standalone/agent-tool/close-flow/close-all.mjs +67 -0
  438. package/src/standalone/agent-tool/close-flow.mjs +2 -58
  439. package/src/standalone/agent-tool/execute-send.mjs +91 -0
  440. package/src/standalone/agent-tool/execute-spawn.mjs +76 -0
  441. package/src/standalone/agent-tool/execute.mjs +7 -147
  442. package/src/standalone/agent-tool/helpers.mjs +3 -6
  443. package/src/standalone/agent-tool/notify/early-completion.mjs +58 -0
  444. package/src/standalone/agent-tool/notify.mjs +7 -55
  445. package/src/standalone/agent-tool/provider-init.mjs +73 -64
  446. package/src/standalone/agent-tool/render.mjs +123 -115
  447. package/src/standalone/agent-tool/spawn-flow/spawn-plan.mjs +89 -0
  448. package/src/standalone/agent-tool/spawn-flow/spawn-prep.mjs +16 -75
  449. package/src/standalone/agent-tool/spawn-flow/spawn-run.mjs +1 -1
  450. package/src/standalone/agent-tool/worker-rows.mjs +0 -7
  451. package/src/standalone/channel-admin.mjs +13 -18
  452. package/src/standalone/channel-transport/remote-binding.mjs +10 -79
  453. package/src/standalone/channel-transport/remote-intent.mjs +52 -0
  454. package/src/standalone/channel-transport/remote-notify.mjs +15 -107
  455. package/src/standalone/channel-transport/remote-pointer.mjs +124 -0
  456. package/src/standalone/channel-transport/remote-state.mjs +47 -0
  457. package/src/standalone/daemon-agent-control.mjs +65 -0
  458. package/src/standalone/daemon-channels-loader.mjs +60 -0
  459. package/src/standalone/daemon-desktop-runtime.mjs +28 -0
  460. package/src/standalone/daemon-local-session-bridge.mjs +62 -0
  461. package/src/standalone/daemon-stored-session-views.mjs +55 -0
  462. package/src/standalone/daemon.mjs +175 -320
  463. package/src/standalone/desktop-service-registry.mjs +9 -7
  464. package/src/standalone/folder-dialog.mjs +11 -12
  465. package/src/standalone/hook-bus/command-handler.mjs +60 -49
  466. package/src/standalone/hook-bus/event-runner.mjs +7 -74
  467. package/src/standalone/hook-bus/handler-dispatch.mjs +75 -0
  468. package/src/standalone/provider-admin.mjs +14 -35
  469. package/src/standalone/session-client/attachment-calls.mjs +67 -0
  470. package/src/standalone/session-client/stream-link.mjs +85 -0
  471. package/src/standalone/session-client.mjs +31 -106
  472. package/src/standalone/session-frame-stream.mjs +4 -2
  473. package/src/standalone/session-protocol.mjs +0 -1
  474. package/src/standalone/session-runtime-agent-control-client.mjs +11 -27
  475. package/src/standalone/session-runtime-agent-control.mjs +85 -0
  476. package/src/standalone/session-runtime-host.mjs +30 -472
  477. package/src/standalone/session-runtime-inline-host/telemetry.mjs +38 -0
  478. package/src/standalone/session-runtime-inline-host.mjs +6 -37
  479. package/src/standalone/session-runtime-proxy.mjs +164 -0
  480. package/src/standalone/session-runtime-shard-router.mjs +4 -7
  481. package/src/standalone/session-runtime-spawn-leases.mjs +82 -0
  482. package/src/standalone/session-runtime-worker.mjs +27 -7
  483. package/src/standalone/session-service/agent-tree/agent-child.mjs +59 -0
  484. package/src/standalone/session-service/agent-tree/agent-turns.mjs +4 -55
  485. package/src/standalone/session-service/agent-tree.mjs +3 -1
  486. package/src/standalone/session-service/entries/disposal.mjs +72 -0
  487. package/src/standalone/session-service/entries/external-binding.mjs +6 -3
  488. package/src/standalone/session-service/entries/lifecycle.mjs +15 -59
  489. package/src/standalone/session-service/retention/busy.mjs +50 -0
  490. package/src/standalone/session-service/retention.mjs +5 -44
  491. package/src/standalone/session-service/session-calls/goal-recovery.mjs +44 -0
  492. package/src/standalone/session-service/session-calls/session-action.mjs +5 -8
  493. package/src/standalone/session-service/session-calls/session-turns.mjs +12 -42
  494. package/src/standalone/session-service/session-calls/session-views.mjs +8 -8
  495. package/src/standalone/session-transport/stack.mjs +131 -0
  496. package/src/standalone/session-transport.mjs +10 -103
  497. package/src/standalone/usage-dashboard.mjs +167 -165
  498. package/src/standalone/usage-stats-model.mjs +117 -97
  499. package/src/tui/App.jsx +27 -210
  500. package/src/tui/app/app-format.mjs +7 -0
  501. package/src/tui/app/app-view/floating-panel.jsx +229 -0
  502. package/src/tui/app/app-view/text-entry-labels.mjs +81 -0
  503. package/src/tui/app/app-view/transcript-viewport/trailing-bands.jsx +94 -0
  504. package/src/tui/app/app-view/transcript-viewport/transcript-rows.jsx +87 -0
  505. package/src/tui/app/app-view/transcript-viewport.jsx +74 -0
  506. package/src/tui/app/app-view.jsx +12 -450
  507. package/src/tui/app/core-memory-picker/core-rows.mjs +32 -0
  508. package/src/tui/app/core-memory-picker/entry-prompts.mjs +45 -0
  509. package/src/tui/app/core-memory-picker/list-panels.mjs +75 -0
  510. package/src/tui/app/core-memory-picker.mjs +26 -120
  511. package/src/tui/app/doctor.mjs +17 -12
  512. package/src/tui/app/extension-pickers/skills-pickers/project-skills.mjs +38 -0
  513. package/src/tui/app/extension-pickers/skills-pickers/skill-detail.mjs +80 -0
  514. package/src/tui/app/extension-pickers/skills-pickers/skill-items.mjs +44 -0
  515. package/src/tui/app/extension-pickers/skills-pickers.mjs +31 -137
  516. package/src/tui/app/model-picker/route-selection/context-window.mjs +47 -0
  517. package/src/tui/app/model-picker/route-selection/effort.mjs +87 -0
  518. package/src/tui/app/model-picker/route-selection/fast-parameters.mjs +84 -0
  519. package/src/tui/app/model-picker/route-selection/model-key.mjs +5 -0
  520. package/src/tui/app/model-picker/route-selection.mjs +34 -200
  521. package/src/tui/app/mouse-input/edge-autoscroll.mjs +53 -0
  522. package/src/tui/app/mouse-input/geometry.mjs +109 -0
  523. package/src/tui/app/mouse-input/sgr-buttons.mjs +14 -0
  524. package/src/tui/app/mouse-input/wheel-router.mjs +96 -0
  525. package/src/tui/app/panel-signature.mjs +58 -0
  526. package/src/tui/app/project-picker/project-service.mjs +3 -7
  527. package/src/tui/app/prompt-submit.mjs +2 -7
  528. package/src/tui/app/provider-setup/api-key-actions.mjs +7 -80
  529. package/src/tui/app/provider-setup/oauth-actions.mjs +2 -10
  530. package/src/tui/app/provider-setup/provider-items.mjs +20 -3
  531. package/src/tui/app/settings-picker/settings-toggles/cycled.mjs +4 -0
  532. package/src/tui/app/settings-picker/settings-toggles/listed-cyclers.mjs +77 -0
  533. package/src/tui/app/settings-picker/settings-toggles/store-toggles.mjs +61 -0
  534. package/src/tui/app/settings-picker/settings-toggles/theme-cycler.mjs +36 -0
  535. package/src/tui/app/settings-picker/settings-toggles.mjs +21 -149
  536. package/src/tui/app/slash-commands.mjs +14 -4
  537. package/src/tui/app/store-service-call.mjs +17 -0
  538. package/src/tui/app/text-entry-policy.mjs +1 -3
  539. package/src/tui/app/transcript-row-estimate.mjs +31 -91
  540. package/src/tui/app/transcript-window.mjs +19 -0
  541. package/src/tui/app/use-disabled-skills.mjs +52 -0
  542. package/src/tui/app/use-global-key-input/copy-first.mjs +43 -0
  543. package/src/tui/app/use-global-key-input/shift-arrow.mjs +30 -0
  544. package/src/tui/app/use-global-key-input.mjs +10 -67
  545. package/src/tui/app/use-model-catalog-cache.mjs +86 -0
  546. package/src/tui/app/use-mouse-input.mjs +64 -218
  547. package/src/tui/app/use-pasted-buffers.mjs +55 -81
  548. package/src/tui/app/use-prompt-draft-flow/draft-change.mjs +66 -0
  549. package/src/tui/app/use-prompt-draft-flow/prompt-cancels.mjs +40 -0
  550. package/src/tui/app/use-prompt-draft-flow.mjs +38 -77
  551. package/src/tui/app/use-prompt-queue-history/prompt-history.mjs +22 -0
  552. package/src/tui/app/use-prompt-queue-history/restore-to-prompt.mjs +147 -0
  553. package/src/tui/app/use-prompt-queue-history.mjs +20 -117
  554. package/src/tui/app/use-selection-focus.mjs +2 -1
  555. package/src/tui/app/use-selection-geometry.mjs +9 -12
  556. package/src/tui/app/use-selection-paint/paint-queue.mjs +90 -0
  557. package/src/tui/app/use-selection-paint/selection-clip.mjs +33 -0
  558. package/src/tui/app/use-selection-paint.mjs +31 -102
  559. package/src/tui/app/use-transcript-activity.mjs +1 -1
  560. package/src/tui/app/use-transcript-window/instance-state.mjs +1 -1
  561. package/src/tui/app/use-welcome-prompt-hint.mjs +1 -1
  562. package/src/tui/app/workflow-cycle.mjs +63 -0
  563. package/src/tui/components/AnsiText.jsx +47 -15
  564. package/src/tui/components/ItemRightHintOverprint.jsx +2 -15
  565. package/src/tui/components/Picker.jsx +9 -23
  566. package/src/tui/components/PromptInput.jsx +89 -335
  567. package/src/tui/components/QueuedCommands.jsx +1 -3
  568. package/src/tui/components/Spinner.jsx +1 -2
  569. package/src/tui/components/StatusLine.jsx +11 -21
  570. package/src/tui/components/TextEntryPanel.jsx +5 -52
  571. package/src/tui/components/ToolExecution.jsx +5 -14
  572. package/src/tui/components/TranscriptItem.jsx +0 -2
  573. package/src/tui/components/TurnDone.jsx +2 -14
  574. package/src/tui/components/prompt-input/cursor-anchor.mjs +65 -0
  575. package/src/tui/components/prompt-input/edit-helpers.mjs +1 -2
  576. package/src/tui/components/prompt-input/key-signals.mjs +122 -0
  577. package/src/tui/components/prompt-input/mouse-selection.mjs +114 -0
  578. package/src/tui/components/prompt-input/restore-policy.d.mts +0 -1
  579. package/src/tui/components/prompt-input/restore-policy.mjs +3 -8
  580. package/src/tui/components/prompt-input/selected-text.jsx +25 -0
  581. package/src/tui/components/prompt-input/undo-stack.mjs +75 -0
  582. package/src/tui/components/tool-output-format.mjs +1 -2
  583. package/src/tui/dist/index.mjs +2841 -2469
  584. package/src/tui/index.jsx +2 -2
  585. package/src/tui/markdown/measure-rendered-rows.mjs +8 -33
  586. package/src/tui/markdown/render-ansi.mjs +5 -5
  587. package/src/tui/markdown/table-layout/box-lines.mjs +46 -0
  588. package/src/tui/markdown/table-layout/cells.mjs +23 -0
  589. package/src/tui/markdown/table-layout/column-widths.mjs +65 -0
  590. package/src/tui/markdown/table-layout/vertical-lines.mjs +46 -0
  591. package/src/tui/markdown/table-layout.mjs +21 -151
  592. package/src/tui/prompt-history-store.mjs +0 -9
  593. package/src/tui/session/active-tool-summary.mjs +19 -27
  594. package/src/tui/session/agent-envelope.mjs +9 -9
  595. package/src/tui/session/live-share/owner.mjs +9 -7
  596. package/src/tui/session/live-share/retry.mjs +15 -0
  597. package/src/tui/session/live-share/viewer/frame-router.mjs +32 -0
  598. package/src/tui/session/live-share/viewer/pipe-client.mjs +108 -0
  599. package/src/tui/session/live-share/viewer.mjs +23 -114
  600. package/src/tui/session/notice-surface.mjs +1 -1
  601. package/src/tui/session/notice-text.mjs +21 -17
  602. package/src/tui/session/queue-helpers.mjs +12 -14
  603. package/src/tui/session/session-api/intake/submission.mjs +3 -8
  604. package/src/tui/session/session-api/integrations.mjs +0 -11
  605. package/src/tui/session/session-api/lifecycle/session-reset.mjs +76 -74
  606. package/src/tui/session/session-flow/drain.mjs +18 -5
  607. package/src/tui/session/session-flow/queue/entry-shape.mjs +53 -0
  608. package/src/tui/session/session-flow/queue/take-entries.mjs +82 -0
  609. package/src/tui/session/session-flow/queue.mjs +10 -112
  610. package/src/tui/session/session-flow/session-reset.mjs +2 -7
  611. package/src/tui/session/tool-approval.mjs +13 -17
  612. package/src/tui/session/tool-result-text.mjs +16 -28
  613. package/src/tui/session/transcript-spill.mjs +3 -7
  614. package/src/tui/session/transcript-store/replace-items.mjs +66 -0
  615. package/src/tui/session/transcript-store/streaming-tail.mjs +49 -0
  616. package/src/tui/session/transcript-store.mjs +16 -95
  617. package/src/tui/statusline-ansi-bridge.mjs +1 -40
  618. package/src/ui/markdown.mjs +3 -2
  619. package/src/ui/statusline-agents.mjs +9 -14
  620. package/src/ui/statusline.mjs +4 -4
  621. package/src/runtime/channels/lib/cli-worker-host.mjs +0 -2
  622. package/src/runtime/memory/lib/llm-worker-host.mjs +0 -11
  623. package/src/standalone/opencode-go-login.mjs +0 -140
@@ -135,7 +135,6 @@ export const ICON_NAMES = [
135
135
  'circle-dollar-sign',
136
136
  'dollar-sign',
137
137
  'euro',
138
- 'landmark',
139
138
  // technology and product
140
139
  'cpu',
141
140
  'microchip',
@@ -40,8 +40,20 @@ const timed = async (name, action, repetitions = 5) => {
40
40
  return { name, medianMs: +median(samples).toFixed(3), samplesMs: samples.map((n) => +n.toFixed(3)) };
41
41
  };
42
42
  const results = [];
43
- results.push(await timed('token-floors-before', () => messages.forEach((m) => legacyTokenFloors(m.content))));
44
- results.push(await timed('token-floors-after', () => messages.forEach((m) => currentFloors(m.content))));
43
+ results.push(
44
+ await timed('token-floors-before', () => {
45
+ messages.forEach((m) => {
46
+ legacyTokenFloors(m.content);
47
+ });
48
+ })
49
+ );
50
+ results.push(
51
+ await timed('token-floors-after', () => {
52
+ messages.forEach((m) => {
53
+ currentFloors(m.content);
54
+ });
55
+ })
56
+ );
45
57
  results.push(await timed('full-token-meter-after', () => estimateMessagesTokens(messages)));
46
58
  results.push(await timed('context-summary-cold-after', () => summarizeContextMessages(structuredClone(messages))));
47
59
  summarizeContextMessages(messages);
@@ -57,14 +69,18 @@ for (const [name, action] of [
57
69
  [
58
70
  'shared-loop-before',
59
71
  () => {
60
- messages.forEach((m) => legacyTokenFloors(m.content));
72
+ messages.forEach((m) => {
73
+ legacyTokenFloors(m.content);
74
+ });
61
75
  oldReader();
62
76
  },
63
77
  ],
64
78
  [
65
79
  'shared-loop-after',
66
80
  () => {
67
- messages.forEach((m) => currentFloors(m.content));
81
+ messages.forEach((m) => {
82
+ currentFloors(m.content);
83
+ });
68
84
  currentReader(target, true);
69
85
  },
70
86
  ],
@@ -5,6 +5,7 @@ import { join, resolve } from 'node:path';
5
5
  import { spawn } from 'node:child_process';
6
6
  import { createServer } from 'node:net';
7
7
  import { createHash } from 'node:crypto';
8
+ import { fileURLToPath } from 'node:url';
8
9
  import pg from 'pg';
9
10
  import { searchRelevantHybrid } from '../src/runtime/memory/lib/memory-recall-store.mjs';
10
11
 
@@ -250,10 +251,7 @@ async function prepare(dataDir, runtimeDir, sourcePort) {
250
251
  }
251
252
  }
252
253
 
253
- if (
254
- process.argv[1] &&
255
- resolve(process.argv[1]) === resolve(new URL(import.meta.url).pathname.replace(/^\/([A-Za-z]:)/, '$1'))
256
- ) {
254
+ if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
257
255
  if (process.argv[2] !== 'prepare' || !process.argv[3] || !process.argv[4]) {
258
256
  throw new Error('Usage: node scripts/pg-memory-diet.mjs prepare <data-dir> <runtime-dir> <source-port>');
259
257
  }
@@ -292,13 +292,11 @@ function toolSequence(sorted, iters) {
292
292
  if (it != null) iters.add(it);
293
293
  const tool = field(r, 'tool_name') || '?';
294
294
  const rawArgs = field(r, 'tool_args');
295
- const summaryArgs = rawArgs;
296
295
  sequence.push({
297
296
  it: it ?? null,
298
297
  tool,
299
298
  args: argsSummary(tool, rawArgs),
300
299
  rawArgs,
301
- inspectArgs: summaryArgs,
302
300
  argsHash: field(r, 'tool_args_hash'),
303
301
  resultKind: field(r, 'result_kind'),
304
302
  resultLines: Number(field(r, 'result_lines_est') || 0),
@@ -149,11 +149,6 @@ function inferProviderFromModel(model) {
149
149
  return null;
150
150
  }
151
151
 
152
- function sessionInclusive(provider) {
153
- if (provider) return isInclusiveProvider(provider);
154
- return true;
155
- }
156
-
157
152
  function usageDenom(row, provider) {
158
153
  const prompt = numberField(row, 'prompt_tokens');
159
154
  const input = numberField(row, 'input_tokens');
@@ -265,7 +260,6 @@ function deriveSessionMeta(rows) {
265
260
  model = usage ? field(usage, 'model') : null;
266
261
  }
267
262
  if (!provider) provider = inferProviderFromModel(model);
268
- const inclusive = sessionInclusive(provider);
269
263
  const tsList = sorted.map((r) => Number(r.ts || 0)).filter((n) => n > 0);
270
264
  const minTs = tsList.length ? Math.min(...tsList) : 0;
271
265
  const maxTs = tsList.length ? Math.max(...tsList) : 0;
@@ -292,7 +286,6 @@ function deriveSessionMeta(rows) {
292
286
  agent,
293
287
  provider,
294
288
  model,
295
- inclusive,
296
289
  minTs,
297
290
  maxTs,
298
291
  turns,
@@ -22,8 +22,7 @@
22
22
  *
23
23
  * This tool NEVER deletes. It only prints a report.
24
24
  */
25
- import { existsSync, readdirSync, statSync } from 'node:fs';
26
- import { readFileSync } from 'node:fs';
25
+ import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
27
26
  import { join } from 'node:path';
28
27
  import { getPluginData } from '../src/runtime/agent/orchestrator/config.mjs';
29
28
  import { summaryIndexPath, listStoredSessionSummaries } from '../src/runtime/agent/orchestrator/session/store.mjs';
@@ -153,27 +152,9 @@ function fmtTs(ms) {
153
152
  }
154
153
  }
155
154
 
156
- function main() {
157
- const { maxAgeDays, minClosedAgeDays, now } = parseArgs(process.argv.slice(2));
158
- const maxAgeMs = maxAgeDays * 24 * 60 * 60 * 1000;
159
- const minClosedAgeMs = minClosedAgeDays * 24 * 60 * 60 * 1000;
160
-
161
- const dir = join(getPluginData(), 'sessions');
162
- if (!existsSync(dir)) {
163
- process.stdout.write(`[session-sweep] no sessions dir at ${dir}\n`);
164
- return;
165
- }
166
-
167
- // Authoritative lifecycle rows (read-only). rebuildIfMissing:false so this
168
- // report never triggers a summary-index write.
169
- const rows = listStoredSessionSummaries({ rebuildIfMissing: false });
170
- const rowById = new Map();
171
- for (const r of rows) if (r?.id) rowById.set(r.id, r);
172
-
173
- // Disk scan for sizes + mtime fallback. `.hb` sidecar bytes are attributed
174
- // to their session so reclaimable bytes reflect the full on-disk footprint.
175
- const files = readdirSync(dir);
176
- const jsonFiles = files.filter((f) => f.endsWith('.json'));
155
+ // `.hb` sidecar bytes are attributed to their session so reclaimable bytes
156
+ // reflect the full on-disk footprint of a session.
157
+ function collectHbSidecarSizes(dir, files) {
177
158
  const hbSizeById = new Map();
178
159
  for (const f of files) {
179
160
  if (!f.endsWith('.hb')) continue;
@@ -184,7 +165,42 @@ function main() {
184
165
  /* ignore */
185
166
  }
186
167
  }
168
+ return hbSizeById;
169
+ }
187
170
 
171
+ // Authoritative per-file lifecycle via cheap top-level scan; the summary
172
+ // index is stale here (most on-disk files are unindexed), so the file
173
+ // itself — not the index — decides closed/age. Fall back to the index
174
+ // row, then to file mtime, only when the scan can't resolve a field.
175
+ function classifySessionFile({ full, mtimeMs, row, now, maxAgeMs, minClosedAgeMs }) {
176
+ let scan = null;
177
+ try {
178
+ scan = scanTopLevelScalars(readFileSync(full, 'utf-8'));
179
+ } catch {
180
+ scan = null;
181
+ }
182
+ const closedScan = scan && (scan.closed === true || scan.status === 'closed');
183
+ const closedRow = row && (row.closed === true || row.status === 'closed');
184
+ const closed = scan ? !!closedScan : !!closedRow;
185
+ let updatedAt = scan && Number(scan.updatedAt) > 0 ? Number(scan.updatedAt) : 0;
186
+ if (!updatedAt && row && Number(row.updatedAt) > 0) updatedAt = Number(row.updatedAt);
187
+ if (!updatedAt) updatedAt = mtimeMs;
188
+ const ageMs = now - updatedAt;
189
+ // Min-closed-age gate: a closed session only qualifies once its close
190
+ // timestamp (closedAt when present, else updatedAt — markSessionClosed
191
+ // sets updatedAt=Date.now() at tombstone time) is older than the gate.
192
+ // Recently-closed sessions may still be resumed, so keep them.
193
+ const closedAt = scan && Number(scan.closedAt) > 0 ? Number(scan.closedAt) : updatedAt;
194
+ const closedAge = now - closedAt;
195
+ const closedQualifies =
196
+ closed && (minClosedAgeMs <= 0 || (Number.isFinite(closedAt) && closedAt > 0 && closedAge > minClosedAgeMs));
197
+ const ageOnly = !closed && maxAgeMs > 0 && Number.isFinite(updatedAt) && updatedAt > 0 && ageMs > maxAgeMs;
198
+ return { scanned: !!scan, closed, updatedAt, closedQualifies, ageOnly };
199
+ }
200
+
201
+ // Disk scan for sizes + mtime fallback, then the retention verdict per file
202
+ // rolled into the totals the report prints.
203
+ function collectRetention({ dir, jsonFiles, hbSizeById, rowById, now, maxAgeMs, minClosedAgeMs }) {
188
204
  let totalFiles = 0;
189
205
  let totalBytes = 0;
190
206
  const candidates = []; // { id, reason, updatedAt, bytes, inIndex }
@@ -217,44 +233,19 @@ function main() {
217
233
  totalBytes += bytes;
218
234
 
219
235
  const row = rowById.get(id) || null;
220
- // Authoritative per-file lifecycle via cheap top-level scan; the summary
221
- // index is stale here (most on-disk files are unindexed), so the file
222
- // itself — not the index — decides closed/age. Fall back to the index
223
- // row, then to file mtime, only when the scan can't resolve a field.
224
- let scan = null;
225
- try {
226
- scan = scanTopLevelScalars(readFileSync(full, 'utf-8'));
227
- } catch {
228
- scan = null;
229
- }
230
- if (!scan) scanFailFiles += 1;
231
- const closedScan = scan && (scan.closed === true || scan.status === 'closed');
232
- const closedRow = row && (row.closed === true || row.status === 'closed');
233
- const closed = scan ? !!closedScan : !!closedRow;
234
- let updatedAt = scan && Number(scan.updatedAt) > 0 ? Number(scan.updatedAt) : 0;
235
- if (!updatedAt && row && Number(row.updatedAt) > 0) updatedAt = Number(row.updatedAt);
236
- if (!updatedAt) updatedAt = mtimeMs;
237
- const ageMs = now - updatedAt;
238
- // Min-closed-age gate: a closed session only qualifies once its close
239
- // timestamp (closedAt when present, else updatedAt — markSessionClosed
240
- // sets updatedAt=Date.now() at tombstone time) is older than the gate.
241
- // Recently-closed sessions may still be resumed, so keep them.
242
- const closedAt = scan && Number(scan.closedAt) > 0 ? Number(scan.closedAt) : updatedAt;
243
- const closedAge = now - closedAt;
244
- const closedQualifies =
245
- closed && (minClosedAgeMs <= 0 || (Number.isFinite(closedAt) && closedAt > 0 && closedAge > minClosedAgeMs));
246
- const ageOnly = !closed && maxAgeMs > 0 && Number.isFinite(updatedAt) && updatedAt > 0 && ageMs > maxAgeMs;
236
+ const verdict = classifySessionFile({ full, mtimeMs, row, now, maxAgeMs, minClosedAgeMs });
237
+ if (!verdict.scanned) scanFailFiles += 1;
247
238
 
248
- if (closed && !closedQualifies) {
239
+ if (verdict.closed && !verdict.closedQualifies) {
249
240
  closedButFreshCount += 1;
250
241
  closedButFreshBytes += bytes;
251
242
  }
252
- if (!closedQualifies && !ageOnly) continue; // keep
243
+ if (!verdict.closedQualifies && !verdict.ageOnly) continue; // keep
253
244
 
254
- const reason = closedQualifies ? 'closed' : 'age';
255
- candidates.push({ id, reason, updatedAt, bytes, inIndex: !!row });
245
+ const reason = verdict.closedQualifies ? 'closed' : 'age';
246
+ candidates.push({ id, reason, updatedAt: verdict.updatedAt, bytes, inIndex: !!row });
256
247
  reclaimBytes += bytes;
257
- if (closedQualifies) {
248
+ if (verdict.closedQualifies) {
258
249
  closedCount += 1;
259
250
  closedBytes += bytes;
260
251
  } else {
@@ -264,6 +255,37 @@ function main() {
264
255
  }
265
256
 
266
257
  candidates.sort((a, b) => (a.updatedAt || 0) - (b.updatedAt || 0));
258
+ return {
259
+ totalFiles,
260
+ totalBytes,
261
+ candidates,
262
+ closedCount,
263
+ ageOnlyCount,
264
+ closedBytes,
265
+ ageOnlyBytes,
266
+ reclaimBytes,
267
+ scanFailFiles,
268
+ closedButFreshCount,
269
+ closedButFreshBytes,
270
+ fileIds,
271
+ };
272
+ }
273
+
274
+ function renderReport({ dir, rows, now, maxAgeDays, minClosedAgeDays, retention }) {
275
+ const {
276
+ totalFiles,
277
+ totalBytes,
278
+ candidates,
279
+ closedCount,
280
+ ageOnlyCount,
281
+ closedBytes,
282
+ ageOnlyBytes,
283
+ reclaimBytes,
284
+ scanFailFiles,
285
+ closedButFreshCount,
286
+ closedButFreshBytes,
287
+ fileIds,
288
+ } = retention;
267
289
  const oldest = candidates[0] || null;
268
290
  const newest = candidates[candidates.length - 1] || null;
269
291
  const dropRows = candidates.filter((c) => c.inIndex).length;
@@ -304,7 +326,31 @@ function main() {
304
326
  L.push(`index rows after : ${rebuiltIndexRows} (= surviving files; rebuild reindexes all remaining)`);
305
327
  L.push('');
306
328
  L.push('DRY-RUN ONLY — this tool performed no unlink and no disk writes.');
307
- process.stdout.write(`${L.join('\n')}\n`);
329
+ return `${L.join('\n')}\n`;
330
+ }
331
+
332
+ function main() {
333
+ const { maxAgeDays, minClosedAgeDays, now } = parseArgs(process.argv.slice(2));
334
+ const maxAgeMs = maxAgeDays * 24 * 60 * 60 * 1000;
335
+ const minClosedAgeMs = minClosedAgeDays * 24 * 60 * 60 * 1000;
336
+
337
+ const dir = join(getPluginData(), 'sessions');
338
+ if (!existsSync(dir)) {
339
+ process.stdout.write(`[session-sweep] no sessions dir at ${dir}\n`);
340
+ return;
341
+ }
342
+
343
+ // Authoritative lifecycle rows (read-only). rebuildIfMissing:false so this
344
+ // report never triggers a summary-index write.
345
+ const rows = listStoredSessionSummaries({ rebuildIfMissing: false });
346
+ const rowById = new Map();
347
+ for (const r of rows) if (r?.id) rowById.set(r.id, r);
348
+
349
+ const files = readdirSync(dir);
350
+ const jsonFiles = files.filter((f) => f.endsWith('.json'));
351
+ const hbSizeById = collectHbSidecarSizes(dir, files);
352
+ const retention = collectRetention({ dir, jsonFiles, hbSizeById, rowById, now, maxAgeMs, minClosedAgeMs });
353
+ process.stdout.write(renderReport({ dir, rows, now, maxAgeDays, minClosedAgeDays, retention }));
308
354
  }
309
355
 
310
356
  main();
package/scripts/test.mjs CHANGED
@@ -2,33 +2,77 @@
2
2
  // Discovery-based test entry (docs/testing.md). A test file joins the suite
3
3
  // by existing; its lane comes from its name, never from a hand-kept list:
4
4
  //
5
- // *.test.mjs fast the default lane; every push, every local run
6
- // *.slow.test.mjs slow files over ~10s; their own CI job
7
- // *.live.test.mjs live need a built artifact or a live system
5
+ // *.test.mjs fast the default lane; every push, every local run
6
+ // *.slow.test.mjs slow files over ~10s; their own CI job
7
+ // *.live.test.mjs live need a built artifact or a live system
8
+ // *.electron.test.mjs electron need a real Electron or window-capture
9
+ // surface, so two runs of them cannot overlap
8
10
  //
9
- // Usage: node scripts/test.mjs [--lane fast|slow|live|all] [--list]
10
- // [--import <spec>]... [--test-*]... [filter...]
11
- // filter substring of a file path; only matching files run.
12
- // --import forwarded to node (desktop passes its test-env and tsx loaders).
13
- // --test-* forwarded to node --test (e.g. --test-name-pattern, --test-only).
11
+ // The electron lane rides the default lane (a plain run still covers it) and
12
+ // `--exclude-lane electron` is the explicit opt-out that lets a second run
13
+ // proceed concurrently; `--lane electron` runs those files alone.
14
14
  //
15
- // Runs from the package that invokes it: `src/` and `scripts/` under cwd are
16
- // the roots, so the root package and apps/desktop share this one entry.
15
+ // Usage — see USAGE below (`node scripts/test.mjs --help`).
16
+ //
17
+ // Runs from the package that invokes it: `src/`, `scripts/`, `lib/`, `deploy/`
18
+ // and the package root itself are searched under cwd, so the root package,
19
+ // apps/desktop and apps/relay share this one entry. A root a package does not
20
+ // have simply yields nothing.
17
21
  import { glob } from 'node:fs/promises';
18
22
  import { resolve } from 'node:path';
19
23
  import { fileURLToPath } from 'node:url';
20
24
  import { runNodeTests } from './lib/run-node-tests.mjs';
21
25
 
22
- const ROOTS = ['src', 'scripts'];
26
+ const FILE_LANES = ['fast', 'slow', 'live', 'electron'];
27
+ const LANES = [...FILE_LANES, 'all'];
28
+
29
+ export const USAGE = `Usage: node scripts/test.mjs [--lane ${LANES.join('|')}] [--exclude-lane <lane>]...
30
+ [--rerun-failed <n>] [--list] [--coverage]
31
+ [--import <spec>]... [--test-*]... [filter...]
32
+ filter substring of a file path; only matching files run.
33
+ --lane fast (default) also covers the electron lane, so a plain run
34
+ keeps testing it; --lane electron runs those files alone.
35
+ --exclude-lane drop one lane from the selection, repeatable. Electron and
36
+ window-capture tests cannot run twice at once, so a second
37
+ concurrent run uses --exclude-lane electron.
38
+ --rerun-failed <n> re-run the failed files up to n times (default 0 = off).
39
+ A test that passes on a re-run is reported as flaky and,
40
+ because the flag was passed, does NOT fail the run; a test
41
+ that fails every re-run still exits 1. Without the flag every
42
+ failure fails the run, as before.
43
+ --import forwarded to node (desktop passes its test-env and tsx loaders).
44
+ --test-* forwarded to node --test (e.g. --test-name-pattern, --test-only).
45
+ --coverage collect V8 coverage (NODE_V8_COVERAGE, no dependency) and fold
46
+ it into .runtime/coverage/coverage.json, which answers "did the
47
+ suite execute this function?" — see scripts/coverage-query.mjs.
48
+ Selection, lanes, reporting and exit codes are untouched.
49
+ --list print the selected files with their lane, run nothing.
50
+
51
+ Every run ends with a "[failure-summary]" block, printed after all other
52
+ output, naming each failed and flaky test by file and test name; every line of
53
+ it carries that tag, so it survives line filtering.`;
54
+
55
+ const ROOTS = ['.', 'src', 'scripts', 'lib', 'deploy'];
23
56
  const PATTERNS = ['**/*.test.mjs', '**/*-test.mjs'];
57
+ // The package root is searched shallowly: a recursive pattern there would pull
58
+ // every workspace package into the invoking package's suite.
59
+ const ROOT_PATTERNS = ['*.test.mjs', '*-test.mjs'];
24
60
  const EXCLUDED_DIRS = new Set(['node_modules', '.runtime', 'out', 'dist', 'target']);
25
61
 
26
62
  export function laneOf(file) {
27
63
  if (/\.live\.test\.mjs$/.test(file)) return 'live';
28
64
  if (/\.slow\.test\.mjs$/.test(file)) return 'slow';
65
+ if (/\.electron\.test\.mjs$/.test(file)) return 'electron';
29
66
  return 'fast';
30
67
  }
31
68
 
69
+ function rerunCount(value) {
70
+ if (!/^\d+$/.test(String(value))) {
71
+ throw new Error(`--rerun-failed requires a non-negative integer (got "${value}")`);
72
+ }
73
+ return Number(value);
74
+ }
75
+
32
76
  export function parseArgs(argv) {
33
77
  const options = { lane: 'fast', list: false, nodeArgs: [], filters: [] };
34
78
  for (let index = 0; index < argv.length; index++) {
@@ -36,12 +80,30 @@ export function parseArgs(argv) {
36
80
  if (arg === '--lane') options.lane = argv[++index];
37
81
  else if (arg.startsWith('--lane=')) options.lane = arg.slice('--lane='.length);
38
82
  else if (arg === '--list') options.list = true;
39
- else if (arg === '--import') options.nodeArgs.push(arg, argv[++index]);
40
- else if (arg.startsWith('--import=') || arg.startsWith('--test-')) options.nodeArgs.push(arg);
83
+ // Opt-in only: an absent flag leaves the parsed options exactly as they
84
+ // were, so nothing downstream can branch on coverage, lane exclusion or
85
+ // re-runs by accident.
86
+ else if (arg === '--coverage') options.coverage = true;
87
+ else if (arg === '--help' || arg === '-h') options.help = true;
88
+ else if (arg === '--exclude-lane') options.excludeLanes = [...(options.excludeLanes ?? []), argv[++index]];
89
+ else if (arg.startsWith('--exclude-lane='))
90
+ options.excludeLanes = [...(options.excludeLanes ?? []), arg.slice('--exclude-lane='.length)];
91
+ else if (arg === '--rerun-failed') options.rerunFailed = rerunCount(argv[++index]);
92
+ else if (arg.startsWith('--rerun-failed=')) options.rerunFailed = rerunCount(arg.slice('--rerun-failed='.length));
93
+ else if (arg === '--import') {
94
+ const spec = argv[++index];
95
+ if (spec === undefined) throw new Error('--import requires a value');
96
+ options.nodeArgs.push(arg, spec);
97
+ } else if (arg.startsWith('--import=') || arg.startsWith('--test-')) options.nodeArgs.push(arg);
41
98
  else options.filters.push(arg.replaceAll('\\', '/'));
42
99
  }
43
- if (!['fast', 'slow', 'live', 'all'].includes(options.lane)) {
44
- throw new Error(`unknown lane "${options.lane}" (fast|slow|live|all)`);
100
+ if (!LANES.includes(options.lane)) {
101
+ throw new Error(`unknown lane "${options.lane}" (${LANES.join('|')})`);
102
+ }
103
+ for (const lane of options.excludeLanes ?? []) {
104
+ if (!FILE_LANES.includes(lane)) {
105
+ throw new Error(`unknown excluded lane "${lane}" (${FILE_LANES.join('|')})`);
106
+ }
45
107
  }
46
108
  return options;
47
109
  }
@@ -49,29 +111,39 @@ export function parseArgs(argv) {
49
111
  export async function discoverTestFiles(cwd = process.cwd()) {
50
112
  const files = new Set();
51
113
  for (const root of ROOTS) {
52
- for await (const entry of glob(
53
- PATTERNS.map((pattern) => `${root}/${pattern}`),
54
- {
55
- cwd,
56
- exclude: (path) =>
57
- String(path)
58
- .split(/[\\/]/)
59
- .some((segment) => EXCLUDED_DIRS.has(segment)),
60
- }
61
- ))
114
+ for await (const entry of glob(root === '.' ? ROOT_PATTERNS : PATTERNS.map((pattern) => `${root}/${pattern}`), {
115
+ cwd,
116
+ exclude: (path) =>
117
+ String(path)
118
+ .split(/[\\/]/)
119
+ .some((segment) => EXCLUDED_DIRS.has(segment)),
120
+ }))
62
121
  files.add(entry.replaceAll('\\', '/'));
63
122
  }
64
123
  return [...files].sort();
65
124
  }
66
125
 
67
- export function selectTestFiles(files, { lane, filters }) {
126
+ // The electron lane rides the default lane so a plain `npm test` keeps
127
+ // covering an Electron/window-capture surface that no other lane owns;
128
+ // `--exclude-lane electron` is the explicit way to drop it.
129
+ export function laneSelected(lane, fileLane) {
130
+ if (lane === 'all' || lane === fileLane) return true;
131
+ return lane === 'fast' && fileLane === 'electron';
132
+ }
133
+
134
+ export function selectTestFiles(files, { lane, filters, excludeLanes = [] }) {
135
+ const excluded = new Set(excludeLanes);
68
136
  return files
69
- .filter((file) => lane === 'all' || laneOf(file) === lane)
137
+ .filter((file) => laneSelected(lane, laneOf(file)) && !excluded.has(laneOf(file)))
70
138
  .filter((file) => filters.length === 0 || filters.some((filter) => file.includes(filter)));
71
139
  }
72
140
 
73
141
  async function main() {
74
142
  const options = parseArgs(process.argv.slice(2));
143
+ if (options.help) {
144
+ console.log(USAGE);
145
+ return;
146
+ }
75
147
  const files = selectTestFiles(await discoverTestFiles(), options);
76
148
  if (options.list) {
77
149
  for (const file of files) console.log(`${laneOf(file).padEnd(5)} ${file}`);
@@ -82,16 +154,20 @@ async function main() {
82
154
  process.exitCode = 1;
83
155
  return;
84
156
  }
85
- await runNodeTests([
86
- ...options.nodeArgs,
87
- // node:test `mock.module` (module-boundary stubs such as the pinned fetch
88
- // in the browser-document live suite) is still flag-gated on 22/24.
89
- '--experimental-test-module-mocks',
90
- '--test',
91
- // A suite that leaves a handle open (a session runtime closed without
92
- // waiting for its children) must not hang the whole run.
93
- '--test-force-exit',
94
- ], files);
157
+ await runNodeTests(
158
+ [
159
+ ...options.nodeArgs,
160
+ // node:test `mock.module` (module-boundary stubs such as the pinned fetch
161
+ // in the browser-document live suite) is still flag-gated on 22/24.
162
+ '--experimental-test-module-mocks',
163
+ '--test',
164
+ // A suite that leaves a handle open (a session runtime closed without
165
+ // waiting for its children) must not hang the whole run.
166
+ '--test-force-exit',
167
+ ],
168
+ files,
169
+ { coverage: options.coverage === true, rerunFailed: options.rerunFailed ?? 0 }
170
+ );
95
171
  }
96
172
 
97
173
  const invoked = process.argv[1] ? resolve(process.argv[1]) : '';
@@ -280,7 +280,7 @@ function makeDriver({ rows, cols, isWindows }) {
280
280
  // (NON-fullscreen branch) → log-update relative cursorUp walk → one-row-low
281
281
  // dip under Windows Terminal. A steady frame (shortByOne=false) fills the
282
282
  // viewport, stays on the absolute cursorTo path, and is stable.
283
- function frame({ rows, cols, palette, shortByOne, heightRows }) {
283
+ function frame({ rows, cols: _cols, palette, shortByOne, heightRows }) {
284
284
  // [FAITHFUL] App.jsx pins the bottom cluster with the outer full-height
285
285
  // column (height=resizeState.rows) + flexShrink={0} on the bottom bar. So the
286
286
  // Yoga root height is `rows` when accounting is correct. When a reclaimed row