@aragon-agent/cli 0.6.47 → 0.6.48

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 (775) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +27 -6
  3. package/dist/agent/coalesce.d.ts +1 -1
  4. package/dist/agent/controller.d.ts +21 -21
  5. package/dist/agent/controller.js +13 -13
  6. package/dist/agent/conversation-reset.d.ts +1 -1
  7. package/dist/agent/governance-wiring.d.ts +6 -6
  8. package/dist/agent/governance-wiring.js +4 -4
  9. package/dist/agent/headless.d.ts +5 -5
  10. package/dist/agent/headless.js +4 -4
  11. package/dist/agent/job-notices.d.ts +1 -1
  12. package/dist/agent/job-notices.js +1 -1
  13. package/dist/agent/kit-apply.d.ts +3 -3
  14. package/dist/agent/kit-apply.js +3 -3
  15. package/dist/agent/model-profile-settings.d.ts +2 -2
  16. package/dist/agent/model-profile-settings.js +6 -6
  17. package/dist/agent/prompt-options.d.ts +1 -1
  18. package/dist/agent/system-prompt.d.ts +1 -1
  19. package/dist/{ui → app}/App.d.ts +9 -9
  20. package/dist/{ui → app}/App.js +79 -79
  21. package/dist/{ui → app}/use-startup-notices.d.ts +1 -1
  22. package/dist/{ui → app}/use-startup-notices.js +2 -2
  23. package/dist/cli.js +29 -29
  24. package/dist/commands/agents-command.js +1 -1
  25. package/dist/commands/builtins.js +9 -9
  26. package/dist/commands/governance-command.js +2 -2
  27. package/dist/commands/governance-runs-table.js +1 -1
  28. package/dist/commands/kit-command.js +1 -1
  29. package/dist/commands/perf.d.ts +3 -3
  30. package/dist/commands/perf.js +1 -1
  31. package/dist/commands/registry.d.ts +8 -8
  32. package/dist/commands/skills.js +2 -2
  33. package/dist/commands/team-command.js +1 -1
  34. package/dist/compaction/archive.d.ts +1 -1
  35. package/dist/compaction/archive.js +1 -1
  36. package/dist/compaction/child.d.ts +3 -3
  37. package/dist/compaction/child.js +4 -4
  38. package/dist/compaction/command.js +5 -5
  39. package/dist/compaction/compactor.d.ts +6 -6
  40. package/dist/compaction/compactor.js +6 -6
  41. package/dist/compaction/context-command.js +1 -1
  42. package/dist/compaction/digest.js +1 -1
  43. package/dist/compaction/memory-input.js +1 -1
  44. package/dist/compaction/memory-validation.js +1 -1
  45. package/dist/compaction/memory.js +1 -1
  46. package/dist/compaction/summarize-call.js +1 -1
  47. package/dist/compaction/summary-prompt.js +1 -1
  48. package/dist/compaction/tail-budget.js +2 -2
  49. package/dist/compaction/wiring.d.ts +5 -5
  50. package/dist/compaction/wiring.js +2 -2
  51. package/dist/config/cli-commands.d.ts +1 -1
  52. package/dist/config/cli-commands.js +3 -3
  53. package/dist/config/env.d.ts +1 -1
  54. package/dist/config/env.js +4 -4
  55. package/dist/config/load.d.ts +2 -2
  56. package/dist/config/load.js +6 -6
  57. package/dist/config/migrate-state-out-of-config.js +1 -1
  58. package/dist/config/model-profile-store.d.ts +4 -54
  59. package/dist/config/model-profile-store.js +3 -3
  60. package/dist/config/prompt-history.js +1 -1
  61. package/dist/config/store.d.ts +2 -2
  62. package/dist/config/store.js +3 -3
  63. package/dist/diagnostics/doctor.js +4 -4
  64. package/dist/exec/bridge/decisions.d.ts +1 -1
  65. package/dist/exec/bridge/human-answers.d.ts +1 -1
  66. package/dist/exec/bridge/human-answers.js +1 -1
  67. package/dist/exec/bridge/protocol.d.ts +1 -1
  68. package/dist/exec/bridge/server.js +1 -1
  69. package/dist/exec/events.d.ts +2 -2
  70. package/dist/exec/index.d.ts +1 -1
  71. package/dist/exec/index.js +1 -1
  72. package/dist/exec/permission.js +1 -1
  73. package/dist/exec/runner.d.ts +3 -3
  74. package/dist/exec/runner.js +2 -2
  75. package/dist/exec/threads/runtime.js +1 -1
  76. package/dist/fast/digest.d.ts +1 -1
  77. package/dist/fast/digest.js +1 -1
  78. package/dist/fast/frames.d.ts +1 -1
  79. package/dist/fast/frames.js +1 -1
  80. package/dist/fast/prompt.d.ts +1 -1
  81. package/dist/fast/prompt.js +1 -1
  82. package/dist/fast/review-call.js +1 -1
  83. package/dist/fast/reviewer.d.ts +3 -3
  84. package/dist/fast/reviewer.js +1 -1
  85. package/dist/fast/summary-call.d.ts +3 -3
  86. package/dist/fast/summary-call.js +2 -2
  87. package/dist/fast/summary-prompt.d.ts +1 -1
  88. package/dist/fast/summary-prompt.js +1 -1
  89. package/dist/fast/wiring.d.ts +4 -4
  90. package/dist/fast/wiring.js +1 -1
  91. package/dist/governance/card-normalize.d.ts +1 -1
  92. package/dist/governance/copy.d.ts +1 -1
  93. package/dist/governance/copy.js +2 -2
  94. package/dist/governance/engine/artifact-persist.d.ts +1 -1
  95. package/dist/governance/engine/budget.d.ts +1 -1
  96. package/dist/governance/engine/budget.js +1 -1
  97. package/dist/governance/engine/cards.d.ts +1 -1
  98. package/dist/governance/engine/digest.js +1 -1
  99. package/dist/governance/engine/engine-core.d.ts +5 -5
  100. package/dist/governance/engine/engine-core.js +1 -1
  101. package/dist/governance/engine/engine.d.ts +1 -1
  102. package/dist/governance/engine/engine.js +1 -1
  103. package/dist/governance/engine/estimate.d.ts +1 -1
  104. package/dist/governance/engine/estimate.js +1 -1
  105. package/dist/governance/engine/inspector.js +2 -2
  106. package/dist/governance/engine/integration.d.ts +1 -1
  107. package/dist/governance/engine/lifecycle.d.ts +1 -1
  108. package/dist/governance/engine/lifecycle.js +1 -1
  109. package/dist/governance/engine/phase-members.d.ts +1 -1
  110. package/dist/governance/engine/phase-planner.d.ts +1 -1
  111. package/dist/governance/engine/phase-planner.js +1 -1
  112. package/dist/governance/engine/rebuild.d.ts +1 -1
  113. package/dist/governance/engine/report.d.ts +1 -1
  114. package/dist/governance/engine/report.js +1 -1
  115. package/dist/governance/engine/run-digest.d.ts +1 -1
  116. package/dist/governance/engine/spec-builder.d.ts +2 -2
  117. package/dist/governance/engine/spec-builder.js +2 -2
  118. package/dist/governance/engine/stage-runner.js +2 -2
  119. package/dist/governance/engine/start-input.d.ts +1 -1
  120. package/dist/governance/engine/start-input.js +1 -1
  121. package/dist/governance/engine/state-machine.d.ts +1 -1
  122. package/dist/governance/engine/state-machine.js +3 -3
  123. package/dist/governance/engine/submission-queries.d.ts +1 -1
  124. package/dist/governance/engine/submission-render.d.ts +1 -1
  125. package/dist/governance/engine/submissions.d.ts +1 -1
  126. package/dist/governance/engine/submissions.js +1 -1
  127. package/dist/governance/engine/visibility.d.ts +1 -1
  128. package/dist/governance/engine/visibility.js +1 -1
  129. package/dist/governance/posture-transition.d.ts +2 -2
  130. package/dist/governance/posture-transition.js +1 -1
  131. package/dist/governance/profiles.d.ts +1 -1
  132. package/dist/governance/prompts/orchestrator-block.d.ts +2 -2
  133. package/dist/governance/prompts/orchestrator-block.js +2 -2
  134. package/dist/governance/prompts/plan-addendum.d.ts +1 -1
  135. package/dist/governance/prompts/plan-addendum.js +1 -1
  136. package/dist/governance/prompts/role-blocks.d.ts +2 -2
  137. package/dist/governance/prompts/role-blocks.js +1 -1
  138. package/dist/governance/report-reader.js +1 -1
  139. package/dist/governance/roles.d.ts +1 -1
  140. package/dist/governance/rules/claims.d.ts +1 -1
  141. package/dist/governance/rules/claims.js +1 -1
  142. package/dist/governance/rules/elimination.d.ts +1 -1
  143. package/dist/governance/rules/elimination.js +1 -1
  144. package/dist/governance/rules/failure-analysis.d.ts +2 -2
  145. package/dist/governance/rules/failure-analysis.js +1 -1
  146. package/dist/governance/rules/ledger-replay.d.ts +1 -1
  147. package/dist/governance/rules/ledger-state.d.ts +1 -1
  148. package/dist/governance/rules/ledger-state.js +1 -1
  149. package/dist/governance/rules/ledger.d.ts +2 -2
  150. package/dist/governance/rules/ledger.js +2 -2
  151. package/dist/governance/rules/rca.d.ts +1 -1
  152. package/dist/governance/rules/rca.js +1 -1
  153. package/dist/governance/rules/settlement.d.ts +2 -2
  154. package/dist/governance/rules/settlement.js +2 -2
  155. package/dist/governance/rules/suspicion.d.ts +1 -1
  156. package/dist/governance/store/artifacts.d.ts +1 -1
  157. package/dist/governance/store/artifacts.js +1 -1
  158. package/dist/governance/store/events-log.d.ts +1 -1
  159. package/dist/governance/store/run-store.d.ts +1 -1
  160. package/dist/governance/store/run-store.js +1 -1
  161. package/dist/governance/store/scoreboard-export.d.ts +1 -1
  162. package/dist/governance/tools/child-tools.d.ts +1 -1
  163. package/dist/governance/tools/guard.d.ts +1 -1
  164. package/dist/governance/tools/guard.js +1 -1
  165. package/dist/governance/tools/inspector-tools.d.ts +2 -2
  166. package/dist/governance/tools/inspector-tools.js +2 -2
  167. package/dist/governance/tools/lead-tools.d.ts +1 -1
  168. package/dist/governance/tools/lead-tools.js +1 -1
  169. package/dist/governance/tools/normalize-util.js +1 -1
  170. package/dist/governance/tools/scan-incomplete.js +1 -1
  171. package/dist/governance/tools/shared-tools.d.ts +1 -1
  172. package/dist/governance/tools/shared-tools.js +1 -1
  173. package/dist/governance/tools/submit-normalizers.d.ts +1 -1
  174. package/dist/governance/tools/submit-normalizers.js +1 -1
  175. package/dist/governance/tools/submit-tools.d.ts +1 -1
  176. package/dist/logging/cli-commands.js +1 -1
  177. package/dist/logging/install.d.ts +1 -1
  178. package/dist/logging/install.js +3 -3
  179. package/dist/logging/logger.d.ts +2 -2
  180. package/dist/logging/logger.js +31 -2
  181. package/dist/proc/kill-tree.js +1 -1
  182. package/dist/proc/log-mirror.js +1 -1
  183. package/dist/proc/log-ring.js +2 -2
  184. package/dist/proc/notices.d.ts +1 -1
  185. package/dist/proc/notices.js +2 -2
  186. package/dist/proc/prompt.d.ts +1 -1
  187. package/dist/proc/prompt.js +1 -1
  188. package/dist/proc/readiness.js +1 -1
  189. package/dist/proc/supervisor.d.ts +1 -1
  190. package/dist/proc/supervisor.js +3 -3
  191. package/dist/proc/wait.d.ts +1 -1
  192. package/dist/proc/wait.js +1 -1
  193. package/dist/prompts/command.d.ts +1 -1
  194. package/dist/prompts/command.js +1 -1
  195. package/dist/prompts/normalize.d.ts +1 -1
  196. package/dist/prompts/normalize.js +1 -1
  197. package/dist/prompts/resolve.d.ts +1 -1
  198. package/dist/prompts/store.d.ts +2 -12
  199. package/dist/prompts/store.js +6 -60
  200. package/dist/session/checkpoint.d.ts +2 -2
  201. package/dist/session/clear-archive.d.ts +2 -2
  202. package/dist/session/persist.d.ts +2 -2
  203. package/dist/session/persist.js +1 -1
  204. package/dist/session/startup-session.d.ts +2 -2
  205. package/dist/session/validate-session.js +3 -3
  206. package/dist/skills/service.d.ts +2 -2
  207. package/dist/team/bus.d.ts +1 -1
  208. package/dist/team/bus.js +1 -1
  209. package/dist/team/child-reviewer.d.ts +2 -2
  210. package/dist/team/child-reviewer.js +1 -1
  211. package/dist/team/comm-tools.js +1 -1
  212. package/dist/team/dispatch-gate.js +1 -1
  213. package/dist/team/forced-dispatch.js +1 -1
  214. package/dist/team/forced-mode.d.ts +1 -1
  215. package/dist/team/forced-prompt.d.ts +1 -1
  216. package/dist/team/forced-prompt.js +1 -1
  217. package/dist/team/normalize.d.ts +1 -1
  218. package/dist/team/normalize.js +1 -1
  219. package/dist/team/overseer.d.ts +3 -3
  220. package/dist/team/overseer.js +3 -3
  221. package/dist/team/prompt.d.ts +1 -1
  222. package/dist/team/prompt.js +1 -1
  223. package/dist/team/report.d.ts +2 -2
  224. package/dist/team/report.js +2 -2
  225. package/dist/team/retry.d.ts +1 -1
  226. package/dist/team/retry.js +1 -1
  227. package/dist/team/runtime.d.ts +4 -4
  228. package/dist/team/runtime.js +2 -2
  229. package/dist/team/settled.d.ts +2 -2
  230. package/dist/team/subagent.d.ts +4 -4
  231. package/dist/team/subagent.js +5 -5
  232. package/dist/team/task-tool.d.ts +1 -1
  233. package/dist/team/task-tool.js +1 -1
  234. package/dist/todo/normalize.d.ts +1 -1
  235. package/dist/todo/normalize.js +1 -1
  236. package/dist/todo/prompt.d.ts +1 -1
  237. package/dist/todo/prompt.js +1 -1
  238. package/dist/todo/store.d.ts +1 -1
  239. package/dist/todo/store.js +2 -2
  240. package/dist/todo/todo-tool.d.ts +1 -1
  241. package/dist/todo/todo-tool.js +2 -2
  242. package/dist/tools/bash-tool.d.ts +1 -1
  243. package/dist/tools/bash-tool.js +2 -2
  244. package/dist/tools/diff.d.ts +1 -1
  245. package/dist/tools/diff.js +1 -1
  246. package/dist/tools/file-change-store.d.ts +1 -1
  247. package/dist/tools/fs-tools.d.ts +2 -2
  248. package/dist/tools/fs-tools.js +1 -1
  249. package/dist/tools/index.d.ts +3 -3
  250. package/dist/tools/index.js +1 -1
  251. package/dist/tools/job-tools.d.ts +2 -2
  252. package/dist/tools/job-tools.js +4 -4
  253. package/dist/tools/plan-tools.d.ts +1 -1
  254. package/dist/tools/plan-tools.js +1 -1
  255. package/dist/tools/proc-tools.d.ts +1 -1
  256. package/dist/tools/proc-tools.js +2 -2
  257. package/dist/update/classify-failure.d.ts +1 -1
  258. package/dist/update/install-lock.js +1 -1
  259. package/dist/update/install-source.d.ts +1 -1
  260. package/dist/update/installer.js +2 -2
  261. package/dist/update/npm-view.d.ts +1 -1
  262. package/dist/update/npm-view.js +1 -1
  263. package/dist/update/registry.d.ts +1 -1
  264. package/dist/update/registry.js +1 -1
  265. package/dist/update/service.d.ts +2 -2
  266. package/dist/update/service.js +2 -2
  267. package/package.json +7 -7
  268. package/dist/agent/agent-mode.d.ts +0 -108
  269. package/dist/agent/agent-mode.js +0 -121
  270. package/dist/agent/entry-limits.d.ts +0 -65
  271. package/dist/agent/entry-limits.js +0 -133
  272. package/dist/agent/governance-view.d.ts +0 -40
  273. package/dist/agent/governance-view.js +0 -40
  274. package/dist/agent/invocation-card.d.ts +0 -77
  275. package/dist/agent/invocation-card.js +0 -169
  276. package/dist/agent/model-probe-limits.d.ts +0 -39
  277. package/dist/agent/model-probe-limits.js +0 -25
  278. package/dist/agent/model-probe.d.ts +0 -104
  279. package/dist/agent/model-probe.js +0 -391
  280. package/dist/agent/queued-messages.d.ts +0 -23
  281. package/dist/agent/queued-messages.js +0 -49
  282. package/dist/agent/reducer.d.ts +0 -857
  283. package/dist/agent/reducer.js +0 -1646
  284. package/dist/agent/retry-view.d.ts +0 -68
  285. package/dist/agent/retry-view.js +0 -95
  286. package/dist/agent/usage.d.ts +0 -47
  287. package/dist/agent/usage.js +0 -84
  288. package/dist/compaction/limits.d.ts +0 -61
  289. package/dist/compaction/limits.js +0 -64
  290. package/dist/compaction/meter.d.ts +0 -276
  291. package/dist/compaction/meter.js +0 -512
  292. package/dist/compaction/pressure.d.ts +0 -163
  293. package/dist/compaction/pressure.js +0 -199
  294. package/dist/compaction/reason-text.d.ts +0 -36
  295. package/dist/compaction/reason-text.js +0 -78
  296. package/dist/compaction/types.d.ts +0 -360
  297. package/dist/compaction/types.js +0 -22
  298. package/dist/config/governance-config.d.ts +0 -125
  299. package/dist/config/governance-config.js +0 -164
  300. package/dist/config/kit-resolution.d.ts +0 -93
  301. package/dist/config/kit-resolution.js +0 -226
  302. package/dist/config/model-kits.d.ts +0 -225
  303. package/dist/config/model-kits.js +0 -302
  304. package/dist/config/model-profile-resolution.d.ts +0 -28
  305. package/dist/config/model-profile-resolution.js +0 -88
  306. package/dist/config/model-profiles.d.ts +0 -103
  307. package/dist/config/model-profiles.js +0 -188
  308. package/dist/config/schema.d.ts +0 -1645
  309. package/dist/config/schema.js +0 -1383
  310. package/dist/fast/limits.d.ts +0 -152
  311. package/dist/fast/limits.js +0 -152
  312. package/dist/fast/resolve.d.ts +0 -44
  313. package/dist/fast/resolve.js +0 -107
  314. package/dist/fast/task-summary-types.d.ts +0 -66
  315. package/dist/fast/task-summary-types.js +0 -17
  316. package/dist/fast/types.d.ts +0 -141
  317. package/dist/fast/types.js +0 -14
  318. package/dist/governance/governed-dispatch.d.ts +0 -19
  319. package/dist/governance/governed-dispatch.js +0 -17
  320. package/dist/governance/limits.d.ts +0 -107
  321. package/dist/governance/limits.js +0 -131
  322. package/dist/governance/posture.d.ts +0 -35
  323. package/dist/governance/posture.js +0 -59
  324. package/dist/governance/rules/events-table.d.ts +0 -46
  325. package/dist/governance/rules/events-table.js +0 -94
  326. package/dist/governance/types.d.ts +0 -661
  327. package/dist/governance/types.js +0 -27
  328. package/dist/input/control-sequences.d.ts +0 -71
  329. package/dist/input/control-sequences.js +0 -222
  330. package/dist/input/csiu-keys.d.ts +0 -66
  331. package/dist/input/csiu-keys.js +0 -181
  332. package/dist/input/cursor-report.d.ts +0 -61
  333. package/dist/input/cursor-report.js +0 -97
  334. package/dist/input/enter-sequences.d.ts +0 -64
  335. package/dist/input/enter-sequences.js +0 -153
  336. package/dist/input/interrupt-gesture.d.ts +0 -18
  337. package/dist/input/interrupt-gesture.js +0 -19
  338. package/dist/input/keyboard-enhancement.d.ts +0 -42
  339. package/dist/input/keyboard-enhancement.js +0 -65
  340. package/dist/input/keymap.d.ts +0 -20
  341. package/dist/input/keymap.js +0 -99
  342. package/dist/input/limits.d.ts +0 -118
  343. package/dist/input/limits.js +0 -109
  344. package/dist/input/mouse-events.d.ts +0 -87
  345. package/dist/input/mouse-events.js +0 -212
  346. package/dist/input/paste-parse.d.ts +0 -83
  347. package/dist/input/paste-parse.js +0 -107
  348. package/dist/input/pointer-router.d.ts +0 -11
  349. package/dist/input/pointer-router.js +0 -14
  350. package/dist/input/stdin-filter.d.ts +0 -112
  351. package/dist/input/stdin-filter.js +0 -657
  352. package/dist/input/win32-input-mode.d.ts +0 -61
  353. package/dist/input/win32-input-mode.js +0 -269
  354. package/dist/logging/levels.d.ts +0 -40
  355. package/dist/logging/levels.js +0 -59
  356. package/dist/logging/secret-registry.d.ts +0 -32
  357. package/dist/logging/secret-registry.js +0 -73
  358. package/dist/proc/limits.d.ts +0 -214
  359. package/dist/proc/limits.js +0 -221
  360. package/dist/proc/progress.d.ts +0 -47
  361. package/dist/proc/progress.js +0 -163
  362. package/dist/proc/types.d.ts +0 -269
  363. package/dist/proc/types.js +0 -15
  364. package/dist/proc/wait-view.d.ts +0 -65
  365. package/dist/proc/wait-view.js +0 -66
  366. package/dist/prompts/copy.d.ts +0 -89
  367. package/dist/prompts/copy.js +0 -131
  368. package/dist/prompts/fill.d.ts +0 -51
  369. package/dist/prompts/fill.js +0 -46
  370. package/dist/prompts/limits.d.ts +0 -53
  371. package/dist/prompts/limits.js +0 -53
  372. package/dist/prompts/search.d.ts +0 -58
  373. package/dist/prompts/search.js +0 -146
  374. package/dist/prompts/types.d.ts +0 -204
  375. package/dist/prompts/types.js +0 -13
  376. package/dist/team/activity.d.ts +0 -67
  377. package/dist/team/activity.js +0 -130
  378. package/dist/team/limits.d.ts +0 -308
  379. package/dist/team/limits.js +0 -330
  380. package/dist/team/model.d.ts +0 -104
  381. package/dist/team/model.js +0 -150
  382. package/dist/team/panel-rows.d.ts +0 -48
  383. package/dist/team/panel-rows.js +0 -75
  384. package/dist/team/timeline.d.ts +0 -74
  385. package/dist/team/timeline.js +0 -101
  386. package/dist/team/types.d.ts +0 -354
  387. package/dist/team/types.js +0 -13
  388. package/dist/todo/acceptance.d.ts +0 -120
  389. package/dist/todo/acceptance.js +0 -399
  390. package/dist/todo/follow-through.d.ts +0 -138
  391. package/dist/todo/follow-through.js +0 -248
  392. package/dist/todo/limits.d.ts +0 -152
  393. package/dist/todo/limits.js +0 -152
  394. package/dist/todo/panel-rows.d.ts +0 -45
  395. package/dist/todo/panel-rows.js +0 -70
  396. package/dist/todo/plan-sections.d.ts +0 -60
  397. package/dist/todo/plan-sections.js +0 -108
  398. package/dist/todo/row-window.d.ts +0 -51
  399. package/dist/todo/row-window.js +0 -107
  400. package/dist/todo/types.d.ts +0 -124
  401. package/dist/todo/types.js +0 -12
  402. package/dist/tools/human-input.d.ts +0 -212
  403. package/dist/tools/human-input.js +0 -265
  404. package/dist/tools/patch.d.ts +0 -115
  405. package/dist/tools/patch.js +0 -453
  406. package/dist/tools/terminal-output.d.ts +0 -115
  407. package/dist/tools/terminal-output.js +0 -201
  408. package/dist/tools/tool-output-store.d.ts +0 -68
  409. package/dist/tools/tool-output-store.js +0 -102
  410. package/dist/ui/ActivityLine.d.ts +0 -26
  411. package/dist/ui/ActivityLine.js +0 -51
  412. package/dist/ui/AutocompletePopup.d.ts +0 -23
  413. package/dist/ui/AutocompletePopup.js +0 -17
  414. package/dist/ui/BottomStatusRow.d.ts +0 -10
  415. package/dist/ui/BottomStatusRow.js +0 -9
  416. package/dist/ui/Composer.d.ts +0 -115
  417. package/dist/ui/Composer.js +0 -64
  418. package/dist/ui/GovernancePanel.d.ts +0 -50
  419. package/dist/ui/GovernancePanel.js +0 -77
  420. package/dist/ui/GovernanceRun.d.ts +0 -18
  421. package/dist/ui/GovernanceRun.js +0 -11
  422. package/dist/ui/Header.d.ts +0 -48
  423. package/dist/ui/Header.js +0 -27
  424. package/dist/ui/Logo.d.ts +0 -32
  425. package/dist/ui/Logo.js +0 -65
  426. package/dist/ui/Markdown.d.ts +0 -29
  427. package/dist/ui/Markdown.js +0 -116
  428. package/dist/ui/PromptCaret.d.ts +0 -11
  429. package/dist/ui/PromptCaret.js +0 -31
  430. package/dist/ui/PromptInput.d.ts +0 -192
  431. package/dist/ui/PromptInput.js +0 -689
  432. package/dist/ui/QueuePanel.d.ts +0 -8
  433. package/dist/ui/QueuePanel.js +0 -9
  434. package/dist/ui/QueueStatusRow.d.ts +0 -24
  435. package/dist/ui/QueueStatusRow.js +0 -51
  436. package/dist/ui/ScrollbackShell.d.ts +0 -132
  437. package/dist/ui/ScrollbackShell.js +0 -26
  438. package/dist/ui/SessionOpener.d.ts +0 -30
  439. package/dist/ui/SessionOpener.js +0 -12
  440. package/dist/ui/StatusBar.d.ts +0 -130
  441. package/dist/ui/StatusBar.js +0 -61
  442. package/dist/ui/TeamPanel.d.ts +0 -76
  443. package/dist/ui/TeamPanel.js +0 -103
  444. package/dist/ui/ToastStack.d.ts +0 -8
  445. package/dist/ui/ToastStack.js +0 -31
  446. package/dist/ui/TodoPanel.d.ts +0 -52
  447. package/dist/ui/TodoPanel.js +0 -214
  448. package/dist/ui/Transcript.d.ts +0 -105
  449. package/dist/ui/Transcript.js +0 -258
  450. package/dist/ui/UpdateLine.d.ts +0 -44
  451. package/dist/ui/UpdateLine.js +0 -129
  452. package/dist/ui/activity-phrases.d.ts +0 -33
  453. package/dist/ui/activity-phrases.js +0 -50
  454. package/dist/ui/capabilities.d.ts +0 -27
  455. package/dist/ui/capabilities.js +0 -65
  456. package/dist/ui/clipboard-task.d.ts +0 -29
  457. package/dist/ui/clipboard-task.js +0 -66
  458. package/dist/ui/clipboard.d.ts +0 -31
  459. package/dist/ui/clipboard.js +0 -157
  460. package/dist/ui/color-runtime.d.ts +0 -5
  461. package/dist/ui/color-runtime.js +0 -29
  462. package/dist/ui/composer-input.d.ts +0 -38
  463. package/dist/ui/composer-input.js +0 -79
  464. package/dist/ui/composer-limits.d.ts +0 -30
  465. package/dist/ui/composer-limits.js +0 -45
  466. package/dist/ui/composer-rows.d.ts +0 -73
  467. package/dist/ui/composer-rows.js +0 -129
  468. package/dist/ui/console-bridge.d.ts +0 -19
  469. package/dist/ui/console-bridge.js +0 -52
  470. package/dist/ui/density.d.ts +0 -26
  471. package/dist/ui/density.js +0 -34
  472. package/dist/ui/display-tab.d.ts +0 -51
  473. package/dist/ui/display-tab.js +0 -82
  474. package/dist/ui/editor-navigation.d.ts +0 -55
  475. package/dist/ui/editor-navigation.js +0 -96
  476. package/dist/ui/editor-reducer.d.ts +0 -108
  477. package/dist/ui/editor-reducer.js +0 -187
  478. package/dist/ui/enter-frames.d.ts +0 -47
  479. package/dist/ui/enter-frames.js +0 -117
  480. package/dist/ui/entries/AssistantEntry.d.ts +0 -37
  481. package/dist/ui/entries/AssistantEntry.js +0 -43
  482. package/dist/ui/entries/CompactionCard.d.ts +0 -88
  483. package/dist/ui/entries/CompactionCard.js +0 -222
  484. package/dist/ui/entries/DiffView.d.ts +0 -61
  485. package/dist/ui/entries/DiffView.js +0 -103
  486. package/dist/ui/entries/EntryFrame.d.ts +0 -23
  487. package/dist/ui/entries/EntryFrame.js +0 -6
  488. package/dist/ui/entries/FastCard.d.ts +0 -53
  489. package/dist/ui/entries/FastCard.js +0 -105
  490. package/dist/ui/entries/GovernanceCard.d.ts +0 -30
  491. package/dist/ui/entries/GovernanceCard.js +0 -32
  492. package/dist/ui/entries/InvocationCard.d.ts +0 -20
  493. package/dist/ui/entries/InvocationCard.js +0 -32
  494. package/dist/ui/entries/QueuedEntry.d.ts +0 -27
  495. package/dist/ui/entries/QueuedEntry.js +0 -33
  496. package/dist/ui/entries/RetryCard.d.ts +0 -56
  497. package/dist/ui/entries/RetryCard.js +0 -60
  498. package/dist/ui/entries/ServiceCard.d.ts +0 -82
  499. package/dist/ui/entries/ServiceCard.js +0 -151
  500. package/dist/ui/entries/TeamCard.d.ts +0 -55
  501. package/dist/ui/entries/TeamCard.js +0 -94
  502. package/dist/ui/entries/TodoCard.d.ts +0 -54
  503. package/dist/ui/entries/TodoCard.js +0 -98
  504. package/dist/ui/entries/ToolCard.d.ts +0 -81
  505. package/dist/ui/entries/ToolCard.js +0 -169
  506. package/dist/ui/entries/ToolPreview.d.ts +0 -59
  507. package/dist/ui/entries/ToolPreview.js +0 -208
  508. package/dist/ui/entries/UserEntry.d.ts +0 -36
  509. package/dist/ui/entries/UserEntry.js +0 -57
  510. package/dist/ui/entries/WaitCard.d.ts +0 -37
  511. package/dist/ui/entries/WaitCard.js +0 -92
  512. package/dist/ui/exit-snapshot.d.ts +0 -43
  513. package/dist/ui/exit-snapshot.js +0 -26
  514. package/dist/ui/frame-differ.d.ts +0 -166
  515. package/dist/ui/frame-differ.js +0 -354
  516. package/dist/ui/frame-observer.d.ts +0 -17
  517. package/dist/ui/frame-observer.js +0 -94
  518. package/dist/ui/frame-parser.d.ts +0 -7
  519. package/dist/ui/frame-parser.js +0 -18
  520. package/dist/ui/gauge.d.ts +0 -39
  521. package/dist/ui/gauge.js +0 -55
  522. package/dist/ui/glyphs.d.ts +0 -178
  523. package/dist/ui/glyphs.js +0 -165
  524. package/dist/ui/governance-copy.d.ts +0 -69
  525. package/dist/ui/governance-copy.js +0 -104
  526. package/dist/ui/governance-status.d.ts +0 -145
  527. package/dist/ui/governance-status.js +0 -326
  528. package/dist/ui/gradient.d.ts +0 -11
  529. package/dist/ui/gradient.js +0 -50
  530. package/dist/ui/ink-runtime.d.ts +0 -4
  531. package/dist/ui/ink-runtime.js +0 -51
  532. package/dist/ui/interaction-copy.d.ts +0 -84
  533. package/dist/ui/interaction-copy.js +0 -41
  534. package/dist/ui/interaction-hints.d.ts +0 -44
  535. package/dist/ui/interaction-hints.js +0 -97
  536. package/dist/ui/layout/AppShell.d.ts +0 -17
  537. package/dist/ui/layout/AppShell.js +0 -6
  538. package/dist/ui/layout/Gutter.d.ts +0 -67
  539. package/dist/ui/layout/Gutter.js +0 -42
  540. package/dist/ui/layout/MeasuredEntry.d.ts +0 -21
  541. package/dist/ui/layout/MeasuredEntry.js +0 -30
  542. package/dist/ui/layout/OverlayFrame.d.ts +0 -73
  543. package/dist/ui/layout/OverlayFrame.js +0 -110
  544. package/dist/ui/layout/ScrollIndicator.d.ts +0 -32
  545. package/dist/ui/layout/ScrollIndicator.js +0 -22
  546. package/dist/ui/layout/ScrollViewport.d.ts +0 -40
  547. package/dist/ui/layout/ScrollViewport.js +0 -222
  548. package/dist/ui/layout/agents-board.d.ts +0 -102
  549. package/dist/ui/layout/agents-board.js +0 -389
  550. package/dist/ui/layout/autocomplete.d.ts +0 -18
  551. package/dist/ui/layout/autocomplete.js +0 -26
  552. package/dist/ui/layout/budget.d.ts +0 -43
  553. package/dist/ui/layout/budget.js +0 -52
  554. package/dist/ui/layout/cells.d.ts +0 -61
  555. package/dist/ui/layout/cells.js +0 -156
  556. package/dist/ui/layout/document-layout.d.ts +0 -13
  557. package/dist/ui/layout/document-layout.js +0 -10
  558. package/dist/ui/layout/follow-state.d.ts +0 -138
  559. package/dist/ui/layout/follow-state.js +0 -148
  560. package/dist/ui/layout/frame.d.ts +0 -36
  561. package/dist/ui/layout/frame.js +0 -39
  562. package/dist/ui/layout/governance-board.d.ts +0 -121
  563. package/dist/ui/layout/governance-board.js +0 -382
  564. package/dist/ui/layout/governance-card.d.ts +0 -53
  565. package/dist/ui/layout/governance-card.js +0 -134
  566. package/dist/ui/layout/governance-chip.d.ts +0 -38
  567. package/dist/ui/layout/governance-chip.js +0 -64
  568. package/dist/ui/layout/governance-panel.d.ts +0 -85
  569. package/dist/ui/layout/governance-panel.js +0 -358
  570. package/dist/ui/layout/governance-roster.d.ts +0 -65
  571. package/dist/ui/layout/governance-roster.js +0 -275
  572. package/dist/ui/layout/header-hints.d.ts +0 -90
  573. package/dist/ui/layout/header-hints.js +0 -110
  574. package/dist/ui/layout/header-left.d.ts +0 -115
  575. package/dist/ui/layout/header-left.js +0 -206
  576. package/dist/ui/layout/invocation-card.d.ts +0 -41
  577. package/dist/ui/layout/invocation-card.js +0 -91
  578. package/dist/ui/layout/kit-chip.d.ts +0 -50
  579. package/dist/ui/layout/kit-chip.js +0 -81
  580. package/dist/ui/layout/overlay-window.d.ts +0 -43
  581. package/dist/ui/layout/overlay-window.js +0 -51
  582. package/dist/ui/layout/queue-layout.d.ts +0 -19
  583. package/dist/ui/layout/queue-layout.js +0 -26
  584. package/dist/ui/layout/rail.d.ts +0 -7
  585. package/dist/ui/layout/rail.js +0 -16
  586. package/dist/ui/layout/scroll-indicator.d.ts +0 -27
  587. package/dist/ui/layout/scroll-indicator.js +0 -36
  588. package/dist/ui/layout/scroll.d.ts +0 -37
  589. package/dist/ui/layout/scroll.js +0 -99
  590. package/dist/ui/layout/scrollbar-geometry.d.ts +0 -17
  591. package/dist/ui/layout/scrollbar-geometry.js +0 -13
  592. package/dist/ui/layout/session-chip.d.ts +0 -52
  593. package/dist/ui/layout/session-chip.js +0 -64
  594. package/dist/ui/layout/shortcut-panel-layout.d.ts +0 -191
  595. package/dist/ui/layout/shortcut-panel-layout.js +0 -321
  596. package/dist/ui/layout/status-detail-layout.d.ts +0 -9
  597. package/dist/ui/layout/status-detail-layout.js +0 -79
  598. package/dist/ui/layout/status-layout.d.ts +0 -140
  599. package/dist/ui/layout/status-layout.js +0 -262
  600. package/dist/ui/layout/task-summary-cell.d.ts +0 -61
  601. package/dist/ui/layout/task-summary-cell.js +0 -65
  602. package/dist/ui/layout/team-panel.d.ts +0 -18
  603. package/dist/ui/layout/team-panel.js +0 -25
  604. package/dist/ui/layout/team-row.d.ts +0 -139
  605. package/dist/ui/layout/team-row.js +0 -246
  606. package/dist/ui/layout/todo-layout.d.ts +0 -62
  607. package/dist/ui/layout/todo-layout.js +0 -102
  608. package/dist/ui/layout/useTerminalSize.d.ts +0 -13
  609. package/dist/ui/layout/useTerminalSize.js +0 -50
  610. package/dist/ui/layout/viewport-geometry.d.ts +0 -29
  611. package/dist/ui/layout/viewport-geometry.js +0 -28
  612. package/dist/ui/layout/virtual-window.d.ts +0 -112
  613. package/dist/ui/layout/virtual-window.js +0 -494
  614. package/dist/ui/layout/wait-bar.d.ts +0 -34
  615. package/dist/ui/layout/wait-bar.js +0 -48
  616. package/dist/ui/layout/wrap-rows.d.ts +0 -26
  617. package/dist/ui/layout/wrap-rows.js +0 -88
  618. package/dist/ui/live-clamp.d.ts +0 -14
  619. package/dist/ui/live-clamp.js +0 -46
  620. package/dist/ui/markdown-blocks.d.ts +0 -107
  621. package/dist/ui/markdown-blocks.js +0 -240
  622. package/dist/ui/overlays/AgentsBoardOverlay.d.ts +0 -57
  623. package/dist/ui/overlays/AgentsBoardOverlay.js +0 -183
  624. package/dist/ui/overlays/ConfirmDialog.d.ts +0 -31
  625. package/dist/ui/overlays/ConfirmDialog.js +0 -44
  626. package/dist/ui/overlays/GovernanceBoardOverlay.d.ts +0 -41
  627. package/dist/ui/overlays/GovernanceBoardOverlay.js +0 -76
  628. package/dist/ui/overlays/GovernanceSettingsPage.d.ts +0 -48
  629. package/dist/ui/overlays/GovernanceSettingsPage.js +0 -93
  630. package/dist/ui/overlays/HelpOverlay.d.ts +0 -29
  631. package/dist/ui/overlays/HelpOverlay.js +0 -232
  632. package/dist/ui/overlays/KitEditor.d.ts +0 -23
  633. package/dist/ui/overlays/KitEditor.js +0 -101
  634. package/dist/ui/overlays/KitManager.d.ts +0 -23
  635. package/dist/ui/overlays/KitManager.js +0 -104
  636. package/dist/ui/overlays/KitPicker.d.ts +0 -49
  637. package/dist/ui/overlays/KitPicker.js +0 -58
  638. package/dist/ui/overlays/ModelDiscoveryList.d.ts +0 -23
  639. package/dist/ui/overlays/ModelDiscoveryList.js +0 -161
  640. package/dist/ui/overlays/ModelPicker.d.ts +0 -26
  641. package/dist/ui/overlays/ModelPicker.js +0 -63
  642. package/dist/ui/overlays/ModelProfileEditor.d.ts +0 -29
  643. package/dist/ui/overlays/ModelProfileEditor.js +0 -168
  644. package/dist/ui/overlays/ModelProfilePicker.d.ts +0 -48
  645. package/dist/ui/overlays/ModelProfilePicker.js +0 -231
  646. package/dist/ui/overlays/PlanReviewOverlay.d.ts +0 -51
  647. package/dist/ui/overlays/PlanReviewOverlay.js +0 -132
  648. package/dist/ui/overlays/PromptEditorPage.d.ts +0 -48
  649. package/dist/ui/overlays/PromptEditorPage.js +0 -227
  650. package/dist/ui/overlays/PromptLibraryOverlay.d.ts +0 -37
  651. package/dist/ui/overlays/PromptLibraryOverlay.js +0 -191
  652. package/dist/ui/overlays/PromptPicker.d.ts +0 -36
  653. package/dist/ui/overlays/PromptPicker.js +0 -129
  654. package/dist/ui/overlays/PromptTextArea.d.ts +0 -86
  655. package/dist/ui/overlays/PromptTextArea.js +0 -141
  656. package/dist/ui/overlays/QuestionOverlay.d.ts +0 -39
  657. package/dist/ui/overlays/QuestionOverlay.js +0 -258
  658. package/dist/ui/overlays/QueueOverlay.d.ts +0 -22
  659. package/dist/ui/overlays/QueueOverlay.js +0 -79
  660. package/dist/ui/overlays/SettingsScreen.d.ts +0 -228
  661. package/dist/ui/overlays/SettingsScreen.js +0 -1037
  662. package/dist/ui/overlays/ShortcutPanel.d.ts +0 -39
  663. package/dist/ui/overlays/ShortcutPanel.js +0 -106
  664. package/dist/ui/overlays/TeamFanoutPage.d.ts +0 -51
  665. package/dist/ui/overlays/TeamFanoutPage.js +0 -90
  666. package/dist/ui/overlays/governance-settings.d.ts +0 -79
  667. package/dist/ui/overlays/governance-settings.js +0 -140
  668. package/dist/ui/overlays/kit-picker-state.d.ts +0 -87
  669. package/dist/ui/overlays/kit-picker-state.js +0 -136
  670. package/dist/ui/overlays/kit-settings-state.d.ts +0 -129
  671. package/dist/ui/overlays/kit-settings-state.js +0 -268
  672. package/dist/ui/overlays/model-probe-view.d.ts +0 -128
  673. package/dist/ui/overlays/model-probe-view.js +0 -225
  674. package/dist/ui/overlays/model-profile-state.d.ts +0 -177
  675. package/dist/ui/overlays/model-profile-state.js +0 -301
  676. package/dist/ui/overlays/prompt-library-state.d.ts +0 -162
  677. package/dist/ui/overlays/prompt-library-state.js +0 -335
  678. package/dist/ui/overlays/prompt-picker-state.d.ts +0 -71
  679. package/dist/ui/overlays/prompt-picker-state.js +0 -98
  680. package/dist/ui/overlays/team-fanout-state.d.ts +0 -106
  681. package/dist/ui/overlays/team-fanout-state.js +0 -155
  682. package/dist/ui/overlays/use-model-probe.d.ts +0 -30
  683. package/dist/ui/overlays/use-model-probe.js +0 -109
  684. package/dist/ui/palettes.d.ts +0 -112
  685. package/dist/ui/palettes.js +0 -130
  686. package/dist/ui/paste-frames.d.ts +0 -91
  687. package/dist/ui/paste-frames.js +0 -117
  688. package/dist/ui/paste-tokens.d.ts +0 -90
  689. package/dist/ui/paste-tokens.js +0 -147
  690. package/dist/ui/render-cache.d.ts +0 -81
  691. package/dist/ui/render-cache.js +0 -196
  692. package/dist/ui/render-governor.d.ts +0 -54
  693. package/dist/ui/render-governor.js +0 -78
  694. package/dist/ui/run-metrics.d.ts +0 -23
  695. package/dist/ui/run-metrics.js +0 -27
  696. package/dist/ui/run-status-row.d.ts +0 -63
  697. package/dist/ui/run-status-row.js +0 -54
  698. package/dist/ui/screen.d.ts +0 -107
  699. package/dist/ui/screen.js +0 -234
  700. package/dist/ui/scrollback/LiveTail.d.ts +0 -115
  701. package/dist/ui/scrollback/LiveTail.js +0 -48
  702. package/dist/ui/scrollback/band.d.ts +0 -114
  703. package/dist/ui/scrollback/band.js +0 -143
  704. package/dist/ui/scrollback/budget.d.ts +0 -90
  705. package/dist/ui/scrollback/budget.js +0 -100
  706. package/dist/ui/scrollback/canvas.d.ts +0 -100
  707. package/dist/ui/scrollback/canvas.js +0 -114
  708. package/dist/ui/scrollback/cursor-probe.d.ts +0 -71
  709. package/dist/ui/scrollback/cursor-probe.js +0 -133
  710. package/dist/ui/scrollback/drain.d.ts +0 -32
  711. package/dist/ui/scrollback/drain.js +0 -64
  712. package/dist/ui/scrollback/exit-summary.d.ts +0 -23
  713. package/dist/ui/scrollback/exit-summary.js +0 -25
  714. package/dist/ui/scrollback/limits.d.ts +0 -98
  715. package/dist/ui/scrollback/limits.js +0 -98
  716. package/dist/ui/scrollback/live-preview.d.ts +0 -34
  717. package/dist/ui/scrollback/live-preview.js +0 -130
  718. package/dist/ui/scrollback/overflow-print.d.ts +0 -108
  719. package/dist/ui/scrollback/overflow-print.js +0 -120
  720. package/dist/ui/scrollback/renderer.d.ts +0 -48
  721. package/dist/ui/scrollback/renderer.js +0 -186
  722. package/dist/ui/scrollback/scrollback-writer.d.ts +0 -174
  723. package/dist/ui/scrollback/scrollback-writer.js +0 -648
  724. package/dist/ui/scrollback/settled-boundary.d.ts +0 -42
  725. package/dist/ui/scrollback/settled-boundary.js +0 -109
  726. package/dist/ui/scrollback/tail-anchor.d.ts +0 -71
  727. package/dist/ui/scrollback/tail-anchor.js +0 -79
  728. package/dist/ui/scrollback/tail-window.d.ts +0 -73
  729. package/dist/ui/scrollback/tail-window.js +0 -89
  730. package/dist/ui/scrollback/use-scrollback-view.d.ts +0 -139
  731. package/dist/ui/scrollback/use-scrollback-view.js +0 -601
  732. package/dist/ui/scrollback/writer-shapes.d.ts +0 -127
  733. package/dist/ui/scrollback/writer-shapes.js +0 -159
  734. package/dist/ui/scrollbar-controller.d.ts +0 -30
  735. package/dist/ui/scrollbar-controller.js +0 -124
  736. package/dist/ui/selection/highlight.d.ts +0 -39
  737. package/dist/ui/selection/highlight.js +0 -64
  738. package/dist/ui/selection/screen-mirror.d.ts +0 -24
  739. package/dist/ui/selection/screen-mirror.js +0 -35
  740. package/dist/ui/selection/selection-controller.d.ts +0 -104
  741. package/dist/ui/selection/selection-controller.js +0 -372
  742. package/dist/ui/selection/selection.d.ts +0 -90
  743. package/dist/ui/selection/selection.js +0 -223
  744. package/dist/ui/shortcuts.d.ts +0 -81
  745. package/dist/ui/shortcuts.js +0 -221
  746. package/dist/ui/status-feedback.d.ts +0 -35
  747. package/dist/ui/status-feedback.js +0 -38
  748. package/dist/ui/stdout-frame-writer.d.ts +0 -74
  749. package/dist/ui/stdout-frame-writer.js +0 -155
  750. package/dist/ui/team-status.d.ts +0 -166
  751. package/dist/ui/team-status.js +0 -252
  752. package/dist/ui/terminal-plan.d.ts +0 -52
  753. package/dist/ui/terminal-plan.js +0 -49
  754. package/dist/ui/theme.d.ts +0 -96
  755. package/dist/ui/theme.js +0 -130
  756. package/dist/ui/transcript-text.d.ts +0 -41
  757. package/dist/ui/transcript-text.js +0 -282
  758. package/dist/ui/use-height-store.d.ts +0 -31
  759. package/dist/ui/use-height-store.js +0 -76
  760. package/dist/ui/use-render-governor.d.ts +0 -39
  761. package/dist/ui/use-render-governor.js +0 -57
  762. package/dist/ui/use-wheel-routing.d.ts +0 -57
  763. package/dist/ui/use-wheel-routing.js +0 -152
  764. package/dist/ui/win-vt-force.d.ts +0 -136
  765. package/dist/ui/win-vt-force.js +0 -237
  766. package/dist/ui/win-vt-input.d.ts +0 -57
  767. package/dist/ui/win-vt-input.js +0 -62
  768. package/dist/update/limits.d.ts +0 -111
  769. package/dist/update/limits.js +0 -111
  770. package/dist/update/semver.d.ts +0 -89
  771. package/dist/update/semver.js +0 -295
  772. package/dist/update/types.d.ts +0 -169
  773. package/dist/update/types.js +0 -68
  774. /package/dist/{ui → app}/session-bridge.d.ts +0 -0
  775. /package/dist/{ui → app}/session-bridge.js +0 -0
