@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,11 +1,8 @@
1
- // transport-relay.test.ts — mock-relay coverage for RelayTransport
2
- // (`../transport-relay.ts`), the REMOTE half of the Transport seam.
3
- // Fast tier: a plain `ws` WebSocketServer standing in for model-auth-front's
4
- // relay, no pi boot, no broker. Exercises exactly what the handoff doc
5
- // flagged as unverified: the Authorization header, the one-JSON-frame-per-
6
- // WS-message wire, the 1011/1008 "gone" close-code classification (and its
7
- // NOT-gone counterparts), and a non-101 handshake response (bad token) not
8
- // hanging connect().
1
+ // transport-relay.test.ts — RelayTransport coverage for the remote half of
2
+ // the Transport seam. This fast plain-`ws` stand-in for crtrd's attach endpoint
3
+ // exercises the required route, Authorization header, one-JSON-frame-per-WS-
4
+ // message wire, 1011/1008 unavailable-broker classification, and a failed
5
+ // handshake without booting pi or a broker.
9
6
  import assert from 'node:assert/strict';
10
7
  import test, { after, before } from 'node:test';
11
8
  import { existsSync, mkdtempSync, rmSync } from 'node:fs';
@@ -15,16 +12,18 @@ import { WebSocketServer } from 'ws';
15
12
  import { RelayTransport } from '../transport-relay.js';
16
13
  import { BrokerUnavailableError } from '../transport.js';
17
14
  import { jobDir } from '../../canvas/paths.js';
