@aragon-agent/cli 0.6.46 → 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 +28 -0
  2. package/README.md +80 -12
  3. package/dist/agent/coalesce.d.ts +5 -1
  4. package/dist/agent/coalesce.js +13 -0
  5. package/dist/agent/controller.d.ts +41 -20
  6. package/dist/agent/controller.js +68 -15
  7. package/dist/agent/conversation-reset.d.ts +1 -1
  8. package/dist/agent/governance-wiring.d.ts +6 -6
  9. package/dist/agent/governance-wiring.js +4 -4
  10. package/dist/agent/headless.d.ts +5 -5
  11. package/dist/agent/headless.js +4 -4
  12. package/dist/agent/job-notices.d.ts +1 -1
  13. package/dist/agent/job-notices.js +1 -1
  14. package/dist/agent/kit-apply.d.ts +3 -3
  15. package/dist/agent/kit-apply.js +3 -3
  16. package/dist/agent/model-profile-settings.d.ts +2 -2
  17. package/dist/agent/model-profile-settings.js +6 -6
  18. package/dist/agent/prompt-options.d.ts +1 -1
  19. package/dist/agent/system-prompt.d.ts +1 -1
  20. package/dist/agent/user-attention.d.ts +17 -0
  21. package/dist/agent/user-attention.js +32 -0
  22. package/dist/{ui → app}/App.d.ts +9 -9
  23. package/dist/{ui → app}/App.js +113 -79
  24. package/dist/{ui → app}/use-startup-notices.d.ts +1 -1
  25. package/dist/{ui → app}/use-startup-notices.js +2 -2
  26. package/dist/cli.js +31 -32
  27. package/dist/commands/agents-command.js +1 -1
  28. package/dist/commands/builtins.js +9 -9
  29. package/dist/commands/governance-command.js +2 -2
  30. package/dist/commands/governance-runs-table.js +1 -1
  31. package/dist/commands/kit-command.js +1 -1
  32. package/dist/commands/perf.d.ts +3 -3
  33. package/dist/commands/perf.js +1 -1
  34. package/dist/commands/registry.d.ts +8 -8
  35. package/dist/commands/skills.js +2 -2
  36. package/dist/commands/team-command.js +1 -1
  37. package/dist/compaction/archive.d.ts +1 -1
  38. package/dist/compaction/archive.js +1 -1
  39. package/dist/compaction/child.d.ts +3 -3
  40. package/dist/compaction/child.js +4 -4
  41. package/dist/compaction/command.js +5 -5
  42. package/dist/compaction/compactor.d.ts +6 -6
  43. package/dist/compaction/compactor.js +6 -6
  44. package/dist/compaction/context-command.js +1 -1
  45. package/dist/compaction/digest.js +1 -1
  46. package/dist/compaction/memory-input.js +1 -1
  47. package/dist/compaction/memory-validation.js +1 -1
  48. package/dist/compaction/memory.js +1 -1
  49. package/dist/compaction/summarize-call.js +1 -1
  50. package/dist/compaction/summary-prompt.js +1 -1
  51. package/dist/compaction/tail-budget.js +2 -2
  52. package/dist/compaction/wiring.d.ts +5 -5
  53. package/dist/compaction/wiring.js +2 -2
  54. package/dist/config/cli-commands.d.ts +1 -1
  55. package/dist/config/cli-commands.js +3 -3
  56. package/dist/config/env.d.ts +1 -1
  57. package/dist/config/env.js +4 -4
  58. package/dist/config/load.d.ts +2 -2
  59. package/dist/config/load.js +10 -31
  60. package/dist/config/migrate-state-out-of-config.js +1 -1
  61. package/dist/config/model-profile-store.d.ts +4 -54
  62. package/dist/config/model-profile-store.js +3 -3
  63. package/dist/config/prompt-history.js +1 -1
  64. package/dist/config/store.d.ts +2 -2
  65. package/dist/config/store.js +3 -3
  66. package/dist/diagnostics/doctor.js +4 -4
  67. package/dist/exec/bridge/decisions.d.ts +1 -1
  68. package/dist/exec/bridge/human-answers.d.ts +1 -1
  69. package/dist/exec/bridge/human-answers.js +1 -1
  70. package/dist/exec/bridge/protocol.d.ts +1 -1
  71. package/dist/exec/bridge/server.js +1 -1
  72. package/dist/exec/events.d.ts +2 -2
  73. package/dist/exec/index.d.ts +1 -1
  74. package/dist/exec/index.js +1 -1
  75. package/dist/exec/permission.js +1 -1
  76. package/dist/exec/runner.d.ts +3 -3
  77. package/dist/exec/runner.js +2 -2
  78. package/dist/exec/threads/runtime.js +1 -1
  79. package/dist/fast/digest.d.ts +1 -1
  80. package/dist/fast/digest.js +1 -1
  81. package/dist/fast/frames.d.ts +1 -1
  82. package/dist/fast/frames.js +1 -1
  83. package/dist/fast/prompt.d.ts +1 -1
  84. package/dist/fast/prompt.js +1 -1
  85. package/dist/fast/review-call.js +1 -1
  86. package/dist/fast/reviewer.d.ts +3 -3
  87. package/dist/fast/reviewer.js +1 -1
  88. package/dist/fast/summary-call.d.ts +3 -3
  89. package/dist/fast/summary-call.js +2 -2
  90. package/dist/fast/summary-prompt.d.ts +1 -1
  91. package/dist/fast/summary-prompt.js +1 -1
  92. package/dist/fast/wiring.d.ts +4 -4
  93. package/dist/fast/wiring.js +1 -1
  94. package/dist/governance/card-normalize.d.ts +1 -1
  95. package/dist/governance/copy.d.ts +1 -1
  96. package/dist/governance/copy.js +2 -2
  97. package/dist/governance/engine/artifact-persist.d.ts +1 -1
  98. package/dist/governance/engine/budget.d.ts +1 -1
  99. package/dist/governance/engine/budget.js +1 -1
  100. package/dist/governance/engine/cards.d.ts +1 -1
  101. package/dist/governance/engine/digest.js +1 -1
  102. package/dist/governance/engine/engine-core.d.ts +5 -5
  103. package/dist/governance/engine/engine-core.js +1 -1
  104. package/dist/governance/engine/engine.d.ts +1 -1
  105. package/dist/governance/engine/engine.js +1 -1
  106. package/dist/governance/engine/estimate.d.ts +1 -1
  107. package/dist/governance/engine/estimate.js +1 -1
  108. package/dist/governance/engine/inspector.js +2 -2
  109. package/dist/governance/engine/integration.d.ts +1 -1
  110. package/dist/governance/engine/lifecycle.d.ts +1 -1
  111. package/dist/governance/engine/lifecycle.js +1 -1
  112. package/dist/governance/engine/phase-members.d.ts +1 -1
  113. package/dist/governance/engine/phase-planner.d.ts +1 -1
  114. package/dist/governance/engine/phase-planner.js +1 -1
  115. package/dist/governance/engine/rebuild.d.ts +1 -1
  116. package/dist/governance/engine/report.d.ts +1 -1
  117. package/dist/governance/engine/report.js +1 -1
  118. package/dist/governance/engine/run-digest.d.ts +1 -1
  119. package/dist/governance/engine/spec-builder.d.ts +2 -2
  120. package/dist/governance/engine/spec-builder.js +2 -2
  121. package/dist/governance/engine/stage-runner.js +2 -2
  122. package/dist/governance/engine/start-input.d.ts +1 -1
  123. package/dist/governance/engine/start-input.js +1 -1
  124. package/dist/governance/engine/state-machine.d.ts +1 -1
  125. package/dist/governance/engine/state-machine.js +3 -3
  126. package/dist/governance/engine/submission-queries.d.ts +1 -1
  127. package/dist/governance/engine/submission-render.d.ts +1 -1
  128. package/dist/governance/engine/submissions.d.ts +1 -1
  129. package/dist/governance/engine/submissions.js +1 -1
  130. package/dist/governance/engine/visibility.d.ts +1 -1
  131. package/dist/governance/engine/visibility.js +1 -1
  132. package/dist/governance/posture-transition.d.ts +2 -2
  133. package/dist/governance/posture-transition.js +1 -1
  134. package/dist/governance/profiles.d.ts +1 -1
  135. package/dist/governance/prompts/orchestrator-block.d.ts +2 -2
  136. package/dist/governance/prompts/orchestrator-block.js +2 -2
  137. package/dist/governance/prompts/plan-addendum.d.ts +1 -1
  138. package/dist/governance/prompts/plan-addendum.js +1 -1
  139. package/dist/governance/prompts/role-blocks.d.ts +2 -2
  140. package/dist/governance/prompts/role-blocks.js +1 -1
  141. package/dist/governance/report-reader.js +1 -1
  142. package/dist/governance/roles.d.ts +1 -1
  143. package/dist/governance/rules/claims.d.ts +1 -1
  144. package/dist/governance/rules/claims.js +1 -1
  145. package/dist/governance/rules/elimination.d.ts +1 -1
  146. package/dist/governance/rules/elimination.js +1 -1
  147. package/dist/governance/rules/failure-analysis.d.ts +2 -2
  148. package/dist/governance/rules/failure-analysis.js +1 -1
  149. package/dist/governance/rules/ledger-replay.d.ts +1 -1
  150. package/dist/governance/rules/ledger-state.d.ts +1 -1
  151. package/dist/governance/rules/ledger-state.js +1 -1
  152. package/dist/governance/rules/ledger.d.ts +2 -2
  153. package/dist/governance/rules/ledger.js +2 -2
  154. package/dist/governance/rules/rca.d.ts +1 -1
  155. package/dist/governance/rules/rca.js +1 -1
  156. package/dist/governance/rules/settlement.d.ts +2 -2
  157. package/dist/governance/rules/settlement.js +2 -2
  158. package/dist/governance/rules/suspicion.d.ts +1 -1
  159. package/dist/governance/store/artifacts.d.ts +1 -1
  160. package/dist/governance/store/artifacts.js +1 -1
  161. package/dist/governance/store/events-log.d.ts +1 -1
  162. package/dist/governance/store/run-store.d.ts +1 -1
  163. package/dist/governance/store/run-store.js +1 -1
  164. package/dist/governance/store/scoreboard-export.d.ts +1 -1
  165. package/dist/governance/tools/child-tools.d.ts +1 -1
  166. package/dist/governance/tools/guard.d.ts +1 -1
  167. package/dist/governance/tools/guard.js +1 -1
  168. package/dist/governance/tools/inspector-tools.d.ts +2 -2
  169. package/dist/governance/tools/inspector-tools.js +2 -2
  170. package/dist/governance/tools/lead-tools.d.ts +1 -1
  171. package/dist/governance/tools/lead-tools.js +1 -1
  172. package/dist/governance/tools/normalize-util.js +1 -1
  173. package/dist/governance/tools/scan-incomplete.js +1 -1
  174. package/dist/governance/tools/shared-tools.d.ts +1 -1
  175. package/dist/governance/tools/shared-tools.js +1 -1
  176. package/dist/governance/tools/submit-normalizers.d.ts +1 -1
  177. package/dist/governance/tools/submit-normalizers.js +1 -1
  178. package/dist/governance/tools/submit-tools.d.ts +1 -1
  179. package/dist/logging/cli-commands.js +1 -1
  180. package/dist/logging/install.d.ts +1 -1
  181. package/dist/logging/install.js +3 -3
  182. package/dist/logging/logger.d.ts +2 -2
  183. package/dist/logging/logger.js +31 -2
  184. package/dist/proc/kill-tree.js +1 -1
  185. package/dist/proc/log-mirror.js +1 -1
  186. package/dist/proc/log-ring.js +2 -2
  187. package/dist/proc/notices.d.ts +1 -1
  188. package/dist/proc/notices.js +2 -2
  189. package/dist/proc/prompt.d.ts +1 -1
  190. package/dist/proc/prompt.js +8 -5
  191. package/dist/proc/readiness.js +1 -1
  192. package/dist/proc/supervisor.d.ts +1 -1
  193. package/dist/proc/supervisor.js +10 -4
  194. package/dist/proc/wait-plan.d.ts +39 -0
  195. package/dist/proc/wait-plan.js +77 -0
  196. package/dist/proc/wait.d.ts +37 -4
  197. package/dist/proc/wait.js +68 -5
  198. package/dist/prompts/command.d.ts +1 -1
  199. package/dist/prompts/command.js +1 -1
  200. package/dist/prompts/normalize.d.ts +1 -1
  201. package/dist/prompts/normalize.js +1 -1
  202. package/dist/prompts/resolve.d.ts +1 -1
  203. package/dist/prompts/store.d.ts +2 -12
  204. package/dist/prompts/store.js +6 -60
  205. package/dist/session/checkpoint.d.ts +2 -2
  206. package/dist/session/checkpoint.js +2 -0
  207. package/dist/session/clear-archive.d.ts +2 -2
  208. package/dist/session/persist.d.ts +2 -2
  209. package/dist/session/persist.js +20 -3
  210. package/dist/session/startup-session.d.ts +2 -2
  211. package/dist/session/validate-session.js +6 -3
  212. package/dist/skills/service.d.ts +2 -2
  213. package/dist/team/bus.d.ts +1 -1
  214. package/dist/team/bus.js +1 -1
  215. package/dist/team/child-reviewer.d.ts +2 -2
  216. package/dist/team/child-reviewer.js +1 -1
  217. package/dist/team/comm-tools.js +1 -1
  218. package/dist/team/dispatch-gate.js +1 -1
  219. package/dist/team/forced-dispatch.js +1 -1
  220. package/dist/team/forced-mode.d.ts +1 -1
  221. package/dist/team/forced-prompt.d.ts +1 -1
  222. package/dist/team/forced-prompt.js +1 -1
  223. package/dist/team/normalize.d.ts +1 -1
  224. package/dist/team/normalize.js +1 -1
  225. package/dist/team/overseer.d.ts +3 -3
  226. package/dist/team/overseer.js +3 -3
  227. package/dist/team/prompt.d.ts +1 -1
  228. package/dist/team/prompt.js +1 -1
  229. package/dist/team/report.d.ts +2 -2
  230. package/dist/team/report.js +2 -2
  231. package/dist/team/retry.d.ts +1 -1
  232. package/dist/team/retry.js +1 -1
  233. package/dist/team/runtime.d.ts +4 -4
  234. package/dist/team/runtime.js +2 -2
  235. package/dist/team/settled.d.ts +2 -2
  236. package/dist/team/subagent.d.ts +4 -4
  237. package/dist/team/subagent.js +5 -5
  238. package/dist/team/task-tool.d.ts +1 -1
  239. package/dist/team/task-tool.js +1 -1
  240. package/dist/todo/normalize.d.ts +1 -1
  241. package/dist/todo/normalize.js +1 -1
  242. package/dist/todo/prompt.d.ts +1 -1
  243. package/dist/todo/prompt.js +1 -1
  244. package/dist/todo/store.d.ts +1 -1
  245. package/dist/todo/store.js +2 -2
  246. package/dist/todo/todo-tool.d.ts +1 -1
  247. package/dist/todo/todo-tool.js +2 -2
  248. package/dist/tools/bash-tool.d.ts +1 -1
  249. package/dist/tools/bash-tool.js +2 -2
  250. package/dist/tools/diff.d.ts +1 -1
  251. package/dist/tools/diff.js +1 -1
  252. package/dist/tools/file-change-store.d.ts +1 -1
  253. package/dist/tools/fs-tools.d.ts +2 -2
  254. package/dist/tools/fs-tools.js +1 -1
  255. package/dist/tools/index.d.ts +3 -3
  256. package/dist/tools/index.js +1 -1
  257. package/dist/tools/job-tools.d.ts +14 -3
  258. package/dist/tools/job-tools.js +158 -35
  259. package/dist/tools/plan-tools.d.ts +1 -1
  260. package/dist/tools/plan-tools.js +1 -1
  261. package/dist/tools/proc-tools.d.ts +1 -1
  262. package/dist/tools/proc-tools.js +2 -2
  263. package/dist/update/classify-failure.d.ts +1 -1
  264. package/dist/update/install-lock.js +1 -1
  265. package/dist/update/install-source.d.ts +1 -1
  266. package/dist/update/installer.js +2 -2
  267. package/dist/update/npm-view.d.ts +1 -1
  268. package/dist/update/npm-view.js +1 -1
  269. package/dist/update/registry.d.ts +1 -1
  270. package/dist/update/registry.js +1 -1
  271. package/dist/update/service.d.ts +2 -2
  272. package/dist/update/service.js +2 -2
  273. package/package.json +7 -7
  274. package/dist/agent/agent-mode.d.ts +0 -108
  275. package/dist/agent/agent-mode.js +0 -121
  276. package/dist/agent/entry-limits.d.ts +0 -65
  277. package/dist/agent/entry-limits.js +0 -133
  278. package/dist/agent/governance-view.d.ts +0 -40
  279. package/dist/agent/governance-view.js +0 -40
  280. package/dist/agent/invocation-card.d.ts +0 -77
  281. package/dist/agent/invocation-card.js +0 -169
  282. package/dist/agent/model-probe-limits.d.ts +0 -39
  283. package/dist/agent/model-probe-limits.js +0 -25
  284. package/dist/agent/model-probe.d.ts +0 -104
  285. package/dist/agent/model-probe.js +0 -391
  286. package/dist/agent/queued-messages.d.ts +0 -23
  287. package/dist/agent/queued-messages.js +0 -49
  288. package/dist/agent/reducer.d.ts +0 -837
  289. package/dist/agent/reducer.js +0 -1617
  290. package/dist/agent/retry-view.d.ts +0 -68
  291. package/dist/agent/retry-view.js +0 -95
  292. package/dist/agent/usage.d.ts +0 -47
  293. package/dist/agent/usage.js +0 -84
  294. package/dist/compaction/limits.d.ts +0 -61
  295. package/dist/compaction/limits.js +0 -64
  296. package/dist/compaction/meter.d.ts +0 -276
  297. package/dist/compaction/meter.js +0 -512
  298. package/dist/compaction/pressure.d.ts +0 -163
  299. package/dist/compaction/pressure.js +0 -199
  300. package/dist/compaction/reason-text.d.ts +0 -36
  301. package/dist/compaction/reason-text.js +0 -78
  302. package/dist/compaction/types.d.ts +0 -360
  303. package/dist/compaction/types.js +0 -22
  304. package/dist/config/governance-config.d.ts +0 -125
  305. package/dist/config/governance-config.js +0 -164
  306. package/dist/config/kit-resolution.d.ts +0 -93
  307. package/dist/config/kit-resolution.js +0 -226
  308. package/dist/config/model-kits.d.ts +0 -225
  309. package/dist/config/model-kits.js +0 -302
  310. package/dist/config/model-profile-resolution.d.ts +0 -28
  311. package/dist/config/model-profile-resolution.js +0 -88
  312. package/dist/config/model-profiles.d.ts +0 -103
  313. package/dist/config/model-profiles.js +0 -188
  314. package/dist/config/schema.d.ts +0 -1645
  315. package/dist/config/schema.js +0 -1377
  316. package/dist/fast/limits.d.ts +0 -152
  317. package/dist/fast/limits.js +0 -152
  318. package/dist/fast/resolve.d.ts +0 -44
  319. package/dist/fast/resolve.js +0 -107
  320. package/dist/fast/task-summary-types.d.ts +0 -66
  321. package/dist/fast/task-summary-types.js +0 -17
  322. package/dist/fast/types.d.ts +0 -141
  323. package/dist/fast/types.js +0 -14
  324. package/dist/governance/governed-dispatch.d.ts +0 -19
  325. package/dist/governance/governed-dispatch.js +0 -17
  326. package/dist/governance/limits.d.ts +0 -107
  327. package/dist/governance/limits.js +0 -131
  328. package/dist/governance/posture.d.ts +0 -35
  329. package/dist/governance/posture.js +0 -59
  330. package/dist/governance/rules/events-table.d.ts +0 -46
  331. package/dist/governance/rules/events-table.js +0 -94
  332. package/dist/governance/types.d.ts +0 -661
  333. package/dist/governance/types.js +0 -27
  334. package/dist/input/control-sequences.d.ts +0 -71
  335. package/dist/input/control-sequences.js +0 -222
  336. package/dist/input/csiu-keys.d.ts +0 -66
  337. package/dist/input/csiu-keys.js +0 -181
  338. package/dist/input/cursor-report.d.ts +0 -61
  339. package/dist/input/cursor-report.js +0 -97
  340. package/dist/input/enter-sequences.d.ts +0 -64
  341. package/dist/input/enter-sequences.js +0 -153
  342. package/dist/input/interrupt-gesture.d.ts +0 -18
  343. package/dist/input/interrupt-gesture.js +0 -19
  344. package/dist/input/keyboard-enhancement.d.ts +0 -42
  345. package/dist/input/keyboard-enhancement.js +0 -65
  346. package/dist/input/keymap.d.ts +0 -20
  347. package/dist/input/keymap.js +0 -99
  348. package/dist/input/limits.d.ts +0 -118
  349. package/dist/input/limits.js +0 -109
  350. package/dist/input/mouse-events.d.ts +0 -87
  351. package/dist/input/mouse-events.js +0 -212
  352. package/dist/input/paste-parse.d.ts +0 -83
  353. package/dist/input/paste-parse.js +0 -107
  354. package/dist/input/pointer-router.d.ts +0 -11
  355. package/dist/input/pointer-router.js +0 -14
  356. package/dist/input/stdin-filter.d.ts +0 -112
  357. package/dist/input/stdin-filter.js +0 -657
  358. package/dist/input/win32-input-mode.d.ts +0 -61
  359. package/dist/input/win32-input-mode.js +0 -269
  360. package/dist/logging/levels.d.ts +0 -40
  361. package/dist/logging/levels.js +0 -59
  362. package/dist/logging/secret-registry.d.ts +0 -32
  363. package/dist/logging/secret-registry.js +0 -73
  364. package/dist/proc/limits.d.ts +0 -200
  365. package/dist/proc/limits.js +0 -207
  366. package/dist/proc/progress.d.ts +0 -40
  367. package/dist/proc/progress.js +0 -135
  368. package/dist/proc/types.d.ts +0 -263
  369. package/dist/proc/types.js +0 -15
  370. package/dist/prompts/copy.d.ts +0 -89
  371. package/dist/prompts/copy.js +0 -131
  372. package/dist/prompts/fill.d.ts +0 -51
  373. package/dist/prompts/fill.js +0 -46
  374. package/dist/prompts/limits.d.ts +0 -53
  375. package/dist/prompts/limits.js +0 -53
  376. package/dist/prompts/search.d.ts +0 -58
  377. package/dist/prompts/search.js +0 -146
  378. package/dist/prompts/types.d.ts +0 -204
  379. package/dist/prompts/types.js +0 -13
  380. package/dist/team/activity.d.ts +0 -67
  381. package/dist/team/activity.js +0 -130
  382. package/dist/team/limits.d.ts +0 -308
  383. package/dist/team/limits.js +0 -330
  384. package/dist/team/model.d.ts +0 -104
  385. package/dist/team/model.js +0 -150
  386. package/dist/team/panel-rows.d.ts +0 -48
  387. package/dist/team/panel-rows.js +0 -75
  388. package/dist/team/timeline.d.ts +0 -74
  389. package/dist/team/timeline.js +0 -101
  390. package/dist/team/types.d.ts +0 -354
  391. package/dist/team/types.js +0 -13
  392. package/dist/todo/acceptance.d.ts +0 -120
  393. package/dist/todo/acceptance.js +0 -399
  394. package/dist/todo/follow-through.d.ts +0 -138
  395. package/dist/todo/follow-through.js +0 -248
  396. package/dist/todo/limits.d.ts +0 -152
  397. package/dist/todo/limits.js +0 -152
  398. package/dist/todo/panel-rows.d.ts +0 -45
  399. package/dist/todo/panel-rows.js +0 -70
  400. package/dist/todo/plan-sections.d.ts +0 -60
  401. package/dist/todo/plan-sections.js +0 -108
  402. package/dist/todo/row-window.d.ts +0 -51
  403. package/dist/todo/row-window.js +0 -107
  404. package/dist/todo/types.d.ts +0 -124
  405. package/dist/todo/types.js +0 -12
  406. package/dist/tools/human-input.d.ts +0 -212
  407. package/dist/tools/human-input.js +0 -265
  408. package/dist/tools/patch.d.ts +0 -115
  409. package/dist/tools/patch.js +0 -453
  410. package/dist/tools/terminal-output.d.ts +0 -115
  411. package/dist/tools/terminal-output.js +0 -201
  412. package/dist/tools/tool-output-store.d.ts +0 -68
  413. package/dist/tools/tool-output-store.js +0 -102
  414. package/dist/ui/ActivityLine.d.ts +0 -26
  415. package/dist/ui/ActivityLine.js +0 -48
  416. package/dist/ui/AutocompletePopup.d.ts +0 -23
  417. package/dist/ui/AutocompletePopup.js +0 -17
  418. package/dist/ui/BottomStatusRow.d.ts +0 -10
  419. package/dist/ui/BottomStatusRow.js +0 -9
  420. package/dist/ui/Composer.d.ts +0 -115
  421. package/dist/ui/Composer.js +0 -64
  422. package/dist/ui/GovernancePanel.d.ts +0 -50
  423. package/dist/ui/GovernancePanel.js +0 -77
  424. package/dist/ui/GovernanceRun.d.ts +0 -18
  425. package/dist/ui/GovernanceRun.js +0 -11
  426. package/dist/ui/Header.d.ts +0 -48
  427. package/dist/ui/Header.js +0 -27
  428. package/dist/ui/Logo.d.ts +0 -32
  429. package/dist/ui/Logo.js +0 -65
  430. package/dist/ui/Markdown.d.ts +0 -29
  431. package/dist/ui/Markdown.js +0 -116
  432. package/dist/ui/PromptCaret.d.ts +0 -11
  433. package/dist/ui/PromptCaret.js +0 -31
  434. package/dist/ui/PromptInput.d.ts +0 -192
  435. package/dist/ui/PromptInput.js +0 -689
  436. package/dist/ui/QueuePanel.d.ts +0 -8
  437. package/dist/ui/QueuePanel.js +0 -9
  438. package/dist/ui/QueueStatusRow.d.ts +0 -24
  439. package/dist/ui/QueueStatusRow.js +0 -51
  440. package/dist/ui/ScrollbackShell.d.ts +0 -132
  441. package/dist/ui/ScrollbackShell.js +0 -26
  442. package/dist/ui/SessionOpener.d.ts +0 -30
  443. package/dist/ui/SessionOpener.js +0 -12
  444. package/dist/ui/StatusBar.d.ts +0 -129
  445. package/dist/ui/StatusBar.js +0 -61
  446. package/dist/ui/TeamPanel.d.ts +0 -76
  447. package/dist/ui/TeamPanel.js +0 -103
  448. package/dist/ui/ToastStack.d.ts +0 -8
  449. package/dist/ui/ToastStack.js +0 -31
  450. package/dist/ui/TodoPanel.d.ts +0 -52
  451. package/dist/ui/TodoPanel.js +0 -214
  452. package/dist/ui/Transcript.d.ts +0 -105
  453. package/dist/ui/Transcript.js +0 -251
  454. package/dist/ui/UpdateLine.d.ts +0 -44
  455. package/dist/ui/UpdateLine.js +0 -129
  456. package/dist/ui/activity-phrases.d.ts +0 -33
  457. package/dist/ui/activity-phrases.js +0 -50
  458. package/dist/ui/capabilities.d.ts +0 -27
  459. package/dist/ui/capabilities.js +0 -65
  460. package/dist/ui/clipboard-task.d.ts +0 -29
  461. package/dist/ui/clipboard-task.js +0 -66
  462. package/dist/ui/clipboard.d.ts +0 -31
  463. package/dist/ui/clipboard.js +0 -157
  464. package/dist/ui/color-runtime.d.ts +0 -5
  465. package/dist/ui/color-runtime.js +0 -29
  466. package/dist/ui/composer-input.d.ts +0 -38
  467. package/dist/ui/composer-input.js +0 -79
  468. package/dist/ui/composer-limits.d.ts +0 -30
  469. package/dist/ui/composer-limits.js +0 -45
  470. package/dist/ui/composer-rows.d.ts +0 -73
  471. package/dist/ui/composer-rows.js +0 -129
  472. package/dist/ui/console-bridge.d.ts +0 -19
  473. package/dist/ui/console-bridge.js +0 -52
  474. package/dist/ui/density.d.ts +0 -26
  475. package/dist/ui/density.js +0 -34
  476. package/dist/ui/display-tab.d.ts +0 -51
  477. package/dist/ui/display-tab.js +0 -82
  478. package/dist/ui/editor-navigation.d.ts +0 -55
  479. package/dist/ui/editor-navigation.js +0 -96
  480. package/dist/ui/editor-reducer.d.ts +0 -108
  481. package/dist/ui/editor-reducer.js +0 -187
  482. package/dist/ui/enter-frames.d.ts +0 -47
  483. package/dist/ui/enter-frames.js +0 -117
  484. package/dist/ui/entries/AssistantEntry.d.ts +0 -37
  485. package/dist/ui/entries/AssistantEntry.js +0 -43
  486. package/dist/ui/entries/CompactionCard.d.ts +0 -88
  487. package/dist/ui/entries/CompactionCard.js +0 -222
  488. package/dist/ui/entries/DiffView.d.ts +0 -61
  489. package/dist/ui/entries/DiffView.js +0 -103
  490. package/dist/ui/entries/EntryFrame.d.ts +0 -23
  491. package/dist/ui/entries/EntryFrame.js +0 -6
  492. package/dist/ui/entries/FastCard.d.ts +0 -53
  493. package/dist/ui/entries/FastCard.js +0 -105
  494. package/dist/ui/entries/GovernanceCard.d.ts +0 -30
  495. package/dist/ui/entries/GovernanceCard.js +0 -32
  496. package/dist/ui/entries/InvocationCard.d.ts +0 -20
  497. package/dist/ui/entries/InvocationCard.js +0 -32
  498. package/dist/ui/entries/QueuedEntry.d.ts +0 -27
  499. package/dist/ui/entries/QueuedEntry.js +0 -33
  500. package/dist/ui/entries/RetryCard.d.ts +0 -56
  501. package/dist/ui/entries/RetryCard.js +0 -60
  502. package/dist/ui/entries/ServiceCard.d.ts +0 -82
  503. package/dist/ui/entries/ServiceCard.js +0 -151
  504. package/dist/ui/entries/TeamCard.d.ts +0 -55
  505. package/dist/ui/entries/TeamCard.js +0 -94
  506. package/dist/ui/entries/TodoCard.d.ts +0 -54
  507. package/dist/ui/entries/TodoCard.js +0 -98
  508. package/dist/ui/entries/ToolCard.d.ts +0 -81
  509. package/dist/ui/entries/ToolCard.js +0 -160
  510. package/dist/ui/entries/ToolPreview.d.ts +0 -59
  511. package/dist/ui/entries/ToolPreview.js +0 -208
  512. package/dist/ui/entries/UserEntry.d.ts +0 -36
  513. package/dist/ui/entries/UserEntry.js +0 -57
  514. package/dist/ui/exit-snapshot.d.ts +0 -43
  515. package/dist/ui/exit-snapshot.js +0 -26
  516. package/dist/ui/frame-differ.d.ts +0 -166
  517. package/dist/ui/frame-differ.js +0 -354
  518. package/dist/ui/frame-observer.d.ts +0 -17
  519. package/dist/ui/frame-observer.js +0 -94
  520. package/dist/ui/frame-parser.d.ts +0 -7
  521. package/dist/ui/frame-parser.js +0 -18
  522. package/dist/ui/gauge.d.ts +0 -39
  523. package/dist/ui/gauge.js +0 -55
  524. package/dist/ui/glyphs.d.ts +0 -178
  525. package/dist/ui/glyphs.js +0 -165
  526. package/dist/ui/governance-copy.d.ts +0 -69
  527. package/dist/ui/governance-copy.js +0 -104
  528. package/dist/ui/governance-status.d.ts +0 -145
  529. package/dist/ui/governance-status.js +0 -326
  530. package/dist/ui/gradient.d.ts +0 -11
  531. package/dist/ui/gradient.js +0 -50
  532. package/dist/ui/ink-runtime.d.ts +0 -4
  533. package/dist/ui/ink-runtime.js +0 -51
  534. package/dist/ui/interaction-copy.d.ts +0 -82
  535. package/dist/ui/interaction-copy.js +0 -38
  536. package/dist/ui/interaction-hints.d.ts +0 -44
  537. package/dist/ui/interaction-hints.js +0 -97
  538. package/dist/ui/layout/AppShell.d.ts +0 -17
  539. package/dist/ui/layout/AppShell.js +0 -6
  540. package/dist/ui/layout/Gutter.d.ts +0 -67
  541. package/dist/ui/layout/Gutter.js +0 -42
  542. package/dist/ui/layout/MeasuredEntry.d.ts +0 -21
  543. package/dist/ui/layout/MeasuredEntry.js +0 -30
  544. package/dist/ui/layout/OverlayFrame.d.ts +0 -73
  545. package/dist/ui/layout/OverlayFrame.js +0 -110
  546. package/dist/ui/layout/ScrollIndicator.d.ts +0 -32
  547. package/dist/ui/layout/ScrollIndicator.js +0 -22
  548. package/dist/ui/layout/ScrollViewport.d.ts +0 -40
  549. package/dist/ui/layout/ScrollViewport.js +0 -222
  550. package/dist/ui/layout/agents-board.d.ts +0 -102
  551. package/dist/ui/layout/agents-board.js +0 -389
  552. package/dist/ui/layout/autocomplete.d.ts +0 -18
  553. package/dist/ui/layout/autocomplete.js +0 -26
  554. package/dist/ui/layout/budget.d.ts +0 -43
  555. package/dist/ui/layout/budget.js +0 -52
  556. package/dist/ui/layout/cells.d.ts +0 -61
  557. package/dist/ui/layout/cells.js +0 -156
  558. package/dist/ui/layout/document-layout.d.ts +0 -13
  559. package/dist/ui/layout/document-layout.js +0 -10
  560. package/dist/ui/layout/follow-state.d.ts +0 -138
  561. package/dist/ui/layout/follow-state.js +0 -148
  562. package/dist/ui/layout/frame.d.ts +0 -36
  563. package/dist/ui/layout/frame.js +0 -39
  564. package/dist/ui/layout/governance-board.d.ts +0 -121
  565. package/dist/ui/layout/governance-board.js +0 -382
  566. package/dist/ui/layout/governance-card.d.ts +0 -53
  567. package/dist/ui/layout/governance-card.js +0 -134
  568. package/dist/ui/layout/governance-chip.d.ts +0 -38
  569. package/dist/ui/layout/governance-chip.js +0 -64
  570. package/dist/ui/layout/governance-panel.d.ts +0 -85
  571. package/dist/ui/layout/governance-panel.js +0 -358
  572. package/dist/ui/layout/governance-roster.d.ts +0 -65
  573. package/dist/ui/layout/governance-roster.js +0 -275
  574. package/dist/ui/layout/header-hints.d.ts +0 -90
  575. package/dist/ui/layout/header-hints.js +0 -110
  576. package/dist/ui/layout/header-left.d.ts +0 -115
  577. package/dist/ui/layout/header-left.js +0 -206
  578. package/dist/ui/layout/invocation-card.d.ts +0 -41
  579. package/dist/ui/layout/invocation-card.js +0 -91
  580. package/dist/ui/layout/kit-chip.d.ts +0 -50
  581. package/dist/ui/layout/kit-chip.js +0 -81
  582. package/dist/ui/layout/overlay-window.d.ts +0 -43
  583. package/dist/ui/layout/overlay-window.js +0 -51
  584. package/dist/ui/layout/queue-layout.d.ts +0 -19
  585. package/dist/ui/layout/queue-layout.js +0 -26
  586. package/dist/ui/layout/rail.d.ts +0 -7
  587. package/dist/ui/layout/rail.js +0 -16
  588. package/dist/ui/layout/scroll-indicator.d.ts +0 -27
  589. package/dist/ui/layout/scroll-indicator.js +0 -36
  590. package/dist/ui/layout/scroll.d.ts +0 -37
  591. package/dist/ui/layout/scroll.js +0 -99
  592. package/dist/ui/layout/scrollbar-geometry.d.ts +0 -17
  593. package/dist/ui/layout/scrollbar-geometry.js +0 -13
  594. package/dist/ui/layout/session-chip.d.ts +0 -52
  595. package/dist/ui/layout/session-chip.js +0 -64
  596. package/dist/ui/layout/shortcut-panel-layout.d.ts +0 -191
  597. package/dist/ui/layout/shortcut-panel-layout.js +0 -321
  598. package/dist/ui/layout/status-detail-layout.d.ts +0 -9
  599. package/dist/ui/layout/status-detail-layout.js +0 -79
  600. package/dist/ui/layout/status-layout.d.ts +0 -139
  601. package/dist/ui/layout/status-layout.js +0 -253
  602. package/dist/ui/layout/task-summary-cell.d.ts +0 -61
  603. package/dist/ui/layout/task-summary-cell.js +0 -65
  604. package/dist/ui/layout/team-panel.d.ts +0 -18
  605. package/dist/ui/layout/team-panel.js +0 -25
  606. package/dist/ui/layout/team-row.d.ts +0 -139
  607. package/dist/ui/layout/team-row.js +0 -246
  608. package/dist/ui/layout/todo-layout.d.ts +0 -62
  609. package/dist/ui/layout/todo-layout.js +0 -102
  610. package/dist/ui/layout/useTerminalSize.d.ts +0 -13
  611. package/dist/ui/layout/useTerminalSize.js +0 -50
  612. package/dist/ui/layout/viewport-geometry.d.ts +0 -29
  613. package/dist/ui/layout/viewport-geometry.js +0 -28
  614. package/dist/ui/layout/virtual-window.d.ts +0 -112
  615. package/dist/ui/layout/virtual-window.js +0 -488
  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 -61
  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 -118
  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,488 +0,0 @@
