@north-light/crouter 0.3.173 → 0.3.175

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (674) hide show
  1. package/bin/runtime-selector.mjs +8 -1
  2. package/dist/api/__tests__/{client.test.js → serial/client.test.js} +2 -135
  3. package/dist/api/client.d.ts +12 -21
  4. package/dist/api/client.js +22 -31
  5. package/dist/api/dto/broker-ops.d.ts +158 -0
  6. package/dist/api/dto/broker-ops.js +6 -0
  7. package/dist/api/dto/crons.d.ts +6 -0
  8. package/dist/api/dto/human.d.ts +7 -1
  9. package/dist/api/dto/inbox.d.ts +1 -71
  10. package/dist/api/dto/inbox.js +1 -9
  11. package/dist/api/dto/nodes.d.ts +6 -7
  12. package/dist/api/dto/reviews.d.ts +1 -11
  13. package/dist/api/routes.d.ts +7 -4
  14. package/dist/api/routes.js +8 -5
  15. package/dist/build-root.js +3 -3
  16. package/dist/builtin-memory/04-base-worker.md +1 -4
  17. package/dist/builtin-memory/05-kinds/advisor/00-base.md +1 -5
  18. package/dist/builtin-memory/05-kinds/advisor/01-orchestrator.md +2 -7
  19. package/dist/builtin-memory/05-kinds/design/00-base.md +1 -6
  20. package/dist/builtin-memory/05-kinds/developer/00-base.md +1 -6
  21. package/dist/builtin-memory/05-kinds/explore/00-base.md +1 -4
  22. package/dist/builtin-memory/05-kinds/explore/01-orchestrator.md +1 -2
  23. package/dist/builtin-memory/05-kinds/general/00-base.md +1 -3
  24. package/dist/builtin-memory/05-kinds/plan/00-base.md +1 -6
  25. package/dist/builtin-memory/05-kinds/plan/reviewers/00-base.md +1 -2
  26. package/dist/builtin-memory/05-kinds/plan/reviewers/architecture-fit.md +1 -3
  27. package/dist/builtin-memory/05-kinds/plan/reviewers/code-smells.md +1 -3
  28. package/dist/builtin-memory/05-kinds/plan/reviewers/pattern-consistency.md +1 -3
  29. package/dist/builtin-memory/05-kinds/plan/reviewers/requirements-coverage.md +1 -3
  30. package/dist/builtin-memory/05-kinds/plan/reviewers/security.md +1 -4
  31. package/dist/builtin-memory/05-kinds/review/companion/00-base.md +2 -3
  32. package/dist/builtin-memory/05-kinds/spec/00-base.md +1 -2
  33. package/dist/builtin-memory/advisor/council.md +1 -6
  34. package/dist/builtin-memory/design.md +2 -7
  35. package/dist/builtin-memory/development.md +9 -14
  36. package/dist/builtin-memory/internal/marketplaces.md +2 -6
  37. package/dist/builtin-memory/internal/nodes-and-canvas.md +1 -1
  38. package/dist/builtin-memory/internal/plugins.md +2 -8
  39. package/dist/builtin-memory/internal/storage-tiers.md +1 -2
  40. package/dist/builtin-memory/testing.md +41 -0
  41. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/{provider-rotation.test.ts → serial/provider-rotation.test.ts} +27 -179
  42. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/claude-plugin-commands.ts +5 -15
  43. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/index.ts +1 -28
  44. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/memory-slash-commands.ts +43 -88
  45. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.js +7 -1
  46. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +9 -1
  47. package/dist/cli.js +2 -2
  48. package/dist/clients/attach/__tests__/attach-remote-readonly.test.js +37 -131
  49. package/dist/clients/attach/__tests__/chat-view-snapshot-ordering.test.js +71 -152
  50. package/dist/clients/attach/__tests__/context-message.test.js +16 -174
  51. package/dist/clients/attach/__tests__/crtr-output.test.js +36 -2069
  52. package/dist/clients/attach/__tests__/diagram.test.js +2 -2
  53. package/dist/clients/attach/__tests__/edit-diff.test.js +0 -4
  54. package/dist/clients/attach/__tests__/file-review-focus.test.js +2 -1
  55. package/dist/clients/attach/__tests__/group-activity.test.js +40 -229
  56. package/dist/clients/attach/__tests__/oauth-dialog-lifecycle.test.js +26 -76
  57. package/dist/clients/attach/__tests__/prompt-preview.test.js +4 -70
  58. package/dist/clients/attach/__tests__/ref-autocomplete.test.js +11 -125
  59. package/dist/clients/attach/__tests__/titled-editor-preview.test.js +14 -205
  60. package/dist/clients/attach/command.d.ts +2 -1
  61. package/dist/clients/attach/command.js +81 -76
  62. package/dist/clients/attach/input/capabilities.d.ts +27 -0
  63. package/dist/clients/attach/input/capabilities.js +96 -0
  64. package/dist/clients/attach/input/controller.d.ts +20 -182
  65. package/dist/clients/attach/input/controller.js +128 -537
  66. package/dist/clients/attach/input/overlay-owner.d.ts +41 -0
  67. package/dist/clients/attach/input/overlay-owner.js +199 -0
  68. package/dist/clients/attach/overlays/file-review.d.ts +0 -4
  69. package/dist/clients/attach/overlays/file-review.js +13 -5
  70. package/dist/clients/attach/overlays/graph.js +2 -10
  71. package/dist/clients/attach/render/chat-view.d.ts +4 -3
  72. package/dist/clients/attach/render/chat-view.js +39 -33
  73. package/dist/clients/attach/render/group-activity.d.ts +1 -0
  74. package/dist/clients/attach/render/group-activity.js +20 -13
  75. package/dist/clients/attach/render/group-recap.js +12 -3
  76. package/dist/clients/attach/session/connection.js +9 -15
  77. package/dist/clients/attach/session/editor-inventory.d.ts +6 -5
  78. package/dist/clients/attach/session/editor-inventory.js +7 -8
  79. package/dist/clients/attach/session/file-links.d.ts +13 -0
  80. package/dist/clients/attach/session/file-links.js +107 -0
  81. package/dist/clients/attach/session/frame.d.ts +3 -0
  82. package/dist/clients/attach/session/frame.js +10 -1
  83. package/dist/clients/attach/session/frames.js +2 -3
  84. package/dist/clients/attach/session/input-wiring.d.ts +4 -1
  85. package/dist/clients/attach/session/input-wiring.js +15 -14
  86. package/dist/clients/attach/session/mouse.d.ts +6 -1
  87. package/dist/clients/attach/session/mouse.js +8 -5
  88. package/dist/clients/attach/session/profile-files.js +18 -12
  89. package/dist/clients/attach/session/reconnect.js +1 -1
  90. package/dist/clients/attach/session/state-sync.js +1 -2
  91. package/dist/clients/attach/session/surface-host.d.ts +3 -2
  92. package/dist/clients/attach/session/surface-host.js +4 -4
  93. package/dist/clients/attach/slash/dispatch.d.ts +8 -31
  94. package/dist/clients/attach/slash/dispatch.js +34 -81
  95. package/dist/clients/attach/viewer.js +820 -860
  96. package/dist/clients/conversation/projection.d.ts +79 -0
  97. package/dist/clients/conversation/projection.js +341 -0
  98. package/dist/clients/inbox/__tests__/serial/inbox-controller.test.js +159 -0
  99. package/dist/clients/inbox/__tests__/serial/mount-panel.test.js +151 -0
  100. package/dist/clients/inbox/controller.d.ts +0 -4
  101. package/dist/clients/inbox/controller.js +0 -2
  102. package/dist/clients/inbox/review/__tests__/review-core.test.js +4 -293
  103. package/dist/clients/inbox/review/__tests__/teardown-notice.test.js +100 -0
  104. package/dist/clients/inbox/review/comments-client.d.ts +3 -2
  105. package/dist/clients/inbox/review/comments-client.js +12 -12
  106. package/dist/clients/inbox/review/companion-pane.d.ts +30 -0
  107. package/dist/clients/inbox/review/companion-pane.js +86 -0
  108. package/dist/clients/inbox/review/document-surface.d.ts +182 -0
  109. package/dist/clients/inbox/review/{document-region.js → document-surface.js} +252 -48
  110. package/dist/clients/inbox/review/frame.js +5 -4
  111. package/dist/clients/inbox/review/launch.d.ts +8 -8
  112. package/dist/clients/inbox/review/launch.js +52 -92
  113. package/dist/clients/inbox/review/nvim.d.ts +2 -0
  114. package/dist/clients/inbox/review/nvim.js +14 -12
  115. package/dist/clients/inbox/review/review-client.d.ts +12 -8
  116. package/dist/clients/inbox/review/review-client.js +46 -35
  117. package/dist/clients/inbox/review-adapter.d.ts +3 -10
  118. package/dist/clients/inbox/review-adapter.js +27 -19
  119. package/dist/clients/inbox/surface.d.ts +0 -4
  120. package/dist/clients/inbox/surface.js +0 -2
  121. package/dist/clients/surfaces/host.d.ts +11 -3
  122. package/dist/commands/__tests__/api-client-cold-start-diagnostic.test.js +7 -34
  123. package/dist/commands/__tests__/human.test.js +11 -322
  124. package/dist/commands/api-client.d.ts +5 -5
  125. package/dist/commands/api-client.js +6 -85
  126. package/dist/commands/canvas-browse.js +3 -29
  127. package/dist/commands/canvas-config.js +1 -1
  128. package/dist/commands/canvas-use.js +3 -3
  129. package/dist/commands/canvas.js +1 -1
  130. package/dist/commands/cron.js +5 -1
  131. package/dist/commands/human/queue.d.ts +0 -4
  132. package/dist/commands/human/queue.js +7 -40
  133. package/dist/commands/memory/list.d.ts +14 -0
  134. package/dist/commands/memory/list.js +35 -31
  135. package/dist/commands/memory/read.d.ts +7 -0
  136. package/dist/commands/memory/read.js +14 -8
  137. package/dist/commands/memory/write.js +13 -12
  138. package/dist/commands/node/bash.d.ts +1 -0
  139. package/dist/commands/node/bash.js +198 -0
  140. package/dist/commands/node/create.d.ts +23 -0
  141. package/dist/commands/node/create.js +207 -0
  142. package/dist/commands/node/inspect.d.ts +2 -0
  143. package/dist/commands/node/inspect.js +302 -0
  144. package/dist/commands/node/lifecycle.d.ts +4 -0
  145. package/dist/commands/node/lifecycle.js +415 -0
  146. package/dist/commands/node/message.d.ts +1 -0
  147. package/dist/commands/node/message.js +164 -0
  148. package/dist/commands/node/pyramid.d.ts +2 -0
  149. package/dist/commands/node/pyramid.js +79 -0
  150. package/dist/commands/node/subscription.d.ts +1 -0
  151. package/dist/commands/node/subscription.js +82 -0
  152. package/dist/commands/node/wait.d.ts +1 -0
  153. package/dist/commands/node/wait.js +159 -0
  154. package/dist/commands/node-lifecycle-revive.js +10 -57
  155. package/dist/commands/node.d.ts +0 -42
  156. package/dist/commands/node.js +11 -2065
  157. package/dist/commands/search.js +1 -1
  158. package/dist/commands/surface/node/cycle.d.ts +1 -0
  159. package/dist/commands/surface/node/cycle.js +83 -0
  160. package/dist/commands/surface/node/focus.d.ts +1 -0
  161. package/dist/commands/surface/node/focus.js +67 -0
  162. package/dist/commands/surface/node/id.d.ts +1 -0
  163. package/dist/commands/surface/node/id.js +38 -0
  164. package/dist/commands/surface/node/pin.d.ts +1 -0
  165. package/dist/commands/surface/node/pin.js +42 -0
  166. package/dist/commands/surface/node/placement.d.ts +46 -0
  167. package/dist/commands/surface/node/placement.js +124 -0
  168. package/dist/commands/surface-node.js +4 -1
  169. package/dist/commands/surface-reload.js +1 -2
  170. package/dist/commands/surface-tmux-spread.js +1 -1
  171. package/dist/commands/surface.js +5 -20
  172. package/dist/commands/sys/__tests__/setup-core.test.js +18 -271
  173. package/dist/commands/sys/config.js +6 -6
  174. package/dist/commands/sys/logs.js +1 -1
  175. package/dist/commands/sys/panels/broker-limits-panel.d.ts +17 -0
  176. package/dist/commands/sys/panels/broker-limits-panel.js +104 -0
  177. package/dist/commands/sys/panels/dependencies-panel.d.ts +14 -0
  178. package/dist/commands/sys/panels/dependencies-panel.js +80 -0
  179. package/dist/commands/sys/panels/keybindings-panel.d.ts +56 -0
  180. package/dist/commands/sys/panels/keybindings-panel.js +703 -0
  181. package/dist/commands/sys/panels/keys-panel.d.ts +16 -0
  182. package/dist/commands/sys/panels/keys-panel.js +60 -0
  183. package/dist/commands/sys/panels/models-panel.d.ts +77 -0
  184. package/dist/commands/sys/panels/models-panel.js +647 -0
  185. package/dist/commands/sys/panels/panel.d.ts +45 -0
  186. package/dist/commands/sys/panels/panel.js +137 -0
  187. package/dist/commands/sys/panels/plugins-panel.d.ts +16 -0
  188. package/dist/commands/sys/panels/plugins-panel.js +80 -0
  189. package/dist/commands/sys/panels/prefs-panel.d.ts +21 -0
  190. package/dist/commands/sys/panels/prefs-panel.js +85 -0
  191. package/dist/commands/sys/panels/provider-panel.d.ts +62 -0
  192. package/dist/commands/sys/panels/provider-panel.js +538 -0
  193. package/dist/commands/sys/settings-shell.d.ts +55 -0
  194. package/dist/commands/sys/settings-shell.js +400 -0
  195. package/dist/commands/sys/settings.d.ts +2 -0
  196. package/dist/commands/sys/settings.js +31 -0
  197. package/dist/commands/sys/setup-core.d.ts +3 -33
  198. package/dist/commands/sys/setup-core.js +27 -78
  199. package/dist/commands/sys/setup-settings-runner.d.ts +24 -0
  200. package/dist/commands/sys/setup-settings-runner.js +63 -0
  201. package/dist/commands/sys/setup-wizard.d.ts +26 -125
  202. package/dist/commands/sys/setup-wizard.js +209 -2473
  203. package/dist/commands/sys/setup.js +5 -7
  204. package/dist/commands/sys.js +3 -2
  205. package/dist/core/__tests__/broker-extension-canvas-db-boundary.test.js +50 -0
  206. package/dist/core/__tests__/broker-launch-candidates.test.js +20 -9
  207. package/dist/core/__tests__/broker-preflight.test.js +1 -1
  208. package/dist/core/__tests__/canvas-inbox-watcher-hold.test.js +108 -27
  209. package/dist/core/__tests__/canvas-inbox-watcher.test.js +14 -0
  210. package/dist/core/__tests__/canvas.test.js +2 -36
  211. package/dist/core/__tests__/close.test.js +14 -3
  212. package/dist/core/__tests__/context-intro.test.js +32 -143
  213. package/dist/core/__tests__/cron-broker-capacity.test.js +22 -3
  214. package/dist/core/__tests__/daemon-boot.test.js +2 -20
  215. package/dist/core/__tests__/daemon-wedge.test.js +1 -1
  216. package/dist/core/__tests__/dead-node-policy-table.test.js +1 -18
  217. package/dist/core/__tests__/fixtures/fake-engine.d.ts +1 -1
  218. package/dist/core/__tests__/fixtures/fake-engine.js +2 -2
  219. package/dist/core/__tests__/fixtures/fake-pi-host.js +2 -2
  220. package/dist/core/__tests__/focuses.test.js +4 -98
  221. package/dist/core/__tests__/helpers/broker-clients.d.ts +0 -3
  222. package/dist/core/__tests__/helpers/broker-clients.js +0 -14
  223. package/dist/core/__tests__/helpers/harness.d.ts +0 -8
  224. package/dist/core/__tests__/helpers/harness.js +7 -87
  225. package/dist/core/__tests__/helpers/viewer-panes.js +1 -1
  226. package/dist/core/__tests__/inline-memory-refs.test.js +5 -134
  227. package/dist/core/__tests__/kickoff.test.js +1 -1
  228. package/dist/core/__tests__/memory-resolver-precedence.test.js +29 -1
  229. package/dist/core/__tests__/migration.test.js +35 -48
  230. package/dist/core/__tests__/on-read-dedup-resume.test.js +22 -12
  231. package/dist/core/__tests__/passive-subscription.test.js +26 -49
  232. package/dist/core/__tests__/preview-registry-sync.test.js +1 -2
  233. package/dist/core/__tests__/prune.test.js +94 -1
  234. package/dist/core/__tests__/review-model-floor.test.js +0 -32
  235. package/dist/core/__tests__/seam/broker-attach-multiclient.test.js +255 -0
  236. package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.js +39 -7
  237. package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.js +30 -29
  238. package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.js +54 -5
  239. package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.js +134 -82
  240. package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.js +15 -4
  241. package/dist/core/__tests__/{full/idle-release-settlement.test.js → seam/dormancy-release.test.js} +69 -17
  242. package/dist/core/__tests__/{full/yield-message-transaction.test.js → seam/yield-refresh-transaction.test.js} +31 -9
  243. package/dist/core/__tests__/secrets.test.js +1 -7
  244. package/dist/core/__tests__/{broker-fork-seam.test.js → serial/broker-fork-seam.test.js} +58 -7
  245. package/dist/core/__tests__/{broker-sdk-wiring.test.js → serial/broker-sdk-wiring.test.js} +18 -162
  246. package/dist/core/__tests__/{broker-snapshot-history.test.js → serial/broker-snapshot-history.test.js} +9 -9
  247. package/dist/core/__tests__/{command-plugins.test.js → serial/command-plugins.test.js} +105 -15
  248. package/dist/core/__tests__/{deferred-no-wake.test.js → serial/deferred-no-wake.test.js} +23 -20
  249. package/dist/core/__tests__/{flagship-lifecycle.test.js → serial/flagship-lifecycle.test.js} +7 -7
  250. package/dist/core/__tests__/{host-teardown-process-group.test.js → serial/host-teardown-process-group.test.js} +6 -6
  251. package/dist/core/__tests__/{human-deliver-e2e.test.js → serial/human-deliver-e2e.test.js} +12 -12
  252. package/dist/core/__tests__/{live-mutation.test.js → serial/live-mutation.test.js} +5 -5
  253. package/dist/core/__tests__/{refresh-stall-recycle.test.js → serial/refresh-stall-recycle.test.js} +5 -14
  254. package/dist/core/__tests__/{revive.test.js → serial/revive.test.js} +15 -100
  255. package/dist/core/__tests__/{spawn-root.test.js → serial/spawn-root.test.js} +32 -15
  256. package/dist/core/__tests__/serial/subscription-delivery.test.js +126 -0
  257. package/dist/core/__tests__/serial/tmux-surface.test.js +256 -0
  258. package/dist/core/__tests__/{worktree.test.js → serial/worktree.test.js} +15 -15
  259. package/dist/core/__tests__/session-model.test.js +0 -18
  260. package/dist/core/__tests__/spawn-worktree-id-conflict.test.js +9 -0
  261. package/dist/core/__tests__/watchdog-abort-arms-retry.test.js +50 -0
  262. package/dist/core/broker-client/__tests__/transport-relay.test.js +15 -16
  263. package/dist/core/broker-client/__tests__/transport-socket.test.js +28 -0
  264. package/dist/core/broker-client/client.d.ts +2 -2
  265. package/dist/core/broker-client/client.js +4 -7
  266. package/dist/core/broker-client/transport-relay.d.ts +13 -19
  267. package/dist/core/broker-client/transport-relay.js +19 -34
  268. package/dist/core/broker-client/transport-socket.d.ts +2 -2
  269. package/dist/core/broker-client/transport-socket.js +9 -2
  270. package/dist/core/broker-client/transport.d.ts +7 -3
  271. package/dist/core/broker-client/transport.js +4 -4
  272. package/dist/core/canvas/__tests__/attention.test.js +1 -18
  273. package/dist/core/canvas/__tests__/remote-canvas-source.test.js +7 -64
  274. package/dist/core/canvas/__tests__/remote-transport.test.js +2 -3
  275. package/dist/core/canvas/__tests__/render-remote.test.js +7 -52
  276. package/dist/core/canvas/browse/app.d.ts +2 -17
  277. package/dist/core/canvas/browse/app.js +16 -88
  278. package/dist/core/canvas/browse/model.d.ts +0 -4
  279. package/dist/core/canvas/browse/model.js +1 -12
  280. package/dist/core/canvas/browse/render.js +6 -3
  281. package/dist/core/canvas/crons.d.ts +8 -5
  282. package/dist/core/canvas/crons.js +7 -6
  283. package/dist/core/canvas/extensions.d.ts +7 -3
  284. package/dist/core/canvas/extensions.js +16 -4
  285. package/dist/core/canvas/nav-model.d.ts +0 -4
  286. package/dist/core/canvas/nav-model.js +2 -14
  287. package/dist/core/canvas/node-order.d.ts +3 -0
  288. package/dist/core/canvas/node-order.js +12 -0
  289. package/dist/core/canvas/remote-canvas-source.d.ts +3 -6
  290. package/dist/core/canvas/remote-canvas-source.js +8 -15
  291. package/dist/core/command.js +11 -4
  292. package/dist/core/config.js +3 -1
  293. package/dist/core/events/envelope.js +1 -1
  294. package/dist/core/events/read.js +7 -21
  295. package/dist/core/events/source.d.ts +0 -2
  296. package/dist/core/events/source.js +0 -16
  297. package/dist/core/events/types.d.ts +1 -1
  298. package/dist/core/fault-classifier.d.ts +1 -1
  299. package/dist/core/feed/passive.d.ts +0 -11
  300. package/dist/core/feed/passive.js +1 -62
  301. package/dist/core/human/__tests__/{inbox-core.test.js → serial/inbox-core.test.js} +6 -6
  302. package/dist/core/keybindings/__tests__/resolve.test.js +1 -96
  303. package/dist/core/keybindings/background-bash.js +3 -4
  304. package/dist/core/keybindings/catalog.js +1 -1
  305. package/dist/core/memory/inline-ref-grammar.js +3 -3
  306. package/dist/core/memory-resolver.d.ts +11 -25
  307. package/dist/core/memory-resolver.js +51 -33
  308. package/dist/core/model-routes.d.ts +15 -0
  309. package/dist/core/model-routes.js +12 -0
  310. package/dist/core/pool-credential-store.js +1 -1
  311. package/dist/core/preview-registry.js +8 -9
  312. package/dist/core/profiles/__tests__/root-profile.test.js +4 -14
  313. package/dist/core/review/realize.d.ts +0 -13
  314. package/dist/core/review/realize.js +0 -40
  315. package/dist/core/review/types.d.ts +1 -1
  316. package/dist/core/runtime/__tests__/engine-route.test.js +2 -2
  317. package/dist/core/runtime/bearings.js +1 -11
  318. package/dist/core/runtime/broker/client-registry.d.ts +33 -0
  319. package/dist/core/runtime/broker/client-registry.js +164 -0
  320. package/dist/core/runtime/broker/daemon-ops.d.ts +19 -0
  321. package/dist/core/runtime/broker/daemon-ops.js +49 -0
  322. package/dist/core/runtime/broker/event-projection.d.ts +42 -0
  323. package/dist/core/runtime/broker/event-projection.js +178 -0
  324. package/dist/core/runtime/broker/fault-retry.d.ts +39 -0
  325. package/dist/core/runtime/broker/fault-retry.js +277 -0
  326. package/dist/core/runtime/broker/frame-dispatch.d.ts +238 -0
  327. package/dist/core/runtime/broker/frame-dispatch.js +1537 -0
  328. package/dist/core/runtime/broker/inbox.d.ts +22 -0
  329. package/dist/core/runtime/broker/inbox.js +167 -0
  330. package/dist/core/runtime/broker/passive.d.ts +16 -0
  331. package/dist/core/runtime/broker/passive.js +44 -0
  332. package/dist/core/runtime/broker/read-ops.d.ts +23 -0
  333. package/dist/core/runtime/broker/read-ops.js +150 -0
  334. package/dist/core/runtime/broker/rebind.d.ts +74 -0
  335. package/dist/core/runtime/broker/rebind.js +211 -0
  336. package/dist/core/runtime/broker/tool-groups.d.ts +39 -0
  337. package/dist/core/runtime/broker/tool-groups.js +244 -0
  338. package/dist/core/runtime/broker-extension-render.d.ts +11 -0
  339. package/dist/core/runtime/broker-extension-render.js +181 -0
  340. package/dist/core/runtime/broker-persona-guidance.d.ts +13 -0
  341. package/dist/core/runtime/broker-persona-guidance.js +58 -0
  342. package/dist/core/runtime/broker-protocol.d.ts +1 -1
  343. package/dist/core/runtime/broker-protocol.js +1 -1
  344. package/dist/core/runtime/broker.d.ts +5 -196
  345. package/dist/core/runtime/broker.js +276 -3059
  346. package/dist/core/runtime/canvas-extensions.js +11 -2
  347. package/dist/core/runtime/fault.js +1 -1
  348. package/dist/core/runtime/model-selection.d.ts +9 -0
  349. package/dist/core/runtime/model-selection.js +12 -0
  350. package/dist/core/runtime/model-swap.d.ts +3 -3
  351. package/dist/core/runtime/model-swap.js +33 -25
  352. package/dist/core/runtime/placement-tmux.d.ts +3 -14
  353. package/dist/core/runtime/placement-tmux.js +11 -80
  354. package/dist/core/runtime/placement.d.ts +4 -2
  355. package/dist/core/runtime/placement.js +7 -12
  356. package/dist/core/runtime/promote.d.ts +14 -1
  357. package/dist/core/runtime/promote.js +1 -1
  358. package/dist/core/runtime/reset.d.ts +1 -1
  359. package/dist/core/runtime/roadmap.js +1 -1
  360. package/dist/core/runtime/spawn.d.ts +8 -0
  361. package/dist/core/runtime/spawn.js +36 -6
  362. package/dist/core/runtime/stop-guard.d.ts +4 -3
  363. package/dist/core/runtime/stop-guard.js +36 -18
  364. package/dist/core/runtime/stop-signals.d.ts +4 -1
  365. package/dist/core/runtime/stream-watchdog.js +4 -5
  366. package/dist/core/runtime/structured-output.d.ts +15 -2
  367. package/dist/core/runtime/structured-output.js +35 -12
  368. package/dist/core/runtime/tmux-bindings.d.ts +25 -0
  369. package/dist/core/runtime/tmux-bindings.js +682 -0
  370. package/dist/core/runtime/tmux-chrome.d.ts +2 -1
  371. package/dist/core/runtime/tmux-chrome.js +3 -2
  372. package/dist/core/runtime/{tmux.d.ts → tmux-driver.d.ts} +18 -26
  373. package/dist/core/runtime/tmux-driver.js +598 -0
  374. package/dist/core/runtime/view-socket.d.ts +14 -0
  375. package/dist/core/runtime/view-socket.js +83 -0
  376. package/dist/core/session-model/session-state.d.ts +1 -2
  377. package/dist/core/session-model/session-state.js +5 -8
  378. package/dist/core/spawn.d.ts +1 -1
  379. package/dist/core/spawn.js +2 -2
  380. package/dist/core/substrate/gate.d.ts +1 -1
  381. package/dist/core/substrate/on-read-pure.d.ts +7 -0
  382. package/dist/core/substrate/on-read-pure.js +272 -0
  383. package/dist/core/termrender/termrender.js +32 -2
  384. package/dist/core/user-settings.d.ts +23 -1
  385. package/dist/core/user-settings.js +18 -1
  386. package/dist/daemon/api/__tests__/node-model-validation.test.js +134 -0
  387. package/dist/daemon/api/__tests__/review-terminal-conflict.test.js +98 -0
  388. package/dist/daemon/api/__tests__/{full → seam}/api-server.test.js +6 -48
  389. package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.js +17 -44
  390. package/dist/daemon/api/__tests__/{full/push-parity.test.js → seam/leaf-api-parity.test.js} +61 -42
  391. package/dist/daemon/api/bridge.js +40 -81
  392. package/dist/daemon/api/handlers/broker-ops.d.ts +2 -0
  393. package/dist/daemon/api/handlers/broker-ops.js +383 -0
  394. package/dist/daemon/api/handlers/crons.js +9 -4
  395. package/dist/daemon/api/handlers/files.js +6 -7
  396. package/dist/daemon/api/handlers/inbox.js +2 -340
  397. package/dist/daemon/api/handlers/nodes.d.ts +10 -1
  398. package/dist/daemon/api/handlers/nodes.js +74 -39
  399. package/dist/daemon/api/handlers/review-comments.js +5 -1
  400. package/dist/daemon/api/handlers/reviews.js +0 -19
  401. package/dist/daemon/api/map.js +25 -4
  402. package/dist/daemon/api/router.js +2 -3
  403. package/dist/daemon/api/server.js +5 -7
  404. package/dist/daemon/cron-run.d.ts +4 -0
  405. package/dist/daemon/cron-run.js +30 -13
  406. package/dist/daemon/crtrd.d.ts +3 -58
  407. package/dist/daemon/crtrd.js +28 -1244
  408. package/dist/daemon/manage.js +0 -1
  409. package/dist/daemon/reconcilers/broker-supervision.d.ts +50 -0
  410. package/dist/daemon/reconcilers/broker-supervision.js +549 -0
  411. package/dist/daemon/reconcilers/cron-lane.d.ts +10 -0
  412. package/dist/daemon/reconcilers/cron-lane.js +32 -0
  413. package/dist/daemon/reconcilers/dormant-inbox.d.ts +18 -0
  414. package/dist/daemon/reconcilers/dormant-inbox.js +143 -0
  415. package/dist/daemon/reconcilers/storage-maintenance.d.ts +22 -0
  416. package/dist/daemon/reconcilers/storage-maintenance.js +213 -0
  417. package/dist/daemon/review/finish.js +2 -5
  418. package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +34 -53
  419. package/dist/pi-extensions/__tests__/canvas-recap.test.js +16 -113
  420. package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +72 -99
  421. package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.js +29 -12
  422. package/dist/pi-extensions/broker-local.d.ts +20 -0
  423. package/dist/pi-extensions/broker-local.js +89 -0
  424. package/dist/pi-extensions/canvas-context-intro.d.ts +3 -3
  425. package/dist/pi-extensions/canvas-context-intro.js +22 -11
  426. package/dist/pi-extensions/canvas-doc-substrate.js +17 -34
  427. package/dist/pi-extensions/canvas-goal-capture.js +7 -12
  428. package/dist/pi-extensions/canvas-inbox-watcher.js +124 -139
  429. package/dist/pi-extensions/canvas-passive-context.d.ts +3 -3
  430. package/dist/pi-extensions/canvas-passive-context.js +22 -18
  431. package/dist/pi-extensions/canvas-recap.d.ts +2 -2
  432. package/dist/pi-extensions/canvas-recap.js +48 -21
  433. package/dist/pi-extensions/canvas-review-boundary.js +10 -4
  434. package/dist/pi-extensions/canvas-stophook.d.ts +0 -5
  435. package/dist/pi-extensions/canvas-stophook.js +149 -431
  436. package/dist/pi-extensions/canvas-structured-output.js +52 -30
  437. package/dist/pi-extensions/envelope-merge.d.ts +13 -0
  438. package/dist/pi-extensions/envelope-merge.js +29 -0
  439. package/dist/shared/working-activity.d.ts +3 -2
  440. package/dist/shared/working-activity.js +3 -2
  441. package/dist/types.d.ts +6 -5
  442. package/dist/types.js +2 -2
  443. package/docs/compat/hearth-crtr-v1.md +4 -12
  444. package/docs/compat/hearth-crtr-v2.md +3 -11
  445. package/docs/compat/hearth-crtr-v3.md +4 -12
  446. package/docs/compat/hearth-crtr-v4.md +3 -11
  447. package/docs/compat/hearth-crtr-v5.md +3 -11
  448. package/docs/public-api.md +3 -7
  449. package/package.json +7 -49
  450. package/runtime.lock.json +2766 -14533
  451. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/claude-plugin-commands.test.ts +0 -49
  452. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/memory-slash-commands.test.ts +0 -194
  453. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/statusline.test.ts +0 -68
  454. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/test.ts +0 -119
  455. package/dist/clients/attach/__tests__/attach-chrome-remote.test.js +0 -439
  456. package/dist/clients/attach/__tests__/attach-keybindings.test.js +0 -170
  457. package/dist/clients/attach/__tests__/crtr-output-coverage.test.js +0 -57
  458. package/dist/clients/attach/__tests__/editor-frame-title.test.js +0 -19
  459. package/dist/clients/attach/__tests__/input-controller-extension-command.test.js +0 -32
  460. package/dist/clients/attach/__tests__/markdown-headings.test.js +0 -35
  461. package/dist/clients/attach/__tests__/session-identity-refresh.test.js +0 -32
  462. package/dist/clients/conversation/conversation.d.ts +0 -65
  463. package/dist/clients/conversation/conversation.js +0 -318
  464. package/dist/clients/conversation/frames.d.ts +0 -30
  465. package/dist/clients/conversation/frames.js +0 -52
  466. package/dist/clients/conversation/region.d.ts +0 -51
  467. package/dist/clients/conversation/region.js +0 -265
  468. package/dist/clients/inbox/__tests__/inbox-controller.test.js +0 -247
  469. package/dist/clients/inbox/__tests__/mount-panel.test.js +0 -776
  470. package/dist/clients/inbox/review/__tests__/remap.test.js +0 -196
  471. package/dist/clients/inbox/review/columns.d.ts +0 -22
  472. package/dist/clients/inbox/review/columns.js +0 -40
  473. package/dist/clients/inbox/review/composition.d.ts +0 -60
  474. package/dist/clients/inbox/review/composition.js +0 -278
  475. package/dist/clients/inbox/review/document-region.d.ts +0 -120
  476. package/dist/clients/surfaces/region.d.ts +0 -16
  477. package/dist/clients/web/__tests__/push-engine.test.js +0 -158
  478. package/dist/clients/web/__tests__/push-registry.test.d.ts +0 -1
  479. package/dist/clients/web/__tests__/push-registry.test.js +0 -177
  480. package/dist/clients/web/dev-server.d.ts +0 -7
  481. package/dist/clients/web/dev-server.js +0 -46
  482. package/dist/clients/web/events.d.ts +0 -19
  483. package/dist/clients/web/events.js +0 -163
  484. package/dist/clients/web/push-engine.d.ts +0 -44
  485. package/dist/clients/web/push-engine.js +0 -125
  486. package/dist/clients/web/push-registry.d.ts +0 -85
  487. package/dist/clients/web/push-registry.js +0 -373
  488. package/dist/clients/web/server.d.ts +0 -19
  489. package/dist/clients/web/server.js +0 -661
  490. package/dist/clients/web/web-client/shared/protocol.d.ts +0 -214
  491. package/dist/clients/web/web-client/shared/protocol.js +0 -8
  492. package/dist/clients/web/web-cmd.d.ts +0 -2
  493. package/dist/clients/web/web-cmd.js +0 -141
  494. package/dist/commands/__tests__/api-canvas-source.test.d.ts +0 -1
  495. package/dist/commands/__tests__/api-canvas-source.test.js +0 -37
  496. package/dist/commands/__tests__/canvas-config.test.d.ts +0 -1
  497. package/dist/commands/__tests__/canvas-config.test.js +0 -107
  498. package/dist/commands/__tests__/node-no-kickoff-flag.test.d.ts +0 -1
  499. package/dist/commands/__tests__/node-no-kickoff-flag.test.js +0 -73
  500. package/dist/commands/__tests__/node-worktree-flag.test.d.ts +0 -1
  501. package/dist/commands/__tests__/node-worktree-flag.test.js +0 -49
  502. package/dist/commands/__tests__/search-contents.test.d.ts +0 -1
  503. package/dist/commands/__tests__/search-contents.test.js +0 -52
  504. package/dist/commands/memory/__tests__/lint.test.d.ts +0 -1
  505. package/dist/commands/memory/__tests__/lint.test.js +0 -15
  506. package/dist/commands/sys/__tests__/config-broker-thresholds.test.d.ts +0 -1
  507. package/dist/commands/sys/__tests__/config-broker-thresholds.test.js +0 -95
  508. package/dist/commands/sys/__tests__/config-keybindings.test.d.ts +0 -1
  509. package/dist/commands/sys/__tests__/config-keybindings.test.js +0 -55
  510. package/dist/commands/sys/__tests__/helpers/setup-runtime.d.ts +0 -5
  511. package/dist/commands/sys/__tests__/helpers/setup-runtime.js +0 -19
  512. package/dist/commands/sys/__tests__/setup-front-door.test.d.ts +0 -1
  513. package/dist/commands/sys/__tests__/setup-front-door.test.js +0 -102
  514. package/dist/commands/sys/__tests__/setup-models.test.d.ts +0 -1
  515. package/dist/commands/sys/__tests__/setup-models.test.js +0 -205
  516. package/dist/commands/sys/__tests__/setup-providers-viewport.test.d.ts +0 -1
  517. package/dist/commands/sys/__tests__/setup-providers-viewport.test.js +0 -155
  518. package/dist/commands/sys/__tests__/sync-deps.test.d.ts +0 -1
  519. package/dist/commands/sys/__tests__/sync-deps.test.js +0 -179
  520. package/dist/commands/sys/__tests__/sync-import.test.d.ts +0 -1
  521. package/dist/commands/sys/__tests__/sync-import.test.js +0 -315
  522. package/dist/core/__tests__/base-worker-prompt.test.d.ts +0 -1
  523. package/dist/core/__tests__/base-worker-prompt.test.js +0 -57
  524. package/dist/core/__tests__/command-plugins-surfaces.test.d.ts +0 -1
  525. package/dist/core/__tests__/command-plugins-surfaces.test.js +0 -359
  526. package/dist/core/__tests__/connection-reconnect-resume.test.d.ts +0 -1
  527. package/dist/core/__tests__/connection-reconnect-resume.test.js +0 -36
  528. package/dist/core/__tests__/finalization-migration.test.d.ts +0 -1
  529. package/dist/core/__tests__/finalization-migration.test.js +0 -38
  530. package/dist/core/__tests__/fixtures/extra-extension.d.ts +0 -1
  531. package/dist/core/__tests__/fixtures/extra-extension.js +0 -3
  532. package/dist/core/__tests__/fixtures/spawn-proof-target.test.d.ts +0 -1
  533. package/dist/core/__tests__/fixtures/spawn-proof-target.test.js +0 -15
  534. package/dist/core/__tests__/fork.test.d.ts +0 -1
  535. package/dist/core/__tests__/fork.test.js +0 -108
  536. package/dist/core/__tests__/full/broker-attach-limits.test.d.ts +0 -1
  537. package/dist/core/__tests__/full/broker-attach-limits.test.js +0 -147
  538. package/dist/core/__tests__/full/broker-deliver-ack.test.d.ts +0 -1
  539. package/dist/core/__tests__/full/broker-deliver-ack.test.js +0 -73
  540. package/dist/core/__tests__/full/broker-dialogs.test.d.ts +0 -1
  541. package/dist/core/__tests__/full/broker-dialogs.test.js +0 -180
  542. package/dist/core/__tests__/full/broker-display-snapshot.test.d.ts +0 -1
  543. package/dist/core/__tests__/full/broker-display-snapshot.test.js +0 -75
  544. package/dist/core/__tests__/full/broker-dormant-wake.test.d.ts +0 -1
  545. package/dist/core/__tests__/full/broker-dormant-wake.test.js +0 -130
  546. package/dist/core/__tests__/full/broker-model-changed-broadcast.test.d.ts +0 -1
  547. package/dist/core/__tests__/full/broker-model-changed-broadcast.test.js +0 -57
  548. package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.d.ts +0 -1
  549. package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.js +0 -80
  550. package/dist/core/__tests__/full/cascade-close.test.d.ts +0 -1
  551. package/dist/core/__tests__/full/cascade-close.test.js +0 -240
  552. package/dist/core/__tests__/full/detach-focus.test.d.ts +0 -1
  553. package/dist/core/__tests__/full/detach-focus.test.js +0 -126
  554. package/dist/core/__tests__/full/idle-release-settlement.test.d.ts +0 -1
  555. package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.d.ts +0 -1
  556. package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.js +0 -107
  557. package/dist/core/__tests__/full/park-clock-release.test.d.ts +0 -1
  558. package/dist/core/__tests__/full/park-clock-release.test.js +0 -56
  559. package/dist/core/__tests__/full/yield-message-transaction.test.d.ts +0 -1
  560. package/dist/core/__tests__/memory-index-render.test.d.ts +0 -1
  561. package/dist/core/__tests__/memory-index-render.test.js +0 -60
  562. package/dist/core/__tests__/model-routes.test.d.ts +0 -1
  563. package/dist/core/__tests__/model-routes.test.js +0 -41
  564. package/dist/core/__tests__/on-read-identity.test.d.ts +0 -1
  565. package/dist/core/__tests__/on-read-identity.test.js +0 -61
  566. package/dist/core/__tests__/phase4-review-migration.test.d.ts +0 -1
  567. package/dist/core/__tests__/phase4-review-migration.test.js +0 -100
  568. package/dist/core/__tests__/prune-to-limit.test.d.ts +0 -1
  569. package/dist/core/__tests__/prune-to-limit.test.js +0 -126
  570. package/dist/core/__tests__/reset.test.d.ts +0 -1
  571. package/dist/core/__tests__/reset.test.js +0 -69
  572. package/dist/core/__tests__/spawn-no-kickoff.test.d.ts +0 -1
  573. package/dist/core/__tests__/spawn-no-kickoff.test.js +0 -115
  574. package/dist/core/__tests__/steer-note.test.d.ts +0 -1
  575. package/dist/core/__tests__/steer-note.test.js +0 -41
  576. package/dist/core/__tests__/subcommand-tier.test.d.ts +0 -1
  577. package/dist/core/__tests__/subcommand-tier.test.js +0 -99
  578. package/dist/core/__tests__/subscription-delivery.test.js +0 -211
  579. package/dist/core/__tests__/test-runner-cheap-sharding.test.d.ts +0 -1
  580. package/dist/core/__tests__/test-runner-cheap-sharding.test.js +0 -97
  581. package/dist/core/__tests__/tmux-surface.test.js +0 -484
  582. package/dist/core/__tests__/wake-bearings.test.d.ts +0 -1
  583. package/dist/core/__tests__/wake-bearings.test.js +0 -102
  584. package/dist/core/canvas/__tests__/remote-event-stream.test.d.ts +0 -1
  585. package/dist/core/canvas/__tests__/remote-event-stream.test.js +0 -146
  586. package/dist/core/canvas/__tests__/source-resolve.test.d.ts +0 -1
  587. package/dist/core/canvas/__tests__/source-resolve.test.js +0 -77
  588. package/dist/core/canvas/browse/__tests__/model.test.d.ts +0 -1
  589. package/dist/core/canvas/browse/__tests__/model.test.js +0 -290
  590. package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.d.ts +0 -1
  591. package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.js +0 -134
  592. package/dist/core/canvas/browse/__tests__/render.test.d.ts +0 -1
  593. package/dist/core/canvas/browse/__tests__/render.test.js +0 -111
  594. package/dist/core/canvas/browse/rebuild-coalescer.d.ts +0 -7
  595. package/dist/core/canvas/browse/rebuild-coalescer.js +0 -61
  596. package/dist/core/canvas/remote-event-stream.d.ts +0 -24
  597. package/dist/core/canvas/remote-event-stream.js +0 -94
  598. package/dist/core/feed/__tests__/coalesce-human.test.d.ts +0 -1
  599. package/dist/core/feed/__tests__/coalesce-human.test.js +0 -36
  600. package/dist/core/feed/__tests__/empty-node-guard.test.d.ts +0 -1
  601. package/dist/core/feed/__tests__/empty-node-guard.test.js +0 -45
  602. package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.d.ts +0 -1
  603. package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.js +0 -84
  604. package/dist/core/human/__tests__/visible-paths.test.d.ts +0 -1
  605. package/dist/core/human/__tests__/visible-paths.test.js +0 -28
  606. package/dist/core/keybindings/__tests__/inbox-affordance.test.d.ts +0 -1
  607. package/dist/core/keybindings/__tests__/inbox-affordance.test.js +0 -38
  608. package/dist/core/review/__tests__/project.test.d.ts +0 -1
  609. package/dist/core/review/__tests__/project.test.js +0 -71
  610. package/dist/core/runtime/__tests__/command-expansion.test.d.ts +0 -1
  611. package/dist/core/runtime/__tests__/command-expansion.test.js +0 -25
  612. package/dist/core/runtime/__tests__/session-visibility.test.d.ts +0 -1
  613. package/dist/core/runtime/__tests__/session-visibility.test.js +0 -119
  614. package/dist/core/runtime/__tests__/spawn-at-given-id.test.d.ts +0 -1
  615. package/dist/core/runtime/__tests__/spawn-at-given-id.test.js +0 -34
  616. package/dist/core/runtime/tmux.js +0 -1314
  617. package/dist/daemon/api/__tests__/full/push-parity.test.d.ts +0 -1
  618. package/dist/daemon/api/__tests__/full/worktree-parity.test.d.ts +0 -1
  619. package/dist/daemon/api/__tests__/full/worktree-parity.test.js +0 -160
  620. package/dist/daemon/api/__tests__/inbox.test.d.ts +0 -1
  621. package/dist/daemon/api/__tests__/inbox.test.js +0 -489
  622. package/dist/web-client/apple-touch-icon.png +0 -0
  623. package/dist/web-client/assets/fragment-mono-latin-400-normal-BYwT3kSJ.woff +0 -0
  624. package/dist/web-client/assets/fragment-mono-latin-400-normal-yxdJ5AmL.woff2 +0 -0
  625. package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-BbKYyvR9.woff2 +0 -0
  626. package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-CT4YFKeK.woff +0 -0
  627. package/dist/web-client/assets/index-CCPaLeW7.css +0 -2
  628. package/dist/web-client/assets/index-kyOWsnZK.js +0 -86
  629. package/dist/web-client/assets/martian-mono-cyrillic-wght-normal-B84CD5C_.woff2 +0 -0
  630. package/dist/web-client/assets/martian-mono-latin-ext-wght-normal-DlL6xMw5.woff2 +0 -0
  631. package/dist/web-client/assets/martian-mono-latin-wght-normal-5W32yIyr.woff2 +0 -0
  632. package/dist/web-client/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -2
  633. package/dist/web-client/icon-192.png +0 -0
  634. package/dist/web-client/icon-512.png +0 -0
  635. package/dist/web-client/icon-maskable-512.png +0 -0
  636. package/dist/web-client/index.html +0 -17
  637. package/dist/web-client/manifest.webmanifest +0 -1
  638. package/dist/web-client/sw.js +0 -1
  639. /package/dist/api/__tests__/{client.test.d.ts → serial/client.test.d.ts} +0 -0
  640. /package/dist/clients/inbox/__tests__/{inbox-controller.test.d.ts → serial/inbox-controller.test.d.ts} +0 -0
  641. /package/dist/clients/inbox/__tests__/{mount-panel.test.d.ts → serial/mount-panel.test.d.ts} +0 -0
  642. /package/dist/clients/{attach/__tests__/attach-chrome-remote.test.d.ts → inbox/review/__tests__/teardown-notice.test.d.ts} +0 -0
  643. /package/dist/{clients/attach/__tests__/attach-keybindings.test.d.ts → core/__tests__/broker-extension-canvas-db-boundary.test.d.ts} +0 -0
  644. /package/dist/{clients/attach/__tests__/crtr-output-coverage.test.d.ts → core/__tests__/seam/broker-attach-multiclient.test.d.ts} +0 -0
  645. /package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.d.ts +0 -0
  646. /package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.d.ts +0 -0
  647. /package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.d.ts +0 -0
  648. /package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.d.ts +0 -0
  649. /package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.d.ts +0 -0
  650. /package/dist/{clients/attach/__tests__/editor-frame-title.test.d.ts → core/__tests__/seam/dormancy-release.test.d.ts} +0 -0
  651. /package/dist/{clients/attach/__tests__/input-controller-extension-command.test.d.ts → core/__tests__/seam/yield-refresh-transaction.test.d.ts} +0 -0
  652. /package/dist/core/__tests__/{broker-fork-seam.test.d.ts → serial/broker-fork-seam.test.d.ts} +0 -0
  653. /package/dist/core/__tests__/{broker-sdk-wiring.test.d.ts → serial/broker-sdk-wiring.test.d.ts} +0 -0
  654. /package/dist/core/__tests__/{broker-snapshot-history.test.d.ts → serial/broker-snapshot-history.test.d.ts} +0 -0
  655. /package/dist/core/__tests__/{command-plugins.test.d.ts → serial/command-plugins.test.d.ts} +0 -0
  656. /package/dist/core/__tests__/{deferred-no-wake.test.d.ts → serial/deferred-no-wake.test.d.ts} +0 -0
  657. /package/dist/core/__tests__/{flagship-lifecycle.test.d.ts → serial/flagship-lifecycle.test.d.ts} +0 -0
  658. /package/dist/core/__tests__/{host-teardown-process-group.test.d.ts → serial/host-teardown-process-group.test.d.ts} +0 -0
  659. /package/dist/core/__tests__/{human-deliver-e2e.test.d.ts → serial/human-deliver-e2e.test.d.ts} +0 -0
  660. /package/dist/core/__tests__/{live-mutation.test.d.ts → serial/live-mutation.test.d.ts} +0 -0
  661. /package/dist/core/__tests__/{refresh-stall-recycle.test.d.ts → serial/refresh-stall-recycle.test.d.ts} +0 -0
  662. /package/dist/core/__tests__/{revive.test.d.ts → serial/revive.test.d.ts} +0 -0
  663. /package/dist/core/__tests__/{spawn-root.test.d.ts → serial/spawn-root.test.d.ts} +0 -0
  664. /package/dist/core/__tests__/{subscription-delivery.test.d.ts → serial/subscription-delivery.test.d.ts} +0 -0
  665. /package/dist/core/__tests__/{tmux-surface.test.d.ts → serial/tmux-surface.test.d.ts} +0 -0
  666. /package/dist/core/__tests__/{worktree.test.d.ts → serial/worktree.test.d.ts} +0 -0
  667. /package/dist/{clients/attach/__tests__/markdown-headings.test.d.ts → core/__tests__/watchdog-abort-arms-retry.test.d.ts} +0 -0
  668. /package/dist/{clients/attach/__tests__/session-identity-refresh.test.d.ts → core/broker-client/__tests__/transport-socket.test.d.ts} +0 -0
  669. /package/dist/core/human/__tests__/{inbox-core.test.d.ts → serial/inbox-core.test.d.ts} +0 -0
  670. /package/dist/{clients/inbox/review/__tests__/remap.test.d.ts → daemon/api/__tests__/node-model-validation.test.d.ts} +0 -0
  671. /package/dist/{clients/surfaces/region.js → daemon/api/__tests__/review-terminal-conflict.test.d.ts} +0 -0
  672. /package/dist/daemon/api/__tests__/{full → seam}/api-server.test.d.ts +0 -0
  673. /package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.d.ts +0 -0
  674. /package/dist/{clients/web/__tests__/push-engine.test.d.ts → daemon/api/__tests__/seam/leaf-api-parity.test.d.ts} +0 -0
