@north-light/crouter 0.3.173 → 0.3.175

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 (674) hide show
  1. package/bin/runtime-selector.mjs +8 -1
  2. package/dist/api/__tests__/{client.test.js → serial/client.test.js} +2 -135
  3. package/dist/api/client.d.ts +12 -21
  4. package/dist/api/client.js +22 -31
  5. package/dist/api/dto/broker-ops.d.ts +158 -0
  6. package/dist/api/dto/broker-ops.js +6 -0
  7. package/dist/api/dto/crons.d.ts +6 -0
  8. package/dist/api/dto/human.d.ts +7 -1
  9. package/dist/api/dto/inbox.d.ts +1 -71
  10. package/dist/api/dto/inbox.js +1 -9
  11. package/dist/api/dto/nodes.d.ts +6 -7
  12. package/dist/api/dto/reviews.d.ts +1 -11
  13. package/dist/api/routes.d.ts +7 -4
  14. package/dist/api/routes.js +8 -5
  15. package/dist/build-root.js +3 -3
  16. package/dist/builtin-memory/04-base-worker.md +1 -4
  17. package/dist/builtin-memory/05-kinds/advisor/00-base.md +1 -5
  18. package/dist/builtin-memory/05-kinds/advisor/01-orchestrator.md +2 -7
  19. package/dist/builtin-memory/05-kinds/design/00-base.md +1 -6
  20. package/dist/builtin-memory/05-kinds/developer/00-base.md +1 -6
  21. package/dist/builtin-memory/05-kinds/explore/00-base.md +1 -4
  22. package/dist/builtin-memory/05-kinds/explore/01-orchestrator.md +1 -2
  23. package/dist/builtin-memory/05-kinds/general/00-base.md +1 -3
  24. package/dist/builtin-memory/05-kinds/plan/00-base.md +1 -6
  25. package/dist/builtin-memory/05-kinds/plan/reviewers/00-base.md +1 -2
  26. package/dist/builtin-memory/05-kinds/plan/reviewers/architecture-fit.md +1 -3
  27. package/dist/builtin-memory/05-kinds/plan/reviewers/code-smells.md +1 -3
  28. package/dist/builtin-memory/05-kinds/plan/reviewers/pattern-consistency.md +1 -3
  29. package/dist/builtin-memory/05-kinds/plan/reviewers/requirements-coverage.md +1 -3
  30. package/dist/builtin-memory/05-kinds/plan/reviewers/security.md +1 -4
  31. package/dist/builtin-memory/05-kinds/review/companion/00-base.md +2 -3
  32. package/dist/builtin-memory/05-kinds/spec/00-base.md +1 -2
  33. package/dist/builtin-memory/advisor/council.md +1 -6
  34. package/dist/builtin-memory/design.md +2 -7
  35. package/dist/builtin-memory/development.md +9 -14
  36. package/dist/builtin-memory/internal/marketplaces.md +2 -6
  37. package/dist/builtin-memory/internal/nodes-and-canvas.md +1 -1
  38. package/dist/builtin-memory/internal/plugins.md +2 -8
  39. package/dist/builtin-memory/internal/storage-tiers.md +1 -2
  40. package/dist/builtin-memory/testing.md +41 -0
  41. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/{provider-rotation.test.ts → serial/provider-rotation.test.ts} +27 -179
  42. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/claude-plugin-commands.ts +5 -15
  43. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/index.ts +1 -28
  44. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/memory-slash-commands.ts +43 -88
  45. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.js +7 -1
  46. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +9 -1
  47. package/dist/cli.js +2 -2
  48. package/dist/clients/attach/__tests__/attach-remote-readonly.test.js +37 -131
  49. package/dist/clients/attach/__tests__/chat-view-snapshot-ordering.test.js +71 -152
  50. package/dist/clients/attach/__tests__/context-message.test.js +16 -174
  51. package/dist/clients/attach/__tests__/crtr-output.test.js +36 -2069
  52. package/dist/clients/attach/__tests__/diagram.test.js +2 -2
  53. package/dist/clients/attach/__tests__/edit-diff.test.js +0 -4
  54. package/dist/clients/attach/__tests__/file-review-focus.test.js +2 -1
  55. package/dist/clients/attach/__tests__/group-activity.test.js +40 -229
  56. package/dist/clients/attach/__tests__/oauth-dialog-lifecycle.test.js +26 -76
  57. package/dist/clients/attach/__tests__/prompt-preview.test.js +4 -70
  58. package/dist/clients/attach/__tests__/ref-autocomplete.test.js +11 -125
  59. package/dist/clients/attach/__tests__/titled-editor-preview.test.js +14 -205
  60. package/dist/clients/attach/command.d.ts +2 -1
  61. package/dist/clients/attach/command.js +81 -76
  62. package/dist/clients/attach/input/capabilities.d.ts +27 -0
  63. package/dist/clients/attach/input/capabilities.js +96 -0
  64. package/dist/clients/attach/input/controller.d.ts +20 -182
  65. package/dist/clients/attach/input/controller.js +128 -537
  66. package/dist/clients/attach/input/overlay-owner.d.ts +41 -0
  67. package/dist/clients/attach/input/overlay-owner.js +199 -0
  68. package/dist/clients/attach/overlays/file-review.d.ts +0 -4
  69. package/dist/clients/attach/overlays/file-review.js +13 -5
  70. package/dist/clients/attach/overlays/graph.js +2 -10
  71. package/dist/clients/attach/render/chat-view.d.ts +4 -3
  72. package/dist/clients/attach/render/chat-view.js +39 -33
  73. package/dist/clients/attach/render/group-activity.d.ts +1 -0
  74. package/dist/clients/attach/render/group-activity.js +20 -13
  75. package/dist/clients/attach/render/group-recap.js +12 -3
  76. package/dist/clients/attach/session/connection.js +9 -15
  77. package/dist/clients/attach/session/editor-inventory.d.ts +6 -5
  78. package/dist/clients/attach/session/editor-inventory.js +7 -8
  79. package/dist/clients/attach/session/file-links.d.ts +13 -0
  80. package/dist/clients/attach/session/file-links.js +107 -0
  81. package/dist/clients/attach/session/frame.d.ts +3 -0
  82. package/dist/clients/attach/session/frame.js +10 -1
  83. package/dist/clients/attach/session/frames.js +2 -3
  84. package/dist/clients/attach/session/input-wiring.d.ts +4 -1
  85. package/dist/clients/attach/session/input-wiring.js +15 -14
  86. package/dist/clients/attach/session/mouse.d.ts +6 -1
  87. package/dist/clients/attach/session/mouse.js +8 -5
  88. package/dist/clients/attach/session/profile-files.js +18 -12
  89. package/dist/clients/attach/session/reconnect.js +1 -1
  90. package/dist/clients/attach/session/state-sync.js +1 -2
  91. package/dist/clients/attach/session/surface-host.d.ts +3 -2
  92. package/dist/clients/attach/session/surface-host.js +4 -4
  93. package/dist/clients/attach/slash/dispatch.d.ts +8 -31
  94. package/dist/clients/attach/slash/dispatch.js +34 -81
  95. package/dist/clients/attach/viewer.js +820 -860
  96. package/dist/clients/conversation/projection.d.ts +79 -0
  97. package/dist/clients/conversation/projection.js +341 -0
  98. package/dist/clients/inbox/__tests__/serial/inbox-controller.test.js +159 -0
  99. package/dist/clients/inbox/__tests__/serial/mount-panel.test.js +151 -0
  100. package/dist/clients/inbox/controller.d.ts +0 -4
  101. package/dist/clients/inbox/controller.js +0 -2
  102. package/dist/clients/inbox/review/__tests__/review-core.test.js +4 -293
  103. package/dist/clients/inbox/review/__tests__/teardown-notice.test.js +100 -0
  104. package/dist/clients/inbox/review/comments-client.d.ts +3 -2
  105. package/dist/clients/inbox/review/comments-client.js +12 -12
  106. package/dist/clients/inbox/review/companion-pane.d.ts +30 -0
  107. package/dist/clients/inbox/review/companion-pane.js +86 -0
  108. package/dist/clients/inbox/review/document-surface.d.ts +182 -0
  109. package/dist/clients/inbox/review/{document-region.js → document-surface.js} +252 -48
  110. package/dist/clients/inbox/review/frame.js +5 -4
  111. package/dist/clients/inbox/review/launch.d.ts +8 -8
  112. package/dist/clients/inbox/review/launch.js +52 -92
  113. package/dist/clients/inbox/review/nvim.d.ts +2 -0
  114. package/dist/clients/inbox/review/nvim.js +14 -12
  115. package/dist/clients/inbox/review/review-client.d.ts +12 -8
  116. package/dist/clients/inbox/review/review-client.js +46 -35
  117. package/dist/clients/inbox/review-adapter.d.ts +3 -10
  118. package/dist/clients/inbox/review-adapter.js +27 -19
  119. package/dist/clients/inbox/surface.d.ts +0 -4
  120. package/dist/clients/inbox/surface.js +0 -2
  121. package/dist/clients/surfaces/host.d.ts +11 -3
  122. package/dist/commands/__tests__/api-client-cold-start-diagnostic.test.js +7 -34
  123. package/dist/commands/__tests__/human.test.js +11 -322
  124. package/dist/commands/api-client.d.ts +5 -5
  125. package/dist/commands/api-client.js +6 -85
  126. package/dist/commands/canvas-browse.js +3 -29
  127. package/dist/commands/canvas-config.js +1 -1
  128. package/dist/commands/canvas-use.js +3 -3
  129. package/dist/commands/canvas.js +1 -1
  130. package/dist/commands/cron.js +5 -1
  131. package/dist/commands/human/queue.d.ts +0 -4
  132. package/dist/commands/human/queue.js +7 -40
  133. package/dist/commands/memory/list.d.ts +14 -0
  134. package/dist/commands/memory/list.js +35 -31
  135. package/dist/commands/memory/read.d.ts +7 -0
  136. package/dist/commands/memory/read.js +14 -8
  137. package/dist/commands/memory/write.js +13 -12
  138. package/dist/commands/node/bash.d.ts +1 -0
  139. package/dist/commands/node/bash.js +198 -0
  140. package/dist/commands/node/create.d.ts +23 -0
  141. package/dist/commands/node/create.js +207 -0
  142. package/dist/commands/node/inspect.d.ts +2 -0
  143. package/dist/commands/node/inspect.js +302 -0
  144. package/dist/commands/node/lifecycle.d.ts +4 -0
  145. package/dist/commands/node/lifecycle.js +415 -0
  146. package/dist/commands/node/message.d.ts +1 -0
  147. package/dist/commands/node/message.js +164 -0
  148. package/dist/commands/node/pyramid.d.ts +2 -0
  149. package/dist/commands/node/pyramid.js +79 -0
  150. package/dist/commands/node/subscription.d.ts +1 -0
  151. package/dist/commands/node/subscription.js +82 -0
  152. package/dist/commands/node/wait.d.ts +1 -0
  153. package/dist/commands/node/wait.js +159 -0
  154. package/dist/commands/node-lifecycle-revive.js +10 -57
  155. package/dist/commands/node.d.ts +0 -42
  156. package/dist/commands/node.js +11 -2065
  157. package/dist/commands/search.js +1 -1
  158. package/dist/commands/surface/node/cycle.d.ts +1 -0
  159. package/dist/commands/surface/node/cycle.js +83 -0
  160. package/dist/commands/surface/node/focus.d.ts +1 -0
  161. package/dist/commands/surface/node/focus.js +67 -0
  162. package/dist/commands/surface/node/id.d.ts +1 -0
  163. package/dist/commands/surface/node/id.js +38 -0
  164. package/dist/commands/surface/node/pin.d.ts +1 -0
  165. package/dist/commands/surface/node/pin.js +42 -0
  166. package/dist/commands/surface/node/placement.d.ts +46 -0
  167. package/dist/commands/surface/node/placement.js +124 -0
  168. package/dist/commands/surface-node.js +4 -1
  169. package/dist/commands/surface-reload.js +1 -2
  170. package/dist/commands/surface-tmux-spread.js +1 -1
  171. package/dist/commands/surface.js +5 -20
  172. package/dist/commands/sys/__tests__/setup-core.test.js +18 -271
  173. package/dist/commands/sys/config.js +6 -6
  174. package/dist/commands/sys/logs.js +1 -1
  175. package/dist/commands/sys/panels/broker-limits-panel.d.ts +17 -0
  176. package/dist/commands/sys/panels/broker-limits-panel.js +104 -0
  177. package/dist/commands/sys/panels/dependencies-panel.d.ts +14 -0
  178. package/dist/commands/sys/panels/dependencies-panel.js +80 -0
  179. package/dist/commands/sys/panels/keybindings-panel.d.ts +56 -0
  180. package/dist/commands/sys/panels/keybindings-panel.js +703 -0
  181. package/dist/commands/sys/panels/keys-panel.d.ts +16 -0
  182. package/dist/commands/sys/panels/keys-panel.js +60 -0
  183. package/dist/commands/sys/panels/models-panel.d.ts +77 -0
  184. package/dist/commands/sys/panels/models-panel.js +647 -0
  185. package/dist/commands/sys/panels/panel.d.ts +45 -0
  186. package/dist/commands/sys/panels/panel.js +137 -0
  187. package/dist/commands/sys/panels/plugins-panel.d.ts +16 -0
  188. package/dist/commands/sys/panels/plugins-panel.js +80 -0
  189. package/dist/commands/sys/panels/prefs-panel.d.ts +21 -0
  190. package/dist/commands/sys/panels/prefs-panel.js +85 -0
  191. package/dist/commands/sys/panels/provider-panel.d.ts +62 -0
  192. package/dist/commands/sys/panels/provider-panel.js +538 -0
  193. package/dist/commands/sys/settings-shell.d.ts +55 -0
  194. package/dist/commands/sys/settings-shell.js +400 -0
  195. package/dist/commands/sys/settings.d.ts +2 -0
  196. package/dist/commands/sys/settings.js +31 -0
  197. package/dist/commands/sys/setup-core.d.ts +3 -33
  198. package/dist/commands/sys/setup-core.js +27 -78
  199. package/dist/commands/sys/setup-settings-runner.d.ts +24 -0
  200. package/dist/commands/sys/setup-settings-runner.js +63 -0
  201. package/dist/commands/sys/setup-wizard.d.ts +26 -125
  202. package/dist/commands/sys/setup-wizard.js +209 -2473
  203. package/dist/commands/sys/setup.js +5 -7
  204. package/dist/commands/sys.js +3 -2
  205. package/dist/core/__tests__/broker-extension-canvas-db-boundary.test.js +50 -0
  206. package/dist/core/__tests__/broker-launch-candidates.test.js +20 -9
  207. package/dist/core/__tests__/broker-preflight.test.js +1 -1
  208. package/dist/core/__tests__/canvas-inbox-watcher-hold.test.js +108 -27
  209. package/dist/core/__tests__/canvas-inbox-watcher.test.js +14 -0
  210. package/dist/core/__tests__/canvas.test.js +2 -36
  211. package/dist/core/__tests__/close.test.js +14 -3
  212. package/dist/core/__tests__/context-intro.test.js +32 -143
  213. package/dist/core/__tests__/cron-broker-capacity.test.js +22 -3
  214. package/dist/core/__tests__/daemon-boot.test.js +2 -20
  215. package/dist/core/__tests__/daemon-wedge.test.js +1 -1
  216. package/dist/core/__tests__/dead-node-policy-table.test.js +1 -18
  217. package/dist/core/__tests__/fixtures/fake-engine.d.ts +1 -1
  218. package/dist/core/__tests__/fixtures/fake-engine.js +2 -2
  219. package/dist/core/__tests__/fixtures/fake-pi-host.js +2 -2
  220. package/dist/core/__tests__/focuses.test.js +4 -98
  221. package/dist/core/__tests__/helpers/broker-clients.d.ts +0 -3
  222. package/dist/core/__tests__/helpers/broker-clients.js +0 -14
  223. package/dist/core/__tests__/helpers/harness.d.ts +0 -8
  224. package/dist/core/__tests__/helpers/harness.js +7 -87
  225. package/dist/core/__tests__/helpers/viewer-panes.js +1 -1
  226. package/dist/core/__tests__/inline-memory-refs.test.js +5 -134
  227. package/dist/core/__tests__/kickoff.test.js +1 -1
  228. package/dist/core/__tests__/memory-resolver-precedence.test.js +29 -1
  229. package/dist/core/__tests__/migration.test.js +35 -48
  230. package/dist/core/__tests__/on-read-dedup-resume.test.js +22 -12
  231. package/dist/core/__tests__/passive-subscription.test.js +26 -49
  232. package/dist/core/__tests__/preview-registry-sync.test.js +1 -2
  233. package/dist/core/__tests__/prune.test.js +94 -1
  234. package/dist/core/__tests__/review-model-floor.test.js +0 -32
  235. package/dist/core/__tests__/seam/broker-attach-multiclient.test.js +255 -0
  236. package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.js +39 -7
  237. package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.js +30 -29
  238. package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.js +54 -5
  239. package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.js +134 -82
  240. package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.js +15 -4
  241. package/dist/core/__tests__/{full/idle-release-settlement.test.js → seam/dormancy-release.test.js} +69 -17
  242. package/dist/core/__tests__/{full/yield-message-transaction.test.js → seam/yield-refresh-transaction.test.js} +31 -9
  243. package/dist/core/__tests__/secrets.test.js +1 -7
  244. package/dist/core/__tests__/{broker-fork-seam.test.js → serial/broker-fork-seam.test.js} +58 -7
  245. package/dist/core/__tests__/{broker-sdk-wiring.test.js → serial/broker-sdk-wiring.test.js} +18 -162
  246. package/dist/core/__tests__/{broker-snapshot-history.test.js → serial/broker-snapshot-history.test.js} +9 -9
  247. package/dist/core/__tests__/{command-plugins.test.js → serial/command-plugins.test.js} +105 -15
  248. package/dist/core/__tests__/{deferred-no-wake.test.js → serial/deferred-no-wake.test.js} +23 -20
  249. package/dist/core/__tests__/{flagship-lifecycle.test.js → serial/flagship-lifecycle.test.js} +7 -7
  250. package/dist/core/__tests__/{host-teardown-process-group.test.js → serial/host-teardown-process-group.test.js} +6 -6
  251. package/dist/core/__tests__/{human-deliver-e2e.test.js → serial/human-deliver-e2e.test.js} +12 -12
  252. package/dist/core/__tests__/{live-mutation.test.js → serial/live-mutation.test.js} +5 -5
  253. package/dist/core/__tests__/{refresh-stall-recycle.test.js → serial/refresh-stall-recycle.test.js} +5 -14
  254. package/dist/core/__tests__/{revive.test.js → serial/revive.test.js} +15 -100
  255. package/dist/core/__tests__/{spawn-root.test.js → serial/spawn-root.test.js} +32 -15
  256. package/dist/core/__tests__/serial/subscription-delivery.test.js +126 -0
  257. package/dist/core/__tests__/serial/tmux-surface.test.js +256 -0
  258. package/dist/core/__tests__/{worktree.test.js → serial/worktree.test.js} +15 -15
  259. package/dist/core/__tests__/session-model.test.js +0 -18
  260. package/dist/core/__tests__/spawn-worktree-id-conflict.test.js +9 -0
  261. package/dist/core/__tests__/watchdog-abort-arms-retry.test.js +50 -0
  262. package/dist/core/broker-client/__tests__/transport-relay.test.js +15 -16
  263. package/dist/core/broker-client/__tests__/transport-socket.test.js +28 -0
  264. package/dist/core/broker-client/client.d.ts +2 -2
  265. package/dist/core/broker-client/client.js +4 -7
  266. package/dist/core/broker-client/transport-relay.d.ts +13 -19
  267. package/dist/core/broker-client/transport-relay.js +19 -34
  268. package/dist/core/broker-client/transport-socket.d.ts +2 -2
  269. package/dist/core/broker-client/transport-socket.js +9 -2
  270. package/dist/core/broker-client/transport.d.ts +7 -3
  271. package/dist/core/broker-client/transport.js +4 -4
  272. package/dist/core/canvas/__tests__/attention.test.js +1 -18
  273. package/dist/core/canvas/__tests__/remote-canvas-source.test.js +7 -64
  274. package/dist/core/canvas/__tests__/remote-transport.test.js +2 -3
  275. package/dist/core/canvas/__tests__/render-remote.test.js +7 -52
  276. package/dist/core/canvas/browse/app.d.ts +2 -17
  277. package/dist/core/canvas/browse/app.js +16 -88
  278. package/dist/core/canvas/browse/model.d.ts +0 -4
  279. package/dist/core/canvas/browse/model.js +1 -12
  280. package/dist/core/canvas/browse/render.js +6 -3
  281. package/dist/core/canvas/crons.d.ts +8 -5
  282. package/dist/core/canvas/crons.js +7 -6
  283. package/dist/core/canvas/extensions.d.ts +7 -3
  284. package/dist/core/canvas/extensions.js +16 -4
  285. package/dist/core/canvas/nav-model.d.ts +0 -4
  286. package/dist/core/canvas/nav-model.js +2 -14
  287. package/dist/core/canvas/node-order.d.ts +3 -0
  288. package/dist/core/canvas/node-order.js +12 -0
  289. package/dist/core/canvas/remote-canvas-source.d.ts +3 -6
  290. package/dist/core/canvas/remote-canvas-source.js +8 -15
  291. package/dist/core/command.js +11 -4
  292. package/dist/core/config.js +3 -1
  293. package/dist/core/events/envelope.js +1 -1
  294. package/dist/core/events/read.js +7 -21
  295. package/dist/core/events/source.d.ts +0 -2
  296. package/dist/core/events/source.js +0 -16
  297. package/dist/core/events/types.d.ts +1 -1
  298. package/dist/core/fault-classifier.d.ts +1 -1
  299. package/dist/core/feed/passive.d.ts +0 -11
  300. package/dist/core/feed/passive.js +1 -62
  301. package/dist/core/human/__tests__/{inbox-core.test.js → serial/inbox-core.test.js} +6 -6
  302. package/dist/core/keybindings/__tests__/resolve.test.js +1 -96
  303. package/dist/core/keybindings/background-bash.js +3 -4
  304. package/dist/core/keybindings/catalog.js +1 -1
  305. package/dist/core/memory/inline-ref-grammar.js +3 -3
  306. package/dist/core/memory-resolver.d.ts +11 -25
  307. package/dist/core/memory-resolver.js +51 -33
  308. package/dist/core/model-routes.d.ts +15 -0
  309. package/dist/core/model-routes.js +12 -0
  310. package/dist/core/pool-credential-store.js +1 -1
  311. package/dist/core/preview-registry.js +8 -9
  312. package/dist/core/profiles/__tests__/root-profile.test.js +4 -14
  313. package/dist/core/review/realize.d.ts +0 -13
  314. package/dist/core/review/realize.js +0 -40
  315. package/dist/core/review/types.d.ts +1 -1
  316. package/dist/core/runtime/__tests__/engine-route.test.js +2 -2
  317. package/dist/core/runtime/bearings.js +1 -11
  318. package/dist/core/runtime/broker/client-registry.d.ts +33 -0
  319. package/dist/core/runtime/broker/client-registry.js +164 -0
  320. package/dist/core/runtime/broker/daemon-ops.d.ts +19 -0
  321. package/dist/core/runtime/broker/daemon-ops.js +49 -0
  322. package/dist/core/runtime/broker/event-projection.d.ts +42 -0
  323. package/dist/core/runtime/broker/event-projection.js +178 -0
  324. package/dist/core/runtime/broker/fault-retry.d.ts +39 -0
  325. package/dist/core/runtime/broker/fault-retry.js +277 -0
  326. package/dist/core/runtime/broker/frame-dispatch.d.ts +238 -0
  327. package/dist/core/runtime/broker/frame-dispatch.js +1537 -0
  328. package/dist/core/runtime/broker/inbox.d.ts +22 -0
  329. package/dist/core/runtime/broker/inbox.js +167 -0
  330. package/dist/core/runtime/broker/passive.d.ts +16 -0
  331. package/dist/core/runtime/broker/passive.js +44 -0
  332. package/dist/core/runtime/broker/read-ops.d.ts +23 -0
  333. package/dist/core/runtime/broker/read-ops.js +150 -0
  334. package/dist/core/runtime/broker/rebind.d.ts +74 -0
  335. package/dist/core/runtime/broker/rebind.js +211 -0
  336. package/dist/core/runtime/broker/tool-groups.d.ts +39 -0
  337. package/dist/core/runtime/broker/tool-groups.js +244 -0
  338. package/dist/core/runtime/broker-extension-render.d.ts +11 -0
  339. package/dist/core/runtime/broker-extension-render.js +181 -0
  340. package/dist/core/runtime/broker-persona-guidance.d.ts +13 -0
  341. package/dist/core/runtime/broker-persona-guidance.js +58 -0
  342. package/dist/core/runtime/broker-protocol.d.ts +1 -1
  343. package/dist/core/runtime/broker-protocol.js +1 -1
  344. package/dist/core/runtime/broker.d.ts +5 -196
  345. package/dist/core/runtime/broker.js +276 -3059
  346. package/dist/core/runtime/canvas-extensions.js +11 -2
  347. package/dist/core/runtime/fault.js +1 -1
  348. package/dist/core/runtime/model-selection.d.ts +9 -0
  349. package/dist/core/runtime/model-selection.js +12 -0
  350. package/dist/core/runtime/model-swap.d.ts +3 -3
  351. package/dist/core/runtime/model-swap.js +33 -25
  352. package/dist/core/runtime/placement-tmux.d.ts +3 -14
  353. package/dist/core/runtime/placement-tmux.js +11 -80
  354. package/dist/core/runtime/placement.d.ts +4 -2
  355. package/dist/core/runtime/placement.js +7 -12
  356. package/dist/core/runtime/promote.d.ts +14 -1
  357. package/dist/core/runtime/promote.js +1 -1
  358. package/dist/core/runtime/reset.d.ts +1 -1
  359. package/dist/core/runtime/roadmap.js +1 -1
  360. package/dist/core/runtime/spawn.d.ts +8 -0
  361. package/dist/core/runtime/spawn.js +36 -6
  362. package/dist/core/runtime/stop-guard.d.ts +4 -3
  363. package/dist/core/runtime/stop-guard.js +36 -18
  364. package/dist/core/runtime/stop-signals.d.ts +4 -1
  365. package/dist/core/runtime/stream-watchdog.js +4 -5
  366. package/dist/core/runtime/structured-output.d.ts +15 -2
  367. package/dist/core/runtime/structured-output.js +35 -12
  368. package/dist/core/runtime/tmux-bindings.d.ts +25 -0
  369. package/dist/core/runtime/tmux-bindings.js +682 -0
  370. package/dist/core/runtime/tmux-chrome.d.ts +2 -1
  371. package/dist/core/runtime/tmux-chrome.js +3 -2
  372. package/dist/core/runtime/{tmux.d.ts → tmux-driver.d.ts} +18 -26
  373. package/dist/core/runtime/tmux-driver.js +598 -0
  374. package/dist/core/runtime/view-socket.d.ts +14 -0
  375. package/dist/core/runtime/view-socket.js +83 -0
  376. package/dist/core/session-model/session-state.d.ts +1 -2
  377. package/dist/core/session-model/session-state.js +5 -8
  378. package/dist/core/spawn.d.ts +1 -1
  379. package/dist/core/spawn.js +2 -2
  380. package/dist/core/substrate/gate.d.ts +1 -1
  381. package/dist/core/substrate/on-read-pure.d.ts +7 -0
  382. package/dist/core/substrate/on-read-pure.js +272 -0
  383. package/dist/core/termrender/termrender.js +32 -2
  384. package/dist/core/user-settings.d.ts +23 -1
  385. package/dist/core/user-settings.js +18 -1
  386. package/dist/daemon/api/__tests__/node-model-validation.test.js +134 -0
  387. package/dist/daemon/api/__tests__/review-terminal-conflict.test.js +98 -0
  388. package/dist/daemon/api/__tests__/{full → seam}/api-server.test.js +6 -48
  389. package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.js +17 -44
  390. package/dist/daemon/api/__tests__/{full/push-parity.test.js → seam/leaf-api-parity.test.js} +61 -42
  391. package/dist/daemon/api/bridge.js +40 -81
  392. package/dist/daemon/api/handlers/broker-ops.d.ts +2 -0
  393. package/dist/daemon/api/handlers/broker-ops.js +383 -0
  394. package/dist/daemon/api/handlers/crons.js +9 -4
  395. package/dist/daemon/api/handlers/files.js +6 -7
  396. package/dist/daemon/api/handlers/inbox.js +2 -340
  397. package/dist/daemon/api/handlers/nodes.d.ts +10 -1
  398. package/dist/daemon/api/handlers/nodes.js +74 -39
  399. package/dist/daemon/api/handlers/review-comments.js +5 -1
  400. package/dist/daemon/api/handlers/reviews.js +0 -19
  401. package/dist/daemon/api/map.js +25 -4
  402. package/dist/daemon/api/router.js +2 -3
  403. package/dist/daemon/api/server.js +5 -7
  404. package/dist/daemon/cron-run.d.ts +4 -0
  405. package/dist/daemon/cron-run.js +30 -13
  406. package/dist/daemon/crtrd.d.ts +3 -58
  407. package/dist/daemon/crtrd.js +28 -1244
  408. package/dist/daemon/manage.js +0 -1
  409. package/dist/daemon/reconcilers/broker-supervision.d.ts +50 -0
  410. package/dist/daemon/reconcilers/broker-supervision.js +549 -0
  411. package/dist/daemon/reconcilers/cron-lane.d.ts +10 -0
  412. package/dist/daemon/reconcilers/cron-lane.js +32 -0
  413. package/dist/daemon/reconcilers/dormant-inbox.d.ts +18 -0
  414. package/dist/daemon/reconcilers/dormant-inbox.js +143 -0
  415. package/dist/daemon/reconcilers/storage-maintenance.d.ts +22 -0
  416. package/dist/daemon/reconcilers/storage-maintenance.js +213 -0
  417. package/dist/daemon/review/finish.js +2 -5
  418. package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +34 -53
  419. package/dist/pi-extensions/__tests__/canvas-recap.test.js +16 -113
  420. package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +72 -99
  421. package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.js +29 -12
  422. package/dist/pi-extensions/broker-local.d.ts +20 -0
  423. package/dist/pi-extensions/broker-local.js +89 -0
  424. package/dist/pi-extensions/canvas-context-intro.d.ts +3 -3
  425. package/dist/pi-extensions/canvas-context-intro.js +22 -11
  426. package/dist/pi-extensions/canvas-doc-substrate.js +17 -34
  427. package/dist/pi-extensions/canvas-goal-capture.js +7 -12
  428. package/dist/pi-extensions/canvas-inbox-watcher.js +124 -139
  429. package/dist/pi-extensions/canvas-passive-context.d.ts +3 -3
  430. package/dist/pi-extensions/canvas-passive-context.js +22 -18
  431. package/dist/pi-extensions/canvas-recap.d.ts +2 -2
  432. package/dist/pi-extensions/canvas-recap.js +48 -21
  433. package/dist/pi-extensions/canvas-review-boundary.js +10 -4
  434. package/dist/pi-extensions/canvas-stophook.d.ts +0 -5
  435. package/dist/pi-extensions/canvas-stophook.js +149 -431
  436. package/dist/pi-extensions/canvas-structured-output.js +52 -30
  437. package/dist/pi-extensions/envelope-merge.d.ts +13 -0
  438. package/dist/pi-extensions/envelope-merge.js +29 -0
  439. package/dist/shared/working-activity.d.ts +3 -2
  440. package/dist/shared/working-activity.js +3 -2
  441. package/dist/types.d.ts +6 -5
  442. package/dist/types.js +2 -2
  443. package/docs/compat/hearth-crtr-v1.md +4 -12
  444. package/docs/compat/hearth-crtr-v2.md +3 -11
  445. package/docs/compat/hearth-crtr-v3.md +4 -12
  446. package/docs/compat/hearth-crtr-v4.md +3 -11
  447. package/docs/compat/hearth-crtr-v5.md +3 -11
  448. package/docs/public-api.md +3 -7
  449. package/package.json +7 -49
  450. package/runtime.lock.json +2766 -14533
  451. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/claude-plugin-commands.test.ts +0 -49
  452. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/memory-slash-commands.test.ts +0 -194
  453. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/statusline.test.ts +0 -68
  454. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/test.ts +0 -119
  455. package/dist/clients/attach/__tests__/attach-chrome-remote.test.js +0 -439
  456. package/dist/clients/attach/__tests__/attach-keybindings.test.js +0 -170
  457. package/dist/clients/attach/__tests__/crtr-output-coverage.test.js +0 -57
  458. package/dist/clients/attach/__tests__/editor-frame-title.test.js +0 -19
  459. package/dist/clients/attach/__tests__/input-controller-extension-command.test.js +0 -32
  460. package/dist/clients/attach/__tests__/markdown-headings.test.js +0 -35
  461. package/dist/clients/attach/__tests__/session-identity-refresh.test.js +0 -32
  462. package/dist/clients/conversation/conversation.d.ts +0 -65
  463. package/dist/clients/conversation/conversation.js +0 -318
  464. package/dist/clients/conversation/frames.d.ts +0 -30
  465. package/dist/clients/conversation/frames.js +0 -52
  466. package/dist/clients/conversation/region.d.ts +0 -51
  467. package/dist/clients/conversation/region.js +0 -265
  468. package/dist/clients/inbox/__tests__/inbox-controller.test.js +0 -247
  469. package/dist/clients/inbox/__tests__/mount-panel.test.js +0 -776
  470. package/dist/clients/inbox/review/__tests__/remap.test.js +0 -196
  471. package/dist/clients/inbox/review/columns.d.ts +0 -22
  472. package/dist/clients/inbox/review/columns.js +0 -40
  473. package/dist/clients/inbox/review/composition.d.ts +0 -60
  474. package/dist/clients/inbox/review/composition.js +0 -278
  475. package/dist/clients/inbox/review/document-region.d.ts +0 -120
  476. package/dist/clients/surfaces/region.d.ts +0 -16
  477. package/dist/clients/web/__tests__/push-engine.test.js +0 -158
  478. package/dist/clients/web/__tests__/push-registry.test.d.ts +0 -1
  479. package/dist/clients/web/__tests__/push-registry.test.js +0 -177
  480. package/dist/clients/web/dev-server.d.ts +0 -7
  481. package/dist/clients/web/dev-server.js +0 -46
  482. package/dist/clients/web/events.d.ts +0 -19
  483. package/dist/clients/web/events.js +0 -163
  484. package/dist/clients/web/push-engine.d.ts +0 -44
  485. package/dist/clients/web/push-engine.js +0 -125
  486. package/dist/clients/web/push-registry.d.ts +0 -85
  487. package/dist/clients/web/push-registry.js +0 -373
  488. package/dist/clients/web/server.d.ts +0 -19
  489. package/dist/clients/web/server.js +0 -661
  490. package/dist/clients/web/web-client/shared/protocol.d.ts +0 -214
  491. package/dist/clients/web/web-client/shared/protocol.js +0 -8
  492. package/dist/clients/web/web-cmd.d.ts +0 -2
  493. package/dist/clients/web/web-cmd.js +0 -141
  494. package/dist/commands/__tests__/api-canvas-source.test.d.ts +0 -1
  495. package/dist/commands/__tests__/api-canvas-source.test.js +0 -37
  496. package/dist/commands/__tests__/canvas-config.test.d.ts +0 -1
  497. package/dist/commands/__tests__/canvas-config.test.js +0 -107
  498. package/dist/commands/__tests__/node-no-kickoff-flag.test.d.ts +0 -1
  499. package/dist/commands/__tests__/node-no-kickoff-flag.test.js +0 -73
  500. package/dist/commands/__tests__/node-worktree-flag.test.d.ts +0 -1
  501. package/dist/commands/__tests__/node-worktree-flag.test.js +0 -49
  502. package/dist/commands/__tests__/search-contents.test.d.ts +0 -1
  503. package/dist/commands/__tests__/search-contents.test.js +0 -52
  504. package/dist/commands/memory/__tests__/lint.test.d.ts +0 -1
  505. package/dist/commands/memory/__tests__/lint.test.js +0 -15
  506. package/dist/commands/sys/__tests__/config-broker-thresholds.test.d.ts +0 -1
  507. package/dist/commands/sys/__tests__/config-broker-thresholds.test.js +0 -95
  508. package/dist/commands/sys/__tests__/config-keybindings.test.d.ts +0 -1
  509. package/dist/commands/sys/__tests__/config-keybindings.test.js +0 -55
  510. package/dist/commands/sys/__tests__/helpers/setup-runtime.d.ts +0 -5
  511. package/dist/commands/sys/__tests__/helpers/setup-runtime.js +0 -19
  512. package/dist/commands/sys/__tests__/setup-front-door.test.d.ts +0 -1
  513. package/dist/commands/sys/__tests__/setup-front-door.test.js +0 -102
  514. package/dist/commands/sys/__tests__/setup-models.test.d.ts +0 -1
  515. package/dist/commands/sys/__tests__/setup-models.test.js +0 -205
  516. package/dist/commands/sys/__tests__/setup-providers-viewport.test.d.ts +0 -1
  517. package/dist/commands/sys/__tests__/setup-providers-viewport.test.js +0 -155
  518. package/dist/commands/sys/__tests__/sync-deps.test.d.ts +0 -1
  519. package/dist/commands/sys/__tests__/sync-deps.test.js +0 -179
  520. package/dist/commands/sys/__tests__/sync-import.test.d.ts +0 -1
  521. package/dist/commands/sys/__tests__/sync-import.test.js +0 -315
  522. package/dist/core/__tests__/base-worker-prompt.test.d.ts +0 -1
  523. package/dist/core/__tests__/base-worker-prompt.test.js +0 -57
  524. package/dist/core/__tests__/command-plugins-surfaces.test.d.ts +0 -1
  525. package/dist/core/__tests__/command-plugins-surfaces.test.js +0 -359
  526. package/dist/core/__tests__/connection-reconnect-resume.test.d.ts +0 -1
  527. package/dist/core/__tests__/connection-reconnect-resume.test.js +0 -36
  528. package/dist/core/__tests__/finalization-migration.test.d.ts +0 -1
  529. package/dist/core/__tests__/finalization-migration.test.js +0 -38
  530. package/dist/core/__tests__/fixtures/extra-extension.d.ts +0 -1
  531. package/dist/core/__tests__/fixtures/extra-extension.js +0 -3
  532. package/dist/core/__tests__/fixtures/spawn-proof-target.test.d.ts +0 -1
  533. package/dist/core/__tests__/fixtures/spawn-proof-target.test.js +0 -15
  534. package/dist/core/__tests__/fork.test.d.ts +0 -1
  535. package/dist/core/__tests__/fork.test.js +0 -108
  536. package/dist/core/__tests__/full/broker-attach-limits.test.d.ts +0 -1
  537. package/dist/core/__tests__/full/broker-attach-limits.test.js +0 -147
  538. package/dist/core/__tests__/full/broker-deliver-ack.test.d.ts +0 -1
  539. package/dist/core/__tests__/full/broker-deliver-ack.test.js +0 -73
  540. package/dist/core/__tests__/full/broker-dialogs.test.d.ts +0 -1
  541. package/dist/core/__tests__/full/broker-dialogs.test.js +0 -180
  542. package/dist/core/__tests__/full/broker-display-snapshot.test.d.ts +0 -1
  543. package/dist/core/__tests__/full/broker-display-snapshot.test.js +0 -75
  544. package/dist/core/__tests__/full/broker-dormant-wake.test.d.ts +0 -1
  545. package/dist/core/__tests__/full/broker-dormant-wake.test.js +0 -130
  546. package/dist/core/__tests__/full/broker-model-changed-broadcast.test.d.ts +0 -1
  547. package/dist/core/__tests__/full/broker-model-changed-broadcast.test.js +0 -57
  548. package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.d.ts +0 -1
  549. package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.js +0 -80
  550. package/dist/core/__tests__/full/cascade-close.test.d.ts +0 -1
  551. package/dist/core/__tests__/full/cascade-close.test.js +0 -240
  552. package/dist/core/__tests__/full/detach-focus.test.d.ts +0 -1
  553. package/dist/core/__tests__/full/detach-focus.test.js +0 -126
  554. package/dist/core/__tests__/full/idle-release-settlement.test.d.ts +0 -1
  555. package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.d.ts +0 -1
  556. package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.js +0 -107
  557. package/dist/core/__tests__/full/park-clock-release.test.d.ts +0 -1
  558. package/dist/core/__tests__/full/park-clock-release.test.js +0 -56
  559. package/dist/core/__tests__/full/yield-message-transaction.test.d.ts +0 -1
  560. package/dist/core/__tests__/memory-index-render.test.d.ts +0 -1
  561. package/dist/core/__tests__/memory-index-render.test.js +0 -60
  562. package/dist/core/__tests__/model-routes.test.d.ts +0 -1
  563. package/dist/core/__tests__/model-routes.test.js +0 -41
  564. package/dist/core/__tests__/on-read-identity.test.d.ts +0 -1
  565. package/dist/core/__tests__/on-read-identity.test.js +0 -61
  566. package/dist/core/__tests__/phase4-review-migration.test.d.ts +0 -1
  567. package/dist/core/__tests__/phase4-review-migration.test.js +0 -100
  568. package/dist/core/__tests__/prune-to-limit.test.d.ts +0 -1
  569. package/dist/core/__tests__/prune-to-limit.test.js +0 -126
  570. package/dist/core/__tests__/reset.test.d.ts +0 -1
  571. package/dist/core/__tests__/reset.test.js +0 -69
  572. package/dist/core/__tests__/spawn-no-kickoff.test.d.ts +0 -1
  573. package/dist/core/__tests__/spawn-no-kickoff.test.js +0 -115
  574. package/dist/core/__tests__/steer-note.test.d.ts +0 -1
  575. package/dist/core/__tests__/steer-note.test.js +0 -41
  576. package/dist/core/__tests__/subcommand-tier.test.d.ts +0 -1
  577. package/dist/core/__tests__/subcommand-tier.test.js +0 -99
  578. package/dist/core/__tests__/subscription-delivery.test.js +0 -211
  579. package/dist/core/__tests__/test-runner-cheap-sharding.test.d.ts +0 -1
  580. package/dist/core/__tests__/test-runner-cheap-sharding.test.js +0 -97
  581. package/dist/core/__tests__/tmux-surface.test.js +0 -484
  582. package/dist/core/__tests__/wake-bearings.test.d.ts +0 -1
  583. package/dist/core/__tests__/wake-bearings.test.js +0 -102
  584. package/dist/core/canvas/__tests__/remote-event-stream.test.d.ts +0 -1
  585. package/dist/core/canvas/__tests__/remote-event-stream.test.js +0 -146
  586. package/dist/core/canvas/__tests__/source-resolve.test.d.ts +0 -1
  587. package/dist/core/canvas/__tests__/source-resolve.test.js +0 -77
  588. package/dist/core/canvas/browse/__tests__/model.test.d.ts +0 -1
  589. package/dist/core/canvas/browse/__tests__/model.test.js +0 -290
  590. package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.d.ts +0 -1
  591. package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.js +0 -134
  592. package/dist/core/canvas/browse/__tests__/render.test.d.ts +0 -1
  593. package/dist/core/canvas/browse/__tests__/render.test.js +0 -111
  594. package/dist/core/canvas/browse/rebuild-coalescer.d.ts +0 -7
  595. package/dist/core/canvas/browse/rebuild-coalescer.js +0 -61
  596. package/dist/core/canvas/remote-event-stream.d.ts +0 -24
  597. package/dist/core/canvas/remote-event-stream.js +0 -94
  598. package/dist/core/feed/__tests__/coalesce-human.test.d.ts +0 -1
  599. package/dist/core/feed/__tests__/coalesce-human.test.js +0 -36
  600. package/dist/core/feed/__tests__/empty-node-guard.test.d.ts +0 -1
  601. package/dist/core/feed/__tests__/empty-node-guard.test.js +0 -45
  602. package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.d.ts +0 -1
  603. package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.js +0 -84
  604. package/dist/core/human/__tests__/visible-paths.test.d.ts +0 -1
  605. package/dist/core/human/__tests__/visible-paths.test.js +0 -28
  606. package/dist/core/keybindings/__tests__/inbox-affordance.test.d.ts +0 -1
  607. package/dist/core/keybindings/__tests__/inbox-affordance.test.js +0 -38
  608. package/dist/core/review/__tests__/project.test.d.ts +0 -1
  609. package/dist/core/review/__tests__/project.test.js +0 -71
  610. package/dist/core/runtime/__tests__/command-expansion.test.d.ts +0 -1
  611. package/dist/core/runtime/__tests__/command-expansion.test.js +0 -25
  612. package/dist/core/runtime/__tests__/session-visibility.test.d.ts +0 -1
  613. package/dist/core/runtime/__tests__/session-visibility.test.js +0 -119
  614. package/dist/core/runtime/__tests__/spawn-at-given-id.test.d.ts +0 -1
  615. package/dist/core/runtime/__tests__/spawn-at-given-id.test.js +0 -34
  616. package/dist/core/runtime/tmux.js +0 -1314
  617. package/dist/daemon/api/__tests__/full/push-parity.test.d.ts +0 -1
  618. package/dist/daemon/api/__tests__/full/worktree-parity.test.d.ts +0 -1
  619. package/dist/daemon/api/__tests__/full/worktree-parity.test.js +0 -160
  620. package/dist/daemon/api/__tests__/inbox.test.d.ts +0 -1
  621. package/dist/daemon/api/__tests__/inbox.test.js +0 -489
  622. package/dist/web-client/apple-touch-icon.png +0 -0
  623. package/dist/web-client/assets/fragment-mono-latin-400-normal-BYwT3kSJ.woff +0 -0
  624. package/dist/web-client/assets/fragment-mono-latin-400-normal-yxdJ5AmL.woff2 +0 -0
  625. package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-BbKYyvR9.woff2 +0 -0
  626. package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-CT4YFKeK.woff +0 -0
  627. package/dist/web-client/assets/index-CCPaLeW7.css +0 -2
  628. package/dist/web-client/assets/index-kyOWsnZK.js +0 -86
  629. package/dist/web-client/assets/martian-mono-cyrillic-wght-normal-B84CD5C_.woff2 +0 -0
  630. package/dist/web-client/assets/martian-mono-latin-ext-wght-normal-DlL6xMw5.woff2 +0 -0
  631. package/dist/web-client/assets/martian-mono-latin-wght-normal-5W32yIyr.woff2 +0 -0
  632. package/dist/web-client/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -2
  633. package/dist/web-client/icon-192.png +0 -0
  634. package/dist/web-client/icon-512.png +0 -0
  635. package/dist/web-client/icon-maskable-512.png +0 -0
  636. package/dist/web-client/index.html +0 -17
  637. package/dist/web-client/manifest.webmanifest +0 -1
  638. package/dist/web-client/sw.js +0 -1
  639. /package/dist/api/__tests__/{client.test.d.ts → serial/client.test.d.ts} +0 -0
  640. /package/dist/clients/inbox/__tests__/{inbox-controller.test.d.ts → serial/inbox-controller.test.d.ts} +0 -0
  641. /package/dist/clients/inbox/__tests__/{mount-panel.test.d.ts → serial/mount-panel.test.d.ts} +0 -0
  642. /package/dist/clients/{attach/__tests__/attach-chrome-remote.test.d.ts → inbox/review/__tests__/teardown-notice.test.d.ts} +0 -0
  643. /package/dist/{clients/attach/__tests__/attach-keybindings.test.d.ts → core/__tests__/broker-extension-canvas-db-boundary.test.d.ts} +0 -0
  644. /package/dist/{clients/attach/__tests__/crtr-output-coverage.test.d.ts → core/__tests__/seam/broker-attach-multiclient.test.d.ts} +0 -0
  645. /package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.d.ts +0 -0
  646. /package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.d.ts +0 -0
  647. /package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.d.ts +0 -0
  648. /package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.d.ts +0 -0
  649. /package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.d.ts +0 -0
  650. /package/dist/{clients/attach/__tests__/editor-frame-title.test.d.ts → core/__tests__/seam/dormancy-release.test.d.ts} +0 -0
  651. /package/dist/{clients/attach/__tests__/input-controller-extension-command.test.d.ts → core/__tests__/seam/yield-refresh-transaction.test.d.ts} +0 -0
  652. /package/dist/core/__tests__/{broker-fork-seam.test.d.ts → serial/broker-fork-seam.test.d.ts} +0 -0
  653. /package/dist/core/__tests__/{broker-sdk-wiring.test.d.ts → serial/broker-sdk-wiring.test.d.ts} +0 -0
  654. /package/dist/core/__tests__/{broker-snapshot-history.test.d.ts → serial/broker-snapshot-history.test.d.ts} +0 -0
  655. /package/dist/core/__tests__/{command-plugins.test.d.ts → serial/command-plugins.test.d.ts} +0 -0
  656. /package/dist/core/__tests__/{deferred-no-wake.test.d.ts → serial/deferred-no-wake.test.d.ts} +0 -0
  657. /package/dist/core/__tests__/{flagship-lifecycle.test.d.ts → serial/flagship-lifecycle.test.d.ts} +0 -0
  658. /package/dist/core/__tests__/{host-teardown-process-group.test.d.ts → serial/host-teardown-process-group.test.d.ts} +0 -0
  659. /package/dist/core/__tests__/{human-deliver-e2e.test.d.ts → serial/human-deliver-e2e.test.d.ts} +0 -0
  660. /package/dist/core/__tests__/{live-mutation.test.d.ts → serial/live-mutation.test.d.ts} +0 -0
  661. /package/dist/core/__tests__/{refresh-stall-recycle.test.d.ts → serial/refresh-stall-recycle.test.d.ts} +0 -0
  662. /package/dist/core/__tests__/{revive.test.d.ts → serial/revive.test.d.ts} +0 -0
  663. /package/dist/core/__tests__/{spawn-root.test.d.ts → serial/spawn-root.test.d.ts} +0 -0
  664. /package/dist/core/__tests__/{subscription-delivery.test.d.ts → serial/subscription-delivery.test.d.ts} +0 -0
  665. /package/dist/core/__tests__/{tmux-surface.test.d.ts → serial/tmux-surface.test.d.ts} +0 -0
  666. /package/dist/core/__tests__/{worktree.test.d.ts → serial/worktree.test.d.ts} +0 -0
  667. /package/dist/{clients/attach/__tests__/markdown-headings.test.d.ts → core/__tests__/watchdog-abort-arms-retry.test.d.ts} +0 -0
  668. /package/dist/{clients/attach/__tests__/session-identity-refresh.test.d.ts → core/broker-client/__tests__/transport-socket.test.d.ts} +0 -0
  669. /package/dist/core/human/__tests__/{inbox-core.test.d.ts → serial/inbox-core.test.d.ts} +0 -0
  670. /package/dist/{clients/inbox/review/__tests__/remap.test.d.ts → daemon/api/__tests__/node-model-validation.test.d.ts} +0 -0
  671. /package/dist/{clients/surfaces/region.js → daemon/api/__tests__/review-terminal-conflict.test.d.ts} +0 -0
  672. /package/dist/daemon/api/__tests__/{full → seam}/api-server.test.d.ts +0 -0
  673. /package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.d.ts +0 -0
  674. /package/dist/{clients/web/__tests__/push-engine.test.d.ts → daemon/api/__tests__/seam/leaf-api-parity.test.d.ts} +0 -0