1
- /**
2
- * Viewport virtualisation maths (tui-render-performance L3 / R1). Pure,
3
- * React-free, unit-tested.
4
- *
5
- * THE STRUCTURAL FIX. Ink's `renderNodeToOutput` has no early-out for clipped
6
- * subtrees: for every `ink-text` node it runs `squashTextNodes`, `widestLine`
7
- * and possibly `wrapText` — all O(chars) — and `Output.get()` then evaluates
8
- * `widestLine` a SECOND time before it is allowed to skip an out-of-clip
9
- * operation. A clipped 50 000-character entry therefore costs two full string
10
- * scans per frame and buys nothing. Bounding the ENTRY COUNT (`transcriptWindow`)
11
- * never bounded that, because one entry can be fifty thousand lines.
12
- *
13
- * So entries outside the visible band are not mounted at all. They are replaced
14
- * by two spacer boxes whose heights come from a height cache, which makes the
15
- * per-frame cost O(visible rows) instead of O(characters ever produced).
16
- *
17
- * V-4 — `offset` counts rows FROM THE BOTTOM (`layout/scroll.ts:1-13`), and that
18
- * is what makes virtualisation safe here for free: a height correction on an
19
- * entry ABOVE the viewport changes the content height and therefore
20
- * `overflowLines`, while `offset` — and hence what the user is looking at — is
21
- * unchanged. No scroll-anchoring compensation pass is required. Do NOT
22
- * "simplify" `offset` to count from the top.
23
- *
24
- * V-4 AS AMENDED BY tui-selection-and-scroll-follow (§4.3.1a). There is now
25
- * exactly ONE compensation pass — `follow-state.ts`'s Rule A — and it is
26
- * deliberately restricted to rows appended AT THE TAIL, published by
27
- * `Transcript.tsx` from the height table below. Everything the paragraph above
28
- * describes still self-compensates and is still not compensated for again.
29
- * The restriction is the whole of V-4's survival: an offset that reacted to
30
- * TOTAL measured height would turn every above-the-viewport correction into a
31
- * jump, would read a horizon front-drop as new output — and, because
32
- * `selectWindow` takes `offset` as an INPUT, would close a loop from the offset
33
- * through the mounted set and the measured heights back to the offset.
34
- */
35
- import stringWidth from 'string-width';
36
- import { governanceCardRows } from './governance-card.js';
37
- import { FAST_LIMITS } from '../../fast/limits.js';
38
- import { COMPACTION_LIMITS } from '../../compaction/limits.js';
39
- import { GUTTER_WIDTH } from './Gutter.js';
40
- import { expandTabs } from '../display-tab.js';
41
- import { USER_ENTRY_MAX_ROWS } from '../composer-limits.js';
42
- import { isLiveTeamCard } from '../team-status.js';
43
- import { invocationCardRows } from './invocation-card.js';
44
- export const VIRTUAL_LIMITS = {
45
- /**
46
- * Entries kept mounted on each side of the visible band.
47
- *
48
- * V-2 — must stay `>= 2`, so a one-row scroll can never expose an entry whose
49
- * height has never been measured at the very edge of the viewport.
50
- */
51
- overscan: 2,
52
- /** Height-cache ceiling (LRU). Four thousand numbers, not four thousand strings. */
53
- heightEntries: 4096,
54
- };
55
- /**
56
- * A cheap content version: it changes exactly when the rendered content does.
57
- *
58
- * DERIVED, NEVER HASHED. Hashing a 256 KiB string once per entry per frame would
59
- * recreate the very cost this module exists to remove, so every field below is
60
- * an O(1) read of a length or a scalar.
61
- *
62
- * I-L3-1 — this must change whenever the rendered output changes. The only lossy
63
- * case is a same-LENGTH text replacement, which the reducer cannot produce: all
64
- * text fields are append-only (`appendBounded` only ever elides the middle,
65
- * which changes the length). A future NON-APPEND mutation MUST extend the
66
- * revision, or the entry freezes at a stale height AND a stale rendered subtree
67
- * with nothing anywhere reporting it. `virtual-window.test.ts` enumerates every
68
- * kind against every mutating action.
69
- */
70
- export function entryRevision(entry) {
71
- switch (entry.kind) {
72
- // A card's shape is fixed at creation; the suffix only tells "card" from "plain" (and
73
- // the three row-bearing parts), which is what makes a `queued -> user` rewrite re-measure.
74
- case 'user':
75
- return entry.invocation
76
- ? `i${entry.invocation.input.length}.${entry.invocation.inputHidden > 0 ? 1 : 0}.${entry.invocation.note ? 1 : 0}`
77
- : 'u';
78
- case 'notice':
79
- return 'n';
80
- // `thinkingMs` is O(1) and it CHANGES THE ROW: sealing the clock turns
81
- // `* thought` into `* thought for 12s`, and with thinking hidden that row is
82
- // the entry's whole rendered height.
83
- case 'assistant':
84
- return `a${entry.text.length}.${entry.thinking?.length ?? 0}.${entry.streaming ? 1 : 0}.${entry.aborted ? 1 : 0}.${entry.thinkingMs ?? -1}`;
85
- // `patch.lineCount` is PRECOMPUTED for exactly this term: summing
86
- // `hunks[].lines.length` per entry per frame is the cost the height cache
87
- // exists to remove, and I-L3-1 forbids hashing.
88
- // `liveSeq` IS A COUNTER AND NOT `live.length`, and that is precisely the
89
- // NON-APPEND mutation I-L3-1 above says must extend the revision: a
90
- // fixed-size tail evicting its oldest row while appending a new one of the
91
- // same width leaves the joined length unchanged, so a length term would go
92
- // on matching while the card's content changed under it.
93
- //
94
- // SIX TERMS NOW, the longest revision in this file (P2-12). Still O(1) per
95
- // entry per frame, which is the property I-L3-1 requires -- but the next
96
- // field makes it seven, and a term that is not O(1) would put the cost this
97
- // module exists to remove back on every frame.
98
- case 'tool':
99
- return `t${entry.status}.${entry.argsRaw.length}.${entry.preview?.length ?? 0}.${entry.durationMs ?? -1}.${entry.patch?.lineCount ?? -1}.${entry.liveSeq ?? -1}`;
100
- case 'team':
101
- return `m${entry.active ? 1 : 0}.${entry.runs.length}.${entry.runs
102
- .map((r) => r.phase[0])
103
- .join('')}.${entry.runs.reduce((acc, r) => acc + r.toolCalls, 0)}`;
104
- case 'todo':
105
- // REVISION MUST COVER EVERY FIELD THAT CAN CHANGE THE HEIGHT (§6.10.1). A
106
- // criterion going `pending` -> `failed` changes NONE of `items.length`,
107
- // `doneCount` or `total`, yet it adds an evidence row; without
108
- // `checkedCount` and `failedCount` here the height cache would keep the old
109
- // measurement and the cache would be silently wrong - textbook form of "add a
110
- // field, forget the revision".
111
- return `d${entry.live ? 1 : 0}.${entry.doneCount}.${entry.total}.${entry.items.length}`
112
- + `.a${entry.acceptance
113
- ? `${entry.acceptance.items.length}.${entry.acceptance.checkedCount}` +
114
- `.${entry.acceptance.failedCount}`
115
- : '-'}`;
116
- /**
117
- * The retry card is ONE ROW IN EVERY PHASE, so its revision carries the phase
118
- * and the counter but deliberately NOT the countdown: `resumeAt` changes the
119
- * rendered SECONDS once a second while the height stays 1, and folding it in
120
- * here would invalidate the height cache 30 times per backoff to re-measure a
121
- * number that cannot change the answer.
122
- *
123
- * `phase` and `attempt` ARE in, because they change the row's text and a stale
124
- * measurement would be wrong in a way nothing reports (I-L3-1).
125
- */
126
- case 'retry':
127
- return `r${entry.phase}.${entry.attempt}.${entry.maxRetries}`;
128
- /**
129
- * `status`, `live` and the TEXT LENGTH, because all three change the rows the
130
- * card draws: `advice` renders a body, everything else renders one line, and
131
- * the body's length decides how many rows it wraps to. `durationMs` is in the
132
- * header, which is `wrap="truncate"`, so it can never change the height.
133
- */
134
- case 'fast':
135
- return `f${entry.status}.${entry.live ? 1 : 0}.${entry.text?.length ?? 0}.${entry.detail?.length ?? 0}`;
136
- /**
137
- * `live`, the SUMMARY LENGTH and `mode`, because all three change the rows the
138
- * card draws: a live card renders a headline and no body, a settled one
139
- * renders the summary (whose length decides how many rows it wraps to), and
140
- * `mode` selects between the "summarized N messages" and "dropped N WITHOUT a
141
- * summary" detail lines. `durationMs` is inside the `wrap="truncate"`
142
- * headline, so it can never change the height.
143
- */
144
- case 'compaction':
145
- return `c${entry.live ? 1 : 0}.${entry.summary?.length ?? 0}.${entry.mode}.${entry.applied ? 1 : 0}`;
146
- /**
147
- * `rowsSeen`, AND NEVER `rows.length` (background-service-supervision P0-3).
148
- *
149
- * The service tail is a FIXED-SIZE RING: it evicts its oldest row while
150
- * appending a new one, so the joined length is unchanged while the content is
151
- * not. That is verbatim the NON-APPEND mutation I-L3-1 above says must extend
152
- * the revision, and it is the same trap — and the same fix — as the `tool`
153
- * branch's `liveSeq` two cases up. A length term would go on matching while
154
- * the card changed underneath it, and the card would freeze at a stale height
155
- * AND a stale rendered subtree with nothing anywhere reporting it.
156
- *
157
- * `status` and the presence of a URL are in because both change the rows the
158
- * card draws; `exitCode` is in because the terminal row names it.
159
- */
160
- case 'service':
161
- return `v${entry.status}.${entry.rowsSeen}.${entry.url ? 1 : 0}.${entry.exitCode ?? -1}.${entry.terminal ? 1 : 0}`;
162
- // A governance card is IMMUTABLE once appended (it is a settled record), so its
163
- // revision only has to tell two cards apart: the shape terms below are what decide
164
- // its height (`governanceCardRows`), and they cannot change without a new entry.
165
- case 'governance':
166
- return `g${entry.card.rows.length}.${entry.card.notes.length}.${entry.card.headline.length}`;
167
- default:
168
- return 'x';
169
- }
170
- }
171
- /**
172
- * The height-cache key.
173
- *
174
- * V-5 — `cols` is part of the key, so a resize invalidates every entry. The
175
- * frame after a resize renders from estimates and re-measures lazily: one
176
- * reflow, no crash, no stale layout.
177
- *
178
- * `flags` carries the render-affecting switches that are neither per-entry nor
179
- * part of `density` — today only `thinkingVisible` (Ctrl+T). It is a parameter
180
- * rather than a fifth positional scalar so a future switch costs one character
181
- * at the call site instead of a signature change at four.
182
- */
183
- export function heightKey(entry, cols, expanded, density, flags = '') {
184
- return `${entry.id}|${entryRevision(entry)}|${cols}|${expanded ? 1 : 0}|${density}|${flags}`;
185
- }
186
- /**
187
- * Rows a string occupies at `usable` columns, wrapping included. At least 1.
188
- *
189
- * COUNTED IN DISPLAY COLUMNS, NOT UTF-16 CODE UNITS, and the difference is a
190
- * correctness bug rather than a nicety: a CJK glyph is one code unit and two
191
- * cells, and a TAB is one code unit and up to `TAB_WIDTH` cells. Counting code
192
- * units therefore UNDER-estimates, which this file's own note names as the
193
- * unsafe direction ("an over-estimate makes the scroll position slightly
194
- * conservative and self-corrects ... an under-estimate can put the newest
195
- * output off the bottom of a viewport the user believes is pinned"). It also
196
- * had to change together with the renderers: a stored `\t` is now expanded at
197
- * paint time, so measuring the unexpanded string would keep the estimate short
198
- * while the painted row got taller.
199
- */
200
- function wrappedRows(text, usable) {
201
- const width = Math.max(1, usable);
202
- let rows = 0;
203
- let start = 0;
204
- for (;;) {
205
- const end = text.indexOf('\n', start);
206
- const line = end === -1 ? text.slice(start) : text.slice(start, end);
207
- rows += Math.max(1, Math.ceil(displayColumns(line) / width));
208
- if (end === -1)
209
- return rows;
210
- start = end + 1;
211
- }
212
- }
213
- /**
214
- * Printable ASCII with no TAB: one code unit is one cell, so the width table is
215
- * not consulted at all.
216
- *
217
- * THE FAST PATH IS LOAD-BEARING, not a micro-optimisation. `stringWidth`
218
- * strips ANSI and walks the East-Asian width table for every code point, and
219
- * this function runs over EVERY unmeasured entry of a 10 000-entry document
220
- * (`render-budget.test.tsx` mounts exactly that); measuring them all with the
221
- * table turned that test into a timeout. Transcript text is overwhelmingly
222
- * ASCII, so the branch is taken almost always.
223
- */
224
- const PLAIN_ASCII = /^[\x20-\x7e]*$/;
225
- /** Display columns of one logical line: TABs expanded, CJK counted twice. */
226
- function displayColumns(line) {
227
- if (line.indexOf('\t') === -1 && PLAIN_ASCII.test(line))
228
- return line.length;
229
- // `expandTabs` mirrors what `entries/*` paints; `stringWidth` is the width
230
- // table the composer already wraps with, so the two agree on CJK and emoji.
231
- return stringWidth(expandTabs(line));
232
- }
233
- /** Collapsed preview rows in `ToolCard`; duplicated as a NUMBER, not imported. */
234
- const TOOL_COLLAPSED_LINES = 8;
235
- /** Collapsed diff rows in `DiffView`; duplicated for the same reason as above. */
236
- const DIFF_COLLAPSED_LINES = 12;
237
- /** Live tail rows in `ToolCard`; duplicated as a NUMBER, for the same reason. */
238
- const TOOL_LIVE_TAIL_ROWS = 8;
239
- /** Tail rows a COLLAPSED `ServiceCard` draws; duplicated for the same reason. */
240
- const SERVICE_COLLAPSED_TAIL_ROWS = 2;
241
- /** Tail rows an EXPANDED `ServiceCard` draws; the snapshot cap (8). */
242
- const SERVICE_EXPANDED_TAIL_ROWS = 8;
243
- /**
244
- * The progress row the live `ServiceCard` draws when `progress` or `stalled` is
245
- * set (long-task-jobs §4.9), duplicated as the number `1` for the same reason as
246
- * the two constants above: `virtual-window.ts` counts lines, `ServiceCard.tsx`
247
- * draws them, and the pairing is kept by a test (AC-27) rather than by an import.
248
- */
249
- const SERVICE_PROGRESS_ROWS = 1;
250
- /**
251
- * Pure UPPER-BOUND estimate of an entry's height, used until a real measurement
252
- * exists.
253
- *
254
- * Upper bound rather than best guess, and deliberately so: an over-estimate
255
- * makes the scroll position slightly conservative and self-corrects the frame
256
- * after the entry is measured, while an under-estimate can put the newest output
257
- * off the bottom of a viewport the user believes is pinned.
258
- */
259
- export function estimateEntryRows(entry, cols, density, expanded, thinkingVisible = true) {
260
- const usable = Math.max(1, cols - GUTTER_WIDTH);
261
- // `separationRows` needs the PRECEDING entry, which a per-entry estimate does
262
- // not have. One row is its maximum, so charging it unconditionally keeps this
263
- // an upper bound (`compact` never spends it at all).
264
- const separation = density === 'comfortable' ? 1 : 0;
265
- switch (entry.kind) {
266
- case 'user':
267
- // A CARD HAS ITS OWN, BOUNDED HEIGHT (tui-invocation-cards I-4): the same
268
- // `invocationCardRows` the painter is built from, never the command line's wrapped rows.
269
- if (entry.invocation) {
270
- return separation + invocationCardRows(entry.invocation, usable, wrappedRows);
271
- }
272
- // MIRRORS `UserEntry`'s RENDER CAP (+1 for the `... +N more lines` tail).
273
- // THESE TWO NUMBERS ARE ONE NUMBER (I-13). Capping the renderer alone
274
- // would leave this function believing a 5 000-line message is 5 000 rows
275
- // tall -- and unlike an ordinary over-estimate that failure does NOT
276
- // self-correct: this file's own note above records that "an entry
277
- // estimated at 400 rows is exactly the one that never gets mounted", and
278
- // an unmounted entry is never measured.
279
- return (separation + Math.min(wrappedRows(entry.text, usable), USER_ENTRY_MAX_ROWS + 1));
280
- case 'notice':
281
- return separation + wrappedRows(entry.text, usable);
282
- case 'assistant': {
283
- // THE PARAMETER'S `true` DEFAULT IS A FAIL-SAFE FOR A FORGOTTEN CALLER,
284
- // NOT THE PLAN FOR THE ONE THERE IS (P1-6a). `Transcript.tsx` holds
285
- // `thinkingVisible` as a prop and MUST pass it: with thinking hidden by
286
- // default, an unpassed flag inflates every assistant entry that thought by
287
- // `1 + wrappedRows(thinking)` — hundreds of rows at `thinkingLevel: high`
288
- // against a real height of one. The self-correction argument does not
289
- // rescue that, because an entry is only measured once `selectWindow`
290
- // mounts it, and an entry estimated at 400 rows is exactly the one that
291
- // never gets mounted.
292
- const thinking = !entry.thinking
293
- ? 0
294
- : thinkingVisible
295
- ? 1 + wrappedRows(entry.thinking, usable)
296
- : // The collapsed `thought for Ns` marker is exactly one row, and it is
297
- // suppressed while the entry is still streaming (the activity line is
298
- // the live surface then).
299
- entry.streaming
300
- ? 0
301
- : 1;
302
- const body = entry.text.length > 0 ? wrappedRows(entry.text, usable) : 1;
303
- return separation + thinking + body + (entry.aborted ? 1 : 0);
304
- }
305
- case 'tool': {
306
- const settled = entry.status === 'done' || entry.status === 'error';
307
- // WHEN A PATCH IS PRESENT IT, NOT THE PREVIEW, IS WHAT DRAWS (§3.4): the
308
- // stored preview is one line by then, so estimating from it would report a
309
- // 3-row card for a 12-row diff — an UNDER-estimate, the direction this
310
- // file names as unsafe.
311
- if (settled && entry.patch) {
312
- const rows = entry.patch.lineCount + Math.max(0, entry.patch.hunks.length - 1);
313
- const shown = expanded ? rows : Math.min(rows, DIFF_COLLAPSED_LINES);
314
- // card header + `+N -M` summary + rows + footer
315
- return separation + 1 + 1 + shown + 1;
316
- }
317
- // THE ONE-LINE `if (!entry.preview || !settled)` THIS REPLACES COVERED TWO
318
- // CASES, and both must survive the split (P1-4): not settled, and settled
319
- // with nothing to draw (an aborted call, a tool that returned an empty
320
- // string). A `!settled` block alone would drop the second into
321
- // `wrappedRows(entry.preview, usable)` with `undefined`.
322
- if (!settled) {
323
- const live = entry.live?.length ?? 0;
324
- if (live === 0)
325
- return separation + 1;
326
- // Header + tail rows + the unconditional stall/`(running)` footer row.
327
- //
328
- // ROWS ARE COUNTED, NOT WRAPPED, which is legitimate only because every
329
- // live row is rendered `wrap="truncate"` AND clipped at
330
- // `LIVE_ROW_MAX_CHARS` on the way into the store -- the same argument
331
- // `DiffView.tsx:6-11` makes for itself, and the same coupling: if a
332
- // future change lets a live row wrap, this silently UNDER-counts, the
333
- // direction this file names as the one the layout cannot absorb.
334
- return separation + 1 + Math.min(live, TOOL_LIVE_TAIL_ROWS) + 1;
335
- }
336
- if (!entry.preview) {
337
- return separation + 1;
338
- }
339
- const lines = wrappedRows(entry.preview, usable);
340
- const shown = expanded ? lines : Math.min(lines, TOOL_COLLAPSED_LINES);
341
- // header + body + the `+N lines (Ctrl+O)` / `(Ctrl+O to collapse)` footer
342
- return separation + 1 + shown + 1;
343
- }
344
- case 'team':
345
- // A LIVE DISPATCH CARD IS NOT DRAWN AT ALL (tui-subagent-double-roster A-2):
346
- // the roster is the only live subagent surface, so this entry owes the window
347
- // ZERO rows. Estimating it at its real height while `EntryView` renders nothing
348
- // would make `selectWindow` reserve four rows for a card that is not on screen -
349
- // blank space at the bottom of every dispatch frame, and a window boundary that
350
- // disagrees with what the printer measures.
351
- if (isLiveTeamCard(entry))
352
- return 0;
353
- return separation + 1 + entry.runs.length + (expanded ? entry.runs.length * 3 + 1 : 1);
354
- case 'todo': {
355
- // THE ACCEPTANCE BLOCK'S ROWS, EXACTLY (§6.10.1): one title row plus one row
356
- // per criterion plus one row per FAILED criterion's evidence. Exact because
357
- // every one of those lines is `wrap="truncate"`; the moment one of them wraps,
358
- // this stops being an equality and becomes an upper bound - and the failure
359
- // mode is scroll drift, which nothing reports.
360
- const acceptance = entry.acceptance;
361
- const acceptanceRows = acceptance && acceptance.total > 0
362
- ? 1 + acceptance.items.length + acceptance.failedCount
363
- : 0;
364
- return separation + 1 + entry.items.length + acceptanceRows;
365
- }
366
- // ONE ROW, ALWAYS. The card is `wrap="truncate"` in every phase, so this is an
367
- // exact height rather than an upper bound.
368
- case 'retry':
369
- return separation + 1;
370
- // ADDING THE CASE TO ONLY ONE OF THIS FILE'S TWO SWITCHES YIELDS A
371
- // TRANSCRIPT WHOSE SCROLL ARITHMETIC DISAGREES WITH WHAT IT DREW, which
372
- // manifests as drift rather than as an error (RV-13). Header row, then
373
- // either the wrapped critique (clamped to `cardTextRows`) or one status
374
- // line — an upper bound, which is what this function owes its caller.
375
- case 'fast': {
376
- const body = entry.status === 'advice' && entry.text
377
- ? Math.min(FAST_LIMITS.cardTextRows, wrappedRows(entry.text, usable))
378
- : 1;
379
- return separation + 1 + body;
380
- }
381
- // THE SECOND SWITCH, and adding the case to only one of the two yields a
382
- // transcript whose scroll arithmetic disagrees with what it drew — drift
383
- // rather than an error (C-9 / RV-13). Headline row, one detail row, then the
384
- // summary clamped to `cardTextRows` (or unclamped when expanded) plus the
385
- // `+N more lines` footer. An UPPER BOUND, which is what this function owes
386
- // its caller.
387
- case 'compaction': {
388
- const lines = entry.summary ? wrappedRows(entry.summary, usable) : 0;
389
- const body = expanded ? lines : Math.min(lines, COMPACTION_LIMITS.cardTextRows);
390
- const footer = lines > body || (expanded && lines > COMPACTION_LIMITS.cardTextRows) ? 1 : 0;
391
- return separation + 1 + 1 + body + footer;
392
- }
393
- /**
394
- * THE THIRD SWITCH, and adding the case to only one of this file's two
395
- * yields a transcript whose scroll arithmetic disagrees with what it drew —
396
- * drift rather than an error (P0-3 / RV-13). Both `default` branches swallow
397
- * an unknown kind silently, and `virtual-window.test.ts` hand-enumerates
398
- * kinds, so neither omission turns anything red on its own.
399
- *
400
- * A terminal record is exactly one row. A live card is the status row, the
401
- * URL row when there is one, and the tail — counted, not wrapped, which is
402
- * legitimate only because every row is `wrap="truncate"` AND clipped at
403
- * `LIVE_ROW_MAX_CHARS` on the way into the ring, the same coupling the
404
- * `tool` branch above records for itself.
405
- */
406
- case 'service': {
407
- if (entry.terminal)
408
- return separation + 1;
409
- const url = entry.url ? 1 : 0;
410
- const tail = expanded
411
- ? Math.min(entry.rows.length, SERVICE_EXPANDED_TAIL_ROWS)
412
- : Math.min(entry.rows.length, SERVICE_COLLAPSED_TAIL_ROWS);
413
- // THE PROGRESS ROW IS ONE MORE LINE (long-task-jobs AC-27), and it is only
414
- // ever one because `ServiceCard` draws it with `wrap="truncate"` and the
415
- // supervisor clips it to `PROC_LIMITS.waitProgressChars`. A `stalled` badge
416
- // REPLACES it rather than adding to it - the two can never both be drawn,
417
- // so this stays a single term.
418
- const progress = entry.progress || entry.stalled ? SERVICE_PROGRESS_ROWS : 0;
419
- return separation + 1 + progress + url + tail;
420
- }
421
- // EXACT, not an upper bound: every line of the card is `wrap="truncate"`, so its
422
- // height is a function of its data alone (`layout/governance-card.ts`). It has to
423
- // be added to BOTH of this file's switches - one alone yields scroll drift.
424
- case 'governance':
425
- return separation + governanceCardRows(entry.card);
426
- default:
427
- return separation + 1;
428
- }
429
- }
430
- /** Choose which entries to mount, and how tall the two spacers must be. */
431
- export function selectWindow(input) {
432
- const { entries, heightOf } = input;
433
- const n = entries.length;
434
- if (n === 0) {
435
- return { startIndex: 0, endIndex: 0, leadingRows: 0, trailingRows: 0, totalRows: 0 };
436
- }
437
- const heights = new Array(n);
438
- let totalRows = 0;
439
- for (let i = 0; i < n; i += 1) {
440
- const h = heightOf(i);
441
- const rows = Number.isFinite(h) && h > 0 ? Math.floor(h) : 1;
442
- heights[i] = rows;
443
- totalRows += rows;
444
- }
445
- // A viewport of 0 is the FIRST FRAME, before `measureElement` has run. Falling
446
- // back to 1 keeps the live tail mounted through it, so the first paint is real
447
- // content rather than a blank rectangle that only fills in on the second.
448
- const viewport = Math.max(1, Math.floor(input.viewportRows) || 0);
449
- const offset = Math.max(0, Math.floor(input.offset) || 0);
450
- const overscan = Math.max(VIRTUAL_LIMITS.overscan, Math.floor(input.overscan) || 0);
451
- const bottom = totalRows + (input.trailingContentRows ?? 0) - offset;
452
- const top = bottom - viewport;
453
- let start = n - 1;
454
- let acc = 0;
455
- for (let i = 0; i < n; i += 1) {
456
- const next = acc + heights[i];
457
- if (next > top) {
458
- start = i;
459
- break;
460
- }
461
- acc = next;
462
- }
463
- let end = n;
464
- acc = 0;
465
- for (let i = 0; i < n; i += 1) {
466
- if (acc >= bottom) {
467
- end = i;
468
- break;
469
- }
470
- acc += heights[i];
471
- }
472
- start = Math.max(0, start - overscan);
473
- end = Math.min(n, end + overscan);
474
- // V-3 — while pinned, the LAST entry is always inside the window, whatever its
475
- // height. The live tail must be real content and never a spacer, or a
476
- // streaming answer renders as a growing blank rectangle.
477
- if (offset <= 0)
478
- end = n;
479
- if (end <= start)
480
- end = Math.min(n, start + 1);
481
- let leadingRows = 0;
482
- for (let i = 0; i < start; i += 1)
483
- leadingRows += heights[i];
484
- let trailingRows = 0;
485
- for (let i = end; i < n; i += 1)
486
- trailingRows += heights[i];
487
- return { startIndex: start, endIndex: end, leadingRows, trailingRows, totalRows };
488
- }
@@ -1,26 +0,0 @@
1
- /**
2
- * `wrapToRows` — the prose wrapper for `OverlayFrame`'s controlled (mode A)
3
- * content (plan-mode §6.6).
4
- *
5
- * Mode A's contract is *one element per row, each already `wrap="truncate"`*,
6
- * and `sliceWindow` counts ELEMENTS, not lines. Help and Settings satisfy that
7
- * naturally because their content is a list of short rows. A plan is not: its
8
- * summary runs to 600 characters and a step detail to 400, so handing either
9
- * over as a single `<Text>` renders the whole paragraph as one truncated line —
10
- * the single worst failure available to a plan review card, and one that also
11
- * makes the frame's `1-14/22` position indicator a false statement.
12
- *
13
- * The repo had no wrapper before this (no `wrapText`, no `wordWrap`), so here is
14
- * one: pure, no Ink, unit-tested.
15
- */
16
- /**
17
- * Break `text` into lines of at most `width` columns.
18
- *
19
- * Prefers spaces; hard-breaks any single token longer than `width` (a URL or a
20
- * long path, which must not be dropped and cannot be wrapped politely).
21
- * Width is measured in terminal cells and hard breaks preserve graphemes. A
22
- * single grapheme wider than the limit stays intact on its own row.
23
- * Existing newlines are honoured as paragraph breaks. Returns `[]` for empty
24
- * input so callers can splice the result without an emptiness branch.
25
- */
26
- export declare function wrapToRows(text: string, width: number): string[];
@@ -1,88 +0,0 @@
1
- import { graphemes, graphemeWidth } from '../editor-navigation.js';
2
- /**
3
- * `wrapToRows` — the prose wrapper for `OverlayFrame`'s controlled (mode A)
4
- * content (plan-mode §6.6).
5
- *
6
- * Mode A's contract is *one element per row, each already `wrap="truncate"`*,
7
- * and `sliceWindow` counts ELEMENTS, not lines. Help and Settings satisfy that
8
- * naturally because their content is a list of short rows. A plan is not: its
9
- * summary runs to 600 characters and a step detail to 400, so handing either
10
- * over as a single `<Text>` renders the whole paragraph as one truncated line —
11
- * the single worst failure available to a plan review card, and one that also
12
- * makes the frame's `1-14/22` position indicator a false statement.
13
- *
14
- * The repo had no wrapper before this (no `wrapText`, no `wordWrap`), so here is
15
- * one: pure, no Ink, unit-tested.
16
- */
17
- /**
18
- * Break `text` into lines of at most `width` columns.
19
- *
20
- * Prefers spaces; hard-breaks any single token longer than `width` (a URL or a
21
- * long path, which must not be dropped and cannot be wrapped politely).
22
- * Width is measured in terminal cells and hard breaks preserve graphemes. A
23
- * single grapheme wider than the limit stays intact on its own row.
24
- * Existing newlines are honoured as paragraph breaks. Returns `[]` for empty
25
- * input so callers can splice the result without an emptiness branch.
26
- */
27
- export function wrapToRows(text, width) {
28
- if (typeof text !== 'string' || text.length === 0)
29
- return [];
30
- const limit = Math.max(1, Math.floor(width));
31
- const rows = [];
32
- for (const paragraph of text.split('\n')) {
33
- if (paragraph.trim().length === 0) {
34
- // A blank line in the source is a deliberate separator; keep it as a row
35
- // rather than collapsing it, or the summary and the steps run together.
36
- rows.push('');
37
- continue;
38
- }
39
- rows.push(...wrapParagraph(paragraph, limit));
40
- }
41
- return rows;
42
- }
43
- function wrapParagraph(paragraph, limit) {
44
- const rows = [];
45
- let current = '';
46
- let currentWidth = 0;
47
- for (const word of paragraph.split(/\s+/).filter((w) => w.length > 0)) {
48
- const parts = graphemes(word);
49
- const wordWidth = parts.reduce((sum, part) => sum + graphemeWidth(part.text), 0);
50
- if (wordWidth > limit) {
51
- // Flush what we have, then chop the over-long token into full-width
52
- // pieces. Its tail becomes the new `current` so the next word can still
53
- // join it.
54
- if (current.length > 0) {
55
- rows.push(current);
56
- current = '';
57
- currentWidth = 0;
58
- }
59
- for (const part of parts) {
60
- const cells = graphemeWidth(part.text);
61
- if (current && currentWidth + cells > limit) {
62
- rows.push(current);
63
- current = '';
64
- currentWidth = 0;
65
- }
66
- current += part.text;
67
- currentWidth += cells;
68
- }
69
- continue;
70
- }
71
- if (current.length === 0) {
72
- current = word;
73
- currentWidth = wordWidth;
74
- }
75
- else if (currentWidth + 1 + wordWidth <= limit) {
76
- current = `${current} ${word}`;
77
- currentWidth += 1 + wordWidth;
78
- }
79
- else {
80
- rows.push(current);
81
- current = word;
82
- currentWidth = wordWidth;
83
- }
84
- }
85
- if (current.length > 0)
86
- rows.push(current);
87
- return rows;
88
- }
@@ -1,14 +0,0 @@
1
- /** Keep the newest thinking lines visible while an assistant entry streams. */
2
- export interface LiveClamp {
3
- text: string;
4
- /** Rows dropped off the FRONT. `0` means the text was returned untouched. */
5
- hiddenRows: number;
6
- }
7
- /**
8
- * Keep the LAST `maxRows` rows of `text`; report how many were dropped.
9
- *
10
- * Rows, not wrapped display lines: this runs per frame on a streaming entry, and
11
- * a wrap-aware count would need the column width and a second full scan of a
12
- * string this function exists to avoid scanning twice.
13
- */
14
- export declare function clampLiveText(text: string, maxRows: number): LiveClamp;
@@ -1,46 +0,0 @@
1
- /** Keep the newest thinking lines visible while an assistant entry streams. */
2
- /**
3
- * Keep the LAST `maxRows` rows of `text`; report how many were dropped.
4
- *
5
- * Rows, not wrapped display lines: this runs per frame on a streaming entry, and
6
- * a wrap-aware count would need the column width and a second full scan of a
7
- * string this function exists to avoid scanning twice.
8
- */
9
- export function clampLiveText(text, maxRows) {
10
- if (!Number.isFinite(maxRows) || maxRows <= 0)
11
- return { text: '', hiddenRows: rowCount(text) };
12
- const keep = Math.floor(maxRows);
13
- // Cheap reject: a string with fewer than `keep` newlines cannot have more than
14
- // `keep` rows, and this is the path every ordinary entry takes.
15
- let newlines = 0;
16
- for (let i = 0; i < text.length; i += 1) {
17
- if (text.charCodeAt(i) === 10)
18
- newlines += 1;
19
- }
20
- if (newlines + 1 <= keep)
21
- return { text, hiddenRows: 0 };
22
- // Walk back from the end to the `keep`-th newline rather than splitting the
23
- // whole string: the point of the clamp is to stop touching the head at all.
24
- let cut = text.length;
25
- let seen = 0;
26
- for (let i = text.length - 1; i >= 0; i -= 1) {
27
- if (text.charCodeAt(i) === 10) {
28
- seen += 1;
29
- if (seen === keep) {
30
- cut = i + 1;
31
- break;
32
- }
33
- }
34
- }
35
- return { text: text.slice(cut), hiddenRows: newlines + 1 - keep };
36
- }
37
- function rowCount(text) {
38
- if (text.length === 0)
39
- return 0;
40
- let n = 1;
41
- for (let i = 0; i < text.length; i += 1) {
42
- if (text.charCodeAt(i) === 10)
43
- n += 1;
44
- }
45
- return n;
46
- }