@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,5 +1,5 @@
1
1
  // Contract-seam tests for the external command-plugin seam (Phase 1).
2
- // Run with: node --import tsx/esm --test src/core/__tests__/command-plugins.test.ts
2
+ // Run with: npm run test:serial
3
3
  //
4
4
  // All tests run against an ISOLATED home (HOME → a fresh temp dir, no ambient
5
5
  // user plugins) and pass an explicit no-`.crouter` startDir, so discovery is
@@ -20,23 +20,28 @@
20
20
  // on the next discovery call (per-invocation, no cache).
21
21
  // 6/7. Typed issues for path/exec-bit/schema/unknown-key violations and nested
22
22
  // mount composition without executing the fixture binary.
23
- import { test, describe, before, after, beforeEach } from 'node:test';
23
+ import { test, describe, before, after, beforeEach, afterEach } from 'node:test';
24
24
  import assert from 'node:assert/strict';
25
- import { mkdtempSync, mkdirSync, writeFileSync, rmSync, chmodSync } from 'node:fs';
25
+ import { mkdtempSync, mkdirSync, writeFileSync, rmSync, chmodSync, existsSync } from 'node:fs';
26
26
  import { readFileSync } from 'node:fs';
27
27
  import { execFileSync } from 'node:child_process';
28
28
  import { tmpdir } from 'node:os';
29
29
  import { join, dirname } from 'node:path';
30
30
  import { fileURLToPath } from 'node:url';
31
- import { discoverCommandContributions, effectiveCommandPlugins, validatePluginCommands, } from '../command-plugins/discovery.js';
32
- import { composeExternalSubtrees, adaptPluginContributions } from '../command-plugins/compose.js';
33
- import { resolveCommandRegistry } from '../command-manifests/registry.js';
34
- import { defineRoot } from '../command.js';
35
- import { renderRoot, renderBranch, renderLeafArgv } from '../help.js';
36
- import { renderResult } from '../render.js';
37
- import { CrtrError } from '../errors.js';
38
- import { resetScopeCache } from '../scope.js';
39
- import { listInstalledPluginsInRoot } from '../resolver.js';
31
+ import { discoverCommandContributions, effectiveCommandPlugins, validatePluginCommands, } from '../../command-plugins/discovery.js';
32
+ import { composeExternalSubtrees, adaptPluginContributions } from '../../command-plugins/compose.js';
33
+ import { resolveCommandRegistry } from '../../command-manifests/registry.js';
34
+ import { defineRoot } from '../../command.js';
35
+ import { renderRoot, renderBranch, renderLeafArgv } from '../../help.js';
36
+ import { renderResult } from '../../render.js';
37
+ import { CrtrError } from '../../errors.js';
38
+ import { resetScopeCache } from '../../scope.js';
39
+ import { listInstalledPluginsInRoot } from '../../resolver.js';
40
+ import { pluginShow } from '../../../commands/pkg/plugin-inspect.js';
41
+ import { sysDoctorLeaf } from '../../../commands/sys/doctor.js';
42
+ import { createApiServer } from '../../../daemon/api/server.js';
43
+ import { apiSocketPath, crtrHome } from '../../canvas/paths.js';
44
+ import { closeDb } from '../../canvas/db.js';
40
45
  // The set of reserved core names discovery must fail closed against. We don't
41
46
  // import the real SUBTREE_NAMES (build-root.ts pulls the whole tree); a small
42
47
  // explicit set is enough for the collision contract and keeps the test cheap.