@@ -1,601 +0,0 @@
1
- /**
2
- * `useScrollbackView` — the promotion pipeline of native-scroll mode
3
- * (tui-native-terminal-scroll §4.4 / §6.2, tui-full-height-live-region D3/D4/D7/D8,
4
- * tui-final-reply-truncated-unscrollable A-prime).
5
- *
6
- * `App` calls it ALWAYS (hooks cannot be conditional); `enabled: false` makes every
7
- * effect a no-op and keeps `scrollMode: 'app'` byte-identical to the pre-feature
8
- * build (I-S9 / I-F10).
9
- *
10
- * What it does when enabled:
11
- * 1. On every entries change, promotes each entry that has LEFT THE TAIL WINDOW:
12
- * renders it once through the offscreen renderer and enqueues the rows for the
13
- * writer. Entries still on screen are never printed - at `H = rows - 1` a printed
14
- * row is pushed back off the top by the next frame, and a second copy in the
15
- * scrollback would be a duplicate the user meets by scrolling up (I-F8).
16
- * 2. Gives way at the TOP (tui-final-reply-truncated-unscrollable). The window is still
17
- * counted in ENTRIES, so a settled answer taller than the box used to sit inside the
18
- * window forever, clipped by `justifyContent="flex-end"`, in a mode whose wheel only
19
- * scrolls the terminal's scrollback: the clipped rows existed nowhere the user could
20
- * reach. The rows the box hides are now measured (`overflow-print.ts`) and printed, so
21
- * `scrollback + screen` covers every row exactly once. Screen unchanged, reachability
22
- * fixed.
23
- * 3. Computes the live-region budget, the window and the tail rows for the shell.
24
- * 4. Flushes the window before either reset path (`/clear`, `--resume`) and on exit,
25
- * so "on screen but not printed yet" can never become "lost" (D8 / I-F12).
26
- *
27
- * THE HEADER AND THE OPENER ARE NOT PRINTED HERE ANY MORE (D3/D4). They are slots of
28
- * `ScrollbackShell` now, rendered inside the region: `H = rows - 1` means any printed
29
- * row is immediately scrolled off the screen, so printing the banner would be the same
30
- * as not drawing it. Their `renderNode` path, the `startedRef` latch that kept their
31
- * element identities stable, and the `printBanner()` call in `settleAll()` are gone.
32
- *
33
- * THE PROMOTION RUNS IN A MICROTASK, NOT IN THE EFFECT. The offscreen renderer is a
34
- * second Ink instance, and both instances share one React reconciler. A `rerender`
35
- * issued from inside the main tree's commit (a layout effect) is deferred until that
36
- * commit finishes, so its frame would not exist when the effect reads it. A microtask
37
- * runs after the commit has unwound, where the offscreen render is synchronous again.
38
- *
39
- * THE PASS READS THE COMMITTED FRAME, NOT THE LATEST RENDER. `latest` is refreshed during
40
- * render, so it can be a frame ahead of the screen; `committed` is written by a layout
41
- * effect and therefore describes exactly the frame the user is looking at. With
42
- * entry-granular bookkeeping the difference was harmless (printing was idempotent per
43
- * entry); with ROW-granular bookkeeping it would slice this frame's picture with another
44
- * frame's row numbers, and the result is a duplicate or a hole.
45
- *
46
- * `printed` is the ONLY authority on "already printed" (RV-7): a `Map` from entry id to
47
- * the leading rows already handed to the writer, and the width they were measured at. The
48
- * cursor is just a hint for where to resume scanning: entries leave the list by retain-ring
49
- * trimming AND by reducer deletion (empty settled assistants, abandoned tool cards), so an
50
- * id-keyed cursor can dangle, and then the only correct answer is to rescan and let
51
- * `printed` skip.
52
- */
53
- import { useCallback, useEffect, useLayoutEffect, useMemo, useReducer, useRef } from 'react';
54
- import { estimateEntryRows } from '../layout/virtual-window.js';
55
- import { isLiveTeamCard } from '../team-status.js';
56
- import { buildScrollbackBudget } from './budget.js';
57
- import { buildLivePreview } from './live-preview.js';
58
- import { SCROLLBACK_LIMITS } from './limits.js';
59
- import { capPrintedRows, planOverflowPrint, reflowSeamRow, } from './overflow-print.js';
60
- import { createEntryRenderer } from './renderer.js';
61
- import { isEntryStable, isExcluded, settleAllEntries } from './settled-boundary.js';
62
- import { resolveTailAnchor } from './tail-anchor.js';
63
- import { printBoundary, selectTailWindow } from './tail-window.js';
64
- export function createScrollbackBridge(parts) {
65
- return {
66
- writer: parts.writer,
67
- drain: parts.drain,
68
- requestFlush: parts.requestFlush ?? (() => undefined),
69
- settleAllNow: () => undefined,
70
- getSummaryRows: () => [],
71
- onGuardTrip: null,
72
- };
73
- }
74
- const CLEARED_ROW = '---- conversation cleared ----';
75
- const RESTORED_ROW = '---- session restored ----';
76
- function printableBefore(entries, index) {
77
- for (let i = index - 1; i >= 0; i -= 1) {
78
- if (!isExcluded(entries[i]))
79
- return entries[i];
80
- }
81
- return undefined;
82
- }
83
- /**
84
- * Ids leave `entries` by retain-ring trimming and never come back (ids are unique
85
- * per session), so both row maps are trimmed to the live list once they grow well past
86
- * it. Only ids still present can be re-evaluated, so dropping the rest is lossless.
87
- */
88
- function pruneEntryIds(entries, printed, heights) {
89
- const bound = Math.max(2000, entries.length * 3);
90
- if (printed.size <= bound && heights.size <= bound)
91
- return;
92
- const live = new Set(entries.map((entry) => entry.id));
93
- for (const id of [...printed.keys()])
94
- if (!live.has(id))
95
- printed.delete(id);
96
- // Height keys are `id|cols|expanded|thinking`; only the id part decides liveness.
97
- for (const key of [...heights.keys()]) {
98
- if (!live.has(key.slice(0, key.indexOf('|'))))
99
- heights.delete(key);
100
- }
101
- }
102
- /** The word the expanded-copy header uses for one entry kind. */
103
- function expandedLabel(entry) {
104
- if (entry.kind === 'tool')
105
- return entry.name;
106
- // The escape hatch exists for the Agent's ANSWER (known limitation 2 promised it), so the
107
- // header says what the user pressed Ctrl+O for instead of the internal kind name.
108
- if (entry.kind === 'assistant')
109
- return 'answer';
110
- return entry.kind;
111
- }
112
- export function useScrollbackView(args) {
113
- const { enabled, bridge, entries, runActive, theme, caps, density, thinkingVisible, reducedMotion, rows, cols, overlayOpen, draftRows, popupRows, statusExpanded, forceInactive = false, itemCount, panelEnabled, teamRowsNatural, expandedToolIds, } = args;
114
- const contentCols = Math.max(1, cols - 1);
115
- // Everything the asynchronous EXIT and RESET paths read travels here, refreshed on every
116
- // render (see `committed` for why the promotion pass does not read it).
117
- const latest = useRef({
118
- entries, runActive, contentCols, previewCols: contentCols, expandedToolIds,
119
- options: { theme, caps, density, thinkingVisible, reducedMotion },
120
- });
121
- latest.current = {
122
- entries, runActive, contentCols, previewCols: latest.current.previewCols, expandedToolIds,
123
- options: { theme, caps, density, thinkingVisible, reducedMotion },
124
- };
125
- const rendererRef = useRef(null);
126
- /** THE authority on "already printed" (RV-7), per entry and per row. */
127
- const printed = useRef(new Map());
128
- /** Measured heights, `id|cols|expanded|thinking` -> rows. Only STABLE entries are stored. */
129
- const heights = useRef(new Map());
130
- /** A resume hint only (RV-7): the id of the last entry the previous pass covered. */
131
- const cursorRef = useRef(null);
132
- const pendingReset = useRef(null);
133
- const headRowsRef = useRef(0);
134
- /** Guards the "measure, then re-render so the anchor can use it" nudge against a loop. */
135
- const nudgedRef = useRef(null);
136
- // Band hysteresis (release-gate-and-native-panels §6.7): the writer re-lays out the
137
- // canvas on every batch, so a band that shrank for two frames would make everything
138
- // above the composer jump.
139
- const heldRailRows = useRef(0);
140
- const heldTeamRows = useRef(0);
141
- const heldGeometry = useRef({ rows, cols });
142
- const pumpQueued = useRef(false);
143
- const mountedRef = useRef(true);
144
- const committed = useRef(null);
145
- /** Bumped when a measurement has to reach `LiveTail` before the next pass may print. */
146
- const [measureEpoch, bumpMeasureEpoch] = useReducer((n) => n + 1, 0);
147
- const ensureRenderer = useCallback(() => {
148
- if (!rendererRef.current)
149
- rendererRef.current = createEntryRenderer(latest.current.options);
150
- rendererRef.current.setOptions(latest.current.options);
151
- return rendererRef.current;
152
- }, []);
153
- const enqueue = useCallback((rowsToPrint, id, kind) => {
154
- if (rowsToPrint.length === 0 || !bridge)
155
- return;
156
- bridge.drain.enqueue(rowsToPrint, { id, kind });
157
- }, [bridge]);
158
- const heightKey = useCallback((entry, colsNow, expanded) => `${entry.id}|${colsNow}|${expanded ? 1 : 0}|${thinkingVisible ? 1 : 0}`, [thinkingVisible]);
159
- /** Rows of one entry at `colsNow`, measured once per (id, cols, flags) and cached. */
160
- const measure = useCallback((entry, prev, colsNow, expanded) => {
161
- const key = heightKey(entry, colsNow, expanded);
162
- const cached = heights.current.get(key);
163
- if (cached !== undefined)
164
- return cached;
165
- const measured = ensureRenderer().renderEntryRows(entry, prev, colsNow, expanded).length;
166
- heights.current.set(key, measured);
167
- return measured;
168
- }, [ensureRenderer, heightKey]);
169
- /**
170
- * Which width the REMAINDER of an entry must be printed at.
171
- *
172
- * Row numbers are width-relative, so a recorded width that this frame still legitimately
173
- * renders at is the only width whose row numbers can be trusted (`known`); anything else
174
- * is a reflow, and the caller starts over behind a seam row.
175
- */
176
- const resolvePrintWidth = useCallback((state, wanted, known) => {
177
- if (!state || state.cols === wanted)
178
- return wanted;
179
- return known.includes(state.cols) ? state.cols : wanted;
180
- }, []);
181
- /**
182
- * Print everything of `list[index]` that is not in the scrollback yet, in ONE go.
183
- *
184
- * The entry has left the region, so all of it may print; what is left is the remainder
185
- * behind the rows the top give-way already printed (`printed.rows`). A width change makes
186
- * those row numbers meaningless, so it prints a seam and starts over - a bounded
187
- * repetition instead of a hole.
188
- */
189
- const printRemainder = useCallback((list, index, wantedCols, known, expanded) => {
190
- const entry = list[index];
191
- const state = printed.current.get(entry.id);
192
- if (state?.done)
193
- return;
194
- const width = resolvePrintWidth(state, wantedCols, known);
195
- const restart = state !== undefined && state.cols !== width;
196
- const from = restart ? 0 : state?.rows ?? 0;
197
- const body = ensureRenderer().renderEntryRows(entry, printableBefore(list, index), width, expanded.includes(entry.id));
198
- const seam = restart ? reflowSeamRow(state.rows, state.cols, width) : null;
199
- const tail = body.slice(from);
200
- const capped = capPrintedRows(tail, from);
201
- enqueue(seam === null ? capped : [seam, ...capped], entry.id, entry.kind);
202
- printed.current.set(entry.id, { rows: body.length, cols: width, done: true });
203
- }, [enqueue, ensureRenderer, resolvePrintWidth]);
204
- /** Expanded ids of a frame, as a list so a callback does not depend on the object. */
205
- const expandedIdsOf = useCallback((ids) => Object.keys(ids).filter((id) => ids[id] === true), []);
206
- /** The window as full-list indices (excluded entries already dropped), oldest first. */
207
- const windowItemsOf = useCallback((frame, start) => {
208
- const items = [];
209
- for (let i = start; i < frame.entries.length; i += 1) {
210
- const entry = frame.entries[i];
211
- if (!isExcluded(entry))
212
- items.push({ index: i, entry });
213
- }
214
- return items;
215
- }, []);
216
- /**
217
- * The window's measured rows, or `undefined` when the measurement cannot be trusted.
218
- *
219
- * TWO conditions, both structural rather than defensive. Every entry must be STABLE: an
220
- * entry the reducer may still rewrite has a height that changes, and printing part of it
221
- * would put a version of the answer into the scrollback that can never be corrected. And
222
- * the caller has already checked that the wall does not sit before the window: rows
223
- * behind an unprintable entry would land out of conversation order (I-S3), which is the
224
- * one mistake an append-only medium cannot take back.
225
- */
226
- const measureWindow = useCallback((frame, items) => {
227
- const last = frame.entries.length - 1;
228
- for (const item of items) {
229
- if (!isEntryStable(item.entry, frame.runActive, item.index === last))
230
- return undefined;
231
- }
232
- const expanded = expandedIdsOf(frame.expandedToolIds);
233
- return items.map((item) => {
234
- const state = printed.current.get(item.entry.id);
235
- const comparable = state !== undefined && state.cols === frame.previewCols && !state.done;
236
- return {
237
- entry: item.entry,
238
- rows: measure(item.entry, printableBefore(frame.entries, item.index), frame.previewCols, expanded.includes(item.entry.id)),
239
- printed: comparable ? state.rows : 0,
240
- stable: true,
241
- };
242
- });
243
- }, [expandedIdsOf, measure]);
244
- /** Promote `list[start..end)`; reports when it stopped early because the feed is full. */
245
- const promote = useCallback((frame, end, limit, known) => {
246
- const list = frame.entries;
247
- const expanded = expandedIdsOf(frame.expandedToolIds);
248
- let start = 0;
249
- const cursor = cursorRef.current;
250
- if (cursor && list[cursor.index]?.id === cursor.id)
251
- start = cursor.index + 1;
252
- let used = 0;
253
- let lastIndex = start - 1;
254
- const remember = () => {
255
- cursorRef.current = lastIndex >= 0 ? { id: list[lastIndex].id, index: lastIndex } : null;
256
- };
257
- for (let i = start; i < end; i += 1) {
258
- const entry = list[i];
259
- // A partially printed entry is NOT finished: it is processed until `done`, so a row
260
- // range the give-way left behind is still picked up here (P-5).
261
- if (isExcluded(entry) || printed.current.get(entry.id)?.done === true) {
262
- lastIndex = i;
263
- continue;
264
- }
265
- if (used >= limit) {
266
- remember();
267
- return { limited: true, used };
268
- }
269
- printRemainder(list, i, frame.contentCols, known, expanded);
270
- used += 1;
271
- lastIndex = i;
272
- }
273
- remember();
274
- return { limited: false, used };
275
- }, [expandedIdsOf, printRemainder]);
276
- /**
277
- * THE ONE PRINT LOOP (RV-P0-2 / RV-P2-12): every not-yet-printed entry of `list`,
278
- * oldest first, with no per-pass limit.
279
- *
280
- * `list` is a PARAMETER on purpose. `applyPendingReset` must pass `reset.captured` -
281
- * the snapshot taken BEFORE the reducer reset - because by the time the microtask
282
- * runs, `latest.current.entries` is already the NEW list and flushing that would
283
- * print zero rows: the entries that only ever existed on screen would vanish with
284
- * the reset. That is real data loss, not a cosmetic gap.
285
- *
286
- * `settleAllEntries` is the exit path's authority (everything that can ever print,
287
- * including an entry still streaming at this instant - printed is forever, and the
288
- * conversation is being destroyed right now, so a snapshot beats a hole). The drain
289
- * is FIFO, so the ORDER of the calls below is the order on screen.
290
- */
291
- const flushUnprinted = useCallback((list) => {
292
- if (!bridge)
293
- return;
294
- const known = [latest.current.contentCols, latest.current.previewCols];
295
- const expanded = expandedIdsOf(latest.current.expandedToolIds);
296
- for (const entry of settleAllEntries(list)) {
297
- if (printed.current.get(entry.id)?.done === true)
298
- continue;
299
- printRemainder(list, list.indexOf(entry), latest.current.contentCols, known, expanded);
300
- }
301
- }, [bridge, expandedIdsOf, printRemainder]);
302
- const applyPendingReset = useCallback(() => {
303
- const reset = pendingReset.current;
304
- if (!reset || latest.current.entries === reset.captured)
305
- return;
306
- pendingReset.current = null;
307
- // ORDER IS THE CONTRACT (AC-F16): flush the OLD list, then the separator, then
308
- // forget what was printed. Clearing `printed` first would make the flush print
309
- // the whole conversation a second time.
310
- flushUnprinted(reset.captured);
311
- printed.current = new Map();
312
- cursorRef.current = null;
313
- enqueue([reset.kind === 'clear' ? CLEARED_ROW : RESTORED_ROW], `reset:${Date.now()}`, 'notice');
314
- }, [enqueue, flushUnprinted]);
315
- const pumpRef = useRef(() => undefined);
316
- const schedulePump = useCallback(() => {
317
- if (pumpQueued.current)
318
- return;
319
- pumpQueued.current = true;
320
- queueMicrotask(() => pumpRef.current());
321
- }, []);
322
- const continueOnDrain = useCallback(() => {
323
- if (!bridge)
324
- return;
325
- bridge.drain.onDrained = () => {
326
- bridge.drain.onDrained = null;
327
- schedulePump();
328
- };
329
- bridge.requestFlush();
330
- }, [bridge, schedulePump]);
331
- /**
332
- * TOP GIVE-WAY: print the rows the box hides, when it hides them from the TOP.
333
- *
334
- * The order of the two decisions is not cosmetic. `frame.anchor` is what the SCREEN is
335
- * doing; `planOverflowPrint` answers what is off it. Printing while the frame is
336
- * `top`-anchored would print the rows the user is looking at (Ink clips the BOTTOM in that
337
- * branch) and leave the ones they cannot see - a duplicate and a hole at once. So a frame
338
- * whose anchor the measurement contradicts is nudged once and the print waits for the
339
- * frame that agrees.
340
- *
341
- * @returns How many segments were enqueued.
342
- */
343
- const printOverflow = useCallback((frame, allowance) => {
344
- if (frame.tailRows <= 0)
345
- return 0;
346
- const maxEntries = SCROLLBACK_LIMITS.liveTailMaxEntries;
347
- const { start } = selectTailWindow(frame.entries, maxEntries);
348
- // The wall before the window is still a wall: the give-way would print rows that come
349
- // after an unprintable entry (I-S3 / A12).
350
- if (printBoundary(frame.entries, frame.runActive, maxEntries) < start)
351
- return 0;
352
- const items = windowItemsOf(frame, start);
353
- if (items.length === 0)
354
- return 0;
355
- const measured = measureWindow(frame, items);
356
- if (!measured)
357
- return 0;
358
- const total = measured.reduce((sum, item) => sum + item.rows, 0);
359
- if (frame.measuredRows !== total) {
360
- // `LiveTail` anchored this frame from an estimate (or from an older measurement).
361
- // Hand it the number, once per distinct picture, and print on the frame that agrees.
362
- const nudgeKey = `${start}|${items.length}|${total}`;
363
- if (nudgedRef.current !== nudgeKey) {
364
- nudgedRef.current = nudgeKey;
365
- bumpMeasureEpoch();
366
- }
367
- }
368
- if (frame.anchor !== 'bottom')
369
- return 0;
370
- const plan = planOverflowPrint(measured, frame.tailRows);
371
- const expanded = expandedIdsOf(frame.expandedToolIds);
372
- let used = 0;
373
- for (const segment of plan.segments) {
374
- if (used >= allowance) {
375
- continueOnDrain();
376
- return used;
377
- }
378
- const item = measured[segment.index];
379
- const state = printed.current.get(item.entry.id);
380
- // The segment's row numbers live in the box's index space, so the rows must be
381
- // rendered and printed at that width; a stale recorded width restarts behind a seam.
382
- const restart = state !== undefined && state.cols !== frame.previewCols;
383
- const from = restart ? 0 : state?.rows ?? 0;
384
- const body = ensureRenderer().renderEntryRows(item.entry, printableBefore(frame.entries, items[segment.index].index), frame.previewCols, expanded.includes(item.entry.id));
385
- const slice = body.slice(from, Math.max(from, segment.toRow));
386
- const out = capPrintedRows(slice, from);
387
- const seam = restart ? reflowSeamRow(state.rows, state.cols, frame.previewCols) : null;
388
- enqueue(seam === null ? out : [seam, ...out], item.entry.id, item.entry.kind);
389
- const capped = out.length !== slice.length;
390
- const finished = capped || segment.toRow >= item.rows;
391
- printed.current.set(item.entry.id, {
392
- rows: finished ? item.rows : segment.toRow,
393
- cols: frame.previewCols,
394
- done: finished,
395
- });
396
- headRowsRef.current += out.length;
397
- used += 1;
398
- }
399
- return used;
400
- }, [continueOnDrain, enqueue, ensureRenderer, expandedIdsOf, measureWindow, windowItemsOf]);
401
- /** The promotion pass. Runs in a microtask (see the file header). */
402
- pumpRef.current = () => {
403
- pumpQueued.current = false;
404
- const frame = committed.current;
405
- if (!mountedRef.current || !bridge || !frame)
406
- return;
407
- applyPendingReset();
408
- const known = [frame.contentCols, frame.previewCols];
409
- const limit = Math.max(1, SCROLLBACK_LIMITS.feedCapacity - bridge.drain.pendingEntries() - 1);
410
- // `printBoundary` = min(settled, window start): the region keeps what it shows.
411
- const end = printBoundary(frame.entries, frame.runActive, SCROLLBACK_LIMITS.liveTailMaxEntries);
412
- const promoted = promote(frame, end, limit, known);
413
- pruneEntryIds(frame.entries, printed.current, heights.current);
414
- if (promoted.limited) {
415
- // Continue once the writer has consumed what is queued (a restored transcript
416
- // longer than the feed is promoted in waves rather than folded into a marker).
417
- continueOnDrain();
418
- return;
419
- }
420
- // ORDER: everything that has left the window is older than everything in it, so the
421
- // give-way only ever runs in a pass that promoted everything it had to.
422
- if (printOverflow(frame, Math.max(0, limit - promoted.used)) > 0)
423
- bridge.requestFlush();
424
- };
425
- // --- Live region budget and the tail window. ------------------------------
426
- // The window is the last K printable entries, settled or not (D6/D7). `slice` +
427
- // `tailWindowStart` is `tail-window.ts`'s definition, and `printBoundary` uses the
428
- // same start - so "what is on screen" and "what is withheld from the writer" cannot
429
- // disagree about where the boundary is.
430
- const window = useMemo(() => selectTailWindow(entries, SCROLLBACK_LIMITS.liveTailMaxEntries), [entries]);
431
- const tailEntries = window.entries;
432
- const windowStart = window.start;
433
- // The band's hysteresis has exactly THREE reset points and no others: the plan
434
- // emptied, the dispatch finished, or the geometry changed (a new size is a new
435
- // measurement - the same treatment `App` gives `guardTripped`).
436
- if (heldGeometry.current.rows !== rows || heldGeometry.current.cols !== cols) {
437
- heldGeometry.current = { rows, cols };
438
- heldRailRows.current = 0;
439
- heldTeamRows.current = 0;
440
- }
441
- if (itemCount === 0)
442
- heldRailRows.current = 0;
443
- if (teamRowsNatural === 0)
444
- heldTeamRows.current = 0;
445
- const budget = useMemo(() => enabled
446
- ? buildScrollbackBudget({
447
- rows, cols, draftRows, popupRows, statusExpanded, overlayOpen,
448
- forceInactive,
449
- band: {
450
- itemCount, panelEnabled, teamRowsNatural,
451
- heldRailRows: heldRailRows.current, heldTeamRows: heldTeamRows.current,
452
- },
453
- })
454
- : null,
455
- // The two band refs are read at memo time; `itemCount` and `teamRowsNatural` are
456
- // what move them. The budget no longer depends on CONTENT at all (the band fills the
457
- // pool, D5), so nothing about the transcript belongs in this dependency list.
458
- // eslint-disable-next-line react-hooks/exhaustive-deps
459
- [enabled, rows, cols, draftRows, popupRows, statusExpanded, overlayOpen,
460
- forceInactive, itemCount, panelEnabled, teamRowsNatural]);
461
- if (budget) {
462
- // Monotone memory, fed back into the memo above on the next frame.
463
- heldRailRows.current = budget.band.heldRailRows;
464
- heldTeamRows.current = budget.band.heldTeamRows;
465
- }
466
- // Print keeps `contentCols`; only the live tail gives up the rail's columns (I-5).
467
- const previewCols = budget ? budget.previewCols : contentCols;
468
- const tailRows = budget ? budget.liveTailRows : 0;
469
- // `previewCols` is only known after the budget, so the copy above carries the PREVIOUS
470
- // frame's value; this line hands the exit and reset paths the current one. The promotion
471
- // pass does not read it - it reads `committed`, written below.
472
- latest.current.previewCols = previewCols;
473
- const lastIndex = entries.length - 1;
474
- const indexById = useMemo(() => new Map(entries.map((entry, index) => [entry.id, index])), [entries]);
475
- /**
476
- * The window's measured height, when every entry in it is stable AND already measured at
477
- * this geometry. This is the number `LiveTail` anchors with, and the number the pump
478
- * compares itself against, so both agree about which frame the user is looking at.
479
- */
480
- const measuredTailRows = useMemo(() => {
481
- if (!enabled || tailRows <= 0 || tailEntries.length === 0)
482
- return undefined;
483
- let total = 0;
484
- for (const entry of tailEntries) {
485
- if (!isEntryStable(entry, runActive, indexById.get(entry.id) === lastIndex)) {
486
- return undefined;
487
- }
488
- const cached = heights.current.get(heightKey(entry, previewCols, expandedToolIds[entry.id] === true));
489
- if (cached === undefined)
490
- return undefined;
491
- total += cached;
492
- }
493
- return total;
494
- // `heights` is a ref and `measureEpoch` is what fills it; every OTHER dependency is an
495
- // input of the cache key, so a stale answer is impossible.
496
- // eslint-disable-next-line react-hooks/exhaustive-deps
497
- }, [enabled, tailRows, tailEntries, runActive, indexById, lastIndex, previewCols,
498
- expandedToolIds, thinkingVisible, measureEpoch, heightKey]);
499
- const anchor = resolveTailAnchor({
500
- entries: tailEntries,
501
- budgetRows: tailRows,
502
- rowOf: (entry) => estimateEntryRows(entry, previewCols, density, expandedToolIds[entry.id] === true, thinkingVisible),
503
- measuredRows: measuredTailRows,
504
- });
505
- const liveTailLines = useMemo(() => enabled && budget && budget.liveTailRows > 0
506
- ? buildLivePreview({
507
- unsettled: tailEntries, cols: previewCols, rows: budget.liveTailRows,
508
- thinkingVisible,
509
- })
510
- : [], [enabled, budget, tailEntries, previewCols, thinkingVisible]);
511
- // THE COMMIT HOOK. Every commit records the frame the screen is showing, so the microtask
512
- // pass can never slice this frame's picture with another frame's numbers. It is the last
513
- // layout effect in this hook on purpose: everything above is render-time state.
514
- useLayoutEffect(() => {
515
- committed.current = {
516
- entries, runActive, contentCols, previewCols, tailRows, anchor, measuredRows: measuredTailRows,
517
- expandedToolIds,
518
- };
519
- });
520
- // Only a content change (or a measurement that must reach `LiveTail`) needs a pass; a
521
- // resize is the writer's business, exactly as before.
522
- useLayoutEffect(() => {
523
- if (enabled && bridge)
524
- schedulePump();
525
- }, [enabled, bridge, entries, runActive, measureEpoch, schedulePump]);
526
- const settleAll = useCallback(() => {
527
- flushUnprinted(latest.current.entries);
528
- }, [flushUnprinted]);
529
- // Shutdown hook for the exit paths. `restore()` runs it AFTER the tree is gone
530
- // (normal exit) or while it is alive (signal), so it renders synchronously and then
531
- // releases the offscreen instance. The unmount cleanup deliberately renders nothing:
532
- // it runs inside the main tree's commit, where an offscreen render is deferred.
533
- const settleAllRef = useRef(settleAll);
534
- settleAllRef.current = settleAll;
535
- useEffect(() => {
536
- mountedRef.current = true;
537
- if (!enabled || !bridge)
538
- return undefined;
539
- bridge.settleAllNow = () => {
540
- try {
541
- settleAllRef.current();
542
- }
543
- finally {
544
- rendererRef.current?.dispose();
545
- rendererRef.current = null;
546
- }
547
- };
548
- return () => { mountedRef.current = false; };
549
- }, [enabled, bridge]);
550
- const reprintExpanded = useCallback((entryId) => {
551
- if (!enabled || !bridge)
552
- return false;
553
- const list = latest.current.entries;
554
- const index = list.findIndex((entry) => entry.id === entryId);
555
- if (index < 0)
556
- return false;
557
- const entry = list[index];
558
- // A LIVE DISPATCH CARD IS REFUSED, NOT PRINTED (tui-subagent-double-roster A-2').
559
- // `Ctrl+O` arrives mid-dispatch, `EntryView` suppresses this card, and a copy
560
- // printed here would be a FROZEN SNAPSHOT of a card the roster is still rewriting -
561
- // permanently in the scrollback, because printed is forever.
562
- if (isLiveTeamCard(entry))
563
- return false;
564
- // THE COPY IS RENDERED IN A MICROTASK, NOT IN THE KEY HANDLER THAT ASKED FOR IT.
565
- // `Ctrl+O` arrives on the stdin stream, and an offscreen render issued from there is
566
- // SCHEDULED rather than flushed - the reconciler sees a pending update, the frame the
567
- // caller reads back is still empty, and the copy degrades to
568
- // `[aragon] entry ... could not be rendered`. A microtask runs after the input handler
569
- // has unwound, where the offscreen render is synchronous again: the same rule the
570
- // promotion pass follows (see the file header). The answer is therefore "this entry
571
- // exists and a copy is on its way", which is what the caller's toast needs.
572
- //
573
- // THE ID IS STABLE ON PURPOSE. `expanded:<entryId>` makes the copy greppable and keeps
574
- // the key purely user-driven; it is not a dedupe key, because the drain is a FIFO that
575
- // never coalesces, so a second press prints a second copy - the behaviour the tool cards
576
- // have always had, and the reason the stable id is safe to use here.
577
- queueMicrotask(() => {
578
- if (!mountedRef.current || !bridge)
579
- return;
580
- const body = ensureRenderer().renderEntry(entry, undefined, latest.current.contentCols, true);
581
- if (body.length === 0)
582
- return;
583
- enqueue([`-- expanded: ${expandedLabel(entry)} --`, ...body], `expanded:${entryId}`, entry.kind);
584
- });
585
- return true;
586
- }, [bridge, enabled, enqueue, ensureRenderer]);
587
- const notifyReset = useCallback((kind) => {
588
- if (!enabled)
589
- return;
590
- // The PRE-reset snapshot: see `flushUnprinted`'s note on why this cannot be read
591
- // from `latest` when the microtask finally runs.
592
- pendingReset.current = { kind, captured: latest.current.entries };
593
- }, [enabled]);
594
- return {
595
- budget, liveTailLines, tailEntries, windowStart, measuredTailRows,
596
- // A GETTER, like `perfRef`'s `scrollbar`: the counter moves in a microtask, so a value
597
- // captured at render time would report the frame BEFORE the one `/perf` is asked about.
598
- get headRows() { return headRowsRef.current; },
599
- reprintExpanded, settleAll, notifyReset,
600
- };
601
- }