@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,657 +0,0 @@
1
- /**
2
- * Stdin filter (mouse-wheel-region-routing section 4.2 / 5.2, extended by
3
- * tui-paste-handling section 5.1).
4
- *
5
- * WHY A WRAPPER AND NOT A SECOND LISTENER. Ink 5.2.1 owns stdin in a way that
6
- * forbids a second reader: `components/App.js` calls `setEncoding('utf8')`,
7
- * `ref()`, `setRawMode(true)`, subscribes to `'readable'` and drains with
8
- * `read()`. Attaching our own `'data'` listener to the same `process.stdin`
9
- * would switch the stream into flowing mode and RACE Ink's `read()` for chunks
10
- * -- some keystrokes would reach Ink, some would not, non-deterministically
11
- * (D-3). So the filter REPLACES the stream Ink is given: it reads the real
12
- * stdin, strips every mouse report, frames every paste, and writes the
13
- * remainder into a `PassThrough` that carries the surface Ink requires.
14
- *
15
- * ONE CHANNEL, NOT TWO, AND THAT NOW COVERS PASTES AS WELL (D-2 / D-3). A second
16
- * chained filter would need a second `PassThrough` and would reopen the ordering
17
- * hazard this note closes; a side-channel paste emit would apply the payload
18
- * BEFORE text that preceded it in the same chunk, because `wrapper.write` is
19
- * asynchronous and a synchronous emit is not. The paste therefore travels
20
- * INLINE, wrapped in `PASTE_OPEN` / `PASTE_CLOSE` (I-5).
21
- *
22
- * ORDERING IS AN INVARIANT, NOT A CONVENTION (I-8). The caller must build this
23
- * filter BEFORE anything writes `\x1b[?1000h` or `\x1b[?2004h`. Reporting or
24
- * bracketed paste enabled while Ink still holds the raw stream does not degrade
25
- * the feature -- it types `[<0;12;5M` or `[200~` into the user's message, which
26
- * is strictly worse than the bug being fixed.
27
- *
28
- * THE HANDLE ANSWERS EXACTLY ONE QUESTION: "is a stream wrapped?" (I-11 / D-17).
29
- * It stopped being the answer to "is the mouse on?" the moment paste could build
30
- * a filter on its own -- `paste` defaults to `true`, so `aragon --no-mouse`
31
- * builds one. `cli.tsx` reads its own `mouseOn` / `pasteOn` booleans; this module
32
- * is told which features it is running and never derives them.
33
- */
34
- import { PassThrough } from 'node:stream';
35
- import { MAX_PENDING_MOUSE_CHARS, splitMouseEvents, isMousePrefix, } from './mouse-events.js';
36
- import { ENTER_NEWLINE_FRAME, INDEX_KEY_FRAME, PASTE_ASSEMBLY_MAX_MS, PASTE_BURST_MS, PASTE_CLOSE, PASTE_MARKER_RESCAN_TTL_MS, PASTE_MAX_BYTES, PASTE_OPEN, formatPasteSize, } from './limits.js';
37
- import { PASTE_BEGIN_MARK, PASTE_END_MARK, classifyChunk, isPastePrefix, sanitisePaste, trailingPastePrefixLength, } from './paste-parse.js';
38
- import { hasPasteOnlySequence } from './control-sequences.js';
39
- import { splitCursorReports, trailingCprPrefixLength } from './cursor-report.js';
40
- import { splitEnterSequences, trailingEnterPrefixLength } from './enter-sequences.js';
41
- import { splitCsiUKeys, trailingCsiUPrefixLength, translateCsiUKey } from './csiu-keys.js';
42
- import { splitWin32KeySequences, trailingWin32PrefixLength, translateWin32Key, } from './win32-input-mode.js';
43
- /**
44
- * How long a possible-prefix tail is held before being flushed as text.
45
- *
46
- * This is what stops a lone `\x1b` -- the Esc key, which aborts a run -- from
47
- * being held hostage waiting for a `[` that will never arrive. Worst-case Esc
48
- * latency becomes 12 ms, and only for the keystroke that is literally a bare
49
- * ESC; every other key resolves both prefix tests to false immediately.
50
- */
51
- const PENDING_FLUSH_MS = 12;
52
- /**
53
- * Ceiling on the held-back tail, shared by both prefix families.
54
- *
55
- * NO CHANGE IS NEEDED HERE FOR PASTE (P2-5). `MAX_PENDING_MOUSE_CHARS` is 32 and
56
- * the longest paste marker is 6, so 32 already covers both. v1 of the design said
57
- * the ceiling "becomes `max(MAX_PENDING_MOUSE_CHARS, PASTE_BEGIN_MARK.length)`",
58
- * which is the same number written in a way that invites someone to edit the
59
- * constant.
60
- *
61
- * TAKEN FROM THE MODULE THAT OWNS IT rather than written again: this file already
62
- * imports from `mouse-events.js`, so there is no cycle to dodge here and no
63
- * reason for a second copy of a number whose only justification is that it equals
64
- * that one.
65
- */
66
- const MAX_PENDING_CHARS = MAX_PENDING_MOUSE_CHARS;
67
- /** Assign a method onto the PassThrough without widening its public type. */
68
- function define(target, name, value) {
69
- Object.defineProperty(target, name, { value, writable: true, configurable: true });
70
- }
71
- const byteLength = (s) => Buffer.byteLength(s, 'utf8');
72
- /**
73
- * Length of the trailing run of `text` that is a proper prefix of a mouse
74
- * report, or 0. Shortest match wins, mirroring `trailingPastePrefixLength`.
75
- *
76
- * MEASURED SEPARATELY FROM THE PASTE FAMILY, and the longer hold wins.
77
- * `isMousePrefix` does not match `\x1b[2`, which IS a prefix of both paste
78
- * markers, so a single combined test would leak half a marker into the draft.
79
- */
80
- function trailingMousePrefixLength(text) {
81
- const max = Math.min(text.length, MAX_PENDING_CHARS);
82
- for (let k = 1; k <= max; k += 1) {
83
- if (isMousePrefix(text.slice(text.length - k)))
84
- return k;
85
- }
86
- return 0;
87
- }
88
- export function createStdinFilter(real, features, bridge, onWarn) {
89
- const enhancedKeys = features.enhancedKeys === true;
90
- const wrapper = new PassThrough();
91
- const listeners = new Set();
92
- let pending = '';
93
- let flushTimer = null;
94
- let burstTimer = null;
95
- let assemblyTimer = null;
96
- let disposed = false;
97
- let finished = false;
98
- let paste = { kind: 'idle' };
99
- /**
100
- * The probe window (R3). While true a possible report prefix is held until the
101
- * probe settles instead of being flushed after `PENDING_FLUSH_MS`, because a
102
- * half `ESC[12` reaching Ink hits an undefined branch of its key parser.
103
- */
104
- let expectingCursorReport = false;
105
- let discardBracketed = false;
106
- let outputBatch = null;
107
- /**
108
- * A marker head that has ALREADY been released to Ink, kept for one more
109
- * chunk (defect 2: the torn-marker rescue in `onData`).
110
- *
111
- * WHY IT EXISTS. `flushPending` releases a lone ESC after 12 ms because the
112
- * Esc key must not be held hostage. When the split point lands inside a paste
113
- * marker -- `ESC` in one read and `[200~hello` in the next, which is ordinary
114
- * for a Windows console, SSH or tmux under load -- `feed` can no longer find
115
- * the marker and `[200~` is typed into the draft. Nothing downstream can undo
116
- * that: the marker has to be recognised BEFORE its bytes become text.
117
- *
118
- * WHAT IT CANNOT DO, STATED HONESTLY. The released ESC has already reached Ink
119
- * as an Esc key press and this filter cannot retract a write. The rescue
120
- * guarantees the marker CHARACTERS never become draft text; it does NOT undo
121
- * that keypress (an armed interrupt gesture, a dismissed popup).
122
- */
123
- let rescuedPrefix = null;
124
- const writeInput = (text) => {
125
- if (disposed || outputBatch?.refused)
126
- return;
127
- if (outputBatch)
128
- outputBatch.chunks.push(text);
129
- else
130
- wrapper.write(text);
131
- };
132
- // --- The surface Ink reads off the stream it is handed. ------------------
133
- // `isRawModeSupported()` reads `props.stdin.isTTY` (App.js:34), so this has
134
- // to be a DELEGATING GETTER rather than a snapshot: a stdin that is not a TTY
135
- // must still report so through the wrapper, or Ink throws instead of falling
136
- // back.
137
- Object.defineProperty(wrapper, 'isTTY', {
138
- get: () => real.isTTY,
139
- configurable: true,
140
- });
141
- define(wrapper, 'setRawMode', (mode) => {
142
- real.setRawMode?.(mode);
143
- return wrapper;
144
- });
145
- define(wrapper, 'ref', () => {
146
- real.ref?.();
147
- return wrapper;
148
- });
149
- define(wrapper, 'unref', () => {
150
- real.unref?.();
151
- return wrapper;
152
- });
153
- const emit = (event) => {
154
- for (const listener of [...listeners])
155
- listener(event);
156
- };
157
- const clearTimer = (t) => {
158
- if (t)
159
- clearTimeout(t);
160
- return null;
161
- };
162
- /** `.unref()` so a held tail can never keep the process alive on its own. */
163
- const arm = (fn, ms) => {
164
- if (finished || disposed)
165
- return null;
166
- const t = setTimeout(fn, ms);
167
- t.unref?.();
168
- return t;
169
- };
170
- // -----------------------------------------------------------------------
171
- // Paste emission
172
- // -----------------------------------------------------------------------
173
- /**
174
- * Write one frame, or refuse the paste and say so.
175
- *
176
- * D-11: above `PASTE_MAX_BYTES` the body is DROPPED and the user gets a toast
177
- * naming the size and the limit. Truncating would lose their data and look
178
- * like success. The body stops being accumulated the moment it goes over
179
- * (`overflow`), so memory stays bounded while the rest of the payload is still
180
- * being consumed -- consuming it is not optional, because the alternative is
181
- * two megabytes of the user's file arriving as keystrokes.
182
- */
183
- const emitPaste = (body, bytes, overflow) => {
184
- if (disposed)
185
- return;
186
- if (overflow || bytes > PASTE_MAX_BYTES) {
187
- if (outputBatch?.refused)
188
- return;
189
- if (outputBatch)
190
- outputBatch.refused = true;
191
- const text = `Paste too large (${formatPasteSize(bytes)}); limit is ` +
192
- `${formatPasteSize(PASTE_MAX_BYTES)}. Nothing was inserted.`;
193
- onWarn?.(text);
194
- bridge?.notify?.('warn', text);
195
- return;
196
- }
197
- const payload = sanitisePaste(body);
198
- if (payload.length === 0)
199
- return;
200
- // ONE `write()` call, at the position the paste occupied in the stream.
201
- writeInput(PASTE_OPEN + payload + PASTE_CLOSE);
202
- };
203
- const flushBurst = () => {
204
- burstTimer = clearTimer(burstTimer);
205
- if (paste.kind !== 'burst')
206
- return;
207
- const { body, bytes } = paste;
208
- paste = { kind: 'idle' };
209
- emitPaste(body, bytes, false);
210
- };
211
- const flushBracketed = (reason) => {
212
- assemblyTimer = clearTimer(assemblyTimer);
213
- if (paste.kind !== 'bracketed')
214
- return;
215
- const { body, bytes, overflow } = paste;
216
- paste = { kind: 'idle' };
217
- if (discardBracketed) {
218
- discardBracketed = false;
219
- if (outputBatch)
220
- outputBatch.refused = true;
221
- return;
222
- }
223
- if (reason === 'timeout') {
224
- // I-4: an unterminated marker must never wedge input. Emitting what
225
- // arrived is strictly better than holding the keyboard hostage.
226
- onWarn?.('bracketed paste never terminated; flushing what arrived');
227
- }
228
- emitPaste(body, bytes, overflow);
229
- };
230
- // -----------------------------------------------------------------------
231
- // The scan (section 5.1, and the ORDER below is the specification)
232
- // -----------------------------------------------------------------------
233
- /**
234
- * Text that reached the pass-through: a sequence a KEYBOARD cannot produce
235
- * first (R-2), then Tier 2 classification, then mouse stripping, then Ink.
236
- *
237
- * MOUSE PARSING IS SUSPENDED FOR THE DURATION OF ANY PASTE BODY (I-3), burst
238
- * and bracketed alike. The Tier 2 population is precisely the terminals with
239
- * no bracketed paste, and the likeliest thing such a user pastes into a TUI
240
- * dev tool is a terminal log full of `\x1b[<0;12;5M`-shaped bytes. Eating
241
- * those would corrupt their data silently. v1 covered only Tier 1, which left
242
- * the loss in place for exactly the terminals Tier 2 exists to serve (P1-7).
243
- */
244
- const handleText = (text, holdTail) => {
245
- if (text.length === 0)
246
- return;
247
- if (paste.kind === 'burst') {
248
- paste = { kind: 'burst', body: paste.body + text, bytes: paste.bytes + byteLength(text) };
249
- burstTimer = clearTimer(burstTimer);
250
- burstTimer = arm(flushBurst, PASTE_BURST_MS);
251
- return;
252
- }
253
- // A SEQUENCE A KEYBOARD CANNOT PRODUCE IS A PASTE, FRAMED OR NOT (R-2).
254
- //
255
- // WHY THE CLASSIFIER BELOW IS NOT ENOUGH. `classifyChunk` needs either a
256
- // line break or a chunk with no control byte but TAB, and a SINGLE-LINE
257
- // paste carrying ESC satisfies neither -- so it travels the keystroke path
258
- // with `sanitisePaste` never called. Measured on the real component that
259
- // cost either a draft holding `[38;2;18;52;86m` ALONGSIDE A LIVE ESC (which
260
- // then reached the model, the history and the session file) or an uncaught
261
- // `TypeError` in Ink's parser, because `parse-keypress.js` maps `ESC [ 3 2 m`
262
- // to a ctrl key whose `name` is undefined. Framing it here routes it through
263
- // the ONE cleaning path every other paste already takes.
264
- if (features.paste && hasPasteOnlySequence(text)) {
265
- paste = { kind: 'burst', body: text, bytes: byteLength(text) };
266
- burstTimer = clearTimer(burstTimer);
267
- burstTimer = arm(flushBurst, PASTE_BURST_MS);
268
- return;
269
- }
270
- if (features.paste && classifyChunk(text) === 'paste') {
271
- paste = { kind: 'burst', body: text, bytes: byteLength(text) };
272
- burstTimer = clearTimer(burstTimer);
273
- burstTimer = arm(flushBurst, PASTE_BURST_MS);
274
- return;
275
- }
276
- // FOURTH PREFIX FAMILY: the terminal's answer to `ESC[6n`
277
- // (tui-bottom-anchored-live-region §4.5). AFTER the paste tests, and that order
278
- // is the specification: a user who pastes a terminal log containing `ESC[12;1R`
279
- // is pasting DATA, and a paste body is the one place such a sequence is kept
280
- // verbatim (I-3, the same rule that suspends mouse parsing inside a body).
281
- if (features.cursorReport) {
282
- const report = splitCursorReports(text);
283
- text = report.text;
284
- if (report.pending.length > 0) {
285
- // Not text yet: it joins the cross-chunk buffer the mouse family uses.
286
- // `holdTail` false means a paste marker follows in this very chunk, so no
287
- // later byte can complete the prefix and holding it would reorder it (I-5).
288
- if (holdTail)
289
- pending += report.pending;
290
- else
291
- writeInput(report.pending);
292
- }
293
- if (text.length === 0)
294
- return;
295
- }
296
- // Ink conflates DEL Backspace with CSI Delete. Normalize only keyboard
297
- // text, after burst classification, preserving ESC for Alt+Backspace.
298
- text = text.replace(/\x7f/g, '\x08');
299
- if (!features.mouse) {
300
- writeInput(text);
301
- return;
302
- }
303
- const split = splitMouseEvents(text);
304
- if (split.text.length > 0)
305
- writeInput(split.text);
306
- for (const event of split.events)
307
- emit(event);
308
- if (split.pending.length === 0)
309
- return;
310
- // `holdTail` is false when a paste marker follows this run in the SAME
311
- // chunk: no later byte can complete the mouse prefix, so holding it would
312
- // reorder it behind the paste. Appending (never prepending) is what keeps
313
- // `pending` in stream order when both prefix families fire at once.
314
- if (holdTail)
315
- pending += split.pending;
316
- else
317
- writeInput(split.pending);
318
- };
319
- /**
320
- * THE ENHANCED-KEY WALK, OUTSIDE PASTES ONLY. win32-input-mode records are
321
- * split first (their bodies are digits/semicolons, so no paste marker or
322
- * CSI-u sequence can live inside one), then CSI-u sequences in the
323
- * remaining text, and only then the legacy Enter family. Each translated
324
- * key terminates a heuristic burst exactly like an Enter frame does -- a
325
- * keystroke mid-burst is the definition of "not a paste".
326
- */
327
- const writeEnhancedKey = (legacy) => {
328
- if (legacy.length === 0)
329
- return;
330
- flushBurst();
331
- writeInput(legacy);
332
- };
333
- const handleOutsidePaste = (text, holdTail) => {
334
- const win32 = enhancedKeys ? splitWin32KeySequences(text)
335
- : [{ kind: 'text', text }];
336
- for (let w = 0; w < win32.length; w += 1) {
337
- const wSeg = win32[w];
338
- const wLast = holdTail && w === win32.length - 1;
339
- if (wSeg.kind === 'key') {
340
- writeEnhancedKey(translateWin32Key(wSeg.record));
341
- continue;
342
- }
343
- const csiu = enhancedKeys ? splitCsiUKeys(wSeg.text)
344
- : [{ kind: 'text', text: wSeg.text }];
345
- for (let c = 0; c < csiu.length; c += 1) {
346
- const cSeg = csiu[c];
347
- if (cSeg.kind === 'key') {
348
- writeEnhancedKey(translateCsiUKey(cSeg.key));
349
- continue;
350
- }
351
- const segments = splitEnterSequences(cSeg.text);
352
- for (let index = 0; index < segments.length; index += 1) {
353
- const segment = segments[index];
354
- if (segment.kind === 'text') {
355
- handleText(segment.text, wLast && c === csiu.length - 1
356
- && index === segments.length - 1);
357
- continue;
358
- }
359
- // A key terminates the heuristic paste before its internal frame is written.
360
- writeEnhancedKey(segment.kind === 'submit' ? '\r' : ENTER_NEWLINE_FRAME);
361
- }
362
- }
363
- }
364
- };
365
- /**
366
- * win32-input-mode records that arrived INSIDE a paste frame (R-4).
367
- *
368
- * DATA FIDELITY, NOT POLISH. Every character of a `?9001h` session arrives as
369
- * `ESC [ vk ; sc ; char ; down ; mods ; rep _`, and once the frame opens
370
- * nothing translated them: `sanitisePaste` then removed each record's ESC and
371
- * left 15 visible characters of digits per key. Translating them is also what
372
- * keeps the fix honest in the OTHER direction -- a whole-sequence stripper
373
- * deletes such a record outright, so "clean" would have meant the user's
374
- * characters silently vanishing. A record carrying a key FRAME (modified
375
- * Enter, Ctrl+I) becomes the byte that frame stands for, because a frame
376
- * inside a body is content and never a key.
377
- */
378
- const translateInPaste = (text) => {
379
- if (!enhancedKeys || !text.includes('\x1b['))
380
- return text;
381
- let out = '';
382
- for (const segment of splitWin32KeySequences(text)) {
383
- if (segment.kind === 'text') {
384
- out += segment.text;
385
- continue;
386
- }
387
- const legacy = translateWin32Key(segment.record);
388
- if (legacy === ENTER_NEWLINE_FRAME)
389
- out += '\n';
390
- else if (legacy === INDEX_KEY_FRAME)
391
- out += '\t';
392
- else
393
- out += legacy;
394
- }
395
- return out;
396
- };
397
- const appendBracketed = (text) => {
398
- if (paste.kind !== 'bracketed' || text.length === 0 || discardBracketed)
399
- return;
400
- const body = translateInPaste(text);
401
- const bytes = paste.bytes + byteLength(body);
402
- const overflow = paste.overflow || bytes > PASTE_MAX_BYTES;
403
- paste = {
404
- kind: 'bracketed',
405
- body: overflow ? paste.body : paste.body + body,
406
- bytes,
407
- overflow,
408
- };
409
- };
410
- const feed = (raw) => {
411
- let rest = raw;
412
- while (rest.length > 0) {
413
- if (paste.kind === 'bracketed') {
414
- const end = rest.indexOf(PASTE_END_MARK);
415
- if (end === -1) {
416
- // Hold a trailing strict prefix of the END marker for the next chunk.
417
- // NO 12 ms FLUSH TIMER HERE: inside a body every byte is payload, so
418
- // nothing is being kept from the keyboard, and `assemblyTimer` is the
419
- // bound that matters (I-4).
420
- const hold = trailingPastePrefixLength(rest);
421
- appendBracketed(rest.slice(0, rest.length - hold));
422
- pending = rest.slice(rest.length - hold);
423
- return;
424
- }
425
- appendBracketed(rest.slice(0, end));
426
- flushBracketed('end');
427
- rest = rest.slice(end + PASTE_END_MARK.length);
428
- continue;
429
- }
430
- // idle | burst. BOTH markers are consumed unconditionally, in every mode
431
- // and whether or not this process enabled DEC 2004 (I-16): something else
432
- // may have left it on, and a stray END typed into the draft is the same
433
- // failure arriving from outside.
434
- const begin = rest.indexOf(PASTE_BEGIN_MARK);
435
- const strayEnd = rest.indexOf(PASTE_END_MARK);
436
- const first = begin === -1 ? strayEnd : strayEnd === -1 ? begin : Math.min(begin, strayEnd);
437
- if (first === -1) {
438
- // THIRD PREFIX FAMILY: a torn CSI-u Enter sequence
439
- // (tui-shift-enter-copy-queue 3.4). `keep = max(...)` holds the longest
440
- // tail any family might still complete; the three families share only
441
- // the ESC / ESC-[ head bytes, which the max keeps for whoever needs
442
- // them. The existing 12 ms flush and the 32-char ceiling bound the
443
- // hold, so no new timer is needed.
444
- const keep = Math.max(trailingPastePrefixLength(rest), features.mouse ? trailingMousePrefixLength(rest) : 0, features.cursorReport ? trailingCprPrefixLength(rest) : 0, trailingEnterPrefixLength(rest), enhancedKeys ? trailingWin32PrefixLength(rest) : 0, enhancedKeys ? trailingCsiUPrefixLength(rest) : 0);
445
- const tail = rest.slice(rest.length - keep);
446
- handleOutsidePaste(rest.slice(0, rest.length - keep), true);
447
- pending += tail;
448
- return;
449
- }
450
- handleOutsidePaste(rest.slice(0, first), false);
451
- if (begin === -1 || first < begin) {
452
- rest = rest.slice(first + PASTE_END_MARK.length);
453
- continue;
454
- }
455
- // P2-4: the burst is flushed FIRST, so two bodies can never be
456
- // concatenated into one token out of order.
457
- flushBurst();
458
- paste = { kind: 'bracketed', body: '', bytes: 0, overflow: false };
459
- assemblyTimer = clearTimer(assemblyTimer);
460
- assemblyTimer = arm(() => flushBracketed('timeout'), PASTE_ASSEMBLY_MAX_MS);
461
- rest = rest.slice(first + PASTE_BEGIN_MARK.length);
462
- }
463
- };
464
- /**
465
- * Hand a held tail to the ordinary text path, remembering it when it could
466
- * still be the head of a paste marker.
467
- *
468
- * THE TAIL IS RELEASED EXACTLY AS BEFORE. Remembering it costs no latency: a
469
- * real Esc keypress still reaches Ink after `PENDING_FLUSH_MS`, and the
470
- * remembered head is only ever consulted for the NEXT chunk.
471
- */
472
- const flushTailAsText = (text) => {
473
- rescuedPrefix = isPastePrefix(text) ? { text, at: Date.now() } : null;
474
- handleOutsidePaste(text, false);
475
- };
476
- const flushPending = () => {
477
- flushTimer = clearTimer(flushTimer);
478
- if (pending.length === 0 || disposed)
479
- return;
480
- // The probe owes us an answer: releasing a half report now would type it into
481
- // the draft. `setExpectingCursorReport(false)` flushes whatever is left.
482
- if (expectingCursorReport)
483
- return;
484
- const text = pending;
485
- pending = '';
486
- // A tail that never completed is ordinary text; it goes through the same
487
- // scan so a burst already open keeps coalescing it.
488
- flushTailAsText(text);
489
- };
490
- /**
491
- * One-shot rescue of a marker whose ESC was already flushed as text.
492
- *
493
- * Returns the string `feed` should scan -- the remembered head followed by
494
- * this chunk -- when the chunk COMPLETES that head into a whole marker, and
495
- * `null` otherwise. On `null` the chunk travels the normal path: the head has
496
- * already been emitted, so re-feeding it would type its bytes twice, and
497
- * holding the chunk instead would swallow characters the user really typed.
498
- *
499
- * STARTS WITH, NOT CONTAINS. A marker completed at the junction starts at
500
- * index 0 of the joined text; one starting anywhere later lies wholly inside
501
- * `chunk` (the head holds an ESC at index 0 and nothing else that could begin
502
- * a marker), and `feed` finds that on its own. Only the junction case needs
503
- * re-scanning, and it is the only case where prepending cannot duplicate a
504
- * byte that Ink has already seen.
505
- *
506
- * ONE-SHOT BY CONSTRUCTION: the remembered head is cleared here on every call,
507
- * whether or not the rescue fired, so at most one chunk is ever re-scanned
508
- * against it and no stale head can outlive its `PASTE_MARKER_RESCAN_TTL_MS`.
509
- */
510
- const takeRescuedPrefix = (carried, chunk) => {
511
- const rescue = rescuedPrefix;
512
- rescuedPrefix = null;
513
- if (rescue === null || carried.length > 0 || !features.paste)
514
- return null;
515
- if (Date.now() - rescue.at > PASTE_MARKER_RESCAN_TTL_MS)
516
- return null;
517
- const joined = rescue.text + chunk;
518
- const completes = joined.startsWith(PASTE_BEGIN_MARK) || joined.startsWith(PASTE_END_MARK);
519
- return completes ? joined : null;
520
- };
521
- const onData = (chunk) => {
522
- if (disposed || finished)
523
- return;
524
- flushTimer = clearTimer(flushTimer);
525
- const decoded = typeof chunk === 'string' ? chunk : chunk.toString('utf8');
526
- // Stripped on BOTH paths, because a NUL in a payload must never be able to
527
- // forge a `PASTE_OPEN` frame boundary.
528
- const cleaned = decoded.replace(/\u0000/g, '');
529
- const carried = pending;
530
- pending = '';
531
- // A rejected paste must not leave earlier text or a later Enter executable.
532
- const batch = { chunks: [], refused: false };
533
- outputBatch = batch;
534
- try {
535
- feed(takeRescuedPrefix(carried, cleaned) ?? (carried + cleaned));
536
- }
537
- finally {
538
- outputBatch = null;
539
- }
540
- if (batch.refused) {
541
- burstTimer = clearTimer(burstTimer);
542
- if (paste.kind === 'bracketed') {
543
- // Keep consuming an unfinished body so its next chunk cannot become keys.
544
- discardBracketed = true;
545
- paste = { kind: 'bracketed', body: '', bytes: 0, overflow: false };
546
- }
547
- else {
548
- pending = '';
549
- paste = { kind: 'idle' };
550
- assemblyTimer = clearTimer(assemblyTimer);
551
- }
552
- return;
553
- }
554
- if (disposed || finished)
555
- return;
556
- for (const text of batch.chunks)
557
- wrapper.write(text);
558
- if (paste.kind === 'bracketed' || pending.length === 0)
559
- return;
560
- if (pending.length > MAX_PENDING_CHARS && !expectingCursorReport) {
561
- // A malformed sequence that looks like a prefix forever must never wedge
562
- // input: past the ceiling the tail becomes ordinary text. NOT DURING THE
563
- // PROBE WINDOW THOUGH (L8): there the ceiling could push half a report into
564
- // Ink, which is the failure this whole family exists to prevent. The window
565
- // is bounded by the probe timeout, after which the ceiling applies again.
566
- const text = pending;
567
- pending = '';
568
- flushTailAsText(text);
569
- return;
570
- }
571
- flushTimer = arm(flushPending, PENDING_FLUSH_MS);
572
- };
573
- // P2-7: a closed stdin must still terminate Ink's reader, or it waits forever
574
- // on a stream that will never produce another byte.
575
- const onEnd = () => {
576
- if (finished || disposed)
577
- return;
578
- finished = true;
579
- flushTimer = clearTimer(flushTimer);
580
- burstTimer = clearTimer(burstTimer);
581
- assemblyTimer = clearTimer(assemblyTimer);
582
- const tail = pending;
583
- pending = '';
584
- if (paste.kind === 'bracketed') {
585
- appendBracketed(tail);
586
- flushBracketed('timeout');
587
- }
588
- else {
589
- // The pending prefix belongs to the currently open burst, if any.
590
- handleOutsidePaste(tail, false);
591
- flushBurst();
592
- }
593
- wrapper.end();
594
- };
595
- // `setEncoding('utf8')` on the REAL stream so Node's StringDecoder handles
596
- // multi-byte boundaries for us -- the scan works on characters, and a UTF-8
597
- // sequence split across two chunks would otherwise become two mojibake
598
- // characters before it ever reached `splitMouseEvents`.
599
- real.setEncoding?.('utf8');
600
- real.on('data', onData);
601
- real.once('end', onEnd);
602
- real.once('close', onEnd);
603
- return {
604
- stdin: wrapper,
605
- source: {
606
- subscribe(listener) {
607
- listeners.add(listener);
608
- return () => listeners.delete(listener);
609
- },
610
- },
611
- setExpectingCursorReport(on) {
612
- if (expectingCursorReport === on)
613
- return;
614
- expectingCursorReport = on;
615
- if (on || disposed)
616
- return;
617
- // Settled: nothing that is still held was a report. Release it as text, so a
618
- // probe that never got an answer costs its own timeout and not a dead keyboard.
619
- flushTimer = clearTimer(flushTimer);
620
- flushPending();
621
- },
622
- dispose() {
623
- if (disposed)
624
- return;
625
- disposed = true;
626
- flushTimer = clearTimer(flushTimer);
627
- burstTimer = clearTimer(burstTimer);
628
- assemblyTimer = clearTimer(assemblyTimer);
629
- real.removeListener('data', onData);
630
- real.removeListener('end', onEnd);
631
- real.removeListener('close', onEnd);
632
- listeners.clear();
633
- // I-7: a live `'data'` listener on stdin keeps the event loop alive, and
634
- // `aragon` would hang on exit instead of returning to the shell.
635
- real.pause?.();
636
- real.unref?.();
637
- },
638
- };
639
- }
640
- /**
641
- * Build a filter, or `null` if construction throws.
642
- *
643
- * The `null` return is the whole point (P0-1): a construction failure must
644
- * degrade to "the wheel is inert and pastes are keystrokes" -- a supported,
645
- * tested rung of the fail-safe ladder -- rather than leaving `?1000h` or `?2004h`
646
- * on with no filter in front of Ink. `cli.tsx` derives BOTH `mouseOn` and
647
- * `pasteOn` from the returned handle for exactly that reason.
648
- */
649
- export function tryCreateStdinFilter(real, features, onError, bridge) {
650
- try {
651
- return createStdinFilter(real, features, bridge, onError);
652
- }
653
- catch (err) {
654
- onError?.(err instanceof Error ? err.message : String(err));
655
- return null;
656
- }
657
- }