@@ -1,196 +0,0 @@
1
- import { describe, it } from 'node:test';
2
- import assert from 'node:assert/strict';
3
- import { buildLineMap, remapRange } from '../remap.js';
4
- describe('remap', () => {
5
- describe('buildLineMap', () => {
6
- it('identity mapping when content unchanged', () => {
7
- const lines = ['line 1', 'line 2', 'line 3'];
8
- const map = buildLineMap(lines, lines);
9
- assert.equal(map.get(0), 0);
10
- assert.equal(map.get(1), 1);
11
- assert.equal(map.get(2), 2);
12
- });
13
- it('preserves normalized equivalence', () => {
14
- const oldLines = ['line 1', ' line 2 ', 'line 3'];
15
- const newLines = ['line 1', 'line 2', 'line 3'];
16
- const map = buildLineMap(oldLines, newLines);
17
- // All lines are normalized equivalent, so they map 1:1
18
- assert.equal(map.get(0), 0);
19
- assert.equal(map.get(1), 1);
20
- assert.equal(map.get(2), 2);
21
- });
22
- it('handles common prefix', () => {
23
- const oldLines = ['a', 'b', 'c', 'x'];
24
- const newLines = ['a', 'b', 'c', 'x'];
25
- const map = buildLineMap(oldLines, newLines);
26
- // All lines match 1:1
27
- assert.equal(map.get(0), 0);
28
- assert.equal(map.get(1), 1);
29
- assert.equal(map.get(2), 2);
30
- assert.equal(map.get(3), 3);
31
- });
32
- it('handles common suffix', () => {
33
- const oldLines = ['x', 'a', 'b', 'c'];
34
- const newLines = ['x', 'a', 'b', 'c'];
35
- const map = buildLineMap(oldLines, newLines);
36
- assert.equal(map.get(0), 0);
37
- assert.equal(map.get(1), 1);
38
- assert.equal(map.get(2), 2);
39
- assert.equal(map.get(3), 3);
40
- });
41
- it('handles insertion above range', () => {
42
- const oldLines = ['x', 'y', 'z'];
43
- const newLines = ['a', 'b', 'x', 'y', 'z'];
44
- const map = buildLineMap(oldLines, newLines);
45
- // Original lines are shifted down by 2
46
- assert.equal(map.get(0), 2); // 'x'
47
- assert.equal(map.get(1), 3); // 'y'
48
- assert.equal(map.get(2), 4); // 'z'
49
- });
50
- it('handles deletion creating gaps', () => {
51
- const oldLines = ['a', 'b', 'c', 'd', 'e'];
52
- const newLines = ['a', 'c', 'e'];
53
- const map = buildLineMap(oldLines, newLines);
54
- assert.equal(map.get(0), 0); // 'a'
55
- assert.equal(map.get(1), undefined); // 'b' deleted
56
- assert.equal(map.get(2), 1); // 'c'
57
- assert.equal(map.get(3), undefined); // 'd' deleted
58
- assert.equal(map.get(4), 2); // 'e'
59
- });
60
- });
61
- describe('remapRange', () => {
62
- it('returns kept when both endpoints unmoved', () => {
63
- const oldLines = ['a', 'b', 'c', 'd'];
64
- const newLines = ['a', 'b', 'c', 'd'];
65
- const map = buildLineMap(oldLines, newLines);
66
- const result = remapRange(map, { line: 1, endLine: 3 });
67
- assert.equal(result.kind, 'kept');
68
- if (result.kind === 'kept') {
69
- assert.equal(result.line, 1);
70
- assert.equal(result.endLine, 3);
71
- }
72
- });
73
- it('pure insertion above range keeps content identity', () => {
74
- const oldLines = ['x', 'y', 'z'];
75
- const newLines = ['a', 'b', 'x', 'y', 'z'];
76
- const map = buildLineMap(oldLines, newLines);
77
- // Range [0, 2] in old file → should map to [2, 4] in new
78
- const result = remapRange(map, { line: 0, endLine: 2 });
79
- assert.equal(result.kind, 'shifted');
80
- if (result.kind === 'shifted') {
81
- assert.equal(result.line, 2);
82
- assert.equal(result.endLine, 4);
83
- }
84
- });
85
- it('pure deletion of whole range yields detached', () => {
86
- const oldLines = ['a', 'b', 'c', 'd', 'e'];
87
- const newLines = ['a', 'e'];
88
- const map = buildLineMap(oldLines, newLines);
89
- // Range [1, 4] contains only deleted lines
90
- const result = remapRange(map, { line: 1, endLine: 4 });
91
- assert.equal(result.kind, 'detached');
92
- });
93
- it('partial range deletion yields shifted', () => {
94
- const oldLines = ['a', 'b', 'c', 'd', 'e'];
95
- const newLines = ['a', 'c', 'e'];
96
- const map = buildLineMap(oldLines, newLines);
97
- // Range [0, 3] contains 'a' (survives), 'b' (deleted), 'c' (survives), 'd' (deleted)
98
- // Should remap to min=0, max=1 (the span of survivors)
99
- const result = remapRange(map, { line: 0, endLine: 3 });
100
- assert.equal(result.kind, 'shifted');
101
- if (result.kind === 'shifted') {
102
- assert.equal(result.line, 0); // min of survivors
103
- assert.equal(result.endLine, 2); // max + 1
104
- }
105
- });
106
- it('reindentation of entire file yields kept', () => {
107
- const oldLines = [' line 1', ' line 2', ' line 3'];
108
- const newLines = [' line 1', ' line 2', ' line 3'];
109
- const map = buildLineMap(oldLines, newLines);
110
- // After normalization, all lines match 1:1
111
- const result = remapRange(map, { line: 0, endLine: 3 });
112
- assert.equal(result.kind, 'kept');
113
- if (result.kind === 'kept') {
114
- assert.equal(result.line, 0);
115
- assert.equal(result.endLine, 3);
116
- }
117
- });
118
- it('handles range with one survivor in middle', () => {
119
- const oldLines = [
120
- 'keep1',
121
- 'delete1',
122
- 'delete2',
123
- 'keep2',
124
- 'delete3',
125
- ];
126
- const newLines = ['keep1', 'keep2'];
127
- const map = buildLineMap(oldLines, newLines);
128
- // Range [1, 4] covers delete1, delete2, keep2
129
- // Only keep2 survives at index 1
130
- const result = remapRange(map, { line: 1, endLine: 4 });
131
- assert.equal(result.kind, 'shifted');
132
- if (result.kind === 'shifted') {
133
- assert.equal(result.line, 1);
134
- assert.equal(result.endLine, 2);
135
- }
136
- });
137
- it('detached when entire range deleted', () => {
138
- const oldLines = ['a', 'b', 'c', 'd'];
139
- const newLines = ['a', 'd'];
140
- const map = buildLineMap(oldLines, newLines);
141
- // Range [1, 3] contains only 'b' and 'c', both deleted
142
- const result = remapRange(map, { line: 1, endLine: 3 });
143
- assert.equal(result.kind, 'detached');
144
- });
145
- it('handles range at start', () => {
146
- const oldLines = ['x', 'keep1', 'keep2', 'keep3'];
147
- const newLines = ['keep1', 'keep2', 'keep3'];
148
- const map = buildLineMap(oldLines, newLines);
149
- // Range [1, 3] should map to [0, 2]
150
- const result = remapRange(map, { line: 1, endLine: 3 });
151
- assert.equal(result.kind, 'shifted');
152
- if (result.kind === 'shifted') {
153
- assert.equal(result.line, 0);
154
- assert.equal(result.endLine, 2);
155
- }
156
- });
157
- it('handles range at end', () => {
158
- const oldLines = ['keep1', 'keep2', 'keep3', 'x'];
159
- const newLines = ['keep1', 'keep2', 'keep3'];
160
- const map = buildLineMap(oldLines, newLines);
161
- // Range [1, 4] should map to [1, 3]
162
- const result = remapRange(map, { line: 1, endLine: 4 });
163
- assert.equal(result.kind, 'shifted');
164
- if (result.kind === 'shifted') {
165
- assert.equal(result.line, 1);
166
- assert.equal(result.endLine, 3);
167
- }
168
- });
169
- });
170
- describe('performance', () => {
171
- it('5000-line file with 20-line edit completes quickly', () => {
172
- // Build old file: 5000 identical lines
173
- const oldLines = [];
174
- for (let i = 0; i < 5000; i++) {
175
- oldLines.push(`line ${i}`);
176
- }
177
- // Build new file: insert 20 lines at position 2000
178
- const newLines = [
179
- ...oldLines.slice(0, 2000),
180
- ...Array.from({ length: 20 }, (_, i) => `inserted ${i}`),
181
- ...oldLines.slice(2000),
182
- ];
183
- // Measure time
184
- const start = performance.now();
185
- const map = buildLineMap(oldLines, newLines);
186
- const elapsed = performance.now() - start;
187
- // Should complete in well under 10s (the ordinary test budget)
188
- // Even a naive implementation should handle this in <100ms
189
- assert(elapsed < 1000, `buildLineMap took ${elapsed}ms, should be <1000ms`);
190
- // Verify a few mappings
191
- assert.equal(map.get(1999), 1999);
192
- assert.equal(map.get(2000), 2020); // shifted by 20
193
- assert.equal(map.get(2001), 2021);
194
- });
195
- });
196
- });
@@ -1,22 +0,0 @@
1
- export declare const MIN_DOC_COLS = 56;
2
- export declare const MIN_CHAT_COLS = 40;
3
- export declare const GUTTER_COLS = 3;
4
- export declare const SPLIT_MIN_COLS: number;
5
- export declare const DOC_TARGET = 0.58;
6
- export declare const DOC_CAP = 126;
7
- export declare const MIN_REGION_ROWS = 8;
8
- export type FocusOwner = 'document' | 'companion';
9
- export interface Rect {
10
- readonly col: number;
11
- readonly cols: number;
12
- readonly rows: number;
13
- }
14
- export interface Layout {
15
- readonly mode: 'split' | 'single';
16
- readonly docRect?: Rect;
17
- readonly chatRect?: Rect;
18
- readonly visible?: FocusOwner;
19
- readonly gutterCol?: number;
20
- readonly statusRow: number | undefined;
21
- }
22
- export declare function solveReviewLayout(cols: number, rows: number, focusOwner: FocusOwner): Layout;
@@ -1,40 +0,0 @@
1
- export const MIN_DOC_COLS = 56;
2
- export const MIN_CHAT_COLS = 40;
3
- export const GUTTER_COLS = 3;
4
- export const SPLIT_MIN_COLS = MIN_DOC_COLS + GUTTER_COLS + MIN_CHAT_COLS;
5
- export const DOC_TARGET = 0.58;
6
- export const DOC_CAP = 126;
7
- export const MIN_REGION_ROWS = 8;
8
- function singleLayout(cols, rows, focusOwner, mode, statusRow) {
9
- const rect = { col: 0, cols, rows: statusRow === undefined ? rows : rows - 1 };
10
- return {
11
- mode,
12
- ...(focusOwner === 'document' ? { docRect: rect } : { chatRect: rect }),
13
- visible: focusOwner,
14
- statusRow,
15
- };
16
- }
17
- export function solveReviewLayout(cols, rows, focusOwner) {
18
- const statusRow = rows >= MIN_REGION_ROWS ? rows - 1 : undefined;
19
- if (cols < SPLIT_MIN_COLS) {
20
- return singleLayout(cols, rows, focusOwner, 'single', statusRow);
21
- }
22
- const regionRows = statusRow === undefined ? rows : rows - 1;
23
- let docCols = Math.min(DOC_CAP, Math.max(MIN_DOC_COLS, Math.round(cols * DOC_TARGET)));
24
- let chatCols = cols - GUTTER_COLS - docCols;
25
- if (chatCols < MIN_CHAT_COLS) {
26
- docCols = cols - GUTTER_COLS - MIN_CHAT_COLS;
27
- chatCols = MIN_CHAT_COLS;
28
- }
29
- if (docCols < MIN_DOC_COLS) {
30
- return singleLayout(cols, rows, focusOwner, 'single', statusRow);
31
- }
32
- const gutterCol = docCols + 1;
33
- return {
34
- mode: 'split',
35
- docRect: { col: 0, cols: docCols, rows: regionRows },
36
- chatRect: { col: docCols + GUTTER_COLS, cols: chatCols, rows: regionRows },
37
- gutterCol,
38
- statusRow,
39
- };
40
- }
@@ -1,60 +0,0 @@
1
- import type { SurfaceComponent, SurfaceHandle } from '../../surfaces/host.js';
2
- import type { SurfaceRegion } from '../../surfaces/region.js';
3
- /** The document's one optional composition seam. `DocumentRegion` adds this
4
- * method when it can state whether Esc would discard typed, unsubmitted text. */
5
- export interface ReviewDocumentRegion extends SurfaceRegion {
6
- hasUnsentCompose?(): boolean;
7
- }
8
- export interface ReviewCompositionOptions {
9
- document: ReviewDocumentRegion;
10
- companion: SurfaceRegion;
11
- /** Surface-wide transients only. */
12
- notice(text: string): void;
13
- /** Runs after both regions have released their resources. */
14
- onRequestClose(): void;
15
- }
16
- /** The one mounted review surface. Its children are rectangles, never nested
17
- * host surfaces, so this component owns their shared geometry and cursor. */
18
- export declare class ReviewCompositionComponent implements SurfaceComponent {
19
- private readonly document;
20
- private readonly companion;
21
- private readonly notice;
22
- private readonly onRequestClose;
23
- private handle;
24
- private rows;
25
- private focusOwner;
26
- private rootFocused;
27
- private closed;
28
- private closeRequested;
29
- private suspendCount;
30
- private escapeConfirmArmed;
31
- private layout;
32
- constructor(opts: ReviewCompositionOptions);
33
- get focused(): boolean;
34
- set focused(value: boolean);
35
- setRows(rows: number): void;
36
- render(width: number): string[];
37
- handleInput(data: string): void;
38
- /** The host reports SGR columns as 1-based. This is the sole conversion
39
- * boundary; all layout rectangles and comparisons are 0-based. */
40
- handleWheel(direction: 'up' | 'down', lines: number, column: number): boolean;
41
- /** Region dirty callbacks call this only while the mounted composition can
42
- * repaint. */
43
- invalidate(): void;
44
- setHandle(handle: SurfaceHandle): void;
45
- /** Called alongside the host's suspend/resume closure by the future composed
46
- * owner. It withholds all paints until every outstanding child suspension has
47
- * resumed, without owning or importing the host terminal operation itself. */
48
- suspendForChild(): () => void;
49
- /** Ordered, idempotent release: the document first stops its watcher and
50
- * cache, then no late dirty callback may repaint, then the companion ends its
51
- * redial/socket/chat resources before the owner releases its references. */
52
- close(): void;
53
- private renderSingle;
54
- private renderSplit;
55
- private focusedRegion;
56
- private visibleRegion;
57
- private setFocus;
58
- private syncFocus;
59
- private requestClose;
60
- }
@@ -1,278 +0,0 @@
1
- import { CURSOR_MARKER, Key, matchesKey } from '@earendil-works/pi-tui';
2
- import { clipLine, CYAN, DIM, RESET, visibleWidth } from '../tui/ansi.js';
3
- import { solveReviewLayout } from './columns.js';
4
- /** The one mounted review surface. Its children are rectangles, never nested
5
- * host surfaces, so this component owns their shared geometry and cursor. */
6
- export class ReviewCompositionComponent {
7
- document;
8
- companion;
9
- notice;
10
- onRequestClose;
11
- handle;
12
- rows = 0;
13
- focusOwner = 'document';
14
- rootFocused = false;
15
- closed = false;
16
- closeRequested = false;
17
- suspendCount = 0;
18
- escapeConfirmArmed = false;
19
- layout;
20
- constructor(opts) {
21
- this.document = opts.document;
22
- this.companion = opts.companion;
23
- this.notice = opts.notice;
24
- this.onRequestClose = opts.onRequestClose;
25
- this.document.onDirty(() => this.invalidate());
26
- this.companion.onDirty(() => this.invalidate());
27
- this.syncFocus();
28
- }
29
- get focused() {
30
- return this.rootFocused;
31
- }
32
- set focused(value) {
33
- if (this.rootFocused === value)
34
- return;
35
- this.rootFocused = value;
36
- this.syncFocus();
37
- this.invalidate();
38
- }
39
- setRows(rows) {
40
- this.rows = Math.max(0, Math.floor(rows));
41
- }
42
- render(width) {
43
- const cols = Math.max(0, Math.floor(width));
44
- if (this.closed || this.suspendCount > 0)
45
- return blankFrame(cols, this.rows);
46
- const solved = solveReviewLayout(cols, this.rows, this.focusOwner);
47
- const layout = solved.statusRow === undefined ? focusedOnlyLayout(cols, this.rows, this.focusOwner) : solved;
48
- this.layout = layout;
49
- this.syncFocus();
50
- if (layout.mode === 'single')
51
- return this.renderSingle(layout, cols);
52
- return this.renderSplit(layout, cols);
53
- }
54
- handleInput(data) {
55
- if (this.closed || this.suspendCount > 0)
56
- return;
57
- if (isFocusLeft(data)) {
58
- this.setFocus('document');
59
- return;
60
- }
61
- if (isFocusRight(data)) {
62
- this.setFocus('companion');
63
- return;
64
- }
65
- if (this.focusOwner === 'document' && isEscape(data)) {
66
- if (this.escapeConfirmArmed) {
67
- this.escapeConfirmArmed = false;
68
- if (this.document.handleInput(data))
69
- return;
70
- this.requestClose();
71
- return;
72
- }
73
- if (this.document.hasUnsentCompose?.() === true) {
74
- this.escapeConfirmArmed = true;
75
- this.notice('unsent comment — press esc again to discard');
76
- this.invalidate();
77
- return;
78
- }
79
- // Compose mode owns Esc when its buffer is empty; view mode deliberately
80
- // returns false so the composition can close the full pane.
81
- if (this.document.handleInput(data))
82
- return;
83
- this.requestClose();
84
- return;
85
- }
86
- if (this.escapeConfirmArmed)
87
- this.escapeConfirmArmed = false;
88
- this.focusedRegion().handleInput(data);
89
- }
90
- /** The host reports SGR columns as 1-based. This is the sole conversion
91
- * boundary; all layout rectangles and comparisons are 0-based. */
92
- handleWheel(direction, lines, column) {
93
- if (this.closed || this.suspendCount > 0)
94
- return true;
95
- const layout = this.layout;
96
- if (layout === undefined)
97
- return true;
98
- const zeroColumn = Math.floor(column) - 1;
99
- if (layout.mode === 'single') {
100
- this.visibleRegion(layout).handleWheel(direction, lines);
101
- return true;
102
- }
103
- if (contains(layout.docRect, zeroColumn))
104
- this.document.handleWheel(direction, lines);
105
- else if (contains(layout.chatRect, zeroColumn))
106
- this.companion.handleWheel(direction, lines);
107
- // A gutter or out-of-rectangle wheel is intentionally consumed: the outer
108
- // transcript must never scroll while a full-pane review is mounted.
109
- return true;
110
- }
111
- /** Region dirty callbacks call this only while the mounted composition can
112
- * repaint. */
113
- invalidate() {
114
- if (!this.closed && this.suspendCount === 0)
115
- this.handle?.invalidate();
116
- }
117
- setHandle(handle) {
118
- if (this.handle !== undefined)
119
- return;
120
- this.handle = handle;
121
- handle.onClose(() => this.close());
122
- }
123
- /** Called alongside the host's suspend/resume closure by the future composed
124
- * owner. It withholds all paints until every outstanding child suspension has
125
- * resumed, without owning or importing the host terminal operation itself. */
126
- suspendForChild() {
127
- if (this.closed)
128
- return () => { };
129
- this.suspendCount++;
130
- let resumed = false;
131
- return () => {
132
- if (resumed)
133
- return;
134
- resumed = true;
135
- this.suspendCount = Math.max(0, this.suspendCount - 1);
136
- if (!this.closed && this.suspendCount === 0)
137
- this.invalidate();
138
- };
139
- }
140
- /** Ordered, idempotent release: the document first stops its watcher and
141
- * cache, then no late dirty callback may repaint, then the companion ends its
142
- * redial/socket/chat resources before the owner releases its references. */
143
- close() {
144
- if (this.closed)
145
- return;
146
- this.document.close();
147
- this.closed = true;
148
- this.companion.close();
149
- this.onRequestClose();
150
- }
151
- renderSingle(layout, cols) {
152
- const visible = this.visibleRegion(layout);
153
- const hidden = layout.visible === 'document' ? this.companion : this.document;
154
- // CompanionRegion treats zero geometry as its unread-count signal. Push it
155
- // every layout pass rather than only when crossing the narrow breakpoint.
156
- hidden.setViewport(0, 0);
157
- const rect = layout.visible === 'document' ? layout.docRect : layout.chatRect;
158
- const lines = renderRect(visible, rect);
159
- return layout.statusRow === undefined
160
- ? exactFrame(lines, cols, this.rows)
161
- : [...lines, statusLine(this.document.summary(), this.companion.summary(), this.focusOwner, cols)];
162
- }
163
- renderSplit(layout, cols) {
164
- const docRect = layout.docRect;
165
- const chatRect = layout.chatRect;
166
- const document = renderRect(this.document, docRect);
167
- const companion = renderRect(this.companion, chatRect);
168
- const gutter = `${DIM} │ ${RESET}`;
169
- const lines = [];
170
- for (let row = 0; row < docRect.rows; row++) {
171
- const docLine = this.focusOwner === 'document' ? document[row] : stripMarkers(document[row]);
172
- const chatLine = this.focusOwner === 'companion' ? companion[row] : stripMarkers(companion[row]);
173
- lines.push(padLine(`${docLine}${gutter}${chatLine}`, cols));
174
- }
175
- lines.push(statusLine(this.document.summary(), this.companion.summary(), this.focusOwner, cols));
176
- return exactFrame(lines, cols, this.rows);
177
- }
178
- focusedRegion() {
179
- return this.focusOwner === 'document' ? this.document : this.companion;
180
- }
181
- visibleRegion(layout) {
182
- return layout.visible === 'document' ? this.document : this.companion;
183
- }
184
- setFocus(owner) {
185
- if (this.focusOwner === owner)
186
- return;
187
- this.focusOwner = owner;
188
- this.escapeConfirmArmed = false;
189
- this.syncFocus();
190
- this.invalidate();
191
- }
192
- syncFocus() {
193
- this.document.setFocused(this.rootFocused && this.focusOwner === 'document');
194
- this.companion.setFocused(this.rootFocused && this.focusOwner === 'companion');
195
- }
196
- requestClose() {
197
- if (this.closeRequested || this.closed)
198
- return;
199
- this.closeRequested = true;
200
- if (this.handle !== undefined) {
201
- this.handle.close();
202
- return;
203
- }
204
- this.close();
205
- }
206
- }
207
- function isFocusLeft(data) {
208
- return matchesKey(data, Key.altShift('left')) || data === '\x1b[1;4D';
209
- }
210
- function isFocusRight(data) {
211
- return matchesKey(data, Key.altShift('right')) || data === '\x1b[1;4C';
212
- }
213
- function isEscape(data) {
214
- return matchesKey(data, Key.escape);
215
- }
216
- /** Below the minimum useful height, the focused region owns the entire pane;
217
- * no status row or short split is rendered. */
218
- function focusedOnlyLayout(cols, rows, focusOwner) {
219
- const rect = { col: 0, cols, rows };
220
- return {
221
- mode: 'single',
222
- ...(focusOwner === 'document' ? { docRect: rect } : { chatRect: rect }),
223
- visible: focusOwner,
224
- statusRow: undefined,
225
- };
226
- }
227
- function renderRect(region, rect) {
228
- region.setViewport(rect.cols, rect.rows);
229
- return exactFrame(region.render(), rect.cols, rect.rows);
230
- }
231
- function contains(rect, column) {
232
- return rect !== undefined && column >= rect.col && column < rect.col + rect.cols;
233
- }
234
- function stripMarkers(line) {
235
- return line.split(CURSOR_MARKER).join('');
236
- }
237
- function blankFrame(cols, rows) {
238
- return new Array(rows).fill(' '.repeat(cols));
239
- }
240
- function exactFrame(lines, cols, rows) {
241
- const frame = lines.slice(0, rows).map((line) => padLine(line, cols));
242
- while (frame.length < rows)
243
- frame.push(' '.repeat(cols));
244
- return frame;
245
- }
246
- function padLine(line, cols) {
247
- const markerAt = line.indexOf(CURSOR_MARKER);
248
- if (markerAt === -1) {
249
- const clipped = clipLine(line, cols);
250
- return clipped + ' '.repeat(Math.max(0, cols - visibleWidth(clipped)));
251
- }
252
- // `string-width` correctly ignores ANSI but cannot know pi-tui's private
253
- // marker is zero-width. Fit the visible text on either side independently,
254
- // then restore the marker only when its cursor cell remains in the rectangle.
255
- const before = line.slice(0, markerAt);
256
- const after = line.slice(markerAt + CURSOR_MARKER.length);
257
- const clippedBefore = clipLine(before, cols);
258
- const beforeWidth = visibleWidth(clippedBefore);
259
- if (beforeWidth >= cols)
260
- return padLine(stripMarkers(line), cols);
261
- const clippedAfter = clipLine(after, cols - beforeWidth);
262
- const fitted = `${clippedBefore}${CURSOR_MARKER}${clippedAfter}`;
263
- return fitted + ' '.repeat(Math.max(0, cols - visibleWidth(stripMarkers(fitted))));
264
- }
265
- function statusLine(document, companion, focusOwner, cols) {
266
- const left = tint(document, focusOwner === 'document');
267
- const right = tint(companion, focusOwner === 'companion');
268
- const availableForLeft = Math.max(0, cols - visibleWidth(right) - (document === '' || companion === '' ? 0 : 1));
269
- const clippedLeft = clipLine(left, availableForLeft);
270
- const separator = document === '' || companion === '' ? '' : ' ';
271
- const body = `${clippedLeft}${' '.repeat(Math.max(0, cols - visibleWidth(clippedLeft) - visibleWidth(right) - visibleWidth(separator)))}${separator}${right}`;
272
- return padLine(body, cols);
273
- }
274
- function tint(text, focused) {
275
- if (text === '')
276
- return '';
277
- return `${focused ? CYAN : DIM}${text}${RESET}`;
278
- }