@north-light/crouter 0.3.172 → 0.3.174

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (673) hide show
  1. package/bin/runtime-selector.mjs +8 -1
  2. package/dist/api/__tests__/{client.test.js → serial/client.test.js} +2 -135
  3. package/dist/api/client.d.ts +12 -21
  4. package/dist/api/client.js +22 -31
  5. package/dist/api/dto/broker-ops.d.ts +158 -0
  6. package/dist/api/dto/broker-ops.js +6 -0
  7. package/dist/api/dto/crons.d.ts +6 -0
  8. package/dist/api/dto/human.d.ts +7 -1
  9. package/dist/api/dto/inbox.d.ts +1 -71
  10. package/dist/api/dto/inbox.js +1 -9
  11. package/dist/api/dto/nodes.d.ts +6 -7
  12. package/dist/api/dto/reviews.d.ts +1 -11
  13. package/dist/api/routes.d.ts +7 -4
  14. package/dist/api/routes.js +8 -5
  15. package/dist/build-root.js +3 -3
  16. package/dist/builtin-memory/04-base-worker.md +1 -4
  17. package/dist/builtin-memory/05-kinds/advisor/00-base.md +1 -5
  18. package/dist/builtin-memory/05-kinds/advisor/01-orchestrator.md +2 -7
  19. package/dist/builtin-memory/05-kinds/design/00-base.md +1 -6
  20. package/dist/builtin-memory/05-kinds/developer/00-base.md +1 -6
  21. package/dist/builtin-memory/05-kinds/explore/00-base.md +1 -4
  22. package/dist/builtin-memory/05-kinds/explore/01-orchestrator.md +1 -2
  23. package/dist/builtin-memory/05-kinds/general/00-base.md +1 -3
  24. package/dist/builtin-memory/05-kinds/plan/00-base.md +1 -6
  25. package/dist/builtin-memory/05-kinds/plan/reviewers/00-base.md +1 -2
  26. package/dist/builtin-memory/05-kinds/plan/reviewers/architecture-fit.md +1 -3
  27. package/dist/builtin-memory/05-kinds/plan/reviewers/code-smells.md +1 -3
  28. package/dist/builtin-memory/05-kinds/plan/reviewers/pattern-consistency.md +1 -3
  29. package/dist/builtin-memory/05-kinds/plan/reviewers/requirements-coverage.md +1 -3
  30. package/dist/builtin-memory/05-kinds/plan/reviewers/security.md +1 -4
  31. package/dist/builtin-memory/05-kinds/review/companion/00-base.md +2 -3
  32. package/dist/builtin-memory/05-kinds/spec/00-base.md +1 -2
  33. package/dist/builtin-memory/advisor/council.md +1 -6
  34. package/dist/builtin-memory/design.md +2 -7
  35. package/dist/builtin-memory/development.md +9 -14
  36. package/dist/builtin-memory/internal/marketplaces.md +2 -6
  37. package/dist/builtin-memory/internal/nodes-and-canvas.md +1 -1
  38. package/dist/builtin-memory/internal/plugins.md +2 -8
  39. package/dist/builtin-memory/internal/storage-tiers.md +1 -2
  40. package/dist/builtin-memory/testing.md +41 -0
  41. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/{provider-rotation.test.ts → serial/provider-rotation.test.ts} +106 -177
  42. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/claude-plugin-commands.ts +5 -15
  43. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/index.ts +1 -28
  44. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/memory-slash-commands.ts +43 -88
  45. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.js +55 -0
  46. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +60 -0
  47. package/dist/cli.js +2 -2
  48. package/dist/clients/attach/__tests__/attach-remote-readonly.test.js +37 -131
  49. package/dist/clients/attach/__tests__/chat-view-snapshot-ordering.test.js +71 -152
  50. package/dist/clients/attach/__tests__/context-message.test.js +16 -174
  51. package/dist/clients/attach/__tests__/crtr-output.test.js +36 -2069
  52. package/dist/clients/attach/__tests__/diagram.test.js +2 -2
  53. package/dist/clients/attach/__tests__/edit-diff.test.js +0 -4
  54. package/dist/clients/attach/__tests__/file-review-focus.test.js +2 -1
  55. package/dist/clients/attach/__tests__/group-activity.test.js +40 -229
  56. package/dist/clients/attach/__tests__/oauth-dialog-lifecycle.test.js +26 -76
  57. package/dist/clients/attach/__tests__/prompt-preview.test.js +4 -70
  58. package/dist/clients/attach/__tests__/ref-autocomplete.test.js +11 -125
  59. package/dist/clients/attach/__tests__/titled-editor-preview.test.js +14 -205
  60. package/dist/clients/attach/command.d.ts +2 -1
  61. package/dist/clients/attach/command.js +81 -76
  62. package/dist/clients/attach/input/capabilities.d.ts +27 -0
  63. package/dist/clients/attach/input/capabilities.js +96 -0
  64. package/dist/clients/attach/input/controller.d.ts +20 -182
  65. package/dist/clients/attach/input/controller.js +128 -537
  66. package/dist/clients/attach/input/overlay-owner.d.ts +41 -0
  67. package/dist/clients/attach/input/overlay-owner.js +199 -0
  68. package/dist/clients/attach/overlays/file-review.d.ts +0 -4
  69. package/dist/clients/attach/overlays/file-review.js +13 -5
  70. package/dist/clients/attach/overlays/graph.js +2 -10
  71. package/dist/clients/attach/render/chat-view.d.ts +4 -3
  72. package/dist/clients/attach/render/chat-view.js +39 -33
  73. package/dist/clients/attach/render/group-activity.d.ts +1 -0
  74. package/dist/clients/attach/render/group-activity.js +20 -13
  75. package/dist/clients/attach/render/group-recap.js +12 -3
  76. package/dist/clients/attach/session/connection.js +9 -15
  77. package/dist/clients/attach/session/editor-inventory.d.ts +6 -5
  78. package/dist/clients/attach/session/editor-inventory.js +7 -8
  79. package/dist/clients/attach/session/file-links.d.ts +13 -0
  80. package/dist/clients/attach/session/file-links.js +107 -0
  81. package/dist/clients/attach/session/frame.d.ts +3 -0
  82. package/dist/clients/attach/session/frame.js +10 -1
  83. package/dist/clients/attach/session/frames.js +2 -3
  84. package/dist/clients/attach/session/input-wiring.d.ts +4 -1
  85. package/dist/clients/attach/session/input-wiring.js +15 -14
  86. package/dist/clients/attach/session/mouse.d.ts +6 -1
  87. package/dist/clients/attach/session/mouse.js +8 -5
  88. package/dist/clients/attach/session/profile-files.js +18 -12
  89. package/dist/clients/attach/session/reconnect.js +1 -1
  90. package/dist/clients/attach/session/state-sync.js +1 -2
  91. package/dist/clients/attach/session/surface-host.d.ts +3 -2
  92. package/dist/clients/attach/session/surface-host.js +4 -4
  93. package/dist/clients/attach/slash/dispatch.d.ts +8 -31
  94. package/dist/clients/attach/slash/dispatch.js +34 -81
  95. package/dist/clients/attach/viewer.js +820 -860
  96. package/dist/clients/conversation/projection.d.ts +79 -0
  97. package/dist/clients/conversation/projection.js +341 -0
  98. package/dist/clients/inbox/__tests__/serial/inbox-controller.test.js +159 -0
  99. package/dist/clients/inbox/__tests__/serial/mount-panel.test.js +151 -0
  100. package/dist/clients/inbox/controller.d.ts +0 -4
  101. package/dist/clients/inbox/controller.js +0 -2
  102. package/dist/clients/inbox/review/__tests__/review-core.test.js +4 -293
  103. package/dist/clients/inbox/review/__tests__/teardown-notice.test.js +100 -0
  104. package/dist/clients/inbox/review/comments-client.d.ts +3 -2
  105. package/dist/clients/inbox/review/comments-client.js +12 -12
  106. package/dist/clients/inbox/review/companion-pane.d.ts +30 -0
  107. package/dist/clients/inbox/review/companion-pane.js +86 -0
  108. package/dist/clients/inbox/review/document-surface.d.ts +182 -0
  109. package/dist/clients/inbox/review/{document-region.js → document-surface.js} +252 -48
  110. package/dist/clients/inbox/review/frame.js +5 -4
  111. package/dist/clients/inbox/review/launch.d.ts +8 -8
  112. package/dist/clients/inbox/review/launch.js +52 -92
  113. package/dist/clients/inbox/review/nvim.d.ts +2 -0
  114. package/dist/clients/inbox/review/nvim.js +14 -12
  115. package/dist/clients/inbox/review/review-client.d.ts +12 -8
  116. package/dist/clients/inbox/review/review-client.js +46 -35
  117. package/dist/clients/inbox/review-adapter.d.ts +3 -10
  118. package/dist/clients/inbox/review-adapter.js +27 -19
  119. package/dist/clients/inbox/surface.d.ts +0 -4
  120. package/dist/clients/inbox/surface.js +0 -2
  121. package/dist/clients/surfaces/host.d.ts +11 -3
  122. package/dist/commands/__tests__/api-client-cold-start-diagnostic.test.js +7 -34
  123. package/dist/commands/__tests__/human.test.js +11 -322
  124. package/dist/commands/api-client.d.ts +5 -5
  125. package/dist/commands/api-client.js +6 -85
  126. package/dist/commands/canvas-browse.js +3 -29
  127. package/dist/commands/canvas-config.js +1 -1
  128. package/dist/commands/canvas-use.js +3 -3
  129. package/dist/commands/canvas.js +1 -1
  130. package/dist/commands/cron.js +5 -1
  131. package/dist/commands/human/queue.d.ts +0 -4
  132. package/dist/commands/human/queue.js +7 -40
  133. package/dist/commands/memory/list.d.ts +14 -0
  134. package/dist/commands/memory/list.js +35 -31
  135. package/dist/commands/memory/read.d.ts +7 -0
  136. package/dist/commands/memory/read.js +14 -8
  137. package/dist/commands/node/bash.d.ts +1 -0
  138. package/dist/commands/node/bash.js +198 -0
  139. package/dist/commands/node/create.d.ts +23 -0
  140. package/dist/commands/node/create.js +207 -0
  141. package/dist/commands/node/inspect.d.ts +2 -0
  142. package/dist/commands/node/inspect.js +302 -0
  143. package/dist/commands/node/lifecycle.d.ts +4 -0
  144. package/dist/commands/node/lifecycle.js +415 -0
  145. package/dist/commands/node/message.d.ts +1 -0
  146. package/dist/commands/node/message.js +164 -0
  147. package/dist/commands/node/pyramid.d.ts +2 -0
  148. package/dist/commands/node/pyramid.js +79 -0
  149. package/dist/commands/node/subscription.d.ts +1 -0
  150. package/dist/commands/node/subscription.js +82 -0
  151. package/dist/commands/node/wait.d.ts +1 -0
  152. package/dist/commands/node/wait.js +159 -0
  153. package/dist/commands/node-lifecycle-revive.js +10 -57
  154. package/dist/commands/node.d.ts +0 -42
  155. package/dist/commands/node.js +11 -2065
  156. package/dist/commands/search.js +1 -1
  157. package/dist/commands/surface/node/cycle.d.ts +1 -0
  158. package/dist/commands/surface/node/cycle.js +83 -0
  159. package/dist/commands/surface/node/focus.d.ts +1 -0
  160. package/dist/commands/surface/node/focus.js +67 -0
  161. package/dist/commands/surface/node/id.d.ts +1 -0
  162. package/dist/commands/surface/node/id.js +38 -0
  163. package/dist/commands/surface/node/pin.d.ts +1 -0
  164. package/dist/commands/surface/node/pin.js +42 -0
  165. package/dist/commands/surface/node/placement.d.ts +46 -0
  166. package/dist/commands/surface/node/placement.js +124 -0
  167. package/dist/commands/surface-node.js +4 -1
  168. package/dist/commands/surface-reload.js +1 -2
  169. package/dist/commands/surface-tmux-spread.js +1 -1
  170. package/dist/commands/surface.js +5 -20
  171. package/dist/commands/sys/__tests__/setup-core.test.js +18 -271
  172. package/dist/commands/sys/config.js +6 -6
  173. package/dist/commands/sys/logs.js +1 -1
  174. package/dist/commands/sys/panels/broker-limits-panel.d.ts +17 -0
  175. package/dist/commands/sys/panels/broker-limits-panel.js +104 -0
  176. package/dist/commands/sys/panels/dependencies-panel.d.ts +14 -0
  177. package/dist/commands/sys/panels/dependencies-panel.js +80 -0
  178. package/dist/commands/sys/panels/keybindings-panel.d.ts +56 -0
  179. package/dist/commands/sys/panels/keybindings-panel.js +703 -0
  180. package/dist/commands/sys/panels/keys-panel.d.ts +16 -0
  181. package/dist/commands/sys/panels/keys-panel.js +60 -0
  182. package/dist/commands/sys/panels/models-panel.d.ts +77 -0
  183. package/dist/commands/sys/panels/models-panel.js +647 -0
  184. package/dist/commands/sys/panels/panel.d.ts +45 -0
  185. package/dist/commands/sys/panels/panel.js +137 -0
  186. package/dist/commands/sys/panels/plugins-panel.d.ts +16 -0
  187. package/dist/commands/sys/panels/plugins-panel.js +80 -0
  188. package/dist/commands/sys/panels/prefs-panel.d.ts +21 -0
  189. package/dist/commands/sys/panels/prefs-panel.js +85 -0
  190. package/dist/commands/sys/panels/provider-panel.d.ts +62 -0
  191. package/dist/commands/sys/panels/provider-panel.js +538 -0
  192. package/dist/commands/sys/settings-shell.d.ts +55 -0
  193. package/dist/commands/sys/settings-shell.js +400 -0
  194. package/dist/commands/sys/settings.d.ts +2 -0
  195. package/dist/commands/sys/settings.js +31 -0
  196. package/dist/commands/sys/setup-core.d.ts +3 -33
  197. package/dist/commands/sys/setup-core.js +27 -78
  198. package/dist/commands/sys/setup-settings-runner.d.ts +24 -0
  199. package/dist/commands/sys/setup-settings-runner.js +63 -0
  200. package/dist/commands/sys/setup-wizard.d.ts +26 -125
  201. package/dist/commands/sys/setup-wizard.js +209 -2473
  202. package/dist/commands/sys/setup.js +5 -7
  203. package/dist/commands/sys.js +3 -2
  204. package/dist/core/__tests__/broker-extension-canvas-db-boundary.test.js +50 -0
  205. package/dist/core/__tests__/broker-launch-candidates.test.js +20 -9
  206. package/dist/core/__tests__/broker-preflight.test.js +1 -1
  207. package/dist/core/__tests__/canvas-inbox-watcher-hold.test.js +108 -27
  208. package/dist/core/__tests__/canvas-inbox-watcher.test.js +14 -0
  209. package/dist/core/__tests__/canvas.test.js +2 -36
  210. package/dist/core/__tests__/close.test.js +14 -3
  211. package/dist/core/__tests__/context-intro.test.js +32 -143
  212. package/dist/core/__tests__/cron-broker-capacity.test.js +22 -3
  213. package/dist/core/__tests__/daemon-boot.test.js +2 -20
  214. package/dist/core/__tests__/daemon-wedge.test.js +1 -1
  215. package/dist/core/__tests__/dead-node-policy-table.test.js +1 -18
  216. package/dist/core/__tests__/fixtures/fake-engine.d.ts +1 -1
  217. package/dist/core/__tests__/fixtures/fake-engine.js +2 -2
  218. package/dist/core/__tests__/fixtures/fake-pi-host.js +2 -2
  219. package/dist/core/__tests__/focuses.test.js +4 -98
  220. package/dist/core/__tests__/helpers/broker-clients.d.ts +0 -3
  221. package/dist/core/__tests__/helpers/broker-clients.js +0 -14
  222. package/dist/core/__tests__/helpers/harness.d.ts +0 -8
  223. package/dist/core/__tests__/helpers/harness.js +7 -87
  224. package/dist/core/__tests__/helpers/viewer-panes.js +1 -1
  225. package/dist/core/__tests__/inline-memory-refs.test.js +5 -134
  226. package/dist/core/__tests__/kickoff.test.js +1 -1
  227. package/dist/core/__tests__/memory-resolver-precedence.test.js +29 -1
  228. package/dist/core/__tests__/migration.test.js +35 -48
  229. package/dist/core/__tests__/on-read-dedup-resume.test.js +22 -12
  230. package/dist/core/__tests__/passive-subscription.test.js +26 -49
  231. package/dist/core/__tests__/preview-registry-sync.test.js +1 -2
  232. package/dist/core/__tests__/prune.test.js +94 -1
  233. package/dist/core/__tests__/review-model-floor.test.js +0 -32
  234. package/dist/core/__tests__/seam/broker-attach-multiclient.test.js +255 -0
  235. package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.js +39 -7
  236. package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.js +30 -29
  237. package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.js +54 -5
  238. package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.js +134 -82
  239. package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.js +15 -4
  240. package/dist/core/__tests__/{full/idle-release-settlement.test.js → seam/dormancy-release.test.js} +69 -17
  241. package/dist/core/__tests__/{full/yield-message-transaction.test.js → seam/yield-refresh-transaction.test.js} +31 -9
  242. package/dist/core/__tests__/secrets.test.js +1 -7
  243. package/dist/core/__tests__/{broker-fork-seam.test.js → serial/broker-fork-seam.test.js} +58 -7
  244. package/dist/core/__tests__/{broker-sdk-wiring.test.js → serial/broker-sdk-wiring.test.js} +18 -162
  245. package/dist/core/__tests__/{broker-snapshot-history.test.js → serial/broker-snapshot-history.test.js} +9 -9
  246. package/dist/core/__tests__/{command-plugins.test.js → serial/command-plugins.test.js} +105 -15
  247. package/dist/core/__tests__/{deferred-no-wake.test.js → serial/deferred-no-wake.test.js} +23 -20
  248. package/dist/core/__tests__/{flagship-lifecycle.test.js → serial/flagship-lifecycle.test.js} +7 -7
  249. package/dist/core/__tests__/{host-teardown-process-group.test.js → serial/host-teardown-process-group.test.js} +6 -6
  250. package/dist/core/__tests__/{human-deliver-e2e.test.js → serial/human-deliver-e2e.test.js} +12 -12
  251. package/dist/core/__tests__/{live-mutation.test.js → serial/live-mutation.test.js} +5 -5
  252. package/dist/core/__tests__/{refresh-stall-recycle.test.js → serial/refresh-stall-recycle.test.js} +5 -14
  253. package/dist/core/__tests__/{revive.test.js → serial/revive.test.js} +15 -100
  254. package/dist/core/__tests__/{spawn-root.test.js → serial/spawn-root.test.js} +32 -15
  255. package/dist/core/__tests__/serial/subscription-delivery.test.js +126 -0
  256. package/dist/core/__tests__/serial/tmux-surface.test.js +256 -0
  257. package/dist/core/__tests__/{worktree.test.js → serial/worktree.test.js} +15 -15
  258. package/dist/core/__tests__/session-model.test.js +0 -18
  259. package/dist/core/__tests__/spawn-worktree-id-conflict.test.js +9 -0
  260. package/dist/core/__tests__/watchdog-abort-arms-retry.test.js +50 -0
  261. package/dist/core/broker-client/__tests__/transport-relay.test.js +15 -16
  262. package/dist/core/broker-client/__tests__/transport-socket.test.js +28 -0
  263. package/dist/core/broker-client/client.d.ts +2 -2
  264. package/dist/core/broker-client/client.js +4 -7
  265. package/dist/core/broker-client/transport-relay.d.ts +13 -19
  266. package/dist/core/broker-client/transport-relay.js +19 -34
  267. package/dist/core/broker-client/transport-socket.d.ts +2 -2
  268. package/dist/core/broker-client/transport-socket.js +9 -2
  269. package/dist/core/broker-client/transport.d.ts +7 -3
  270. package/dist/core/broker-client/transport.js +4 -4
  271. package/dist/core/canvas/__tests__/attention.test.js +1 -18
  272. package/dist/core/canvas/__tests__/remote-canvas-source.test.js +7 -64
  273. package/dist/core/canvas/__tests__/remote-transport.test.js +2 -3
  274. package/dist/core/canvas/__tests__/render-remote.test.js +7 -52
  275. package/dist/core/canvas/browse/app.d.ts +2 -17
  276. package/dist/core/canvas/browse/app.js +16 -88
  277. package/dist/core/canvas/browse/model.d.ts +0 -4
  278. package/dist/core/canvas/browse/model.js +1 -12
  279. package/dist/core/canvas/browse/render.js +6 -3
  280. package/dist/core/canvas/crons.d.ts +8 -5
  281. package/dist/core/canvas/crons.js +7 -6
  282. package/dist/core/canvas/extensions.d.ts +7 -3
  283. package/dist/core/canvas/extensions.js +16 -4
  284. package/dist/core/canvas/nav-model.d.ts +0 -4
  285. package/dist/core/canvas/nav-model.js +2 -14
  286. package/dist/core/canvas/node-order.d.ts +3 -0
  287. package/dist/core/canvas/node-order.js +12 -0
  288. package/dist/core/canvas/remote-canvas-source.d.ts +3 -6
  289. package/dist/core/canvas/remote-canvas-source.js +8 -15
  290. package/dist/core/command.js +11 -4
  291. package/dist/core/config.js +3 -1
  292. package/dist/core/events/envelope.js +1 -1
  293. package/dist/core/events/read.js +7 -21
  294. package/dist/core/events/source.d.ts +0 -2
  295. package/dist/core/events/source.js +0 -16
  296. package/dist/core/events/types.d.ts +1 -1
  297. package/dist/core/fault-classifier.d.ts +1 -1
  298. package/dist/core/feed/passive.d.ts +0 -11
  299. package/dist/core/feed/passive.js +1 -62
  300. package/dist/core/human/__tests__/{inbox-core.test.js → serial/inbox-core.test.js} +6 -6
  301. package/dist/core/keybindings/__tests__/resolve.test.js +1 -96
  302. package/dist/core/keybindings/background-bash.js +3 -4
  303. package/dist/core/keybindings/catalog.js +1 -1
  304. package/dist/core/memory/inline-ref-grammar.js +3 -3
  305. package/dist/core/memory-resolver.d.ts +11 -25
  306. package/dist/core/memory-resolver.js +51 -33
  307. package/dist/core/model-routes.d.ts +15 -0
  308. package/dist/core/model-routes.js +12 -0
  309. package/dist/core/pool-credential-store.js +1 -1
  310. package/dist/core/preview-registry.js +8 -9
  311. package/dist/core/profiles/__tests__/root-profile.test.js +4 -14
  312. package/dist/core/review/realize.d.ts +0 -13
  313. package/dist/core/review/realize.js +0 -40
  314. package/dist/core/review/types.d.ts +1 -1
  315. package/dist/core/runtime/__tests__/engine-route.test.js +2 -2
  316. package/dist/core/runtime/bearings.js +1 -11
  317. package/dist/core/runtime/broker/client-registry.d.ts +33 -0
  318. package/dist/core/runtime/broker/client-registry.js +164 -0
  319. package/dist/core/runtime/broker/daemon-ops.d.ts +19 -0
  320. package/dist/core/runtime/broker/daemon-ops.js +49 -0
  321. package/dist/core/runtime/broker/event-projection.d.ts +42 -0
  322. package/dist/core/runtime/broker/event-projection.js +178 -0
  323. package/dist/core/runtime/broker/fault-retry.d.ts +39 -0
  324. package/dist/core/runtime/broker/fault-retry.js +277 -0
  325. package/dist/core/runtime/broker/frame-dispatch.d.ts +238 -0
  326. package/dist/core/runtime/broker/frame-dispatch.js +1537 -0
  327. package/dist/core/runtime/broker/inbox.d.ts +22 -0
  328. package/dist/core/runtime/broker/inbox.js +167 -0
  329. package/dist/core/runtime/broker/passive.d.ts +16 -0
  330. package/dist/core/runtime/broker/passive.js +44 -0
  331. package/dist/core/runtime/broker/read-ops.d.ts +23 -0
  332. package/dist/core/runtime/broker/read-ops.js +150 -0
  333. package/dist/core/runtime/broker/rebind.d.ts +74 -0
  334. package/dist/core/runtime/broker/rebind.js +211 -0
  335. package/dist/core/runtime/broker/tool-groups.d.ts +39 -0
  336. package/dist/core/runtime/broker/tool-groups.js +244 -0
  337. package/dist/core/runtime/broker-extension-render.d.ts +11 -0
  338. package/dist/core/runtime/broker-extension-render.js +181 -0
  339. package/dist/core/runtime/broker-persona-guidance.d.ts +13 -0
  340. package/dist/core/runtime/broker-persona-guidance.js +58 -0
  341. package/dist/core/runtime/broker-protocol.d.ts +1 -1
  342. package/dist/core/runtime/broker-protocol.js +1 -1
  343. package/dist/core/runtime/broker.d.ts +5 -196
  344. package/dist/core/runtime/broker.js +276 -3059
  345. package/dist/core/runtime/canvas-extensions.js +11 -2
  346. package/dist/core/runtime/fault.js +1 -1
  347. package/dist/core/runtime/model-selection.d.ts +9 -0
  348. package/dist/core/runtime/model-selection.js +12 -0
  349. package/dist/core/runtime/model-swap.d.ts +3 -3
  350. package/dist/core/runtime/model-swap.js +33 -25
  351. package/dist/core/runtime/placement-tmux.d.ts +3 -14
  352. package/dist/core/runtime/placement-tmux.js +11 -80
  353. package/dist/core/runtime/placement.d.ts +4 -2
  354. package/dist/core/runtime/placement.js +7 -12
  355. package/dist/core/runtime/promote.d.ts +14 -1
  356. package/dist/core/runtime/promote.js +1 -1
  357. package/dist/core/runtime/reset.d.ts +1 -1
  358. package/dist/core/runtime/roadmap.js +1 -1
  359. package/dist/core/runtime/spawn.d.ts +8 -0
  360. package/dist/core/runtime/spawn.js +36 -6
  361. package/dist/core/runtime/stop-guard.d.ts +4 -3
  362. package/dist/core/runtime/stop-guard.js +36 -18
  363. package/dist/core/runtime/stop-signals.d.ts +4 -1
  364. package/dist/core/runtime/stream-watchdog.js +4 -5
  365. package/dist/core/runtime/structured-output.d.ts +15 -2
  366. package/dist/core/runtime/structured-output.js +35 -12
  367. package/dist/core/runtime/tmux-bindings.d.ts +25 -0
  368. package/dist/core/runtime/tmux-bindings.js +682 -0
  369. package/dist/core/runtime/tmux-chrome.d.ts +2 -1
  370. package/dist/core/runtime/tmux-chrome.js +3 -2
  371. package/dist/core/runtime/{tmux.d.ts → tmux-driver.d.ts} +18 -26
  372. package/dist/core/runtime/tmux-driver.js +598 -0
  373. package/dist/core/runtime/view-socket.d.ts +14 -0
  374. package/dist/core/runtime/view-socket.js +83 -0
  375. package/dist/core/session-model/session-state.d.ts +1 -2
  376. package/dist/core/session-model/session-state.js +5 -8
  377. package/dist/core/spawn.d.ts +1 -1
  378. package/dist/core/spawn.js +2 -2
  379. package/dist/core/substrate/gate.d.ts +1 -1
  380. package/dist/core/substrate/on-read-pure.d.ts +7 -0
  381. package/dist/core/substrate/on-read-pure.js +272 -0
  382. package/dist/core/termrender/termrender.js +32 -2
  383. package/dist/core/user-settings.d.ts +23 -1
  384. package/dist/core/user-settings.js +18 -1
  385. package/dist/daemon/api/__tests__/node-model-validation.test.js +134 -0
  386. package/dist/daemon/api/__tests__/review-terminal-conflict.test.js +98 -0
  387. package/dist/daemon/api/__tests__/{full → seam}/api-server.test.js +6 -48
  388. package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.js +17 -44
  389. package/dist/daemon/api/__tests__/{full/push-parity.test.js → seam/leaf-api-parity.test.js} +61 -42
  390. package/dist/daemon/api/bridge.js +40 -81
  391. package/dist/daemon/api/handlers/broker-ops.d.ts +2 -0
  392. package/dist/daemon/api/handlers/broker-ops.js +383 -0
  393. package/dist/daemon/api/handlers/crons.js +9 -4
  394. package/dist/daemon/api/handlers/files.js +6 -7
  395. package/dist/daemon/api/handlers/inbox.js +2 -340
  396. package/dist/daemon/api/handlers/nodes.d.ts +10 -1
  397. package/dist/daemon/api/handlers/nodes.js +74 -39
  398. package/dist/daemon/api/handlers/review-comments.js +5 -1
  399. package/dist/daemon/api/handlers/reviews.js +0 -19
  400. package/dist/daemon/api/map.js +25 -4
  401. package/dist/daemon/api/router.js +2 -3
  402. package/dist/daemon/api/server.js +5 -7
  403. package/dist/daemon/cron-run.d.ts +4 -0
  404. package/dist/daemon/cron-run.js +30 -13
  405. package/dist/daemon/crtrd.d.ts +3 -58
  406. package/dist/daemon/crtrd.js +28 -1244
  407. package/dist/daemon/manage.js +0 -1
  408. package/dist/daemon/reconcilers/broker-supervision.d.ts +50 -0
  409. package/dist/daemon/reconcilers/broker-supervision.js +549 -0
  410. package/dist/daemon/reconcilers/cron-lane.d.ts +10 -0
  411. package/dist/daemon/reconcilers/cron-lane.js +32 -0
  412. package/dist/daemon/reconcilers/dormant-inbox.d.ts +18 -0
  413. package/dist/daemon/reconcilers/dormant-inbox.js +143 -0
  414. package/dist/daemon/reconcilers/storage-maintenance.d.ts +22 -0
  415. package/dist/daemon/reconcilers/storage-maintenance.js +213 -0
  416. package/dist/daemon/review/finish.js +2 -5
  417. package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +34 -53
  418. package/dist/pi-extensions/__tests__/canvas-recap.test.js +16 -113
  419. package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +72 -99
  420. package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.js +29 -12
  421. package/dist/pi-extensions/broker-local.d.ts +20 -0
  422. package/dist/pi-extensions/broker-local.js +89 -0
  423. package/dist/pi-extensions/canvas-context-intro.d.ts +3 -3
  424. package/dist/pi-extensions/canvas-context-intro.js +22 -11
  425. package/dist/pi-extensions/canvas-doc-substrate.js +17 -34
  426. package/dist/pi-extensions/canvas-goal-capture.js +7 -12
  427. package/dist/pi-extensions/canvas-inbox-watcher.js +124 -139
  428. package/dist/pi-extensions/canvas-passive-context.d.ts +3 -3
  429. package/dist/pi-extensions/canvas-passive-context.js +22 -18
  430. package/dist/pi-extensions/canvas-recap.d.ts +2 -2
  431. package/dist/pi-extensions/canvas-recap.js +48 -21
  432. package/dist/pi-extensions/canvas-review-boundary.js +10 -4
  433. package/dist/pi-extensions/canvas-stophook.d.ts +0 -5
  434. package/dist/pi-extensions/canvas-stophook.js +149 -431
  435. package/dist/pi-extensions/canvas-structured-output.js +52 -30
  436. package/dist/pi-extensions/envelope-merge.d.ts +13 -0
  437. package/dist/pi-extensions/envelope-merge.js +29 -0
  438. package/dist/shared/working-activity.d.ts +3 -2
  439. package/dist/shared/working-activity.js +3 -2
  440. package/dist/types.d.ts +6 -5
  441. package/dist/types.js +2 -2
  442. package/docs/compat/hearth-crtr-v1.md +4 -12
  443. package/docs/compat/hearth-crtr-v2.md +3 -11
  444. package/docs/compat/hearth-crtr-v3.md +4 -12
  445. package/docs/compat/hearth-crtr-v4.md +3 -11
  446. package/docs/compat/hearth-crtr-v5.md +3 -11
  447. package/docs/public-api.md +3 -7
  448. package/package.json +7 -49
  449. package/runtime.lock.json +2766 -14533
  450. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/claude-plugin-commands.test.ts +0 -49
  451. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/memory-slash-commands.test.ts +0 -194
  452. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/statusline.test.ts +0 -68
  453. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/test.ts +0 -119
  454. package/dist/clients/attach/__tests__/attach-chrome-remote.test.js +0 -439
  455. package/dist/clients/attach/__tests__/attach-keybindings.test.js +0 -170
  456. package/dist/clients/attach/__tests__/crtr-output-coverage.test.js +0 -57
  457. package/dist/clients/attach/__tests__/editor-frame-title.test.js +0 -19
  458. package/dist/clients/attach/__tests__/input-controller-extension-command.test.js +0 -32
  459. package/dist/clients/attach/__tests__/markdown-headings.test.js +0 -35
  460. package/dist/clients/attach/__tests__/session-identity-refresh.test.js +0 -32
  461. package/dist/clients/conversation/conversation.d.ts +0 -65
  462. package/dist/clients/conversation/conversation.js +0 -318
  463. package/dist/clients/conversation/frames.d.ts +0 -30
  464. package/dist/clients/conversation/frames.js +0 -52
  465. package/dist/clients/conversation/region.d.ts +0 -51
  466. package/dist/clients/conversation/region.js +0 -265
  467. package/dist/clients/inbox/__tests__/inbox-controller.test.js +0 -247
  468. package/dist/clients/inbox/__tests__/mount-panel.test.js +0 -776
  469. package/dist/clients/inbox/review/__tests__/remap.test.js +0 -196
  470. package/dist/clients/inbox/review/columns.d.ts +0 -22
  471. package/dist/clients/inbox/review/columns.js +0 -40
  472. package/dist/clients/inbox/review/composition.d.ts +0 -60
  473. package/dist/clients/inbox/review/composition.js +0 -278
  474. package/dist/clients/inbox/review/document-region.d.ts +0 -120
  475. package/dist/clients/surfaces/region.d.ts +0 -16
  476. package/dist/clients/web/__tests__/push-engine.test.js +0 -158
  477. package/dist/clients/web/__tests__/push-registry.test.d.ts +0 -1
  478. package/dist/clients/web/__tests__/push-registry.test.js +0 -177
  479. package/dist/clients/web/dev-server.d.ts +0 -7
  480. package/dist/clients/web/dev-server.js +0 -46
  481. package/dist/clients/web/events.d.ts +0 -19
  482. package/dist/clients/web/events.js +0 -163
  483. package/dist/clients/web/push-engine.d.ts +0 -44
  484. package/dist/clients/web/push-engine.js +0 -125
  485. package/dist/clients/web/push-registry.d.ts +0 -85
  486. package/dist/clients/web/push-registry.js +0 -373
  487. package/dist/clients/web/server.d.ts +0 -19
  488. package/dist/clients/web/server.js +0 -661
  489. package/dist/clients/web/web-client/shared/protocol.d.ts +0 -214
  490. package/dist/clients/web/web-client/shared/protocol.js +0 -8
  491. package/dist/clients/web/web-cmd.d.ts +0 -2
  492. package/dist/clients/web/web-cmd.js +0 -141
  493. package/dist/commands/__tests__/api-canvas-source.test.d.ts +0 -1
  494. package/dist/commands/__tests__/api-canvas-source.test.js +0 -37
  495. package/dist/commands/__tests__/canvas-config.test.d.ts +0 -1
  496. package/dist/commands/__tests__/canvas-config.test.js +0 -107
  497. package/dist/commands/__tests__/node-no-kickoff-flag.test.d.ts +0 -1
  498. package/dist/commands/__tests__/node-no-kickoff-flag.test.js +0 -73
  499. package/dist/commands/__tests__/node-worktree-flag.test.d.ts +0 -1
  500. package/dist/commands/__tests__/node-worktree-flag.test.js +0 -49
  501. package/dist/commands/__tests__/search-contents.test.d.ts +0 -1
  502. package/dist/commands/__tests__/search-contents.test.js +0 -52
  503. package/dist/commands/memory/__tests__/lint.test.d.ts +0 -1
  504. package/dist/commands/memory/__tests__/lint.test.js +0 -15
  505. package/dist/commands/sys/__tests__/config-broker-thresholds.test.d.ts +0 -1
  506. package/dist/commands/sys/__tests__/config-broker-thresholds.test.js +0 -95
  507. package/dist/commands/sys/__tests__/config-keybindings.test.d.ts +0 -1
  508. package/dist/commands/sys/__tests__/config-keybindings.test.js +0 -55
  509. package/dist/commands/sys/__tests__/helpers/setup-runtime.d.ts +0 -5
  510. package/dist/commands/sys/__tests__/helpers/setup-runtime.js +0 -19
  511. package/dist/commands/sys/__tests__/setup-front-door.test.d.ts +0 -1
  512. package/dist/commands/sys/__tests__/setup-front-door.test.js +0 -102
  513. package/dist/commands/sys/__tests__/setup-models.test.d.ts +0 -1
  514. package/dist/commands/sys/__tests__/setup-models.test.js +0 -205
  515. package/dist/commands/sys/__tests__/setup-providers-viewport.test.d.ts +0 -1
  516. package/dist/commands/sys/__tests__/setup-providers-viewport.test.js +0 -155
  517. package/dist/commands/sys/__tests__/sync-deps.test.d.ts +0 -1
  518. package/dist/commands/sys/__tests__/sync-deps.test.js +0 -179
  519. package/dist/commands/sys/__tests__/sync-import.test.d.ts +0 -1
  520. package/dist/commands/sys/__tests__/sync-import.test.js +0 -315
  521. package/dist/core/__tests__/base-worker-prompt.test.d.ts +0 -1
  522. package/dist/core/__tests__/base-worker-prompt.test.js +0 -57
  523. package/dist/core/__tests__/command-plugins-surfaces.test.d.ts +0 -1
  524. package/dist/core/__tests__/command-plugins-surfaces.test.js +0 -359
  525. package/dist/core/__tests__/connection-reconnect-resume.test.d.ts +0 -1
  526. package/dist/core/__tests__/connection-reconnect-resume.test.js +0 -36
  527. package/dist/core/__tests__/finalization-migration.test.d.ts +0 -1
  528. package/dist/core/__tests__/finalization-migration.test.js +0 -38
  529. package/dist/core/__tests__/fixtures/extra-extension.d.ts +0 -1
  530. package/dist/core/__tests__/fixtures/extra-extension.js +0 -3
  531. package/dist/core/__tests__/fixtures/spawn-proof-target.test.d.ts +0 -1
  532. package/dist/core/__tests__/fixtures/spawn-proof-target.test.js +0 -15
  533. package/dist/core/__tests__/fork.test.d.ts +0 -1
  534. package/dist/core/__tests__/fork.test.js +0 -108
  535. package/dist/core/__tests__/full/broker-attach-limits.test.d.ts +0 -1
  536. package/dist/core/__tests__/full/broker-attach-limits.test.js +0 -147
  537. package/dist/core/__tests__/full/broker-deliver-ack.test.d.ts +0 -1
  538. package/dist/core/__tests__/full/broker-deliver-ack.test.js +0 -73
  539. package/dist/core/__tests__/full/broker-dialogs.test.d.ts +0 -1
  540. package/dist/core/__tests__/full/broker-dialogs.test.js +0 -180
  541. package/dist/core/__tests__/full/broker-display-snapshot.test.d.ts +0 -1
  542. package/dist/core/__tests__/full/broker-display-snapshot.test.js +0 -75
  543. package/dist/core/__tests__/full/broker-dormant-wake.test.d.ts +0 -1
  544. package/dist/core/__tests__/full/broker-dormant-wake.test.js +0 -130
  545. package/dist/core/__tests__/full/broker-model-changed-broadcast.test.d.ts +0 -1
  546. package/dist/core/__tests__/full/broker-model-changed-broadcast.test.js +0 -57
  547. package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.d.ts +0 -1
  548. package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.js +0 -80
  549. package/dist/core/__tests__/full/cascade-close.test.d.ts +0 -1
  550. package/dist/core/__tests__/full/cascade-close.test.js +0 -240
  551. package/dist/core/__tests__/full/detach-focus.test.d.ts +0 -1
  552. package/dist/core/__tests__/full/detach-focus.test.js +0 -126
  553. package/dist/core/__tests__/full/idle-release-settlement.test.d.ts +0 -1
  554. package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.d.ts +0 -1
  555. package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.js +0 -107
  556. package/dist/core/__tests__/full/park-clock-release.test.d.ts +0 -1
  557. package/dist/core/__tests__/full/park-clock-release.test.js +0 -56
  558. package/dist/core/__tests__/full/yield-message-transaction.test.d.ts +0 -1
  559. package/dist/core/__tests__/memory-index-render.test.d.ts +0 -1
  560. package/dist/core/__tests__/memory-index-render.test.js +0 -60
  561. package/dist/core/__tests__/model-routes.test.d.ts +0 -1
  562. package/dist/core/__tests__/model-routes.test.js +0 -41
  563. package/dist/core/__tests__/on-read-identity.test.d.ts +0 -1
  564. package/dist/core/__tests__/on-read-identity.test.js +0 -61
  565. package/dist/core/__tests__/phase4-review-migration.test.d.ts +0 -1
  566. package/dist/core/__tests__/phase4-review-migration.test.js +0 -100
  567. package/dist/core/__tests__/prune-to-limit.test.d.ts +0 -1
  568. package/dist/core/__tests__/prune-to-limit.test.js +0 -126
  569. package/dist/core/__tests__/reset.test.d.ts +0 -1
  570. package/dist/core/__tests__/reset.test.js +0 -69
  571. package/dist/core/__tests__/spawn-no-kickoff.test.d.ts +0 -1
  572. package/dist/core/__tests__/spawn-no-kickoff.test.js +0 -115
  573. package/dist/core/__tests__/steer-note.test.d.ts +0 -1
  574. package/dist/core/__tests__/steer-note.test.js +0 -41
  575. package/dist/core/__tests__/subcommand-tier.test.d.ts +0 -1
  576. package/dist/core/__tests__/subcommand-tier.test.js +0 -99
  577. package/dist/core/__tests__/subscription-delivery.test.js +0 -211
  578. package/dist/core/__tests__/test-runner-cheap-sharding.test.d.ts +0 -1
  579. package/dist/core/__tests__/test-runner-cheap-sharding.test.js +0 -97
  580. package/dist/core/__tests__/tmux-surface.test.js +0 -484
  581. package/dist/core/__tests__/wake-bearings.test.d.ts +0 -1
  582. package/dist/core/__tests__/wake-bearings.test.js +0 -102
  583. package/dist/core/canvas/__tests__/remote-event-stream.test.d.ts +0 -1
  584. package/dist/core/canvas/__tests__/remote-event-stream.test.js +0 -146
  585. package/dist/core/canvas/__tests__/source-resolve.test.d.ts +0 -1
  586. package/dist/core/canvas/__tests__/source-resolve.test.js +0 -77
  587. package/dist/core/canvas/browse/__tests__/model.test.d.ts +0 -1
  588. package/dist/core/canvas/browse/__tests__/model.test.js +0 -290
  589. package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.d.ts +0 -1
  590. package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.js +0 -134
  591. package/dist/core/canvas/browse/__tests__/render.test.d.ts +0 -1
  592. package/dist/core/canvas/browse/__tests__/render.test.js +0 -111
  593. package/dist/core/canvas/browse/rebuild-coalescer.d.ts +0 -7
  594. package/dist/core/canvas/browse/rebuild-coalescer.js +0 -61
  595. package/dist/core/canvas/remote-event-stream.d.ts +0 -24
  596. package/dist/core/canvas/remote-event-stream.js +0 -94
  597. package/dist/core/feed/__tests__/coalesce-human.test.d.ts +0 -1
  598. package/dist/core/feed/__tests__/coalesce-human.test.js +0 -36
  599. package/dist/core/feed/__tests__/empty-node-guard.test.d.ts +0 -1
  600. package/dist/core/feed/__tests__/empty-node-guard.test.js +0 -45
  601. package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.d.ts +0 -1
  602. package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.js +0 -84
  603. package/dist/core/human/__tests__/visible-paths.test.d.ts +0 -1
  604. package/dist/core/human/__tests__/visible-paths.test.js +0 -28
  605. package/dist/core/keybindings/__tests__/inbox-affordance.test.d.ts +0 -1
  606. package/dist/core/keybindings/__tests__/inbox-affordance.test.js +0 -38
  607. package/dist/core/review/__tests__/project.test.d.ts +0 -1
  608. package/dist/core/review/__tests__/project.test.js +0 -71
  609. package/dist/core/runtime/__tests__/command-expansion.test.d.ts +0 -1
  610. package/dist/core/runtime/__tests__/command-expansion.test.js +0 -25
  611. package/dist/core/runtime/__tests__/session-visibility.test.d.ts +0 -1
  612. package/dist/core/runtime/__tests__/session-visibility.test.js +0 -119
  613. package/dist/core/runtime/__tests__/spawn-at-given-id.test.d.ts +0 -1
  614. package/dist/core/runtime/__tests__/spawn-at-given-id.test.js +0 -34
  615. package/dist/core/runtime/tmux.js +0 -1314
  616. package/dist/daemon/api/__tests__/full/push-parity.test.d.ts +0 -1
  617. package/dist/daemon/api/__tests__/full/worktree-parity.test.d.ts +0 -1
  618. package/dist/daemon/api/__tests__/full/worktree-parity.test.js +0 -160
  619. package/dist/daemon/api/__tests__/inbox.test.d.ts +0 -1
  620. package/dist/daemon/api/__tests__/inbox.test.js +0 -489
  621. package/dist/web-client/apple-touch-icon.png +0 -0
  622. package/dist/web-client/assets/fragment-mono-latin-400-normal-BYwT3kSJ.woff +0 -0
  623. package/dist/web-client/assets/fragment-mono-latin-400-normal-yxdJ5AmL.woff2 +0 -0
  624. package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-BbKYyvR9.woff2 +0 -0
  625. package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-CT4YFKeK.woff +0 -0
  626. package/dist/web-client/assets/index-CCPaLeW7.css +0 -2
  627. package/dist/web-client/assets/index-kyOWsnZK.js +0 -86
  628. package/dist/web-client/assets/martian-mono-cyrillic-wght-normal-B84CD5C_.woff2 +0 -0
  629. package/dist/web-client/assets/martian-mono-latin-ext-wght-normal-DlL6xMw5.woff2 +0 -0
  630. package/dist/web-client/assets/martian-mono-latin-wght-normal-5W32yIyr.woff2 +0 -0
  631. package/dist/web-client/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -2
  632. package/dist/web-client/icon-192.png +0 -0
  633. package/dist/web-client/icon-512.png +0 -0
  634. package/dist/web-client/icon-maskable-512.png +0 -0
  635. package/dist/web-client/index.html +0 -17
  636. package/dist/web-client/manifest.webmanifest +0 -1
  637. package/dist/web-client/sw.js +0 -1
  638. /package/dist/api/__tests__/{client.test.d.ts → serial/client.test.d.ts} +0 -0
  639. /package/dist/clients/inbox/__tests__/{inbox-controller.test.d.ts → serial/inbox-controller.test.d.ts} +0 -0
  640. /package/dist/clients/inbox/__tests__/{mount-panel.test.d.ts → serial/mount-panel.test.d.ts} +0 -0
  641. /package/dist/clients/{attach/__tests__/attach-chrome-remote.test.d.ts → inbox/review/__tests__/teardown-notice.test.d.ts} +0 -0
  642. /package/dist/{clients/attach/__tests__/attach-keybindings.test.d.ts → core/__tests__/broker-extension-canvas-db-boundary.test.d.ts} +0 -0
  643. /package/dist/{clients/attach/__tests__/crtr-output-coverage.test.d.ts → core/__tests__/seam/broker-attach-multiclient.test.d.ts} +0 -0
  644. /package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.d.ts +0 -0
  645. /package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.d.ts +0 -0
  646. /package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.d.ts +0 -0
  647. /package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.d.ts +0 -0
  648. /package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.d.ts +0 -0
  649. /package/dist/{clients/attach/__tests__/editor-frame-title.test.d.ts → core/__tests__/seam/dormancy-release.test.d.ts} +0 -0
  650. /package/dist/{clients/attach/__tests__/input-controller-extension-command.test.d.ts → core/__tests__/seam/yield-refresh-transaction.test.d.ts} +0 -0
  651. /package/dist/core/__tests__/{broker-fork-seam.test.d.ts → serial/broker-fork-seam.test.d.ts} +0 -0
  652. /package/dist/core/__tests__/{broker-sdk-wiring.test.d.ts → serial/broker-sdk-wiring.test.d.ts} +0 -0
  653. /package/dist/core/__tests__/{broker-snapshot-history.test.d.ts → serial/broker-snapshot-history.test.d.ts} +0 -0
  654. /package/dist/core/__tests__/{command-plugins.test.d.ts → serial/command-plugins.test.d.ts} +0 -0
  655. /package/dist/core/__tests__/{deferred-no-wake.test.d.ts → serial/deferred-no-wake.test.d.ts} +0 -0
  656. /package/dist/core/__tests__/{flagship-lifecycle.test.d.ts → serial/flagship-lifecycle.test.d.ts} +0 -0
  657. /package/dist/core/__tests__/{host-teardown-process-group.test.d.ts → serial/host-teardown-process-group.test.d.ts} +0 -0
  658. /package/dist/core/__tests__/{human-deliver-e2e.test.d.ts → serial/human-deliver-e2e.test.d.ts} +0 -0
  659. /package/dist/core/__tests__/{live-mutation.test.d.ts → serial/live-mutation.test.d.ts} +0 -0
  660. /package/dist/core/__tests__/{refresh-stall-recycle.test.d.ts → serial/refresh-stall-recycle.test.d.ts} +0 -0
  661. /package/dist/core/__tests__/{revive.test.d.ts → serial/revive.test.d.ts} +0 -0
  662. /package/dist/core/__tests__/{spawn-root.test.d.ts → serial/spawn-root.test.d.ts} +0 -0
  663. /package/dist/core/__tests__/{subscription-delivery.test.d.ts → serial/subscription-delivery.test.d.ts} +0 -0
  664. /package/dist/core/__tests__/{tmux-surface.test.d.ts → serial/tmux-surface.test.d.ts} +0 -0
  665. /package/dist/core/__tests__/{worktree.test.d.ts → serial/worktree.test.d.ts} +0 -0
  666. /package/dist/{clients/attach/__tests__/markdown-headings.test.d.ts → core/__tests__/watchdog-abort-arms-retry.test.d.ts} +0 -0
  667. /package/dist/{clients/attach/__tests__/session-identity-refresh.test.d.ts → core/broker-client/__tests__/transport-socket.test.d.ts} +0 -0
  668. /package/dist/core/human/__tests__/{inbox-core.test.d.ts → serial/inbox-core.test.d.ts} +0 -0
  669. /package/dist/{clients/inbox/review/__tests__/remap.test.d.ts → daemon/api/__tests__/node-model-validation.test.d.ts} +0 -0
  670. /package/dist/{clients/surfaces/region.js → daemon/api/__tests__/review-terminal-conflict.test.d.ts} +0 -0
  671. /package/dist/daemon/api/__tests__/{full → seam}/api-server.test.d.ts +0 -0
  672. /package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.d.ts +0 -0
  673. /package/dist/{clients/web/__tests__/push-engine.test.d.ts → daemon/api/__tests__/seam/leaf-api-parity.test.d.ts} +0 -0
@@ -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
  });