@north-light/crouter 0.3.170 → 0.3.172

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 (670) hide show
  1. package/dist/api/client.d.ts +37 -11
  2. package/dist/api/client.js +84 -15
  3. package/dist/api/dto/human.d.ts +53 -39
  4. package/dist/api/dto/human.js +2 -3
  5. package/dist/api/dto/inbox.d.ts +0 -1
  6. package/dist/api/dto/nodes.d.ts +12 -0
  7. package/dist/api/dto/review-comments.d.ts +137 -0
  8. package/dist/api/dto/review-comments.js +5 -0
  9. package/dist/api/dto/reviews.d.ts +109 -0
  10. package/dist/api/dto/reviews.js +5 -0
  11. package/dist/api/index.d.ts +2 -0
  12. package/dist/api/index.js +2 -0
  13. package/dist/api/routes.d.ts +17 -4
  14. package/dist/api/routes.js +21 -5
  15. package/dist/build-root.d.ts +1 -16
  16. package/dist/build-root.js +1 -25
  17. package/dist/builtin-memory/00-runtime-base.md +7 -5
  18. package/dist/builtin-memory/04-base-worker.md +1 -1
  19. package/dist/builtin-memory/04-orchestration-kernel.md +7 -7
  20. package/dist/builtin-memory/05-kinds/design/00-base.md +1 -1
  21. package/dist/builtin-memory/05-kinds/design/01-orchestrator.md +1 -1
  22. package/dist/builtin-memory/05-kinds/developer/00-base.md +1 -1
  23. package/dist/builtin-memory/05-kinds/explore/00-base.md +1 -1
  24. package/dist/builtin-memory/05-kinds/plan/00-base.md +1 -1
  25. package/dist/builtin-memory/05-kinds/plan/01-orchestrator.md +1 -1
  26. package/dist/builtin-memory/05-kinds/review/00-base.md +1 -1
  27. package/dist/builtin-memory/05-kinds/review/companion/00-base.md +20 -0
  28. package/dist/builtin-memory/05-kinds/spec/00-base.md +3 -7
  29. package/dist/builtin-memory/05-kinds/spec/01-orchestrator.md +3 -3
  30. package/dist/builtin-memory/05-kinds/spec/requirements.md +3 -3
  31. package/dist/builtin-memory/design.md +2 -2
  32. package/dist/builtin-memory/insights/capture.md +50 -0
  33. package/dist/builtin-memory/insights/init.md +45 -0
  34. package/dist/builtin-memory/insights/listen.md +9 -0
  35. package/dist/builtin-memory/internal/agent-shaping.md +2 -2
  36. package/dist/builtin-memory/internal/nodes-and-canvas.md +1 -1
  37. package/dist/builtin-memory/internal/plugins.md +12 -11
  38. package/dist/builtin-memory/internal/storage-tiers.md +2 -2
  39. package/dist/builtin-memory/{planning.md → plan/roadmap.md} +3 -3
  40. package/dist/builtin-memory/plan.md +19 -0
  41. package/dist/builtin-memory/spec/guide.md +38 -0
  42. package/dist/builtin-memory/spec/requirements.md +31 -0
  43. package/dist/builtin-memory/spec/roadmap.md +35 -0
  44. package/dist/builtin-memory/spec.md +10 -86
  45. package/dist/builtin-pi-packages/pi-crtr-extensions/README.md +3 -4
  46. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/provider-rotation.test.ts +49 -5
  47. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.d.ts +56 -0
  48. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.js +920 -0
  49. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +221 -156
  50. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/statusline.ts +4 -5
  51. package/dist/cli.js +2 -6
  52. package/dist/clients/attach/__tests__/attach-chrome-remote.test.js +7 -35
  53. package/dist/clients/attach/__tests__/attach-keybindings.test.js +32 -16
  54. package/dist/clients/attach/__tests__/context-message.test.js +142 -6
  55. package/dist/clients/attach/__tests__/crtr-output.test.js +29 -45
  56. package/dist/clients/attach/__tests__/diagram.test.js +1 -1
  57. package/dist/clients/attach/__tests__/file-review-focus.test.js +48 -0
  58. package/dist/clients/attach/__tests__/group-activity.test.js +266 -0
  59. package/dist/clients/attach/__tests__/input-controller-extension-command.test.js +32 -0
  60. package/dist/clients/attach/__tests__/session-identity-refresh.test.js +32 -0
  61. package/dist/clients/attach/__tests__/titled-editor-preview.test.js +1 -2
  62. package/dist/clients/attach/chrome/header.d.ts +10 -0
  63. package/dist/clients/attach/chrome/header.js +30 -0
  64. package/dist/clients/attach/chrome/recap.d.ts +7 -0
  65. package/dist/clients/attach/chrome/recap.js +19 -0
  66. package/dist/clients/attach/chrome/status-line.d.ts +3 -0
  67. package/dist/clients/attach/chrome/status-line.js +5 -0
  68. package/dist/clients/attach/chrome/widgets.js +11 -21
  69. package/dist/clients/attach/command.js +11 -7
  70. package/dist/clients/attach/config.d.ts +4 -0
  71. package/dist/clients/attach/config.js +3 -0
  72. package/dist/clients/attach/input/controller.d.ts +19 -0
  73. package/dist/clients/attach/input/controller.js +62 -28
  74. package/dist/clients/attach/input/titled-editor.d.ts +0 -4
  75. package/dist/clients/attach/input/titled-editor.js +2 -10
  76. package/dist/clients/attach/overlays/file-review.d.ts +9 -5
  77. package/dist/clients/attach/overlays/file-review.js +9 -70
  78. package/dist/clients/attach/overlays/help.d.ts +33 -0
  79. package/dist/clients/attach/overlays/help.js +204 -0
  80. package/dist/clients/attach/render/activity-slot.d.ts +4 -0
  81. package/dist/clients/attach/render/activity-slot.js +13 -0
  82. package/dist/clients/attach/render/chat-view.d.ts +117 -12
  83. package/dist/clients/attach/render/chat-view.js +604 -135
  84. package/dist/clients/attach/render/context-message.d.ts +2 -1
  85. package/dist/clients/attach/render/context-message.js +17 -13
  86. package/dist/clients/attach/render/crtr-output.js +1 -3
  87. package/dist/clients/attach/render/diagram.js +2 -2
  88. package/dist/clients/attach/render/edit-diff.d.ts +4 -1
  89. package/dist/clients/attach/render/edit-diff.js +7 -11
  90. package/dist/clients/attach/render/group-activity.d.ts +32 -0
  91. package/dist/clients/attach/render/group-activity.js +206 -0
  92. package/dist/clients/attach/render/group-recap.d.ts +10 -0
  93. package/dist/clients/attach/render/group-recap.js +93 -0
  94. package/dist/clients/attach/render/html-markdown.d.ts +17 -0
  95. package/dist/clients/attach/render/html-markdown.js +228 -0
  96. package/dist/clients/attach/render/measured-container.d.ts +96 -0
  97. package/dist/clients/attach/render/measured-container.js +322 -0
  98. package/dist/clients/attach/render/scroll-animation.d.ts +8 -0
  99. package/dist/clients/attach/render/scroll-animation.js +80 -0
  100. package/dist/clients/attach/render/tool-calls.js +6 -6
  101. package/dist/clients/attach/render/transcript-copy.d.ts +9 -0
  102. package/dist/clients/attach/render/transcript-copy.js +81 -0
  103. package/dist/clients/attach/render/viewport.d.ts +29 -0
  104. package/dist/clients/attach/render/viewport.js +159 -0
  105. package/dist/clients/attach/session/bindings.d.ts +10 -7
  106. package/dist/clients/attach/session/bindings.js +23 -8
  107. package/dist/clients/attach/session/connection.js +4 -5
  108. package/dist/clients/attach/session/context.d.ts +6 -4
  109. package/dist/clients/attach/session/frame.d.ts +34 -0
  110. package/dist/clients/attach/session/frame.js +176 -0
  111. package/dist/clients/attach/session/frames.d.ts +4 -1
  112. package/dist/clients/attach/session/frames.js +14 -1
  113. package/dist/clients/attach/session/identity.js +4 -3
  114. package/dist/clients/attach/session/input-wiring.d.ts +14 -4
  115. package/dist/clients/attach/session/input-wiring.js +15 -13
  116. package/dist/clients/attach/session/invariant.d.ts +9 -0
  117. package/dist/clients/attach/session/invariant.js +15 -0
  118. package/dist/clients/attach/session/keys.d.ts +10 -2
  119. package/dist/clients/attach/session/keys.js +13 -5
  120. package/dist/clients/attach/session/layout.d.ts +10 -8
  121. package/dist/clients/attach/session/layout.js +33 -34
  122. package/dist/clients/attach/session/mouse.d.ts +18 -0
  123. package/dist/clients/attach/session/mouse.js +64 -0
  124. package/dist/clients/attach/session/pane-tag.d.ts +3 -0
  125. package/dist/clients/attach/session/pane-tag.js +51 -8
  126. package/dist/clients/attach/session/reconnect.d.ts +3 -0
  127. package/dist/clients/attach/session/reconnect.js +42 -5
  128. package/dist/clients/attach/session/surface-frame.d.ts +20 -0
  129. package/dist/clients/attach/session/surface-frame.js +73 -0
  130. package/dist/clients/attach/session/surface-host.d.ts +64 -0
  131. package/dist/clients/attach/session/surface-host.js +255 -0
  132. package/dist/clients/attach/session/whip.d.ts +17 -0
  133. package/dist/clients/attach/session/whip.js +334 -0
  134. package/dist/clients/attach/slash/dispatch.d.ts +13 -1
  135. package/dist/clients/attach/slash/dispatch.js +51 -29
  136. package/dist/clients/attach/viewer.js +907 -819
  137. package/dist/clients/conversation/conversation.d.ts +65 -0
  138. package/dist/clients/conversation/conversation.js +318 -0
  139. package/dist/clients/conversation/frames.d.ts +30 -0
  140. package/dist/clients/conversation/frames.js +52 -0
  141. package/dist/clients/conversation/region.d.ts +51 -0
  142. package/dist/clients/conversation/region.js +265 -0
  143. package/dist/clients/conversation/submit.d.ts +38 -0
  144. package/dist/clients/conversation/submit.js +51 -0
  145. package/dist/clients/inbox/__tests__/inbox-controller.test.js +247 -0
  146. package/dist/clients/inbox/__tests__/mount-panel.test.js +776 -0
  147. package/dist/clients/inbox/controller.d.ts +79 -0
  148. package/dist/clients/inbox/controller.js +448 -0
  149. package/dist/clients/inbox/deck-adapter.d.ts +29 -0
  150. package/dist/clients/inbox/deck-adapter.js +62 -0
  151. package/dist/clients/inbox/layout.d.ts +8 -0
  152. package/dist/clients/inbox/layout.js +9 -0
  153. package/dist/clients/inbox/resolve.d.ts +10 -0
  154. package/dist/clients/inbox/resolve.js +34 -0
  155. package/dist/clients/inbox/review/__tests__/editor-roundtrip.test.js +29 -0
  156. package/dist/clients/inbox/review/__tests__/remap.test.js +196 -0
  157. package/dist/clients/inbox/review/__tests__/review-core.test.js +341 -0
  158. package/dist/clients/inbox/review/anchors.d.ts +41 -0
  159. package/dist/clients/inbox/review/anchors.js +89 -0
  160. package/dist/clients/inbox/review/columns.d.ts +22 -0
  161. package/dist/clients/inbox/review/columns.js +40 -0
  162. package/dist/clients/inbox/review/comments-client.d.ts +66 -0
  163. package/dist/clients/inbox/review/comments-client.js +98 -0
  164. package/dist/clients/inbox/review/composition.d.ts +60 -0
  165. package/dist/clients/inbox/review/composition.js +278 -0
  166. package/dist/clients/inbox/review/document-region.d.ts +120 -0
  167. package/dist/clients/inbox/review/document-region.js +902 -0
  168. package/dist/clients/inbox/review/frame.d.ts +45 -0
  169. package/dist/clients/inbox/review/frame.js +215 -0
  170. package/dist/clients/inbox/review/keys.d.ts +67 -0
  171. package/dist/clients/inbox/review/keys.js +130 -0
  172. package/dist/clients/inbox/review/launch.d.ts +10 -0
  173. package/dist/clients/inbox/review/launch.js +129 -0
  174. package/dist/clients/inbox/review/live-source.d.ts +24 -0
  175. package/dist/clients/inbox/review/live-source.js +160 -0
  176. package/dist/clients/inbox/review/nvim.d.ts +13 -0
  177. package/dist/clients/inbox/review/nvim.js +42 -0
  178. package/dist/clients/inbox/review/remap.d.ts +51 -0
  179. package/dist/clients/inbox/review/remap.js +157 -0
  180. package/dist/clients/inbox/review/review-client.d.ts +30 -0
  181. package/dist/clients/inbox/review/review-client.js +107 -0
  182. package/dist/clients/inbox/review/roundtrip.d.ts +5 -0
  183. package/dist/clients/inbox/review/roundtrip.js +36 -0
  184. package/dist/clients/inbox/review/state.d.ts +143 -0
  185. package/dist/clients/inbox/review/state.js +282 -0
  186. package/dist/clients/inbox/review-adapter.d.ts +29 -0
  187. package/dist/clients/inbox/review-adapter.js +92 -0
  188. package/dist/clients/inbox/review-visibility.d.ts +5 -0
  189. package/dist/clients/inbox/review-visibility.js +19 -0
  190. package/dist/clients/inbox/surface.d.ts +19 -0
  191. package/dist/clients/inbox/surface.js +128 -0
  192. package/dist/clients/inbox/tui/ansi.d.ts +66 -0
  193. package/dist/clients/inbox/tui/ansi.js +317 -0
  194. package/dist/clients/inbox/tui/clipboard.d.ts +2 -0
  195. package/dist/clients/inbox/tui/clipboard.js +26 -0
  196. package/dist/clients/inbox/tui/input.d.ts +7 -0
  197. package/dist/clients/inbox/tui/input.js +653 -0
  198. package/dist/clients/inbox/tui/keys.d.ts +28 -0
  199. package/dist/clients/inbox/tui/keys.js +111 -0
  200. package/dist/clients/inbox/tui/panel.d.ts +2 -0
  201. package/dist/clients/inbox/tui/panel.js +217 -0
  202. package/dist/clients/inbox/tui/render.d.ts +37 -0
  203. package/dist/clients/inbox/tui/render.js +476 -0
  204. package/dist/clients/inbox/tui/types.d.ts +57 -0
  205. package/dist/clients/inbox/tui/types.js +1 -0
  206. package/dist/clients/inbox/tui.d.ts +6 -0
  207. package/dist/clients/inbox/tui.js +74 -0
  208. package/dist/clients/surfaces/host.d.ts +66 -0
  209. package/dist/clients/surfaces/host.js +1 -0
  210. package/dist/clients/surfaces/region.d.ts +16 -0
  211. package/dist/clients/surfaces/region.js +1 -0
  212. package/dist/clients/web/__tests__/push-engine.test.js +14 -158
  213. package/dist/clients/web/dev-server.d.ts +3 -3
  214. package/dist/clients/web/dev-server.js +9 -23
  215. package/dist/clients/web/events.js +4 -6
  216. package/dist/clients/web/push-engine.d.ts +2 -66
  217. package/dist/clients/web/push-engine.js +30 -161
  218. package/dist/clients/web/push-registry.d.ts +0 -4
  219. package/dist/clients/web/push-registry.js +2 -7
  220. package/dist/clients/web/server.js +3 -35
  221. package/dist/clients/web/web-client/shared/protocol.d.ts +0 -108
  222. package/dist/clients/web/web-cmd.js +2 -2
  223. package/dist/commands/__tests__/human.test.js +27 -15
  224. package/dist/commands/api-client.js +3 -3
  225. package/dist/commands/canvas-browse.js +1 -1
  226. package/dist/commands/canvas-issue.js +1 -1
  227. package/dist/commands/canvas-use.js +1 -1
  228. package/dist/commands/human/doc.d.ts +2 -0
  229. package/dist/commands/human/doc.js +98 -0
  230. package/dist/commands/human/inbox.d.ts +2 -0
  231. package/dist/commands/human/inbox.js +101 -0
  232. package/dist/commands/human/prompts.d.ts +2 -3
  233. package/dist/commands/human/prompts.js +27 -180
  234. package/dist/commands/human/queue.d.ts +1 -5
  235. package/dist/commands/human/queue.js +54 -216
  236. package/dist/commands/human/review.d.ts +2 -0
  237. package/dist/commands/human/review.js +298 -0
  238. package/dist/commands/human/shared.d.ts +2 -69
  239. package/dist/commands/human/shared.js +1 -181
  240. package/dist/commands/human.js +15 -20
  241. package/dist/commands/memory/__tests__/lint.test.d.ts +1 -0
  242. package/dist/commands/memory/__tests__/lint.test.js +15 -0
  243. package/dist/commands/memory/delete.js +2 -2
  244. package/dist/commands/memory/lint.d.ts +1 -0
  245. package/dist/commands/memory/lint.js +21 -3
  246. package/dist/commands/memory/read.js +4 -4
  247. package/dist/commands/node.js +8 -7
  248. package/dist/commands/pkg/plugin-manage.js +143 -68
  249. package/dist/commands/surface-inspect.js +2 -2
  250. package/dist/commands/surface.js +6 -12
  251. package/dist/commands/sys/__tests__/setup-core.test.js +9 -5
  252. package/dist/commands/sys/__tests__/setup-front-door.test.js +7 -42
  253. package/dist/commands/sys/config.js +29 -3
  254. package/dist/commands/sys/feedback.js +1 -1
  255. package/dist/commands/sys/setup-core.d.ts +12 -11
  256. package/dist/commands/sys/setup-core.js +55 -46
  257. package/dist/commands/sys/setup-wizard.d.ts +4 -1
  258. package/dist/commands/sys/setup-wizard.js +50 -9
  259. package/dist/commands/sys/sync-deps.js +1 -1
  260. package/dist/commands/sys.js +4 -6
  261. package/dist/core/__tests__/broker-sdk-wiring.test.js +6 -1
  262. package/dist/core/__tests__/broker-snapshot-history.test.js +9 -1
  263. package/dist/core/__tests__/dead-node-policy-table.test.js +3 -4
  264. package/dist/core/__tests__/fixtures/fake-engine.d.ts +8 -5
  265. package/dist/core/__tests__/fixtures/fake-engine.js +28 -2
  266. package/dist/core/__tests__/full/broker-provider-retry.test.js +87 -2
  267. package/dist/core/__tests__/full/broker-whip-interrupt.test.d.ts +1 -0
  268. package/dist/core/__tests__/full/broker-whip-interrupt.test.js +39 -0
  269. package/dist/core/__tests__/full/detach-focus.test.js +1 -1
  270. package/dist/core/__tests__/human-deliver-e2e.test.js +64 -64
  271. package/dist/core/__tests__/human-deliver.test.js +71 -345
  272. package/dist/core/__tests__/inline-memory-refs.test.js +2 -12
  273. package/dist/core/__tests__/memory-resolver-precedence.test.js +12 -15
  274. package/dist/core/__tests__/migration.test.js +10 -0
  275. package/dist/core/__tests__/model-pin-durability.test.js +14 -0
  276. package/dist/core/__tests__/phase4-review-migration.test.d.ts +1 -0
  277. package/dist/core/__tests__/phase4-review-migration.test.js +100 -0
  278. package/dist/core/__tests__/phase4-review-store.test.d.ts +1 -0
  279. package/dist/core/__tests__/phase4-review-store.test.js +143 -0
  280. package/dist/core/__tests__/remote-canvas-target.test.js +2 -2
  281. package/dist/core/__tests__/revive.test.js +22 -53
  282. package/dist/core/__tests__/session-cycles.test.js +48 -18
  283. package/dist/core/__tests__/spawn-no-kickoff.test.js +8 -12
  284. package/dist/core/__tests__/stop-guard.test.js +16 -1
  285. package/dist/core/__tests__/tmux-surface.test.js +21 -25
  286. package/dist/core/asset-root.d.ts +7 -0
  287. package/dist/core/asset-root.js +18 -0
  288. package/dist/core/broker-client/client.d.ts +0 -7
  289. package/dist/core/broker-client/client.js +4 -10
  290. package/dist/core/broker-client/transport-relay.d.ts +3 -4
  291. package/dist/core/broker-client/transport-relay.js +3 -4
  292. package/dist/core/canvas/__tests__/attention.test.js +1 -1
  293. package/dist/core/canvas/__tests__/remote-canvas-source.test.js +1 -1
  294. package/dist/core/canvas/__tests__/remote-transport.test.d.ts +1 -0
  295. package/dist/core/{view/__tests__/transport-remote.test.js → canvas/__tests__/remote-transport.test.js} +2 -2
  296. package/dist/core/canvas/__tests__/render-remote.test.js +1 -1
  297. package/dist/core/canvas/attention.js +4 -4
  298. package/dist/core/canvas/canvas.d.ts +6 -11
  299. package/dist/core/canvas/canvas.js +11 -33
  300. package/dist/core/canvas/db.js +207 -38
  301. package/dist/core/canvas/extensions.d.ts +1 -1
  302. package/dist/core/canvas/extensions.js +8 -1
  303. package/dist/core/canvas/index.d.ts +0 -1
  304. package/dist/core/canvas/index.js +0 -1
  305. package/dist/core/canvas/nav-model.d.ts +1 -1
  306. package/dist/core/canvas/nav-model.js +1 -1
  307. package/dist/core/canvas/paths.d.ts +5 -0
  308. package/dist/core/canvas/paths.js +16 -0
  309. package/dist/core/canvas/remote-canvas-source.js +2 -2
  310. package/dist/core/canvas/remote-transport.d.ts +7 -0
  311. package/dist/core/{view/transport-remote.js → canvas/remote-transport.js} +3 -4
  312. package/dist/core/canvas/source.js +1 -1
  313. package/dist/core/canvas/status-glyph.js +4 -12
  314. package/dist/core/canvas/types.d.ts +10 -35
  315. package/dist/core/clipboard-text.d.ts +8 -0
  316. package/dist/core/clipboard-text.js +18 -0
  317. package/dist/core/command-manifests/registry.d.ts +1 -3
  318. package/dist/core/command-plugins/bundle.d.ts +29 -0
  319. package/dist/core/command-plugins/bundle.js +198 -0
  320. package/dist/core/command-plugins/discovery.d.ts +0 -8
  321. package/dist/core/command-plugins/discovery.js +2 -39
  322. package/dist/core/command-plugins/transport/http-fetch.d.ts +4 -30
  323. package/dist/core/command-plugins/transport/http-fetch.js +17 -95
  324. package/dist/core/command.d.ts +1 -13
  325. package/dist/core/command.js +1 -16
  326. package/dist/core/config.d.ts +4 -0
  327. package/dist/core/config.js +28 -3
  328. package/dist/core/document-lines.d.ts +4 -0
  329. package/dist/core/document-lines.js +6 -0
  330. package/dist/core/feed/feed.d.ts +2 -0
  331. package/dist/core/feed/feed.js +11 -7
  332. package/dist/core/human/__tests__/inbox-cancel-worker.d.ts +1 -0
  333. package/dist/core/human/__tests__/inbox-cancel-worker.js +7 -0
  334. package/dist/core/human/__tests__/inbox-claim-worker.d.ts +1 -0
  335. package/dist/core/human/__tests__/inbox-claim-worker.js +17 -0
  336. package/dist/core/human/__tests__/inbox-core.test.d.ts +1 -0
  337. package/dist/core/human/__tests__/inbox-core.test.js +144 -0
  338. package/dist/core/human/__tests__/inbox-stale-claim-worker.d.ts +1 -0
  339. package/dist/core/human/__tests__/inbox-stale-claim-worker.js +8 -0
  340. package/dist/core/human/__tests__/visible-paths.test.d.ts +1 -0
  341. package/dist/{clients/attach → core/human}/__tests__/visible-paths.test.js +9 -0
  342. package/dist/core/human/claim.d.ts +23 -0
  343. package/dist/core/human/claim.js +67 -0
  344. package/dist/core/human/convention.d.ts +30 -0
  345. package/dist/core/human/convention.js +202 -0
  346. package/dist/core/human/deck-factories.d.ts +8 -0
  347. package/dist/core/human/deck-factories.js +15 -0
  348. package/dist/core/human/deck-schema.d.ts +70 -0
  349. package/dist/core/human/deck-schema.js +92 -0
  350. package/dist/core/human/root.d.ts +7 -0
  351. package/dist/core/human/root.js +37 -0
  352. package/dist/core/human/scan.d.ts +3 -0
  353. package/dist/core/human/scan.js +76 -0
  354. package/dist/core/human/summary.d.ts +8 -0
  355. package/dist/core/human/summary.js +44 -0
  356. package/dist/core/human/tickets.d.ts +49 -0
  357. package/dist/core/human/tickets.js +190 -0
  358. package/dist/core/human/types.d.ts +136 -0
  359. package/dist/core/human/types.js +5 -0
  360. package/dist/{clients/attach → core/human}/visible-paths.d.ts +1 -1
  361. package/dist/{clients/attach → core/human}/visible-paths.js +3 -2
  362. package/dist/core/inspector/chrome.d.ts +6 -0
  363. package/dist/core/inspector/chrome.js +14 -0
  364. package/dist/core/inspector/contract.d.ts +105 -0
  365. package/dist/core/inspector/contract.js +1 -0
  366. package/dist/core/inspector/core.d.ts +4 -5
  367. package/dist/core/inspector/core.js +3 -5
  368. package/dist/core/inspector/host.d.ts +46 -0
  369. package/dist/core/{tui → inspector}/host.js +42 -208
  370. package/dist/core/inspector/text.d.ts +2 -2
  371. package/dist/core/inspector/transport.d.ts +6 -0
  372. package/dist/core/inspector/transport.js +36 -0
  373. package/dist/core/inspector/tui.d.ts +2 -2
  374. package/dist/core/inspector/tui.js +15 -15
  375. package/dist/core/keybindings/__tests__/inbox-affordance.test.js +11 -11
  376. package/dist/core/keybindings/__tests__/resolve.test.js +10 -19
  377. package/dist/core/keybindings/attach-control.d.ts +9 -3
  378. package/dist/core/keybindings/attach-control.js +3 -1
  379. package/dist/core/keybindings/catalog.d.ts +6 -5
  380. package/dist/core/keybindings/catalog.js +61 -133
  381. package/dist/core/keybindings/inbox.d.ts +5 -6
  382. package/dist/core/keybindings/inbox.js +9 -10
  383. package/dist/core/keybindings/index.d.ts +3 -3
  384. package/dist/core/keybindings/index.js +3 -3
  385. package/dist/core/keybindings/persistence.d.ts +5 -1
  386. package/dist/core/keybindings/persistence.js +24 -6
  387. package/dist/core/keybindings/resolve.d.ts +6 -0
  388. package/dist/core/keybindings/resolve.js +10 -3
  389. package/dist/core/memory/inline-ref-grammar.js +2 -3
  390. package/dist/core/memory-resolver.d.ts +27 -29
  391. package/dist/core/memory-resolver.js +45 -39
  392. package/dist/core/model-routes.d.ts +33 -0
  393. package/dist/core/model-routes.js +42 -3
  394. package/dist/core/preview-registry.js +17 -55
  395. package/dist/core/profiles/select.js +3 -3
  396. package/dist/core/{view/remote-canvas-target.d.ts → remote-canvas-target.d.ts} +2 -2
  397. package/dist/core/{view/remote-canvas-target.js → remote-canvas-target.js} +4 -4
  398. package/dist/core/review/__tests__/capture-origin.test.d.ts +1 -0
  399. package/dist/core/review/__tests__/capture-origin.test.js +139 -0
  400. package/dist/core/review/__tests__/comments.test.d.ts +1 -0
  401. package/dist/core/review/__tests__/comments.test.js +98 -0
  402. package/dist/core/review/__tests__/project.test.d.ts +1 -0
  403. package/dist/core/review/__tests__/project.test.js +71 -0
  404. package/dist/core/review/__tests__/remap.test.d.ts +1 -0
  405. package/dist/core/review/__tests__/remap.test.js +159 -0
  406. package/dist/core/review/__tests__/stage-identity.test.d.ts +1 -0
  407. package/dist/core/review/__tests__/stage-identity.test.js +140 -0
  408. package/dist/core/review/birth.d.ts +7 -0
  409. package/dist/core/review/birth.js +23 -0
  410. package/dist/core/review/comments.d.ts +69 -0
  411. package/dist/core/review/comments.js +295 -0
  412. package/dist/core/review/companion.d.ts +35 -0
  413. package/dist/core/review/companion.js +205 -0
  414. package/dist/core/review/document.d.ts +27 -0
  415. package/dist/core/review/document.js +138 -0
  416. package/dist/core/review/project.d.ts +13 -0
  417. package/dist/core/review/project.js +58 -0
  418. package/dist/core/review/realize.d.ts +19 -0
  419. package/dist/core/review/realize.js +217 -0
  420. package/dist/core/review/remap.d.ts +24 -0
  421. package/dist/core/review/remap.js +156 -0
  422. package/dist/core/review/signal.d.ts +5 -0
  423. package/dist/core/review/signal.js +31 -0
  424. package/dist/core/review/stage.d.ts +26 -0
  425. package/dist/core/review/stage.js +184 -0
  426. package/dist/core/review/store.d.ts +46 -0
  427. package/dist/core/review/store.js +163 -0
  428. package/dist/core/review/ticket-filter.d.ts +17 -0
  429. package/dist/core/review/ticket-filter.js +32 -0
  430. package/dist/core/review/types.d.ts +130 -0
  431. package/dist/core/review/types.js +23 -0
  432. package/dist/core/runtime/__tests__/session-visibility.test.d.ts +1 -0
  433. package/dist/core/runtime/__tests__/session-visibility.test.js +119 -0
  434. package/dist/core/runtime/bearings.d.ts +5 -17
  435. package/dist/core/runtime/bearings.js +88 -71
  436. package/dist/core/runtime/broker-protocol.d.ts +31 -8
  437. package/dist/core/runtime/broker.d.ts +15 -1
  438. package/dist/core/runtime/broker.js +573 -141
  439. package/dist/core/runtime/canvas-extensions.d.ts +4 -5
  440. package/dist/core/runtime/canvas-extensions.js +5 -5
  441. package/dist/core/runtime/front-door.js +4 -4
  442. package/dist/core/runtime/headless-pi.d.ts +24 -0
  443. package/dist/core/runtime/headless-pi.js +152 -0
  444. package/dist/core/runtime/kickoff.d.ts +1 -5
  445. package/dist/core/runtime/kickoff.js +1 -5
  446. package/dist/core/runtime/model-registry.d.ts +3 -0
  447. package/dist/core/runtime/model-registry.js +13 -0
  448. package/dist/core/runtime/naming-persist.d.ts +4 -0
  449. package/dist/core/runtime/naming-persist.js +27 -1
  450. package/dist/core/runtime/naming.d.ts +17 -12
  451. package/dist/core/runtime/naming.js +91 -140
  452. package/dist/core/runtime/node-read.js +19 -10
  453. package/dist/core/runtime/nodes.d.ts +9 -14
  454. package/dist/core/runtime/nodes.js +3 -53
  455. package/dist/core/runtime/package-health.d.ts +6 -21
  456. package/dist/core/runtime/package-health.js +12 -123
  457. package/dist/core/runtime/placement-tmux.d.ts +2 -1
  458. package/dist/core/runtime/placement-tmux.js +6 -4
  459. package/dist/core/runtime/placement.d.ts +1 -0
  460. package/dist/core/runtime/placement.js +4 -8
  461. package/dist/core/runtime/promote.js +3 -0
  462. package/dist/core/runtime/recap.d.ts +2 -7
  463. package/dist/core/runtime/recap.js +35 -69
  464. package/dist/core/runtime/revive.js +34 -77
  465. package/dist/core/runtime/session-cycles.d.ts +4 -0
  466. package/dist/core/runtime/session-cycles.js +14 -1
  467. package/dist/core/runtime/session-visibility.d.ts +37 -0
  468. package/dist/core/runtime/session-visibility.js +83 -0
  469. package/dist/core/runtime/spawn.js +10 -22
  470. package/dist/core/runtime/stop-guard.d.ts +1 -1
  471. package/dist/core/runtime/stop-guard.js +18 -13
  472. package/dist/core/runtime/surface-bg.js +1 -1
  473. package/dist/core/runtime/tmux-chrome.d.ts +1 -1
  474. package/dist/core/runtime/tmux-chrome.js +1 -1
  475. package/dist/core/runtime/tmux.d.ts +35 -7
  476. package/dist/core/runtime/tmux.js +439 -62
  477. package/dist/core/runtime/tool-group-summary.d.ts +19 -0
  478. package/dist/core/runtime/tool-group-summary.js +88 -0
  479. package/dist/core/scope.d.ts +2 -7
  480. package/dist/core/scope.js +9 -35
  481. package/dist/core/substrate/schema.d.ts +2 -2
  482. package/dist/core/termrender/code-doc.d.ts +12 -0
  483. package/dist/core/termrender/code-doc.js +92 -0
  484. package/dist/core/termrender/display.d.ts +12 -0
  485. package/dist/core/termrender/display.js +19 -0
  486. package/dist/core/termrender/termrender.d.ts +73 -0
  487. package/dist/core/termrender/termrender.js +795 -0
  488. package/dist/core/termrender/version.d.ts +1 -0
  489. package/dist/core/termrender/version.js +1 -0
  490. package/dist/core/tui/terminal.js +1 -2
  491. package/dist/core/user-settings.d.ts +71 -3
  492. package/dist/core/user-settings.js +83 -1
  493. package/dist/daemon/api/__tests__/inbox.test.js +44 -133
  494. package/dist/daemon/api/handlers/human.d.ts +0 -10
  495. package/dist/daemon/api/handlers/human.js +104 -702
  496. package/dist/daemon/api/handlers/inbox.js +113 -142
  497. package/dist/daemon/api/handlers/review-comments.d.ts +2 -0
  498. package/dist/daemon/api/handlers/review-comments.js +500 -0
  499. package/dist/daemon/api/handlers/reviews.d.ts +2 -0
  500. package/dist/daemon/api/handlers/reviews.js +287 -0
  501. package/dist/daemon/api/map.d.ts +22 -7
  502. package/dist/daemon/api/map.js +159 -11
  503. package/dist/daemon/api/server.js +4 -0
  504. package/dist/daemon/cron-run.js +6 -9
  505. package/dist/daemon/crtrd.js +17 -33
  506. package/dist/daemon/fleet.d.ts +1 -8
  507. package/dist/daemon/fleet.js +4 -30
  508. package/dist/daemon/human/finish.d.ts +14 -0
  509. package/dist/daemon/human/finish.js +115 -0
  510. package/dist/daemon/human/sweep.d.ts +6 -0
  511. package/dist/daemon/human/sweep.js +49 -0
  512. package/dist/daemon/messaging/node-message.d.ts +18 -0
  513. package/dist/daemon/messaging/node-message.js +70 -0
  514. package/dist/daemon/review/comment-notify.d.ts +26 -0
  515. package/dist/daemon/review/comment-notify.js +107 -0
  516. package/dist/daemon/review/deliver.d.ts +7 -0
  517. package/dist/daemon/review/deliver.js +56 -0
  518. package/dist/daemon/review/finish.d.ts +22 -0
  519. package/dist/daemon/review/finish.js +254 -0
  520. package/dist/daemon/review/sweep.d.ts +11 -0
  521. package/dist/daemon/review/sweep.js +120 -0
  522. package/dist/index.d.ts +2 -0
  523. package/dist/index.js +2 -2
  524. package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +42 -64
  525. package/dist/pi-extensions/__tests__/canvas-recap.test.d.ts +1 -0
  526. package/dist/pi-extensions/__tests__/canvas-recap.test.js +159 -0
  527. package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +16 -38
  528. package/dist/pi-extensions/__tests__/canvas-structured-output.test.d.ts +1 -0
  529. package/dist/pi-extensions/__tests__/canvas-structured-output.test.js +63 -0
  530. package/dist/pi-extensions/canvas-context-intro.d.ts +8 -11
  531. package/dist/pi-extensions/canvas-context-intro.js +50 -104
  532. package/dist/pi-extensions/canvas-recap.d.ts +15 -2
  533. package/dist/pi-extensions/canvas-recap.js +192 -69
  534. package/dist/pi-extensions/canvas-review-boundary.d.ts +59 -0
  535. package/dist/pi-extensions/canvas-review-boundary.js +81 -0
  536. package/dist/pi-extensions/canvas-stophook.d.ts +3 -3
  537. package/dist/pi-extensions/canvas-stophook.js +78 -128
  538. package/dist/pi-extensions/canvas-structured-output.js +52 -8
  539. package/dist/shared/generated-context.d.ts +29 -4
  540. package/dist/shared/generated-context.js +122 -7
  541. package/dist/shared/tool-groups.d.ts +23 -0
  542. package/dist/shared/tool-groups.js +60 -0
  543. package/dist/shared/working-activity.d.ts +8 -0
  544. package/dist/shared/working-activity.js +26 -0
  545. package/dist/types.d.ts +36 -2
  546. package/dist/types.js +51 -0
  547. package/dist/web-client/assets/index-CCPaLeW7.css +2 -0
  548. package/dist/web-client/assets/index-kyOWsnZK.js +86 -0
  549. package/dist/web-client/index.html +2 -2
  550. package/dist/web-client/sw.js +1 -1
  551. package/docs/compat/hearth-crtr-v4.md +2 -2
  552. package/docs/compat/hearth-crtr-v5.md +4 -2
  553. package/docs/public-api.md +3 -3
  554. package/package.json +21 -14
  555. package/runtime.lock.json +4661 -1453
  556. package/scripts/postinstall.mjs +15 -2
  557. package/dist/builtin-pi-packages/pi-mode-switch/README.md +0 -36
  558. package/dist/builtin-pi-packages/pi-mode-switch/bin/mode +0 -36
  559. package/dist/builtin-pi-packages/pi-mode-switch/extensions/index.ts +0 -449
  560. package/dist/builtin-pi-packages/pi-mode-switch/package.json +0 -14
  561. package/dist/builtin-pi-packages/pi-mode-switch/tsconfig.json +0 -9
  562. package/dist/builtin-views/_lib/states.mjs +0 -161
  563. package/dist/builtin-views/canvas/core.mjs +0 -657
  564. package/dist/builtin-views/canvas/text.mjs +0 -58
  565. package/dist/builtin-views/canvas/tui.mjs +0 -168
  566. package/dist/builtin-views/canvas/web.jsx +0 -121
  567. package/dist/builtin-views/chat/core.mjs +0 -684
  568. package/dist/builtin-views/chat/text.mjs +0 -101
  569. package/dist/builtin-views/chat/tui.mjs +0 -360
  570. package/dist/builtin-views/chat/web.jsx +0 -362
  571. package/dist/builtin-views/git-pr/core.mjs +0 -673
  572. package/dist/builtin-views/git-pr/text.mjs +0 -84
  573. package/dist/builtin-views/git-pr/tui.mjs +0 -301
  574. package/dist/builtin-views/git-pr/web.jsx +0 -216
  575. package/dist/builtin-views/inbox/_lib/render.mjs +0 -175
  576. package/dist/builtin-views/inbox/core.mjs +0 -1273
  577. package/dist/builtin-views/inbox/text.mjs +0 -73
  578. package/dist/builtin-views/inbox/tui.mjs +0 -314
  579. package/dist/builtin-views/inbox/web.jsx +0 -188
  580. package/dist/builtin-views/linkedin/core.mjs +0 -906
  581. package/dist/builtin-views/linkedin/text.mjs +0 -69
  582. package/dist/builtin-views/linkedin/tui.mjs +0 -413
  583. package/dist/builtin-views/linkedin/web.jsx +0 -206
  584. package/dist/builtin-views/prompt-review/core.mjs +0 -735
  585. package/dist/builtin-views/prompt-review/text.mjs +0 -15
  586. package/dist/builtin-views/prompt-review/tui.mjs +0 -196
  587. package/dist/builtin-views/prompt-review/web.jsx +0 -484
  588. package/dist/builtin-views/workspace-sidebar/__tests__/core.test.js +0 -50
  589. package/dist/builtin-views/workspace-sidebar/__tests__/core.test.ts +0 -53
  590. package/dist/builtin-views/workspace-sidebar/core.mjs +0 -670
  591. package/dist/builtin-views/workspace-sidebar/text.mjs +0 -53
  592. package/dist/builtin-views/workspace-sidebar/tui.mjs +0 -141
  593. package/dist/builtin-views/workspace-sidebar/web.jsx +0 -109
  594. package/dist/clients/attach/session/mode.d.ts +0 -25
  595. package/dist/clients/attach/session/mode.js +0 -97
  596. package/dist/commands/sys/promptstudio.d.ts +0 -2
  597. package/dist/commands/sys/promptstudio.js +0 -65
  598. package/dist/commands/view-cycle.d.ts +0 -2
  599. package/dist/commands/view-cycle.js +0 -130
  600. package/dist/commands/view-list.d.ts +0 -2
  601. package/dist/commands/view-list.js +0 -66
  602. package/dist/commands/view-new.d.ts +0 -2
  603. package/dist/commands/view-new.js +0 -74
  604. package/dist/commands/view-pick.d.ts +0 -6
  605. package/dist/commands/view-pick.js +0 -129
  606. package/dist/commands/view-run.d.ts +0 -2
  607. package/dist/commands/view-run.js +0 -214
  608. package/dist/commands/view.d.ts +0 -2
  609. package/dist/commands/view.js +0 -31
  610. package/dist/commands/workspace.d.ts +0 -2
  611. package/dist/commands/workspace.js +0 -165
  612. package/dist/core/__tests__/chat-view-reconnect.test.js +0 -105
  613. package/dist/core/__tests__/full/consult-startup-failure.test.js +0 -124
  614. package/dist/core/canvas/__tests__/human-work-outbox.test.js +0 -123
  615. package/dist/core/canvas/human-work-outbox.d.ts +0 -73
  616. package/dist/core/canvas/human-work-outbox.js +0 -261
  617. package/dist/core/command-plugins/store.d.ts +0 -16
  618. package/dist/core/command-plugins/store.js +0 -64
  619. package/dist/core/keybindings/__tests__/bespoke-consumers.test.js +0 -40
  620. package/dist/core/runtime/fault-recovery-nudge.d.ts +0 -3
  621. package/dist/core/runtime/fault-recovery-nudge.js +0 -3
  622. package/dist/core/tui/__tests__/host-keybindings.test.js +0 -113
  623. package/dist/core/tui/host.d.ts +0 -66
  624. package/dist/core/view/__tests__/transport-cache.test.js +0 -62
  625. package/dist/core/view/bridge.d.ts +0 -10
  626. package/dist/core/view/bridge.js +0 -31
  627. package/dist/core/view/chrome.d.ts +0 -9
  628. package/dist/core/view/chrome.js +0 -22
  629. package/dist/core/view/contract.d.ts +0 -205
  630. package/dist/core/view/contract.js +0 -23
  631. package/dist/core/view/loader.d.ts +0 -31
  632. package/dist/core/view/loader.js +0 -188
  633. package/dist/core/view/stream-local.d.ts +0 -3
  634. package/dist/core/view/stream-local.js +0 -231
  635. package/dist/core/view/transport-cache.d.ts +0 -8
  636. package/dist/core/view/transport-cache.js +0 -38
  637. package/dist/core/view/transport-local.d.ts +0 -7
  638. package/dist/core/view/transport-local.js +0 -83
  639. package/dist/core/view/transport-remote.d.ts +0 -2
  640. package/dist/core/view/transport.d.ts +0 -10
  641. package/dist/core/view/transport.js +0 -15
  642. package/dist/pi-extensions/naming-tool.d.ts +0 -24
  643. package/dist/pi-extensions/naming-tool.js +0 -67
  644. package/dist/prompts/view.d.ts +0 -7
  645. package/dist/prompts/view.js +0 -172
  646. package/dist/web/ViewChrome.d.ts +0 -7
  647. package/dist/web/ViewChrome.js +0 -28
  648. package/dist/web/ViewPane.d.ts +0 -39
  649. package/dist/web/ViewPane.js +0 -48
  650. package/dist/web/index.d.ts +0 -8
  651. package/dist/web/index.js +0 -22
  652. package/dist/web/runtime.d.ts +0 -39
  653. package/dist/web/runtime.js +0 -232
  654. package/dist/web/states.d.ts +0 -24
  655. package/dist/web/states.js +0 -24
  656. package/dist/web/transport-http.d.ts +0 -5
  657. package/dist/web/transport-http.js +0 -34
  658. package/dist/web/transport-stream.d.ts +0 -3
  659. package/dist/web/transport-stream.js +0 -204
  660. package/dist/web-client/assets/index-U_NZ66VE.js +0 -79
  661. package/dist/web-client/assets/index-aaeu4adv.css +0 -2
  662. /package/dist/{builtin-views/workspace-sidebar/__tests__/core.test.d.ts → clients/attach/__tests__/file-review-focus.test.d.ts} +0 -0
  663. /package/dist/clients/attach/__tests__/{visible-paths.test.d.ts → group-activity.test.d.ts} +0 -0
  664. /package/dist/{core/__tests__/chat-view-reconnect.test.d.ts → clients/attach/__tests__/input-controller-extension-command.test.d.ts} +0 -0
  665. /package/dist/{core/__tests__/full/consult-startup-failure.test.d.ts → clients/attach/__tests__/session-identity-refresh.test.d.ts} +0 -0
  666. /package/dist/{core/canvas/__tests__/human-work-outbox.test.d.ts → clients/inbox/__tests__/inbox-controller.test.d.ts} +0 -0
  667. /package/dist/{core/keybindings/__tests__/bespoke-consumers.test.d.ts → clients/inbox/__tests__/mount-panel.test.d.ts} +0 -0
  668. /package/dist/{core/tui/__tests__/host-keybindings.test.d.ts → clients/inbox/review/__tests__/editor-roundtrip.test.d.ts} +0 -0
  669. /package/dist/{core/view/__tests__/transport-cache.test.d.ts → clients/inbox/review/__tests__/remap.test.d.ts} +0 -0
  670. /package/dist/{core/view/__tests__/transport-remote.test.d.ts → clients/inbox/review/__tests__/review-core.test.d.ts} +0 -0