@@ -364,11 +369,11 @@ describe('protocol integration', () => {
364
369
  // 4b. True end-to-end CLI invocation (argv → parseArgv → adapter → renderer)
365
370
  // ---------------------------------------------------------------------------
366
371
  describe('end-to-end CLI invocation', () => {
367
- // dist/cli.js is up 4 from src/core/__tests__/. Requires a prior `npm run
368
- // build` (the harness/CI builds before tests). Drives the WHOLE seam: the
372
+ // dist/cli.js is up 4 from src/core/__tests__/serial/. Requires a prior
373
+ // `npm run build` (the harness/CI builds before tests). Drives the WHOLE seam: the
369
374
  // declared positional `app-id` must arrive as `appId` in the request, and
370
375
  // the rendered + --json outputs come through the real dispatcher.
371
- const cli = join(dirname(fileURLToPath(import.meta.url)), '..', '..', '..', 'dist', 'cli.js');
376
+ const cli = join(dirname(fileURLToPath(import.meta.url)), '..', '..', '..', '..', 'dist', 'cli.js');
372
377
  const runCrtr = (args) => {
373
378
  installPlugin(userRoot, 'deploy-tools');
374
379
  resetScopeCache();
@@ -505,3 +510,88 @@ describe('typed validation issues', () => {
505
510
  assert.equal(v.contributions[0].node.name, 'app');
506
511
  });
507
512
  });
513
+ // ---------------------------------------------------------------------------
514
+ // Lifecycle surfaces — the validator's verdict must reach the caller WITHOUT
515
+ // executing the plugin binary, and a cross-plugin top-level collision must not
516
+ // read as a pass on any claimant.
517
+ // ---------------------------------------------------------------------------
518
+ describe('lifecycle surfaces report validation without executing the plugin', () => {
519
+ // Records the fact it ran. No validation surface may ever spawn it.
520
+ const SENTINEL_EXEC = `#!/usr/bin/env node
521
+ const fs = require('fs');
522
+ if (process.env.CMDPLUGIN_SENTINEL) fs.writeFileSync(process.env.CMDPLUGIN_SENTINEL, 'executed');
523
+ process.stdout.write(JSON.stringify({ protocolVersion: 1, ok: true, result: { app_id: 'x', status: 'running' } }));
524
+ `;
525
+ let sentinel;
526
+ let realCwd;
527
+ beforeEach(() => {
528
+ realCwd = process.cwd();
529
+ sentinel = join(emptyStart, 'EXECUTED');
530
+ process.env['CMDPLUGIN_SENTINEL'] = sentinel;
531
+ process.chdir(emptyStart); // no .crouter ancestor → project scope is empty
532
+ resetScopeCache();
533
+ });
534
+ afterEach(() => {
535
+ process.chdir(realCwd);
536
+ delete process.env['CMDPLUGIN_SENTINEL'];
537
+ resetScopeCache();
538
+ });
539
+ function assertNotExecuted() {
540
+ assert.equal(existsSync(sentinel), false, 'a validation surface must never spawn the plugin binary');
541
+ }
542
+ test('pkg plugin show passes the typed issue through and mounts nothing', async () => {
543
+ const broken = commandsJson();
544
+ broken['schemaVersion'] = 2;
545
+ installPlugin(userRoot, 'p', { manifest: broken, exec: SENTINEL_EXEC });
546
+ resetScopeCache();
547
+ const out = await pluginShow.run({ name: 'p' });
548
+ const commands = out['commands'];
549
+ const issue = commands.issues.find((i) => i.code === 'command_schema_version');
550
+ assert.ok(issue, `expected command_schema_version, got ${JSON.stringify(commands.issues.map((i) => i.code))}`);
551
+ assert.ok(typeof issue.received === 'string' && typeof issue.expected === 'string' && typeof issue.next === 'string');
552
+ assert.equal(commands.mounts.length, 0, 'a rejected manifest contributes no mounts');
553
+ assertNotExecuted();
554
+ });
555
+ test('a cross-plugin top-level collision drops the command and fails BOTH claimants on every surface', async () => {
556
+ // Two plugins, each valid in isolation, both claiming `app`.
557
+ installPlugin(userRoot, 'p-one', { exec: SENTINEL_EXEC });
558
+ installPlugin(userRoot, 'p-two', { exec: SENTINEL_EXEC });
559
+ resetScopeCache();
560
+ const snapshot = discoverCommandContributions(new Set(['sys']), emptyStart);
561
+ assert.equal(snapshot.contributions.length, 0, 'a collided top-level command must not be mounted by ANY claimant');
562
+ assert.deepEqual(snapshot.issues.filter((i) => i.code === 'command_collision').map((i) => i.plugin).sort(), ['p-one', 'p-two'], 'both claimants are flagged');
563
+ for (const name of ['p-one', 'p-two']) {
564
+ const out = await pluginShow.run({ name });
565
+ const commands = out['commands'];
566
+ assert.deepEqual(commands.mounts, [], `${name} must not list the collided command as an accepted mount`);
567
+ const issue = commands.issues.find((i) => i.code === 'command_collision');
568
+ assert.ok(issue, `${name} show must carry the command_collision issue`);
569
+ assert.deepEqual(issue.received.split(', ').sort(), ['p-one', 'p-two'], 'the issue names both claimants');
570
+ }
571
+ // `sys doctor` scans live nodes through the daemon API, so it needs a
572
+ // reachable daemon answering with an empty roster (no node is ever created
573
+ // here) rather than trying to autostart a subprocess.
574
+ mkdirSync(crtrHome(), { recursive: true });
575
+ const server = createApiServer();
576
+ try {
577
+ for (let i = 0; i < 200 && !existsSync(apiSocketPath()); i++)
578
+ await new Promise((r) => setTimeout(r, 25));
579
+ assert.equal(existsSync(apiSocketPath()), true, 'api socket never bound');
580
+ const out = await sysDoctorLeaf.run({ scope: 'user', fix: false, remote: false });
581
+ const checks = out['checks'];
582
+ for (const name of ['p-one', 'p-two']) {
583
+ assert.equal(checks.find((k) => k.name === `plugin:${name}:commands` && k.status === 'pass'), undefined, `${name} must not PASS while its command is dropped by a collision`);
584
+ const failCheck = checks.find((k) => k.name.startsWith(`plugin:${name}:commands`) && k.status === 'fail' && /command_collision/.test(k.message));
585
+ assert.ok(failCheck, `${name} must fail with command_collision, got ${JSON.stringify(checks.map((k) => k.name + ':' + k.status))}`);
586
+ assert.match(failCheck.message, /claimed by multiple plugins/);
587
+ assert.equal(failCheck.remediation?.kind, 'human_action', 'command remediation is never auto-applied');
588
+ }
589
+ assert.equal(out['ok'], false);
590
+ }
591
+ finally {
592
+ await server.close();
593
+ closeDb();
594
+ }
595
+ assertNotExecuted();
596
+ });
597
+ });
@@ -1,4 +1,4 @@
1
- // Run with: node --import tsx/esm --test src/core/__tests__/deferred-no-wake.test.ts
1
+ // Run with: npm run test:serial
2
2
  //
3
3
  // REGRESSION LOCK — gh issue #341. `--tier deferred` is documented as the ONE
4
4
  // tier that never wakes an idle node ("read on its next natural cycle"), but
@@ -44,21 +44,21 @@ import { tmpdir } from 'node:os';
44
44
  import { join } from 'node:path';
45
45
  import { spawnSync } from 'node:child_process';
46
46
  import { DatabaseSync } from 'node:sqlite';
47
- import { createNode, deleteNode, getNode, setStatus, withFreshTerminalGuard } from '../canvas/canvas.js';
48
- import { hasNoNaturalCycle } from '../runtime/revive-all.js';
49
- import { canvasDbPath, nodeDir, apiSocketPath } from '../canvas/paths.js';
50
- import { closeDb } from '../canvas/db.js';
51
- import { createApiServer } from '../../daemon/api/server.js';
52
- import { CrtrClient } from '../../api/index.js';
53
- import { registerNode } from '../../commands/node.js';
54
- import { pushFinal } from '../feed/feed.js';
55
- import { InputError } from '../io.js';
56
- import { headlessBrokerHost } from '../runtime/host.js';
57
- import { appendInbox, readInboxSince, readCursor } from '../feed/inbox.js';
58
- import { superviseTick } from '../../daemon/crtrd.js';
59
- import registerCanvasInboxWatcher from '../../pi-extensions/canvas-inbox-watcher.js';
60
- import { bindTestFleet } from './helpers/fleet.js';
61
- import { resetFleetForTests } from '../runtime/fleet.js';
47
+ import { createNode, deleteNode, getNode, setStatus, withFreshTerminalGuard } from '../../canvas/canvas.js';
48
+ import { hasNoNaturalCycle } from '../../runtime/revive-all.js';
49
+ import { canvasDbPath, nodeDir, apiSocketPath } from '../../canvas/paths.js';
50
+ import { closeDb } from '../../canvas/db.js';
51
+ import { createApiServer } from '../../../daemon/api/server.js';
52
+ import { CrtrClient } from '../../../api/index.js';
53
+ import { registerNode } from '../../../commands/node.js';
54
+ import { pushFinal } from '../../feed/feed.js';
55
+ import { InputError } from '../../io.js';
56
+ import { headlessBrokerHost } from '../../runtime/host.js';
57
+ import { appendInbox, readInboxSince, readCursor } from '../../feed/inbox.js';
58
+ import { superviseTick } from '../../../daemon/crtrd.js';
59
+ import registerCanvasInboxWatcher from '../../../pi-extensions/canvas-inbox-watcher.js';
60
+ import { bindTestFleet } from '../helpers/fleet.js';
61
+ import { resetFleetForTests } from '../../runtime/fleet.js';
62
62
  let home;
63
63
  let server;
64
64
  const prevNodeId = process.env['CRTR_NODE_ID'];
@@ -439,13 +439,16 @@ function makeFakePi() {
439
439
  on(e, h) { handlers[e] = h; },
440
440
  sendUserMessage(content, options) { this.injected.push({ content, deliverAs: options?.deliverAs }); },
441
441
  sendMessage() { },
442
- fire(e, ev, ctx) { handlers[e]?.(ev, ctx); },
442
+ async fire(e, ev, ctx) { await handlers[e]?.(ev, ctx); },
443
443
  };
444
444
  }
445
445
  const wait = (ms) => new Promise((r) => setTimeout(r, ms));
446
446
  test('the real inbox watcher holds a deferred entry alone, then delivers it TOGETHER with a later normal entry with no duplicate/loss, and the durable cursor settles past both (gh #341 review: genuine delivery, not just the daemon decision)', { timeout: 30_000 }, async () => {
447
447
  const id = 'watcherDeferredThenNormal';
448
- createNode(node(id, { status: 'idle', intent: null }));
448
+ // The watcher may advance its cursor only for the current broker generation.
449
+ // This fake Pi runs in this test process, so its fabricated node must carry
450
+ // that process as the active broker just like a real launched node does.
451
+ createNode(node(id, { status: 'idle', intent: null, pi_pid: process.pid }));
449
452
  const TICK_MS = 20;
450
453
  const DEBOUNCE_MS = 25;
451
454
  const SETTLE_MS = TICK_MS * 2 + DEBOUNCE_MS + 30;
@@ -462,7 +465,7 @@ test('the real inbox watcher holds a deferred entry alone, then delivers it TOGE
462
465
  // session_start is the real lifecycle gate that arms the watcher's poll
463
466
  // interval and initial tick (see canvas-inbox-watcher.ts) — registration
464
467
  // alone only wires up handlers.
465
- pi.fire('session_start', { type: 'session_start' }, undefined);
468
+ await pi.fire('session_start', { type: 'session_start' }, undefined);
466
469
  // No agent_start fired — the watcher treats the node as idle, same as the
467
470
  // idle-released daemon scenario above.
468
471
  await wait(TICK_MS + 60);
@@ -492,7 +495,7 @@ test('the real inbox watcher holds a deferred entry alone, then delivers it TOGE
492
495
  // durable cursor at agent_settled (never on the fire-and-forget send
493
496
  // itself) — settle the turn and prove the cursor lands past BOTH delivered
494
497
  // entries, not just the earlier (previously-held) one.
495
- pi.fire('agent_settled', { type: 'agent_settled' }, { isIdle: () => true, hasPendingMessages: () => false });
498
+ await pi.fire('agent_settled', { type: 'agent_settled' }, { isIdle: () => true, hasPendingMessages: () => false });
496
499
  assert.equal(readCursor(id), normalEntry.entry_id, 'the durable cursor settles past BOTH delivered entries, at the final physical entry');
497
500
  assert.notEqual(readCursor(id), deferredEntry.entry_id, 'not a partial commit stuck at the earlier entry');
498
501
  }
@@ -1,4 +1,4 @@
1
- // Run with: node --import tsx/esm --test src/core/__tests__/flagship-lifecycle.test.ts
1
+ // Run with: npm run test:serial
2
2
  //
3
3
  // HEADLESS RETARGET (foundation-spec §C.9 + §E). The flagship end-to-end
4
4
  // lifecycle scenario, driven entirely at the MODEL layer against FABRICATED
@@ -54,12 +54,12 @@
54
54
  import { test } from 'node:test';
55
55
  import assert from 'node:assert/strict';
56
56
  import { spawnSync } from 'node:child_process';
57
- import { createHeadlessHarness } from './helpers/harness.js';
58
- import { subscribe } from '../canvas/canvas.js';
59
- import { transition } from '../runtime/lifecycle.js';
60
- import { pushFinal } from '../feed/feed.js';
61
- import { evaluateStop, STALL_REPROMPT } from '../runtime/stop-guard.js';
62
- import { personaDrift, commitPersonaAck } from '../runtime/persona.js';
57
+ import { createHeadlessHarness } from '../helpers/harness.js';
58
+ import { subscribe } from '../../canvas/canvas.js';
59
+ import { transition } from '../../runtime/lifecycle.js';
60
+ import { pushFinal } from '../../feed/feed.js';
61
+ import { evaluateStop, STALL_REPROMPT } from '../../runtime/stop-guard.js';
62
+ import { personaDrift, commitPersonaAck } from '../../runtime/persona.js';
63
63
  // A pid reaped (dead) by the time spawnSync returns — a released broker's exited
64
64
  // process (the headless analog of a closed pane).
65
65
  function deadPid() {
@@ -1,4 +1,4 @@
1
- // Run with: node --import tsx/esm --test src/core/__tests__/host-teardown-process-group.test.ts
1
+ // Run with: npm run test:serial
2
2
  //
3
3
  // Regression cover for crouton-labs/crouter#98: a canceled/wedged child node
4
4
  // ORPHANS its subprocess tree (bash → test runner → spawned app) because
@@ -65,11 +65,11 @@ import { spawn } from 'node:child_process';
65
65
  import { mkdtempSync, readFileSync, rmSync } from 'node:fs';
66
66
  import { tmpdir } from 'node:os';
67
67
  import { join } from 'node:path';
68
- import { createHarness } from './helpers/harness.js';
69
- import { isPidAlive, capturePidIdentities, killProcessTreePids, captureTeardownSnapshot } from '../canvas/pid.js';
70
- import { recordPid } from '../canvas/canvas.js';
71
- import { openDb } from '../canvas/db.js';
72
- import { headlessBrokerHost } from '../runtime/host.js';
68
+ import { createHarness } from '../helpers/harness.js';
69
+ import { isPidAlive, capturePidIdentities, killProcessTreePids, captureTeardownSnapshot } from '../../canvas/pid.js';
70
+ import { recordPid } from '../../canvas/canvas.js';
71
+ import { openDb } from '../../canvas/db.js';
72
+ import { headlessBrokerHost } from '../../runtime/host.js';
73
73
  let h;
74
74
  let root;
75
75
  let scratch;
@@ -1,4 +1,4 @@
1
- // Run with: node --import tsx/esm --test src/core/__tests__/human-deliver-e2e.test.ts
1
+ // Run with: npm run test:serial
2
2
  //
3
3
  // Drive a terminal ticket through the public crtrd ticket route. Terminal
4
4
  // delivery is daemon-owned; no subprocess handler or delivery receipt exists.
@@ -7,17 +7,17 @@ import assert from 'node:assert/strict';
7
7
  import { mkdtempSync, existsSync, writeFileSync } from 'node:fs';
8
8
  import { tmpdir } from 'node:os';
9
9
  import { join } from 'node:path';
10
- import { ApiError, CrtrClient } from '../../api/index.js';
11
- import { createApiServer } from '../../daemon/api/server.js';
12
- import { apiSocketPath } from '../canvas/paths.js';
13
- import { validateDeck } from '../human/deck-schema.js';
14
- import { claimTicket, readTicketClaim } from '../human/claim.js';
15
- import { ticketDir } from '../human/root.js';
16
- import { submitDeck, submitReview } from '../human/tickets.js';
17
- import { spawnNode } from '../runtime/nodes.js';
18
- import { getNode, closeDb } from '../canvas/index.js';
19
- import { readInboxSince } from '../feed/inbox.js';
20
- import { resolveRef } from '../canvas/history.js';
10
+ import { ApiError, CrtrClient } from '../../../api/index.js';
11
+ import { createApiServer } from '../../../daemon/api/server.js';
12
+ import { apiSocketPath } from '../../canvas/paths.js';
13
+ import { validateDeck } from '../../human/deck-schema.js';
14
+ import { claimTicket, readTicketClaim } from '../../human/claim.js';
15
+ import { ticketDir } from '../../human/root.js';
16
+ import { submitDeck, submitReview } from '../../human/tickets.js';
17
+ import { spawnNode } from '../../runtime/nodes.js';
18
+ import { getNode, closeDb } from '../../canvas/index.js';
19
+ import { readInboxSince } from '../../feed/inbox.js';
20
+ import { resolveRef } from '../../canvas/history.js';
21
21
  let home;
22
22
  let priorHome;
23
23
  let server;
@@ -1,4 +1,4 @@
1
- // Run with: node --import tsx/esm --test src/core/__tests__/live-mutation.test.ts
1
+ // Run with: npm run test:serial
2
2
  //
3
3
  // HEADLESS RETARGET (foundation-spec §C.12 + §E). AXIS: LIVE MUTATION of the
4
4
  // 2×2 state vector (mode {base,orchestrator} × lifecycle {terminal,resident})
@@ -40,10 +40,10 @@
40
40
  // base→orchestrator after promote, then clears on commit').
41
41
  import { test } from 'node:test';
42
42
  import assert from 'node:assert/strict';
43
- import { createHeadlessHarness } from './helpers/harness.js';
44
- import { subscribe } from '../canvas/canvas.js';
45
- import { commitPersonaAck, personaDrift } from '../runtime/persona.js';
46
- import { evaluateStop } from '../runtime/stop-guard.js';
43
+ import { createHeadlessHarness } from '../helpers/harness.js';
44
+ import { subscribe } from '../../canvas/canvas.js';
45
+ import { commitPersonaAck, personaDrift } from '../../runtime/persona.js';
46
+ import { evaluateStop } from '../../runtime/stop-guard.js';
47
47
  /** Normalize the two persona axes off a NodeMeta for deepEqual. */
48
48
  function persona(m) {
49
49
  return { mode: m.mode, lifecycle: m.lifecycle };
@@ -1,4 +1,4 @@
1
- // Run with: node --import tsx/esm --test src/core/__tests__/refresh-stall-recycle.test.ts
1
+ // Run with: npm run test:serial
2
2
  //
3
3
  // BUG-REGRESSION (broker-universal-host cut, design §H refresh-authority; U7
4
4
  // report mq8gq8we-4cadd8e6; stuck-refresh, parent mq7s5o93). A `node yield` /
@@ -21,9 +21,10 @@
21
21
  import { test } from 'node:test';
22
22
  import assert from 'node:assert/strict';
23
23
  import { spawn } from 'node:child_process';
24
- import { createHeadlessHarness } from './helpers/harness.js';
25
- import { recordPid } from '../canvas/canvas.js';
26
- import { yieldStallVerdict, YIELD_STALL_GRACE_MS, isPidAlive } from '../../daemon/crtrd.js';
24
+ import { createHeadlessHarness } from '../helpers/harness.js';
25
+ import { recordPid } from '../../canvas/canvas.js';
26
+ import { isPidAlive } from '../../canvas/pid.js';
27
+ import { yieldStallVerdict, YIELD_STALL_GRACE_MS } from '../../../daemon/reconcilers/broker-supervision.js';
27
28
  // ---------------------------------------------------------------------------
28
29
  // D4a — the pure refresh-stall truth table.
29
30
  // ---------------------------------------------------------------------------
@@ -31,18 +32,8 @@ test('D4a yieldStallVerdict: kill ONLY a live, not-busy, refresh engine past the
31
32
  const G = YIELD_STALL_GRACE_MS;
32
33
  // The one 'kill' case: engine alive, intent=refresh, turn over (not busy), past grace.
33
34
  assert.equal(yieldStallVerdict(true, 'refresh', false, G), 'kill', 'alive+refresh+!busy+>=grace → kill');
34
- assert.equal(yieldStallVerdict(true, 'refresh', false, G + 60_000), 'kill', 'well past grace → kill');
35
- // Within the grace → pending (the healthy stophook window).
36
- assert.equal(yieldStallVerdict(true, 'refresh', false, null), 'pending', 'first observation → pending');
37
- assert.equal(yieldStallVerdict(true, 'refresh', false, G - 1), 'pending', 'within grace → pending');
38
35
  // A working engine is NEVER killed, even past the grace.
39
36
  assert.equal(yieldStallVerdict(true, 'refresh', true, G + 60_000), 'leave', 'busy (mid-turn) → leave');
40
- // Not a refresh → not our concern.
41
- assert.equal(yieldStallVerdict(true, 'idle-release', false, G + 60_000), 'leave', 'intent≠refresh → leave');
42
- assert.equal(yieldStallVerdict(true, null, false, G + 60_000), 'leave', 'no pending intent → leave');
43
- // A dead/unknown engine is the exit-policy job's concern, not this live-fleet check.
44
- assert.equal(yieldStallVerdict(false, 'refresh', false, G + 60_000), 'leave', 'dead engine → leave (exit policy owns it)');
45
- assert.equal(yieldStallVerdict(null, 'refresh', false, G + 60_000), 'leave', 'unknown pid → leave');
46
37
  });
47
38
  // ---------------------------------------------------------------------------
48
39
  // D4b — daemon integration: a stuck refresh on a LIVE engine is force-recycled.
@@ -1,4 +1,4 @@
1
- // Run with: node --import tsx/esm --test src/core/__tests__/revive.test.ts
1
+ // Run with: npm run test:serial
2
2
  //
3
3
  // HEADLESS RETARGET (foundation-spec §C.13 + §E). Covers the session-picker fix
4
4
  // (resume by ABSOLUTE session-file path, cwd-immune) and the double-revive guard
@@ -30,24 +30,21 @@ import { test, before, after, beforeEach } from 'node:test';
30
30
  import assert from 'node:assert/strict';
31
31
  import { mkdtempSync, rmSync, writeFileSync, mkdirSync } from 'node:fs';
32
32
  import { tmpdir } from 'node:os';
33
- import { join, dirname } from 'node:path';
34
- import { fileURLToPath } from 'node:url';
33
+ import { join } from 'node:path';
35
34
  import { spawn, spawnSync } from 'node:child_process';
36
- import { createNode, getNode, subscribe, updateNode } from '../canvas/canvas.js';
37
- import { armCron, hasPendingCancelOnWakeCron } from '../canvas/crons.js';
38
- import { readInboxSince } from '../feed/inbox.js';
39
- import { closeDb } from '../canvas/db.js';
40
- import { buildPiArgv, CANVAS_EXTENSIONS } from '../runtime/launch.js';
41
- import { CANVAS_CONTEXT_INTRO_PATH, CANVAS_INBOX_WATCHER_PATH, CANVAS_REVIEW_BOUNDARY_PATH, CANVAS_STOPHOOK_PATH, } from '../runtime/canvas-extensions.js';
42
- import { headlessBrokerHost } from '../runtime/host.js';
43
- import { resumeArgs, reviveNode } from '../runtime/revive.js';
44
- import { REVIVE_KICKOFF_SENTINEL, readGoal, writeGoal } from '../runtime/kickoff.js';
45
- import { seedRoadmap } from '../runtime/roadmap.js';
46
- import { InputError } from '../io.js';
47
- import { createHarness } from './helpers/harness.js';
48
- import { bindTestFleet } from './helpers/fleet.js';
49
- import { resetFleetForTests } from '../runtime/fleet.js';
50
- const EXTRA_EXTENSION_PATH = join(dirname(fileURLToPath(import.meta.url)), '..', 'fixtures', 'extra-extension.ts');
35
+ import { createNode, getNode, subscribe, updateNode } from '../../canvas/canvas.js';
36
+ import { armCron, hasPendingCancelOnWakeCron } from '../../canvas/crons.js';
37
+ import { readInboxSince } from '../../feed/inbox.js';
38
+ import { closeDb } from '../../canvas/db.js';
39
+ import { buildPiArgv } from '../../runtime/launch.js';
40
+ import { headlessBrokerHost } from '../../runtime/host.js';
41
+ import { resumeArgs, reviveNode } from '../../runtime/revive.js';
42
+ import { REVIVE_KICKOFF_SENTINEL, readGoal, writeGoal } from '../../runtime/kickoff.js';
43
+ import { seedRoadmap } from '../../runtime/roadmap.js';
44
+ import { InputError } from '../../io.js';
45
+ import { createHarness } from '../helpers/harness.js';
46
+ import { bindTestFleet } from '../helpers/fleet.js';
47
+ import { resetFleetForTests } from '../../runtime/fleet.js';
51
48
  let home;
52
49
  function node(id, over = {}) {
53
50
  return {
@@ -163,88 +160,6 @@ test('buildPiArgv passes no --session on a fresh (no-resume) launch', () => {
163
160
  assert.ok(!argv.includes('--session'), 'a fresh launch never resumes');
164
161
  assert.ok(argv.includes('go'), 'the kickoff prompt is the last positional');
165
162
  });
166
- test('buildPiArgv restores mandatory canvas extensions when persisted launch metadata is empty', () => {
167
- const m = node('n', {
168
- launch: {
169
- model: 'openai/sonnet',
170
- tools: [],
171
- extensions: [],
172
- systemPrompt: 'historical replay',
173
- env: {},
174
- },
175
- });
176
- const { argv } = buildPiArgv(m, { prompt: 'go' });
177
- const seen = new Map();
178
- const extensions = [];
179
- for (let i = 0; i < argv.length; i++) {
180
- if (argv[i] === '-e') {
181
- const next = argv[i + 1];
182
- if (typeof next === 'string') {
183
- seen.set(next, (seen.get(next) ?? 0) + 1);
184
- extensions.push(next);
185
- }
186
- }
187
- }
188
- const required = new Set(CANVAS_EXTENSIONS);
189
- const mandatory = [];
190
- for (const ext of CANVAS_EXTENSIONS) {
191
- mandatory.push(ext);
192
- assert.equal(seen.get(ext), 1, `mandatory extension present exactly once: ${ext}`);
193
- }
194
- assert.deepEqual(extensions.slice(0, required.size), mandatory, 'mandatory extensions are loaded first and once');
195
- assert.equal(extensions.indexOf(CANVAS_STOPHOOK_PATH), extensions.indexOf(CANVAS_REVIEW_BOUNDARY_PATH) + 1, 'review boundary runs immediately before the stophook commits a companion bind');
196
- assert.ok(extensions.indexOf(CANVAS_CONTEXT_INTRO_PATH) > extensions.indexOf(CANVAS_REVIEW_BOUNDARY_PATH), 'review boundary still precedes fork bearings');
197
- });
198
- test('buildPiArgv replaces the previous mandatory prefix with the current canvas hooks', () => {
199
- const historicalNames = [
200
- 'canvas-inbox-watcher', 'canvas-stophook', 'canvas-recap',
201
- 'canvas-goal-capture', 'canvas-passive-context', 'canvas-context-intro',
202
- 'canvas-doc-substrate', 'canvas-structured-output', 'canvas-bash-valve',
203
- ];
204
- const m = node('n', {
205
- launch: {
206
- model: 'openai/sonnet',
207
- tools: [],
208
- extensions: [
209
- ...historicalNames.map((name) => `/old-generation/pi-extensions/${name}.js`),
210
- EXTRA_EXTENSION_PATH,
211
- ],
212
- systemPrompt: 'historical extension order',
213
- env: {},
214
- },
215
- });
216
- const { argv } = buildPiArgv(m, { prompt: 'go' });
217
- const extensions = argv.flatMap((arg, index) => arg === '-e' && typeof argv[index + 1] === 'string' ? [argv[index + 1]] : []);
218
- assert.deepEqual(extensions, [...CANVAS_EXTENSIONS, EXTRA_EXTENSION_PATH]);
219
- assert.equal(extensions.some((path) => path.startsWith('/old-generation/')), false);
220
- });
221
- test('buildPiArgv preserves user extensions while deduplicating mandatory hooks', () => {
222
- const m = node('n', {
223
- launch: {
224
- model: 'openai/sonnet',
225
- tools: [],
226
- extensions: [EXTRA_EXTENSION_PATH, CANVAS_INBOX_WATCHER_PATH],
227
- systemPrompt: 'user extras replay',
228
- env: {},
229
- },
230
- });
231
- const { argv } = buildPiArgv(m, { prompt: 'go' });
232
- const extensions = [];
233
- for (let i = 0; i < argv.length; i++) {
234
- if (argv[i] === '-e') {
235
- const next = argv[i + 1];
236
- if (typeof next === 'string')
237
- extensions.push(next);
238
- }
239
- }
240
- const mandatoryCount = CANVAS_EXTENSIONS.length;
241
- assert.equal(extensions.slice(0, mandatoryCount).length, CANVAS_EXTENSIONS.length, 'mandatory extensions are still the boot prefix');
242
- for (let i = 0; i < CANVAS_EXTENSIONS.length; i++) {
243
- assert.equal(extensions[i], CANVAS_EXTENSIONS[i], `mandatory extension ${i} remains in order`);
244
- }
245
- assert.equal(extensions.includes(EXTRA_EXTENSION_PATH), true, 'custom extension preserved');
246
- assert.equal(extensions.filter((ext) => ext === CANVAS_INBOX_WATCHER_PATH).length, 1, 'mandatory inbox watcher is deduplicated against user list');
247
- });
248
163
  // ---------------------------------------------------------------------------
249
164
  // buildPiArgv — the resumed argv replays the persisted launch spec faithfully
250
165
  // (kind/mode/lifecycle come back as the node's *current* self).
@@ -3,19 +3,20 @@
3
3
  // only — no subscription wires back to the spawner.
4
4
  import { test, before, after, beforeEach } from 'node:test';
5
5
  import assert from 'node:assert/strict';
6
- import { mkdtempSync, rmSync, existsSync, readFileSync } from 'node:fs';
6
+ import { mkdtempSync, rmSync, existsSync } from 'node:fs';
7
7
  import { tmpdir } from 'node:os';
8
8
  import { join } from 'node:path';
9
9
  import { createServer } from 'node:net';
10
10
  import { spawn as spawnProcess } from 'node:child_process';
11
- import { createNode, getNode, getRow, subscribersOf } from '../canvas/canvas.js';
12
- import { closeDb } from '../canvas/db.js';
13
- import { nodeDir } from '../canvas/paths.js';
14
- import { spawnNode } from '../runtime/nodes.js';
15
- import { spawnChild, resolveSpawner } from '../runtime/spawn.js';
16
- import { headlessBrokerHost } from '../runtime/host.js';
17
- import { recordFault } from '../runtime/fault.js';
18
- import { ROOT_PROFILE_ID } from '../profiles/manifest.js';
11
+ import { createNode, getNode, getRow, subscribersOf } from '../../canvas/canvas.js';
12
+ import { closeDb } from '../../canvas/db.js';
13
+ import { nodeDir } from '../../canvas/paths.js';
14
+ import { spawnNode } from '../../runtime/nodes.js';
15
+ import { readGoal } from '../../runtime/kickoff.js';
16
+ import { spawnChild, resolveSpawner } from '../../runtime/spawn.js';
17
+ import { headlessBrokerHost } from '../../runtime/host.js';
18
+ import { recordFault } from '../../runtime/fault.js';
19
+ import { ROOT_PROFILE_ID } from '../../profiles/manifest.js';
19
20
  let home;
20
21
  function spawner(id) {
21
22
  return {
@@ -175,12 +176,28 @@ test('spawnChild: a root from a shell gets the stable root profile id', async ()
175
176
  rmSync(localCwd, { recursive: true, force: true });
176
177
  }
177
178
  });
178
- test('startup markers name their actual boundaries', () => {
179
- const cli = readFileSync(new URL('../runtime/broker-cli.ts', import.meta.url), 'utf8');
180
- const broker = readFileSync(new URL('../runtime/broker.ts', import.meta.url), 'utf8');
181
- assert.ok(cli.indexOf('const startupAt = process.hrtime.bigint()') < cli.indexOf("await import('./broker.js')"), 'CLI origin is captured before broker-module import');
182
- assert.match(broker, /emitStartupMilestone\('broker\.startup\.agent_start'/, 'agent start is named honestly');
183
- assert.doesNotMatch(broker, /provider_request_start/, 'the trace does not overclaim provider request timing');
179
+ test('a no-kickoff root persists no goal and still comes up active', async () => {
180
+ // The `node new --root --no-kickoff` path: an empty prompt reaches
181
+ // buildPiArgv as `undefined`-equivalent, so the broker comes up idle and
182
+ // goal-less, ready for a real first prompt.
183
+ const originalLaunch = headlessBrokerHost.launch;
184
+ const localCwd = mkdtempSync(join(tmpdir(), 'crtr-no-kickoff-cwd-'));
185
+ let broker;
186
+ try {
187
+ headlessBrokerHost.launch = (nodeId, _inv, _opts) => {
188
+ broker = createServer();
189
+ broker.listen(join(nodeDir(nodeId), 'view.sock'));
190
+ return { pid: process.pid, exited: new Promise(() => { }) };
191
+ };
192
+ const result = await spawnChild({ kind: 'general', cwd: localCwd, root: true, readiness: 'await', prompt: '' });
193
+ assert.equal(readGoal(result.node.node_id), null, 'no goal file was written for an empty (no-kickoff) prompt');
194
+ assert.equal(getNode(result.node.node_id)?.status, 'active', 'the node still comes up active, ready for a real first prompt');
195
+ }
196
+ finally {
197
+ headlessBrokerHost.launch = originalLaunch;
198
+ await new Promise((resolve) => broker?.close(() => resolve()) ?? resolve());
199
+ rmSync(localCwd, { recursive: true, force: true });
200
+ }
184
201
  });
185
202
  test('root readiness is explicit: direct creation awaits its listener; deferred births launch immediately', async () => {
186
203
  const originalLaunch = headlessBrokerHost.launch;