@north-light/crouter 0.3.311 → 0.3.313

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 (520) hide show
  1. package/dist/api/client.d.ts +27 -30
  2. package/dist/api/client.js +80 -67
  3. package/dist/api/dto/broker-ops.d.ts +10 -20
  4. package/dist/api/dto/canvas.d.ts +1 -10
  5. package/dist/api/dto/health.d.ts +113 -0
  6. package/dist/api/dto/human-requests.d.ts +14 -3
  7. package/dist/api/dto/human.d.ts +2 -48
  8. package/dist/api/dto/human.js +3 -2
  9. package/dist/api/dto/inbox.d.ts +14 -0
  10. package/dist/api/dto/mail.d.ts +43 -0
  11. package/dist/api/dto/nodes.d.ts +11 -8
  12. package/dist/api/dto/recovery.d.ts +96 -0
  13. package/dist/api/dto/reviews.d.ts +2 -2
  14. package/dist/api/routes.d.ts +9 -6
  15. package/dist/api/routes.js +11 -11
  16. package/dist/build-root.d.ts +4 -0
  17. package/dist/build-root.js +11 -1
  18. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/integration/provider-rotation.test.ts +35 -47
  19. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.d.ts +1 -1
  20. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.js +12 -5
  21. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +12 -5
  22. package/dist/cli.js +10 -1
  23. package/dist/clients/__tests__/helpers/human-daemon.d.ts +11 -0
  24. package/dist/clients/__tests__/helpers/human-daemon.js +60 -0
  25. package/dist/clients/attach/chrome/canvas-panels.js +1 -1
  26. package/dist/clients/attach/chrome/inbox-strip.d.ts +3 -3
  27. package/dist/clients/attach/chrome/inbox-strip.js +17 -9
  28. package/dist/clients/attach/chrome/ticket-panel.d.ts +2 -2
  29. package/dist/clients/attach/chrome/ticket-panel.js +77 -46
  30. package/dist/clients/attach/overlays/graph.js +6 -9
  31. package/dist/clients/attach/render/chat-view.d.ts +5 -4
  32. package/dist/clients/attach/render/chat-view.js +22 -13
  33. package/dist/clients/attach/render/page-block.d.ts +11 -7
  34. package/dist/clients/attach/render/page-block.js +64 -55
  35. package/dist/clients/attach/viewer.js +746 -735
  36. package/dist/clients/inbox/__tests__/integration/inbox-controller.test.js +56 -56
  37. package/dist/clients/inbox/__tests__/integration/stale-row-activation.test.js +45 -32
  38. package/dist/clients/inbox/controller.d.ts +42 -14
  39. package/dist/clients/inbox/controller.js +240 -124
  40. package/dist/clients/inbox/dto-adapt.d.ts +28 -0
  41. package/dist/clients/inbox/dto-adapt.js +93 -0
  42. package/dist/clients/inbox/page-adapter.d.ts +5 -4
  43. package/dist/clients/inbox/page-adapter.js +12 -12
  44. package/dist/clients/inbox/resolve.d.ts +10 -5
  45. package/dist/clients/inbox/resolve.js +13 -12
  46. package/dist/clients/inbox/review/review-client.d.ts +0 -1
  47. package/dist/clients/inbox/review/review-client.js +0 -4
  48. package/dist/clients/inbox/review-adapter.d.ts +2 -1
  49. package/dist/clients/inbox/review-adapter.js +3 -5
  50. package/dist/clients/inbox/surface.d.ts +2 -2
  51. package/dist/clients/inbox/surface.js +19 -8
  52. package/dist/clients/inbox/tui.d.ts +3 -3
  53. package/dist/commands/__tests__/human.test.js +31 -15
  54. package/dist/commands/__tests__/integration/dashboard-snapshot.test.js +36 -11
  55. package/dist/commands/{sys/__tests__ → __tests__/integration}/migrate.test.js +142 -36
  56. package/dist/commands/__tests__/revive-now-gate.test.js +2 -0
  57. package/dist/commands/api-client.d.ts +5 -4
  58. package/dist/commands/api-client.js +13 -7
  59. package/dist/commands/canvas-history/shared.js +1 -1
  60. package/dist/commands/canvas-history.js +1 -1
  61. package/dist/commands/canvas-roster.js +1 -1
  62. package/dist/commands/canvas.js +1 -2
  63. package/dist/commands/human/feedback.js +20 -17
  64. package/dist/commands/human/prompts.js +45 -36
  65. package/dist/commands/human/queue.js +73 -123
  66. package/dist/commands/human/review.js +6 -16
  67. package/dist/commands/memory/__tests__/command-selector-and-mutation-guards.test.js +2 -0
  68. package/dist/commands/memory/__tests__/memory-list-and-lint-ignore.test.js +2 -0
  69. package/dist/commands/memory/__tests__/repository-root-lint.test.js +2 -0
  70. package/dist/commands/node-inspect-artifacts.js +1 -1
  71. package/dist/commands/node-lifecycle-revive.d.ts +2 -2
  72. package/dist/commands/node-lifecycle-revive.js +9 -19
  73. package/dist/commands/pkg/plugin-manage.js +0 -1
  74. package/dist/commands/profile/show.js +4 -12
  75. package/dist/commands/surface-tmux-spread.js +1 -5
  76. package/dist/commands/sys/__tests__/config-model-ladders.test.js +23 -30
  77. package/dist/commands/sys/__tests__/sync-project-guidance.test.js +37 -11
  78. package/dist/commands/sys/branch.d.ts +2 -0
  79. package/dist/commands/sys/branch.js +19 -0
  80. package/dist/commands/sys/config.js +106 -33
  81. package/dist/commands/sys/daemon.d.ts +2 -0
  82. package/dist/commands/sys/daemon.js +130 -7
  83. package/dist/commands/sys/doctor.js +5 -15
  84. package/dist/commands/sys/migrate.js +21 -92
  85. package/dist/commands/sys/setup-settings-runner.js +4 -2
  86. package/dist/commands/sys.js +2 -15
  87. package/dist/core/__tests__/boot-fault-attempt.test.js +23 -1
  88. package/dist/core/__tests__/boot.test.js +32 -25
  89. package/dist/core/__tests__/broker-launch-candidates.test.js +49 -0
  90. package/dist/core/__tests__/canvas-inbox-watcher-hold.test.js +149 -176
  91. package/dist/core/__tests__/canvas-inbox-watcher-naming.test.js +59 -10
  92. package/dist/core/__tests__/canvas-inbox-watcher.test.js +76 -20
  93. package/dist/core/__tests__/canvas.test.js +18 -47
  94. package/dist/core/__tests__/child-death-wake.test.js +29 -7
  95. package/dist/core/__tests__/cli-help-contract.test.js +2 -0
  96. package/dist/core/__tests__/close.test.js +29 -10
  97. package/dist/core/__tests__/collectible.test.js +2 -1
  98. package/dist/core/__tests__/config-change-delta.test.js +2 -0
  99. package/dist/core/__tests__/context-intro.test.js +17 -5
  100. package/dist/core/__tests__/cron-armed-context-failure.test.js +17 -12
  101. package/dist/core/__tests__/cron-held-settlement.test.js +21 -3
  102. package/dist/core/__tests__/cron-node-sink-parked-root.test.js +29 -10
  103. package/dist/core/__tests__/cron-self-cancel-delivery.test.js +14 -2
  104. package/dist/core/__tests__/cron-timeout-descendants.test.js +13 -1
  105. package/dist/core/__tests__/daemon-boot.test.js +51 -14
  106. package/dist/core/__tests__/fixtures/fake-engine.d.ts +1 -1
  107. package/dist/core/__tests__/fixtures/fake-engine.js +8 -3
  108. package/dist/core/__tests__/focuses.test.js +10 -5
  109. package/dist/core/__tests__/helpers/harness.js +50 -18
  110. package/dist/core/__tests__/history-inbox.test.js +12 -16
  111. package/dist/core/__tests__/human-action-delivery.test.js +48 -28
  112. package/dist/core/__tests__/human-actions.test.js +7 -3
  113. package/dist/core/__tests__/inline-memory-refs.test.js +7 -2
  114. package/dist/core/__tests__/integration/broker-fork-seam.test.js +37 -10
  115. package/dist/core/__tests__/integration/broker-sdk-wiring.test.js +42 -0
  116. package/dist/core/__tests__/integration/broker-snapshot-history.test.js +42 -29
  117. package/dist/core/__tests__/integration/broker-wedge-supervision.test.js +36 -35
  118. package/dist/core/__tests__/integration/command-plugins.test.js +15 -6
  119. package/dist/core/__tests__/integration/deferred-no-wake.test.js +113 -92
  120. package/dist/core/__tests__/integration/host-teardown-process-group.test.js +9 -5
  121. package/dist/core/__tests__/integration/lifecycle-hooks.test.js +312 -1
  122. package/dist/core/__tests__/integration/plugin-revalidate.test.js +4 -0
  123. package/dist/core/__tests__/integration/profile-pause.test.js +4 -4
  124. package/dist/core/__tests__/integration/refresh-stall-recycle.test.js +9 -12
  125. package/dist/core/__tests__/integration/revive.test.js +67 -21
  126. package/dist/core/__tests__/integration/spawn-root.test.js +62 -19
  127. package/dist/core/__tests__/integration/subscription-delivery.test.js +33 -21
  128. package/dist/core/__tests__/integration/worktree-land.test.js +5 -2
  129. package/dist/core/__tests__/integration/worktree-reap.test.js +15 -1
  130. package/dist/core/__tests__/kickoff.test.js +36 -39
  131. package/dist/core/__tests__/lifecycle-terminal-reasons.test.js +2 -1
  132. package/dist/core/__tests__/lifecycle.test.js +2 -1
  133. package/dist/core/__tests__/live-lifecycle-prompt.test.js +13 -1
  134. package/dist/core/__tests__/memory-resolver-precedence.test.js +2 -0
  135. package/dist/core/__tests__/migration.test.js +145 -31
  136. package/dist/core/__tests__/model-pin-durability.test.js +4 -1
  137. package/dist/core/__tests__/model-routes-config.test.js +13 -5
  138. package/dist/core/__tests__/node-outcome.test.js +93 -26
  139. package/dist/core/__tests__/on-read-crouter-home-fence.test.js +4 -3
  140. package/dist/core/__tests__/on-read-dedup-resume.test.js +8 -7
  141. package/dist/core/__tests__/on-read-nested-store.test.js +8 -7
  142. package/dist/core/__tests__/passive-subscription.test.js +50 -157
  143. package/dist/core/__tests__/plugin-kinds.test.js +6 -4
  144. package/dist/core/__tests__/plugin-link-symlinked-scope-root.test.js +6 -1
  145. package/dist/core/__tests__/plugin-page-components.test.js +6 -4
  146. package/dist/core/__tests__/preview-registry-sync.test.js +2 -0
  147. package/dist/core/__tests__/profile-project-memory-delivery.test.js +35 -32
  148. package/dist/core/__tests__/prune.test.js +11 -5
  149. package/dist/core/__tests__/push-final-guard.test.js +14 -7
  150. package/dist/core/__tests__/relaunch-root.test.js +30 -2
  151. package/dist/core/__tests__/remote-canvas-target.test.js +7 -1
  152. package/dist/core/__tests__/repository-root-identity.test.js +4 -0
  153. package/dist/core/__tests__/review-model-floor.test.js +6 -3
  154. package/dist/core/__tests__/revive-all.test.js +13 -3
  155. package/dist/core/__tests__/revive-capacity.test.js +26 -4
  156. package/dist/core/__tests__/revive-parked-fresh.test.js +31 -8
  157. package/dist/core/__tests__/seam/broker-attach-stream.test.js +1 -1
  158. package/dist/core/__tests__/seam/broker-cap-freeze.test.js +4 -3
  159. package/dist/core/__tests__/seam/broker-crash-teardown.test.js +11 -14
  160. package/dist/core/__tests__/seam/broker-provider-retry.test.js +85 -71
  161. package/dist/core/__tests__/seam/dormancy-release.test.js +33 -19
  162. package/dist/core/__tests__/seam/held-deferred-human-prompt.test.js +7 -5
  163. package/dist/core/__tests__/seam/inbox-reference-guidance.test.js +20 -6
  164. package/dist/core/__tests__/seam/node-outcome-delivery.test.js +27 -3
  165. package/dist/core/__tests__/spawn-worktree-id-conflict.test.js +5 -4
  166. package/dist/core/__tests__/stop-guard.test.js +2 -1
  167. package/dist/core/__tests__/subscription-pool-credential-guard.test.js +4 -3
  168. package/dist/core/__tests__/warm-claim-preference-snapshot.test.js +19 -5
  169. package/dist/core/__tests__/yield-ensures-daemon.test.js +2 -1
  170. package/dist/core/bootstrap.js +2 -0
  171. package/dist/core/broker-client/__tests__/transport-socket.test.js +51 -6
  172. package/dist/core/broker-client/transport-socket.d.ts +1 -0
  173. package/dist/core/broker-client/transport-socket.js +13 -5
  174. package/dist/core/canvas/__tests__/attention.test.js +29 -35
  175. package/dist/core/canvas/__tests__/history-transcript.test.js +6 -6
  176. package/dist/core/canvas/__tests__/render-remote.test.js +25 -9
  177. package/dist/core/canvas/attention.d.ts +2 -5
  178. package/dist/core/canvas/attention.js +15 -64
  179. package/dist/core/canvas/boot.d.ts +6 -7
  180. package/dist/core/canvas/boot.js +5 -9
  181. package/dist/core/canvas/canvas.d.ts +13 -109
  182. package/dist/core/canvas/canvas.js +140 -401
  183. package/dist/core/canvas/crons.d.ts +2 -0
  184. package/dist/core/canvas/crons.js +16 -15
  185. package/dist/core/canvas/daemon-owner.js +10 -0
  186. package/dist/core/canvas/db.d.ts +2 -2
  187. package/dist/core/canvas/db.js +2 -18
  188. package/dist/core/canvas/deliveries.d.ts +104 -0
  189. package/dist/core/canvas/deliveries.js +354 -0
  190. package/dist/core/canvas/executions.d.ts +29 -0
  191. package/dist/core/canvas/executions.js +68 -0
  192. package/dist/core/canvas/history.js +35 -35
  193. package/dist/core/canvas/index.d.ts +3 -1
  194. package/dist/core/canvas/index.js +3 -1
  195. package/dist/core/canvas/migrations.js +20 -12
  196. package/dist/core/canvas/nav-model.js +1 -3
  197. package/dist/core/canvas/nav-render.d.ts +4 -4
  198. package/dist/core/canvas/nav-render.js +11 -21
  199. package/dist/core/canvas/node-sql-migration.d.ts +3 -0
  200. package/dist/core/canvas/node-sql-migration.js +261 -0
  201. package/dist/core/canvas/paths.d.ts +2 -16
  202. package/dist/core/canvas/paths.js +2 -31
  203. package/dist/core/canvas/recovery.d.ts +76 -0
  204. package/dist/core/canvas/recovery.js +588 -0
  205. package/dist/core/canvas/remote-canvas-source.js +4 -0
  206. package/dist/core/canvas/render-source.d.ts +16 -27
  207. package/dist/core/canvas/render-source.js +16 -45
  208. package/dist/core/canvas/sessions.d.ts +33 -0
  209. package/dist/core/canvas/sessions.js +78 -0
  210. package/dist/core/canvas/types.d.ts +33 -33
  211. package/dist/core/canvas/types.js +2 -5
  212. package/dist/core/canvas/waits.d.ts +18 -0
  213. package/dist/core/canvas/waits.js +70 -0
  214. package/dist/core/canvas/worktrees.d.ts +40 -0
  215. package/dist/core/canvas/worktrees.js +93 -0
  216. package/dist/core/command-hooks/artifact.d.ts +6 -0
  217. package/dist/core/command-hooks/artifact.js +22 -6
  218. package/dist/core/command-hooks/discovery.d.ts +2 -0
  219. package/dist/core/command-hooks/discovery.js +2 -0
  220. package/dist/core/command-hooks/lifecycle-catalog.d.ts +20 -2
  221. package/dist/core/command-hooks/lifecycle-catalog.js +7 -2
  222. package/dist/core/command-hooks/lifecycle-create.d.ts +4 -0
  223. package/dist/core/command-hooks/lifecycle-create.js +51 -0
  224. package/dist/core/command-hooks/schema.d.ts +2 -2
  225. package/dist/core/command-hooks/schema.js +5 -4
  226. package/dist/core/command-hooks/transport/exec-invoke.js +3 -1
  227. package/dist/core/command-hooks/transport/exec-lifecycle.d.ts +18 -8
  228. package/dist/core/command-hooks/transport/exec-lifecycle.js +89 -30
  229. package/dist/core/config.d.ts +17 -12
  230. package/dist/core/config.js +106 -155
  231. package/dist/core/errors.d.ts +1 -0
  232. package/dist/core/errors.js +4 -0
  233. package/dist/core/feed/__tests__/inbox-migrate.test.js +27 -31
  234. package/dist/core/feed/feed.d.ts +0 -6
  235. package/dist/core/feed/feed.js +68 -56
  236. package/dist/core/feed/inbox.d.ts +7 -81
  237. package/dist/core/feed/inbox.js +46 -378
  238. package/dist/core/feed/messages.d.ts +58 -0
  239. package/dist/core/feed/messages.js +217 -0
  240. package/dist/core/fs-utils.d.ts +4 -0
  241. package/dist/core/fs-utils.js +21 -1
  242. package/dist/core/human/answer.d.ts +1 -1
  243. package/dist/core/human/answer.js +1 -1
  244. package/dist/core/human/claim.d.ts +1 -1
  245. package/dist/core/human/claim.js +2 -4
  246. package/dist/core/human/component-docs.js +1 -1
  247. package/dist/core/human/feedback-companion.js +4 -3
  248. package/dist/core/human/feedback.d.ts +5 -8
  249. package/dist/core/human/feedback.js +57 -85
  250. package/dist/core/human/page-authoring.d.ts +30 -0
  251. package/dist/core/human/page-authoring.js +19 -0
  252. package/dist/core/human/requests.d.ts +136 -0
  253. package/dist/core/human/requests.js +515 -0
  254. package/dist/core/human/root.d.ts +0 -7
  255. package/dist/core/human/root.js +0 -17
  256. package/dist/core/human/scan.d.ts +2 -7
  257. package/dist/core/human/scan.js +48 -132
  258. package/dist/core/human/summary.d.ts +1 -1
  259. package/dist/core/human/summary.js +1 -1
  260. package/dist/core/human/tickets.d.ts +23 -83
  261. package/dist/core/human/tickets.js +92 -243
  262. package/dist/core/human/types.d.ts +5 -1
  263. package/dist/core/installed-plugins.js +8 -3
  264. package/dist/core/keybindings/__tests__/resolve.test.js +19 -17
  265. package/dist/core/locked-file.d.ts +6 -3
  266. package/dist/core/locked-file.js +36 -9
  267. package/dist/core/memory/extensions.js +2 -0
  268. package/dist/core/preview-registry.js +0 -1
  269. package/dist/core/profiles/__tests__/env-store.test.js +2 -0
  270. package/dist/core/profiles/default-binding.d.ts +0 -4
  271. package/dist/core/profiles/default-binding.js +12 -58
  272. package/dist/core/profiles/env-store.js +8 -3
  273. package/dist/core/profiles/manifest.d.ts +2 -37
  274. package/dist/core/profiles/manifest.js +35 -161
  275. package/dist/core/profiles/select.js +3 -0
  276. package/dist/core/review/__tests__/capture-origin.test.js +13 -2
  277. package/dist/core/review/__tests__/comments.test.js +28 -10
  278. package/dist/core/review/__tests__/remap.test.js +28 -10
  279. package/dist/core/review/__tests__/stage-identity.test.js +17 -7
  280. package/dist/core/review/birth.d.ts +1 -1
  281. package/dist/core/review/birth.js +34 -5
  282. package/dist/core/review/comments.js +1 -1
  283. package/dist/core/review/companion.d.ts +1 -1
  284. package/dist/core/review/companion.js +2 -2
  285. package/dist/core/review/document.js +1 -1
  286. package/dist/core/review/project.d.ts +5 -1
  287. package/dist/core/review/project.js +14 -36
  288. package/dist/core/review/realize.d.ts +3 -6
  289. package/dist/core/review/realize.js +51 -168
  290. package/dist/core/review/remap.js +1 -1
  291. package/dist/core/review/stage.d.ts +3 -2
  292. package/dist/core/review/stage.js +2 -3
  293. package/dist/core/review/store.d.ts +3 -21
  294. package/dist/core/review/store.js +140 -186
  295. package/dist/core/review/types.d.ts +0 -1
  296. package/dist/core/runtime/__tests__/install-id-cache-scoping.test.js +9 -5
  297. package/dist/core/runtime/__tests__/spawn-env.test.js +8 -9
  298. package/dist/core/runtime/broker/auth-reload.js +9 -10
  299. package/dist/core/runtime/broker/daemon-ops.d.ts +25 -8
  300. package/dist/core/runtime/broker/daemon-ops.js +42 -9
  301. package/dist/core/runtime/broker/extension-abort.d.ts +3 -0
  302. package/dist/core/runtime/broker/extension-abort.js +11 -0
  303. package/dist/core/runtime/broker/fault-retry.d.ts +15 -6
  304. package/dist/core/runtime/broker/fault-retry.js +142 -95
  305. package/dist/core/runtime/broker/inbox.d.ts +4 -32
  306. package/dist/core/runtime/broker/inbox.js +4 -92
  307. package/dist/core/runtime/broker/rebind.d.ts +1 -0
  308. package/dist/core/runtime/broker/rebind.js +21 -12
  309. package/dist/core/runtime/broker-persona-guidance.d.ts +1 -1
  310. package/dist/core/runtime/broker-persona-guidance.js +2 -13
  311. package/dist/core/runtime/broker.js +28 -22
  312. package/dist/core/runtime/close.d.ts +3 -9
  313. package/dist/core/runtime/close.js +16 -27
  314. package/dist/core/runtime/fault.d.ts +3 -93
  315. package/dist/core/runtime/fault.js +9 -419
  316. package/dist/core/runtime/kickoff.d.ts +3 -6
  317. package/dist/core/runtime/kickoff.js +12 -18
  318. package/dist/core/runtime/launch.js +1 -1
  319. package/dist/core/runtime/lifecycle.js +40 -7
  320. package/dist/core/runtime/nodes.d.ts +5 -1
  321. package/dist/core/runtime/nodes.js +26 -11
  322. package/dist/core/runtime/placement.js +2 -2
  323. package/dist/core/runtime/recycle.js +24 -14
  324. package/dist/core/runtime/reset.js +26 -7
  325. package/dist/core/runtime/revive.js +226 -217
  326. package/dist/core/runtime/spawn.d.ts +4 -1
  327. package/dist/core/runtime/spawn.js +43 -5
  328. package/dist/core/runtime/warm-pool.d.ts +2 -2
  329. package/dist/core/runtime/warm-pool.js +23 -3
  330. package/dist/core/scoped-state/db.d.ts +7 -0
  331. package/dist/core/scoped-state/db.js +92 -0
  332. package/dist/core/scoped-state/migrate.d.ts +11 -0
  333. package/dist/core/scoped-state/migrate.js +198 -0
  334. package/dist/core/scoped-state/paths.d.ts +9 -0
  335. package/dist/core/scoped-state/paths.js +27 -0
  336. package/dist/core/scoped-state/profiles.d.ts +12 -0
  337. package/dist/core/scoped-state/profiles.js +62 -0
  338. package/dist/core/scoped-state/providers.d.ts +16 -0
  339. package/dist/core/scoped-state/providers.js +8 -0
  340. package/dist/core/scoped-state/schema.d.ts +3 -0
  341. package/dist/core/scoped-state/schema.js +26 -0
  342. package/dist/core/scoped-state/settings.d.ts +28 -0
  343. package/dist/core/scoped-state/settings.js +82 -0
  344. package/dist/core/subscription-state.d.ts +29 -48
  345. package/dist/core/subscription-state.js +176 -712
  346. package/dist/core/worktree-close.js +4 -4
  347. package/dist/core/worktree-mutation-async.js +2 -2
  348. package/dist/core/worktree-sweep.js +11 -16
  349. package/dist/core/worktree.js +6 -12
  350. package/dist/daemon/__tests__/autostart-storm.test.js +1 -39
  351. package/dist/daemon/__tests__/helpers/source-daemon.d.ts +2 -2
  352. package/dist/daemon/__tests__/helpers/source-daemon.js +7 -6
  353. package/dist/daemon/__tests__/integration/migration-startup.test.js +59 -26
  354. package/dist/daemon/__tests__/node-deadline-lane.test.js +2 -1
  355. package/dist/daemon/__tests__/node-outcome-birth-invariants.test.js +41 -17
  356. package/dist/daemon/__tests__/node-outcome-delivery.test.js +39 -10
  357. package/dist/daemon/__tests__/reconciler-signature.test.js +2 -2
  358. package/dist/daemon/__tests__/subtree-filter-freshness.test.js +2 -2
  359. package/dist/daemon/api/__tests__/broker-settle-park.test.js +17 -12
  360. package/dist/daemon/api/__tests__/canvas-snapshot-fields.test.js +27 -5
  361. package/dist/daemon/api/__tests__/model-config.test.js +8 -8
  362. package/dist/daemon/api/__tests__/node-create-description.test.js +22 -5
  363. package/dist/daemon/api/__tests__/node-model-validation.test.js +21 -1
  364. package/dist/daemon/api/__tests__/nodes-activity-query.test.js +10 -12
  365. package/dist/daemon/api/__tests__/profile-launch-gates.test.js +6 -3
  366. package/dist/daemon/api/__tests__/profile-metadata-route.test.js +4 -1
  367. package/dist/daemon/api/__tests__/reopen-delivery.test.js +26 -8
  368. package/dist/daemon/api/__tests__/seam/api-server.test.js +24 -32
  369. package/dist/daemon/api/__tests__/seam/b10-attach-modelauth.test.js +4 -1
  370. package/dist/daemon/api/__tests__/seam/leaf-api-parity.test.js +5 -4
  371. package/dist/daemon/api/__tests__/seam/profile-delete.test.js +29 -43
  372. package/dist/daemon/api/__tests__/submit-result.test.js +3 -2
  373. package/dist/daemon/api/bridge.js +1 -1
  374. package/dist/daemon/api/handlers/bash-jobs.js +6 -7
  375. package/dist/daemon/api/handlers/broker-ops.js +47 -84
  376. package/dist/daemon/api/handlers/broker-recovery.d.ts +4 -0
  377. package/dist/daemon/api/handlers/broker-recovery.js +251 -0
  378. package/dist/daemon/api/handlers/canvas.js +2 -44
  379. package/dist/daemon/api/handlers/daemon.js +41 -0
  380. package/dist/daemon/api/handlers/feedback-comments.js +2 -2
  381. package/dist/daemon/api/handlers/health.js +10 -5
  382. package/dist/daemon/api/handlers/human-requests.js +168 -188
  383. package/dist/daemon/api/handlers/human.js +3 -148
  384. package/dist/daemon/api/handlers/inbox-page.d.ts +4 -0
  385. package/dist/daemon/api/handlers/inbox-page.js +89 -0
  386. package/dist/daemon/api/handlers/inbox.js +21 -120
  387. package/dist/daemon/api/handlers/messages.d.ts +1 -0
  388. package/dist/daemon/api/handlers/messages.js +73 -15
  389. package/dist/daemon/api/handlers/node-outcomes.js +58 -13
  390. package/dist/daemon/api/handlers/nodes.d.ts +1 -0
  391. package/dist/daemon/api/handlers/nodes.js +41 -42
  392. package/dist/daemon/api/handlers/reviews.js +4 -29
  393. package/dist/daemon/api/map.d.ts +25 -3
  394. package/dist/daemon/api/map.js +84 -14
  395. package/dist/daemon/api/server.js +68 -9
  396. package/dist/daemon/control.d.ts +18 -0
  397. package/dist/daemon/cron/disposition.d.ts +2 -0
  398. package/dist/daemon/cron/disposition.js +8 -5
  399. package/dist/daemon/cron/settle.js +37 -13
  400. package/dist/daemon/cron/sinks.d.ts +18 -1
  401. package/dist/daemon/cron/sinks.js +47 -93
  402. package/dist/daemon/crtrd-cli.js +4 -19
  403. package/dist/daemon/crtrd.d.ts +2 -0
  404. package/dist/daemon/crtrd.js +206 -81
  405. package/dist/daemon/fleet.js +5 -6
  406. package/dist/daemon/human/finish.d.ts +12 -24
  407. package/dist/daemon/human/finish.js +88 -285
  408. package/dist/daemon/human/settle.d.ts +40 -0
  409. package/dist/daemon/human/settle.js +89 -0
  410. package/dist/daemon/human/sweep.d.ts +20 -5
  411. package/dist/daemon/human/sweep.js +56 -60
  412. package/dist/daemon/manage.d.ts +21 -16
  413. package/dist/daemon/manage.js +85 -51
  414. package/dist/daemon/messaging/node-message.d.ts +1 -1
  415. package/dist/daemon/messaging/node-message.js +9 -12
  416. package/dist/daemon/park-activity.js +3 -3
  417. package/dist/daemon/reconcilers/bash-deadline.js +6 -7
  418. package/dist/daemon/reconcilers/broker-supervision.d.ts +1 -1
  419. package/dist/daemon/reconcilers/broker-supervision.js +41 -19
  420. package/dist/daemon/reconcilers/controller-death.js +6 -18
  421. package/dist/daemon/reconcilers/delivery-lane.d.ts +9 -0
  422. package/dist/daemon/reconcilers/delivery-lane.js +130 -0
  423. package/dist/daemon/reconcilers/live-obligation.js +3 -3
  424. package/dist/daemon/reconcilers/node-deadline.js +1 -1
  425. package/dist/daemon/reconcilers/node-lifecycle/freeze-lane.d.ts +1 -1
  426. package/dist/daemon/reconcilers/node-lifecycle/freeze-lane.js +10 -12
  427. package/dist/daemon/reconcilers/node-lifecycle/tick.js +5 -5
  428. package/dist/daemon/reconcilers/node-lifecycle/wants-execution.js +1 -1
  429. package/dist/daemon/reconcilers/pending-review-submit.js +3 -3
  430. package/dist/daemon/reconcilers/storage-maintenance.d.ts +2 -8
  431. package/dist/daemon/reconcilers/storage-maintenance.js +13 -43
  432. package/dist/daemon/review/companion.js +5 -11
  433. package/dist/daemon/review/deliver.d.ts +1 -5
  434. package/dist/daemon/review/deliver.js +3 -52
  435. package/dist/daemon/review/finish.d.ts +2 -27
  436. package/dist/daemon/review/finish.js +79 -263
  437. package/dist/daemon/review/sweep.d.ts +3 -10
  438. package/dist/daemon/review/sweep.js +13 -131
  439. package/dist/daemon/startup-policy.d.ts +0 -5
  440. package/dist/daemon/startup-policy.js +0 -5
  441. package/dist/hook-authoring.d.ts +28 -2
  442. package/dist/hook-authoring.js +53 -1
  443. package/dist/index.d.ts +3 -2
  444. package/dist/index.js +1 -1
  445. package/dist/migrations/__tests__/activation-concurrency.test.js +3 -2
  446. package/dist/migrations/__tests__/activation.test.js +9 -6
  447. package/dist/migrations/activation.d.ts +3 -2
  448. package/dist/migrations/activation.js +2 -4
  449. package/dist/migrations/corpus.d.ts +2 -5
  450. package/dist/migrations/corpus.js +9 -20
  451. package/dist/migrations/runner.d.ts +3 -1
  452. package/dist/migrations/runner.js +6 -2
  453. package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +21 -89
  454. package/dist/pi-extensions/__tests__/canvas-goal-capture-envelope.test.js +4 -2
  455. package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +51 -33
  456. package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.js +16 -2
  457. package/dist/pi-extensions/__tests__/pre-command-gate.test.js +13 -1
  458. package/dist/pi-extensions/canvas-inbox-watcher.js +98 -244
  459. package/dist/pi-extensions/canvas-passive-context.d.ts +4 -8
  460. package/dist/pi-extensions/canvas-passive-context.js +85 -37
  461. package/dist/pi-extensions/canvas-stophook.js +47 -31
  462. package/dist/shared/env.d.ts +1 -0
  463. package/dist/shared/env.js +3 -0
  464. package/package.json +1 -1
  465. package/runtime.lock.json +5 -5
  466. package/dist/clients/attach/__tests__/page-block.test.js +0 -54
  467. package/dist/clients/inbox/review-visibility.d.ts +0 -5
  468. package/dist/clients/inbox/review-visibility.js +0 -19
  469. package/dist/commands/canvas-rebuild-index.d.ts +0 -2
  470. package/dist/commands/canvas-rebuild-index.js +0 -46
  471. package/dist/core/__tests__/human-cancel-guard.test.js +0 -110
  472. package/dist/core/__tests__/human-deliver.test.d.ts +0 -1
  473. package/dist/core/__tests__/human-deliver.test.js +0 -256
  474. package/dist/core/__tests__/human-node-not-supervised.test.d.ts +0 -1
  475. package/dist/core/__tests__/human-node-not-supervised.test.js +0 -89
  476. package/dist/core/__tests__/integration/human-deliver-e2e.test.d.ts +0 -1
  477. package/dist/core/__tests__/integration/human-deliver-e2e.test.js +0 -131
  478. package/dist/core/__tests__/phase4-review-store.test.d.ts +0 -1
  479. package/dist/core/__tests__/phase4-review-store.test.js +0 -144
  480. package/dist/core/__tests__/watchdog-abort-arms-retry.test.d.ts +0 -1
  481. package/dist/core/__tests__/watchdog-abort-arms-retry.test.js +0 -110
  482. package/dist/core/canvas/human-deliveries.d.ts +0 -39
  483. package/dist/core/canvas/human-deliveries.js +0 -75
  484. package/dist/core/canvas/node-outcome-deliveries.d.ts +0 -64
  485. package/dist/core/canvas/node-outcome-deliveries.js +0 -159
  486. package/dist/core/feed/passive.d.ts +0 -3
  487. package/dist/core/feed/passive.js +0 -53
  488. package/dist/core/human/__tests__/inbox-cancel-worker.d.ts +0 -1
  489. package/dist/core/human/__tests__/inbox-cancel-worker.js +0 -7
  490. package/dist/core/human/__tests__/inbox-claim-worker.d.ts +0 -1
  491. package/dist/core/human/__tests__/inbox-claim-worker.js +0 -17
  492. package/dist/core/human/__tests__/inbox-stale-claim-worker.d.ts +0 -1
  493. package/dist/core/human/__tests__/inbox-stale-claim-worker.js +0 -8
  494. package/dist/core/human/__tests__/integration/inbox-core.test.d.ts +0 -1
  495. package/dist/core/human/__tests__/integration/inbox-core.test.js +0 -145
  496. package/dist/core/human/__tests__/page-tickets.test.d.ts +0 -1
  497. package/dist/core/human/__tests__/page-tickets.test.js +0 -161
  498. package/dist/core/review/ticket-filter.d.ts +0 -17
  499. package/dist/core/review/ticket-filter.js +0 -21
  500. package/dist/core/runtime/broker/passive.d.ts +0 -17
  501. package/dist/core/runtime/broker/passive.js +0 -44
  502. package/dist/core/runtime/busy.d.ts +0 -46
  503. package/dist/core/runtime/busy.js +0 -150
  504. package/dist/daemon/__tests__/startup-block-marker.test.d.ts +0 -1
  505. package/dist/daemon/__tests__/startup-block-marker.test.js +0 -86
  506. package/dist/daemon/api/__tests__/review-terminal-conflict.test.d.ts +0 -1
  507. package/dist/daemon/api/__tests__/review-terminal-conflict.test.js +0 -98
  508. package/dist/daemon/human/deliver-action.d.ts +0 -3
  509. package/dist/daemon/human/deliver-action.js +0 -9
  510. package/dist/daemon/node-outcome/deliver-outcome.d.ts +0 -3
  511. package/dist/daemon/node-outcome/deliver-outcome.js +0 -9
  512. package/dist/daemon/reconcilers/human-delivery-lane.d.ts +0 -10
  513. package/dist/daemon/reconcilers/human-delivery-lane.js +0 -41
  514. package/dist/daemon/reconcilers/node-outcome-delivery-lane.d.ts +0 -10
  515. package/dist/daemon/reconcilers/node-outcome-delivery-lane.js +0 -41
  516. package/dist/daemon/startup-block-marker.d.ts +0 -25
  517. package/dist/daemon/startup-block-marker.js +0 -99
  518. /package/dist/{clients/attach/__tests__/page-block.test.d.ts → api/dto/mail.js} +0 -0
  519. /package/dist/{commands/sys/__tests__/migrate.test.d.ts → api/dto/recovery.js} +0 -0
  520. /package/dist/{core/__tests__/human-cancel-guard.test.d.ts → commands/__tests__/integration/migrate.test.d.ts} +0 -0
