@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
@@ -0,0 +1,143 @@
1
+ import { getNode, getRow, subscribersOf, } from '../../core/canvas/index.js';
2
+ import { fullName } from '../../core/canvas/labels.js';
3
+ import { isSafeNodeId } from '../../core/canvas/paths.js';
4
+ import { emitEvent } from '../../core/events/emit.js';
5
+ import { operationIdContext } from '../../core/events/operation-id.js';
6
+ import { appendControllerDeathNotice, readCursor, readInboxSince, } from '../../core/feed/inbox.js';
7
+ import { fanDoctrineWake } from '../../core/runtime/close.js';
8
+ import { transition } from '../../core/runtime/lifecycle.js';
9
+ import { reviveNode } from '../../core/runtime/revive.js';
10
+ // Idle-release/inbox retry cap (2026-07-10 diagnosis, round 2): the SAME
11
+ // livelock shape as the stranded-relaunch case, but on the separate pass that
12
+ // resumes a dormant idle-released node when its inbox gains an unseen entry.
13
+ // The counter is keyed on inbox-cursor progress, not row-state residency or pid
14
+ // liveness: a transiently-live broker does not prove that delivery completed.
15
+ const IDLE_RELEASE_RELAUNCH_MAX_ATTEMPTS = 6;
16
+ const IDLE_RELEASE_RELAUNCH_MAX_BACKOFF_MS = 10 * 60_000;
17
+ const IDLE_RELEASE_RELAUNCH_BASE_MS = 20_000;
18
+ export class ControllerDeathReconciler {
19
+ run(_now, ctx) {
20
+ // Settle every wait whose controller has ended, independent of the waiter's
21
+ // current status. Active and focused terminal nodes own a live inbox
22
+ // watcher; idle-released nodes are revived by the following reconciler.
23
+ for (const row of ctx.rows) {
24
+ const current = getRow(row.node_id);
25
+ const controllerId = current?.waiting_for;
26
+ if (controllerId === null || controllerId === undefined)
27
+ continue;
28
+ // Read-gate before the write boundary: only a dead controller warrants a
29
+ // notice. appendControllerDeathNotice re-checks liveness inside its
30
+ // transaction, so this gate cannot misfire.
31
+ const controller = getRow(controllerId);
32
+ if (controller !== null && (controller.status === 'active' || controller.status === 'idle'))
33
+ continue;
34
+ operationIdContext.fresh(() => {
35
+ appendControllerDeathNotice(row.node_id, controllerId);
36
+ });
37
+ }
38
+ }
39
+ }
40
+ export class DormantInboxReconciler {
41
+ relaunchState = new Map();
42
+ run(now, ctx) {
43
+ // Re-read each row because live supervision may have mutated it earlier in
44
+ // this tick. A fleet entry is the live engine; no pid probe participates.
45
+ for (const row of ctx.rows) {
46
+ const id = row.node_id;
47
+ let current;
48
+ try {
49
+ current = getRow(id);
50
+ if (current === null) {
51
+ this.relaunchState.delete(id);
52
+ continue;
53
+ }
54
+ // Do not clear state on status flaps or transient liveness. Only cursor
55
+ // progress, no wake-worthy work, row deletion, or exhaustion ends the
56
+ // stuck-delivery episode.
57
+ if (current.status !== 'idle' || current.intent !== 'idle-release')
58
+ continue;
59
+ if (ctx.fleet.has(id))
60
+ continue;
61
+ }
62
+ catch (err) {
63
+ operationIdContext.fresh(() => {
64
+ emitEvent({
65
+ level: 'error',
66
+ event: 'inbox.poll.failed',
67
+ ...(isSafeNodeId(id) ? { node_id: id } : { fields: { affected_node_id: id } }),
68
+ error: err,
69
+ });
70
+ });
71
+ continue;
72
+ }
73
+ operationIdContext.fresh(() => {
74
+ try {
75
+ const cursorNow = readCursor(id);
76
+ const entries = readInboxSince(id, cursorNow);
77
+ // Deferred entries ride the next natural cycle. A deferred-only unseen
78
+ // set neither revives the node nor starts a stuck-relaunch episode.
79
+ if (!entries.some((entry) => entry.tier !== 'deferred')) {
80
+ this.relaunchState.delete(id);
81
+ return;
82
+ }
83
+ const prior = this.relaunchState.get(id);
84
+ const cursorChanged = prior === undefined || prior.cursor !== cursorNow;
85
+ const attempts = cursorChanged ? 0 : prior.attempts;
86
+ if (attempts >= IDLE_RELEASE_RELAUNCH_MAX_ATTEMPTS) {
87
+ this.relaunchState.delete(id);
88
+ const meta = getNode(id);
89
+ emitEvent({
90
+ level: 'warn',
91
+ event: 'broker.idle_release.exhausted',
92
+ ...(isSafeNodeId(id) ? { node_id: id } : {}),
93
+ fields: {
94
+ ...(isSafeNodeId(id) ? {} : { affected_node_id: id }),
95
+ attempts,
96
+ max_attempts: IDLE_RELEASE_RELAUNCH_MAX_ATTEMPTS,
97
+ },
98
+ });
99
+ transition(id, 'crash');
100
+ if (meta !== null) {
101
+ try {
102
+ fanDoctrineWake(id, subscribersOf(id), `Child crashed — ${fullName(meta)} (${id}) failed to relaunch after ${attempts} attempts while trying to ` +
103
+ `deliver a pending inbox message (no delivery progress across any attempt), and is now dead. It stays ` +
104
+ `dead until you revive it — \`crtr node lifecycle revive ${id}\`.`, { reason: 'child-crashed', child: id });
105
+ }
106
+ catch {
107
+ /* best-effort, mirrors the other doctrine fan-outs */
108
+ }
109
+ }
110
+ return;
111
+ }
112
+ const lastAttempt = cursorChanged ? undefined : prior?.lastAttempt;
113
+ const backoff = Math.min(IDLE_RELEASE_RELAUNCH_BASE_MS * 2 ** attempts, IDLE_RELEASE_RELAUNCH_MAX_BACKOFF_MS);
114
+ if (lastAttempt !== undefined && now - lastAttempt < backoff)
115
+ return;
116
+ if (!ctx.hasBrokerCapacity())
117
+ return;
118
+ this.relaunchState.set(id, { cursor: cursorNow, attempts: attempts + 1, lastAttempt: now });
119
+ emitEvent({
120
+ level: 'info',
121
+ event: 'broker.revive.idle_release',
122
+ ...(isSafeNodeId(id) ? { node_id: id } : {}),
123
+ attempt: attempts + 1,
124
+ fields: {
125
+ ...(isSafeNodeId(id) ? {} : { affected_node_id: id }),
126
+ attempts: attempts + 1,
127
+ max_attempts: IDLE_RELEASE_RELAUNCH_MAX_ATTEMPTS,
128
+ },
129
+ });
130
+ reviveNode(id, { resume: true });
131
+ }
132
+ catch (err) {
133
+ emitEvent({
134
+ level: 'error',
135
+ event: 'inbox.poll.failed',
136
+ ...(isSafeNodeId(id) ? { node_id: id } : { fields: { affected_node_id: id } }),
137
+ error: err,
138
+ });
139
+ }
140
+ });
141
+ }
142
+ }
143
+ }
@@ -0,0 +1,22 @@
1
+ export declare const DEAD_REAP_GRACE_MS: number;
2
+ /** Recurring storage cleanup. The in-memory throttle clocks intentionally reset
3
+ * on daemon boot, so the first tick runs both full sweeps. */
4
+ export declare class StorageMaintenanceReconciler {
5
+ private lastPruneAt;
6
+ private lastSpareSweepAt;
7
+ run(now: number): void;
8
+ /** Milliseconds since meta/telemetry was last written. Inbox activity is
9
+ * deliberately excluded: children can keep writing a dead manager's inbox. */
10
+ private msSinceDiskActivity;
11
+ /** Reap only the physical placement residue of long-dead nodes. The durable
12
+ * row, graph, and on-disk state remain available for a later manual revive. */
13
+ private reapDeadResidue;
14
+ /** Delete focus rows whose recorded tmux pane no longer exists. A failed tmux
15
+ * probe is "can't tell" and never authorizes deleting every viewport. */
16
+ private gcStaleFocuses;
17
+ /** Count-based full-canvas prune, throttled to once per hour. Live rows are
18
+ * never deleted by pruneToLimit, so the true floor can exceed AUTO_PRUNE_MAX. */
19
+ private autoPrune;
20
+ /** Collect dead or expired hidden warm-pool spares. */
21
+ private gcWarmPool;
22
+ }
@@ -0,0 +1,213 @@
1
+ import { statSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { closeFocusRow, listFocuses, listNodes, pruneToLimit, } from '../../core/canvas/index.js';
4
+ import { isSafeNodeId, jobDir, nodeDir } from '../../core/canvas/paths.js';
5
+ import { emitEvent } from '../../core/events/emit.js';
6
+ import { operationIdContext } from '../../core/events/operation-id.js';
7
+ import { listLivePanes, tearDownNode } from '../../core/runtime/placement.js';
8
+ import { reapStaleSpares } from '../../core/runtime/warm-pool.js';
9
+ // How long a dead node's on-disk record must be quiet before its leftover
10
+ // placement is reaped. A fresh crash keeps its pane for inspection.
11
+ export const DEAD_REAP_GRACE_MS = 10 * 60_000;
12
+ const AUTO_PRUNE_MAX = 2000;
13
+ const PRUNE_INTERVAL_MS = 60 * 60 * 1000;
14
+ const SPARE_SWEEP_INTERVAL_MS = 60 * 1000;
15
+ /** Recurring storage cleanup. The in-memory throttle clocks intentionally reset
16
+ * on daemon boot, so the first tick runs both full sweeps. */
17
+ export class StorageMaintenanceReconciler {
18
+ lastPruneAt = Number.NEGATIVE_INFINITY;
19
+ lastSpareSweepAt = Number.NEGATIVE_INFINITY;
20
+ run(now) {
21
+ // Placement reap MUST precede focus GC, so GC catches a focus row the reap
22
+ // strands. Both run after dormant-inbox reconciliation, so a same-tick
23
+ // revive has already had the chance to re-anchor its focus.
24
+ this.reapDeadResidue(now);
25
+ this.gcStaleFocuses();
26
+ this.autoPrune(now);
27
+ this.gcWarmPool(now);
28
+ }
29
+ /** Milliseconds since meta/telemetry was last written. Inbox activity is
30
+ * deliberately excluded: children can keep writing a dead manager's inbox. */
31
+ msSinceDiskActivity(nodeId, now) {
32
+ let latest = 0;
33
+ for (const path of [join(nodeDir(nodeId), 'meta.json'), join(jobDir(nodeId), 'telemetry.json')]) {
34
+ try {
35
+ const mtime = statSync(path).mtimeMs;
36
+ if (mtime > latest)
37
+ latest = mtime;
38
+ }
39
+ catch {
40
+ /* absent — contributes nothing */
41
+ }
42
+ }
43
+ return latest === 0 ? Number.POSITIVE_INFINITY : now - latest;
44
+ }
45
+ /** Reap only the physical placement residue of long-dead nodes. The durable
46
+ * row, graph, and on-disk state remain available for a later manual revive. */
47
+ reapDeadResidue(now) {
48
+ let rows;
49
+ try {
50
+ rows = listNodes({ status: ['dead'] });
51
+ }
52
+ catch (err) {
53
+ operationIdContext.fresh(() => {
54
+ emitEvent({ level: 'error', event: 'residue.reap_scan.failed', error: err });
55
+ });
56
+ return;
57
+ }
58
+ for (const row of rows) {
59
+ if (row.pane == null && row.window == null && row.tmux_session == null)
60
+ continue;
61
+ try {
62
+ if (this.msSinceDiskActivity(row.node_id, now) < DEAD_REAP_GRACE_MS)
63
+ continue;
64
+ }
65
+ catch (err) {
66
+ operationIdContext.fresh(() => {
67
+ emitEvent({
68
+ level: 'error',
69
+ event: 'residue.reap.failed',
70
+ ...(isSafeNodeId(row.node_id) ? { node_id: row.node_id } : {}),
71
+ error: err,
72
+ fields: {
73
+ ...(isSafeNodeId(row.node_id) ? {} : { affected_node_id: row.node_id }),
74
+ pane: row.pane,
75
+ window: row.window,
76
+ tmux_session: row.tmux_session,
77
+ },
78
+ });
79
+ });
80
+ continue;
81
+ }
82
+ operationIdContext.fresh(() => {
83
+ try {
84
+ emitEvent({
85
+ level: 'info',
86
+ event: 'residue.reaped',
87
+ ...(isSafeNodeId(row.node_id) ? { node_id: row.node_id } : {}),
88
+ fields: {
89
+ ...(isSafeNodeId(row.node_id) ? {} : { affected_node_id: row.node_id }),
90
+ pane: row.pane,
91
+ window: row.window,
92
+ tmux_session: row.tmux_session,
93
+ },
94
+ });
95
+ tearDownNode(row.node_id);
96
+ }
97
+ catch (err) {
98
+ emitEvent({
99
+ level: 'error',
100
+ event: 'residue.reap.failed',
101
+ ...(isSafeNodeId(row.node_id) ? { node_id: row.node_id } : {}),
102
+ error: err,
103
+ fields: {
104
+ ...(isSafeNodeId(row.node_id) ? {} : { affected_node_id: row.node_id }),
105
+ pane: row.pane,
106
+ window: row.window,
107
+ tmux_session: row.tmux_session,
108
+ },
109
+ });
110
+ }
111
+ });
112
+ }
113
+ }
114
+ /** Delete focus rows whose recorded tmux pane no longer exists. A failed tmux
115
+ * probe is "can't tell" and never authorizes deleting every viewport. */
116
+ gcStaleFocuses() {
117
+ let rows;
118
+ try {
119
+ rows = listFocuses();
120
+ }
121
+ catch (err) {
122
+ operationIdContext.fresh(() => {
123
+ emitEvent({ level: 'error', event: 'focus.gc.failed', error: err });
124
+ });
125
+ return;
126
+ }
127
+ if (rows.length === 0)
128
+ return;
129
+ let live;
130
+ try {
131
+ live = listLivePanes();
132
+ }
133
+ catch (err) {
134
+ operationIdContext.fresh(() => {
135
+ emitEvent({ level: 'error', event: 'focus.gc.failed', error: err });
136
+ });
137
+ return;
138
+ }
139
+ if (live === null)
140
+ return;
141
+ for (const focus of rows) {
142
+ if (focus.pane === null || live.has(focus.pane))
143
+ continue;
144
+ const removed = operationIdContext.fresh(() => {
145
+ try {
146
+ emitEvent({
147
+ level: 'info',
148
+ event: 'focus.gc.removed',
149
+ ...(isSafeNodeId(focus.node_id) ? { node_id: focus.node_id } : {}),
150
+ fields: {
151
+ focus_id: focus.focus_id,
152
+ focus_node_id: focus.node_id,
153
+ pane: focus.pane,
154
+ },
155
+ });
156
+ closeFocusRow(focus.focus_id);
157
+ return true;
158
+ }
159
+ catch (err) {
160
+ emitEvent({ level: 'error', event: 'focus.gc.failed', error: err });
161
+ return false;
162
+ }
163
+ });
164
+ if (!removed)
165
+ return;
166
+ }
167
+ }
168
+ /** Count-based full-canvas prune, throttled to once per hour. Live rows are
169
+ * never deleted by pruneToLimit, so the true floor can exceed AUTO_PRUNE_MAX. */
170
+ autoPrune(now) {
171
+ if (now - this.lastPruneAt < PRUNE_INTERVAL_MS)
172
+ return;
173
+ this.lastPruneAt = now;
174
+ operationIdContext.fresh(() => {
175
+ try {
176
+ const before = listNodes().length;
177
+ const { pruned } = pruneToLimit({ maxNodes: AUTO_PRUNE_MAX });
178
+ if (pruned.length > 0) {
179
+ emitEvent({
180
+ level: 'info',
181
+ event: 'canvas.auto_prune.completed',
182
+ outcome: 'succeeded',
183
+ fields: {
184
+ before_count: before,
185
+ kept_count: before - pruned.length,
186
+ pruned_count: pruned.length,
187
+ },
188
+ });
189
+ }
190
+ }
191
+ catch (err) {
192
+ emitEvent({ level: 'error', event: 'canvas.auto_prune.failed', error: err });
193
+ }
194
+ });
195
+ }
196
+ /** Collect dead or expired hidden warm-pool spares. */
197
+ gcWarmPool(now) {
198
+ if (now - this.lastSpareSweepAt < SPARE_SWEEP_INTERVAL_MS)
199
+ return;
200
+ this.lastSpareSweepAt = now;
201
+ operationIdContext.fresh(() => {
202
+ const reaped = reapStaleSpares();
203
+ if (reaped.length > 0) {
204
+ emitEvent({
205
+ level: 'info',
206
+ event: 'warm_pool.spares_reaped',
207
+ outcome: 'succeeded',
208
+ fields: { reaped_count: reaped.length },
209
+ });
210
+ }
211
+ });
212
+ }
213
+ }
@@ -204,8 +204,6 @@ export async function submitReviewApproval(reviewId) {
204
204
  return terminalConflict(review, 'submit');
205
205
  if (review.state === 'approved')
206
206
  return { outcome: 'already_settled', review, result: approvedResult(review) };
207
- if (review.state !== 'open')
208
- throw new ReviewOperationError('review_not_open', 'review is not open', { review_id: reviewId, state: review.state });
209
207
  const snapshot = snapshotCommentsLocked(db, reviewId);
210
208
  const at = now();
211
209
  const result = buildReviewResult(review, snapshot, source.sha256, at);
@@ -240,9 +238,8 @@ export async function cancelReview(reviewId, args) {
240
238
  const review = requireVisibleReview(reviewId);
241
239
  if (review.state === 'approved')
242
240
  return terminalConflict(review, 'cancel');
243
- if (review.state !== 'canceled') {
244
- throw new ReviewOperationError('review_not_open', 'review is not open', { review_id: reviewId, state: review.state });
245
- }
241
+ if (review.state !== 'canceled')
242
+ throw new Error(`review ${reviewId} did not reach its canceled state`);
246
243
  if (winningWrite)
247
244
  signalReviewActivity();
248
245
  const finished = await serializedFinish(reviewId, () => finishCanceled(review, winningWrite, args));
@@ -1,18 +1,30 @@
1
1
  // Run with: node --import tsx/esm --test src/pi-extensions/__tests__/canvas-context-intro.test.ts
2
2
  //
3
- // A fresh branch receives the full context baseline. A forked crouter branch
4
- // receives a compact node-scoped update after its inherited baseline. Resumes
5
- // remain idempotent through the exact node-id stamp.
6
- import { test, before, after, beforeEach } from 'node:test';
3
+ // A forked crouter branch receives a compact node-scoped update after its
4
+ // inherited baseline, and a resume re-injects nothing — idempotency keyed on
5
+ // the exact node-id stamp, independent of the bearings text.
6
+ import { test, before, after, beforeEach, afterEach } from 'node:test';
7
7
  import assert from 'node:assert/strict';
8
- import { mkdtempSync, rmSync } from 'node:fs';
8
+ import { existsSync, mkdtempSync, mkdirSync, rmSync } from 'node:fs';
9
9
  import { tmpdir } from 'node:os';
10
10
  import { join } from 'node:path';
11
- import { buildContextIntro, buildForkContextIntro, registerCanvasContextIntro, CONTEXT_INTRO_CUSTOM_TYPE, } from '../canvas-context-intro.js';
11
+ import { registerCanvasContextIntro, CONTEXT_INTRO_CUSTOM_TYPE, } from '../canvas-context-intro.js';
12
+ import { buildContextBearings as buildContextIntro } from '../../core/runtime/bearings.js';
12
13
  import { createNode } from '../../core/canvas/canvas.js';
14
+ import { apiSocketPath } from '../../core/canvas/paths.js';
15
+ import { createApiServer } from '../../daemon/api/server.js';
13
16
  import { closeDb } from '../../core/canvas/db.js';
14
17
  let home;
15
18
  let origNode;
19
+ let server;
20
+ async function waitForSocket(path) {
21
+ for (let i = 0; i < 200; i++) {
22
+ if (existsSync(path))
23
+ return;
24
+ await new Promise((resolve) => setTimeout(resolve, 10));
25
+ }
26
+ throw new Error(`api socket never bound at ${path}`);
27
+ }
16
28
  function node(id, over = {}) {
17
29
  return {
18
30
  node_id: id,
@@ -45,21 +57,27 @@ function makeFakePi() {
45
57
  registerMessageRenderer() {
46
58
  /* display-only; irrelevant here */
47
59
  },
48
- fireSessionStart(entries) {
49
- handler?.(undefined, { sessionManager: { getEntries: () => entries } });
60
+ async fireSessionStart(entries) {
61
+ await handler?.(undefined, { sessionManager: { getEntries: () => entries } });
50
62
  },
51
63
  };
52
64
  }
53
65
  before(() => {
54
66
  origNode = process.env['CRTR_NODE_ID'];
55
67
  });
56
- beforeEach(() => {
68
+ beforeEach(async () => {
57
69
  closeDb();
58
70
  if (home)
59
71
  rmSync(home, { recursive: true, force: true });
60
72
  home = mkdtempSync(join(tmpdir(), 'crtr-context-intro-'));
61
73
  process.env['CRTR_HOME'] = home;
62
74
  delete process.env['CRTR_NODE_ID'];
75
+ mkdirSync(home, { recursive: true });
76
+ server = createApiServer();
77
+ await waitForSocket(apiSocketPath());
78
+ });
79
+ afterEach(async () => {
80
+ await server.close();
63
81
  });
64
82
  after(() => {
65
83
  closeDb();
@@ -71,44 +89,7 @@ after(() => {
71
89
  else
72
90
  process.env['CRTR_NODE_ID'] = origNode;
73
91
  });
74
- test('full boot intro leads with the node\'s own identity', () => {
75
- createNode(node('alpha', { name: 'fix-auth', kind: 'developer' }));
76
- const intro = buildContextIntro('alpha');
77
- assert.match(intro, /<crtr-bearings>/, 'opens with the bearings section');
78
- assert.match(intro, /You are node alpha/, 'names the node by its own id');
79
- assert.match(intro, /kind developer/, 'states the node kind');
80
- assert.doesNotMatch(intro, /FORK of/, 'a fresh node carries no fork framing');
81
- // Identity leads the bearings block.
82
- assert.match(intro, /<crtr-bearings>\nYou are node alpha/, 'identity leads the bearings block');
83
- assert.ok(intro.indexOf('<crtr-bearings>') < intro.indexOf('<project_context>'), 'bearings precede project context');
84
- });
85
- test('fork bearings contain only the new node-scoped facts', () => {
86
- createNode(node('src7', { name: 'looking-pi-crouter', description: 'monitor-telemetry' }));
87
- createNode(node('fork9', { fork_from: 'src7', lifecycle: 'resident' }));
88
- const intro = buildForkContextIntro('fork9');
89
- assert.match(intro, /You are node fork9/, 'the fork receives its own id');
90
- assert.match(intro, /new FORK of src7/, 'the fork names its source');
91
- assert.match(intro, /not src7/, 'the fork does not adopt the source identity');
92
- assert.match(intro, /looking-pi-crouter/, 'the source label identifies the copied history');
93
- assert.match(intro, /Lifecycle: resident/, 'the fork receives its current lifecycle');
94
- assert.match(intro, /independent root/, 'the fork receives its current graph role');
95
- assert.ok(intro.includes(join(home, 'nodes', 'fork9', 'context')), 'the fork receives its own context path');
96
- assert.match(intro, /first real user message/, 'the fork waits for its new mandate');
97
- assert.doesNotMatch(intro, /<memory kind="knowledge">/, 'the inherited knowledge catalog is not repeated');
98
- assert.doesNotMatch(intro, /<auto-loaded-context>/, 'inherited workspace docs are not repeated');
99
- assert.doesNotMatch(intro, /<project_context>/, 'the inherited project snapshot is not repeated');
100
- createNode(node('plain2'));
101
- const plain = buildContextIntro('plain2');
102
- assert.match(plain, /You are node plain2/);
103
- assert.ok(!/FORK of/.test(plain), 'a fresh node carries no fork callout');
104
- // A path-valued provenance remains an opaque label.
105
- const pathSource = '/Users/silasrhyneer/.crouter/canvas/human-work/queue/20260717T000000-abc.json';
106
- createNode(node('fork10', { fork_from: pathSource }));
107
- const pathIntro = buildForkContextIntro('fork10');
108
- assert.match(pathIntro, /You are node fork10/);
109
- assert.match(pathIntro, new RegExp(`new FORK of ${pathSource.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}`), 'a path-valued source is named without a node lookup');
110
- });
111
- test('session_start appends compact fork bearings after an inherited source baseline', () => {
92
+ test('session_start appends compact fork bearings after an inherited source baseline', async () => {
112
93
  createNode(node('srcA'));
113
94
  createNode(node('forkB', { fork_from: 'srcA' }));
114
95
  // A fork boots with the SOURCE's whole conversation copied in — including the
@@ -117,7 +98,7 @@ test('session_start appends compact fork bearings after an inherited source base
117
98
  process.env['CRTR_NODE_ID'] = 'forkB';
118
99
  const pi = makeFakePi();
119
100
  registerCanvasContextIntro(pi);
120
- pi.fireSessionStart([inheritedSourceBlock]);
101
+ await pi.fireSessionStart([inheritedSourceBlock]);
121
102
  // The inherited baseline belongs to srcA, so forkB receives its own compact update.
122
103
  assert.equal(pi.sent.length, 1, 'fork injects its OWN bearings over the inherited source block');
123
104
  assert.equal(pi.sent[0].customType, CONTEXT_INTRO_CUSTOM_TYPE);
@@ -130,10 +111,10 @@ test('session_start appends compact fork bearings after an inherited source base
130
111
  process.env['CRTR_NODE_ID'] = 'externalF';
131
112
  const externalPi = makeFakePi();
132
113
  registerCanvasContextIntro(externalPi);
133
- externalPi.fireSessionStart([]);
114
+ await externalPi.fireSessionStart([]);
134
115
  assert.match(externalPi.sent[0].content, /<project_context>/, 'an external-session fork receives the full baseline');
135
116
  });
136
- test('resume idempotency uses the exact details stamp independent of block text', () => {
117
+ test('resume idempotency uses the exact details stamp independent of block text', async () => {
137
118
  createNode(node('stampD'));
138
119
  // The exact node-id stamp is authoritative even when prose carries no id.
139
120
  const stampedNoIdInText = {
@@ -145,16 +126,16 @@ test('resume idempotency uses the exact details stamp independent of block text'
145
126
  process.env['CRTR_NODE_ID'] = 'stampD';
146
127
  const pi = makeFakePi();
147
128
  registerCanvasContextIntro(pi);
148
- pi.fireSessionStart([stampedNoIdInText]);
129
+ await pi.fireSessionStart([stampedNoIdInText]);
149
130
  assert.equal(pi.sent.length, 0, 'exact details-stamp match skips re-injection even when the text omits the id');
150
131
  });
151
- test('session_start stays idempotent on a genuine resume', () => {
132
+ test('session_start stays idempotent on a genuine resume', async () => {
152
133
  createNode(node('resumeC'));
153
134
  // A resume restores this node's already-stamped bearings.
154
135
  const ownBlock = introEntry(buildContextIntro('resumeC'));
155
136
  process.env['CRTR_NODE_ID'] = 'resumeC';
156
137
  const pi = makeFakePi();
157
138
  registerCanvasContextIntro(pi);
158
- pi.fireSessionStart([ownBlock]);
139
+ await pi.fireSessionStart([ownBlock]);
159
140
  assert.equal(pi.sent.length, 0, 'our own bearings already present → no duplicate injection');
160
141
  });