@aragon-agent/cli 0.6.47 → 0.6.48

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (775) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +27 -6
  3. package/dist/agent/coalesce.d.ts +1 -1
  4. package/dist/agent/controller.d.ts +21 -21
  5. package/dist/agent/controller.js +13 -13
  6. package/dist/agent/conversation-reset.d.ts +1 -1
  7. package/dist/agent/governance-wiring.d.ts +6 -6
  8. package/dist/agent/governance-wiring.js +4 -4
  9. package/dist/agent/headless.d.ts +5 -5
  10. package/dist/agent/headless.js +4 -4
  11. package/dist/agent/job-notices.d.ts +1 -1
  12. package/dist/agent/job-notices.js +1 -1
  13. package/dist/agent/kit-apply.d.ts +3 -3
  14. package/dist/agent/kit-apply.js +3 -3
  15. package/dist/agent/model-profile-settings.d.ts +2 -2
  16. package/dist/agent/model-profile-settings.js +6 -6
  17. package/dist/agent/prompt-options.d.ts +1 -1
  18. package/dist/agent/system-prompt.d.ts +1 -1
  19. package/dist/{ui → app}/App.d.ts +9 -9
  20. package/dist/{ui → app}/App.js +79 -79
  21. package/dist/{ui → app}/use-startup-notices.d.ts +1 -1
  22. package/dist/{ui → app}/use-startup-notices.js +2 -2
  23. package/dist/cli.js +29 -29
  24. package/dist/commands/agents-command.js +1 -1
  25. package/dist/commands/builtins.js +9 -9
  26. package/dist/commands/governance-command.js +2 -2
  27. package/dist/commands/governance-runs-table.js +1 -1
  28. package/dist/commands/kit-command.js +1 -1
  29. package/dist/commands/perf.d.ts +3 -3
  30. package/dist/commands/perf.js +1 -1
  31. package/dist/commands/registry.d.ts +8 -8
  32. package/dist/commands/skills.js +2 -2
  33. package/dist/commands/team-command.js +1 -1
  34. package/dist/compaction/archive.d.ts +1 -1
  35. package/dist/compaction/archive.js +1 -1
  36. package/dist/compaction/child.d.ts +3 -3
  37. package/dist/compaction/child.js +4 -4
  38. package/dist/compaction/command.js +5 -5
  39. package/dist/compaction/compactor.d.ts +6 -6
  40. package/dist/compaction/compactor.js +6 -6
  41. package/dist/compaction/context-command.js +1 -1
  42. package/dist/compaction/digest.js +1 -1
  43. package/dist/compaction/memory-input.js +1 -1
  44. package/dist/compaction/memory-validation.js +1 -1
  45. package/dist/compaction/memory.js +1 -1
  46. package/dist/compaction/summarize-call.js +1 -1
  47. package/dist/compaction/summary-prompt.js +1 -1
  48. package/dist/compaction/tail-budget.js +2 -2
  49. package/dist/compaction/wiring.d.ts +5 -5
  50. package/dist/compaction/wiring.js +2 -2
  51. package/dist/config/cli-commands.d.ts +1 -1
  52. package/dist/config/cli-commands.js +3 -3
  53. package/dist/config/env.d.ts +1 -1
  54. package/dist/config/env.js +4 -4
  55. package/dist/config/load.d.ts +2 -2
  56. package/dist/config/load.js +6 -6
  57. package/dist/config/migrate-state-out-of-config.js +1 -1
  58. package/dist/config/model-profile-store.d.ts +4 -54
  59. package/dist/config/model-profile-store.js +3 -3
  60. package/dist/config/prompt-history.js +1 -1
  61. package/dist/config/store.d.ts +2 -2
  62. package/dist/config/store.js +3 -3
  63. package/dist/diagnostics/doctor.js +4 -4
  64. package/dist/exec/bridge/decisions.d.ts +1 -1
  65. package/dist/exec/bridge/human-answers.d.ts +1 -1
  66. package/dist/exec/bridge/human-answers.js +1 -1
  67. package/dist/exec/bridge/protocol.d.ts +1 -1
  68. package/dist/exec/bridge/server.js +1 -1
  69. package/dist/exec/events.d.ts +2 -2
  70. package/dist/exec/index.d.ts +1 -1
  71. package/dist/exec/index.js +1 -1
  72. package/dist/exec/permission.js +1 -1
  73. package/dist/exec/runner.d.ts +3 -3
  74. package/dist/exec/runner.js +2 -2
  75. package/dist/exec/threads/runtime.js +1 -1
  76. package/dist/fast/digest.d.ts +1 -1
  77. package/dist/fast/digest.js +1 -1
  78. package/dist/fast/frames.d.ts +1 -1
  79. package/dist/fast/frames.js +1 -1
  80. package/dist/fast/prompt.d.ts +1 -1
  81. package/dist/fast/prompt.js +1 -1
  82. package/dist/fast/review-call.js +1 -1
  83. package/dist/fast/reviewer.d.ts +3 -3
  84. package/dist/fast/reviewer.js +1 -1
  85. package/dist/fast/summary-call.d.ts +3 -3
  86. package/dist/fast/summary-call.js +2 -2
  87. package/dist/fast/summary-prompt.d.ts +1 -1
  88. package/dist/fast/summary-prompt.js +1 -1
  89. package/dist/fast/wiring.d.ts +4 -4
  90. package/dist/fast/wiring.js +1 -1
  91. package/dist/governance/card-normalize.d.ts +1 -1
  92. package/dist/governance/copy.d.ts +1 -1
  93. package/dist/governance/copy.js +2 -2
  94. package/dist/governance/engine/artifact-persist.d.ts +1 -1
  95. package/dist/governance/engine/budget.d.ts +1 -1
  96. package/dist/governance/engine/budget.js +1 -1
  97. package/dist/governance/engine/cards.d.ts +1 -1
  98. package/dist/governance/engine/digest.js +1 -1
  99. package/dist/governance/engine/engine-core.d.ts +5 -5
  100. package/dist/governance/engine/engine-core.js +1 -1
  101. package/dist/governance/engine/engine.d.ts +1 -1
  102. package/dist/governance/engine/engine.js +1 -1
  103. package/dist/governance/engine/estimate.d.ts +1 -1
  104. package/dist/governance/engine/estimate.js +1 -1
  105. package/dist/governance/engine/inspector.js +2 -2
  106. package/dist/governance/engine/integration.d.ts +1 -1
  107. package/dist/governance/engine/lifecycle.d.ts +1 -1
  108. package/dist/governance/engine/lifecycle.js +1 -1
  109. package/dist/governance/engine/phase-members.d.ts +1 -1
  110. package/dist/governance/engine/phase-planner.d.ts +1 -1
  111. package/dist/governance/engine/phase-planner.js +1 -1
  112. package/dist/governance/engine/rebuild.d.ts +1 -1
  113. package/dist/governance/engine/report.d.ts +1 -1
  114. package/dist/governance/engine/report.js +1 -1
  115. package/dist/governance/engine/run-digest.d.ts +1 -1
  116. package/dist/governance/engine/spec-builder.d.ts +2 -2
  117. package/dist/governance/engine/spec-builder.js +2 -2
  118. package/dist/governance/engine/stage-runner.js +2 -2
  119. package/dist/governance/engine/start-input.d.ts +1 -1
  120. package/dist/governance/engine/start-input.js +1 -1
  121. package/dist/governance/engine/state-machine.d.ts +1 -1
  122. package/dist/governance/engine/state-machine.js +3 -3
  123. package/dist/governance/engine/submission-queries.d.ts +1 -1
  124. package/dist/governance/engine/submission-render.d.ts +1 -1
  125. package/dist/governance/engine/submissions.d.ts +1 -1
  126. package/dist/governance/engine/submissions.js +1 -1
  127. package/dist/governance/engine/visibility.d.ts +1 -1
  128. package/dist/governance/engine/visibility.js +1 -1
  129. package/dist/governance/posture-transition.d.ts +2 -2
  130. package/dist/governance/posture-transition.js +1 -1
  131. package/dist/governance/profiles.d.ts +1 -1
  132. package/dist/governance/prompts/orchestrator-block.d.ts +2 -2
  133. package/dist/governance/prompts/orchestrator-block.js +2 -2
  134. package/dist/governance/prompts/plan-addendum.d.ts +1 -1
  135. package/dist/governance/prompts/plan-addendum.js +1 -1
  136. package/dist/governance/prompts/role-blocks.d.ts +2 -2
  137. package/dist/governance/prompts/role-blocks.js +1 -1
  138. package/dist/governance/report-reader.js +1 -1
  139. package/dist/governance/roles.d.ts +1 -1
  140. package/dist/governance/rules/claims.d.ts +1 -1
  141. package/dist/governance/rules/claims.js +1 -1
  142. package/dist/governance/rules/elimination.d.ts +1 -1
  143. package/dist/governance/rules/elimination.js +1 -1
  144. package/dist/governance/rules/failure-analysis.d.ts +2 -2
  145. package/dist/governance/rules/failure-analysis.js +1 -1
  146. package/dist/governance/rules/ledger-replay.d.ts +1 -1
  147. package/dist/governance/rules/ledger-state.d.ts +1 -1
  148. package/dist/governance/rules/ledger-state.js +1 -1
  149. package/dist/governance/rules/ledger.d.ts +2 -2
  150. package/dist/governance/rules/ledger.js +2 -2
  151. package/dist/governance/rules/rca.d.ts +1 -1
  152. package/dist/governance/rules/rca.js +1 -1
  153. package/dist/governance/rules/settlement.d.ts +2 -2
  154. package/dist/governance/rules/settlement.js +2 -2
  155. package/dist/governance/rules/suspicion.d.ts +1 -1
  156. package/dist/governance/store/artifacts.d.ts +1 -1
  157. package/dist/governance/store/artifacts.js +1 -1
  158. package/dist/governance/store/events-log.d.ts +1 -1
  159. package/dist/governance/store/run-store.d.ts +1 -1
  160. package/dist/governance/store/run-store.js +1 -1
  161. package/dist/governance/store/scoreboard-export.d.ts +1 -1
  162. package/dist/governance/tools/child-tools.d.ts +1 -1
  163. package/dist/governance/tools/guard.d.ts +1 -1
  164. package/dist/governance/tools/guard.js +1 -1
  165. package/dist/governance/tools/inspector-tools.d.ts +2 -2
  166. package/dist/governance/tools/inspector-tools.js +2 -2
  167. package/dist/governance/tools/lead-tools.d.ts +1 -1
  168. package/dist/governance/tools/lead-tools.js +1 -1
  169. package/dist/governance/tools/normalize-util.js +1 -1
  170. package/dist/governance/tools/scan-incomplete.js +1 -1
  171. package/dist/governance/tools/shared-tools.d.ts +1 -1
  172. package/dist/governance/tools/shared-tools.js +1 -1
  173. package/dist/governance/tools/submit-normalizers.d.ts +1 -1
  174. package/dist/governance/tools/submit-normalizers.js +1 -1
  175. package/dist/governance/tools/submit-tools.d.ts +1 -1
  176. package/dist/logging/cli-commands.js +1 -1
  177. package/dist/logging/install.d.ts +1 -1
  178. package/dist/logging/install.js +3 -3
  179. package/dist/logging/logger.d.ts +2 -2
  180. package/dist/logging/logger.js +31 -2
  181. package/dist/proc/kill-tree.js +1 -1
  182. package/dist/proc/log-mirror.js +1 -1
  183. package/dist/proc/log-ring.js +2 -2
  184. package/dist/proc/notices.d.ts +1 -1
  185. package/dist/proc/notices.js +2 -2
  186. package/dist/proc/prompt.d.ts +1 -1
  187. package/dist/proc/prompt.js +1 -1
  188. package/dist/proc/readiness.js +1 -1
  189. package/dist/proc/supervisor.d.ts +1 -1
  190. package/dist/proc/supervisor.js +3 -3
  191. package/dist/proc/wait.d.ts +1 -1
  192. package/dist/proc/wait.js +1 -1
  193. package/dist/prompts/command.d.ts +1 -1
  194. package/dist/prompts/command.js +1 -1
  195. package/dist/prompts/normalize.d.ts +1 -1
  196. package/dist/prompts/normalize.js +1 -1
  197. package/dist/prompts/resolve.d.ts +1 -1
  198. package/dist/prompts/store.d.ts +2 -12
  199. package/dist/prompts/store.js +6 -60
  200. package/dist/session/checkpoint.d.ts +2 -2
  201. package/dist/session/clear-archive.d.ts +2 -2
  202. package/dist/session/persist.d.ts +2 -2
  203. package/dist/session/persist.js +1 -1
  204. package/dist/session/startup-session.d.ts +2 -2
  205. package/dist/session/validate-session.js +3 -3
  206. package/dist/skills/service.d.ts +2 -2
  207. package/dist/team/bus.d.ts +1 -1
  208. package/dist/team/bus.js +1 -1
  209. package/dist/team/child-reviewer.d.ts +2 -2
  210. package/dist/team/child-reviewer.js +1 -1
  211. package/dist/team/comm-tools.js +1 -1
  212. package/dist/team/dispatch-gate.js +1 -1
  213. package/dist/team/forced-dispatch.js +1 -1
  214. package/dist/team/forced-mode.d.ts +1 -1
  215. package/dist/team/forced-prompt.d.ts +1 -1
  216. package/dist/team/forced-prompt.js +1 -1
  217. package/dist/team/normalize.d.ts +1 -1
  218. package/dist/team/normalize.js +1 -1
  219. package/dist/team/overseer.d.ts +3 -3
  220. package/dist/team/overseer.js +3 -3
  221. package/dist/team/prompt.d.ts +1 -1
  222. package/dist/team/prompt.js +1 -1
  223. package/dist/team/report.d.ts +2 -2
  224. package/dist/team/report.js +2 -2
  225. package/dist/team/retry.d.ts +1 -1
  226. package/dist/team/retry.js +1 -1
  227. package/dist/team/runtime.d.ts +4 -4
  228. package/dist/team/runtime.js +2 -2
  229. package/dist/team/settled.d.ts +2 -2
  230. package/dist/team/subagent.d.ts +4 -4
  231. package/dist/team/subagent.js +5 -5
  232. package/dist/team/task-tool.d.ts +1 -1
  233. package/dist/team/task-tool.js +1 -1
  234. package/dist/todo/normalize.d.ts +1 -1
  235. package/dist/todo/normalize.js +1 -1
  236. package/dist/todo/prompt.d.ts +1 -1
  237. package/dist/todo/prompt.js +1 -1
  238. package/dist/todo/store.d.ts +1 -1
  239. package/dist/todo/store.js +2 -2
  240. package/dist/todo/todo-tool.d.ts +1 -1
  241. package/dist/todo/todo-tool.js +2 -2
  242. package/dist/tools/bash-tool.d.ts +1 -1
  243. package/dist/tools/bash-tool.js +2 -2
  244. package/dist/tools/diff.d.ts +1 -1
  245. package/dist/tools/diff.js +1 -1
  246. package/dist/tools/file-change-store.d.ts +1 -1
  247. package/dist/tools/fs-tools.d.ts +2 -2
  248. package/dist/tools/fs-tools.js +1 -1
  249. package/dist/tools/index.d.ts +3 -3
  250. package/dist/tools/index.js +1 -1
  251. package/dist/tools/job-tools.d.ts +2 -2
  252. package/dist/tools/job-tools.js +4 -4
  253. package/dist/tools/plan-tools.d.ts +1 -1
  254. package/dist/tools/plan-tools.js +1 -1
  255. package/dist/tools/proc-tools.d.ts +1 -1
  256. package/dist/tools/proc-tools.js +2 -2
  257. package/dist/update/classify-failure.d.ts +1 -1
  258. package/dist/update/install-lock.js +1 -1
  259. package/dist/update/install-source.d.ts +1 -1
  260. package/dist/update/installer.js +2 -2
  261. package/dist/update/npm-view.d.ts +1 -1
  262. package/dist/update/npm-view.js +1 -1
  263. package/dist/update/registry.d.ts +1 -1
  264. package/dist/update/registry.js +1 -1
  265. package/dist/update/service.d.ts +2 -2
  266. package/dist/update/service.js +2 -2
  267. package/package.json +7 -7
  268. package/dist/agent/agent-mode.d.ts +0 -108
  269. package/dist/agent/agent-mode.js +0 -121
  270. package/dist/agent/entry-limits.d.ts +0 -65
  271. package/dist/agent/entry-limits.js +0 -133
  272. package/dist/agent/governance-view.d.ts +0 -40
  273. package/dist/agent/governance-view.js +0 -40
  274. package/dist/agent/invocation-card.d.ts +0 -77
  275. package/dist/agent/invocation-card.js +0 -169
  276. package/dist/agent/model-probe-limits.d.ts +0 -39
  277. package/dist/agent/model-probe-limits.js +0 -25
  278. package/dist/agent/model-probe.d.ts +0 -104
  279. package/dist/agent/model-probe.js +0 -391
  280. package/dist/agent/queued-messages.d.ts +0 -23
  281. package/dist/agent/queued-messages.js +0 -49
  282. package/dist/agent/reducer.d.ts +0 -857
  283. package/dist/agent/reducer.js +0 -1646
  284. package/dist/agent/retry-view.d.ts +0 -68
  285. package/dist/agent/retry-view.js +0 -95
  286. package/dist/agent/usage.d.ts +0 -47
  287. package/dist/agent/usage.js +0 -84
  288. package/dist/compaction/limits.d.ts +0 -61
  289. package/dist/compaction/limits.js +0 -64
  290. package/dist/compaction/meter.d.ts +0 -276
  291. package/dist/compaction/meter.js +0 -512
  292. package/dist/compaction/pressure.d.ts +0 -163
  293. package/dist/compaction/pressure.js +0 -199
  294. package/dist/compaction/reason-text.d.ts +0 -36
  295. package/dist/compaction/reason-text.js +0 -78
  296. package/dist/compaction/types.d.ts +0 -360
  297. package/dist/compaction/types.js +0 -22
  298. package/dist/config/governance-config.d.ts +0 -125
  299. package/dist/config/governance-config.js +0 -164
  300. package/dist/config/kit-resolution.d.ts +0 -93
  301. package/dist/config/kit-resolution.js +0 -226
  302. package/dist/config/model-kits.d.ts +0 -225
  303. package/dist/config/model-kits.js +0 -302
  304. package/dist/config/model-profile-resolution.d.ts +0 -28
  305. package/dist/config/model-profile-resolution.js +0 -88
  306. package/dist/config/model-profiles.d.ts +0 -103
  307. package/dist/config/model-profiles.js +0 -188
  308. package/dist/config/schema.d.ts +0 -1645
  309. package/dist/config/schema.js +0 -1383
  310. package/dist/fast/limits.d.ts +0 -152
  311. package/dist/fast/limits.js +0 -152
  312. package/dist/fast/resolve.d.ts +0 -44
  313. package/dist/fast/resolve.js +0 -107
  314. package/dist/fast/task-summary-types.d.ts +0 -66
  315. package/dist/fast/task-summary-types.js +0 -17
  316. package/dist/fast/types.d.ts +0 -141
  317. package/dist/fast/types.js +0 -14
  318. package/dist/governance/governed-dispatch.d.ts +0 -19
  319. package/dist/governance/governed-dispatch.js +0 -17
  320. package/dist/governance/limits.d.ts +0 -107
  321. package/dist/governance/limits.js +0 -131
  322. package/dist/governance/posture.d.ts +0 -35
  323. package/dist/governance/posture.js +0 -59
  324. package/dist/governance/rules/events-table.d.ts +0 -46
  325. package/dist/governance/rules/events-table.js +0 -94
  326. package/dist/governance/types.d.ts +0 -661
  327. package/dist/governance/types.js +0 -27
  328. package/dist/input/control-sequences.d.ts +0 -71
  329. package/dist/input/control-sequences.js +0 -222
  330. package/dist/input/csiu-keys.d.ts +0 -66
  331. package/dist/input/csiu-keys.js +0 -181
  332. package/dist/input/cursor-report.d.ts +0 -61
  333. package/dist/input/cursor-report.js +0 -97
  334. package/dist/input/enter-sequences.d.ts +0 -64
  335. package/dist/input/enter-sequences.js +0 -153
  336. package/dist/input/interrupt-gesture.d.ts +0 -18
  337. package/dist/input/interrupt-gesture.js +0 -19
  338. package/dist/input/keyboard-enhancement.d.ts +0 -42
  339. package/dist/input/keyboard-enhancement.js +0 -65
  340. package/dist/input/keymap.d.ts +0 -20
  341. package/dist/input/keymap.js +0 -99
  342. package/dist/input/limits.d.ts +0 -118
  343. package/dist/input/limits.js +0 -109
  344. package/dist/input/mouse-events.d.ts +0 -87
  345. package/dist/input/mouse-events.js +0 -212
  346. package/dist/input/paste-parse.d.ts +0 -83
  347. package/dist/input/paste-parse.js +0 -107
  348. package/dist/input/pointer-router.d.ts +0 -11
  349. package/dist/input/pointer-router.js +0 -14
  350. package/dist/input/stdin-filter.d.ts +0 -112
  351. package/dist/input/stdin-filter.js +0 -657
  352. package/dist/input/win32-input-mode.d.ts +0 -61
  353. package/dist/input/win32-input-mode.js +0 -269
  354. package/dist/logging/levels.d.ts +0 -40
  355. package/dist/logging/levels.js +0 -59
  356. package/dist/logging/secret-registry.d.ts +0 -32
  357. package/dist/logging/secret-registry.js +0 -73
  358. package/dist/proc/limits.d.ts +0 -214
  359. package/dist/proc/limits.js +0 -221
  360. package/dist/proc/progress.d.ts +0 -47
  361. package/dist/proc/progress.js +0 -163
  362. package/dist/proc/types.d.ts +0 -269
  363. package/dist/proc/types.js +0 -15
  364. package/dist/proc/wait-view.d.ts +0 -65
  365. package/dist/proc/wait-view.js +0 -66
  366. package/dist/prompts/copy.d.ts +0 -89
  367. package/dist/prompts/copy.js +0 -131
  368. package/dist/prompts/fill.d.ts +0 -51
  369. package/dist/prompts/fill.js +0 -46
  370. package/dist/prompts/limits.d.ts +0 -53
  371. package/dist/prompts/limits.js +0 -53
  372. package/dist/prompts/search.d.ts +0 -58
  373. package/dist/prompts/search.js +0 -146
  374. package/dist/prompts/types.d.ts +0 -204
  375. package/dist/prompts/types.js +0 -13
  376. package/dist/team/activity.d.ts +0 -67
  377. package/dist/team/activity.js +0 -130
  378. package/dist/team/limits.d.ts +0 -308
  379. package/dist/team/limits.js +0 -330
  380. package/dist/team/model.d.ts +0 -104
  381. package/dist/team/model.js +0 -150
  382. package/dist/team/panel-rows.d.ts +0 -48
  383. package/dist/team/panel-rows.js +0 -75
  384. package/dist/team/timeline.d.ts +0 -74
  385. package/dist/team/timeline.js +0 -101
  386. package/dist/team/types.d.ts +0 -354
  387. package/dist/team/types.js +0 -13
  388. package/dist/todo/acceptance.d.ts +0 -120
  389. package/dist/todo/acceptance.js +0 -399
  390. package/dist/todo/follow-through.d.ts +0 -138
  391. package/dist/todo/follow-through.js +0 -248
  392. package/dist/todo/limits.d.ts +0 -152
  393. package/dist/todo/limits.js +0 -152
  394. package/dist/todo/panel-rows.d.ts +0 -45
  395. package/dist/todo/panel-rows.js +0 -70
  396. package/dist/todo/plan-sections.d.ts +0 -60
  397. package/dist/todo/plan-sections.js +0 -108
  398. package/dist/todo/row-window.d.ts +0 -51
  399. package/dist/todo/row-window.js +0 -107
  400. package/dist/todo/types.d.ts +0 -124
  401. package/dist/todo/types.js +0 -12
  402. package/dist/tools/human-input.d.ts +0 -212
  403. package/dist/tools/human-input.js +0 -265
  404. package/dist/tools/patch.d.ts +0 -115
  405. package/dist/tools/patch.js +0 -453
  406. package/dist/tools/terminal-output.d.ts +0 -115
  407. package/dist/tools/terminal-output.js +0 -201
  408. package/dist/tools/tool-output-store.d.ts +0 -68
  409. package/dist/tools/tool-output-store.js +0 -102
  410. package/dist/ui/ActivityLine.d.ts +0 -26
  411. package/dist/ui/ActivityLine.js +0 -51
  412. package/dist/ui/AutocompletePopup.d.ts +0 -23
  413. package/dist/ui/AutocompletePopup.js +0 -17
  414. package/dist/ui/BottomStatusRow.d.ts +0 -10
  415. package/dist/ui/BottomStatusRow.js +0 -9
  416. package/dist/ui/Composer.d.ts +0 -115
  417. package/dist/ui/Composer.js +0 -64
  418. package/dist/ui/GovernancePanel.d.ts +0 -50
  419. package/dist/ui/GovernancePanel.js +0 -77
  420. package/dist/ui/GovernanceRun.d.ts +0 -18
  421. package/dist/ui/GovernanceRun.js +0 -11
  422. package/dist/ui/Header.d.ts +0 -48
  423. package/dist/ui/Header.js +0 -27
  424. package/dist/ui/Logo.d.ts +0 -32
  425. package/dist/ui/Logo.js +0 -65
  426. package/dist/ui/Markdown.d.ts +0 -29
  427. package/dist/ui/Markdown.js +0 -116
  428. package/dist/ui/PromptCaret.d.ts +0 -11
  429. package/dist/ui/PromptCaret.js +0 -31
  430. package/dist/ui/PromptInput.d.ts +0 -192
  431. package/dist/ui/PromptInput.js +0 -689
  432. package/dist/ui/QueuePanel.d.ts +0 -8
  433. package/dist/ui/QueuePanel.js +0 -9
  434. package/dist/ui/QueueStatusRow.d.ts +0 -24
  435. package/dist/ui/QueueStatusRow.js +0 -51
  436. package/dist/ui/ScrollbackShell.d.ts +0 -132
  437. package/dist/ui/ScrollbackShell.js +0 -26
  438. package/dist/ui/SessionOpener.d.ts +0 -30
  439. package/dist/ui/SessionOpener.js +0 -12
  440. package/dist/ui/StatusBar.d.ts +0 -130
  441. package/dist/ui/StatusBar.js +0 -61
  442. package/dist/ui/TeamPanel.d.ts +0 -76
  443. package/dist/ui/TeamPanel.js +0 -103
  444. package/dist/ui/ToastStack.d.ts +0 -8
  445. package/dist/ui/ToastStack.js +0 -31
  446. package/dist/ui/TodoPanel.d.ts +0 -52
  447. package/dist/ui/TodoPanel.js +0 -214
  448. package/dist/ui/Transcript.d.ts +0 -105
  449. package/dist/ui/Transcript.js +0 -258
  450. package/dist/ui/UpdateLine.d.ts +0 -44
  451. package/dist/ui/UpdateLine.js +0 -129
  452. package/dist/ui/activity-phrases.d.ts +0 -33
  453. package/dist/ui/activity-phrases.js +0 -50
  454. package/dist/ui/capabilities.d.ts +0 -27
  455. package/dist/ui/capabilities.js +0 -65
  456. package/dist/ui/clipboard-task.d.ts +0 -29
  457. package/dist/ui/clipboard-task.js +0 -66
  458. package/dist/ui/clipboard.d.ts +0 -31
  459. package/dist/ui/clipboard.js +0 -157
  460. package/dist/ui/color-runtime.d.ts +0 -5
  461. package/dist/ui/color-runtime.js +0 -29
  462. package/dist/ui/composer-input.d.ts +0 -38
  463. package/dist/ui/composer-input.js +0 -79
  464. package/dist/ui/composer-limits.d.ts +0 -30
  465. package/dist/ui/composer-limits.js +0 -45
  466. package/dist/ui/composer-rows.d.ts +0 -73
  467. package/dist/ui/composer-rows.js +0 -129
  468. package/dist/ui/console-bridge.d.ts +0 -19
  469. package/dist/ui/console-bridge.js +0 -52
  470. package/dist/ui/density.d.ts +0 -26
  471. package/dist/ui/density.js +0 -34
  472. package/dist/ui/display-tab.d.ts +0 -51
  473. package/dist/ui/display-tab.js +0 -82
  474. package/dist/ui/editor-navigation.d.ts +0 -55
  475. package/dist/ui/editor-navigation.js +0 -96
  476. package/dist/ui/editor-reducer.d.ts +0 -108
  477. package/dist/ui/editor-reducer.js +0 -187
  478. package/dist/ui/enter-frames.d.ts +0 -47
  479. package/dist/ui/enter-frames.js +0 -117
  480. package/dist/ui/entries/AssistantEntry.d.ts +0 -37
  481. package/dist/ui/entries/AssistantEntry.js +0 -43
  482. package/dist/ui/entries/CompactionCard.d.ts +0 -88
  483. package/dist/ui/entries/CompactionCard.js +0 -222
  484. package/dist/ui/entries/DiffView.d.ts +0 -61
  485. package/dist/ui/entries/DiffView.js +0 -103
  486. package/dist/ui/entries/EntryFrame.d.ts +0 -23
  487. package/dist/ui/entries/EntryFrame.js +0 -6
  488. package/dist/ui/entries/FastCard.d.ts +0 -53
  489. package/dist/ui/entries/FastCard.js +0 -105
  490. package/dist/ui/entries/GovernanceCard.d.ts +0 -30
  491. package/dist/ui/entries/GovernanceCard.js +0 -32
  492. package/dist/ui/entries/InvocationCard.d.ts +0 -20
  493. package/dist/ui/entries/InvocationCard.js +0 -32
  494. package/dist/ui/entries/QueuedEntry.d.ts +0 -27
  495. package/dist/ui/entries/QueuedEntry.js +0 -33
  496. package/dist/ui/entries/RetryCard.d.ts +0 -56
  497. package/dist/ui/entries/RetryCard.js +0 -60
  498. package/dist/ui/entries/ServiceCard.d.ts +0 -82
  499. package/dist/ui/entries/ServiceCard.js +0 -151
  500. package/dist/ui/entries/TeamCard.d.ts +0 -55
  501. package/dist/ui/entries/TeamCard.js +0 -94
  502. package/dist/ui/entries/TodoCard.d.ts +0 -54
  503. package/dist/ui/entries/TodoCard.js +0 -98
  504. package/dist/ui/entries/ToolCard.d.ts +0 -81
  505. package/dist/ui/entries/ToolCard.js +0 -169
  506. package/dist/ui/entries/ToolPreview.d.ts +0 -59
  507. package/dist/ui/entries/ToolPreview.js +0 -208
  508. package/dist/ui/entries/UserEntry.d.ts +0 -36
  509. package/dist/ui/entries/UserEntry.js +0 -57
  510. package/dist/ui/entries/WaitCard.d.ts +0 -37
  511. package/dist/ui/entries/WaitCard.js +0 -92
  512. package/dist/ui/exit-snapshot.d.ts +0 -43
  513. package/dist/ui/exit-snapshot.js +0 -26
  514. package/dist/ui/frame-differ.d.ts +0 -166
  515. package/dist/ui/frame-differ.js +0 -354
  516. package/dist/ui/frame-observer.d.ts +0 -17
  517. package/dist/ui/frame-observer.js +0 -94
  518. package/dist/ui/frame-parser.d.ts +0 -7
  519. package/dist/ui/frame-parser.js +0 -18
  520. package/dist/ui/gauge.d.ts +0 -39
  521. package/dist/ui/gauge.js +0 -55
  522. package/dist/ui/glyphs.d.ts +0 -178
  523. package/dist/ui/glyphs.js +0 -165
  524. package/dist/ui/governance-copy.d.ts +0 -69
  525. package/dist/ui/governance-copy.js +0 -104
  526. package/dist/ui/governance-status.d.ts +0 -145
  527. package/dist/ui/governance-status.js +0 -326
  528. package/dist/ui/gradient.d.ts +0 -11
  529. package/dist/ui/gradient.js +0 -50
  530. package/dist/ui/ink-runtime.d.ts +0 -4
  531. package/dist/ui/ink-runtime.js +0 -51
  532. package/dist/ui/interaction-copy.d.ts +0 -84
  533. package/dist/ui/interaction-copy.js +0 -41
  534. package/dist/ui/interaction-hints.d.ts +0 -44
  535. package/dist/ui/interaction-hints.js +0 -97
  536. package/dist/ui/layout/AppShell.d.ts +0 -17
  537. package/dist/ui/layout/AppShell.js +0 -6
  538. package/dist/ui/layout/Gutter.d.ts +0 -67
  539. package/dist/ui/layout/Gutter.js +0 -42
  540. package/dist/ui/layout/MeasuredEntry.d.ts +0 -21
  541. package/dist/ui/layout/MeasuredEntry.js +0 -30
  542. package/dist/ui/layout/OverlayFrame.d.ts +0 -73
  543. package/dist/ui/layout/OverlayFrame.js +0 -110
  544. package/dist/ui/layout/ScrollIndicator.d.ts +0 -32
  545. package/dist/ui/layout/ScrollIndicator.js +0 -22
  546. package/dist/ui/layout/ScrollViewport.d.ts +0 -40
  547. package/dist/ui/layout/ScrollViewport.js +0 -222
  548. package/dist/ui/layout/agents-board.d.ts +0 -102
  549. package/dist/ui/layout/agents-board.js +0 -389
  550. package/dist/ui/layout/autocomplete.d.ts +0 -18
  551. package/dist/ui/layout/autocomplete.js +0 -26
  552. package/dist/ui/layout/budget.d.ts +0 -43
  553. package/dist/ui/layout/budget.js +0 -52
  554. package/dist/ui/layout/cells.d.ts +0 -61
  555. package/dist/ui/layout/cells.js +0 -156
  556. package/dist/ui/layout/document-layout.d.ts +0 -13
  557. package/dist/ui/layout/document-layout.js +0 -10
  558. package/dist/ui/layout/follow-state.d.ts +0 -138
  559. package/dist/ui/layout/follow-state.js +0 -148
  560. package/dist/ui/layout/frame.d.ts +0 -36
  561. package/dist/ui/layout/frame.js +0 -39
  562. package/dist/ui/layout/governance-board.d.ts +0 -121
  563. package/dist/ui/layout/governance-board.js +0 -382
  564. package/dist/ui/layout/governance-card.d.ts +0 -53
  565. package/dist/ui/layout/governance-card.js +0 -134
  566. package/dist/ui/layout/governance-chip.d.ts +0 -38
  567. package/dist/ui/layout/governance-chip.js +0 -64
  568. package/dist/ui/layout/governance-panel.d.ts +0 -85
  569. package/dist/ui/layout/governance-panel.js +0 -358
  570. package/dist/ui/layout/governance-roster.d.ts +0 -65
  571. package/dist/ui/layout/governance-roster.js +0 -275
  572. package/dist/ui/layout/header-hints.d.ts +0 -90
  573. package/dist/ui/layout/header-hints.js +0 -110
  574. package/dist/ui/layout/header-left.d.ts +0 -115
  575. package/dist/ui/layout/header-left.js +0 -206
  576. package/dist/ui/layout/invocation-card.d.ts +0 -41
  577. package/dist/ui/layout/invocation-card.js +0 -91
  578. package/dist/ui/layout/kit-chip.d.ts +0 -50
  579. package/dist/ui/layout/kit-chip.js +0 -81
  580. package/dist/ui/layout/overlay-window.d.ts +0 -43
  581. package/dist/ui/layout/overlay-window.js +0 -51
  582. package/dist/ui/layout/queue-layout.d.ts +0 -19
  583. package/dist/ui/layout/queue-layout.js +0 -26
  584. package/dist/ui/layout/rail.d.ts +0 -7
  585. package/dist/ui/layout/rail.js +0 -16
  586. package/dist/ui/layout/scroll-indicator.d.ts +0 -27
  587. package/dist/ui/layout/scroll-indicator.js +0 -36
  588. package/dist/ui/layout/scroll.d.ts +0 -37
  589. package/dist/ui/layout/scroll.js +0 -99
  590. package/dist/ui/layout/scrollbar-geometry.d.ts +0 -17
  591. package/dist/ui/layout/scrollbar-geometry.js +0 -13
  592. package/dist/ui/layout/session-chip.d.ts +0 -52
  593. package/dist/ui/layout/session-chip.js +0 -64
  594. package/dist/ui/layout/shortcut-panel-layout.d.ts +0 -191
  595. package/dist/ui/layout/shortcut-panel-layout.js +0 -321
  596. package/dist/ui/layout/status-detail-layout.d.ts +0 -9
  597. package/dist/ui/layout/status-detail-layout.js +0 -79
  598. package/dist/ui/layout/status-layout.d.ts +0 -140
  599. package/dist/ui/layout/status-layout.js +0 -262
  600. package/dist/ui/layout/task-summary-cell.d.ts +0 -61
  601. package/dist/ui/layout/task-summary-cell.js +0 -65
  602. package/dist/ui/layout/team-panel.d.ts +0 -18
  603. package/dist/ui/layout/team-panel.js +0 -25
  604. package/dist/ui/layout/team-row.d.ts +0 -139
  605. package/dist/ui/layout/team-row.js +0 -246
  606. package/dist/ui/layout/todo-layout.d.ts +0 -62
  607. package/dist/ui/layout/todo-layout.js +0 -102
  608. package/dist/ui/layout/useTerminalSize.d.ts +0 -13
  609. package/dist/ui/layout/useTerminalSize.js +0 -50
  610. package/dist/ui/layout/viewport-geometry.d.ts +0 -29
  611. package/dist/ui/layout/viewport-geometry.js +0 -28
  612. package/dist/ui/layout/virtual-window.d.ts +0 -112
  613. package/dist/ui/layout/virtual-window.js +0 -494
  614. package/dist/ui/layout/wait-bar.d.ts +0 -34
  615. package/dist/ui/layout/wait-bar.js +0 -48
  616. package/dist/ui/layout/wrap-rows.d.ts +0 -26
  617. package/dist/ui/layout/wrap-rows.js +0 -88
  618. package/dist/ui/live-clamp.d.ts +0 -14
  619. package/dist/ui/live-clamp.js +0 -46
  620. package/dist/ui/markdown-blocks.d.ts +0 -107
  621. package/dist/ui/markdown-blocks.js +0 -240
  622. package/dist/ui/overlays/AgentsBoardOverlay.d.ts +0 -57
  623. package/dist/ui/overlays/AgentsBoardOverlay.js +0 -183
  624. package/dist/ui/overlays/ConfirmDialog.d.ts +0 -31
  625. package/dist/ui/overlays/ConfirmDialog.js +0 -44
  626. package/dist/ui/overlays/GovernanceBoardOverlay.d.ts +0 -41
  627. package/dist/ui/overlays/GovernanceBoardOverlay.js +0 -76
  628. package/dist/ui/overlays/GovernanceSettingsPage.d.ts +0 -48
  629. package/dist/ui/overlays/GovernanceSettingsPage.js +0 -93
  630. package/dist/ui/overlays/HelpOverlay.d.ts +0 -29
  631. package/dist/ui/overlays/HelpOverlay.js +0 -232
  632. package/dist/ui/overlays/KitEditor.d.ts +0 -23
  633. package/dist/ui/overlays/KitEditor.js +0 -101
  634. package/dist/ui/overlays/KitManager.d.ts +0 -23
  635. package/dist/ui/overlays/KitManager.js +0 -104
  636. package/dist/ui/overlays/KitPicker.d.ts +0 -49
  637. package/dist/ui/overlays/KitPicker.js +0 -58
  638. package/dist/ui/overlays/ModelDiscoveryList.d.ts +0 -23
  639. package/dist/ui/overlays/ModelDiscoveryList.js +0 -161
  640. package/dist/ui/overlays/ModelPicker.d.ts +0 -26
  641. package/dist/ui/overlays/ModelPicker.js +0 -63
  642. package/dist/ui/overlays/ModelProfileEditor.d.ts +0 -29
  643. package/dist/ui/overlays/ModelProfileEditor.js +0 -168
  644. package/dist/ui/overlays/ModelProfilePicker.d.ts +0 -48
  645. package/dist/ui/overlays/ModelProfilePicker.js +0 -231
  646. package/dist/ui/overlays/PlanReviewOverlay.d.ts +0 -51
  647. package/dist/ui/overlays/PlanReviewOverlay.js +0 -132
  648. package/dist/ui/overlays/PromptEditorPage.d.ts +0 -48
  649. package/dist/ui/overlays/PromptEditorPage.js +0 -227
  650. package/dist/ui/overlays/PromptLibraryOverlay.d.ts +0 -37
  651. package/dist/ui/overlays/PromptLibraryOverlay.js +0 -191
  652. package/dist/ui/overlays/PromptPicker.d.ts +0 -36
  653. package/dist/ui/overlays/PromptPicker.js +0 -129
  654. package/dist/ui/overlays/PromptTextArea.d.ts +0 -86
  655. package/dist/ui/overlays/PromptTextArea.js +0 -141
  656. package/dist/ui/overlays/QuestionOverlay.d.ts +0 -39
  657. package/dist/ui/overlays/QuestionOverlay.js +0 -258
  658. package/dist/ui/overlays/QueueOverlay.d.ts +0 -22
  659. package/dist/ui/overlays/QueueOverlay.js +0 -79
  660. package/dist/ui/overlays/SettingsScreen.d.ts +0 -228
  661. package/dist/ui/overlays/SettingsScreen.js +0 -1037
  662. package/dist/ui/overlays/ShortcutPanel.d.ts +0 -39
  663. package/dist/ui/overlays/ShortcutPanel.js +0 -106
  664. package/dist/ui/overlays/TeamFanoutPage.d.ts +0 -51
  665. package/dist/ui/overlays/TeamFanoutPage.js +0 -90
  666. package/dist/ui/overlays/governance-settings.d.ts +0 -79
  667. package/dist/ui/overlays/governance-settings.js +0 -140
  668. package/dist/ui/overlays/kit-picker-state.d.ts +0 -87
  669. package/dist/ui/overlays/kit-picker-state.js +0 -136
  670. package/dist/ui/overlays/kit-settings-state.d.ts +0 -129
  671. package/dist/ui/overlays/kit-settings-state.js +0 -268
  672. package/dist/ui/overlays/model-probe-view.d.ts +0 -128
  673. package/dist/ui/overlays/model-probe-view.js +0 -225
  674. package/dist/ui/overlays/model-profile-state.d.ts +0 -177
  675. package/dist/ui/overlays/model-profile-state.js +0 -301
  676. package/dist/ui/overlays/prompt-library-state.d.ts +0 -162
  677. package/dist/ui/overlays/prompt-library-state.js +0 -335
  678. package/dist/ui/overlays/prompt-picker-state.d.ts +0 -71
  679. package/dist/ui/overlays/prompt-picker-state.js +0 -98
  680. package/dist/ui/overlays/team-fanout-state.d.ts +0 -106
  681. package/dist/ui/overlays/team-fanout-state.js +0 -155
  682. package/dist/ui/overlays/use-model-probe.d.ts +0 -30
  683. package/dist/ui/overlays/use-model-probe.js +0 -109
  684. package/dist/ui/palettes.d.ts +0 -112
  685. package/dist/ui/palettes.js +0 -130
  686. package/dist/ui/paste-frames.d.ts +0 -91
  687. package/dist/ui/paste-frames.js +0 -117
  688. package/dist/ui/paste-tokens.d.ts +0 -90
  689. package/dist/ui/paste-tokens.js +0 -147
  690. package/dist/ui/render-cache.d.ts +0 -81
  691. package/dist/ui/render-cache.js +0 -196
  692. package/dist/ui/render-governor.d.ts +0 -54
  693. package/dist/ui/render-governor.js +0 -78
  694. package/dist/ui/run-metrics.d.ts +0 -23
  695. package/dist/ui/run-metrics.js +0 -27
  696. package/dist/ui/run-status-row.d.ts +0 -63
  697. package/dist/ui/run-status-row.js +0 -54
  698. package/dist/ui/screen.d.ts +0 -107
  699. package/dist/ui/screen.js +0 -234
  700. package/dist/ui/scrollback/LiveTail.d.ts +0 -115
  701. package/dist/ui/scrollback/LiveTail.js +0 -48
  702. package/dist/ui/scrollback/band.d.ts +0 -114
  703. package/dist/ui/scrollback/band.js +0 -143
  704. package/dist/ui/scrollback/budget.d.ts +0 -90
  705. package/dist/ui/scrollback/budget.js +0 -100
  706. package/dist/ui/scrollback/canvas.d.ts +0 -100
  707. package/dist/ui/scrollback/canvas.js +0 -114
  708. package/dist/ui/scrollback/cursor-probe.d.ts +0 -71
  709. package/dist/ui/scrollback/cursor-probe.js +0 -133
  710. package/dist/ui/scrollback/drain.d.ts +0 -32
  711. package/dist/ui/scrollback/drain.js +0 -64
  712. package/dist/ui/scrollback/exit-summary.d.ts +0 -23
  713. package/dist/ui/scrollback/exit-summary.js +0 -25
  714. package/dist/ui/scrollback/limits.d.ts +0 -98
  715. package/dist/ui/scrollback/limits.js +0 -98
  716. package/dist/ui/scrollback/live-preview.d.ts +0 -34
  717. package/dist/ui/scrollback/live-preview.js +0 -130
  718. package/dist/ui/scrollback/overflow-print.d.ts +0 -108
  719. package/dist/ui/scrollback/overflow-print.js +0 -120
  720. package/dist/ui/scrollback/renderer.d.ts +0 -48
  721. package/dist/ui/scrollback/renderer.js +0 -186
  722. package/dist/ui/scrollback/scrollback-writer.d.ts +0 -174
  723. package/dist/ui/scrollback/scrollback-writer.js +0 -648
  724. package/dist/ui/scrollback/settled-boundary.d.ts +0 -42
  725. package/dist/ui/scrollback/settled-boundary.js +0 -109
  726. package/dist/ui/scrollback/tail-anchor.d.ts +0 -71
  727. package/dist/ui/scrollback/tail-anchor.js +0 -79
  728. package/dist/ui/scrollback/tail-window.d.ts +0 -73
  729. package/dist/ui/scrollback/tail-window.js +0 -89
  730. package/dist/ui/scrollback/use-scrollback-view.d.ts +0 -139
  731. package/dist/ui/scrollback/use-scrollback-view.js +0 -601
  732. package/dist/ui/scrollback/writer-shapes.d.ts +0 -127
  733. package/dist/ui/scrollback/writer-shapes.js +0 -159
  734. package/dist/ui/scrollbar-controller.d.ts +0 -30
  735. package/dist/ui/scrollbar-controller.js +0 -124
  736. package/dist/ui/selection/highlight.d.ts +0 -39
  737. package/dist/ui/selection/highlight.js +0 -64
  738. package/dist/ui/selection/screen-mirror.d.ts +0 -24
  739. package/dist/ui/selection/screen-mirror.js +0 -35
  740. package/dist/ui/selection/selection-controller.d.ts +0 -104
  741. package/dist/ui/selection/selection-controller.js +0 -372
  742. package/dist/ui/selection/selection.d.ts +0 -90
  743. package/dist/ui/selection/selection.js +0 -223
  744. package/dist/ui/shortcuts.d.ts +0 -81
  745. package/dist/ui/shortcuts.js +0 -221
  746. package/dist/ui/status-feedback.d.ts +0 -35
  747. package/dist/ui/status-feedback.js +0 -38
  748. package/dist/ui/stdout-frame-writer.d.ts +0 -74
  749. package/dist/ui/stdout-frame-writer.js +0 -155
  750. package/dist/ui/team-status.d.ts +0 -166
  751. package/dist/ui/team-status.js +0 -252
  752. package/dist/ui/terminal-plan.d.ts +0 -52
  753. package/dist/ui/terminal-plan.js +0 -49
  754. package/dist/ui/theme.d.ts +0 -96
  755. package/dist/ui/theme.js +0 -130
  756. package/dist/ui/transcript-text.d.ts +0 -41
  757. package/dist/ui/transcript-text.js +0 -282
  758. package/dist/ui/use-height-store.d.ts +0 -31
  759. package/dist/ui/use-height-store.js +0 -76
  760. package/dist/ui/use-render-governor.d.ts +0 -39
  761. package/dist/ui/use-render-governor.js +0 -57
  762. package/dist/ui/use-wheel-routing.d.ts +0 -57
  763. package/dist/ui/use-wheel-routing.js +0 -152
  764. package/dist/ui/win-vt-force.d.ts +0 -136
  765. package/dist/ui/win-vt-force.js +0 -237
  766. package/dist/ui/win-vt-input.d.ts +0 -57
  767. package/dist/ui/win-vt-input.js +0 -62
  768. package/dist/update/limits.d.ts +0 -111
  769. package/dist/update/limits.js +0 -111
  770. package/dist/update/semver.d.ts +0 -89
  771. package/dist/update/semver.js +0 -295
  772. package/dist/update/types.d.ts +0 -169
  773. package/dist/update/types.js +0 -68
  774. /package/dist/{ui → app}/session-bridge.d.ts +0 -0
  775. /package/dist/{ui → app}/session-bridge.js +0 -0
@@ -1,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
- }