@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
@@ -23,6 +23,9 @@ function memoryName(memory, palette) {
23
23
  ? hyperlink(name, pathToFileURL(memory.path).href)
24
24
  : name;
25
25
  }
26
+ function countMemories(memories, action) {
27
+ return memories.filter((memory) => memory.action === action).length;
28
+ }
26
29
  function distinctFileCount(files) {
27
30
  return new Set(files.map((file) => file.key)).size;
28
31
  }
@@ -52,7 +55,8 @@ export class GroupRecapComponent extends Container {
52
55
  this.addChild(new Spacer(1));
53
56
  if (detailed) {
54
57
  for (const memory of activity.memories) {
55
- this.addChild(new RecapDetailLine(`${palette.info(MEMORY_ICON)} `, memoryName(memory, palette), ''));
58
+ const icon = memory.action === 'write' ? TOOL_ICON.write : MEMORY_ICON;
59
+ this.addChild(new RecapDetailLine(`${palette.info(icon)} `, memoryName(memory, palette), ''));
56
60
  }
57
61
  for (const file of activity.files)
58
62
  this.addFile(file, palette);
@@ -70,8 +74,13 @@ export class GroupRecapComponent extends Container {
70
74
  if (changedFiles >= 1) {
71
75
  stats.push(`${palette.warning(TOOL_ICON.edit)} ${palette.muted(count(changedFiles, 'file changed', 'files changed'))}`);
72
76
  }
73
- if (activity.memories.length >= 1) {
74
- stats.push(`${palette.info(MEMORY_ICON)} ${palette.muted(count(activity.memories.length, 'memory read', 'memory reads'))}`);
77
+ const memoriesRead = countMemories(activity.memories, 'read');
78
+ if (memoriesRead >= 1) {
79
+ stats.push(`${palette.info(MEMORY_ICON)} ${palette.muted(count(memoriesRead, 'memory read', 'memory reads'))}`);
80
+ }
81
+ const memoriesSaved = countMemories(activity.memories, 'write');
82
+ if (memoriesSaved >= 1) {
83
+ stats.push(`${palette.info(TOOL_ICON.write)} ${palette.muted(count(memoriesSaved, 'memory saved', 'memories saved'))}`);
75
84
  }
76
85
  this.addChild(new Text(stats.join(palette.muted(' · ')), 0, 0));
77
86
  }
@@ -1,5 +1,5 @@
1
1
  // session/connection.ts — how a viewer gets onto a broker: resolving the
2
- // local-vs-relay target, dialing it, the role it claims in the hello
2
+ // local or remote attach target, dialing it, the role it claims in the hello
3
3
  // handshake, and the optional pre-wait for a socket still being bound.
4
4
  //
5
5
  // Everything here runs BEFORE the TUI takes over the terminal, which is the
@@ -102,8 +102,8 @@ export async function connectToNode(nodeId, canvasName) {
102
102
  catch (err) {
103
103
  rethrowAsCliError(err, 'The node may be finalized or otherwise not attachable.');
104
104
  }
105
- // Local only: a relay accepts the WS upgrade unconditionally, so there is
106
- // no socket file to pre-wait on for `--canvas`.
105
+ // Local only: remote attach reaches crtrd over WebSocket rather than a
106
+ // local socket file, so `--canvas` has nothing to pre-wait on.
107
107
  await preWaitForViewSocket(nodeId);
108
108
  }
109
109
  const socket = new BrokerClient(nodeId, { transport });
@@ -125,18 +125,12 @@ export async function connectToNode(nodeId, canvasName) {
125
125
  next: 'Check the node has a running headless broker.',
126
126
  });
127
127
  };
128
- // A remote relay ACCEPTS the WS upgrade unconditionally and only proves
129
- // "no such node/broker" asynchronously — by closing 1011 AFTER the upgrade
130
- // completes (`RelayTransport`'s `onClose`, mirroring `server.ts`'s
131
- // `bridgeConnection`). That close therefore always lands strictly AFTER the
132
- // transport's `connect` event, never before it, so it can never be caught by
133
- // a connect-race listener torn down the moment `connect` resolves. Install a
134
- // listener that is NEVER removed instead, before dialing at all, so nothing
135
- // landing during the caller's synchronous TUI/editor setup has nowhere to go.
136
- // `assertConnected` is the caller's one synchronous checkpoint on it, taken
137
- // immediately before permanent socket wiring; anything after that is
138
- // legitimately mid-session and belongs to the reconnect supervisor, exactly
139
- // as it already does for a local socket.
128
+ // A remote crtrd attach connection can close after its WebSocket upgrade when
129
+ // its broker socket drops. Install a listener before dialing and keep it
130
+ // through synchronous TUI/editor setup, so `assertConnected` can surface any
131
+ // terminal startup failure at its one checkpoint immediately before permanent
132
+ // socket wiring. Failures after that are mid-session and belong to the
133
+ // reconnect supervisor, as they do for a local socket.
140
134
  let terminalStartupError;
141
135
  socket.on('error', (err) => {
142
136
  if (terminalStartupError === undefined)
@@ -1,12 +1,13 @@
1
1
  import { CombinedAutocompleteProvider } from '@earendil-works/pi-tui';
2
2
  import type { BrokerDataFrame, RefMeta } from '../../../core/runtime/broker-protocol.js';
3
+ import type { ViewerCapabilities } from '../input/capabilities.js';
3
4
  import { type PreviewableCommand } from '../slash/prompt-preview.js';
4
5
  import type { AttachBindings } from './bindings.js';
5
6
  import type { AttachSession } from './context.js';
6
- export declare function buildAttachAutocompleteProvider(cwd: string, fdPath: string | null, commands?: ReadonlyArray<{
7
+ export declare function buildAttachAutocompleteProvider(cwd: string, fdPath: string | null, commands: ReadonlyArray<{
7
8
  name: string;
8
9
  description?: string;
9
- }>, remote?: boolean, createProvider?: (items: ReadonlyArray<{
10
+ }> | undefined, capabilities: ViewerCapabilities, createProvider?: (items: ReadonlyArray<{
10
11
  name: string;
11
12
  description?: string;
12
13
  }>, cwd: string, fdPath: string | null) => CombinedAutocompleteProvider): CombinedAutocompleteProvider;
@@ -54,6 +55,6 @@ export interface EditorInventoryHooks {
54
55
  /** Owns everything the editor can complete against — the merged slash-command
55
56
  * list, the loaded-command preview, the broker's raw command metadata, and the
56
57
  * memory-ref inventory — plus the popup that inspects the loaded template.
57
- * Construction seeds the command list with builtins-only (`setCommands()`), so
58
- * autocomplete works before the broker's first `get_commands` ack. */
59
- export declare function createEditorInventory(ctx: Pick<AttachSession, 'remote' | 'meta' | 'socket' | 'tui' | 'editor'>, hooks: EditorInventoryHooks): EditorInventory;
58
+ * Input wiring supplies the session capability before first render, seeding
59
+ * builtins-only autocomplete before the broker's first `get_commands` ack. */
60
+ export declare function createEditorInventory(ctx: Pick<AttachSession, 'meta' | 'socket' | 'tui' | 'editor'>, capabilities: ViewerCapabilities, hooks: EditorInventoryHooks): EditorInventory;
@@ -19,8 +19,8 @@ import { surfaceTmuxStyleArgs } from '../../../core/runtime/surface-bg.js';
19
19
  import { RefAwareAutocompleteProvider } from '../input/ref-autocomplete.js';
20
20
  import { CANVAS_SLASH_COMMANDS, locallyConsumedCommandNames, slashCommandList } from '../slash/dispatch.js';
21
21
  import { loadedCommandPreview } from '../slash/prompt-preview.js';
22
- export function buildAttachAutocompleteProvider(cwd, fdPath, commands, remote = false, createProvider = (items, cwd, path) => new CombinedAutocompleteProvider([...items], cwd, path)) {
23
- return createProvider([...slashCommandList(commands, remote)], cwd, fdPath);
22
+ export function buildAttachAutocompleteProvider(cwd, fdPath, commands, capabilities, createProvider = (items, cwd, path) => new CombinedAutocompleteProvider([...items], cwd, path)) {
23
+ return createProvider([...slashCommandList(commands, capabilities)], cwd, fdPath);
24
24
  }
25
25
  export function createMemoryRefRefreshCoordinator(setMemoryRefs, request) {
26
26
  let epoch = 0;
@@ -46,10 +46,10 @@ export function createMemoryRefRefreshCoordinator(setMemoryRefs, request) {
46
46
  /** Owns everything the editor can complete against — the merged slash-command
47
47
  * list, the loaded-command preview, the broker's raw command metadata, and the
48
48
  * memory-ref inventory — plus the popup that inspects the loaded template.
49
- * Construction seeds the command list with builtins-only (`setCommands()`), so
50
- * autocomplete works before the broker's first `get_commands` ack. */
51
- export function createEditorInventory(ctx, hooks) {
52
- const { remote, meta, socket, tui, editor } = ctx;
49
+ * Input wiring supplies the session capability before first render, seeding
50
+ * builtins-only autocomplete before the broker's first `get_commands` ack. */
51
+ export function createEditorInventory(ctx, capabilities, hooks) {
52
+ const { meta, socket, tui, editor } = ctx;
53
53
  let commands = [];
54
54
  let commandPreview;
55
55
  // The broker's RAW command metadata (`undefined` until the first get_commands
@@ -90,7 +90,7 @@ export function createEditorInventory(ctx, hooks) {
90
90
  // refs never enter command completion or the loaded-command preview (which
91
91
  // reads only `commands`, never `memoryRefs`).
92
92
  const syncEditorInventories = () => {
93
- const commandProvider = buildAttachAutocompleteProvider(meta.cwd, hooks.fdPath, brokerCommands, remote);
93
+ const commandProvider = buildAttachAutocompleteProvider(meta.cwd, hooks.fdPath, brokerCommands, capabilities);
94
94
  editor.setAutocompleteProvider(new RefAwareAutocompleteProvider(memoryRefs, commandProvider));
95
95
  editor.setResolvedRefNames(memoryRefs.map((ref) => ref.name));
96
96
  // Two independent suppression inventories (review Major 6): the viewer-local
@@ -130,7 +130,6 @@ export function createEditorInventory(ctx, hooks) {
130
130
  syncEditorInventories();
131
131
  tui.requestRender();
132
132
  };
133
- setCommands();
134
133
  // The correlated ref-inventory lifecycle (design: inline memory references,
135
134
  // T3 terminal integration). `socket.request` is the same observer-safe
136
135
  // read-op channel local and remote attach already share, so this is
@@ -0,0 +1,13 @@
1
+ /** URI of the OSC-8 hyperlink occupying the given 1-indexed terminal cell. */
2
+ export declare function osc8UriAt(frame: readonly string[], row: number, column: number): string | undefined;
3
+ export type LinkedFileOpenResult = 'opened' | 'missing' | 'invalid' | 'failed';
4
+ /** Replace this local viewer pane with Neovim, then reattach it when Neovim exits. */
5
+ export declare function openLinkedFileInPane(opts: {
6
+ uri: string;
7
+ pane: string;
8
+ cwd: string;
9
+ nodeId: string;
10
+ observer: boolean;
11
+ /** Clear viewer-local pane identity immediately before the pane runs Neovim. */
12
+ beforeRespawn: () => void;
13
+ }): LinkedFileOpenResult;
@@ -0,0 +1,107 @@
1
+ // session/file-links.ts — OSC-8 file links in the rendered attach frame.
2
+ //
3
+ // A click is resolved against the physical rows last handed to the terminal,
4
+ // not against transcript records: wrapping, fixed cockpit rows, ANSI styling,
5
+ // and OSC-8 boundaries have all already been composed there.
6
+ import { existsSync } from 'node:fs';
7
+ import { fileURLToPath } from 'node:url';
8
+ import stringWidth from 'string-width';
9
+ import { respawnPaneInBackground, shellQuote, viewerSplitEnv } from '../../../core/runtime/placement-tmux.js';
10
+ const GRAPHEMES = new Intl.Segmenter(undefined, { granularity: 'grapheme' });
11
+ /** URI of the OSC-8 hyperlink occupying the given 1-indexed terminal cell. */
12
+ export function osc8UriAt(frame, row, column) {
13
+ if (!Number.isInteger(row) || !Number.isInteger(column) || row < 1 || column < 1)
14
+ return undefined;
15
+ let activeUri;
16
+ for (let index = 0; index < Math.min(row, frame.length); index++) {
17
+ const hitColumn = index === row - 1 ? column : undefined;
18
+ const scanned = scanOsc8Row(frame[index] ?? '', activeUri, hitColumn);
19
+ activeUri = scanned.activeUri;
20
+ if (scanned.uri !== undefined)
21
+ return scanned.uri;
22
+ }
23
+ return undefined;
24
+ }
25
+ function scanOsc8Row(line, initialUri, hitColumn) {
26
+ let activeUri = initialUri;
27
+ let cell = 1;
28
+ let index = 0;
29
+ while (index < line.length) {
30
+ if (line[index] === '\x1b') {
31
+ const escape = readEscape(line, index);
32
+ if (escape === undefined)
33
+ break;
34
+ const osc8 = parseOsc8(escape.text);
35
+ if (osc8 !== null)
36
+ activeUri = osc8 === '' ? undefined : osc8;
37
+ index = escape.end;
38
+ continue;
39
+ }
40
+ const nextEscape = line.indexOf('\x1b', index);
41
+ const text = line.slice(index, nextEscape === -1 ? undefined : nextEscape);
42
+ for (const segment of GRAPHEMES.segment(text)) {
43
+ const width = stringWidth(segment.segment);
44
+ if (hitColumn !== undefined && width > 0 && hitColumn >= cell && hitColumn < cell + width && activeUri !== undefined) {
45
+ return { activeUri, uri: activeUri };
46
+ }
47
+ cell += width;
48
+ }
49
+ index = nextEscape === -1 ? line.length : nextEscape;
50
+ }
51
+ return { activeUri, uri: undefined };
52
+ }
53
+ /** Read one terminal control sequence so non-printing ANSI never takes a cell. */
54
+ function readEscape(line, start) {
55
+ const kind = line[start + 1];
56
+ if (kind === undefined)
57
+ return undefined;
58
+ // OSC, APC, DCS, and PM are string controls terminated by BEL or ST. pi-tui's
59
+ // cursor marker uses APC, so it must consume no display cells here.
60
+ if (kind === ']' || kind === '_' || kind === 'P' || kind === '^') {
61
+ const bel = line.indexOf('\x07', start + 2);
62
+ const st = line.indexOf('\x1b\\', start + 2);
63
+ const end = bel === -1 ? st : st === -1 ? bel : Math.min(bel, st);
64
+ if (end === -1)
65
+ return undefined;
66
+ return { text: line.slice(start, end + (end === bel ? 1 : 2)), end: end + (end === bel ? 1 : 2) };
67
+ }
68
+ if (kind === '[') {
69
+ let end = start + 2;
70
+ while (end < line.length && (line.charCodeAt(end) < 0x40 || line.charCodeAt(end) > 0x7e))
71
+ end++;
72
+ if (end >= line.length)
73
+ return undefined;
74
+ return { text: line.slice(start, end + 1), end: end + 1 };
75
+ }
76
+ return { text: line.slice(start, start + 2), end: start + 2 };
77
+ }
78
+ /** `null` means another escape sequence; an empty URI closes the active link. */
79
+ function parseOsc8(sequence) {
80
+ if (!sequence.startsWith('\x1b]8;'))
81
+ return null;
82
+ const terminatorLength = sequence.endsWith('\x1b\\') ? 2 : 1;
83
+ const body = sequence.slice(4, -terminatorLength);
84
+ const separator = body.indexOf(';');
85
+ if (separator === -1)
86
+ return null;
87
+ return body.slice(separator + 1);
88
+ }
89
+ /** Replace this local viewer pane with Neovim, then reattach it when Neovim exits. */
90
+ export function openLinkedFileInPane(opts) {
91
+ let file;
92
+ try {
93
+ const url = new URL(opts.uri);
94
+ if (url.protocol !== 'file:')
95
+ return 'invalid';
96
+ file = fileURLToPath(url);
97
+ }
98
+ catch {
99
+ return 'invalid';
100
+ }
101
+ if (!existsSync(file))
102
+ return 'missing';
103
+ const attach = `crtr surface attach to ${shellQuote(opts.nodeId)}${opts.observer ? ' --observer' : ''}`;
104
+ const command = `nvim ${shellQuote(file)} || :; exec ${attach}`;
105
+ opts.beforeRespawn();
106
+ return respawnPaneInBackground({ pane: opts.pane, cwd: opts.cwd, env: viewerSplitEnv(), command }) ? 'opened' : 'failed';
107
+ }
@@ -24,8 +24,11 @@ export declare class ViewerFrame implements Component {
24
24
  private readonly terminal;
25
25
  private readonly parts;
26
26
  private viewportRows;
27
+ private lastFrame;
27
28
  constructor(terminal: Terminal, parts: ViewerFrameParts);
28
29
  render(width: number): string[];
30
+ /** The physical rows returned by the most recent render. */
31
+ lastRenderedFrame(): readonly string[];
29
32
  invalidate(): void;
30
33
  /** Rows the transcript viewport got in the last frame — the page size. */
31
34
  lastViewportRows(): number;
@@ -55,6 +55,7 @@ export class ViewerFrame {
55
55
  terminal;
56
56
  parts;
57
57
  viewportRows = 0;
58
+ lastFrame = [];
58
59
  constructor(terminal, parts) {
59
60
  this.terminal = terminal;
60
61
  this.parts = parts;
@@ -115,7 +116,15 @@ export class ViewerFrame {
115
116
  }
116
117
  if (frame.length !== rows)
117
118
  reportInvariant(`frame correction rendered ${frame.length} rows; expected ${rows}`);
118
- return this.ensureCursorMarker(frame, editorLines, editorSlice, editorBottomOffset, bottomLines.length, rows);
119
+ const finalFrame = this.ensureCursorMarker(frame, editorLines, editorSlice, editorBottomOffset, bottomLines.length, rows);
120
+ // This is the exact physical screen content used for OSC-8 mouse hit tests.
121
+ // Keep a copy because terminal rendering is allowed to retain the returned array.
122
+ this.lastFrame = finalFrame.slice();
123
+ return finalFrame;
124
+ }
125
+ /** The physical rows returned by the most recent render. */
126
+ lastRenderedFrame() {
127
+ return this.lastFrame;
119
128
  }
120
129
  invalidate() {
121
130
  this.parts.header.invalidate();
@@ -1,9 +1,8 @@
1
1
  // session/frames.ts — what this terminal DOES about each broker frame.
2
2
  //
3
3
  // Every fact a frame carries is folded by the shared pure reducer
4
- // (`core/session-model`), which the web SPA folds too — that shared fold is
5
- // what keeps the two viewers from drifting, and it happens in `foldState`
6
- // before anything here runs. What is left, and all this file owns, is the
4
+ // (`core/session-model`) in `foldState` before anything here runs. What is left,
5
+ // and all this file owns, is the
7
6
  // LOCAL effects: transcript writes, notices, editor text, and the correlated
8
7
  // refetches a fresh broker forces.
9
8
  //
@@ -1,4 +1,5 @@
1
1
  import { InputController } from '../input/controller.js';
2
+ import { type ViewerCapabilities } from '../input/capabilities.js';
2
3
  import type { ToolDisplayToggle } from '../render/chat-view.js';
3
4
  import type { KeybindingsManager } from '@earendil-works/pi-tui';
4
5
  import type { CopyTarget } from '../render/transcript-copy.js';
@@ -40,5 +41,7 @@ export interface InputWiringHooks {
40
41
  /** A prompt or steer was accepted from the editor. */
41
42
  onPromptSent: () => void;
42
43
  }
44
+ /** Construct the viewer's one capability authority. */
45
+ export declare function createViewerCapabilitiesForInput(ctx: Pick<AttachSession, 'nodeId' | 'remote' | 'role' | 'meta'>): ViewerCapabilities;
43
46
  /** Build the viewer's InputController with every hook answered. */
44
- export declare function createInputController(ctx: Pick<AttachSession, 'nodeId' | 'remote' | 'role' | 'meta' | 'socket' | 'tui' | 'editor' | 'containers'>, km: KeybindingsManager, hooks: InputWiringHooks): InputController;
47
+ export declare function createInputController(ctx: Pick<AttachSession, 'nodeId' | 'remote' | 'role' | 'meta' | 'socket' | 'tui' | 'editor' | 'containers'>, km: KeybindingsManager, capabilities: ViewerCapabilities, hooks: InputWiringHooks): InputController;
@@ -12,18 +12,23 @@
12
12
  // pickers (which need a reference to the controller being constructed, so they
13
13
  // can only be closed over from inside).
14
14
  import { InputController } from '../input/controller.js';
15
+ import { createViewerCapabilities } from '../input/capabilities.js';
15
16
  import { cliClient } from '../../../commands/api-client.js';
16
17
  import { buildLoginPicker, buildLogoutPicker } from '../overlays/auth.js';
17
18
  import { defaultAgentDir } from '../config.js';
19
+ /** Construct the viewer's one capability authority. */
20
+ export function createViewerCapabilitiesForInput(ctx) {
21
+ return createViewerCapabilities({
22
+ nodeId: ctx.nodeId,
23
+ profileId: ctx.meta.profile_id ?? undefined,
24
+ remote: ctx.remote,
25
+ role: ctx.role,
26
+ });
27
+ }
18
28
  /** Build the viewer's InputController with every hook answered. */
19
- export function createInputController(ctx, km, hooks) {
20
- const { nodeId, remote, role, socket, tui, editor, containers } = ctx;
29
+ export function createInputController(ctx, km, capabilities, hooks) {
30
+ const { nodeId, socket, tui, editor, containers } = ctx;
21
31
  const { setNotice } = hooks;
22
- // The viewer's fixed capability, resolved once at hello: an `--observer`
23
- // attach (and a remote one, which is always an observer) may read but never
24
- // mutate. Every mutating hook below is wired only when this is true; the
25
- // read-op channel (`onRequest`) and the read-only getters stay wired for all.
26
- const writable = !remote && role === 'controller';
27
32
  // Auth pickers — viewer-local OAuth/API-key flows against the SAME auth.json
28
33
  // the broker uses (broker + viewer share a filesystem in the tmux-local attach
29
34
  // model), so they run entirely in this process and then tell the broker to
@@ -37,7 +42,7 @@ export function createInputController(ctx, km, hooks) {
37
42
  // slash context carries no picker at all, so `/login` and `/logout` report
38
43
  // themselves unavailable rather than reaching a `reload_auth` frame.
39
44
  const reloadAuth = () => socket.send({ type: 'reload_auth' });
40
- const authPickers = !writable
45
+ const authPickers = !capabilities.permits('auth')
41
46
  ? {}
42
47
  : {
43
48
  openLoginPicker: () => {
@@ -56,10 +61,6 @@ export function createInputController(ctx, km, hooks) {
56
61
  // The slash context: `/promote` targets this node, `/resume-node` opens
57
62
  // scoped to its profile, `remote` structurally omits the local-only
58
63
  // canvas commands, and `/graph` toggles the overlay.
59
- nodeId,
60
- profileId: ctx.meta.profile_id ?? undefined,
61
- remote,
62
- role,
63
64
  onGraph: hooks.toggleGraph,
64
65
  onInbox: hooks.toggleInbox,
65
66
  onHelp: hooks.toggleHelp,
@@ -111,7 +112,7 @@ export function createInputController(ctx, km, hooks) {
111
112
  // broker (it goes to crtrd via `cliClient`), so leaving it wired for an
112
113
  // observer would let a read-only viewer wake and message the node.
113
114
  isDormant: hooks.isDormant,
114
- onDormantSubmit: !writable ? undefined : (msgText) => {
115
+ onDormantSubmit: !capabilities.permits('wake-dormant') ? undefined : (msgText) => {
115
116
  void (async () => {
116
117
  try {
117
118
  // Text typed into a node's box IS the human talking to it — mark it
@@ -128,6 +129,6 @@ export function createInputController(ctx, km, hooks) {
128
129
  })();
129
130
  },
130
131
  ...authPickers,
131
- });
132
+ }, capabilities);
132
133
  return input;
133
134
  }
@@ -12,7 +12,12 @@ export interface MouseReporting {
12
12
  /** Turn off unconditionally — teardown and process exit. */
13
13
  disable(): void;
14
14
  /** Install the SGR listener; returns the remover. */
15
- install(tui: TUI, onWheel: (direction: 'up' | 'down', lines: number, column: number) => void): () => void;
15
+ install(tui: TUI, handlers: MouseHandlers): () => void;
16
+ }
17
+ export interface MouseHandlers {
18
+ onWheel(direction: 'up' | 'down', lines: number, column: number): void;
19
+ /** A primary-button press with no Shift, Alt, or Control modifier. */
20
+ onPrimaryPress(column: number, row: number): void;
16
21
  }
17
22
  /** Create per-viewer mouse reporting from the user's saved starting mode. */
18
23
  export declare function createMouseReporting(write: (data: string) => void, defaultMode: MouseModeDefault): MouseReporting;
@@ -41,15 +41,18 @@ export function createMouseReporting(write, defaultMode) {
41
41
  },
42
42
  reassert,
43
43
  disable,
44
- install: (tui, onWheel) => tui.addInputListener((data) => {
44
+ install: (tui, handlers) => tui.addInputListener((data) => {
45
45
  let consumed = false;
46
- const withoutSgr = data.replace(/\x1b\[<(\d+);(\d+);\d+[Mm]/g, (_match, buttons, column) => {
46
+ const withoutSgr = data.replace(/\x1b\[<(\d+);(\d+);(\d+)([Mm])/g, (_match, buttons, column, row, action) => {
47
47
  consumed = true;
48
- const button = Number(buttons) & ~(4 | 8 | 16);
48
+ const code = Number(buttons);
49
+ const button = code & ~(4 | 8 | 16);
49
50
  if (button === 64)
50
- onWheel('up', WHEEL_LINES, Number(column));
51
+ handlers.onWheel('up', WHEEL_LINES, Number(column));
51
52
  if (button === 65)
52
- onWheel('down', WHEEL_LINES, Number(column));
53
+ handlers.onWheel('down', WHEEL_LINES, Number(column));
54
+ if (code === 0 && action === 'M')
55
+ handlers.onPrimaryPress(Number(column), Number(row));
53
56
  return '';
54
57
  });
55
58
  const withoutMouse = withoutSgr.replace(/\x1b\[M[\s\S]{3}/g, () => {
@@ -1,15 +1,16 @@
1
1
  // session/profile-files.ts — fuzzy file search across a node's local profile.
2
2
  //
3
- // The popup searches the current workspace plus every project named by the
4
- // node's profile manifest. Ancestor `.crouter/memory/` stores are added with
5
- // ignore rules disabled, so project memory remains findable even when a parent
6
- // ignore file hides `.crouter/`. fzf owns selection and nvim owns viewing; the
7
- // attach viewer only resolves the relevant roots and wires the two popups.
3
+ // The popup searches the current workspace, every project named by the node's
4
+ // profile manifest, and the profile's own memory store. Ancestor
5
+ // `.crouter/memory/` stores are added with ignore rules disabled, so project
6
+ // memory remains findable even when a parent ignore file hides `.crouter/`.
7
+ // fzf owns selection and nvim owns viewing; the attach viewer only resolves the
8
+ // relevant roots and wires the two popups.
8
9
  import { constants, accessSync, existsSync, mkdtempSync, readFileSync, rmSync, statSync } from 'node:fs';
9
10
  import { tmpdir } from 'node:os';
10
11
  import { delimiter, dirname, join, resolve, sep } from 'node:path';
11
12
  import { execFile, spawnSync } from 'node:child_process';
12
- import { loadProfileManifest } from '../../../core/profiles/manifest.js';
13
+ import { loadProfileManifest, profileMemoryDir } from '../../../core/profiles/manifest.js';
13
14
  import { shellQuote } from '../../../core/runtime/placement-tmux.js';
14
15
  import { surfaceTmuxStyleArgs } from '../../../core/runtime/surface-bg.js';
15
16
  function isDirectory(path) {
@@ -44,14 +45,15 @@ function workingExecutable(name, preferred) {
44
45
  }
45
46
  return null;
46
47
  }
47
- function profileProjectDirs(profileId) {
48
+ function profileSearchRoots(profileId) {
48
49
  if (profileId === null || profileId === '')
49
- return [];
50
+ return { projects: [], memory: null };
50
51
  try {
51
- return loadProfileManifest(profileId).manifest.projects;
52
+ const { profileId: resolvedId, manifest } = loadProfileManifest(profileId);
53
+ return { projects: manifest.projects, memory: profileMemoryDir(resolvedId) };
52
54
  }
53
55
  catch {
54
- return [];
56
+ return { projects: [], memory: null };
55
57
  }
56
58
  }
57
59
  function dedupeExistingDirs(paths) {
@@ -119,13 +121,17 @@ export function launchProfileFileSearch(opts) {
119
121
  opts.onNotice('Neovim is required for profile file search');
120
122
  return;
121
123
  }
122
- const pointers = dedupeExistingDirs([opts.cwd, ...profileProjectDirs(opts.profileId)]);
124
+ const profile = profileSearchRoots(opts.profileId);
125
+ const pointers = dedupeExistingDirs([opts.cwd, ...profile.projects]);
123
126
  if (pointers.length === 0) {
124
127
  opts.onNotice('No profile file-search directories exist');
125
128
  return;
126
129
  }
127
130
  const roots = outermostDirs(pointers);
128
- const memoryDirs = ancestorMemoryDirs(pointers);
131
+ const memoryDirs = dedupeExistingDirs([
132
+ ...(profile.memory === null ? [] : [profile.memory]),
133
+ ...ancestorMemoryDirs(pointers),
134
+ ]);
129
135
  const tempDir = mkdtempSync(join(tmpdir(), 'crtr-profile-files-'));
130
136
  const selected = join(tempDir, 'selection');
131
137
  const scans = [
@@ -105,7 +105,7 @@ export function createReconnect(ctx, hooks) {
105
105
  hooks.setNotice(dormant ? '' : '↻ node refreshing — reconnecting…', { sticky: !dormant });
106
106
  try {
107
107
  const redialed = await Promise.race([
108
- socket.redial().then(() => true),
108
+ socket.redial({ brokerUnavailableIsExpected: dormant }).then(() => true),
109
109
  stoppedSignal.then(() => false),
110
110
  ]);
111
111
  if (!redialed || stopped || hooks.isTornDown())
@@ -4,8 +4,7 @@
4
4
  // Everything this viewer knows because the broker told it — role, pi's engine
5
5
  // state, context tokens, the queue, the retained display levels — lives in ONE
6
6
  // value folded by the shared pure reducer (`core/session-model`), not in a
7
- // handful of mutable locals patched from a frame switch. The web SPA folds the
8
- // same reducer, which is what keeps the two viewers from drifting.
7
+ // handful of mutable locals patched from a frame switch.
9
8
  //
10
9
  // The dirty tracking IS identity comparison: `reduce` returns the same
11
10
  // reference for any frame that changes nothing, and the same sub-object for any
@@ -16,7 +16,8 @@ export interface ViewerSurfaceHostOptions {
16
16
  /** Styling supplied by the viewer's status-line palette. */
17
17
  formatNotice: (text: string) => string;
18
18
  noticeMs: number;
19
- capabilities: SurfaceHost['capabilities'];
19
+ /** The session facts; the host itself publishes `selfPane` from below. */
20
+ capabilities: Omit<SurfaceHost['capabilities'], 'selfPane'>;
20
21
  selfPane?: string;
21
22
  }
22
23
  /** The viewer's one host for full-pane surfaces. */
@@ -53,7 +54,7 @@ export declare class ViewerSurfaceHost implements SurfaceHost {
53
54
  title?: string;
54
55
  }): Promise<string | null>;
55
56
  /** Offer wheel input to the topmost surface only. */
56
- handleWheel(direction: 'up' | 'down', lines: number, column: number): boolean;
57
+ handleWheel(direction: 'up' | 'down', lines: number): boolean;
57
58
  /** Whether a full-pane surface currently owns input. */
58
59
  hasFullPaneSurface(): boolean;
59
60
  /** Close the whole stack before the viewer tears down its TUI. */
@@ -1,6 +1,6 @@
1
1
  import { truncateToWidth, } from '@earendil-works/pi-tui';
2
2
  import { cliClient } from '../../../commands/api-client.js';
3
- import { focusViewer } from '../../../commands/node.js';
3
+ import { focusViewer } from '../../../commands/surface/node/placement.js';
4
4
  import { daemonErrorMessage } from '../../inbox/resolve.js';
5
5
  import { buildFileReviewPicker } from '../overlays/file-review.js';
6
6
  import { reportInvariant as report } from './invariant.js';
@@ -37,8 +37,8 @@ export class ViewerSurfaceHost {
37
37
  this.statusNotice = options.statusNotice;
38
38
  this.formatNotice = options.formatNotice;
39
39
  this.noticeMs = options.noticeMs;
40
- this.capabilities = options.capabilities;
41
40
  this.selfPane = options.selfPane;
41
+ this.capabilities = { ...options.capabilities, selfPane: options.selfPane };
42
42
  }
43
43
  mount(component, opts) {
44
44
  this.disposeNotice();
@@ -136,8 +136,8 @@ export class ViewerSurfaceHost {
136
136
  });
137
137
  }
138
138
  /** Offer wheel input to the topmost surface only. */
139
- handleWheel(direction, lines, column) {
140
- return this.stack[this.stack.length - 1]?.component.handleWheel?.(direction, lines, column) ?? false;
139
+ handleWheel(direction, lines) {
140
+ return this.stack[this.stack.length - 1]?.component.handleWheel?.(direction, lines) ?? false;
141
141
  }
142
142
  /** Whether a full-pane surface currently owns input. */
143
143
  hasFullPaneSurface() {