18
- /** Stand up a bare `ws` server on an ephemeral loopback port — the "relay" a
19
- * RelayTransport dials. Records the Authorization header + accepted sockets
20
- * of every connection so a test can assert on the wire, not just behavior. */
15
+ /** Stand up a bare `ws` crtrd attach endpoint on an ephemeral loopback port.
16
+ * It records each request URL, Authorization header, and accepted socket so
17
+ * the tests assert the wire contract directly. */
21
18
  function startMockRelay() {
22
19
  return new Promise((resolve) => {
23
20
  const wss = new WebSocketServer({ port: 0 });
24
21
  const authHeaders = [];
22
+ const requestUrls = [];
25
23
  const sockets = [];
26
24
  wss.on('connection', (ws, req) => {
27
25
  authHeaders.push(req.headers.authorization ?? '');
26
+ requestUrls.push(req.url ?? '');
28
27
  sockets.push(ws);
29
28
  });
30
29
  wss.once('listening', () => {
@@ -33,6 +32,7 @@ function startMockRelay() {
33
32
  resolve({
34
33
  target: { previewEndpoint: `http://127.0.0.1:${port}`, relayToken: 'test-token' },
35
34
  authHeaders,
35
+ requestUrls,
36
36
  sockets,
37
37
  close: () => new Promise((res) => wss.close(() => res())),
38
38
  });
@@ -57,10 +57,11 @@ function connectTransport(transport) {
57
57
  transport.connect();
58
58
  });
59
59
  }
60
- test('RelayTransport sends Authorization: Bearer <token> on connect', async () => {
60
+ test('RelayTransport dials crtrd attach with Authorization: Bearer <token>', async () => {
61
61
  const relay = await startMockRelay();
62
62
  const transport = new RelayTransport('node-auth', relay.target);
63
63
  await connectTransport(transport);
64
+ assert.equal(relay.requestUrls[0], '/v1/nodes/node-auth/attach');
64
65
  assert.equal(relay.authHeaders[0], 'Bearer test-token');
65
66
  transport.destroy();
66
67
  await relay.close();
@@ -109,10 +110,8 @@ test('a 1000 normal close does NOT surface BrokerUnavailableError', async () =>
109
110
  await relay.close();
110
111
  });
111
112
  test('an immediate post-upgrade 1011 "no node <id>" close is still caught by a listener installed BEFORE connect() is dialed', async () => {
112
- // Mirrors server.ts's bridgeConnection exactly: the relay ACCEPTS the WS
113
- // upgrade unconditionally, then discovers synchronously (no data exchange,
114
- // no delay from app logic) that the node doesn't exist and closes 1011 —
115
- // in the SAME tick the 'connection' handler runs. This is the ordering that
113
+ // Simulate a crtrd attach connection that closes 1011 immediately after its
114
+ // WebSocket upgrade. This is the ordering that
116
115
  // broke `viewer.ts`'s original startup race: the transport's 'connect'
117
116
  // (WS 'open') is structurally guaranteed to fire before any close frame can
118
117
  // be parsed (a close can't precede the handshake that establishes the
@@ -0,0 +1,28 @@
1
+ import assert from 'node:assert/strict';
2
+ import { mkdirSync, mkdtempSync, rmSync } from 'node:fs';
3
+ import test from 'node:test';
4
+ import { nodeDir } from '../../canvas/paths.js';
5
+ import { readFault } from '../../runtime/fault.js';
6
+ import { SocketTransport } from '../transport-socket.js';
7
+ test('a missing dormant broker does not leave a viewer↔broker fault', async () => {
8
+ const previousHome = process.env['CRTR_HOME'];
9
+ const home = mkdtempSync('/tmp/crtr-transport-socket-');
10
+ process.env['CRTR_HOME'] = home;
11
+ try {
12
+ const nodeId = 'dormant-node';
13
+ mkdirSync(nodeDir(nodeId), { recursive: true });
14
+ const transport = new SocketTransport(nodeId);
15
+ await assert.rejects(transport.redial());
16
+ assert.equal(readFault(nodeId)?.link, 'viewer↔broker', 'an ordinary failed redial records the outage');
17
+ await assert.rejects(transport.redial({ brokerUnavailableIsExpected: true }));
18
+ assert.equal(readFault(nodeId), null, 'a dormant node with no broker is normal, not a fault');
19
+ transport.destroy();
20
+ }
21
+ finally {
22
+ if (previousHome === undefined)
23
+ delete process.env['CRTR_HOME'];
24
+ else
25
+ process.env['CRTR_HOME'] = previousHome;
26
+ rmSync(home, { recursive: true, force: true });
27
+ }
28
+ });
@@ -1,7 +1,7 @@
1
1
  import { EventEmitter } from 'node:events';
2
2
  import type { NodeRow } from '../canvas/types.js';
3
3
  import type { BrokerDataFrame, BrokerToClient, ClientToBroker, DequeueFrame, GetHumanForkCoordinatesFrame, GetSettingsFrame, GetTreeFrame, ListMemoryRefsFrame, ListModelsFrame, ListScopedModelsFrame, ListSessionsFrame } from '../runtime/broker-protocol.js';
4
- import { type Transport } from './transport.js';
4
+ import { type RedialOptions, type Transport } from './transport.js';
5
5
  export { BrokerUnavailableError, type Transport } from './transport.js';
6
6
  export { SocketTransport } from './transport-socket.js';
7
7
  export { RelayTransport, type RelayTarget } from './transport-relay.js';
@@ -76,7 +76,7 @@ export declare class BrokerClient extends EventEmitter {
76
76
  /** Re-establish the connection after a broker exit (a yield→revive cycle),
77
77
  * to the SAME target. Resolves on `connect` (caller re-sends `hello`);
78
78
  * rejects on a retryable dial failure. */
79
- redial(): Promise<void>;
79
+ redial(options?: RedialOptions): Promise<void>;
80
80
  /** Encode + send one client→broker frame. No-op on a dead/absent
81
81
  * connection; never throws. */
82
82
  send(frame: ClientToBroker): void;
@@ -1,15 +1,12 @@
1
1
  // client.ts — THE broker protocol client. Every Node process that talks to a
2
2
  // node's broker over `view.sock` uses this one class: the `crtr surface attach`
3
3
  // viewer, `auth-reload`, `model-swap`, and the human-prompt dequeue path.
4
- // (The browser has its own module under
5
- // `clients/web/web-client/` until that is made isomorphic — see the target
6
- // architecture note; `daemon/api/bridge.ts` is a byte relay, not a client.)
7
4
  //
8
5
  // The §0 ONE-WRITER INVARIANT lives here: a client has ONLY a Transport
9
6
  // (`transport.ts`) to an ALREADY-running headless broker — locally over its
10
7
  // unix socket (`SocketTransport`, `nodeDir(id)/view.sock`), or remotely over a
11
- // relayed WebSocket to the Blaxel preview endpoint (`RelayTransport`,
12
- // `transport-relay.ts`). BrokerClient NEVER spawns pi, NEVER opens the session
8
+ // bearer-authenticated WebSocket to crtrd's preview-served attach endpoint
9
+ // (`RelayTransport`, `transport-relay.ts`). BrokerClient NEVER spawns pi, NEVER opens the session
13
10
  // `.jsonl`, NEVER constructs an engine — if the broker is not running, connect
14
11
  // fails and the caller exits (focus/revive is what keeps a broker alive, not
15
12
  // attach). It also never uses pi's `RpcClient` (which would spawn its own
@@ -128,8 +125,8 @@ export class BrokerClient extends EventEmitter {
128
125
  /** Re-establish the connection after a broker exit (a yield→revive cycle),
129
126
  * to the SAME target. Resolves on `connect` (caller re-sends `hello`);
130
127
  * rejects on a retryable dial failure. */
131
- redial() {
132
- return this.transport.redial();
128
+ redial(options) {
129
+ return this.transport.redial(options);
133
130
  }
134
131
  /** Encode + send one client→broker frame. No-op on a dead/absent
135
132
  * connection; never throws. */
@@ -1,6 +1,6 @@
1
1
  import { EventEmitter } from 'node:events';
2
2
  import type { ClientToBroker } from '../runtime/broker-protocol.js';
3
- import { type Transport } from './transport.js';
3
+ import { type RedialOptions, type Transport } from './transport.js';
4
4
  /** A resolved remote canvas target — see `core/remote-canvas-target.ts` for how
5
5
  * this is assembled from config (`relayTokenRef`) plus the 0600 secrets store
6
6
  * via `resolveRemoteCanvasTarget`. This transport itself never takes the
@@ -10,7 +10,7 @@ import { type Transport } from './transport.js';
10
10
  export interface RelayTarget {
11
11
  /** The preview endpoint origin, e.g. `https://<hash>.preview.bl.run`. */
12
12
  previewEndpoint: string;
13
- /** The raw relay/bearer token. NEVER logged, NEVER echoed. */
13
+ /** The raw bearer token. NEVER logged, NEVER echoed. */
14
14
  relayToken: string;
15
15
  }
16
16
  export declare class RelayTransport extends EventEmitter implements Transport {
@@ -22,27 +22,21 @@ export declare class RelayTransport extends EventEmitter implements Transport {
22
22
  private get url();
23
23
  private dial;
24
24
  connect(): void;
25
- /** Re-dial the SAME `wss://<previewEndpoint>/node/<id>` — the preview
26
- * endpoint is the stable anchor remotely, as `view.sock` is locally. */
27
- redial(): Promise<void>;
25
+ /** Re-dial the same crtrd attach endpoint — the preview endpoint is the
26
+ * stable remote anchor, as `view.sock` is locally. */
27
+ redial(_options?: RedialOptions): Promise<void>;
28
28
  send(frame: ClientToBroker): void;
29
29
  destroy(): void;
30
30
  private onMessage;
31
31
  private onError;
32
- /** WS close codes mirror the browser relay client's semantics: 1008 invalid
33
- * id, or a 1011 whose
34
- * REASON starts with "no running broker"/"no node " (the relay's exact
35
- * wording — `src/clients/web/server.ts`), are the terminal "gone" signals —
36
- * surfaced as BrokerUnavailableError so the reconnect supervisor's normal
37
- * give-up path applies uniformly across transports. `fault-classifier.ts`'s
38
- * `classify` is consulted only for the 1008/protocol case (parity with the
39
- * browser client), NOT for 1011 — `classifyWsClose`'s 1011 case answers "is
40
- * this reason connection-shaped", the OPPOSITE question from "is the
41
- * broker/node gone", so branching on its `kind` here previously inverted
42
- * the gone/not-gone decision (a real bug caught by the mock-relay test, see
43
- * `transport-relay.test.ts`). Everything else (1006 abnormal, 1000 normal,
44
- * or an unrecognized 1011 reason) is a transient/expected drop the caller
45
- * may redial. */
32
+ /** A 1008 invalid-id close or a 1011 whose reason starts with "no running
33
+ * broker" or "no node " is a terminal unavailable-broker signal from the
34
+ * crtrd attach bridge. Surface it as BrokerUnavailableError so the reconnect
35
+ * supervisor applies its normal give-up path across transports. `classify`
36
+ * only handles the 1008/protocol case: its 1011 classification answers
37
+ * whether a close is connection-shaped, not whether the broker is gone.
38
+ * Everything else (1006 abnormal, 1000 normal, or an unrecognized 1011
39
+ * reason) is a transient or expected drop that the caller may redial. */
46
40
  private onClose;
47
41
  /** Emit `error` only when a listener exists — a bare EventEmitter `error`
48
42
  * with no listener throws, and this transport must never throw uncaught. */
@@ -1,20 +1,11 @@
1
- // transport-relay.ts — the REMOTE Transport: a relayed WebSocket straight to
2
- // `wss://<previewEndpoint>/node/<id>`, through the in-guest model-auth-front
3
- // (bearer-gated on the home's relay token), to the SAME `/node/<id>` handler
4
- // `crtr surface web serve` already exposes for the browser client
5
- // (`src/clients/web/server.ts`). One JSON frame per WS message, both
6
- // directions — no FrameDecoder needed (WS preserves message boundaries).
1
+ // transport-relay.ts — the REMOTE Transport: a bearer-authenticated WebSocket
2
+ // to crtrd's `wss://<previewEndpoint>/v1/nodes/<id>/attach` endpoint. One JSON
3
+ // frame per WS message in both directions; no FrameDecoder is needed because
4
+ // WebSocket preserves message boundaries.
7
5
  //
8
- // Deliberately NOT the Hearth CP relay: the CP hard-pins its WS upstream to
9
- // the home's single `home_agent_target`, so it can only ever reach the home
10
- // node (findings-remote-attach-feasibility.md D1). model-auth-front does not
11
- // pin — it forwards path verbatim — so this is the only route that reaches an
12
- // arbitrary node id, which is what makes multi-node remote attach possible.
13
- //
14
- // The relay token is the SAME in-guest credential model-auth-front already
15
- // gates on; holding it is the in-guest trust tier, not a new one. Callers
16
- // must keep it off argv/shell history (see `core/remote-canvas-target.ts`) — this
17
- // transport only ever sends it as a request header, never logs it.
6
+ // Callers keep the bearer token off argv and shell history (see
7
+ // `core/remote-canvas-target.ts`). This transport sends it only as a request
8
+ // header and never logs it.
18
9
  import { EventEmitter } from 'node:events';
19
10
  import { WebSocket } from 'ws';
20
11
  import { classify } from '../fault-classifier.js';
@@ -22,7 +13,7 @@ import { BrokerUnavailableError } from './transport.js';
22
13
  function relayUrl(target, nodeId) {
23
14
  const url = new URL(target.previewEndpoint);
24
15
  url.protocol = url.protocol === 'http:' ? 'ws:' : 'wss:';
25
- url.pathname = `/node/${encodeURIComponent(nodeId)}`;
16
+ url.pathname = `/v1/nodes/${encodeURIComponent(nodeId)}/attach`;
26
17
  url.search = '';
27
18
  url.hash = '';
28
19
  return url.toString();
@@ -57,9 +48,9 @@ export class RelayTransport extends EventEmitter {
57
48
  ws.on('error', (err) => this.onError(err));
58
49
  ws.on('close', (code, reason) => this.onClose(code, reason.toString()));
59
50
  }
60
- /** Re-dial the SAME `wss://<previewEndpoint>/node/<id>` — the preview
61
- * endpoint is the stable anchor remotely, as `view.sock` is locally. */
62
- redial() {
51
+ /** Re-dial the same crtrd attach endpoint — the preview endpoint is the
52
+ * stable remote anchor, as `view.sock` is locally. */
53
+ redial(_options) {
63
54
  this.destroy();
64
55
  this.closeEmitted = false;
65
56
  return new Promise((resolve, reject) => {
@@ -132,20 +123,14 @@ export class RelayTransport extends EventEmitter {
132
123
  this.emitError(new Error(`relay transport error: ${err.message}`));
133
124
  // 'close' follows 'error'; teardown converges there.
134
125
  }
135
- /** WS close codes mirror the browser relay client's semantics: 1008 invalid
136
- * id, or a 1011 whose
137
- * REASON starts with "no running broker"/"no node " (the relay's exact
138
- * wording — `src/clients/web/server.ts`), are the terminal "gone" signals —
139
- * surfaced as BrokerUnavailableError so the reconnect supervisor's normal
140
- * give-up path applies uniformly across transports. `fault-classifier.ts`'s
141
- * `classify` is consulted only for the 1008/protocol case (parity with the
142
- * browser client), NOT for 1011 — `classifyWsClose`'s 1011 case answers "is
143
- * this reason connection-shaped", the OPPOSITE question from "is the
144
- * broker/node gone", so branching on its `kind` here previously inverted
145
- * the gone/not-gone decision (a real bug caught by the mock-relay test, see
146
- * `transport-relay.test.ts`). Everything else (1006 abnormal, 1000 normal,
147
- * or an unrecognized 1011 reason) is a transient/expected drop the caller
148
- * may redial. */
126
+ /** A 1008 invalid-id close or a 1011 whose reason starts with "no running
127
+ * broker" or "no node " is a terminal unavailable-broker signal from the
128
+ * crtrd attach bridge. Surface it as BrokerUnavailableError so the reconnect
129
+ * supervisor applies its normal give-up path across transports. `classify`
130
+ * only handles the 1008/protocol case: its 1011 classification answers
131
+ * whether a close is connection-shaped, not whether the broker is gone.
132
+ * Everything else (1006 abnormal, 1000 normal, or an unrecognized 1011
133
+ * reason) is a transient or expected drop that the caller may redial. */
149
134
  onClose(code, reason) {
150
135
  if (this.closeEmitted)
151
136
  return;
@@ -1,6 +1,6 @@
1
1
  import { EventEmitter } from 'node:events';
2
2
  import { type ClientToBroker } from '../runtime/broker-protocol.js';
3
- import { type Transport } from './transport.js';
3
+ import { type RedialOptions, type Transport } from './transport.js';
4
4
  export declare class SocketTransport extends EventEmitter implements Transport {
5
5
  private readonly nodeId;
6
6
  private socket;
@@ -17,7 +17,7 @@ export declare class SocketTransport extends EventEmitter implements Transport {
17
17
  /** Re-establish the socket after a broker exit, on the SAME stable
18
18
  * `view.sock` path. Installs a FRESH FrameDecoder (a half-frame from the
19
19
  * dead stream must not corrupt the new one). */
20
- redial(): Promise<void>;
20
+ redial(options?: RedialOptions): Promise<void>;
21
21
  send(frame: ClientToBroker): void;
22
22
  destroy(): void;
23
23
  private onData;
@@ -62,10 +62,14 @@ export class SocketTransport extends EventEmitter {
62
62
  /** Re-establish the socket after a broker exit, on the SAME stable
63
63
  * `view.sock` path. Installs a FRESH FrameDecoder (a half-frame from the
64
64
  * dead stream must not corrupt the new one). */
65
- redial() {
65
+ redial(options = {}) {
66
66
  this.destroy();
67
67
  this.decoder = new FrameDecoder(CLIENT_READ_CAPS);
68
68
  this.closeEmitted = false;
69
+ if (options.brokerUnavailableIsExpected) {
70
+ this.redialFaultRecorded = false;
71
+ clearFault(this.nodeId, { link: 'viewer↔broker' });
72
+ }
69
73
  return new Promise((resolve, reject) => {
70
74
  const socket = createConnection(this.socketPath);
71
75
  this.socket = socket;
@@ -86,7 +90,10 @@ export class SocketTransport extends EventEmitter {
86
90
  return;
87
91
  }
88
92
  settled = true;
89
- this.recordSocketFault('redial', err);
93
+ const brokerUnavailable = err.code === 'ECONNREFUSED' || err.code === 'ENOENT';
94
+ if (!options.brokerUnavailableIsExpected || !brokerUnavailable) {
95
+ this.recordSocketFault('redial', err);
96
+ }
90
97
  try {
91
98
  socket.destroy();
92
99
  }
@@ -1,5 +1,9 @@
1
1
  import type { EventEmitter } from 'node:events';
2
2
  import type { BrokerToClient, ClientToBroker } from '../runtime/broker-protocol.js';
3
+ export interface RedialOptions {
4
+ /** The node is dormant, so no broker at the target is normal until it wakes. */
5
+ brokerUnavailableIsExpected?: boolean;
6
+ }
3
7
  export interface Transport extends EventEmitter {
4
8
  /** Open the connection. Emits 'connect' on success, 'error' on a fatal
5
9
  * connect-time failure. Call once. */
@@ -7,7 +11,7 @@ export interface Transport extends EventEmitter {
7
11
  /** Re-establish the connection to the SAME target after a drop. Resolves on
8
12
  * a fresh 'connect'; rejects on a retryable dial failure (the caller's
9
13
  * reconnect supervisor decides whether to try again). */
10
- redial(): Promise<void>;
14
+ redial(options?: RedialOptions): Promise<void>;
11
15
  /** Encode + send one client→broker frame. No-op on a dead/absent connection;
12
16
  * never throws. */
13
17
  send(frame: ClientToBroker): void;
@@ -23,8 +27,8 @@ export interface Transport extends EventEmitter {
23
27
  off(event: 'error', listener: (err: Error) => void): this;
24
28
  }
25
29
  /** Surfaced when a Transport's target has no reachable broker — locally, no
26
- * socket file / nothing listening; remotely, a relay close signaling "no
27
- * broker for this node". The command catches this to exit non-zero with a
30
+ * socket file / nothing listening; remotely, a crtrd attach close signaling
31
+ * "no broker for this node". The command catches this to exit non-zero with a
28
32
  * focus/revive hint — same meaning regardless of which Transport raised it. */
29
33
  export declare class BrokerUnavailableError extends Error {
30
34
  readonly nodeId: string;
@@ -1,7 +1,7 @@
1
1
  // transport.ts — the Transport seam: BrokerClient's broker I/O, abstracted
2
2
  // so the SAME correlation/pending/close logic can ride either the LOCAL unix
3
- // socket (SocketTransport, transport-socket.ts) or a relayed WebSocket to a
4
- // remote broker (RelayTransport, transport-relay.ts). Both speak the same
3
+ // socket (SocketTransport, transport-socket.ts) or a WebSocket to crtrd's
4
+ // remote attach endpoint (RelayTransport, transport-relay.ts). Both speak the same
5
5
  // broker-protocol JSON frames; only how bytes cross the wire differs.
6
6
  //
7
7
  // A Transport is a pure duplex frame pump — connect (dial), redial (re-dial
@@ -13,8 +13,8 @@
13
13
  // seam — request correlation, the pending map, redial-vs-give-up policy — is
14
14
  // BrokerClient's job and never moves into a Transport implementation.
15
15
  /** Surfaced when a Transport's target has no reachable broker — locally, no
16
- * socket file / nothing listening; remotely, a relay close signaling "no
17
- * broker for this node". The command catches this to exit non-zero with a
16
+ * socket file / nothing listening; remotely, a crtrd attach close signaling
17
+ * "no broker for this node". The command catches this to exit non-zero with a
18
18
  * focus/revive hint — same meaning regardless of which Transport raised it. */
19
19
  export class BrokerUnavailableError extends Error {
20
20
  nodeId;
@@ -8,7 +8,7 @@ import { atomicWriteJson, deckPath } from '../../human/convention.js';
8
8
  import { createNode } from '../canvas.js';
9
9
  import { closeDb } from '../db.js';
10
10
  import { nodeDir } from '../paths.js';
11
- import { countTickets, ticketCountsForNodes, pendingTicketsForView, invalidateTicketCounts } from '../attention.js';
11
+ import { ticketCountsForNodes, pendingTicketsForView, invalidateTicketCounts } from '../attention.js';
12
12
  function meta(id, cwd, extra) {
13
13
  return {
14
14
  node_id: id,
@@ -67,23 +67,6 @@ test('ticketCountsForNodes follows bridge parents even when asking nodes share a
67
67
  seedDeck('hc');
68
68
  assert.deepEqual(ticketCountsForNodes(['a', 'b', 'c']), { a: 2, b: 1, c: 1 });
69
69
  });
70
- test('countTickets counts only tickets asked by that node', () => {
71
- createNode(meta('a', sharedCwd));
72
- createNode(meta('b', sharedCwd));
73
- bridge('ha', 'a', sharedCwd);
74
- bridge('hb', 'b', sharedCwd);
75
- seedDeck('ha');
76
- seedDeck('hb');
77
- assert.equal(countTickets('a'), 1);
78
- assert.equal(countTickets('b'), 1);
79
- });
80
- test('every requested id is present with 0 when it has no tickets', () => {
81
- createNode(meta('a', sharedCwd));
82
- createNode(meta('c', soloCwd));
83
- bridge('ha', 'a', sharedCwd);
84
- seedDeck('ha');
85
- assert.deepEqual(ticketCountsForNodes(['a', 'c']), { a: 1, c: 0 });
86
- });
87
70
  test('pendingTicketsForView returns the asking node rather than a cwd bucket', () => {
88
71
  createNode(meta('a', sharedCwd));
89
72
  createNode(meta('b', sharedCwd));
@@ -116,59 +116,6 @@ test('every request POSTs argv leading with --json, and the token appears ONLY i
116
116
  assert.ok(!String(v).includes('secret-relay-token'), `header ${k} must not carry the token`);
117
117
  }
118
118
  });
119
- test('getNode/getRow project the show response correctly', async (t) => {
120
- const server = await startMockCrtrServer((args) => {
121
- if (args[3] === 'show')
122
- return { kind: 'json', body: showResponse('a') };
123
- return { kind: 'json', status: 500, body: {} };
124
- });
125
- t.after(() => server.close());
126
- const source = new RemoteCanvasSource(server.url, 'tok');
127
- const node = await source.getNode('a');
128
- assert.equal(node?.node_id, 'a');
129
- assert.equal(node?.status, 'active');
130
- const row = await source.getRow('a');
131
- assert.equal(row?.node_id, 'a');
132
- assert.equal(row?.kind, 'general');
133
- assert.equal(row?.host_kind, null);
134
- assert.equal(row?.profile_id, null);
135
- });
136
- test('listNodes passes --status only when a filter is given', async (t) => {
137
- const seenArgs = [];
138
- const server = await startMockCrtrServer((args) => {
139
- seenArgs.push(args);
140
- const nodes = [];
141
- return { kind: 'json', body: { nodes } };
142
- });
143
- t.after(() => server.close());
144
- const source = new RemoteCanvasSource(server.url, 'tok');
145
- await source.listNodes();
146
- assert.deepEqual(seenArgs[0], ['--json', 'node', 'inspect', 'list']);
147
- await source.listNodes({ status: 'active' });
148
- assert.deepEqual(seenArgs[1], ['--json', 'node', 'inspect', 'list', '--status', 'active']);
149
- await source.listNodes({ status: ['active', 'idle'] });
150
- assert.deepEqual(seenArgs[2], ['--json', 'node', 'inspect', 'list', '--status', 'active,idle']);
151
- });
152
- test('subscriptionsOf/subscribersOf map reports/managers with created: \'\'', async (t) => {
153
- const server = await startMockCrtrServer((args) => {
154
- if (args[3] === 'show') {
155
- return {
156
- kind: 'json',
157
- body: {
158
- ...showResponse(args[4], [{ node_id: 'child', active: true }]),
159
- managers: [{ node_id: 'boss', name: 'boss', kind: 'general', status: 'active', active: false }],
160
- },
161
- };
162
- }
163
- return { kind: 'json', status: 500, body: {} };
164
- });
165
- t.after(() => server.close());
166
- const source = new RemoteCanvasSource(server.url, 'tok');
167
- const subs = await source.subscriptionsOf('a');
168
- assert.deepEqual(subs, [{ node_id: 'child', active: true, created: '' }]);
169
- const managers = await source.subscribersOf('a');
170
- assert.deepEqual(managers, [{ node_id: 'boss', active: false, created: '' }]);
171
- });
172
119
  test('view BFS traverses subscriptionsOf and is cycle-safe', async (t) => {
173
120
  // root -> a -> b -> a (cycle back to a).
174
121
  const graph = {
@@ -237,7 +184,7 @@ test('malformed success JSON (exit 0, wrong shape) degrades cleanly instead of r
237
184
  // `{}` — no `node` key at all. Without shape validation this would cast
238
185
  // through as a truthy "valid" RemoteShowResponse (an object with `.node ===
239
186
  // undefined`), and a consumer like `node inspect show`'s remote passthrough
240
- // branch (src/commands/node.ts) treats any non-null return as found, then
187
+ // branch (src/commands/node/inspect.ts) treats any non-null return as found, then
241
188
  // its renderer dereferences fields on `undefined` and throws.
242
189
  assert.equal(await source.getNode('empty-object'), null, 'a shape with no node key must degrade to null, not a malformed object');
243
190
  assert.equal(await source.rawShow('empty-object'), null);
@@ -326,12 +273,12 @@ test('isValidShowResponse rejects a payload missing/malformed on artifacts/pendi
326
273
  assert.equal(await source.rawShow('missing-artifacts'), null, 'a payload with no artifacts key must degrade to null');
327
274
  assert.equal(await source.rawShow('artifacts-wrong-type'), null, 'artifacts.report as a string must degrade to null');
328
275
  assert.equal(await source.rawShow('missing-pending-crons'), null, 'a payload with no pending_crons key must degrade to null');
329
- assert.equal(await source.rawShow('paths-session-file-undefined'), null, 'paths.session_file entirely absent (not null) must degrade to null');
276
+ assert.notEqual(await source.rawShow('paths-session-file-undefined'), null, 'an omitted session file is valid for a node that has not started a pi session');
330
277
  assert.notEqual(await source.rawShow('paths-session-file-null'), null, 'paths.session_file explicitly null (no session yet) must be ACCEPTED');
331
278
  assert.equal(await source.rawShow('missing-follow-up'), null, 'a payload with no follow_up key must degrade to null');
332
279
  assert.notEqual(await source.rawShow('fully-valid'), null, 'the tightened validator must not false-reject the real, fully-valid shape');
333
280
  });
334
- test('a malformed row element does not crash the browse snapshot path (dashboardRowsAllFromSource / renderForestFromSource)', async (t) => {
281
+ test('a malformed row element does not crash dashboard row or forest rendering', async (t) => {
335
282
  const server = await startMockCrtrServer((args) => {
336
283
  if (args[3] === 'list') {
337
284
  return { kind: 'json', body: { nodes: [null, { node_id: 'partial-only' }, fullNodeRow('good')] } };
@@ -343,16 +290,15 @@ test('a malformed row element does not crash the browse snapshot path (dashboard
343
290
  });
344
291
  t.after(() => server.close());
345
292
  const source = new RemoteCanvasSource(server.url, 'tok');
346
- // `browse/app.ts`'s `rebuildSnapshot` calls `listNodes()` and dereferences
347
- // `n.parent`/`n.kind`/`n.node_id` on every row, and `dashboardRowsAllFromSource`
348
- // reaches the same shape via `dashboardRowFromNodeRow` — both rely on
349
- // `listNodes()` having already dropped the malformed `null` element.
293
+ // `dashboardRowsAllFromSource` reaches the row shape through
294
+ // `dashboardRowFromNodeRow`; it relies on `listNodes()` dropping malformed
295
+ // elements before the renderer consumes them.
350
296
  const rows = await dashboardRowsAllFromSource(source);
351
297
  assert.deepEqual(rows.map((r) => r.node_id), ['good']);
352
298
  const forest = await renderForestFromSource(source);
353
299
  assert.ok(forest.includes('good'));
354
300
  });
355
- test('cache coalescing: two getNode calls inside the TTL hit the server once; invalidate() busts it', async (t) => {
301
+ test('cache coalescing: two getNode calls inside the TTL hit the server once', async (t) => {
356
302
  let hitCount = 0;
357
303
  const server = await startMockCrtrServer((args) => {
358
304
  if (args[3] === 'show') {
@@ -366,7 +312,4 @@ test('cache coalescing: two getNode calls inside the TTL hit the server once; in
366
312
  await source.getNode('a');
367
313
  await source.getNode('a');
368
314
  assert.equal(hitCount, 1);
369
- source.invalidate();
370
- await source.getNode('a');
371
- assert.equal(hitCount, 2);
372
315
  });
@@ -27,9 +27,8 @@ function startStalledServer() {
27
27
  }
28
28
  test('a stalled endpoint returns a timeout failure within the configured bound instead of hanging forever', async (t) => {
29
29
  const server = await startStalledServer();
30
- // Register the close BEFORE any assertion runs — a listening server left
31
- // open by a thrown assertion keeps this test file's process alive forever
32
- // (see the CI-hang postmortem on rebuild-coalescer.test.ts).
30
+ // Register the close before assertions so a failure cannot leave a listening
31
+ // server holding this test process open.
33
32
  t.after(() => server.close());
34
33
  const exec = createRemoteExec(server.url, 'tok', 100); // small timeout for the test
35
34
  const started = Date.now();