@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,648 +0,0 @@
1
- /**
2
- * ScrollbackWriter — the byte contract of native-scroll mode
3
- * (tui-native-terminal-scroll §4.3, extended by tui-bottom-anchored-live-region
4
- * and re-based on a CANVAS by tui-canvas-bottom-anchor).
5
- *
6
- * It implements `FrameDiffer`, so `stdout-frame-writer.ts::wrapStdoutForFrames`
7
- * binds it to a real stream exactly as it binds the full-screen differ. What it
8
- * does differently: the screen is NOT the app's. Settled conversation rows are
9
- * printed into the host terminal's own scrollback, and Ink's frame is only a small
10
- * LIVE REGION parked under the last printed row.
11
- *
12
- * GEOMETRY IS RELATIVE (D2/D4). A batch is `CUU(canvasRows)` to the top of the
13
- * previous CANVAS, erase down, skip the gap, print the content rows, print the
14
- * region, park on the last row. Nothing needs the terminal's absolute row count, so
15
- * a terminal that scrolls underneath cannot misplace anything.
16
- *
17
- * THE CANVAS (tui-canvas-bottom-anchor D1/D3). The `rows - 1` rows above the parked
18
- * row belong to the writer and are always laid out top-down as
19
- * `[gap][content][region]`. The previous feature put its blank rows between the
20
- * content and the region (`[content][pad][region]`), which is why a short
21
- * conversation left a reply floating far above the composer. The blank space now
22
- * lives above every visible content row, so the newest printed row always touches
23
- * the top row of the live region, while the composer stays on the last two rows.
24
- * The gap is SKIPPED with CUD and never written, so a blank row can never be pushed
25
- * into the scrollback (I-B3).
26
- *
27
- * THE PRICE, and it is the only one: the content rows still on the canvas can be
28
- * re-drawn when the layout changes (a region collapse, a longer draft), because the
29
- * rows that the region gives back have to move onto the canvas top. That is why the
30
- * writer keeps a bounded cache of them (`held`, at most `capacity - H` rows). A row
31
- * that leaves the canvas — pushed into the scrollback or erased at exit — is never
32
- * written again, so the history the user scrolls through is exactly what was
33
- * printed, once (I-B5). `anchor: unknown` (nothing measured: no TTY, no filter, no
34
- * CPR answer) keeps the pre-feature bytes exactly, which is what keeps the old byte
35
- * tests meaningful (I-B7).
36
- *
37
- * THE INVARIANTS THAT FAIL SILENTLY IF DROPPED:
38
- * - I-S4 · every batch parks the cursor one row below the region, column 0, the
39
- * same place Ink's `previousLineCount = H + 1` expects.
40
- * - I-S8 · geometry in doubt (foreign write, unparseable chunk) => `prev = null`
41
- * => next batch is a SEED. Never keep erasing on a stale height.
42
- * - I-S14 · after `finalize` EVERY Ink write is swallowed.
43
- * - I-S13 · no emitted row is wider than `cols - 1` (clipped, counted).
44
- * - I-B1 · a batch ends parked on `rows - 1`, which is what the next `CUU` assumes.
45
- * - I-B3 · blank rows only ever exist as SKIPPED rows, and a batch that scrolls has
46
- * `gap = 0`, so the scrollback never receives an empty row from this file.
47
- * - I-B5 · `held` is a contiguous suffix of the printed content, and `dropped` is
48
- * exactly the number of rows this batch pushed off the top. The BYTES carry the
49
- * untrimmed content: the terminal can only scroll away rows it was given.
50
- * - I-B14 · a re-measurement re-derives `capacity` from `spaceBelow + canvasRows`,
51
- * never from `spaceBelow` alone: the canvas itself still owns the rows above the
52
- * cursor, and forgetting them makes the next batch read its own screen as an
53
- * overflow and print every visible row a second time.
54
- * - I-B15 · every batch starts by reconciling `top + capacity` with the live
55
- * `rows - 1` (a resize event can arrive one frame late), and a column change
56
- * resets before it writes.
57
- * - I-B17 · a SHRINK re-pins the canvas, it never drops it. The canvas keeps
58
- * `min(canvasRows, screenCapacity(rows))` rows — the screen keeps the rows nearest
59
- * the parked cursor, so the survivors are its SUFFIX — and its top moves down to
60
- * `capacity - kept`, which preserves LB-3. Dropping the cache instead made the next
61
- * batch a SEED, and a seed assumes nothing is below the cursor
62
- * (`writer-shapes.ts:60-64`); after a shrink that is false, so the batch overflowed
63
- * the screen and the previous frame — status row included — went into the
64
- * scrollback: the same row in two places. For the same reason a frame TALLER than
65
- * the screen gives way at its TOP instead of being swallowed whole: the composer
66
- * and the status line are the two rows a human is interacting with.
67
- * - I-A9 · the writer never writes a probe byte; it only asks the host, which owns
68
- * deferral, coalescing and the death switch.
69
- */
70
- import { parseInkFrame } from '../frame-parser.js';
71
- import { clampSpaceBelow, resolveCanvasLayout, screenCapacity, UNKNOWN_CANVAS, applyResizeGrowth, } from './canvas.js';
72
- import { SCROLLBACK_LIMITS } from './limits.js';
73
- import { canvasBytes, canvasSeedBytes, clipLine, diffBytes, finalizeBytes, fullBytes, seedBytes, } from './writer-shapes.js';
74
- /** `ansiEscapes.clearTerminal` — Ink's tall-frame write. It contains `ESC[3J`. */
75
- const CLEAR_TERMINAL = '\x1b[2J\x1b[3J\x1b[H';
76
- export function createScrollbackWriter(o) {
77
- const now = o.now ?? Date.now;
78
- const maxBatch = SCROLLBACK_LIMITS.maxRowsPerBatch;
79
- /** Where the bottom of the screen is, as far as anything has measured it. */
80
- let anchor = UNKNOWN_CANVAS;
81
- /** Content rows still on the canvas, oldest first, already clipped (I-B9). */
82
- let held = [];
83
- /** Gap rows of the previous batch. */
84
- let gapRows = 0;
85
- /** Frame rows of the previous batch (`regionRows()`). */
86
- let frameRows = 0;
87
- /** Canvas height of the previous batch = the erase distance. */
88
- let canvasRows = 0;
89
- /** The canvas as it stands on screen (`''` = a skipped gap row), or null if lost. */
90
- let prev = null;
91
- /** The last frame BEFORE clipping, so unchanged rows are not re-measured. */
92
- let prevRawFrame = null;
93
- /** The last frame AFTER clipping, aligned with `prevRawFrame` (P2-3). */
94
- let prevClippedFrame = null;
95
- let everWritten = false;
96
- let seenAnyChunk = false;
97
- let finalized = false;
98
- let guardTripped = false;
99
- let consecutiveGuard = 0;
100
- let lastResizeAt = Number.NEGATIVE_INFINITY;
101
- /** Width the previous canvas was written at, for the column-change reset. */
102
- let lastWriteCols;
103
- /** Terminal height at the previous batch: the basis of a resize delta. */
104
- let lastRows;
105
- let repaintQueued = false;
106
- let anchorSource = 'none';
107
- /** A fresh measurement is waiting to be consumed by the next write. */
108
- let anchorDirty = false;
109
- let anchorReprobes = 0;
110
- let scrolledRows = 0;
111
- /**
112
- * Rows between the cursor and the canvas top for the NEXT seed, when the canvas is
113
- * shorter than the measured space below the cursor (a terminal taller than
114
- * `maxCanvasRows`). Zero in every other state, because a canvas that exists has its
115
- * top above the parked cursor by construction.
116
- */
117
- let seedDownToTop = 0;
118
- const stats = {
119
- framesSeed: 0, framesDiff: 0, framesFull: 0, staticRowsWritten: 0, bytesWritten: 0,
120
- fallbacks: 0, guardHits: 0, guardHitsOutsideResize: 0, clippedRows: 0, elidedEntries: 0,
121
- resizes: 0, repaints: 0, anchorSource: 'none', anchorCanvasRows: 0, anchorHeldRows: 0,
122
- anchorGapRows: 0, anchorScrollRows: 0, anchorResets: 0, anchorReprobes: 0,
123
- tallFramesTrimmed: 0,
124
- };
125
- const liveCols = () => {
126
- const cols = o.cols();
127
- return cols !== undefined && Number.isFinite(cols) && cols >= 1 ? Math.floor(cols) : undefined;
128
- };
129
- const liveRows = () => {
130
- const rows = o.rows();
131
- return rows !== undefined && Number.isFinite(rows) ? Math.floor(rows) : undefined;
132
- };
133
- const scheduleRepaint = () => {
134
- if (!o.requestRepaint || repaintQueued || finalized)
135
- return;
136
- repaintQueued = true;
137
- // Deferred by the host (setImmediate): this can fire from inside Ink's write.
138
- o.requestRepaint();
139
- };
140
- /**
141
- * Ask for a measurement. Never writes anything itself, and never after `finalize`
142
- * (I-A9): the host owns the deferral, the coalescing and the death switch.
143
- */
144
- const requestProbe = () => {
145
- if (finalized || anchorSource === 'none')
146
- return;
147
- o.requestAnchorProbe?.();
148
- };
149
- /** Report what the canvas looks like right now. Produces no bytes. */
150
- const publishAnchorStats = () => {
151
- const pinned = anchor.kind === 'pinned';
152
- stats.anchorSource = anchorSource;
153
- stats.anchorCanvasRows = pinned ? canvasRows : 0;
154
- stats.anchorHeldRows = pinned ? held.length : 0;
155
- stats.anchorGapRows = pinned ? gapRows : 0;
156
- stats.anchorScrollRows = scrolledRows;
157
- stats.anchorReprobes = anchorReprobes;
158
- };
159
- /**
160
- * Drop the canvas and go back to the append path (D5, I-B8, I-A3).
161
- *
162
- * Shared by a column change, a shrink, `invalidate()` and a lost geometry: all
163
- * four have the same safe answer, "re-measure and print nothing until then".
164
- * The rows already on screen are NOT redrawn — they are not where the cache says
165
- * they are, and a wrong erase both duplicates and destroys user-visible content.
166
- */
167
- const reset = () => {
168
- prev = null;
169
- prevRawFrame = null;
170
- prevClippedFrame = null;
171
- held = [];
172
- gapRows = 0;
173
- canvasRows = 0;
174
- seedDownToTop = 0;
175
- anchor = UNKNOWN_CANVAS;
176
- anchorDirty = false;
177
- stats.anchorResets += 1;
178
- publishAnchorStats();
179
- requestProbe();
180
- };
181
- /** Clip a frame row to `cols - 1`, reusing the previous result for unchanged rows. */
182
- const clipFrame = (raw, cols) => {
183
- if (cols === undefined)
184
- return [...raw];
185
- const limit = cols - 1;
186
- return raw.map((line, i) => {
187
- const cached = prevClippedFrame?.[i];
188
- if (cached !== undefined && prevRawFrame?.[i] === line)
189
- return cached;
190
- const result = clipLine(line, limit);
191
- if (result.clipped)
192
- stats.clippedRows += 1;
193
- return result.text;
194
- });
195
- };
196
- const clipStatics = (rows, cols) => {
197
- if (cols === undefined || rows.length === 0)
198
- return rows;
199
- return rows.map((line) => {
200
- const result = clipLine(line, cols - 1);
201
- if (result.clipped)
202
- stats.clippedRows += 1;
203
- return result.text;
204
- });
205
- };
206
- const record = (bytes, shape, statics) => {
207
- if (shape === 'seed')
208
- stats.framesSeed += 1;
209
- else if (shape === 'diff')
210
- stats.framesDiff += 1;
211
- else if (shape === 'full')
212
- stats.framesFull += 1;
213
- else
214
- stats.repaints += 1;
215
- stats.staticRowsWritten += statics;
216
- stats.bytesWritten += bytes.length;
217
- return bytes;
218
- };
219
- /**
220
- * Drop from the canvas cache the rows a shorter screen no longer has (I-B17).
221
- *
222
- * A shrink deletes rows ABOVE the parked cursor, so what survives is the canvas's
223
- * SUFFIX: the gap goes first, then the oldest content rows. Trimming the cache is
224
- * what lets the next batch be a DIFF against what is really on screen. Dropping the
225
- * cache (`reset()`) made it a SEED instead, and a seed assumes nothing is below the
226
- * cursor (`writer-shapes.ts:60-64`) — after a shrink that is false, so the batch
227
- * overflowed and the previous frame, status row included, was pushed into the
228
- * scrollback instead of being erased.
229
- */
230
- const trimCanvasCache = (capacity) => {
231
- const lost = canvasRows - capacity;
232
- if (lost <= 0)
233
- return;
234
- const lostFromGap = Math.min(lost, gapRows);
235
- gapRows -= lostFromGap;
236
- held = held.slice(Math.min(lost - lostFromGap, held.length));
237
- prev = prev === null ? null : prev.slice(lost);
238
- canvasRows = capacity;
239
- // A drastic shrink can eat into the region itself (E2). `frameRows` is the height
240
- // the next diff is aligned against, so it may never claim rows that are gone.
241
- frameRows = Math.min(frameRows, Math.max(0, capacity - gapRows - held.length));
242
- };
243
- /**
244
- * Re-pin a canvas the terminal just got SHORTER, instead of dropping it (I-B17).
245
- *
246
- * `top` moves DOWN (`capacity - kept`) because the rows the screen lost were the ones
247
- * above the cursor: the parked row is still `rows - 1`, so LB-3 holds for the same
248
- * reason it always did.
249
- *
250
- * `capacity < 1` keeps the old answer (E3): a terminal with no row above the parked one
251
- * has no canvas left to address, and re-measuring is then the only honest move. Columns
252
- * are deliberately NOT handled here: a width change re-flows the rows themselves, so
253
- * the cache describes nothing and still resets (D5 / E4).
254
- */
255
- const repinShrunk = (rows) => {
256
- const room = screenCapacity(rows);
257
- // Only a MEASURED canvas may be re-pinned. `unknown` means nothing ever established
258
- // that the cursor sits on the last row, and the arithmetic below starts from exactly
259
- // that assumption; the append path erases nothing, so it stays the honest answer and
260
- // keeps its bytes exactly as they were (I-B7).
261
- const capacity = anchor.kind === 'pinned' ? Math.min(canvasRows, room) : 0;
262
- if (capacity < 1) {
263
- reset();
264
- return;
265
- }
266
- trimCanvasCache(capacity);
267
- anchor = { kind: 'pinned', top: room - capacity, capacity };
268
- seedDownToTop = 0;
269
- lastRows = rows;
270
- // The re-draw this answers is the host's, deferred and coalesced (P0-2 / P0-3):
271
- // `anchorDirty` is what lets a `repaint()` land while the feed is idle.
272
- anchorDirty = true;
273
- publishAnchorStats();
274
- // Re-measure anyway (I-B14). Keeping the canvas is a bet that the parked row is still
275
- // `rows - 1`, and only a measurement can confirm the terminal agrees; dropping the
276
- // probe here would leave a wrong geometry with nothing left to correct it. A drag
277
- // that fires dozens of resize events still costs one probe: the host coalesces them
278
- // (P1-3 / E6), and `anchorReprobes` counts measurements, never requests.
279
- requestProbe();
280
- };
281
- /**
282
- * Bring `top + capacity` back in line with the live `rows - 1` BEFORE the batch
283
- * reads either of them (§6.11, [P0-2]).
284
- *
285
- * The `resize` event is dispatched a libuv turn after `stdout.rows` changed, so a
286
- * frame can arrive on the new grid while the anchor still describes the old one.
287
- * The pre-canvas writer healed that one batch later, by deriving `gap` from the
288
- * current height; a canvas cannot, because `top` and `capacity` only ever change
289
- * where they are measured — and the batch that ran on the stale grid would record
290
- * the new height, leaving the late `onResize` with a delta of zero. On a terminal
291
- * that never answers CPR that is a composer stuck mid-screen for the session.
292
- */
293
- const reconcile = (rows, cols) => {
294
- if (anchor.kind !== 'pinned')
295
- return;
296
- if (cols !== undefined && lastWriteCols !== undefined && cols !== lastWriteCols) {
297
- reset();
298
- return;
299
- }
300
- const capacity = screenCapacity(rows);
301
- const parked = anchor.top + anchor.capacity;
302
- if (capacity === parked)
303
- return;
304
- if (capacity > parked) {
305
- // The terminal grew below the cursor: the cursor did not move, so the canvas
306
- // owns exactly the extra rows.
307
- anchor = { kind: 'pinned', top: anchor.top, capacity: anchor.capacity + (capacity - parked) };
308
- lastRows = rows;
309
- return;
310
- }
311
- // The `resize` event can arrive a whole frame late, and on a terminal that never
312
- // answers CPR it never arrives at all: this batch is then the last chance to keep
313
- // the canvas instead of dropping it (I-B17, W6).
314
- repinShrunk(rows);
315
- };
316
- const afterCanvasBatch = (layout, heldNext, frame, raw, cols, rows) => {
317
- prev = [...new Array(layout.gap).fill(''), ...heldNext, ...frame];
318
- prevRawFrame = [...raw];
319
- prevClippedFrame = [...frame];
320
- canvasRows = prev.length;
321
- held = [...heldNext];
322
- gapRows = layout.gap;
323
- frameRows = frame.length;
324
- anchor = { kind: 'pinned', top: layout.top, capacity: layout.canvasRows };
325
- everWritten = true;
326
- lastWriteCols = cols;
327
- lastRows = rows;
328
- anchorDirty = false;
329
- seedDownToTop = 0;
330
- scrolledRows += layout.scroll;
331
- publishAnchorStats();
332
- // A feed larger than one batch continues on the next tick, region still parked.
333
- if (o.drain.pending() > 0) {
334
- repaintQueued = false;
335
- scheduleRepaint();
336
- }
337
- };
338
- const afterLegacyBatch = (raw, frame, cols, rows) => {
339
- prev = [...frame];
340
- prevRawFrame = [...raw];
341
- prevClippedFrame = [...frame];
342
- // The region IS the erasable block on this path, which is also the number a
343
- // later measurement needs in order to know how far above the cursor its top is.
344
- canvasRows = frame.length;
345
- gapRows = 0;
346
- frameRows = frame.length;
347
- held = [];
348
- everWritten = true;
349
- lastWriteCols = cols;
350
- lastRows = rows;
351
- anchorDirty = false;
352
- publishAnchorStats();
353
- if (o.drain.pending() > 0) {
354
- repaintQueued = false;
355
- scheduleRepaint();
356
- }
357
- };
358
- /**
359
- * The pre-canvas append path: static rows above a region that is never redrawn.
360
- * Byte-identical to the writer before either anchor existed (I-B7): `seedBytes` /
361
- * `fullBytes` / `diffBytes`, `eraseUp = canvasRows` (= the frame height).
362
- */
363
- const assembleLegacy = (raw, statics, frame, rows, cols, mode) => {
364
- let out;
365
- if (prev === null) {
366
- out = record(seedBytes({ lines: frame, statics, sync: o.sync, reseed: everWritten }), 'seed', statics.length);
367
- }
368
- else if (mode === 'repaint') {
369
- out = record(fullBytes({ lines: frame, statics, eraseUp: canvasRows, sync: o.sync }), 'repaint', statics.length);
370
- }
371
- else if (statics.length > 0 || frame.length !== canvasRows || o.fullEveryFrame) {
372
- out = record(fullBytes({ lines: frame, statics, eraseUp: canvasRows, sync: o.sync }), 'full', statics.length);
373
- }
374
- else {
375
- out = record(diffBytes({ lines: frame, prev, sync: o.sync }), 'diff', 0);
376
- }
377
- afterLegacyBatch(raw, frame, cols, rows);
378
- return out;
379
- };
380
- /**
381
- * A canvas batch repaints EVERYTHING when the layout moved, and only the rows that
382
- * differ when it did not. `layout.scroll > 0` forces the full shape for a reason
383
- * the other four conditions do not cover: when the canvas is already the whole
384
- * screen its height cannot change, so a batch that pushes rows out would otherwise
385
- * be diffed against rows it has just lost.
386
- */
387
- const needsCanvasShape = (layout, frame, statics, mode) => {
388
- if (mode === 'repaint')
389
- return true;
390
- return statics > 0 || layout.scroll > 0 || layout.gap !== gapRows ||
391
- layout.canvasRows !== canvasRows || frame.length !== frameRows || o.fullEveryFrame;
392
- };
393
- const emitCanvas = (layout, content, kept, frame, statics, mode) => {
394
- if (prev === null) {
395
- return record(canvasSeedBytes({
396
- downToTop: seedDownToTop,
397
- gap: layout.gap, held: content, lines: frame, sync: o.sync, reseed: everWritten,
398
- }), 'seed', statics);
399
- }
400
- if (needsCanvasShape(layout, frame, statics, mode)) {
401
- return record(canvasBytes({
402
- eraseUp: canvasRows, gap: layout.gap, held: content, lines: frame, sync: o.sync,
403
- }), mode === 'repaint' ? 'repaint' : 'full', statics);
404
- }
405
- const shown = [...new Array(layout.gap).fill(''), ...kept, ...frame];
406
- return record(diffBytes({ lines: shown, prev, sync: o.sync }), 'diff', 0);
407
- };
408
- /**
409
- * THE ONE PLACE THE GEOMETRY IS COMPUTED (§6.2), shared by `transform` and
410
- * `repaint` so the two can never disagree about where the region goes.
411
- *
412
- * Order is load-bearing: reconcile, then static rows, then the layout, then the
413
- * bytes. `ED0`, the gap, the content, the region — in that order, always.
414
- */
415
- const assemble = (raw, rows, cols, mode) => {
416
- reconcile(rows, cols);
417
- const statics = clipStatics(o.drain.takeUpTo(maxBatch), cols);
418
- const frame = clipFrame(raw, cols);
419
- if (anchor.kind === 'unknown') {
420
- return assembleLegacy(raw, statics, frame, rows, cols, mode);
421
- }
422
- const layout = resolveCanvasLayout({
423
- capacity: anchor.capacity,
424
- top: anchor.top,
425
- heldRows: held.length,
426
- statRows: statics.length,
427
- frameRows: frame.length,
428
- lead: prev === null && everWritten ? 1 : 0,
429
- });
430
- // The bytes carry every content row; the ones that do not fit leave through the
431
- // bottom, and the terminal can only scroll away rows it was given. `held` keeps
432
- // the suffix that is still on screen (I-B5).
433
- const content = held.concat(statics);
434
- const kept = layout.dropped > 0 ? content.slice(layout.dropped) : content;
435
- const out = emitCanvas(layout, content, kept, frame, statics.length, mode);
436
- afterCanvasBatch(layout, kept, frame, raw, cols, rows);
437
- return out;
438
- };
439
- const swallowTallFrame = () => {
440
- stats.guardHits += 1;
441
- if (now() - lastResizeAt >= SCROLLBACK_LIMITS.guardResizeGraceMs) {
442
- stats.guardHitsOutsideResize += 1;
443
- consecutiveGuard += 1;
444
- if (consecutiveGuard >= SCROLLBACK_LIMITS.guardTripCount && !guardTripped) {
445
- guardTripped = true;
446
- o.onGuardTrip?.();
447
- }
448
- }
449
- // Swallow the whole chunk: it would clear the visible screen AND scrollback.
450
- return '';
451
- };
452
- const countFallback = (counted) => {
453
- reset();
454
- if (counted) {
455
- stats.fallbacks += 1;
456
- if (stats.fallbacks === 1)
457
- o.onFirstFallback?.();
458
- }
459
- return null;
460
- };
461
- /**
462
- * Ink wrote a frame we cannot address (a one-row terminal). Record only what the
463
- * FRAME tells us (P2-6): a frame is not a canvas, so on the append path it is the
464
- * block (`canvasRows = H`), and on the canvas path nothing survives but the fact
465
- * that the geometry is lost.
466
- */
467
- const passThrough = (lines) => {
468
- if (lines === null)
469
- return;
470
- prevRawFrame = lines;
471
- prevClippedFrame = lines;
472
- frameRows = lines.length;
473
- if (anchor.kind === 'pinned') {
474
- reset();
475
- return;
476
- }
477
- prev = lines;
478
- canvasRows = lines.length;
479
- gapRows = 0;
480
- };
481
- /**
482
- * Give way at the TOP of a frame taller than the screen (I-B17 / W4).
483
- *
484
- * Such a frame cannot be addressed as ONE block, and swallowing it left the PREVIOUS
485
- * frame on screen — which is how the status row came to be printed twice. The region's
486
- * last rows are the composer and the status line, the two rows a human is interacting
487
- * with, so the oldest rows go first and the next (shorter) frame restores the rest.
488
- *
489
- * BOTH entry points that draw a frame need this: `repaint()` replays the frame it kept,
490
- * and that frame can predate a shrink that has since made the screen shorter.
491
- */
492
- const giveWayAtTop = (lines, rows) => {
493
- if (lines.length + 1 <= rows)
494
- return lines;
495
- stats.tallFramesTrimmed += 1;
496
- return lines.slice(lines.length - (rows - 1));
497
- };
498
- const transform = (chunk) => {
499
- if (finalized)
500
- return '';
501
- if (chunk.startsWith(CLEAR_TERMINAL))
502
- return swallowTallFrame();
503
- consecutiveGuard = 0;
504
- guardTripped = false;
505
- const firstChunk = !seenAnyChunk;
506
- seenAnyChunk = true;
507
- const rows = liveRows();
508
- const lines = parseInkFrame(chunk);
509
- if (rows === undefined || rows < 2) {
510
- passThrough(lines);
511
- return null;
512
- }
513
- if (lines === null)
514
- return countFallback(!firstChunk);
515
- return assemble(giveWayAtTop(lines, rows), rows, liveCols(), 'frame');
516
- };
517
- const repaint = () => {
518
- repaintQueued = false;
519
- if (finalized || prevClippedFrame === null || prevRawFrame === null)
520
- return '';
521
- // `anchorDirty` is why a probe result arriving while the feed is idle lands at
522
- // all: without it, "re-pin after a resize" would write zero bytes (P0-2).
523
- if (o.drain.pending() === 0 && !anchorDirty)
524
- return '';
525
- const rows = liveRows();
526
- if (rows === undefined || rows < 2)
527
- return '';
528
- // The kept frame may predate a shrink, so a replay gets the same top give-way as a
529
- // live frame (W4): drawing it whole would overflow the new screen and push this
530
- // session's own rows into the scrollback through the repaint door.
531
- return assemble(giveWayAtTop(prevRawFrame, rows), rows, liveCols(), 'repaint');
532
- };
533
- const finalize = (summary) => {
534
- if (finalized)
535
- return '';
536
- finalized = true;
537
- const pending = clipStatics(o.drain.takeAll(), liveCols());
538
- // Unknown geometry after a foreign write: no safe erase, start on a fresh line.
539
- // Otherwise erase the whole CANVAS — the gap included, or its blank rows stay
540
- // behind as a dead band above the summary (I-B11).
541
- const eraseUp = prev === null && everWritten ? -1 : canvasRows;
542
- // ... and reprint what the erase removes. The content rows live INSIDE the canvas,
543
- // so erasing it without them would delete the user's last screenful of conversation
544
- // at exactly the moment they want to read it (the pre-canvas writer never had to:
545
- // its static rows were already outside the erasable block).
546
- const bytes = finalizeBytes({ eraseUp, statics: [...held, ...pending], summary });
547
- stats.staticRowsWritten += pending.length;
548
- stats.bytesWritten += bytes.length;
549
- return bytes;
550
- };
551
- o.drain.onEnqueue = scheduleRepaint;
552
- return {
553
- transform,
554
- repaint,
555
- finalize,
556
- invalidate: reset,
557
- onResize() {
558
- stats.resizes += 1;
559
- lastResizeAt = now();
560
- consecutiveGuard = 0;
561
- guardTripped = false;
562
- const rowsNow = liveRows();
563
- const colsNow = liveCols();
564
- // A column change re-flows what is already on screen: the cached rows no longer
565
- // describe it, and erasing by their height would cut a line in half (D5).
566
- if (colsNow !== undefined && lastWriteCols !== undefined && colsNow !== lastWriteCols) {
567
- reset();
568
- return;
569
- }
570
- if (rowsNow !== undefined && lastRows !== undefined) {
571
- if (rowsNow < lastRows) {
572
- // I-B17: the screen kept the rows nearest the cursor, so re-pin the canvas onto
573
- // them instead of dropping it. A reset made the next batch a seed over a screen
574
- // that is not empty, which is what left the old status row in the scrollback.
575
- repinShrunk(rowsNow);
576
- return;
577
- }
578
- if (anchor.kind === 'pinned') {
579
- const capacity = screenCapacity(rowsNow);
580
- const grown = Math.min(applyResizeGrowth(anchor.capacity, lastRows, rowsNow), capacity);
581
- anchor = { kind: 'pinned', top: Math.max(0, capacity - grown), capacity: grown };
582
- }
583
- lastRows = rowsNow;
584
- }
585
- // Coalesced and deferred by the host (P0-3); `anchorReprobes` is NOT bumped
586
- // here — a drag fires dozens of resize events for one probe (P1-5).
587
- requestProbe();
588
- },
589
- cursorNeutralWrite() {
590
- // OSC 52 and friends move no cell and no cursor (I-S11).
591
- },
592
- regionRows: () => Math.max(0, frameRows),
593
- scrollbackStats: () => ({ ...stats, elidedEntries: o.drain.elided() }),
594
- setAnchorSpaceBelow(spaceBelow, source) {
595
- if (finalized)
596
- return;
597
- const rows = liveRows();
598
- const capacity = screenCapacity(rows);
599
- // I-B17: a measurement can arrive after the terminal got shorter without ever
600
- // announcing it (`rows` is read live, the `resize` event is optional). The cache
601
- // must then stop describing rows the screen has already dropped, or the reach
602
- // below would hand the next batch an erase distance longer than the canvas left.
603
- if (rows !== undefined)
604
- trimCanvasCache(capacity);
605
- // I-B14: the report is "rows BELOW the cursor", and the canvas also still owns
606
- // `canvasRows` rows ABOVE it, so the reachable height is their sum. Keeping only
607
- // the first term collapses the canvas onto the parked row, and the next batch
608
- // then reads its own visible content as an overflow and scrolls it away twice.
609
- const reach = clampSpaceBelow(spaceBelow, rows) + canvasRows;
610
- // The cap bounds only a STARTING canvas: clipping a live one would make the
611
- // next erase reach above its own top (see SCROLLBACK_LIMITS.maxCanvasRows).
612
- const ceiling = canvasRows === 0
613
- ? Math.min(capacity, SCROLLBACK_LIMITS.maxCanvasRows)
614
- : capacity;
615
- const usable = Math.max(0, Math.min(reach, ceiling));
616
- anchor = { kind: 'pinned', top: Math.max(0, capacity - usable), capacity: usable };
617
- // A capped starting canvas begins BELOW the cursor row, so the batch that seeds
618
- // it has to descend first: `spaceBelow - capacity` rows. Zero whenever the cap
619
- // does not bind, and zero for every canvas that already exists.
620
- seedDownToTop = Math.max(0, clampSpaceBelow(spaceBelow, rows) - usable);
621
- // Only measurements AFTER the first are re-probes (P1-5): `/perf` promises a
622
- // re-probe count, not a measurement count, and the startup measurement is
623
- // reported through `anchorSource` instead.
624
- if (anchorSource !== 'none')
625
- anchorReprobes += 1;
626
- anchorSource = source;
627
- anchorDirty = true;
628
- publishAnchorStats();
629
- },
630
- anchorStats: () => ({
631
- state: anchor.kind === 'pinned' ? 'pinned' : 'unknown',
632
- source: anchorSource,
633
- canvasRows: anchor.kind === 'pinned' ? canvasRows : 0,
634
- heldRows: anchor.kind === 'pinned' ? held.length : 0,
635
- gapRows: anchor.kind === 'pinned' ? gapRows : 0,
636
- top: anchor.kind === 'pinned' ? anchor.top : 0,
637
- }),
638
- stats: () => ({
639
- framesTotal: stats.framesSeed + stats.framesFull + stats.framesDiff,
640
- framesDiffed: stats.framesDiff,
641
- framesFull: stats.framesSeed + stats.framesFull,
642
- linesWritten: stats.staticRowsWritten,
643
- bytesWritten: stats.bytesWritten,
644
- fallbacks: stats.fallbacks,
645
- repaints: stats.repaints,
646
- }),
647
- };
648
- }