@@ -0,0 +1,80 @@
1
+ // render/scroll-animation.ts — smooth keyboard scrolling for the transcript.
2
+ //
3
+ // A scroll step follows a short ease-out trajectory rather than teleporting.
4
+ // Each timer opportunity resolves its position from elapsed time, so a delayed
5
+ // render skips stale deltas and still lands at the intended position on time.
6
+ // Repeated presses fold the untravelled distance into a fresh trajectory rather
7
+ // than building a lagging queue.
8
+ import { performance } from 'node:perf_hooks';
9
+ /** Duration of the full ease-out trajectory, including the synchronous start. */
10
+ const BURST_MS = 100;
11
+ /** Leave enough time between visible positions for the terminal to present them. */
12
+ const FRAME_MS = 25;
13
+ /** Fraction of the viewport each press travels — a half page keeps context in view. */
14
+ const PAGE_FRACTION = 0.5;
15
+ /** Start partway through the trajectory so the keypress moves synchronously. */
16
+ const INITIAL_PROGRESS = 0.15;
17
+ function easeOut(t) {
18
+ return 1 - (1 - t) * (1 - t);
19
+ }
20
+ export function createScrollAnimator(viewport, requestRender) {
21
+ let timer;
22
+ let startedAt = 0;
23
+ let target = 0;
24
+ let travelled = 0;
25
+ const stop = () => {
26
+ if (timer !== undefined)
27
+ clearTimeout(timer);
28
+ timer = undefined;
29
+ target = 0;
30
+ travelled = 0;
31
+ };
32
+ const schedule = (now) => {
33
+ const remaining = Math.max(0, startedAt + BURST_MS - now);
34
+ timer = setTimeout(() => {
35
+ timer = undefined;
36
+ advance(performance.now(), true);
37
+ }, Math.min(FRAME_MS, remaining));
38
+ };
39
+ const advance = (now, scheduleNext) => {
40
+ const progress = Math.min(1, (now - startedAt) / BURST_MS);
41
+ const position = Math.round(target * easeOut(progress));
42
+ const step = position - travelled;
43
+ if (step !== 0) {
44
+ // A clamped scroll (already at an end of the transcript) reports no state
45
+ // change — no later point on this trajectory can help, so stop early.
46
+ if (!viewport.scrollBy(step))
47
+ return stop();
48
+ travelled = position;
49
+ requestRender();
50
+ }
51
+ if (progress === 1)
52
+ return stop();
53
+ if (scheduleNext)
54
+ schedule(now);
55
+ };
56
+ return {
57
+ page(direction) {
58
+ const now = performance.now();
59
+ if (timer !== undefined) {
60
+ clearTimeout(timer);
61
+ timer = undefined;
62
+ // Bring the old trajectory to its current time before carrying only its
63
+ // untravelled distance into this newly pressed page.
64
+ advance(now, false);
65
+ }
66
+ const pending = target - travelled;
67
+ const step = Math.max(1, Math.round(viewport.pageRows() * PAGE_FRACTION));
68
+ const delta = (direction === 'up' ? -1 : 1) * step;
69
+ target = pending + delta;
70
+ travelled = 0;
71
+ if (target === 0)
72
+ return stop();
73
+ // The first position is immediately visible to input handling, while its
74
+ // virtual start keeps every later position on one time-based curve.
75
+ startedAt = now - BURST_MS * INITIAL_PROGRESS;
76
+ advance(now, true);
77
+ },
78
+ cancel: stop,
79
+ };
80
+ }
@@ -55,11 +55,11 @@ function lineChangesDisplay(changes, theme) {
55
55
  counts.push(theme.fg('toolDiffRemoved', `-${changes.removed}`));
56
56
  return counts.length > 0 ? ` ${counts.join(' ')}` : '';
57
57
  }
