@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,228 @@
1
+ // Supported raw HTML for assistant Markdown in the attach viewer.
2
+ //
3
+ // This is deliberately a semantic allowlist, not an HTML renderer. Complete
4
+ // details/summary blocks become terminal disclosure rows, while kbd and mark
5
+ // become theme-styled inline text. Everything else stays literal, and Markdown
6
+ // code spans/fences are protected before the allowlist scanner runs.
7
+ const PROTECTED_PREFIX = '\u0000\u0001CRTR_HTML_CODE_';
8
+ const PROTECTED_SUFFIX = '\u0002';
9
+ const DETAILS_OPEN = /<details\b[^>]*>/gi;
10
+ const DETAILS_TAG = /<\/?details\b[^>]*>/gi;
11
+ const VALID_DETAILS_OPEN = /^<details(?:[ \t\r\n]+open)?[ \t\r\n]*>$/i;
12
+ const VALID_DETAILS_CLOSE = /^<\/details[ \t\r\n]*>$/i;
13
+ const SUMMARY_OPEN = /^[ \t\r\n]*<summary[ \t\r\n]*>/i;
14
+ const SUMMARY_CLOSE = /<\/summary[ \t\r\n]*>/i;
15
+ const INLINE_HTML = /<(kbd|mark)>([^<>\n]*?)<\/\1[ \t]*>/gi;
16
+ const SUPPORTED_HTML = /<(?:details|kbd|mark)\b/i;
17
+ function protectedToken(index) {
18
+ return `${PROTECTED_PREFIX}${index}${PROTECTED_SUFFIX}`;
19
+ }
20
+ function lineWithoutEnding(line) {
21
+ return line.endsWith('\n') ? line.slice(0, -1).replace(/\r$/, '') : line;
22
+ }
23
+ function protectFencedCode(source, protectedParts) {
24
+ const lines = source.match(/[^\n]*(?:\n|$)/g)?.filter((line) => line !== '') ?? [];
25
+ const out = [];
26
+ for (let index = 0; index < lines.length;) {
27
+ const openingLine = lineWithoutEnding(lines[index]);
28
+ const opening = /^ {0,3}(`{3,}|~{3,})[^\n]*$/.exec(openingLine);
29
+ if (!opening) {
30
+ out.push(lines[index]);
31
+ index++;
32
+ continue;
33
+ }
34
+ const marker = opening[1];
35
+ const markerChar = marker[0];
36
+ let end = index + 1;
37
+ for (; end < lines.length; end++) {
38
+ const candidate = lineWithoutEnding(lines[end]);
39
+ const closing = /^ {0,3}(`+|~+)[ \t]*$/.exec(candidate)?.[1];
40
+ if (closing?.[0] === markerChar && closing.length >= marker.length) {
41
+ end++;
42
+ break;
43
+ }
44
+ }
45
+ const raw = lines.slice(index, end).join('');
46
+ const tokenIndex = protectedParts.push(raw) - 1;
47
+ out.push(protectedToken(tokenIndex));
48
+ index = end;
49
+ }
50
+ return out.join('');
51
+ }
52
+ function protectInlineCode(source, protectedParts) {
53
+ let out = '';
54
+ let index = 0;
55
+ while (index < source.length) {
56
+ if (source[index] !== '`') {
57
+ out += source[index];
58
+ index++;
59
+ continue;
60
+ }
61
+ let openingEnd = index + 1;
62
+ while (source[openingEnd] === '`')
63
+ openingEnd++;
64
+ const markerLength = openingEnd - index;
65
+ let cursor = openingEnd;
66
+ let closingEnd = -1;
67
+ while (cursor < source.length) {
68
+ const next = source.indexOf('`', cursor);
69
+ if (next === -1)
70
+ break;
71
+ let runEnd = next + 1;
72
+ while (source[runEnd] === '`')
73
+ runEnd++;
74
+ if (runEnd - next === markerLength) {
75
+ closingEnd = runEnd;
76
+ break;
77
+ }
78
+ cursor = runEnd;
79
+ }
80
+ if (closingEnd === -1) {
81
+ out += source.slice(index, openingEnd);
82
+ index = openingEnd;
83
+ continue;
84
+ }
85
+ const tokenIndex = protectedParts.push(source.slice(index, closingEnd)) - 1;
86
+ out += protectedToken(tokenIndex);
87
+ index = closingEnd;
88
+ }
89
+ return out;
90
+ }
91
+ function protectMarkdownCode(source) {
92
+ const protectedParts = [];
93
+ const fenced = protectFencedCode(source, protectedParts);
94
+ const masked = protectInlineCode(fenced, protectedParts);
95
+ return {
96
+ masked,
97
+ restore: (text) => text.replace(/\u0000\u0001CRTR_HTML_CODE_(\d+)\u0002/g, (_whole, rawIndex) => protectedParts[Number(rawIndex)] ?? ''),
98
+ };
99
+ }
100
+ function isEscaped(source, index) {
101
+ let slashes = 0;
102
+ for (let cursor = index - 1; cursor >= 0 && source[cursor] === '\\'; cursor--)
103
+ slashes++;
104
+ return slashes % 2 === 1;
105
+ }
106
+ /** HTML phrasing content for this allowlist is plain text. Escape CommonMark's
107
+ * ASCII punctuation so a key label such as `[x]` cannot become a link, while
108
+ * the Markdown renderer removes the escapes from the displayed text. */
109
+ function escapeMarkdownInline(text) {
110
+ return [...text].map((char) => /[!-/:-@[-`{-~]/.test(char) ? `\\${char}` : char).join('');
111
+ }
112
+ function transformInlineHtml(text, styles) {
113
+ return text.replace(INLINE_HTML, (whole, rawTag, rawBody, offset) => {
114
+ if (isEscaped(text, offset))
115
+ return whole;
116
+ const tag = rawTag.toLowerCase();
117
+ const body = tag === 'kbd' ? rawBody.replace(/\s+/g, ' ').trim() : rawBody.trim();
118
+ if (body === '')
119
+ return whole;
120
+ const escaped = escapeMarkdownInline(body);
121
+ return tag === 'kbd' ? styles.kbd(escaped) : styles.mark(escaped);
122
+ });
123
+ }
124
+ function findDetailsRange(source, openEnd) {
125
+ DETAILS_TAG.lastIndex = openEnd;
126
+ let depth = 1;
127
+ let nested = false;
128
+ for (let match = DETAILS_TAG.exec(source); match; match = DETAILS_TAG.exec(source)) {
129
+ if (isEscaped(source, match.index))
130
+ continue;
131
+ const closing = /^<\//.test(match[0]);
132
+ if (closing) {
133
+ depth--;
134
+ if (depth === 0)
135
+ return { closeStart: match.index, closeTag: match[0], end: DETAILS_TAG.lastIndex, nested };
136
+ }
137
+ else {
138
+ depth++;
139
+ nested = true;
140
+ }
141
+ }
142
+ DETAILS_TAG.lastIndex = 0;
143
+ return undefined;
144
+ }
145
+ function renderDetails(source, openTag, openEnd, range, options) {
146
+ if (!VALID_DETAILS_OPEN.test(openTag) || !VALID_DETAILS_CLOSE.test(range.closeTag) || range.nested)
147
+ return undefined;
148
+ const inner = source.slice(openEnd, range.closeStart);
149
+ const summaryOpen = SUMMARY_OPEN.exec(inner);
150
+ if (!summaryOpen)
151
+ return undefined;
152
+ const afterSummaryOpen = summaryOpen[0].length;
153
+ const summaryClose = SUMMARY_CLOSE.exec(inner.slice(afterSummaryOpen));
154
+ if (!summaryClose)
155
+ return undefined;
156
+ const summaryEnd = afterSummaryOpen + summaryClose.index;
157
+ const summary = inner.slice(afterSummaryOpen, summaryEnd).trim();
158
+ if (summary === '')
159
+ return undefined;
160
+ const summaryRendered = transformInlineHtml(summary, options.styles);
161
+ const openByAttribute = /[ \t\r\n]open[ \t\r\n]*>$/i.test(openTag);
162
+ const expanded = options.detailsExpanded ?? openByAttribute;
163
+ const glyph = expanded ? '▾' : '▸';
164
+ if (!expanded)
165
+ return `${glyph} ${summaryRendered} ${options.styles.hint('— ctrl+o to expand')}`;
166
+ const bodyStart = summaryEnd + summaryClose[0].length;
167
+ const body = inner.slice(bodyStart).trim();
168
+ if (body === '')
169
+ return `${glyph} ${summaryRendered}`;
170
+ return `${glyph} ${summaryRendered}\n\n${transformInlineHtml(body, options.styles)}`;
171
+ }
172
+ /** Transform the strict supported HTML subset in one Markdown string. */
173
+ export function transformHtmlMarkdown(source, options) {
174
+ if (!SUPPORTED_HTML.test(source))
175
+ return source;
176
+ const protectedMarkdown = protectMarkdownCode(source);
177
+ const masked = protectedMarkdown.masked;
178
+ let out = '';
179
+ let cursor = 0;
180
+ DETAILS_OPEN.lastIndex = 0;
181
+ for (let match = DETAILS_OPEN.exec(masked); match; match = DETAILS_OPEN.exec(masked)) {
182
+ if (match.index < cursor)
183
+ continue;
184
+ const range = findDetailsRange(masked, DETAILS_OPEN.lastIndex);
185
+ if (!range) {
186
+ out += transformInlineHtml(masked.slice(cursor, match.index), options.styles);
187
+ out += masked.slice(match.index);
188
+ cursor = masked.length;
189
+ break;
190
+ }
191
+ out += transformInlineHtml(masked.slice(cursor, match.index), options.styles);
192
+ const whole = masked.slice(match.index, range.end);
193
+ if (isEscaped(masked, match.index)) {
194
+ out += whole;
195
+ }
196
+ else {
197
+ const rendered = renderDetails(masked, match[0], DETAILS_OPEN.lastIndex, range, options);
198
+ out += rendered ?? whole;
199
+ }
200
+ cursor = range.end;
201
+ DETAILS_OPEN.lastIndex = range.end;
202
+ }
203
+ if (cursor < masked.length)
204
+ out += transformInlineHtml(masked.slice(cursor), options.styles);
205
+ return protectedMarkdown.restore(out);
206
+ }
207
+ /** Copy an assistant message for terminal rendering, enhancing only text parts. */
208
+ export function transformMessageHtml(message, options) {
209
+ const content = message.content;
210
+ if (typeof content === 'string') {
211
+ const transformed = transformHtmlMarkdown(content, options);
212
+ return transformed === content ? message : { ...message, content: transformed };
213
+ }
214
+ if (!Array.isArray(content))
215
+ return message;
216
+ let changed = false;
217
+ const next = content.map((part) => {
218
+ const candidate = part;
219
+ if (candidate?.type !== 'text' || typeof candidate.text !== 'string')
220
+ return part;
221
+ const transformed = transformHtmlMarkdown(candidate.text, options);
222
+ if (transformed === candidate.text)
223
+ return part;
224
+ changed = true;
225
+ return { ...candidate, text: transformed };
226
+ });
227
+ return changed ? { ...message, content: next } : message;
228
+ }
@@ -0,0 +1,96 @@
1
+ import { Container, type Component } from '@earendil-works/pi-tui';
2
+ /** The block at the viewport's top row, plus the line offset within it. */
3
+ export interface ScrollAnchor {
4
+ block: Component;
5
+ offset: number;
6
+ }
7
+ /** A measurable, sliceable ordered block list. The viewport never touches
8
+ * components directly — it addresses blocks by flat index, and holds scroll
9
+ * position as a block identity. */
10
+ export interface ViewportSource {
11
+ /** Visible blocks, in visual order. */
12
+ blockCount(): number;
13
+ /** Rendered line count of block `i` at `width` (renders + caches on miss). */
14
+ blockHeight(i: number, width: number): number;
15
+ /** Cached rendered lines of block `i` at `width`. */
16
+ blockLines(i: number, width: number): readonly string[];
17
+ /** Total rendered lines at `width`. */
18
+ totalHeight(width: number): number;
19
+ /** Absolute content line at which block `i` starts. */
20
+ blockStart(i: number, width: number): number;
21
+ /** The block component at flat index `i`. */
22
+ blockAt(i: number): Component | undefined;
23
+ /** The anchor for the block containing absolute line `line`. */
24
+ anchorAt(line: number, width: number): ScrollAnchor | undefined;
25
+ /** Absolute top line for `anchor` against current measurements, or undefined
26
+ * when the block is gone entirely. */
27
+ anchorLine(anchor: ScrollAnchor, width: number): number | undefined;
28
+ /** Clear cached measurements after a component-level invalidation. */
29
+ invalidate(): void;
30
+ /** Monotonic; bumped by every structural or content mutation. */
31
+ revision(): number;
32
+ }
33
+ /**
34
+ * A container whose direct children are independently rendered and measured.
35
+ *
36
+ * `children` is public on pi-tui's Container, but it must never be mutated from
37
+ * outside these methods: this class owns the visible-index, height, and prefix
38
+ * invariants that make identity anchors safe across transcript mutations.
39
+ */
40
+ export declare class MeasuredContainer extends Container implements ViewportSource {
41
+ private readonly childCache;
42
+ /** Direct children hidden by a collapsed tool-group summary. Never wrap a
43
+ * child: the cache and pi callback paths both key on this exact identity. */
44
+ readonly hiddenChildren: Set<Component>;
45
+ /** Rendered line counts for visible children at `measureWidth`. */
46
+ private heights;
47
+ /** `prefix[i]` is the start line of visible child `i`. */
48
+ private prefix;
49
+ /** The first visible-child index whose prefix onward must be rebuilt. */
50
+ private prefixValidTo;
51
+ private visibleChildren;
52
+ private measureWidth;
53
+ private mutationRevision;
54
+ addChild(component: Component): void;
55
+ setHidden(component: Component, hidden: boolean): void;
56
+ markDirty(component?: Component): void;
57
+ removeChild(component: Component): void;
58
+ clear(): void;
59
+ invalidate(): void;
60
+ render(width: number): string[];
61
+ blockCount(): number;
62
+ blockHeight(index: number, width: number): number;
63
+ blockLines(index: number, width: number): readonly string[];
64
+ totalHeight(width: number): number;
65
+ blockStart(index: number, width: number): number;
66
+ blockAt(index: number): Component | undefined;
67
+ anchorAt(line: number, width: number): ScrollAnchor | undefined;
68
+ anchorLine(anchor: ScrollAnchor, width: number): number | undefined;
69
+ revision(): number;
70
+ private visible;
71
+ private visibleIndexOf;
72
+ private ensureWidth;
73
+ private dropMeasurements;
74
+ private linesFor;
75
+ private rawLinesFor;
76
+ private invalidateHeight;
77
+ /** Rebuild the prefix ending at `endExclusive`; `prefixValidTo` is the first
78
+ * child whose height/prefix may be stale, so `prefix[prefixValidTo]` is valid. */
79
+ private rebuildPrefixThrough;
80
+ }
81
+ /** Concatenates measured containers into the transcript's one flat block space. */
82
+ export declare class CompositeViewportSource implements ViewportSource {
83
+ private readonly parts;
84
+ constructor(parts: readonly MeasuredContainer[]);
85
+ blockCount(): number;
86
+ blockHeight(index: number, width: number): number;
87
+ blockLines(index: number, width: number): readonly string[];
88
+ totalHeight(width: number): number;
89
+ blockStart(index: number, width: number): number;
90
+ blockAt(index: number): Component | undefined;
91
+ anchorAt(line: number, width: number): ScrollAnchor | undefined;
92
+ anchorLine(anchor: ScrollAnchor, width: number): number | undefined;
93
+ invalidate(): void;
94
+ revision(): number;
95
+ private locate;
96
+ }
@@ -0,0 +1,322 @@
1
+ import { Container } from '@earendil-works/pi-tui';
2
+ /**
3
+ * A container whose direct children are independently rendered and measured.
4
+ *
5
+ * `children` is public on pi-tui's Container, but it must never be mutated from
6
+ * outside these methods: this class owns the visible-index, height, and prefix
7
+ * invariants that make identity anchors safe across transcript mutations.
8
+ */
9
+ export class MeasuredContainer extends Container {
10
+ childCache = new Map();
11
+ /** Direct children hidden by a collapsed tool-group summary. Never wrap a
12
+ * child: the cache and pi callback paths both key on this exact identity. */
13
+ hiddenChildren = new Set();
14
+ /** Rendered line counts for visible children at `measureWidth`. */
15
+ heights = [];
16
+ /** `prefix[i]` is the start line of visible child `i`. */
17
+ prefix = [0];
18
+ /** The first visible-child index whose prefix onward must be rebuilt. */
19
+ prefixValidTo = 0;
20
+ visibleChildren;
21
+ measureWidth;
22
+ mutationRevision = 0;
23
+ addChild(component) {
24
+ const visibleCount = this.visible().length;
25
+ super.addChild(component);
26
+ this.visibleChildren = undefined;
27
+ this.heights.push(undefined);
28
+ this.prefixValidTo = Math.min(this.prefixValidTo, visibleCount);
29
+ this.mutationRevision++;
30
+ }
31
+ setHidden(component, hidden) {
32
+ const wasHidden = this.hiddenChildren.has(component);
33
+ const oldVisibleIndex = wasHidden ? undefined : this.visibleIndexOf(component);
34
+ if (hidden)
35
+ this.hiddenChildren.add(component);
36
+ else
37
+ this.hiddenChildren.delete(component);
38
+ this.childCache.delete(component);
39
+ if (!wasHidden && hidden && oldVisibleIndex !== undefined) {
40
+ this.heights.splice(oldVisibleIndex, 1);
41
+ this.invalidateHeight(oldVisibleIndex);
42
+ }
43
+ else if (wasHidden && !hidden) {
44
+ this.visibleChildren = undefined;
45
+ const insertionIndex = this.visibleIndexOf(component);
46
+ if (insertionIndex !== undefined) {
47
+ this.heights.splice(insertionIndex, 0, undefined);
48
+ this.invalidateHeight(insertionIndex);
49
+ this.invalidateHeight(insertionIndex + 1);
50
+ }
51
+ }
52
+ else if (oldVisibleIndex !== undefined) {
53
+ // Preserve RenderCacheContainer's behavior when this is called with the
54
+ // current state: evict this child and re-measure it on its next render.
55
+ this.invalidateHeight(oldVisibleIndex);
56
+ this.invalidateHeight(oldVisibleIndex + 1);
57
+ }
58
+ this.visibleChildren = undefined;
59
+ this.mutationRevision++;
60
+ }
61
+ markDirty(component) {
62
+ if (component) {
63
+ const visibleIndex = this.visibleIndexOf(component);
64
+ this.childCache.delete(component);
65
+ if (visibleIndex !== undefined) {
66
+ this.invalidateHeight(visibleIndex);
67
+ this.invalidateHeight(visibleIndex + 1);
68
+ }
69
+ }
70
+ else {
71
+ this.dropMeasurements();
72
+ }
73
+ this.mutationRevision++;
74
+ }
75
+ removeChild(component) {
76
+ const visibleIndex = this.visibleIndexOf(component);
77
+ super.removeChild(component);
78
+ this.childCache.delete(component);
79
+ this.hiddenChildren.delete(component);
80
+ if (visibleIndex !== undefined) {
81
+ this.heights.splice(visibleIndex, 1);
82
+ this.invalidateHeight(visibleIndex);
83
+ }
84
+ this.visibleChildren = undefined;
85
+ this.mutationRevision++;
86
+ }
87
+ clear() {
88
+ super.clear();
89
+ this.childCache.clear();
90
+ this.hiddenChildren.clear();
91
+ this.heights = [];
92
+ this.prefix = [0];
93
+ this.prefixValidTo = 0;
94
+ this.visibleChildren = undefined;
95
+ this.mutationRevision++;
96
+ }
97
+ invalidate() {
98
+ super.invalidate();
99
+ this.dropMeasurements();
100
+ this.mutationRevision++;
101
+ }
102
+ render(width) {
103
+ this.ensureWidth(width);
104
+ const lines = [];
105
+ for (let i = 0; i < this.visible().length; i++)
106
+ lines.push(...this.linesFor(i, width));
107
+ return lines;
108
+ }
109
+ blockCount() {
110
+ return this.visible().length;
111
+ }
112
+ blockHeight(index, width) {
113
+ this.ensureWidth(width);
114
+ return this.linesFor(index, width).length;
115
+ }
116
+ blockLines(index, width) {
117
+ this.ensureWidth(width);
118
+ return this.linesFor(index, width);
119
+ }
120
+ totalHeight(width) {
121
+ this.ensureWidth(width);
122
+ this.rebuildPrefixThrough(this.visible().length, width);
123
+ return this.prefix[this.visible().length] ?? 0;
124
+ }
125
+ blockStart(index, width) {
126
+ this.ensureWidth(width);
127
+ if (index < 0 || index >= this.visible().length)
128
+ return 0;
129
+ this.rebuildPrefixThrough(index, width);
130
+ return this.prefix[index] ?? 0;
131
+ }
132
+ blockAt(index) {
133
+ return this.visible()[index];
134
+ }
135
+ anchorAt(line, width) {
136
+ this.ensureWidth(width);
137
+ const count = this.visible().length;
138
+ this.rebuildPrefixThrough(count, width);
139
+ const total = this.prefix[count] ?? 0;
140
+ if (line < 0 || line >= total)
141
+ return undefined;
142
+ let low = 0;
143
+ let high = count - 1;
144
+ while (low <= high) {
145
+ const middle = Math.floor((low + high) / 2);
146
+ const start = this.prefix[middle] ?? 0;
147
+ const end = this.prefix[middle + 1] ?? start;
148
+ if (line < start)
149
+ high = middle - 1;
150
+ else if (line >= end)
151
+ low = middle + 1;
152
+ else
153
+ return { block: this.visible()[middle], offset: line - start };
154
+ }
155
+ return undefined;
156
+ }
157
+ anchorLine(anchor, width) {
158
+ this.ensureWidth(width);
159
+ const childIndex = this.children.indexOf(anchor.block);
160
+ if (childIndex === -1)
161
+ return undefined;
162
+ const visibleIndex = this.visibleIndexOf(anchor.block);
163
+ if (visibleIndex !== undefined) {
164
+ const height = this.blockHeight(visibleIndex, width);
165
+ if (height === 0)
166
+ return this.blockStart(visibleIndex, width);
167
+ return this.blockStart(visibleIndex, width) + Math.min(anchor.offset, height - 1);
168
+ }
169
+ // A hidden child resolves to the visible sibling that preceded it, so a fold
170
+ // leaves the viewport on its summary rather than throwing it to live bottom.
171
+ for (let i = childIndex - 1; i >= 0; i--) {
172
+ const preceding = this.children[i];
173
+ const precedingVisibleIndex = this.visibleIndexOf(preceding);
174
+ if (precedingVisibleIndex !== undefined)
175
+ return this.blockStart(precedingVisibleIndex, width);
176
+ }
177
+ return 0;
178
+ }
179
+ revision() {
180
+ return this.mutationRevision;
181
+ }
182
+ visible() {
183
+ if (!this.visibleChildren)
184
+ this.visibleChildren = this.children.filter((child) => !this.hiddenChildren.has(child));
185
+ return this.visibleChildren;
186
+ }
187
+ visibleIndexOf(component) {
188
+ const index = this.visible().indexOf(component);
189
+ return index === -1 ? undefined : index;
190
+ }
191
+ ensureWidth(width) {
192
+ if (this.measureWidth === width)
193
+ return;
194
+ this.measureWidth = width;
195
+ this.dropMeasurements();
196
+ }
197
+ dropMeasurements() {
198
+ this.childCache.clear();
199
+ this.heights = this.visible().map(() => undefined);
200
+ this.prefix = [0];
201
+ this.prefixValidTo = 0;
202
+ }
203
+ linesFor(index, width) {
204
+ const lines = this.rawLinesFor(index, width);
205
+ const previous = this.rawLinesFor(index - 1, width);
206
+ // Transcript blocks own their own one-row outer breathing room. Like CSS
207
+ // margins, adjacent blank boundaries collapse instead of summing to two.
208
+ const rendered = previous.at(-1) === '' && lines[0] === '' ? lines.slice(1) : lines;
209
+ this.heights[index] = rendered.length;
210
+ return rendered;
211
+ }
212
+ rawLinesFor(index, width) {
213
+ const child = this.visible()[index];
214
+ if (!child)
215
+ return [];
216
+ let cached = this.childCache.get(child);
217
+ if (!cached || cached.width !== width) {
218
+ cached = { width, lines: child.render(width) };
219
+ this.childCache.set(child, cached);
220
+ }
221
+ return cached.lines;
222
+ }
223
+ invalidateHeight(index) {
224
+ if (index < 0)
225
+ return;
226
+ if (index < this.heights.length)
227
+ this.heights[index] = undefined;
228
+ this.prefix.length = this.heights.length + 1;
229
+ this.prefixValidTo = Math.min(this.prefixValidTo, Math.min(index, this.heights.length));
230
+ }
231
+ /** Rebuild the prefix ending at `endExclusive`; `prefixValidTo` is the first
232
+ * child whose height/prefix may be stale, so `prefix[prefixValidTo]` is valid. */
233
+ rebuildPrefixThrough(endExclusive, width) {
234
+ const count = this.visible().length;
235
+ const end = Math.min(Math.max(endExclusive, 0), count);
236
+ const start = Math.min(this.prefixValidTo, end);
237
+ if (this.prefix.length === 0)
238
+ this.prefix = [0];
239
+ this.prefix[0] = 0;
240
+ for (let i = start; i < end; i++) {
241
+ const height = this.heights[i] ?? this.linesFor(i, width).length;
242
+ this.prefix[i + 1] = (this.prefix[i] ?? 0) + height;
243
+ }
244
+ if (end > this.prefixValidTo)
245
+ this.prefixValidTo = end;
246
+ }
247
+ }
248
+ /** Concatenates measured containers into the transcript's one flat block space. */
249
+ export class CompositeViewportSource {
250
+ parts;
251
+ constructor(parts) {
252
+ this.parts = parts;
253
+ }
254
+ blockCount() {
255
+ return this.parts.reduce((count, part) => count + part.blockCount(), 0);
256
+ }
257
+ blockHeight(index, width) {
258
+ const located = this.locate(index);
259
+ return located ? located.part.blockHeight(located.index, width) : 0;
260
+ }
261
+ blockLines(index, width) {
262
+ const located = this.locate(index);
263
+ return located ? located.part.blockLines(located.index, width) : [];
264
+ }
265
+ totalHeight(width) {
266
+ return this.parts.reduce((total, part) => total + part.totalHeight(width), 0);
267
+ }
268
+ blockStart(index, width) {
269
+ let offset = 0;
270
+ for (const part of this.parts) {
271
+ const count = part.blockCount();
272
+ if (index < count)
273
+ return offset + part.blockStart(index, width);
274
+ index -= count;
275
+ offset += part.totalHeight(width);
276
+ }
277
+ return 0;
278
+ }
279
+ blockAt(index) {
280
+ const located = this.locate(index);
281
+ return located?.part.blockAt(located.index);
282
+ }
283
+ anchorAt(line, width) {
284
+ if (line < 0)
285
+ return undefined;
286
+ for (const part of this.parts) {
287
+ const height = part.totalHeight(width);
288
+ if (line < height)
289
+ return part.anchorAt(line, width);
290
+ line -= height;
291
+ }
292
+ return undefined;
293
+ }
294
+ anchorLine(anchor, width) {
295
+ let offset = 0;
296
+ for (const part of this.parts) {
297
+ const line = part.anchorLine(anchor, width);
298
+ if (line !== undefined)
299
+ return offset + line;
300
+ offset += part.totalHeight(width);
301
+ }
302
+ return undefined;
303
+ }
304
+ invalidate() {
305
+ for (const part of this.parts)
306
+ part.invalidate();
307
+ }
308
+ revision() {
309
+ return this.parts.reduce((revision, part) => revision + part.revision(), 0);
310
+ }
311
+ locate(index) {
312
+ if (index < 0)
313
+ return undefined;
314
+ for (const part of this.parts) {
315
+ const count = part.blockCount();
316
+ if (index < count)
317
+ return { part, index };
318
+ index -= count;
319
+ }
320
+ return undefined;
321
+ }
322
+ }
@@ -0,0 +1,8 @@
1
+ import type { TranscriptViewport } from './viewport.js';
2
+ export interface ScrollAnimator {
3
+ /** Animate one scroll step in `direction`, coalescing with a burst in flight. */
4
+ page(direction: 'up' | 'down'): void;
5
+ /** Stop mid-flight — other scroll input took over, or the session ended. */
6
+ cancel(): void;
7
+ }
8
+ export declare function createScrollAnimator(viewport: TranscriptViewport, requestRender: () => void): ScrollAnimator;