@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,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 {};