58
- /** A write has no before/after diff, so report its output size neutrally. */
58
+ /** A write has no before/after diff, so report every output line as added. */
59
59
  function lineCountDisplay(lines, theme) {
60
60
  if (lines === undefined)
61
61
  return '';
62
- return ` ${theme.fg('muted', `${lines} ${lines === 1 ? 'line' : 'lines'}`)}`;
62
+ return ` ${theme.fg('toolDiffAdded', `+${lines}`)}`;
63
63
  }
64
64
  /** The one-line folded form of a file tool's call: `<icon> <label> <path>`,
65
65
  * optionally followed by its green/red changed-line counts. */
@@ -72,15 +72,15 @@ function shortenPath(path) {
72
72
  const home = homedir();
73
73
  return path.startsWith(home) ? `~${path.slice(home.length)}` : path;
74
74
  }
75
- /** Accent-colored, OSC-8-linked path — the same affordance pi gives file tools. */
75
+ /** Plain, OSC-8-linked path — the same affordance pi gives file tools. */
76
76
  function pathDisplay(rawPath, theme, cwd) {
77
77
  if (!rawPath)
78
78
  return theme.fg('toolOutput', '...');
79
- const styled = theme.fg('accent', shortenPath(rawPath));
79
+ const path = shortenPath(rawPath);
80
80
  if (!getCapabilities().hyperlinks)
81
- return styled;
81
+ return path;
82
82
  const absolute = isAbsolute(rawPath) ? rawPath : resolve(cwd, rawPath);
83
- return hyperlink(styled, pathToFileURL(absolute).href);
83
+ return hyperlink(path, pathToFileURL(absolute).href);
84
84
  }
