@north-light/crouter 0.3.173 → 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} +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/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,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;