@@ -1,214 +0,0 @@
1
- /**
2
- * Shared wire types for the crouter web client/server split.
3
- *
4
- * The SPA imports the pi payload types it needs from this module — never from
5
- * broker-protocol internals. The type-only re-exports below keep the web
6
- * package's shared payload shapes in one place.
7
- */
8
- export type { UserMessage, AssistantMessage, ToolResultMessage, TextContent, ToolCall, ImageContent, } from '@earendil-works/pi-ai';
9
- export type { ThinkingLevel } from '@earendil-works/pi-agent-core';
10
- export type { RpcExtensionUIRequest, RpcExtensionUIResponse, RpcSessionState, } from '@earendil-works/pi-coding-agent';
11
- import type { AgentMessage } from '@earendil-works/pi-agent-core';
12
- import type { RpcSessionState } from '@earendil-works/pi-coding-agent';
13
- import type { DeterministicCommandExpansion } from '../../../../core/runtime/command-expansion.js';
14
- /**
15
- * An `AgentMessage` enriched with a client-side origin tag.
16
- * Only `role:'user'` messages can carry `origin:'inbox'`; all others leave
17
- * `origin` undefined. `'human'` is reserved for future explicit human-origin
18
- * tagging (currently unset — absence means human by default).
19
- *
20
- * Defined as an intersection (not `interface extends`) because `AgentMessage`
21
- * is a union type and TypeScript does not allow extending unions.
22
- */
23
- export type FoldedMessage = AgentMessage & {
24
- /** Set to `'inbox'` when this user message is recognized as injected by the
25
- * canvas-inbox-watcher extension (a coalesced inbox digest). */
26
- origin?: 'inbox' | 'human';
27
- };
28
- /** base session vs orchestrator. */
29
- export type NodeMode = 'base' | 'orchestrator';
30
- /** terminal (reaps when done) vs resident (root) node. */
31
- export type NodeLifecycle = 'terminal' | 'resident';
32
- /** Canvas lifecycle status. */
33
- export type NodeLifeStatus = 'active' | 'idle' | 'done' | 'dead' | 'canceled';
34
- /** broker-hosted (enterable) vs tmux-pane (shown, non-enterable). */
35
- export type HostKind = 'broker' | 'tmux';
36
- /** One row from `crtr canvas snapshot --json` — node identity + runtime, no chrome. */
37
- export interface NodeSummary {
38
- node_id: string;
39
- name: string;
40
- /** Node kind (developer/explore/…) — open set. */
41
- kind: string;
42
- mode: NodeMode;
43
- lifecycle: NodeLifecycle;
44
- status: NodeLifeStatus;
45
- cwd: string;
46
- /** Spine parent node id, or null for a root. */
47
- parent: string | null;
48
- /** ISO-8601 creation timestamp. */
49
- created: string;
50
- host_kind: HostKind;
51
- /** True iff `host_kind === 'broker'` (the web UI can open a live session). */
52
- enterable: boolean;
53
- /** Count of pending human asks (blocked-on-human indicator). */
54
- attention_count: number;
55
- /** Canvas cycle count for this node (revive/yield generations). Optional for
56
- * back-compat with snapshots produced before the field existed. */
57
- cycles?: number;
58
- /** ISO-8601 of the node's most recent work (session activity), distinct from
59
- * `created`. Optional/back-compat; falls back to `created` when absent. */
60
- last_activity?: string;
61
- }
62
- /** input/output token burn, with cache reads where the provider reports them. */
63
- export interface TokenBurn {
64
- input: number;
65
- output: number;
66
- cache?: number;
67
- }
68
- /** Live context-window usage. */
69
- export interface ContextUsage {
70
- tokens: number;
71
- window: number;
72
- percent: number;
73
- }
74
- /** Coarse session stats for chrome (distinct from pi's full `SessionStats`). */
75
- export interface SessionStatsSummary {
76
- turns: number;
77
- user_messages: number;
78
- assistant_messages: number;
79
- cost?: number;
80
- }
81
- /** Viewer presence for a node — a truthful count of attached views. There is
82
- * no owner: every live interactive view is writable at the same time. */
83
- export interface Presence {
84
- viewers: number;
85
- }
86
- /** Git working-tree change counts for the meta strip. */
87
- export interface GitStatus {
88
- added: number;
89
- modified: number;
90
- deleted: number;
91
- untracked: number;
92
- }
93
- /** `crtr node inspect show --json`'s node payload — `NodeSummary` plus the per-node chrome. */
94
- export interface NodeDetail extends NodeSummary {
95
- branch: string | null;
96
- model: string | null;
97
- tokens: TokenBurn | null;
98
- context: ContextUsage | null;
99
- tool_calls: number | null;
100
- stats: SessionStatsSummary | null;
101
- presence: Presence | null;
102
- /** True while a broker is live; false for a dormant (last-known) view. */
103
- live: boolean;
104
- /** Working-tree change counts for the meta strip (null when unavailable). */
105
- git_status?: GitStatus | null;
106
- }
107
- /** A slash command in a node's palette (from the broker `get_commands` reply). */
108
- export interface Command {
109
- name: string;
110
- description: string;
111
- source: 'builtin' | 'command' | 'template';
112
- location?: 'user' | 'project' | 'path';
113
- path?: string;
114
- argument_hint?: string;
115
- /** Raw file-template body used to disclose the exact expanded prompt before submission. */
116
- template?: string;
117
- /** Deterministic extension-command prompt expansion; absent for immediate UI,
118
- * dynamic, and side-effect commands. */
119
- expansion?: DeterministicCommandExpansion;
120
- }
121
- /** Metadata for one resolvable inline memory reference (design: inline memory
122
- * references). Hand-mirrored field-for-field from `RefMeta` in
123
- * `core/runtime/broker-protocol.ts` rather than imported — this module stays
124
- * free of any dependency on broker-protocol so it can be shared by both the
125
- * browser bundle and server-side code (browser convention, D11). `name` is
126
- * the canonical name a token resolves to and what `crtr memory read <name>`
127
- * expects; `scope` is the winning scope after precedence dedup (display
128
- * only). Metadata only — no document body or source path. */
129
- export interface RefMeta {
130
- name: string;
131
- kind: 'knowledge' | 'preference';
132
- scope: 'node' | 'project' | 'profile' | 'user' | 'builtin';
133
- shortForm: string;
134
- }
135
- /** `crtr canvas snapshot --json` body. */
136
- export interface CanvasSnapshot {
137
- nodes: NodeSummary[];
138
- /** ISO-8601. */
139
- generated_at: string;
140
- }
141
- /** `crtr node new --json` success. */
142
- export interface SpawnResponse {
143
- node_id: string;
144
- name: string;
145
- window?: string;
146
- session?: string;
147
- status: string;
148
- follow_up: string;
149
- }
150
- /** `crtr node message send --json` success. */
151
- export interface MessageResponse {
152
- mode: string;
153
- armed: boolean;
154
- target: string;
155
- delivered?: boolean;
156
- revived?: boolean;
157
- guidance: string;
158
- }
159
- /** `crtr node lifecycle revive --json` success. */
160
- export interface ReviveResponse {
161
- window: null;
162
- session: string | null;
163
- resumed: boolean;
164
- ready: boolean;
165
- }
166
- /** `crtr node lifecycle close --json` success. */
167
- export interface CloseResponse {
168
- closed: boolean;
169
- node_id: string;
170
- count: number;
171
- closed_ids: string[];
172
- spared: string[];
173
- }
174
- /** `crtr node new` body. Always headless; `root` toggles a resident node. */
175
- export interface SpawnRequest {
176
- prompt: string;
177
- kind: string;
178
- mode?: NodeMode;
179
- root?: boolean;
180
- cwd?: string;
181
- name?: string;
182
- model?: string;
183
- parent?: string;
184
- }
185
- /** `crtr node message send` body. */
186
- export interface MessageRequest {
187
- body: string;
188
- tier?: string;
189
- }
190
- /** `crtr node lifecycle revive` body. */
191
- export interface ReviveRequest {
192
- fresh?: boolean;
193
- }
194
- /**
195
- * Engine state carried in `snapshot.state` — pi's OWN `get_state` payload, not a
196
- * mirror of it. `BrokerSnapshot['state']` is this same type, so the welcome frame
197
- * passes through the SPA untranslated. The SPA's streaming/idle indicator reads
198
- * `isStreaming` (spec C.10).
199
- */
200
- export type SessionState = RpcSessionState;
201
- /** Fixed capability of one browser tab's session connection, stated by the
202
- * broker's `welcome`: `controller` is writable, `observer` is read-only. It is
203
- * a per-client capability, never ownership of a shared slot. */
204
- export type WebRole = 'observer' | 'controller';
205
- /** Upstream broker connectivity, surfaced to the tab (spec §6.2). */
206
- export type BrokerStatus = 'connected' | 'reconnecting' | 'down' | 'revived';
207
- /** Response payload to an extension dialog (`RpcExtensionUIResponse` minus id/type). */
208
- export type DialogResponseValue = {
209
- value: string;
210
- } | {
211
- confirmed: boolean;
212
- } | {
213
- cancelled: true;
214
- };
@@ -1,8 +0,0 @@
1
- /**
2
- * Shared wire types for the crouter web client/server split.
3
- *
4
- * The SPA imports the pi payload types it needs from this module — never from
5
- * broker-protocol internals. The type-only re-exports below keep the web
6
- * package's shared payload shapes in one place.
7
- */
8
- export {};
@@ -1,2 +0,0 @@
1
- import type { BranchDef } from '../../core/command.js';
2
- export declare function registerWeb(): BranchDef;
@@ -1,141 +0,0 @@
1
- // web-cmd.ts — the `crtr surface web` command leaf + registration.
2
- //
3
- // Starts the ONE long-running web dev shell (server.ts): a thin reverse proxy in
4
- // front of crtrd (spec §7.5). It serves the shell SPA, reverse-proxies the crtrd
5
- // REST API (`/v1/*`) and the attach WS upgrade (`ws://HOST:PORT/node/<id>` →
6
- // crtrd's `GET /v1/nodes/{id}/attach`) to crtrd's unix socket, plus the SSE
7
- // change lane (GET /__crtr/events) and web-push endpoints. It hosts NO canvas
8
- // writer — crtrd is the sole writer; the browser becomes the SAME protocol peer
9
- // as surface attach. The node is selected by the URL, so there is NO positional
10
- // node here.
11
- //
12
- // Command shape (plan §3.6): the CLI path-walker forbids a flat top-level leaf
13
- // (`defineRoot.subtrees` is `BranchDef[]`), so `web` is a BRANCH wrapping a
14
- // single leaf: `crtr surface web serve`.
15
- import { spawn } from 'node:child_process';
16
- import { defineBranch, defineLeaf } from '../../core/command.js';
17
- import { startWebServer } from './server.js';
18
- const DEFAULT_PORT = 7878;
19
- /** Best-effort open of the default browser to `url` (the `--open` flag). Never
20
- * throws — a failed open just leaves the user to click the printed URL. */
21
- function openBrowser(url) {
22
- const platform = process.platform;
23
- const [cmd, args] = platform === 'darwin'
24
- ? ['open', [url]]
25
- : platform === 'win32'
26
- ? ['cmd', ['/c', 'start', '', url]]
27
- : ['xdg-open', [url]];
28
- try {
29
- const child = spawn(cmd, args, { stdio: 'ignore', detached: true });
30
- child.on('error', () => {
31
- /* no browser opener available — the printed URL is the fallback */
32
- });
33
- child.unref();
34
- }
35
- catch {
36
- /* ignore */
37
- }
38
- }
39
- const webServeLeaf = defineLeaf({
40
- name: 'serve',
41
- description: 'start the crouter web UI server — the browser alternative to a tmux pane for watching the canvas and driving headless nodes',
42
- whenToUse: 'you want the crouter web UI in a browser instead of a tmux pane — watching the canvas and driving headless nodes from a page rather than a terminal surface. It is a dev shell that reverse-proxies crtrd (the API and the attach WS); crtrd must be running. Binds 127.0.0.1 by default; pass --host to bind elsewhere, in which case --token is required so the page can authorize. Pass --dev only if you are iterating on the shell itself (Vite HMR) rather than just running it. The node is picked in the browser via the URL, not on the command line; the server runs until ctrl+c.',
43
- help: {
44
- name: 'web serve',
45
- summary: 'start the crouter web UI server — the browser alternative to a tmux pane for watching the canvas and driving headless nodes',
46
- params: [
47
- {
48
- kind: 'flag',
49
- name: 'port',
50
- type: 'int',
51
- required: false,
52
- default: DEFAULT_PORT,
53
- constraint: `TCP port to bind on 127.0.0.1. Default ${DEFAULT_PORT}.`,
54
- },
55
- {
56
- kind: 'flag',
57
- name: 'host',
58
- type: 'string',
59
- required: false,
60
- default: '127.0.0.1',
61
- constraint: 'TCP host to bind. Default 127.0.0.1. Non-loopback binds require --token.',
62
- },
63
- {
64
- kind: 'flag',
65
- name: 'token',
66
- type: 'string',
67
- required: false,
68
- constraint: 'Bearer token for remote-capable proxy, SSE, and attach relay requests. Required for non-loopback binds.',
69
- },
70
- {
71
- kind: 'flag',
72
- name: 'open',
73
- type: 'bool',
74
- required: false,
75
- default: false,
76
- constraint: 'Auto-open the default browser to the served URL after the server starts.',
77
- },
78
- {
79
- kind: 'flag',
80
- name: 'dev',
81
- type: 'bool',
82
- required: false,
83
- default: false,
84
- constraint: 'Serve shell assets via a Vite dev server (middleware mode, HMR) instead of the prebuilt dist/web-client/ bundle. The REST proxy, SSE lane, and WS relay are identical in both modes.',
85
- },
86
- ],
87
- output: [],
88
- outputKind: 'object',
89
- effects: [
90
- 'Binds a long-running HTTP+WebSocket server on the requested host and port and keeps serving until interrupted (ctrl+c / SIGTERM). Safe to run non-interactively (daemon-like): it prints the URL and serves.',
91
- 'Serves the shell SPA (static dist/web-client/, or Vite middleware under --dev), reverse-proxies the crtrd REST API (/v1/*) to crtrd\'s unix socket, streams the GET /__crtr/events SSE change lane, and on a browser ws://HOST:<port>/node/<id> connection tunnels the WS upgrade to crtrd\'s GET /v1/nodes/<id>/attach, relaying bytes VERBATIM both directions. Non-loopback binds require a token so the remote route is not an unauthenticated surface.',
92
- 'This process hosts NO canvas writer: it opens no canvas.db and spawns no bridge subprocess. Every write and every canvas read flows to crtrd (the sole writer) through the proxy and the attach tunnel; crtrd owns attach-implies-revive. crtrd must be running.',
93
- ],
94
- },
95
- run: async (input) => {
96
- const port = input['port'] ?? DEFAULT_PORT;
97
- const host = input['host'] ?? '127.0.0.1';
98
- const tokenRaw = input['token'];
99
- const token = tokenRaw !== undefined && tokenRaw !== '' ? tokenRaw : undefined;
100
- const open = input['open'] ?? false;
101
- const dev = input['dev'] ?? false;
102
- const server = await startWebServer({ port, host, token, dev });
103
- const nodeUrlShape = `${server.url}/nodes/<id>`;
104
- const browserUrl = token !== undefined ? `${server.url}?token=${encodeURIComponent(token)}` : server.url;
105
- process.stdout.write(`crtr surface web serving on ${server.url}${dev ? ' (--dev: Vite middleware)' : ''}\n` +
106
- ` open a node: ${nodeUrlShape}\n` +
107
- ` api proxy: ${server.url}/v1/* → crtrd\n` +
108
- ` events (SSE): GET ${server.url}/__crtr/events\n` +
109
- ` shell assets: ${dev ? 'Vite middleware (HMR)' : server.clientDir}\n` +
110
- ` (ctrl+c to stop)\n`);
111
- if (open)
112
- openBrowser(browserUrl);
113
- // Long-running: resolve only on a shutdown signal, tearing down cleanly.
114
- await new Promise((resolveShutdown) => {
115
- const shutdown = () => {
116
- void server.close().then(() => resolveShutdown());
117
- };
118
- process.once('SIGINT', shutdown);
119
- process.once('SIGTERM', shutdown);
120
- process.once('SIGHUP', shutdown);
121
- });
122
- return;
123
- },
124
- render: () => '',
125
- });
126
- export function registerWeb() {
127
- return defineBranch({
128
- name: 'web',
129
- rootEntry: {
130
- concept: 'the crouter web UI server — the browser alternative to a tmux pane for watching the canvas and driving headless nodes',
131
- desc: 'serve the crouter web UI for the canvas and headless nodes',
132
- useWhen: 'you want the crouter web UI in a browser instead of a tmux pane: watch the canvas and drive headless nodes from a page. Binds 127.0.0.1 by default; a non-loopback bind requires a token so the page can authorize. The node is selected in the browser via the URL, not on the command line.',
133
- },
134
- help: {
135
- name: 'web',
136
- summary: 'serve the crouter web UI — the browser alternative to a tmux pane for the canvas and headless nodes',
137
- model: 'The branch is a long-running browser surface, an alternative to a tmux pane. `serve` binds a host and port (loopback by default; --token required off-loopback) and runs until interrupted. The node is chosen in the browser via the URL, not on the command line; the server itself only hosts the surface and never spawns an engine.',
138
- },
139
- children: [webServeLeaf],
140
- });
141
- }
@@ -1 +0,0 @@
1
- export {};
@@ -1,37 +0,0 @@
1
- import { test } from 'node:test';
2
- import assert from 'node:assert/strict';
3
- import { ApiCanvasSource } from '../api-client.js';
4
- const detail = {
5
- node_id: 'node-1',
6
- name: 'test',
7
- kind: 'general',
8
- mode: 'base',
9
- lifecycle: 'resident',
10
- status: 'active',
11
- cwd: '/tmp/project',
12
- host_kind: 'broker',
13
- profile_id: null,
14
- parent: null,
15
- created: '2026-07-31T00:00:00.000Z',
16
- intent: null,
17
- waiting_for: null,
18
- pi_pid: null,
19
- final_report: null,
20
- finalized_at: null,
21
- description: 'generated-description',
22
- icon: '\uf1fc',
23
- edges: { parent: null, spawned_by: null, subscribes_to: [], subscribers: [], children: [] },
24
- paths: {
25
- node_dir: '/tmp/node',
26
- context_dir: '/tmp/node/context',
27
- reports_dir: '/tmp/node/reports',
28
- meta_path: '/tmp/node/meta.json',
29
- inbox_path: '/tmp/node/inbox.jsonl',
30
- transcript_path: '/tmp/node/transcript.jsonl',
31
- view_socket: '/tmp/node/view.sock',
32
- },
33
- };
34
- test('the API canvas source retains the node icon needed by a reloaded viewer', async () => {
35
- const source = new ApiCanvasSource({ getNode: async () => detail });
36
- assert.equal((await source.getNode(detail.node_id))?.icon, '\uf1fc');
37
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,107 +0,0 @@
1
- // canvas-config.test.ts — `canvas config list`/`show` (`../canvas-config.ts`)
2
- // mask every target's token presence/fingerprint from a SINGLE preloaded
3
- // `SecretsStore`, never re-reading/reparsing `secrets.json` once per target
4
- // (Minor 1, Phase 3 review 3).
5
- //
6
- // Proving "reads secrets.json once, not per target" can't be done by spying —
7
- // this is a real ESM module (`node:test`'s `mock.method` cannot redefine a
8
- // non-configurable ESM export; confirmed empirically, not assumed). Instead
9
- // `secrets.json` is a real named pipe (FIFO) with exactly ONE writer that
10
- // delivers its payload once and then closes: a SECOND `readFileSync` on that
11
- // path blocks forever waiting for a writer that will never come. So `list`
12
- // across N>1 targets only resolves within the timeout if it reads the file
13
- // exactly once — the old per-target-read code would hang on the second
14
- // target's read and this test would time out.
15
- import { test, before, after } from 'node:test';
16
- import assert from 'node:assert/strict';
17
- import { execFileSync, spawn } from 'node:child_process';
18
- import { mkdtempSync, rmSync, mkdirSync, writeFileSync } from 'node:fs';
19
- import { tmpdir } from 'node:os';
20
- import { join } from 'node:path';
21
- import { Readable } from 'node:stream';
22
- import { canvasConfigBranch } from '../canvas-config.js';
23
- import { updateConfig } from '../../core/config.js';
24
- import { readSecrets } from '../../core/secrets.js';
25
- import { InputError } from '../../core/io.js';
26
- function leaf(name) {
27
- const found = (canvasConfigBranch.children ?? []).find((c) => c.name === name);
28
- if (found === undefined || found.kind !== 'leaf')
29
- throw new Error(`no leaf '${name}' under canvas config`);
30
- return found;
31
- }
32
- let home;
33
- let realHome;
34
- before(() => {
35
- realHome = process.env['HOME'];
36
- home = mkdtempSync(join(tmpdir(), 'crtr-canvas-config-'));
37
- process.env['HOME'] = home;
38
- });
39
- after(() => {
40
- rmSync(home, { recursive: true, force: true });
41
- if (realHome !== undefined)
42
- process.env['HOME'] = realHome;
43
- else
44
- delete process.env['HOME'];
45
- });
46
- test('list masks N targets from ONE secrets.json read — a per-target re-read would hang on the exhausted FIFO', async () => {
47
- // Three registered targets, each with a stored token — a per-target
48
- // re-read regression would need 3 successful reads of secrets.json.
49
- updateConfig('user', (cfg) => {
50
- cfg.remoteCanvas.targets['alpha'] = { previewEndpoint: 'https://a.example', relayTokenRef: 'alpha' };
51
- cfg.remoteCanvas.targets['beta'] = { previewEndpoint: 'https://b.example', relayTokenRef: 'beta' };
52
- cfg.remoteCanvas.targets['gamma'] = { previewEndpoint: 'https://c.example', relayTokenRef: 'gamma' };
53
- });
54
- const crouterDir = join(home, '.crouter');
55
- mkdirSync(crouterDir, { recursive: true });
56
- const secretsPath = join(crouterDir, 'secrets.json');
57
- execFileSync('mkfifo', [secretsPath]);
58
- const payload = JSON.stringify({ relayTokens: { alpha: 'tok-a', beta: 'tok-b', gamma: 'tok-c' } });
59
- // A single writer: opens the FIFO, writes the payload once, and exits —
60
- // there is no second writer, so a second reader blocks forever.
61
- const writer = spawn('sh', ['-c', `printf '%s' '${payload}' > '${secretsPath}'`], { stdio: 'ignore' });
62
- try {
63
- const result = await Promise.race([
64
- leaf('list').run({}),
65
- new Promise((_resolve, reject) => setTimeout(() => reject(new Error('list did not resolve — a second secrets.json read is blocking on the exhausted FIFO (per-target re-read regression)')), 2000)),
66
- ]);
67
- const targets = result['targets'];
68
- assert.equal(targets.length, 3);
69
- const byName = Object.fromEntries(targets.map((t) => [t['name'], t]));
70
- assert.equal(byName['alpha']?.['tokenStored'], true);
71
- assert.equal(byName['beta']?.['tokenStored'], true);
72
- assert.equal(byName['gamma']?.['tokenStored'], true);
73
- assert.notEqual(byName['alpha']?.['fingerprint'], byName['beta']?.['fingerprint']);
74
- }
75
- finally {
76
- writer.kill();
77
- // Replace the FIFO with a plain file so later tests in this process (or a
78
- // stray writer) don't wedge on it.
79
- rmSync(secretsPath, { force: true });
80
- writeFileSync(secretsPath, payload);
81
- }
82
- });
83
- // --- Phase 3 review Major 2: `add --relay-token` must be stdin-only ---
84
- test('add rejects a literal (non-"-") --relay-token value with a generic error that never echoes the received secret', async () => {
85
- const secret = 'some-literal-secret-value';
86
- await assert.rejects(() => leaf('add').run({ name: 'literal-reject-test', preview: 'https://example.test', relayToken: secret, cp: undefined }), (err) => {
87
- assert.ok(err instanceof InputError, `expected InputError, got ${err}`);
88
- const serialized = JSON.stringify({ message: err.message, payload: err.payload });
89
- assert.ok(!serialized.includes(secret), 'the thrown error must never interpolate the received relay-token value');
90
- return true;
91
- });
92
- });
93
- test('add with --relay-token - reads the raw token from stdin and stores it', async () => {
94
- const realStdin = process.stdin;
95
- const fakeStdin = Readable.from([Buffer.from('piped-stdin-token\n')]);
96
- fakeStdin.isTTY = false;
97
- Object.defineProperty(process, 'stdin', { value: fakeStdin, configurable: true });
98
- try {
99
- const result = await leaf('add').run({ name: 'stdin-add-test', preview: 'https://example.test', relayToken: '-', cp: undefined });
100
- assert.equal(result['tokenStored'], true);
101
- const secrets = readSecrets('user');
102
- assert.equal(secrets.relayTokens['stdin-add-test'], 'piped-stdin-token');
103
- }
104
- finally {
105
- Object.defineProperty(process, 'stdin', { value: realStdin, configurable: true });
106
- }
107
- });
@@ -1,73 +0,0 @@
1
- import { after, before, test } from 'node:test';
2
- import assert from 'node:assert/strict';
3
- import { mkdtempSync, rmSync } from 'node:fs';
4
- import { registerNode } from '../node.js';
5
- import { parseArgv } from '../../core/command.js';
6
- import { InputError } from '../../core/io.js';
7
- // `node new` is now a pure crtrd API client: the real end-to-end idle spawn
8
- // (broker + session up, zero model turns, follow_up notes IDLE) is exercised
9
- // against a REAL daemon in the B-1 parity harness and the daemon full tier
10
- // (src/daemon/api/__tests__/full/api-server.test.ts drives client.createNode +
11
- // real brokers). What stays worth testing here is the pure CLI-side flag matrix:
12
- // every mutually-exclusive --no-kickoff guard fires BEFORE any client call, so
13
- // these run with no daemon.
14
- const owner = 'no-kickoff-flag-owner';
15
- let home;
16
- let previousHome;
17
- let previousNodeId;
18
- function nodeNew() {
19
- const command = registerNode().children.find((child) => child.name === 'new');
20
- assert.ok(command?.kind === 'leaf', 'node new leaf is registered');
21
- return command;
22
- }
23
- before(() => {
24
- previousHome = process.env.CRTR_HOME;
25
- previousNodeId = process.env.CRTR_NODE_ID;
26
- home = mkdtempSync('/tmp/crtr-nk-flag-');
27
- process.env.CRTR_HOME = home;
28
- process.env.CRTR_NODE_ID = owner;
29
- });
30
- after(() => {
31
- if (previousHome === undefined)
32
- delete process.env.CRTR_HOME;
33
- else
34
- process.env.CRTR_HOME = previousHome;
35
- if (previousNodeId === undefined)
36
- delete process.env.CRTR_NODE_ID;
37
- else
38
- process.env.CRTR_NODE_ID = previousNodeId;
39
- rmSync(home, { recursive: true, force: true });
40
- });
41
- test('argv parsing accepts an empty/absent stdin prompt (required relaxed to allow --no-kickoff)', async () => {
42
- const leaf = nodeNew();
43
- // readStdinRaw() short-circuits to '' only when stdin looks like an
44
- // interactive TTY (no pipe) — force that so this exercises "no prompt was
45
- // piped" without blocking on the test runner's own (never-closing) stdin.
46
- const previousTty = Object.getOwnPropertyDescriptor(process.stdin, 'isTTY');
47
- Object.defineProperty(process.stdin, 'isTTY', { value: true, configurable: true, writable: true });
48
- let result;
49
- try {
50
- result = await parseArgv(leaf.help.params ?? [], ['--root', '--no-kickoff']);
51
- }
52
- finally {
53
- if (previousTty === undefined)
54
- Reflect.deleteProperty(process.stdin, 'isTTY');
55
- else
56
- Object.defineProperty(process.stdin, 'isTTY', previousTty);
57
- }
58
- assert.equal(result['prompt'], '', 'no stdin was piped, so the resolved prompt is empty');
59
- assert.equal(result['noKickoff'], true);
60
- assert.equal(result['root'], true);
61
- });
62
- test('--no-kickoff without --root is rejected', async () => {
63
- await assert.rejects(() => nodeNew().run({ noKickoff: true }), (error) => error instanceof InputError && error.code === 'no_kickoff_requires_root');
64
- });
65
- test('--no-kickoff with a prompt is rejected (mutually exclusive)', async () => {
66
- await assert.rejects(() => nodeNew().run({ noKickoff: true, root: true, prompt: 'hello' }), (error) => error instanceof InputError && error.code === 'no_kickoff_with_prompt');
67
- });
68
- test('--no-kickoff combined with orchestrator mode is rejected', async () => {
69
- await assert.rejects(() => nodeNew().run({ noKickoff: true, root: true, mode: 'orchestrator' }), (error) => error instanceof InputError && error.code === 'no_kickoff_orchestrator_unsupported');
70
- });
71
- test('no prompt and no --no-kickoff is still rejected (pre-existing requirement preserved)', async () => {
72
- await assert.rejects(() => nodeNew().run({ root: true }), (error) => error instanceof InputError && error.code === 'empty_prompt');
73
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,49 +0,0 @@
1
- import { after, before, test } from 'node:test';
2
- import assert from 'node:assert/strict';
3
- import { mkdtempSync, rmSync } from 'node:fs';
4
- import { tmpdir } from 'node:os';
5
- import { join } from 'node:path';
6
- import { registerNode } from '../node.js';
7
- import { parseArgv } from '../../core/command.js';
8
- import { CrtrError } from '../../core/errors.js';
9
- import { InputError } from '../../core/io.js';
10
- // `node new` is now a pure crtrd API client: the CLI forwards --worktree's base
11
- // into the createNode request (`worktree: <base>`), and the SERVER's buildRecipe
12
- // + spawnChild own forwarding it to worktree creation. That server-side forwarding is exercised end-to-end in
13
- // the daemon full tier (src/daemon/api/__tests__/full/worktree-parity.test.ts).
14
- // What stays worth testing HERE is the pure CLI-side validation that fires
15
- // BEFORE any client call, so these run with no daemon.
16
- const owner = 'worktree-flag-owner';
17
- let home;
18
- let previousHome;
19
- let previousNodeId;
20
- function nodeNew() {
21
- const command = registerNode().children.find((child) => child.name === 'new');
22
- assert.ok(command?.kind === 'leaf', 'node new leaf is registered');
23
- return command;
24
- }
25
- before(() => {
26
- previousHome = process.env.CRTR_HOME;
27
- previousNodeId = process.env.CRTR_NODE_ID;
28
- home = mkdtempSync(join(tmpdir(), 'crtr-node-worktree-flag-'));
29
- process.env.CRTR_HOME = home;
30
- process.env.CRTR_NODE_ID = owner;
31
- });
32
- after(() => {
33
- if (previousHome === undefined)
34
- delete process.env.CRTR_HOME;
35
- else
36
- process.env.CRTR_HOME = previousHome;
37
- if (previousNodeId === undefined)
38
- delete process.env.CRTR_NODE_ID;
39
- else
40
- process.env.CRTR_NODE_ID = previousNodeId;
41
- rmSync(home, { recursive: true, force: true });
42
- });
43
- test('bare --worktree is rejected by argv parsing before node new can spawn', async () => {
44
- const leaf = nodeNew();
45
- await assert.rejects(() => parseArgv(leaf.help.params ?? [], ['prompt', '--worktree']), (error) => error instanceof CrtrError && error.code === 'missing_parameter');
46
- });
47
- test('--worktree= is rejected by node new before spawn', async () => {
48
- await assert.rejects(() => nodeNew().run({ prompt: 'prompt', worktree: '' }), (error) => error instanceof InputError && error.code === 'worktree_base_required');
49
- });
@@ -1 +0,0 @@
1
- export {};