85
85
  /** `<icon> <label>` — the glyph in accent, the tool name in pi's tool title style. */
86
86
  function header(icon, label, theme) {
@@ -0,0 +1,9 @@
1
+ import type { ChatView } from './chat-view.js';
2
+ import type { ViewportSource } from './measured-container.js';
3
+ import type { TranscriptViewport } from './viewport.js';
4
+ export type CopyTarget = 'message' | 'last-assistant' | 'tool' | 'transcript';
5
+ export interface TranscriptCopy {
6
+ /** Copy `target`; returns the status-region confirmation to show. */
7
+ copy(target: CopyTarget): string;
8
+ }
9
+ export declare function createTranscriptCopy(chat: ChatView, viewport: TranscriptViewport, source: ViewportSource): TranscriptCopy;
@@ -0,0 +1,81 @@
1
+ import { writeClipboardTextEverywhere } from '../../../core/clipboard-text.js';
2
+ function hasText(text) {
3
+ return text !== undefined && text.trim() !== '';
4
+ }
5
+ function lineCount(text) {
6
+ return text.split('\n').length;
7
+ }
8
+ function copiedTo(system, tmux) {
9
+ if (system && tmux)
10
+ return 'clipboard + tmux buffer';
11
+ if (system)
12
+ return 'clipboard';
13
+ if (tmux)
14
+ return 'tmux buffer';
15
+ return undefined;
16
+ }
17
+ /** Resolves the newest copyable block wholly visible before falling back to one
18
+ * merely intersecting the current viewport. */
19
+ function visibleMessageText(chat, viewport, source) {
20
+ const { first, last, lastFullyVisible } = viewport.visibleBlocks();
21
+ const textAt = (index) => {
22
+ const block = source.blockAt(index);
23
+ return block ? chat.blockText(block) : undefined;
24
+ };
25
+ for (let index = Math.min(last, lastFullyVisible); index >= first; index--) {
26
+ const text = textAt(index);
27
+ if (hasText(text))
28
+ return text;
29
+ }
30
+ for (let index = last; index >= first; index--) {
31
+ const text = textAt(index);
32
+ if (hasText(text))
33
+ return text;
34
+ }
35
+ return undefined;
36
+ }
37
+ export function createTranscriptCopy(chat, viewport, source) {
38
+ return {
39
+ copy(target) {
40
+ let resolved;
41
+ let emptyNotice;
42
+ switch (target) {
43
+ case 'message': {
44
+ const text = visibleMessageText(chat, viewport, source);
45
+ if (hasText(text))
46
+ resolved = { text, label: 'message' };
47
+ emptyNotice = 'Nothing to copy — no visible message';
48
+ break;
49
+ }
50
+ case 'last-assistant': {
51
+ const text = chat.getLastAssistantText();
52
+ if (hasText(text))
53
+ resolved = { text, label: 'last assistant message' };
54
+ emptyNotice = 'Nothing to copy — no assistant message yet';
55
+ break;
56
+ }
57
+ case 'tool': {
58
+ const text = chat.getLastToolOutputText();
59
+ if (hasText(text))
60
+ resolved = { text, label: 'tool output' };
61
+ emptyNotice = 'Nothing to copy — no tool output yet';
62
+ break;
63
+ }
64
+ case 'transcript': {
65
+ const text = chat.getTranscriptPlainText();
66
+ if (hasText(text))
67
+ resolved = { text, label: 'transcript' };
68
+ emptyNotice = 'Nothing to copy — transcript is empty';
69
+ break;
70
+ }
71
+ }
72
+ if (!resolved)
73
+ return emptyNotice;
74
+ const { system, tmux } = writeClipboardTextEverywhere(resolved.text);
75
+ const destination = copiedTo(system, tmux);
76
+ if (!destination)
77
+ return 'Copy failed — no clipboard tool found';
78
+ return `Copied ${resolved.label} (${lineCount(resolved.text)} lines) — ${destination}`;
79
+ },
80
+ };
81
+ }
@@ -0,0 +1,29 @@
1
+ import type { ViewportSource } from './measured-container.js';
2
+ /** The flat block range occupied by the most recently rendered viewport. */
3
+ type VisibleBlocks = {
4
+ first: number;
5
+ last: number;
6
+ lastFullyVisible: number;
7
+ };
8
+ /**
9
+ * A virtualized, identity-anchored transcript viewport. It owns only scroll
10
+ * state; all measurement and line caching remain with its ViewportSource.
11
+ */
12
+ export interface TranscriptViewport {
13
+ /** Exactly `rows` lines, bottom-aligned and top-padded with empty rows. */
14
+ renderSlice(width: number, rows: number): string[];
15
+ /** Scroll by `lines` (negative = toward older content). */
16
+ scrollBy(lines: number): boolean;
17
+ /** Lines in one page jump — the viewport height less one overlap row. */
18
+ pageRows(): number;
19
+ /** Pin back to the live bottom. */
20
+ goLive(): void;
21
+ /** True while the viewport is pinned to the bottom. */
22
+ isLive(): boolean;
23
+ /** Flat blocks intersecting the visible slice and its last whole block. */
24
+ visibleBlocks(): VisibleBlocks;
25
+ /** Forward frame invalidation without exposing the source to the frame. */
26
+ invalidate(): void;
27
+ }
28
+ export declare function createTranscriptViewport(source: ViewportSource): TranscriptViewport;
29
+ export {};
@@ -0,0 +1,159 @@
1
+ /** Exactly one line retained for each clipped row of an inline-image block. */
2
+ const CLIPPED_IMAGE_ROW = '\x1b[2m⌸ image — scroll to view\x1b[22m';
3
+ const NO_VISIBLE_BLOCKS = { first: -1, last: -1, lastFullyVisible: -1 };
4
+ function isInlineImageBlock(lines) {
5
+ return lines.some((line) => line.includes('\x1b_G') || line.includes('\x1b]1337;File='));
6
+ }
7
+ /** The first block whose rendered range extends beyond `line`. */
8
+ function firstBlockAfter(source, line, width) {
9
+ let low = 0;
10
+ let high = source.blockCount();
11
+ while (low < high) {
12
+ const middle = Math.floor((low + high) / 2);
13
+ const end = source.blockStart(middle, width) + source.blockHeight(middle, width);
14
+ if (end > line)
15
+ high = middle;
16
+ else
17
+ low = middle + 1;
18
+ }
19
+ return low;
20
+ }
21
+ export function createTranscriptViewport(source) {
22
+ const state = { follow: true, anchor: undefined };
23
+ let lastWidth;
24
+ let lastRows = 0;
25
+ let cachedVisibleBlocks = NO_VISIBLE_BLOCKS;
26
+ let cachedVisibleRevision;
27
+ /** Resolve the identity anchor only against the source's current measurements. */
28
+ function resolveTop(width, rows, total) {
29
+ const bottom = Math.max(0, total - rows);
30
+ if (state.follow)
31
+ return bottom;
32
+ if (!state.anchor) {
33
+ state.follow = true;
34
+ return bottom;
35
+ }
36
+ const anchoredTop = source.anchorLine(state.anchor, width);
37
+ if (anchoredTop === undefined) {
38
+ state.follow = true;
39
+ state.anchor = undefined;
40
+ return bottom;
41
+ }
42
+ return Math.min(Math.max(0, anchoredTop), bottom);
43
+ }
44
+ function visibleRange(width, rows, total, top) {
45
+ const bottom = Math.min(total, top + rows);
46
+ if (top >= bottom)
47
+ return { top, bottom, total, blocks: NO_VISIBLE_BLOCKS };
48
+ const count = source.blockCount();
49
+ let index = firstBlockAfter(source, top, width);
50
+ let first = -1;
51
+ let last = -1;
52
+ let lastFullyVisible = -1;
53
+ while (index < count) {
54
+ const start = source.blockStart(index, width);
55
+ if (start >= bottom)
56
+ break;
57
+ const height = source.blockHeight(index, width);
58
+ const end = start + height;
59
+ if (end > top) {
60
+ if (first === -1)
61
+ first = index;
62
+ last = index;
63
+ if (start >= top && end <= bottom)
64
+ lastFullyVisible = index;
65
+ }
66
+ index++;
67
+ }
68
+ return { top, bottom, total, blocks: first === -1 ? NO_VISIBLE_BLOCKS : { first, last, lastFullyVisible } };
69
+ }
70
+ function currentSlice() {
71
+ if (lastWidth === undefined || lastRows <= 0)
72
+ return undefined;
73
+ const total = source.totalHeight(lastWidth);
74
+ const top = resolveTop(lastWidth, lastRows, total);
75
+ return visibleRange(lastWidth, lastRows, total, top);
76
+ }
77
+ return {
78
+ renderSlice(width, rows) {
79
+ const viewportRows = Math.max(0, rows);
80
+ lastWidth = width;
81
+ lastRows = viewportRows;
82
+ if (viewportRows === 0) {
83
+ cachedVisibleBlocks = NO_VISIBLE_BLOCKS;
84
+ cachedVisibleRevision = source.revision();
85
+ return [];
86
+ }
87
+ const total = source.totalHeight(width);
88
+ const top = resolveTop(width, viewportRows, total);
89
+ const slice = visibleRange(width, viewportRows, total, top);
90
+ const content = [];
91
+ for (let index = slice.blocks.first; index !== -1 && index <= slice.blocks.last; index++) {
92
+ const start = source.blockStart(index, width);
93
+ const lines = source.blockLines(index, width);
94
+ const height = source.blockHeight(index, width);
95
+ const end = start + height;
96
+ const visibleStart = Math.max(0, slice.top - start);
97
+ const visibleEnd = Math.min(height, slice.bottom - start);
98
+ if (visibleStart >= visibleEnd)
99
+ continue;
100
+ const partiallyClipped = start < slice.top || end > slice.bottom;
101
+ if (partiallyClipped && isInlineImageBlock(lines)) {
102
+ content.push(...Array(visibleEnd - visibleStart).fill(CLIPPED_IMAGE_ROW));
103
+ }
104
+ else {
105
+ content.push(...lines.slice(visibleStart, visibleEnd));
106
+ }
107
+ }
108
+ const padded = content.length >= viewportRows
109
+ ? content.slice(0, viewportRows)
110
+ : [...Array(viewportRows - content.length).fill(''), ...content];
111
+ cachedVisibleBlocks = slice.blocks;
112
+ cachedVisibleRevision = source.revision();
113
+ return padded;
114
+ },
115
+ scrollBy(lines) {
116
+ if (lastWidth === undefined || lastRows <= 0 || lines === 0)
117
+ return false;
118
+ const beforeFollow = state.follow;
119
+ const beforeAnchor = state.anchor;
120
+ const total = source.totalHeight(lastWidth);
121
+ const currentTop = resolveTop(lastWidth, lastRows, total);
122
+ const bottom = Math.max(0, total - lastRows);
123
+ const newTop = Math.min(Math.max(0, currentTop + lines), bottom);
124
+ if (newTop >= bottom) {
125
+ state.follow = true;
126
+ state.anchor = undefined;
127
+ }
128
+ else {
129
+ state.follow = false;
130
+ state.anchor = source.anchorAt(newTop, lastWidth);
131
+ if (!state.anchor)
132
+ state.follow = true;
133
+ }
134
+ return state.follow !== beforeFollow || state.anchor !== beforeAnchor;
135
+ },
136
+ pageRows() {
137
+ return Math.max(0, lastRows - 1);
138
+ },
139
+ goLive() {
140
+ state.follow = true;
141
+ state.anchor = undefined;
142
+ },
143
+ isLive() {
144
+ return state.follow;
145
+ },
146
+ visibleBlocks() {
147
+ const revision = source.revision();
148
+ if (cachedVisibleRevision === revision)
149
+ return cachedVisibleBlocks;
150
+ const slice = currentSlice();
151
+ cachedVisibleBlocks = slice?.blocks ?? NO_VISIBLE_BLOCKS;
152
+ cachedVisibleRevision = revision;
153
+ return cachedVisibleBlocks;
154
+ },
155
+ invalidate() {
156
+ source.invalidate();
157
+ },
158
+ };
159
+ }
@@ -1,14 +1,17 @@
1
- import { type AttachBindingId, type BindingId, type BindingResolution } from '../../../core/keybindings/index.js';
1
+ import { type AttachBindingId, type BindingId, type BindingResolution, type UserKeybindingSettings } from '../../../core/keybindings/index.js';
2
2
  export type { AttachBindingId } from '../../../core/keybindings/index.js';
3
3
  export type AttachBindings = BindingResolution<BindingId>;
4
4
  export type AttachActions = Record<AttachBindingId, () => void>;
5
+ export declare const ATTACH_VIEWPORT_BINDINGS: readonly ["crtr.attach.scroll.up", "crtr.attach.scroll.down", "crtr.attach.scroll.page-up", "crtr.attach.scroll.page-down", "crtr.attach.scroll.live", "crtr.attach.mouse.toggle", "crtr.attach.copy.message"];
6
+ export type AttachViewportBindingId = typeof ATTACH_VIEWPORT_BINDINGS[number];
7
+ export type AttachViewportActions = Record<AttachViewportBindingId, () => void>;
5
8
  export { inboxOpenHint } from '../../../core/keybindings/index.js';
6
- export declare function matchesAttachBinding(bindings: AttachBindings, id: AttachBindingId, data: string): boolean;
9
+ export declare function matchesAttachBinding(bindings: AttachBindings, id: BindingId, data: string): boolean;
7
10
  export declare function dispatchAttachAction(id: AttachBindingId, actions: AttachActions): void;
8
11
  export declare function dispatchAttachBinding(bindings: AttachBindings, data: string, actions: AttachActions): boolean;
12
+ export declare function dispatchAttachViewportBinding(bindings: AttachBindings, data: string, actions: AttachViewportActions): boolean;
9
13
  export declare function detachHint(bindings: AttachBindings): string | undefined;
10
- /** Re-resolve the user's binding catalog and republish it to every consumer:
11
- * the graph overlay's own snapshot and (in tmux) the crouter-owned tmux
12
- * bindings. Binding diagnostics must never fail an attach, so an install error
13
- * is swallowed. */
14
- export declare function refreshAttachBindingSnapshot(resolve: () => AttachBindings, setGraphBindings: (bindings: AttachBindings) => void, inTmuxNow: () => boolean, install: (bindings: AttachBindings) => void): AttachBindings;
14
+ /** Re-resolve the user's binding settings once and republish the same snapshot
15
+ * to every consumer: attach dispatch, the graph overlay, and tmux. Binding
16
+ * diagnostics must never fail an attach, so an install error is swallowed. */
17
+ export declare function refreshAttachBindingSnapshot(resolve: () => UserKeybindingSettings, setGraphBindings: (bindings: AttachBindings) => void, inTmuxNow: () => boolean, install: (bindings: AttachBindings, tmuxPassthrough: readonly BindingId[]) => void): UserKeybindingSettings;
@@ -6,6 +6,13 @@
6
6
  // literals, so a user's rebind is honored by the viewer and tmux alike.
7
7
  import { matchesKey } from '@earendil-works/pi-tui';
8
8
  import { ATTACH_CONTROL_BINDINGS, formatBinding, matchesPiTuiInput, } from '../../../core/keybindings/index.js';
9
+ export const ATTACH_VIEWPORT_BINDINGS = [
10
+ 'crtr.attach.scroll.up', 'crtr.attach.scroll.down',
11
+ 'crtr.attach.scroll.page-up', 'crtr.attach.scroll.page-down',
12
+ 'crtr.attach.scroll.live',
13
+ 'crtr.attach.mouse.toggle',
14
+ 'crtr.attach.copy.message',
15
+ ];
9
16
  export { inboxOpenHint } from '../../../core/keybindings/index.js';
10
17
  export function matchesAttachBinding(bindings, id, data) {
11
18
  return matchesPiTuiInput(bindings, id, data, (input, gesture) => matchesKey(input, gesture));
@@ -22,6 +29,15 @@ export function dispatchAttachBinding(bindings, data, actions) {
22
29
  }
23
30
  return false;
24
31
  }
32
+ export function dispatchAttachViewportBinding(bindings, data, actions) {
33
+ for (const actionId of ATTACH_VIEWPORT_BINDINGS) {
34
+ if (matchesAttachBinding(bindings, actionId, data)) {
35
+ actions[actionId]();
36
+ return true;
37
+ }
38
+ }
39
+ return false;
40
+ }
25
41
  export function detachHint(bindings) {
26
42
  for (const id of ['crtr.attach.clear-or-detach', 'crtr.attach.detach']) {
27
43
  if (bindings.gestures(id).length > 0)
@@ -29,18 +45,17 @@ export function detachHint(bindings) {
29
45
  }
30
46
  return undefined;
31
47
  }
32
- /** Re-resolve the user's binding catalog and republish it to every consumer:
33
- * the graph overlay's own snapshot and (in tmux) the crouter-owned tmux
34
- * bindings. Binding diagnostics must never fail an attach, so an install error
35
- * is swallowed. */
48
+ /** Re-resolve the user's binding settings once and republish the same snapshot
49
+ * to every consumer: attach dispatch, the graph overlay, and tmux. Binding
50
+ * diagnostics must never fail an attach, so an install error is swallowed. */
36
51
  export function refreshAttachBindingSnapshot(resolve, setGraphBindings, inTmuxNow, install) {
37
- const bindings = resolve();
38
- setGraphBindings(bindings);
52
+ const settings = resolve();
53
+ setGraphBindings(settings.bindings);
39
54
  if (inTmuxNow()) {
40
55
  try {
41
- install(bindings);
56
+ install(settings.bindings, settings.tmuxPassthrough);
42
57
  }
43
58
  catch { /* attaching must not fail on binding diagnostics */ }
44
59
  }
45
- return bindings;
60
+ return settings;
46
61
  }
@@ -10,7 +10,7 @@
10
10
  import { createConnection } from 'node:net';
11
11
  import { viewSocketPath } from '../../../core/canvas/paths.js';
12
12
  import { BrokerClient, BrokerUnavailableError, RelayTransport } from '../../../core/broker-client/index.js';
13
- import { resolveRemoteCanvasTarget } from '../../../core/view/remote-canvas-target.js';
13
+ import { resolveRemoteCanvasTarget } from '../../../core/remote-canvas-target.js';
14
14
  import { ApiCanvasSource, cliCanvasSource, cliClient, rethrowAsCliError } from '../../../commands/api-client.js';
15
15
  import { InputError } from '../../../core/io.js';
16
16
  /** The hello handshake's initial role. A REMOTE attach (`--canvas`) is a
@@ -68,10 +68,9 @@ export async function connectToNode(nodeId, canvasName) {
68
68
  // not-found guard is wrong for `--canvas`. Build a minimal local `meta`
69
69
  // stand-in instead: `meta.cwd` is a legitimately viewer-local concern
70
70
  // (theming, this pane's own git status) — not a remote-node concern — so
71
- // pointing it at the CLI's own cwd is correct, not a hack. The mode-switch
72
- // file and the `getRow`-based reconnect give-up are the other local-canvas
73
- // dependencies `--canvas` must skip; both gate on `remote` at their own use
74
- // sites, not here.
71
+ // pointing it at the CLI's own cwd is correct, not a hack. The `getRow`-based
72
+ // reconnect give-up is the other local-canvas dependency `--canvas` must skip;
73
+ // it gates on `remote` at its own use site, not here.
75
74
  let meta;
76
75
  let nodeIdentity;
77
76
  let transport;
@@ -5,15 +5,17 @@ import type { NodeMeta } from '../../../core/canvas/types.js';
5
5
  import type { BrokerClient } from '../../../core/broker-client/index.js';
6
6
  import type { AttachPalette } from '../config.js';
7
7
  import type { TitledEditor } from '../input/titled-editor.js';
8
- /** The bottom-anchored chrome stack plus the scrolling chat, in render order.
8
+ /** The pinned cockpit plus transcript/header regions, in frame render order.
9
9
  * Owned by the layout step; every painter writes into exactly one of these. */
10
10
  export interface AttachContainers {
11
- /** Scrolling transcript — the only container above the chat/chrome divider. */
11
+ /** Scrolling transcript source, rendered by the virtualized viewport. */
12
12
  readonly chat: Container;
13
- /** The themed divider itself (suppressed while the recap widget is present). */
14
- readonly chrome: Container;
13
+ /** Pinned recap above the transcript; empty when no recap widget exists. */
14
+ readonly header: Container;
15
15
  /** Extension widgets placed `aboveEditor`, including the inactivity brief. */
16
16
  readonly aboveWidgets: Container;
17
+ /** Live activity loader, fixed at the top of the bottom region. */
18
+ readonly activity: Container;
17
19
  /** Relationship roster / wait rows, below the editor. */
18
20
  readonly reports: Container;
19
21
  /** Pending steering messages, above the editor. */
@@ -0,0 +1,34 @@
1
+ import { type Component, type Terminal } from '@earendil-works/pi-tui';
2
+ import type { TranscriptViewport } from '../render/viewport.js';
3
+ export declare const MIN_TRANSCRIPT_ROWS = 3;
4
+ export declare const HEADER_MAX_ROWS = 12;
5
+ export declare const EDITOR_MIN_ROWS = 1;
6
+ export declare const STATUS_ROWS = 1;
7
+ export type BottomSlot = 'queued' | 'aboveWidgets' | 'activity' | 'cockpitPadding' | 'editor' | 'pickerPanel' | 'belowWidgets' | 'reports' | 'footer';
8
+ /** Crop `lines` to `alloc` rows, guaranteeing the CURSOR_MARKER row survives
9
+ * (§2.1). No marker → the tail is kept. */
10
+ export declare function cropAroundCursor(lines: readonly string[], alloc: number): string[];
11
+ export interface ViewerFrameParts {
12
+ /** Rendered above the transcript; 0 rows when empty. */
13
+ header: Component;
14
+ viewport: TranscriptViewport;
15
+ /** The bottom slots, in VISUAL order, tagged with their allocation identity
16
+ * so the allocator can apply the §2.1 priority table. */
17
+ bottom: readonly {
18
+ slot: BottomSlot;
19
+ component: Component;
20
+ }[];
21
+ }
22
+ /** The TUI's ONE child. Renders exactly `terminal.rows` lines, every frame. */
23
+ export declare class ViewerFrame implements Component {
24
+ private readonly terminal;
25
+ private readonly parts;
26
+ private viewportRows;
27
+ constructor(terminal: Terminal, parts: ViewerFrameParts);
28
+ render(width: number): string[];
29
+ invalidate(): void;
30
+ /** Rows the transcript viewport got in the last frame — the page size. */
31
+ lastViewportRows(): number;
32
+ /** Retain exactly one editor marker if the focused editor rendered one. */
33
+ private ensureCursorMarker;
34
+ }