@north-light/crouter 0.3.172 → 0.3.174

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 (673) 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} +106 -177
  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 +55 -0
  46. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +60 -0
  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/node/bash.d.ts +1 -0
  138. package/dist/commands/node/bash.js +198 -0
  139. package/dist/commands/node/create.d.ts +23 -0
  140. package/dist/commands/node/create.js +207 -0
  141. package/dist/commands/node/inspect.d.ts +2 -0
  142. package/dist/commands/node/inspect.js +302 -0
  143. package/dist/commands/node/lifecycle.d.ts +4 -0
  144. package/dist/commands/node/lifecycle.js +415 -0
  145. package/dist/commands/node/message.d.ts +1 -0
  146. package/dist/commands/node/message.js +164 -0
  147. package/dist/commands/node/pyramid.d.ts +2 -0
  148. package/dist/commands/node/pyramid.js +79 -0
  149. package/dist/commands/node/subscription.d.ts +1 -0
  150. package/dist/commands/node/subscription.js +82 -0
  151. package/dist/commands/node/wait.d.ts +1 -0
  152. package/dist/commands/node/wait.js +159 -0
  153. package/dist/commands/node-lifecycle-revive.js +10 -57
  154. package/dist/commands/node.d.ts +0 -42
  155. package/dist/commands/node.js +11 -2065
  156. package/dist/commands/search.js +1 -1
  157. package/dist/commands/surface/node/cycle.d.ts +1 -0
  158. package/dist/commands/surface/node/cycle.js +83 -0
  159. package/dist/commands/surface/node/focus.d.ts +1 -0
  160. package/dist/commands/surface/node/focus.js +67 -0
  161. package/dist/commands/surface/node/id.d.ts +1 -0
  162. package/dist/commands/surface/node/id.js +38 -0
  163. package/dist/commands/surface/node/pin.d.ts +1 -0
  164. package/dist/commands/surface/node/pin.js +42 -0
  165. package/dist/commands/surface/node/placement.d.ts +46 -0
  166. package/dist/commands/surface/node/placement.js +124 -0
  167. package/dist/commands/surface-node.js +4 -1
  168. package/dist/commands/surface-reload.js +1 -2
  169. package/dist/commands/surface-tmux-spread.js +1 -1
  170. package/dist/commands/surface.js +5 -20
  171. package/dist/commands/sys/__tests__/setup-core.test.js +18 -271
  172. package/dist/commands/sys/config.js +6 -6
  173. package/dist/commands/sys/logs.js +1 -1
  174. package/dist/commands/sys/panels/broker-limits-panel.d.ts +17 -0
  175. package/dist/commands/sys/panels/broker-limits-panel.js +104 -0
  176. package/dist/commands/sys/panels/dependencies-panel.d.ts +14 -0
  177. package/dist/commands/sys/panels/dependencies-panel.js +80 -0
  178. package/dist/commands/sys/panels/keybindings-panel.d.ts +56 -0
  179. package/dist/commands/sys/panels/keybindings-panel.js +703 -0
  180. package/dist/commands/sys/panels/keys-panel.d.ts +16 -0
  181. package/dist/commands/sys/panels/keys-panel.js +60 -0
  182. package/dist/commands/sys/panels/models-panel.d.ts +77 -0
  183. package/dist/commands/sys/panels/models-panel.js +647 -0
  184. package/dist/commands/sys/panels/panel.d.ts +45 -0
  185. package/dist/commands/sys/panels/panel.js +137 -0
  186. package/dist/commands/sys/panels/plugins-panel.d.ts +16 -0
  187. package/dist/commands/sys/panels/plugins-panel.js +80 -0
  188. package/dist/commands/sys/panels/prefs-panel.d.ts +21 -0
  189. package/dist/commands/sys/panels/prefs-panel.js +85 -0
  190. package/dist/commands/sys/panels/provider-panel.d.ts +62 -0
  191. package/dist/commands/sys/panels/provider-panel.js +538 -0
  192. package/dist/commands/sys/settings-shell.d.ts +55 -0
  193. package/dist/commands/sys/settings-shell.js +400 -0
  194. package/dist/commands/sys/settings.d.ts +2 -0
  195. package/dist/commands/sys/settings.js +31 -0
  196. package/dist/commands/sys/setup-core.d.ts +3 -33
  197. package/dist/commands/sys/setup-core.js +27 -78
  198. package/dist/commands/sys/setup-settings-runner.d.ts +24 -0
  199. package/dist/commands/sys/setup-settings-runner.js +63 -0
  200. package/dist/commands/sys/setup-wizard.d.ts +26 -125
  201. package/dist/commands/sys/setup-wizard.js +209 -2473
  202. package/dist/commands/sys/setup.js +5 -7
  203. package/dist/commands/sys.js +3 -2
  204. package/dist/core/__tests__/broker-extension-canvas-db-boundary.test.js +50 -0
  205. package/dist/core/__tests__/broker-launch-candidates.test.js +20 -9
  206. package/dist/core/__tests__/broker-preflight.test.js +1 -1
  207. package/dist/core/__tests__/canvas-inbox-watcher-hold.test.js +108 -27
  208. package/dist/core/__tests__/canvas-inbox-watcher.test.js +14 -0
  209. package/dist/core/__tests__/canvas.test.js +2 -36
  210. package/dist/core/__tests__/close.test.js +14 -3
  211. package/dist/core/__tests__/context-intro.test.js +32 -143
  212. package/dist/core/__tests__/cron-broker-capacity.test.js +22 -3
  213. package/dist/core/__tests__/daemon-boot.test.js +2 -20
  214. package/dist/core/__tests__/daemon-wedge.test.js +1 -1
  215. package/dist/core/__tests__/dead-node-policy-table.test.js +1 -18
  216. package/dist/core/__tests__/fixtures/fake-engine.d.ts +1 -1
  217. package/dist/core/__tests__/fixtures/fake-engine.js +2 -2
  218. package/dist/core/__tests__/fixtures/fake-pi-host.js +2 -2
  219. package/dist/core/__tests__/focuses.test.js +4 -98
  220. package/dist/core/__tests__/helpers/broker-clients.d.ts +0 -3
  221. package/dist/core/__tests__/helpers/broker-clients.js +0 -14
  222. package/dist/core/__tests__/helpers/harness.d.ts +0 -8
  223. package/dist/core/__tests__/helpers/harness.js +7 -87
  224. package/dist/core/__tests__/helpers/viewer-panes.js +1 -1
  225. package/dist/core/__tests__/inline-memory-refs.test.js +5 -134
  226. package/dist/core/__tests__/kickoff.test.js +1 -1
  227. package/dist/core/__tests__/memory-resolver-precedence.test.js +29 -1
  228. package/dist/core/__tests__/migration.test.js +35 -48
  229. package/dist/core/__tests__/on-read-dedup-resume.test.js +22 -12
  230. package/dist/core/__tests__/passive-subscription.test.js +26 -49
  231. package/dist/core/__tests__/preview-registry-sync.test.js +1 -2
  232. package/dist/core/__tests__/prune.test.js +94 -1
  233. package/dist/core/__tests__/review-model-floor.test.js +0 -32
  234. package/dist/core/__tests__/seam/broker-attach-multiclient.test.js +255 -0
  235. package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.js +39 -7
  236. package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.js +30 -29
  237. package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.js +54 -5
  238. package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.js +134 -82
  239. package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.js +15 -4
  240. package/dist/core/__tests__/{full/idle-release-settlement.test.js → seam/dormancy-release.test.js} +69 -17
  241. package/dist/core/__tests__/{full/yield-message-transaction.test.js → seam/yield-refresh-transaction.test.js} +31 -9
  242. package/dist/core/__tests__/secrets.test.js +1 -7
  243. package/dist/core/__tests__/{broker-fork-seam.test.js → serial/broker-fork-seam.test.js} +58 -7
  244. package/dist/core/__tests__/{broker-sdk-wiring.test.js → serial/broker-sdk-wiring.test.js} +18 -162
  245. package/dist/core/__tests__/{broker-snapshot-history.test.js → serial/broker-snapshot-history.test.js} +9 -9
  246. package/dist/core/__tests__/{command-plugins.test.js → serial/command-plugins.test.js} +105 -15
  247. package/dist/core/__tests__/{deferred-no-wake.test.js → serial/deferred-no-wake.test.js} +23 -20
  248. package/dist/core/__tests__/{flagship-lifecycle.test.js → serial/flagship-lifecycle.test.js} +7 -7
  249. package/dist/core/__tests__/{host-teardown-process-group.test.js → serial/host-teardown-process-group.test.js} +6 -6
  250. package/dist/core/__tests__/{human-deliver-e2e.test.js → serial/human-deliver-e2e.test.js} +12 -12
  251. package/dist/core/__tests__/{live-mutation.test.js → serial/live-mutation.test.js} +5 -5
  252. package/dist/core/__tests__/{refresh-stall-recycle.test.js → serial/refresh-stall-recycle.test.js} +5 -14
  253. package/dist/core/__tests__/{revive.test.js → serial/revive.test.js} +15 -100
  254. package/dist/core/__tests__/{spawn-root.test.js → serial/spawn-root.test.js} +32 -15
  255. package/dist/core/__tests__/serial/subscription-delivery.test.js +126 -0
  256. package/dist/core/__tests__/serial/tmux-surface.test.js +256 -0
  257. package/dist/core/__tests__/{worktree.test.js → serial/worktree.test.js} +15 -15
  258. package/dist/core/__tests__/session-model.test.js +0 -18
  259. package/dist/core/__tests__/spawn-worktree-id-conflict.test.js +9 -0
  260. package/dist/core/__tests__/watchdog-abort-arms-retry.test.js +50 -0
  261. package/dist/core/broker-client/__tests__/transport-relay.test.js +15 -16
  262. package/dist/core/broker-client/__tests__/transport-socket.test.js +28 -0
  263. package/dist/core/broker-client/client.d.ts +2 -2
  264. package/dist/core/broker-client/client.js +4 -7
  265. package/dist/core/broker-client/transport-relay.d.ts +13 -19
  266. package/dist/core/broker-client/transport-relay.js +19 -34
  267. package/dist/core/broker-client/transport-socket.d.ts +2 -2
  268. package/dist/core/broker-client/transport-socket.js +9 -2
  269. package/dist/core/broker-client/transport.d.ts +7 -3
  270. package/dist/core/broker-client/transport.js +4 -4
  271. package/dist/core/canvas/__tests__/attention.test.js +1 -18
  272. package/dist/core/canvas/__tests__/remote-canvas-source.test.js +7 -64
  273. package/dist/core/canvas/__tests__/remote-transport.test.js +2 -3
  274. package/dist/core/canvas/__tests__/render-remote.test.js +7 -52
  275. package/dist/core/canvas/browse/app.d.ts +2 -17
  276. package/dist/core/canvas/browse/app.js +16 -88
  277. package/dist/core/canvas/browse/model.d.ts +0 -4
  278. package/dist/core/canvas/browse/model.js +1 -12
  279. package/dist/core/canvas/browse/render.js +6 -3
  280. package/dist/core/canvas/crons.d.ts +8 -5
  281. package/dist/core/canvas/crons.js +7 -6
  282. package/dist/core/canvas/extensions.d.ts +7 -3
  283. package/dist/core/canvas/extensions.js +16 -4
  284. package/dist/core/canvas/nav-model.d.ts +0 -4
  285. package/dist/core/canvas/nav-model.js +2 -14
  286. package/dist/core/canvas/node-order.d.ts +3 -0
  287. package/dist/core/canvas/node-order.js +12 -0
  288. package/dist/core/canvas/remote-canvas-source.d.ts +3 -6
  289. package/dist/core/canvas/remote-canvas-source.js +8 -15
  290. package/dist/core/command.js +11 -4
  291. package/dist/core/config.js +3 -1
  292. package/dist/core/events/envelope.js +1 -1
  293. package/dist/core/events/read.js +7 -21
  294. package/dist/core/events/source.d.ts +0 -2
  295. package/dist/core/events/source.js +0 -16
  296. package/dist/core/events/types.d.ts +1 -1
  297. package/dist/core/fault-classifier.d.ts +1 -1
  298. package/dist/core/feed/passive.d.ts +0 -11
  299. package/dist/core/feed/passive.js +1 -62
  300. package/dist/core/human/__tests__/{inbox-core.test.js → serial/inbox-core.test.js} +6 -6
  301. package/dist/core/keybindings/__tests__/resolve.test.js +1 -96
  302. package/dist/core/keybindings/background-bash.js +3 -4
  303. package/dist/core/keybindings/catalog.js +1 -1
  304. package/dist/core/memory/inline-ref-grammar.js +3 -3
  305. package/dist/core/memory-resolver.d.ts +11 -25
  306. package/dist/core/memory-resolver.js +51 -33
  307. package/dist/core/model-routes.d.ts +15 -0
  308. package/dist/core/model-routes.js +12 -0
  309. package/dist/core/pool-credential-store.js +1 -1
  310. package/dist/core/preview-registry.js +8 -9
  311. package/dist/core/profiles/__tests__/root-profile.test.js +4 -14
  312. package/dist/core/review/realize.d.ts +0 -13
  313. package/dist/core/review/realize.js +0 -40
  314. package/dist/core/review/types.d.ts +1 -1
  315. package/dist/core/runtime/__tests__/engine-route.test.js +2 -2
  316. package/dist/core/runtime/bearings.js +1 -11
  317. package/dist/core/runtime/broker/client-registry.d.ts +33 -0
  318. package/dist/core/runtime/broker/client-registry.js +164 -0
  319. package/dist/core/runtime/broker/daemon-ops.d.ts +19 -0
  320. package/dist/core/runtime/broker/daemon-ops.js +49 -0
  321. package/dist/core/runtime/broker/event-projection.d.ts +42 -0
  322. package/dist/core/runtime/broker/event-projection.js +178 -0
  323. package/dist/core/runtime/broker/fault-retry.d.ts +39 -0
  324. package/dist/core/runtime/broker/fault-retry.js +277 -0
  325. package/dist/core/runtime/broker/frame-dispatch.d.ts +238 -0
  326. package/dist/core/runtime/broker/frame-dispatch.js +1537 -0
  327. package/dist/core/runtime/broker/inbox.d.ts +22 -0
  328. package/dist/core/runtime/broker/inbox.js +167 -0
  329. package/dist/core/runtime/broker/passive.d.ts +16 -0
  330. package/dist/core/runtime/broker/passive.js +44 -0
  331. package/dist/core/runtime/broker/read-ops.d.ts +23 -0
  332. package/dist/core/runtime/broker/read-ops.js +150 -0
  333. package/dist/core/runtime/broker/rebind.d.ts +74 -0
  334. package/dist/core/runtime/broker/rebind.js +211 -0
  335. package/dist/core/runtime/broker/tool-groups.d.ts +39 -0
  336. package/dist/core/runtime/broker/tool-groups.js +244 -0
  337. package/dist/core/runtime/broker-extension-render.d.ts +11 -0
  338. package/dist/core/runtime/broker-extension-render.js +181 -0
  339. package/dist/core/runtime/broker-persona-guidance.d.ts +13 -0
  340. package/dist/core/runtime/broker-persona-guidance.js +58 -0
  341. package/dist/core/runtime/broker-protocol.d.ts +1 -1
  342. package/dist/core/runtime/broker-protocol.js +1 -1
  343. package/dist/core/runtime/broker.d.ts +5 -196
  344. package/dist/core/runtime/broker.js +276 -3059
  345. package/dist/core/runtime/canvas-extensions.js +11 -2
  346. package/dist/core/runtime/fault.js +1 -1
  347. package/dist/core/runtime/model-selection.d.ts +9 -0
  348. package/dist/core/runtime/model-selection.js +12 -0
  349. package/dist/core/runtime/model-swap.d.ts +3 -3
  350. package/dist/core/runtime/model-swap.js +33 -25
  351. package/dist/core/runtime/placement-tmux.d.ts +3 -14
  352. package/dist/core/runtime/placement-tmux.js +11 -80
  353. package/dist/core/runtime/placement.d.ts +4 -2
  354. package/dist/core/runtime/placement.js +7 -12
  355. package/dist/core/runtime/promote.d.ts +14 -1
  356. package/dist/core/runtime/promote.js +1 -1
  357. package/dist/core/runtime/reset.d.ts +1 -1
  358. package/dist/core/runtime/roadmap.js +1 -1
  359. package/dist/core/runtime/spawn.d.ts +8 -0
  360. package/dist/core/runtime/spawn.js +36 -6
  361. package/dist/core/runtime/stop-guard.d.ts +4 -3
  362. package/dist/core/runtime/stop-guard.js +36 -18
  363. package/dist/core/runtime/stop-signals.d.ts +4 -1
  364. package/dist/core/runtime/stream-watchdog.js +4 -5
  365. package/dist/core/runtime/structured-output.d.ts +15 -2
  366. package/dist/core/runtime/structured-output.js +35 -12
  367. package/dist/core/runtime/tmux-bindings.d.ts +25 -0
  368. package/dist/core/runtime/tmux-bindings.js +682 -0
  369. package/dist/core/runtime/tmux-chrome.d.ts +2 -1
  370. package/dist/core/runtime/tmux-chrome.js +3 -2
  371. package/dist/core/runtime/{tmux.d.ts → tmux-driver.d.ts} +18 -26
  372. package/dist/core/runtime/tmux-driver.js +598 -0
  373. package/dist/core/runtime/view-socket.d.ts +14 -0
  374. package/dist/core/runtime/view-socket.js +83 -0
  375. package/dist/core/session-model/session-state.d.ts +1 -2
  376. package/dist/core/session-model/session-state.js +5 -8
  377. package/dist/core/spawn.d.ts +1 -1
  378. package/dist/core/spawn.js +2 -2
  379. package/dist/core/substrate/gate.d.ts +1 -1
  380. package/dist/core/substrate/on-read-pure.d.ts +7 -0
  381. package/dist/core/substrate/on-read-pure.js +272 -0
  382. package/dist/core/termrender/termrender.js +32 -2
  383. package/dist/core/user-settings.d.ts +23 -1
  384. package/dist/core/user-settings.js +18 -1
  385. package/dist/daemon/api/__tests__/node-model-validation.test.js +134 -0
  386. package/dist/daemon/api/__tests__/review-terminal-conflict.test.js +98 -0
  387. package/dist/daemon/api/__tests__/{full → seam}/api-server.test.js +6 -48
  388. package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.js +17 -44
  389. package/dist/daemon/api/__tests__/{full/push-parity.test.js → seam/leaf-api-parity.test.js} +61 -42
  390. package/dist/daemon/api/bridge.js +40 -81
  391. package/dist/daemon/api/handlers/broker-ops.d.ts +2 -0
  392. package/dist/daemon/api/handlers/broker-ops.js +383 -0
  393. package/dist/daemon/api/handlers/crons.js +9 -4
  394. package/dist/daemon/api/handlers/files.js +6 -7
  395. package/dist/daemon/api/handlers/inbox.js +2 -340
  396. package/dist/daemon/api/handlers/nodes.d.ts +10 -1
  397. package/dist/daemon/api/handlers/nodes.js +74 -39
  398. package/dist/daemon/api/handlers/review-comments.js +5 -1
  399. package/dist/daemon/api/handlers/reviews.js +0 -19
  400. package/dist/daemon/api/map.js +25 -4
  401. package/dist/daemon/api/router.js +2 -3
  402. package/dist/daemon/api/server.js +5 -7
  403. package/dist/daemon/cron-run.d.ts +4 -0
  404. package/dist/daemon/cron-run.js +30 -13
  405. package/dist/daemon/crtrd.d.ts +3 -58
  406. package/dist/daemon/crtrd.js +28 -1244
  407. package/dist/daemon/manage.js +0 -1
  408. package/dist/daemon/reconcilers/broker-supervision.d.ts +50 -0
  409. package/dist/daemon/reconcilers/broker-supervision.js +549 -0
  410. package/dist/daemon/reconcilers/cron-lane.d.ts +10 -0
  411. package/dist/daemon/reconcilers/cron-lane.js +32 -0
  412. package/dist/daemon/reconcilers/dormant-inbox.d.ts +18 -0
  413. package/dist/daemon/reconcilers/dormant-inbox.js +143 -0
  414. package/dist/daemon/reconcilers/storage-maintenance.d.ts +22 -0
  415. package/dist/daemon/reconcilers/storage-maintenance.js +213 -0
  416. package/dist/daemon/review/finish.js +2 -5
  417. package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +34 -53
  418. package/dist/pi-extensions/__tests__/canvas-recap.test.js +16 -113
  419. package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +72 -99
  420. package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.js +29 -12
  421. package/dist/pi-extensions/broker-local.d.ts +20 -0
  422. package/dist/pi-extensions/broker-local.js +89 -0
  423. package/dist/pi-extensions/canvas-context-intro.d.ts +3 -3
  424. package/dist/pi-extensions/canvas-context-intro.js +22 -11
  425. package/dist/pi-extensions/canvas-doc-substrate.js +17 -34
  426. package/dist/pi-extensions/canvas-goal-capture.js +7 -12
  427. package/dist/pi-extensions/canvas-inbox-watcher.js +124 -139
  428. package/dist/pi-extensions/canvas-passive-context.d.ts +3 -3
  429. package/dist/pi-extensions/canvas-passive-context.js +22 -18
  430. package/dist/pi-extensions/canvas-recap.d.ts +2 -2
  431. package/dist/pi-extensions/canvas-recap.js +48 -21
  432. package/dist/pi-extensions/canvas-review-boundary.js +10 -4
  433. package/dist/pi-extensions/canvas-stophook.d.ts +0 -5
  434. package/dist/pi-extensions/canvas-stophook.js +149 -431
  435. package/dist/pi-extensions/canvas-structured-output.js +52 -30
  436. package/dist/pi-extensions/envelope-merge.d.ts +13 -0
  437. package/dist/pi-extensions/envelope-merge.js +29 -0
  438. package/dist/shared/working-activity.d.ts +3 -2
  439. package/dist/shared/working-activity.js +3 -2
  440. package/dist/types.d.ts +6 -5
  441. package/dist/types.js +2 -2
  442. package/docs/compat/hearth-crtr-v1.md +4 -12
  443. package/docs/compat/hearth-crtr-v2.md +3 -11
  444. package/docs/compat/hearth-crtr-v3.md +4 -12
  445. package/docs/compat/hearth-crtr-v4.md +3 -11
  446. package/docs/compat/hearth-crtr-v5.md +3 -11
  447. package/docs/public-api.md +3 -7
  448. package/package.json +7 -49
  449. package/runtime.lock.json +2766 -14533
  450. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/claude-plugin-commands.test.ts +0 -49
  451. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/memory-slash-commands.test.ts +0 -194
  452. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/statusline.test.ts +0 -68
  453. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/test.ts +0 -119
  454. package/dist/clients/attach/__tests__/attach-chrome-remote.test.js +0 -439
  455. package/dist/clients/attach/__tests__/attach-keybindings.test.js +0 -170
  456. package/dist/clients/attach/__tests__/crtr-output-coverage.test.js +0 -57
  457. package/dist/clients/attach/__tests__/editor-frame-title.test.js +0 -19
  458. package/dist/clients/attach/__tests__/input-controller-extension-command.test.js +0 -32
  459. package/dist/clients/attach/__tests__/markdown-headings.test.js +0 -35
  460. package/dist/clients/attach/__tests__/session-identity-refresh.test.js +0 -32
  461. package/dist/clients/conversation/conversation.d.ts +0 -65
  462. package/dist/clients/conversation/conversation.js +0 -318
  463. package/dist/clients/conversation/frames.d.ts +0 -30
  464. package/dist/clients/conversation/frames.js +0 -52
  465. package/dist/clients/conversation/region.d.ts +0 -51
  466. package/dist/clients/conversation/region.js +0 -265
  467. package/dist/clients/inbox/__tests__/inbox-controller.test.js +0 -247
  468. package/dist/clients/inbox/__tests__/mount-panel.test.js +0 -776
  469. package/dist/clients/inbox/review/__tests__/remap.test.js +0 -196
  470. package/dist/clients/inbox/review/columns.d.ts +0 -22
  471. package/dist/clients/inbox/review/columns.js +0 -40
  472. package/dist/clients/inbox/review/composition.d.ts +0 -60
  473. package/dist/clients/inbox/review/composition.js +0 -278
  474. package/dist/clients/inbox/review/document-region.d.ts +0 -120
  475. package/dist/clients/surfaces/region.d.ts +0 -16
  476. package/dist/clients/web/__tests__/push-engine.test.js +0 -158
  477. package/dist/clients/web/__tests__/push-registry.test.d.ts +0 -1
  478. package/dist/clients/web/__tests__/push-registry.test.js +0 -177
  479. package/dist/clients/web/dev-server.d.ts +0 -7
  480. package/dist/clients/web/dev-server.js +0 -46
  481. package/dist/clients/web/events.d.ts +0 -19
  482. package/dist/clients/web/events.js +0 -163
  483. package/dist/clients/web/push-engine.d.ts +0 -44
  484. package/dist/clients/web/push-engine.js +0 -125
  485. package/dist/clients/web/push-registry.d.ts +0 -85
  486. package/dist/clients/web/push-registry.js +0 -373
  487. package/dist/clients/web/server.d.ts +0 -19
  488. package/dist/clients/web/server.js +0 -661
  489. package/dist/clients/web/web-client/shared/protocol.d.ts +0 -214
  490. package/dist/clients/web/web-client/shared/protocol.js +0 -8
  491. package/dist/clients/web/web-cmd.d.ts +0 -2
  492. package/dist/clients/web/web-cmd.js +0 -141
  493. package/dist/commands/__tests__/api-canvas-source.test.d.ts +0 -1
  494. package/dist/commands/__tests__/api-canvas-source.test.js +0 -37
  495. package/dist/commands/__tests__/canvas-config.test.d.ts +0 -1
  496. package/dist/commands/__tests__/canvas-config.test.js +0 -107
  497. package/dist/commands/__tests__/node-no-kickoff-flag.test.d.ts +0 -1
  498. package/dist/commands/__tests__/node-no-kickoff-flag.test.js +0 -73
  499. package/dist/commands/__tests__/node-worktree-flag.test.d.ts +0 -1
  500. package/dist/commands/__tests__/node-worktree-flag.test.js +0 -49
  501. package/dist/commands/__tests__/search-contents.test.d.ts +0 -1
  502. package/dist/commands/__tests__/search-contents.test.js +0 -52
  503. package/dist/commands/memory/__tests__/lint.test.d.ts +0 -1
  504. package/dist/commands/memory/__tests__/lint.test.js +0 -15
  505. package/dist/commands/sys/__tests__/config-broker-thresholds.test.d.ts +0 -1
  506. package/dist/commands/sys/__tests__/config-broker-thresholds.test.js +0 -95
  507. package/dist/commands/sys/__tests__/config-keybindings.test.d.ts +0 -1
  508. package/dist/commands/sys/__tests__/config-keybindings.test.js +0 -55
  509. package/dist/commands/sys/__tests__/helpers/setup-runtime.d.ts +0 -5
  510. package/dist/commands/sys/__tests__/helpers/setup-runtime.js +0 -19
  511. package/dist/commands/sys/__tests__/setup-front-door.test.d.ts +0 -1
  512. package/dist/commands/sys/__tests__/setup-front-door.test.js +0 -102
  513. package/dist/commands/sys/__tests__/setup-models.test.d.ts +0 -1
  514. package/dist/commands/sys/__tests__/setup-models.test.js +0 -205
  515. package/dist/commands/sys/__tests__/setup-providers-viewport.test.d.ts +0 -1
  516. package/dist/commands/sys/__tests__/setup-providers-viewport.test.js +0 -155
  517. package/dist/commands/sys/__tests__/sync-deps.test.d.ts +0 -1
  518. package/dist/commands/sys/__tests__/sync-deps.test.js +0 -179
  519. package/dist/commands/sys/__tests__/sync-import.test.d.ts +0 -1
  520. package/dist/commands/sys/__tests__/sync-import.test.js +0 -315
  521. package/dist/core/__tests__/base-worker-prompt.test.d.ts +0 -1
  522. package/dist/core/__tests__/base-worker-prompt.test.js +0 -57
  523. package/dist/core/__tests__/command-plugins-surfaces.test.d.ts +0 -1
  524. package/dist/core/__tests__/command-plugins-surfaces.test.js +0 -359
  525. package/dist/core/__tests__/connection-reconnect-resume.test.d.ts +0 -1
  526. package/dist/core/__tests__/connection-reconnect-resume.test.js +0 -36
  527. package/dist/core/__tests__/finalization-migration.test.d.ts +0 -1
  528. package/dist/core/__tests__/finalization-migration.test.js +0 -38
  529. package/dist/core/__tests__/fixtures/extra-extension.d.ts +0 -1
  530. package/dist/core/__tests__/fixtures/extra-extension.js +0 -3
  531. package/dist/core/__tests__/fixtures/spawn-proof-target.test.d.ts +0 -1
  532. package/dist/core/__tests__/fixtures/spawn-proof-target.test.js +0 -15
  533. package/dist/core/__tests__/fork.test.d.ts +0 -1
  534. package/dist/core/__tests__/fork.test.js +0 -108
  535. package/dist/core/__tests__/full/broker-attach-limits.test.d.ts +0 -1
  536. package/dist/core/__tests__/full/broker-attach-limits.test.js +0 -147
  537. package/dist/core/__tests__/full/broker-deliver-ack.test.d.ts +0 -1
  538. package/dist/core/__tests__/full/broker-deliver-ack.test.js +0 -73
  539. package/dist/core/__tests__/full/broker-dialogs.test.d.ts +0 -1
  540. package/dist/core/__tests__/full/broker-dialogs.test.js +0 -180
  541. package/dist/core/__tests__/full/broker-display-snapshot.test.d.ts +0 -1
  542. package/dist/core/__tests__/full/broker-display-snapshot.test.js +0 -75
  543. package/dist/core/__tests__/full/broker-dormant-wake.test.d.ts +0 -1
  544. package/dist/core/__tests__/full/broker-dormant-wake.test.js +0 -130
  545. package/dist/core/__tests__/full/broker-model-changed-broadcast.test.d.ts +0 -1
  546. package/dist/core/__tests__/full/broker-model-changed-broadcast.test.js +0 -57
  547. package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.d.ts +0 -1
  548. package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.js +0 -80
  549. package/dist/core/__tests__/full/cascade-close.test.d.ts +0 -1
  550. package/dist/core/__tests__/full/cascade-close.test.js +0 -240
  551. package/dist/core/__tests__/full/detach-focus.test.d.ts +0 -1
  552. package/dist/core/__tests__/full/detach-focus.test.js +0 -126
  553. package/dist/core/__tests__/full/idle-release-settlement.test.d.ts +0 -1
  554. package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.d.ts +0 -1
  555. package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.js +0 -107
  556. package/dist/core/__tests__/full/park-clock-release.test.d.ts +0 -1
  557. package/dist/core/__tests__/full/park-clock-release.test.js +0 -56
  558. package/dist/core/__tests__/full/yield-message-transaction.test.d.ts +0 -1
  559. package/dist/core/__tests__/memory-index-render.test.d.ts +0 -1
  560. package/dist/core/__tests__/memory-index-render.test.js +0 -60
  561. package/dist/core/__tests__/model-routes.test.d.ts +0 -1
  562. package/dist/core/__tests__/model-routes.test.js +0 -41
  563. package/dist/core/__tests__/on-read-identity.test.d.ts +0 -1
  564. package/dist/core/__tests__/on-read-identity.test.js +0 -61
  565. package/dist/core/__tests__/phase4-review-migration.test.d.ts +0 -1
  566. package/dist/core/__tests__/phase4-review-migration.test.js +0 -100
  567. package/dist/core/__tests__/prune-to-limit.test.d.ts +0 -1
  568. package/dist/core/__tests__/prune-to-limit.test.js +0 -126
  569. package/dist/core/__tests__/reset.test.d.ts +0 -1
  570. package/dist/core/__tests__/reset.test.js +0 -69
  571. package/dist/core/__tests__/spawn-no-kickoff.test.d.ts +0 -1
  572. package/dist/core/__tests__/spawn-no-kickoff.test.js +0 -115
  573. package/dist/core/__tests__/steer-note.test.d.ts +0 -1
  574. package/dist/core/__tests__/steer-note.test.js +0 -41
  575. package/dist/core/__tests__/subcommand-tier.test.d.ts +0 -1
  576. package/dist/core/__tests__/subcommand-tier.test.js +0 -99
  577. package/dist/core/__tests__/subscription-delivery.test.js +0 -211
  578. package/dist/core/__tests__/test-runner-cheap-sharding.test.d.ts +0 -1
  579. package/dist/core/__tests__/test-runner-cheap-sharding.test.js +0 -97
  580. package/dist/core/__tests__/tmux-surface.test.js +0 -484
  581. package/dist/core/__tests__/wake-bearings.test.d.ts +0 -1
  582. package/dist/core/__tests__/wake-bearings.test.js +0 -102
  583. package/dist/core/canvas/__tests__/remote-event-stream.test.d.ts +0 -1
  584. package/dist/core/canvas/__tests__/remote-event-stream.test.js +0 -146
  585. package/dist/core/canvas/__tests__/source-resolve.test.d.ts +0 -1
  586. package/dist/core/canvas/__tests__/source-resolve.test.js +0 -77
  587. package/dist/core/canvas/browse/__tests__/model.test.d.ts +0 -1
  588. package/dist/core/canvas/browse/__tests__/model.test.js +0 -290
  589. package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.d.ts +0 -1
  590. package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.js +0 -134
  591. package/dist/core/canvas/browse/__tests__/render.test.d.ts +0 -1
  592. package/dist/core/canvas/browse/__tests__/render.test.js +0 -111
  593. package/dist/core/canvas/browse/rebuild-coalescer.d.ts +0 -7
  594. package/dist/core/canvas/browse/rebuild-coalescer.js +0 -61
  595. package/dist/core/canvas/remote-event-stream.d.ts +0 -24
  596. package/dist/core/canvas/remote-event-stream.js +0 -94
  597. package/dist/core/feed/__tests__/coalesce-human.test.d.ts +0 -1
  598. package/dist/core/feed/__tests__/coalesce-human.test.js +0 -36
  599. package/dist/core/feed/__tests__/empty-node-guard.test.d.ts +0 -1
  600. package/dist/core/feed/__tests__/empty-node-guard.test.js +0 -45
  601. package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.d.ts +0 -1
  602. package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.js +0 -84
  603. package/dist/core/human/__tests__/visible-paths.test.d.ts +0 -1
  604. package/dist/core/human/__tests__/visible-paths.test.js +0 -28
  605. package/dist/core/keybindings/__tests__/inbox-affordance.test.d.ts +0 -1
  606. package/dist/core/keybindings/__tests__/inbox-affordance.test.js +0 -38
  607. package/dist/core/review/__tests__/project.test.d.ts +0 -1
  608. package/dist/core/review/__tests__/project.test.js +0 -71
  609. package/dist/core/runtime/__tests__/command-expansion.test.d.ts +0 -1
  610. package/dist/core/runtime/__tests__/command-expansion.test.js +0 -25
  611. package/dist/core/runtime/__tests__/session-visibility.test.d.ts +0 -1
  612. package/dist/core/runtime/__tests__/session-visibility.test.js +0 -119
  613. package/dist/core/runtime/__tests__/spawn-at-given-id.test.d.ts +0 -1
  614. package/dist/core/runtime/__tests__/spawn-at-given-id.test.js +0 -34
  615. package/dist/core/runtime/tmux.js +0 -1314
  616. package/dist/daemon/api/__tests__/full/push-parity.test.d.ts +0 -1
  617. package/dist/daemon/api/__tests__/full/worktree-parity.test.d.ts +0 -1
  618. package/dist/daemon/api/__tests__/full/worktree-parity.test.js +0 -160
  619. package/dist/daemon/api/__tests__/inbox.test.d.ts +0 -1
  620. package/dist/daemon/api/__tests__/inbox.test.js +0 -489
  621. package/dist/web-client/apple-touch-icon.png +0 -0
  622. package/dist/web-client/assets/fragment-mono-latin-400-normal-BYwT3kSJ.woff +0 -0
  623. package/dist/web-client/assets/fragment-mono-latin-400-normal-yxdJ5AmL.woff2 +0 -0
  624. package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-BbKYyvR9.woff2 +0 -0
  625. package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-CT4YFKeK.woff +0 -0
  626. package/dist/web-client/assets/index-CCPaLeW7.css +0 -2
  627. package/dist/web-client/assets/index-kyOWsnZK.js +0 -86
  628. package/dist/web-client/assets/martian-mono-cyrillic-wght-normal-B84CD5C_.woff2 +0 -0
  629. package/dist/web-client/assets/martian-mono-latin-ext-wght-normal-DlL6xMw5.woff2 +0 -0
  630. package/dist/web-client/assets/martian-mono-latin-wght-normal-5W32yIyr.woff2 +0 -0
  631. package/dist/web-client/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -2
  632. package/dist/web-client/icon-192.png +0 -0
  633. package/dist/web-client/icon-512.png +0 -0
  634. package/dist/web-client/icon-maskable-512.png +0 -0
  635. package/dist/web-client/index.html +0 -17
  636. package/dist/web-client/manifest.webmanifest +0 -1
  637. package/dist/web-client/sw.js +0 -1
  638. /package/dist/api/__tests__/{client.test.d.ts → serial/client.test.d.ts} +0 -0
  639. /package/dist/clients/inbox/__tests__/{inbox-controller.test.d.ts → serial/inbox-controller.test.d.ts} +0 -0
  640. /package/dist/clients/inbox/__tests__/{mount-panel.test.d.ts → serial/mount-panel.test.d.ts} +0 -0
  641. /package/dist/clients/{attach/__tests__/attach-chrome-remote.test.d.ts → inbox/review/__tests__/teardown-notice.test.d.ts} +0 -0
  642. /package/dist/{clients/attach/__tests__/attach-keybindings.test.d.ts → core/__tests__/broker-extension-canvas-db-boundary.test.d.ts} +0 -0
  643. /package/dist/{clients/attach/__tests__/crtr-output-coverage.test.d.ts → core/__tests__/seam/broker-attach-multiclient.test.d.ts} +0 -0
  644. /package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.d.ts +0 -0
  645. /package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.d.ts +0 -0
  646. /package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.d.ts +0 -0
  647. /package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.d.ts +0 -0
  648. /package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.d.ts +0 -0
  649. /package/dist/{clients/attach/__tests__/editor-frame-title.test.d.ts → core/__tests__/seam/dormancy-release.test.d.ts} +0 -0
  650. /package/dist/{clients/attach/__tests__/input-controller-extension-command.test.d.ts → core/__tests__/seam/yield-refresh-transaction.test.d.ts} +0 -0
  651. /package/dist/core/__tests__/{broker-fork-seam.test.d.ts → serial/broker-fork-seam.test.d.ts} +0 -0
  652. /package/dist/core/__tests__/{broker-sdk-wiring.test.d.ts → serial/broker-sdk-wiring.test.d.ts} +0 -0
  653. /package/dist/core/__tests__/{broker-snapshot-history.test.d.ts → serial/broker-snapshot-history.test.d.ts} +0 -0
  654. /package/dist/core/__tests__/{command-plugins.test.d.ts → serial/command-plugins.test.d.ts} +0 -0
  655. /package/dist/core/__tests__/{deferred-no-wake.test.d.ts → serial/deferred-no-wake.test.d.ts} +0 -0
  656. /package/dist/core/__tests__/{flagship-lifecycle.test.d.ts → serial/flagship-lifecycle.test.d.ts} +0 -0
  657. /package/dist/core/__tests__/{host-teardown-process-group.test.d.ts → serial/host-teardown-process-group.test.d.ts} +0 -0
  658. /package/dist/core/__tests__/{human-deliver-e2e.test.d.ts → serial/human-deliver-e2e.test.d.ts} +0 -0
  659. /package/dist/core/__tests__/{live-mutation.test.d.ts → serial/live-mutation.test.d.ts} +0 -0
  660. /package/dist/core/__tests__/{refresh-stall-recycle.test.d.ts → serial/refresh-stall-recycle.test.d.ts} +0 -0
  661. /package/dist/core/__tests__/{revive.test.d.ts → serial/revive.test.d.ts} +0 -0
  662. /package/dist/core/__tests__/{spawn-root.test.d.ts → serial/spawn-root.test.d.ts} +0 -0
  663. /package/dist/core/__tests__/{subscription-delivery.test.d.ts → serial/subscription-delivery.test.d.ts} +0 -0
  664. /package/dist/core/__tests__/{tmux-surface.test.d.ts → serial/tmux-surface.test.d.ts} +0 -0
  665. /package/dist/core/__tests__/{worktree.test.d.ts → serial/worktree.test.d.ts} +0 -0
  666. /package/dist/{clients/attach/__tests__/markdown-headings.test.d.ts → core/__tests__/watchdog-abort-arms-retry.test.d.ts} +0 -0
  667. /package/dist/{clients/attach/__tests__/session-identity-refresh.test.d.ts → core/broker-client/__tests__/transport-socket.test.d.ts} +0 -0
  668. /package/dist/core/human/__tests__/{inbox-core.test.d.ts → serial/inbox-core.test.d.ts} +0 -0
  669. /package/dist/{clients/inbox/review/__tests__/remap.test.d.ts → daemon/api/__tests__/node-model-validation.test.d.ts} +0 -0
  670. /package/dist/{clients/surfaces/region.js → daemon/api/__tests__/review-terminal-conflict.test.d.ts} +0 -0
  671. /package/dist/daemon/api/__tests__/{full → seam}/api-server.test.d.ts +0 -0
  672. /package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.d.ts +0 -0
  673. /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
- }