@@ -32,7 +32,9 @@ import { join } from 'node:path';
32
32
  import { spawnSync } from 'node:child_process';
33
33
  import { isDisconnected, TERMINAL_BY_CHOICE, listDisconnected } from '../runtime/revive-all.js';
34
34
  import { createNode } from '../canvas/canvas.js';
35
- import { closeDb } from '../canvas/db.js';
35
+ import { closeDb, migrate, openDb } from '../canvas/db.js';
36
+ import { beginExecution, recordExecutionPid } from '../canvas/executions.js';
37
+ import { bindSession } from '../canvas/sessions.js';
36
38
  const ALIVE = () => true;
37
39
  const DEAD = () => false;
38
40
  function meta(over = {}) {
@@ -105,6 +107,7 @@ function deadPid() {
105
107
  return r.pid ?? 0x7ffffffe;
106
108
  }
107
109
  function fabricate(id, over) {
110
+ const { pi_pid, pi_session_id = `uuid-${id}`, pi_session_file = null, ...node } = over;
108
111
  createNode({
109
112
  node_id: id,
110
113
  name: id,
@@ -115,9 +118,15 @@ function fabricate(id, over) {
115
118
  mode: 'base',
116
119
  lifecycle: 'terminal',
117
120
  status: 'active',
118
- pi_session_id: 'uuid-' + id,
119
- ...over,
121
+ ...node,
120
122
  });
123
+ const executionId = beginExecution(id, { daemonEpoch: 'test' });
124
+ if (pi_session_id !== null || pi_session_file !== null) {
125
+ assert.equal(bindSession(id, { executionId, sessionId: pi_session_id, transcriptPath: pi_session_file }), 'bound');
126
+ }
127
+ if (pi_pid !== null && pi_pid !== undefined) {
128
+ assert.equal(recordExecutionPid(executionId, id, pi_pid), 'recorded');
129
+ }
121
130
  closeDb();
122
131
  }
123
132
  before(() => {
@@ -127,6 +136,7 @@ before(() => {
127
136
  beforeEach(() => {
128
137
  closeDb();
129
138
  rmSync(home, { recursive: true, force: true });
139
+ migrate(openDb());
130
140
  });
131
141
  after(() => {
132
142
  closeDb();
@@ -15,7 +15,11 @@ import { tmpdir } from 'node:os';
15
15
  import { join } from 'node:path';
16
16
  import { createNode, getNode } from '../canvas/canvas.js';
17
17
  import { jobDir } from '../canvas/paths.js';
18
- import { closeDb } from '../canvas/db.js';
18
+ import { closeDb, migrate, openDb } from '../canvas/db.js';
19
+ import { resetSession } from '../canvas/sessions.js';
20
+ import { resetScopeCache } from '../scope.js';
21
+ import { closeScopedStores } from '../scoped-state/db.js';
22
+ import { initializeFreshScopedStore } from '../scoped-state/migrate.js';
19
23
  import { bindDaemonEventSource, resetEventSourceForTests } from '../events/source.js';
20
24
  import { resetFleetForTests } from '../runtime/fleet.js';
21
25
  import { CANVAS_EXTENSIONS } from '../runtime/canvas-extensions.js';
@@ -25,6 +29,7 @@ import { deliverNodeMessage } from '../../daemon/messaging/node-message.js';
25
29
  import { bindTestFleet } from './helpers/fleet.js';
26
30
  let home;
27
31
  let tf;
32
+ const previousHome = process.env['HOME'];
28
33
  let seq = 0;
29
34
  const originalLaunch = headlessBrokerHost.launch;
30
35
  /** The real host contract, minus the process: register at the launch seam, so
@@ -37,7 +42,7 @@ function stubLaunch() {
37
42
  };
38
43
  }
39
44
  function node(id, over = {}) {
40
- createNode({
45
+ const meta = {
41
46
  node_id: id,
42
47
  name: id,
43
48
  created: new Date().toISOString(),
@@ -48,7 +53,11 @@ function node(id, over = {}) {
48
53
  status: 'active',
49
54
  host_kind: 'broker',
50
55
  ...over,
51
- });
56
+ };
57
+ createNode(meta);
58
+ if (meta.pi_session_id != null) {
59
+ resetSession(id, { sessionId: meta.pi_session_id, transcriptPath: meta.pi_session_file ?? null });
60
+ }
52
61
  return id;
53
62
  }
54
63
  /** Fill the ledger to the cap with live brokers. */
@@ -59,12 +68,19 @@ async function saturate() {
59
68
  }
60
69
  before(() => {
61
70
  home = mkdtempSync(join(tmpdir(), 'crtr-revive-capacity-'));
62
- process.env['CRTR_HOME'] = home;
71
+ process.env['HOME'] = home;
72
+ process.env['CRTR_HOME'] = join(home, 'canvas');
63
73
  process.env['CRTR_MAX_LIVE_BROKERS'] = '2';
64
74
  resetEventSourceForTests();
65
75
  bindDaemonEventSource();
66
76
  });
67
77
  beforeEach(() => {
78
+ closeDb();
79
+ closeScopedStores();
80
+ rmSync(home, { recursive: true, force: true });
81
+ resetScopeCache();
82
+ initializeFreshScopedStore({ kind: 'user', root: join(home, '.crouter') });
83
+ migrate(openDb());
68
84
  tf = bindTestFleet();
69
85
  stubLaunch();
70
86
  });
@@ -74,9 +90,15 @@ after(() => {
74
90
  resetFleetForTests();
75
91
  resetEventSourceForTests();
76
92
  closeDb();
93
+ closeScopedStores();
77
94
  delete process.env['CRTR_MAX_LIVE_BROKERS'];
78
95
  delete process.env['CRTR_HOME'];
96
+ if (previousHome === undefined)
97
+ delete process.env['HOME'];
98
+ else
99
+ process.env['HOME'] = previousHome;
79
100
  rmSync(home, { recursive: true, force: true });
101
+ resetScopeCache();
80
102
  });
81
103
  test('a refusing caller gets an error naming the cap and the live count, never a silent no-op', async () => {
82
104
  await saturate();
@@ -11,9 +11,14 @@ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
11
11
  import { tmpdir } from 'node:os';
12
12
  import { join } from 'node:path';
13
13
  import { createNode, getNode } from '../canvas/canvas.js';
14
+ import { ensureScopeInitialized } from '../config.js';
15
+ import { closeScopedStores } from '../scoped-state/db.js';
14
16
  import { contextDir } from '../canvas/paths.js';
15
- import { closeDb } from '../canvas/db.js';
16
- import { appendInbox, readCursor, writeCursor } from '../feed/inbox.js';
17
+ import { closeDb, migrate, openDb } from '../canvas/db.js';
18
+ import { enqueueNodeMail } from '../feed/messages.js';
19
+ import { acknowledgeNodeMail, acknowledgedNodeMailCount, claimNodeMail } from '../canvas/deliveries.js';
20
+ import { beginExecution, endExecution } from '../canvas/executions.js';
21
+ import { bindSession } from '../canvas/sessions.js';
17
22
  import { transition } from '../runtime/lifecycle.js';
18
23
  import { reviveNode } from '../runtime/revive.js';
19
24
  import { headlessBrokerHost } from '../runtime/host.js';
@@ -21,6 +26,7 @@ import { resetFleetForTests } from '../runtime/fleet.js';
21
26
  import { bindTestFleet } from './helpers/fleet.js';
22
27
  let home;
23
28
  let priorHome;
29
+ let priorUserHome;
24
30
  let fleet;
25
31
  let launches;
26
32
  let originalLaunch;
@@ -42,6 +48,9 @@ function parkResident(id, ground = {}) {
42
48
  pi_session_file: sessionFile,
43
49
  };
44
50
  createNode(meta);
51
+ const executionId = beginExecution(id, { daemonEpoch: 'test' });
52
+ assert.equal(bindSession(id, { executionId, sessionId: meta.pi_session_id, transcriptPath: sessionFile }), 'bound');
53
+ endExecution(executionId, { reason: 'parked test setup' });
45
54
  mkdirSync(contextDir(id), { recursive: true });
46
55
  if (ground.roadmap !== undefined)
47
56
  writeFileSync(join(contextDir(id), 'roadmap.md'), ground.roadmap);
@@ -52,7 +61,7 @@ function parkResident(id, ground = {}) {
52
61
  /** Durable wake-worthy mail, appended exactly as every message doorway appends
53
62
  * it before calling reviveNode. */
54
63
  function deliverMail(id, tier = 'normal') {
55
- return appendInbox(id, { from: null, tier, kind: 'message', label: 'work', data: { body: 'work' } }).entry_id;
64
+ return enqueueNodeMail(id, { kind: 'message', label: 'work', bodyJson: { body: 'work' }, urgency: tier, wake: 1 });
56
65
  }
57
66
  /** Did this launch carry the fresh-revive kickoff? `buildReviveKickoff` always
58
67
  * opens its card body with this sentence (src/core/runtime/kickoff.ts:325). */
@@ -67,12 +76,16 @@ function placements() {
67
76
  before(() => {
68
77
  home = mkdtempSync(join(tmpdir(), 'crtr-revive-parked-'));
69
78
  priorHome = process.env['CRTR_HOME'];
79
+ priorUserHome = process.env['HOME'];
70
80
  process.env['CRTR_HOME'] = home;
81
+ process.env['HOME'] = home;
71
82
  });
72
83
  beforeEach(() => {
73
84
  closeDb();
74
85
  rmSync(home, { recursive: true, force: true });
75
86
  mkdirSync(home, { recursive: true });
87
+ ensureScopeInitialized('user', join(home, '.crouter'));
88
+ migrate(openDb());
76
89
  resetFleetForTests();
77
90
  fleet = bindTestFleet();
78
91
  launches = [];
@@ -87,6 +100,7 @@ beforeEach(() => {
87
100
  afterEach(() => {
88
101
  headlessBrokerHost.launch = originalLaunch;
89
102
  closeDb();
103
+ closeScopedStores();
90
104
  resetFleetForTests();
91
105
  });
92
106
  after(() => {
@@ -95,6 +109,10 @@ after(() => {
95
109
  delete process.env['CRTR_HOME'];
96
110
  else
97
111
  process.env['CRTR_HOME'] = priorHome;
112
+ if (priorUserHome === undefined)
113
+ delete process.env['HOME'];
114
+ else
115
+ process.env['HOME'] = priorUserHome;
98
116
  });
99
117
  test('a parked node with mail waiting resumes its main transcript and clears the marker', async () => {
100
118
  parkResident('parked', { roadmap: '# Roadmap\n\n- one open item\n' });
@@ -120,7 +138,7 @@ test('an input-less revival of a parked node quietly resumes and injects no kick
120
138
  assert.equal(result.resumed, true, 'nothing arrived, so there is nothing a fresh window would answer');
121
139
  assert.deepEqual(placements(), [{ nodeId: 'quiet', resuming: true }]);
122
140
  assert.equal(kickedOff(launches[0]), false, 'a quiet resume generates nothing');
123
- assert.equal(readCursor('quiet'), undefined, 'drainBearings did not run, so nothing was consumed');
141
+ assert.equal(acknowledgedNodeMailCount('quiet'), 0, 'a quiet resume does not acknowledge mail');
124
142
  const reopened = getNode('quiet');
125
143
  assert.equal(reopened.status, 'active');
126
144
  assert.equal(reopened.intent ?? null, null, 'the park marker clears on a quiet resume too');
@@ -130,12 +148,17 @@ test('deferred mail alone is not input, so the revival still resumes quietly', a
130
148
  deliverMail('deferred', 'deferred');
131
149
  assert.equal((await reviveNode('deferred', { resume: true, capacity: 'freeze' })).resumed, true);
132
150
  assert.equal(kickedOff(launches[0]), false);
133
- assert.equal(readCursor('deferred'), undefined, 'the deferred entry rides the next natural cycle, unconsumed');
151
+ assert.equal(acknowledgedNodeMailCount('deferred'), 0, 'the deferred delivery rides the next natural cycle, unacknowledged');
134
152
  });
135
- test('mail already covered by the cursor is not input, so the revival still resumes quietly', async () => {
153
+ test('mail already acknowledged by an earlier execution is not input, so the revival still resumes quietly', async () => {
136
154
  parkResident('stale', { roadmap: '# Roadmap\n\n- one open item\n' });
137
- writeCursor('stale', deliverMail('stale'));
138
- assert.equal((await reviveNode('stale', { resume: true, capacity: 'freeze' })).resumed, true, 'only the UNSEEN suffix counts as input');
155
+ const delivery = deliverMail('stale');
156
+ const executionId = beginExecution('stale', { daemonEpoch: 'test' });
157
+ const claim = claimNodeMail('stale', executionId, 'wake');
158
+ assert.equal(claim.deliveries.length, 1, 'the earlier execution claims the delivery');
159
+ assert.deepEqual(acknowledgeNodeMail('stale', executionId, [{ deliveryId: delivery.deliveryId, attempts: claim.deliveries[0].attempts, disposition: 'acknowledged' }]).results, [{ deliveryId: delivery.deliveryId, outcome: 'acknowledged' }], 'the prior handoff has an explicit SQL acknowledgement');
160
+ endExecution(executionId, { reason: 'test complete' });
161
+ assert.equal((await reviveNode('stale', { resume: true, capacity: 'freeze' })).resumed, true, 'only pending wake deliveries count as input');
139
162
  assert.equal(kickedOff(launches[0]), false);
140
163
  });
141
164
  test('a parked node with no goal and no roadmap resumes its transcript rather than waking amnesiac', async () => {
@@ -65,7 +65,7 @@ const brokerPid = () => h.node(id).pi_pid;
65
65
  // engine AND the streaming AgentSessionEvents are fanned out to the client
66
66
  // VERBATIM. Failure mode: a broken relay/fan-out (viewer sees nothing).
67
67
  test('G1 — controller prompt runs the engine and the streamed AgentSessionEvents relay to the client', async () => {
68
- const c = await ctrl('g1-ctrl');
68
+ const c = await attachUntil(id, 'controller', 'g1-ctrl', (a) => a.welcome.role === 'controller' && a.welcome.snapshot.state.isStreaming === false, 'G1 controller admitted while the engine is idle');
69
69
  assert.equal(c.welcome.role, 'controller', 'first controller is admitted as controller');
70
70
  const token = tok('G1-PROMPT');
71
71
  c.send({ type: 'prompt', text: token });
@@ -14,8 +14,9 @@ import { after, before, test } from 'node:test';
14
14
  import assert from 'node:assert/strict';
15
15
  import { createNode } from '../../canvas/canvas.js';
16
16
  import { closeDb } from '../../canvas/db.js';
17
+ import { resetSession } from '../../canvas/sessions.js';
17
18
  import { isPidAlive } from '../../canvas/pid.js';
18
- import { appendInbox } from '../../feed/inbox.js';
19
+ import { enqueueNodeMail } from '../../feed/messages.js';
19
20
  import { closeNode } from '../../runtime/close.js';
20
21
  import { headlessBrokerHost } from '../../runtime/host.js';
21
22
  import { transition } from '../../runtime/lifecycle.js';
@@ -116,7 +117,7 @@ test('a birth at the cap freezes instead of booting, survives saturated ticks, a
116
117
  await h.awaitFleetExit(second);
117
118
  const filler = await h.spawnHeadlessChild(root, 'terminal thaw filler');
118
119
  assert.equal(h.fleet.size(), 2, 'the parked target is non-live while the cap remains full');
119
- appendInbox(second, { from: root, tier: 'normal', kind: 'message', label: 'durable wake' });
120
+ enqueueNodeMail(second, { senderNodeId: root, kind: 'message', label: 'durable wake', urgency: 'normal', wake: 1 });
120
121
  assert.equal((await reviveNode(second, { resume: true, capacity: 'freeze' })).outcome, 'frozen');
121
122
  closeDb();
122
123
  const frozenTerminal = h.node(second);
@@ -142,8 +143,8 @@ test('a birth at the cap freezes instead of booting, survives saturated ticks, a
142
143
  host_kind: 'broker',
143
144
  parent: root,
144
145
  created: new Date().toISOString(),
145
- pi_session_id: 'resident-drain-session',
146
146
  });
147
+ resetSession('resident-drain', { sessionId: 'resident-drain-session', transcriptPath: null });
147
148
  assert.equal((await reviveNode('resident-drain', { resume: true, capacity: 'freeze' })).outcome, 'frozen');
148
149
  await h.tick();
149
150
  closeDb();
@@ -2,8 +2,8 @@
2
2
  //
3
3
  // Daemon-epoch broker ownership, real-process crash and teardown. The broker's
4
4
  // supervision tick is the death authority after the broker exit is observed: a SIGTERM of a streaming broker
5
- // aborts cleanly and resumes the saved session with a continuation, and a
6
- // SIGKILL mid-turn — no certificate, only the durable busy marker — resumes
5
+ // aborts cleanly and resumes the saved session, and a
6
+ // SIGKILL mid-turn — with the durable open-turn record — resumes
7
7
  // that same saved session in place and re-drives the stopped turn with the
8
8
  // same continuation (both policy row 5). Each replacement starts only after the
9
9
  // prior process has exited, preserving one writer per session. A clean `node
@@ -23,9 +23,8 @@ import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
23
23
  import { join } from 'node:path';
24
24
  import { createHarness } from '../helpers/harness.js';
25
25
  import { isPidAlive } from '../../canvas/pid.js';
26
- import { markBusy } from '../../runtime/busy.js';
26
+ import { readLiveTurn } from '../../canvas/recovery.js';
27
27
  import { RUNTIME_RESTART_CONTINUATION } from '../../runtime/kickoff.js';
28
- import { jobDir } from '../../canvas/paths.js';
29
28
  let h;
30
29
  let root;
31
30
  let priorHoldTurn;
@@ -44,24 +43,23 @@ after(async () => {
44
43
  process.env['PI_FAKE_ENGINE_HOLD_TURN'] = priorHoldTurn;
45
44
  });
46
45
  // Items 4 + 5 + 6 — two independent real-process journeys:
47
- // graceful busy teardown → strict resume + continuation;
46
+ // graceful busy teardown → strict resume;
48
47
  // dirty interrupted-turn crash → recovery cycle → close.
49
- test('SIGTERM of a busy broker aborts cleanly and resumes with a continuation', { timeout: 30_000 }, async () => {
48
+ test('SIGTERM of a busy broker aborts cleanly and resumes the saved session', { timeout: 30_000 }, async () => {
50
49
  const id = await h.spawnHeadlessChild(root, 'headless worker — graceful crash recovery');
51
50
  const boot1 = await h.awaitBoot(id);
52
51
  const oldPid = h.node(id).pi_pid;
53
52
  assert.equal(oldPid, boot1.pid, 'canvas pid identifies the broker that booted the session');
54
53
  assert.equal(isPidAlive(oldPid), true, 'busy broker alive before graceful teardown');
55
54
  await h.waitFor(() => existsSync(h.brokerSock(id)), { label: 'broker socket bound' });
56
- await h.waitFor(() => existsSync(join(jobDir(id), 'busy')), { label: 'fixture turn is active before SIGTERM' });
55
+ await h.waitFor(() => readLiveTurn(id)?.busy === true, { label: 'fixture turn is active before SIGTERM' });
57
56
  assert.equal(h.node(id).intent ?? null, null, 'fresh broker has a null intent (not refresh/idle-release)');
58
57
  const boots = h.bootCount(id);
59
58
  // SIGTERM exercises broker.ts's bounded session.abort() path. Its REAL child
60
- // exit leaves the broker-written clean-abort certificate; the supervision tick
59
+ // exit closes the broker's durable turn as teardown-aborted; the supervision tick
61
60
  // classifies it and persists the first-failure backoff.
62
61
  process.kill(oldPid, 'SIGTERM');
63
62
  await h.waitFor(() => !isPidAlive(oldPid), { label: 'gracefully torn-down broker pid is dead' });
64
- assert.equal(existsSync(join(jobDir(id), 'clean-abort')), true, 'settled abort leaves durable clean-abort evidence before supervision classifies it');
65
63
  await h.awaitFleetExit(id);
66
64
  await h.tick();
67
65
  const gracefulBackoff = h.node(id);
@@ -73,7 +71,6 @@ test('SIGTERM of a busy broker aborts cleanly and resumes with a continuation',
73
71
  // matures on a supervision tick.
74
72
  const boot2 = await h.awaitBoot(id, { minCount: boots + 1, timeoutMs: 25_000 });
75
73
  assert.equal(boot2.resuming, true, 'clean-abort tick-driven recovery RESUMES the saved .jsonl');
76
- assert.equal(boot2.prompt, RUNTIME_RESTART_CONTINUATION, 'the strict resume injects the runtime-restart continuation');
77
74
  assert.ok(!boot2.rawArgv.includes('--crtr-new-cycle'), 'clean abort never starts a recovery cycle');
78
75
  const revivedPid = h.node(id).pi_pid;
79
76
  assert.ok(revivedPid != null && isPidAlive(revivedPid), 'the revived broker pid is alive');
@@ -87,12 +84,12 @@ test('SIGKILL of a busy broker resumes the interrupted turn in place; close tear
87
84
  const busyPid = h.node(id).pi_pid;
88
85
  assert.equal(busyPid, boot1.pid, 'canvas pid identifies the broker that owns the dirty-crash session');
89
86
  assert.equal(isPidAlive(busyPid), true, 'busy broker is alive before SIGKILL');
90
- // This broker has only the durable busy marker — SIGKILL cannot run the abort
91
- // handler or write clean-abort evidence. The saved transcript is still
87
+ // This broker has an open durable turn — SIGKILL cannot run the abort handler
88
+ // to close it. The saved transcript is still
92
89
  // resumable (pi persists whole entries), so policy resumes it strictly and
93
90
  // the respawn continuation re-drives the stopped turn, after this journey's
94
91
  // first 5s backoff. A dirty death is not a reason to throw the branch away.
95
- markBusy(id);
92
+ await h.waitFor(() => readLiveTurn(id)?.busy === true, { label: 'fixture turn is active before SIGKILL' });
96
93
  process.kill(busyPid, 'SIGKILL');
97
94
  await h.waitFor(() => !isPidAlive(busyPid), { label: 'mid-turn crashed broker pid is dead' });
98
95
  await h.awaitFleetExit(id);
@@ -107,7 +104,7 @@ test('SIGKILL of a busy broker resumes the interrupted turn in place; close tear
107
104
  // path, including a cycle; production distinguishes cycling with the argv
108
105
  // token and non-null kickoff. Assert those load-bearing inputs directly.
109
106
  const recoveryArgv = boot2.rawArgv;
110
- assert.ok(!recoveryArgv.includes('--crtr-new-cycle'), 'a surviving busy marker resumes the saved session — it never opens a fresh cycle');
107
+ assert.ok(!recoveryArgv.includes('--crtr-new-cycle'), 'a surviving open turn resumes the saved session — it never opens a fresh cycle');
111
108
  assert.equal(boot2.prompt, RUNTIME_RESTART_CONTINUATION, 'the strict resume injects the runtime-restart continuation that re-drives the interrupted turn');
112
109
  const recoveryPid = h.node(id).pi_pid;
113
110
  assert.ok(recoveryPid != null && isPidAlive(recoveryPid), 'the recovered broker pid is alive');