@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
@@ -1,9 +1,8 @@
1
1
  import { envNodeId } from '../../shared/env.js';
2
2
  import { randomUUID } from 'node:crypto';
3
- import { join, resolve } from 'node:path';
3
+ import { resolve } from 'node:path';
4
4
  import { defineBranch, defineLeaf } from '../../core/command.js';
5
5
  import { InputError } from '../../core/io.js';
6
- import { ticketDir } from '../../core/human/root.js';
7
6
  import { cliClient } from '../api-client.js';
8
7
  function nodeActor() {
9
8
  const nodeId = envNodeId();
@@ -85,42 +84,33 @@ const humanReviewNew = defineLeaf({
85
84
  params: [
86
85
  { kind: 'positional', name: 'file', type: 'path', required: true, constraint: 'Document or source file to review. Resolved to an absolute path; the daemon validates that it is readable reviewable text.' },
87
86
  { kind: 'flag', name: 'subtitle', type: 'string', required: true, constraint: 'One plain-English sentence stating the review needed and why it matters.' },
88
- { kind: 'flag', name: 'output', type: 'path', required: false, constraint: 'Where the immutable approval result JSON is projected. Default: <dir>/feedback.json.' },
89
87
  ],
90
88
  output: [
91
- { name: 'job_id', type: 'string', required: true, constraint: 'Ticket bridge node id. The approval is pushed to its origin when the person submits.' },
92
- { name: 'dir', type: 'string', required: true, constraint: 'Interaction directory holding the ticket projection and default approval result.' },
93
- { name: 'output', type: 'string', required: true, constraint: 'Path where the immutable approval result JSON is projected.' },
94
89
  { name: 'review_id', type: 'string', required: true, constraint: 'Daemon-owned review id for the document, comments, and companion.' },
90
+ { name: 'review_dir', type: 'string', required: true, constraint: 'Directory containing the staged review and immutable result.json.' },
91
+ { name: 'result_path', type: 'string', required: true, constraint: 'The immutable terminal result path: <review_dir>/result.json.' },
95
92
  { name: 'follow_up', type: 'string', required: true, constraint: 'The review remains live for the person and companion; approval is delivered to the origin inbox.' },
96
93
  ],
97
94
  outputKind: 'object',
98
95
  effects: [
99
- 'The daemon creates the ticket bridge, durable review, and companion session fork.',
96
+ 'The daemon creates the durable review and companion session fork.',
100
97
  'The reviewed file remains live in the attach viewer; this command does not submit an approval.',
101
98
  ],
102
99
  },
103
100
  run: async (input) => {
104
101
  const file = resolve(input['file']);
105
102
  const subtitle = requireSubtitle(input['subtitle']);
106
- const outputArg = input['output'];
107
- const output = typeof outputArg === 'string' ? resolve(outputArg) : undefined;
108
103
  const review = await cliClient().createReview({
109
104
  origin_kind: 'ticket',
110
105
  origin_node_id: requireOriginNode(),
111
106
  file,
112
107
  idempotency_key: randomUUID(),
113
108
  subtitle,
114
- ...(output === undefined ? {} : { output_path: output }),
115
109
  });
116
- if (review.bridge_node_id === null)
117
- throw new Error('ticket review was created without a bridge node');
118
- const dir = ticketDir(review.bridge_node_id);
119
110
  return {
120
- job_id: review.bridge_node_id,
121
- dir,
122
- output: output ?? join(dir, 'feedback.json'),
123
111
  review_id: review.review_id,
112
+ review_dir: review.review_dir,
113
+ result_path: `${review.review_dir}/result.json`,
124
114
  follow_up: 'The review is live for the person in the attach viewer with its companion agent. Approval is pushed to the origin inbox when submitted.',
125
115
  };
126
116
  },
@@ -20,6 +20,7 @@ import { join } from 'node:path';
20
20
  import { resetScopeCache } from '../../../core/scope.js';
21
21
  import { closeDb } from '../../../core/canvas/db.js';
22
22
  import { createProfile, profileMemoryDir } from '../../../core/profiles/manifest.js';
23
+ import { initializeFreshScopedStore } from '../../../core/scoped-state/migrate.js';
23
24
  import { openProjectMemoryStore } from '../../../core/memory-resolver.js';
24
25
  import { appendHistoryRecord, buildHistoryRecord, readHistoryRecords } from '../../../core/memory/history.js';
25
26
  import { CrtrError } from '../../../core/errors.js';
@@ -74,6 +75,7 @@ beforeEach(() => {
74
75
  process.env['CRTR_HOME'] = canvasHome;
75
76
  delete process.env['CRTR_NODE_ID'];
76
77
  mkdirSync(join(home, '.crouter', 'memory'), { recursive: true });
78
+ initializeFreshScopedStore({ kind: 'user', root: join(home, '.crouter') });
77
79
  root = join(base, 'root');
78
80
  child = join(root, 'child');
79
81
  nestedWrite = join(root, 'nested-write');
@@ -6,6 +6,7 @@ import { join } from 'node:path';
6
6
  import { parseFrontmatterGeneric } from '../../../core/frontmatter.js';
7
7
  import { resetScopeCache } from '../../../core/scope.js';
8
8
  import { CrtrError } from '../../../core/errors.js';
9
+ import { initializeFreshScopedStore } from '../../../core/scoped-state/migrate.js';
9
10
  import { editLeaf } from '../edit.js';
10
11
  import { listLeaf } from '../list.js';
11
12
  import { writeLeaf } from '../write.js';
@@ -16,6 +17,7 @@ const canvasHome = mkdtempSync(join(tmpdir(), 'crtr-memory-list-canvas-'));
16
17
  mkdirSync(join(home, '.crouter', 'memory'), { recursive: true });
17
18
  process.env['HOME'] = home;
18
19
  process.env['CRTR_HOME'] = canvasHome;
20
+ initializeFreshScopedStore({ kind: 'user', root: join(home, '.crouter') });
19
21
  function writeMemory(name, frontmatter = 'kind: knowledge') {
20
22
  writeFileSync(join(home, '.crouter', 'memory', name), `---\n${frontmatter}\n---\n\nBODY\n`, 'utf8');
21
23
  }
@@ -12,6 +12,7 @@ import { closeDb } from '../../../core/canvas/db.js';
12
12
  import { lintMemoryStore, lintMemoryTarget } from '../../../core/memory/lint.js';
13
13
  import { openProjectMemoryStore } from '../../../core/memory-resolver.js';
14
14
  import { createProfile } from '../../../core/profiles/manifest.js';
15
+ import { initializeFreshScopedStore } from '../../../core/scoped-state/migrate.js';
15
16
  import { resetScopeCache } from '../../../core/scope.js';
16
17
  let home;
17
18
  let canvasHome;
@@ -54,6 +55,7 @@ beforeEach(() => {
54
55
  delete process.env['CRTR_PROFILE_ID'];
55
56
  delete process.env['CRTR_NODE_ID'];
56
57
  mkdirSync(join(home, '.crouter', 'memory'), { recursive: true });
58
+ initializeFreshScopedStore({ kind: 'user', root: join(home, '.crouter') });
57
59
  resetScopeCache();
58
60
  });
59
61
  after(() => {
@@ -39,7 +39,7 @@ export const nodeArtifactsLeaf = defineLeaf({
39
39
  summary: 'list one node\'s artifacts (reports + context docs) as refs ready for `canvas history read`',
40
40
  params: [
41
41
  { kind: 'positional', name: 'node-id', required: true, constraint: 'The node whose artifacts to list.' },
42
- { kind: 'flag', name: 'type', type: 'enum', choices: [...TYPES], required: false, constraint: 'Narrow to one corpus: report | doc | roadmap | inbox. Default: report, doc, roadmap (inbox is opt-in only — the node\'s raw inbox.jsonl history, cursor-independent and including full un-clipped direct-message bodies; a diagnostic surface, not curated past work).' },
42
+ { kind: 'flag', name: 'type', type: 'enum', choices: [...TYPES], required: false, constraint: 'Narrow to one corpus: report | doc | roadmap | inbox. Default: report, doc, roadmap (inbox is opt-in only — the node\'s inbox history including full un-clipped direct-message bodies; a diagnostic surface, not curated past work).' },
43
43
  { kind: 'flag', name: 'sort', type: 'enum', choices: ['recency', 'oldest'], required: false, constraint: 'Order by artifact timestamp. Default recency.' },
44
44
  ],
45
45
  output: [
@@ -1,5 +1,5 @@
1
1
  import type { LeafDef } from '../core/command.js';
2
- import type { Fault } from '../core/runtime/fault.js';
2
+ import type { NodeFaultDTO } from '../api/dto/nodes.js';
3
3
  /** --now eligibility for a live, non-busy fault: a daemon-owned AUTO retry
4
4
  * (kick it early instead of waiting out the schedule), or any fault the
5
5
  * canvas dashboard flags "needs you" (`faultNeedsYou`, status-glyph.ts) — the
@@ -8,5 +8,5 @@ import type { Fault } from '../core/runtime/fault.js';
8
8
  * (redialing) already in flight, and refuses any OTHER link — notably a
9
9
  * `daemon→node` wedge fault, which --now can't clear (SIGTERM doesn't touch
10
10
  * the runaway subprocess; see `wedged-child-on-runaway-bash`). */
11
- export declare function isNowEligibleFault(fault: Fault | null): boolean;
11
+ export declare function isNowEligibleFault(fault: NodeFaultDTO | null): boolean;
12
12
  export declare const nodeReviveLeaf: LeafDef;
@@ -15,8 +15,6 @@
15
15
  // The mass-recovery form — reconnect EVERY disconnected node at once after a
16
16
  // reboot/crash — is genuinely graph-wide and stays at `canvas revive --all`
17
17
  // (src/commands/revive.ts).
18
- import { existsSync } from 'node:fs';
19
- import { join } from 'node:path';
20
18
  import { defineLeaf } from '../core/command.js';
21
19
  import { InputError } from '../core/io.js';
22
20
  import { cliClient, rethrowAsCliError } from './api-client.js';
@@ -25,17 +23,16 @@ import { cliClient, rethrowAsCliError } from './api-client.js';
25
23
  // accessors — a `crtr` CLI process never opens canvas.db. So the revive itself
26
24
  // goes through the daemon (`cliClient().reviveNode`), and every helper below is
27
25
  // imported from a db-free module: `recordedPidLiveness` (pid.js → fs/ps only),
28
- // `readFault` (fault.js → paths.js pure helpers + events), `faultNeedsYou`
29
- // (status-glyph.js → fault.js), and `fullName` from labels.js DIRECTLY (NOT the
30
- // canvas barrel `index.js`, which re-exports `openDb`). `jobDir` is a pure path
31
- // helper, and view-socket readiness comes from the db-free probe owner. The former
32
- // direct `reviveNode`/`getNode`/`assertReopenGate`/`waitForBrokerViewSocket`/`isBusy`
26
+ // `faultNeedsYou` (status-glyph.js → fault.js), and `fullName` from labels.js
27
+ // DIRECTLY (NOT the canvas barrel `index.js`, which re-exports `openDb`).
28
+ // View-socket readiness comes from the db-free probe owner. The node's active
29
+ // fault and mid-turn state are projected fields on the detail DTO this leaf
30
+ // already fetches. The former direct
31
+ // `reviveNode`/`getNode`/`assertReopenGate`/`waitForBrokerViewSocket`/`isBusy`
33
32
  // imports all reached the db barrel and are replaced by the client call + helpers below.
34
33
  import { recordedPidLiveness } from '../core/canvas/pid.js';
35
- import { readFault } from '../core/runtime/fault.js';
36
34
  import { fullName } from '../core/canvas/labels.js';
37
35
  import { faultNeedsYou } from '../core/canvas/status-glyph.js';
38
- import { jobDir } from '../core/canvas/paths.js';
39
36
  import { waitForViewSocketReady } from '../core/runtime/view-socket.js';
40
37
  /** --now eligibility for a live, non-busy fault: a daemon-owned AUTO retry
41
38
  * (kick it early instead of waiting out the schedule), or any fault the
@@ -52,13 +49,6 @@ export function isNowEligibleFault(fault) {
52
49
  return true;
53
50
  return fault.retry.by === 'daemon';
54
51
  }
55
- // Local, db-free helpers (inlined so the leaf never imports the canvas barrel)
56
- /** Inlined from `runtime/busy.ts` (which reaches the canvas barrel via `jobDir`):
57
- * is the node mid-turn right now? `<jobDir>/busy` exists for the span pi is
58
- * inside a run. `jobDir` here is the pure path helper from paths.js. */
59
- function nodeIsBusy(nodeId) {
60
- return existsSync(join(jobDir(nodeId), 'busy'));
61
- }
62
52
  export const nodeReviveLeaf = defineLeaf({
63
53
  name: 'revive',
64
54
  description: 'reopen a window for a done/idle/dead/canceled node',
@@ -157,7 +147,7 @@ export const nodeReviveLeaf = defineLeaf({
157
147
  rethrowAsCliError(e);
158
148
  }
159
149
  const pid = detail.pi_pid;
160
- const stall = readFault(nodeId);
150
+ const stall = detail.fault ?? null;
161
151
  if (pid == null || recordedPidLiveness(pid, detail.pi_pid_identity ?? null) !== 'alive') {
162
152
  throw new InputError({
163
153
  error: 'not_hanging',
@@ -173,9 +163,9 @@ export const nodeReviveLeaf = defineLeaf({
173
163
  });
174
164
  }
175
165
  // The daemon never kills a BUSY engine (its verdict paths all return 'leave'
176
- // on a live busy marker): a node mid-turn is making progress, not wedged —
166
+ // on an open turn): a node mid-turn is making progress, not wedged —
177
167
  // refuse rather than SIGTERM it mid-flight.
178
- if (nodeIsBusy(nodeId)) {
168
+ if (detail.streaming === true) {
179
169
  throw new InputError({
180
170
  error: 'busy',
181
171
  message: `${nodeId} is mid-turn right now (busy) — --now refuses to SIGTERM a working engine; it has recovered on its own.`,
@@ -199,7 +199,6 @@ function migratePluginMemory(manifest, root, scope, where, ownership) {
199
199
  }],
200
200
  targets: [],
201
201
  blockers: [],
202
- nodeMetadata: { available: true, nodes: 0 },
203
202
  };
204
203
  const load = () => {
205
204
  const { snapshots, skipped } = loadCorpusSnapshots(discovery);
@@ -1,15 +1,12 @@
1
- import { existsSync } from 'node:fs';
2
- import { join } from 'node:path';
3
1
  import { defineLeaf } from '../../core/command.js';
4
2
  import { resolveProfileOperand, profileRoot, sanitizeProfileMetadata } from '../../core/profiles/manifest.js';
5
- import { CONFIG_FILE } from '../../types.js';
6
3
  export const showLeaf = defineLeaf({
7
4
  name: 'show',
8
5
  description: "one profile's manifest in full",
9
6
  whenToUse: "you need a profile's full project list, home directory, id, and timestamps — after `profile list` narrows to a name, to find where its nodes will run, or to inspect what a node's bearings named as its profile.",
10
7
  help: {
11
8
  name: 'profile show',
12
- summary: "print one profile's manifest plus its on-disk path and config.json location",
9
+ summary: "print one profile's manifest and on-disk path",
13
10
  params: [
14
11
  {
15
12
  kind: 'positional',
@@ -29,16 +26,13 @@ export const showLeaf = defineLeaf({
29
26
  { name: 'created_at', type: 'string', required: true, constraint: 'ISO 8601 creation timestamp.' },
30
27
  { name: 'last_used_at', type: 'string | null', required: true, constraint: 'ISO 8601 timestamp of the most recent selection, or null if never selected.' },
31
28
  { name: 'path', type: 'string', required: true, constraint: 'Absolute path to the profile directory.' },
32
- { name: 'config_path', type: 'string', required: true, constraint: 'Absolute path to the profile\'s config.json (hand-edited the same way as user/project config.json — no profile-specific editor verb exists).' },
33
- { name: 'config_exists', type: 'boolean', required: true, constraint: 'Whether config.json exists at that path yet.' },
34
- { name: 'follow_up', type: 'string', required: true, constraint: 'Concrete next commands.' },
29
+ { name: 'follow_up', type: 'string', required: true, constraint: 'Concrete next commands, including the SQL-backed raw settings surface.' },
35
30
  ],
36
31
  outputKind: 'object',
37
32
  effects: ['None. Read-only.'],
38
33
  },
39
34
  run: async (input) => {
40
35
  const { profileId, manifest } = resolveProfileOperand(input['profile']);
41
- const configPath = join(profileRoot(profileId), CONFIG_FILE);
42
36
  return {
43
37
  profile_id: profileId,
44
38
  name: manifest.name,
@@ -50,11 +44,9 @@ export const showLeaf = defineLeaf({
50
44
  created_at: manifest.created_at,
51
45
  last_used_at: manifest.last_used_at,
52
46
  path: profileRoot(profileId),
53
- config_path: configPath,
54
- config_exists: existsSync(configPath),
55
47
  follow_up: manifest.paused_at === null
56
- ? `Manage its purview and automatic memory disclosure with \`crtr profile project add ${profileId} --dir <path> --memory <none|name|preview|content>\`, pause it with \`crtr profile pause ${profileId}\`, or set its default kind with \`crtr profile kind ${profileId} <kind>\`.`
57
- : `Manage its purview and automatic memory disclosure with \`crtr profile project add ${profileId} --dir <path> --memory <none|name|preview|content>\`, or resume it with \`crtr profile resume ${profileId}\`.`,
48
+ ? `Inspect its SQL-backed settings with \`crtr sys config get-raw --scope profile --profile ${profileId}\`; manage its purview with \`crtr profile project add ${profileId} --dir <path> --memory <none|name|preview|content>\`, pause it with \`crtr profile pause ${profileId}\`, or set its default kind with \`crtr profile kind ${profileId} <kind>\`.`
49
+ : `Inspect its SQL-backed settings with \`crtr sys config get-raw --scope profile --profile ${profileId}\`; manage its purview with \`crtr profile project add ${profileId} --dir <path> --memory <none|name|preview|content>\`, or resume it with \`crtr profile resume ${profileId}\`.`,
58
50
  };
59
51
  },
60
52
  });
@@ -49,11 +49,7 @@ async function climbRootViaSource(source, self) {
49
49
  }
50
50
  /** Hard ceiling on panes in the spread window (self + up to 7 siblings). */
51
51
  const PANE_CAP = 8;
52
- /** Recency key for ranking: the mtime of a node's job/telemetry.json — rewritten
53
- * on every turn_end at a DETERMINISTIC node-id-derived path (unlike pi_session_file,
54
- * whose path lives in meta.json and is NOT projected by the API's NodeMeta). This
55
- * is the same last-activity proxy the dashboard recency sort uses; a node that
56
- * never ran a turn (no telemetry) sorts last (0). Local statSync, openDb-free. */
52
+ /** Telemetry mtime approximates last activity; nodes without telemetry sort last. */
57
53
  function sessionMtime(nodeId) {
58
54
  try {
59
55
  const st = statSync(join(jobDir(nodeId), 'telemetry.json'), { throwIfNoEntry: false });
@@ -1,8 +1,8 @@
1
1
  // config-model-ladders.test.ts — regression coverage for the live Hearth
2
- // incident where a home's config.json had `openai-codex/gpt-5.6-*` baked into
2
+ // incident where a home's stored config had `openai-codex/gpt-5.6-*` baked into
3
3
  // `modelLadders` while the guest's own installed model registry only had
4
4
  // `gpt-5.5`. Root cause: both `ensureScopeInitialized` (fresh scope) and
5
- // `sys config set modelLadders...` (a targeted edit) persisted the FULLY
5
+ // `sys config set modelLadders...` (a targeted edit) persisted the fully
6
6
  // materialized ladder (all 4 strengths x 2 providers) rather than only the
7
7
  // genuine override, freezing whatever concrete model ids happened to be
8
8
  // compiled into the crouter build that ran at that moment. A later
@@ -10,10 +10,10 @@
10
10
  // reach the frozen rungs again.
11
11
  import { test, before, after, beforeEach, afterEach } from 'node:test';
12
12
  import assert from 'node:assert/strict';
13
- import { mkdtempSync, rmSync, readFileSync, existsSync } from 'node:fs';
13
+ import { mkdtempSync, rmSync } from 'node:fs';
14
14
  import { tmpdir } from 'node:os';
15
15
  import { join } from 'node:path';
16
- import { ensureScopeInitialized, readConfig, updateConfig } from '../../../core/config.js';
16
+ import { ensureScopeInitialized, readConfig, readRawScopeConfig, updateConfig } from '../../../core/config.js';
17
17
  import { configBranch } from '../config.js';
18
18
  function leaf(name) {
19
19
  const found = (configBranch.children ?? []).find((c) => c.name === name);
@@ -41,16 +41,13 @@ after(() => {
41
41
  else
42
42
  delete process.env['HOME'];
43
43
  });
44
- test('ensureScopeInitialized does NOT bake concrete modelLadders model ids into a fresh config.json', () => {
44
+ test('ensureScopeInitialized does NOT bake concrete modelLadders model ids into a fresh scoped store', () => {
45
45
  const root = join(home, '.crouter');
46
46
  ensureScopeInitialized('user', root);
47
- const cfgPath = join(root, 'config.json');
48
- assert.equal(existsSync(cfgPath), true);
49
- const raw = JSON.parse(readFileSync(cfgPath, 'utf8'));
50
- // The file must exist (so `sys config path` has something to point at) but
51
- // must NOT freeze a modelLadders snapshot -- that key should be absent so
52
- // `readConfig` always re-derives it live from whichever build is running.
53
- assert.equal(raw.modelLadders, undefined);
47
+ const raw = readRawScopeConfig('user');
48
+ // A fresh store has no settings row until a caller writes an override, so
49
+ // `readConfig` always re-derives the ladder from the running build.
50
+ assert.equal(raw?.modelLadders, undefined);
54
51
  // readConfig must still default-fill a full, usable ladder despite the
55
52
  // omission -- a config-less scope is never worse off.
56
53
  const cfg = readConfig('user');
@@ -61,17 +58,16 @@ test('sys config set modelLadders.<provider>.<strength> persists ONLY the touche
61
58
  const root = join(home, '.crouter');
62
59
  ensureScopeInitialized('user', root);
63
60
  await leaf('set').run({ key: 'modelLadders.openai.strong', value: 'openai-codex/gpt-5.5:high' });
64
- const cfgPath = join(root, 'config.json');
65
- const raw = JSON.parse(readFileSync(cfgPath, 'utf8'));
66
- assert.equal(raw.modelLadders.openai.strong, 'openai-codex/gpt-5.5:high');
61
+ const raw = readRawScopeConfig('user');
62
+ assert.equal(raw.modelLadders?.openai?.strong, 'openai-codex/gpt-5.5:high');
67
63
  // The other three openai rungs, and the entire anthropic ladder, must stay
68
64
  // UNSET on disk -- baking them in would freeze this scope to today's
69
65
  // compiled defaults for rungs the user never touched, the exact staleness
70
66
  // bug that produced the live `gpt-5.6` vs. installed-`gpt-5.5` mismatch.
71
- assert.equal(raw.modelLadders.openai.ultra, undefined);
72
- assert.equal(raw.modelLadders.openai.medium, undefined);
73
- assert.equal(raw.modelLadders.openai.light, undefined);
74
- assert.equal(raw.modelLadders.anthropic, undefined);
67
+ assert.equal(raw.modelLadders?.openai?.ultra, undefined);
68
+ assert.equal(raw.modelLadders?.openai?.medium, undefined);
69
+ assert.equal(raw.modelLadders?.openai?.light, undefined);
70
+ assert.equal(raw.modelLadders?.anthropic, undefined);
75
71
  // readConfig still resolves a full ladder: the one override layered over
76
72
  // live compiled defaults for everything else.
77
73
  const cfg = readConfig('user');
@@ -91,17 +87,15 @@ test('an unrelated updateConfig mutation (as fresh bootstrap does) does NOT free
91
87
  installed_at: '2026-01-01T00:00:00.000Z',
92
88
  };
93
89
  });
94
- const cfgPath = join(root, 'config.json');
95
- const raw = JSON.parse(readFileSync(cfgPath, 'utf8'));
90
+ const raw = readRawScopeConfig('user');
96
91
  assert.equal(raw.modelLadders, undefined);
97
- assert.ok(raw.marketplaces['crouter-official-marketplace']);
92
+ assert.ok(raw.marketplaces?.['crouter-official-marketplace']);
98
93
  });
99
94
  test('a non-ladder sys config set does NOT freeze modelLadders to disk', async () => {
100
95
  const root = join(home, '.crouter');
101
96
  ensureScopeInitialized('user', root);
102
97
  await leaf('set').run({ key: 'max_panes_per_window', value: '5' });
103
- const cfgPath = join(root, 'config.json');
104
- const raw = JSON.parse(readFileSync(cfgPath, 'utf8'));
98
+ const raw = readRawScopeConfig('user');
105
99
  // The touched key persists; modelLadders stays absent so a later build's
106
100
  // registry change still reaches every rung.
107
101
  assert.equal(raw.max_panes_per_window, 5);
@@ -112,10 +106,9 @@ test('a second sys config set for a different rung does not clobber an earlier o
112
106
  ensureScopeInitialized('user', root);
113
107
  await leaf('set').run({ key: 'modelLadders.openai.strong', value: 'openai-codex/gpt-5.5:high' });
114
108
  await leaf('set').run({ key: 'modelLadders.anthropic.light', value: 'anthropic/claude-haiku-4-5:high' });
115
- const cfgPath = join(root, 'config.json');
116
- const raw = JSON.parse(readFileSync(cfgPath, 'utf8'));
117
- assert.equal(raw.modelLadders.openai.strong, 'openai-codex/gpt-5.5:high');
118
- assert.equal(raw.modelLadders.anthropic.light, 'anthropic/claude-haiku-4-5:high');
119
- assert.equal(raw.modelLadders.openai.ultra, undefined);
120
- assert.equal(raw.modelLadders.anthropic.strong, undefined);
109
+ const raw = readRawScopeConfig('user');
110
+ assert.equal(raw.modelLadders?.openai?.strong, 'openai-codex/gpt-5.5:high');
111
+ assert.equal(raw.modelLadders?.anthropic?.light, 'anthropic/claude-haiku-4-5:high');
112
+ assert.equal(raw.modelLadders?.openai?.ultra, undefined);
113
+ assert.equal(raw.modelLadders?.anthropic?.strong, undefined);
121
114
  });
@@ -7,6 +7,10 @@ import { fileURLToPath } from 'node:url';
7
7
  import test from 'node:test';
8
8
  import { lintMemoryStore } from '../../../core/memory/lint.js';
9
9
  import { openProjectMemoryStore } from '../../../core/memory-resolver.js';
10
+ import { insertStoredProfile } from '../../../core/scoped-state/profiles.js';
11
+ import { initializeFreshScopedStore } from '../../../core/scoped-state/migrate.js';
12
+ import { closeScopedStores } from '../../../core/scoped-state/db.js';
13
+ import { resetScopeCache } from '../../../core/scope.js';
10
14
  const HERE = dirname(fileURLToPath(import.meta.url));
11
15
  const CLI = join(HERE, '../../../cli.ts');
12
16
  const TSX_LOADER = import.meta.resolve('tsx/esm');
@@ -17,7 +21,9 @@ function write(path, content) {
17
21
  /** Store keys and target ids are realpaths, so the fixture must be one too:
18
22
  * macOS hands `mkdtemp` a `/var/folders` path whose realpath is `/private/...`. */
19
23
  function fixtureHome(prefix) {
20
- return realpathSync(mkdtempSync(join(tmpdir(), prefix)));
24
+ const home = realpathSync(mkdtempSync(join(tmpdir(), prefix)));
25
+ initializeFreshScopedStore({ kind: 'user', root: join(home, '.crouter') });
26
+ return home;
21
27
  }
22
28
  /** A home the ambient node's own CRTR_* environment cannot leak into. */
23
29
  function syncEnv(home) {
@@ -58,15 +64,35 @@ function initializeRepository(path) {
58
64
  assert.equal(result.status, 0, result.stderr);
59
65
  }
60
66
  function writeProfile(home, profileId, project) {
61
- write(join(home, '.crouter', 'profiles', profileId, 'profile.json'), JSON.stringify({
62
- schema_version: 4,
63
- name: 'sync fixture',
64
- projects: [{ path: realpathSync(project), memory: 'content' }],
65
- home: realpathSync(project),
66
- paused_at: null,
67
- created_at: '2026-01-01T00:00:00.000Z',
68
- last_used_at: null,
69
- }));
67
+ insertStoredProfile(join(home, '.crouter'), {
68
+ profileId,
69
+ manifest: {
70
+ schema_version: 1,
71
+ name: 'sync fixture',
72
+ projects: [{ path: realpathSync(project), memory: 'content' }],
73
+ home: realpathSync(project),
74
+ paused_at: null,
75
+ created_at: '2026-01-01T00:00:00.000Z',
76
+ last_used_at: null,
77
+ },
78
+ }, join(home, '.crouter', 'profiles', profileId));
79
+ resetScopeCache();
80
+ }
81
+ function lintFixtureStore(home, project) {
82
+ const previousHome = process.env['HOME'];
83
+ process.env['HOME'] = home;
84
+ resetScopeCache();
85
+ try {
86
+ return lintMemoryStore(openProjectMemoryStore(project));
87
+ }
88
+ finally {
89
+ closeScopedStores();
90
+ resetScopeCache();
91
+ if (previousHome === undefined)
92
+ delete process.env['HOME'];
93
+ else
94
+ process.env['HOME'] = previousHome;
95
+ }
70
96
  }
71
97
  test('sync project-guidance --overwrite preserves an authored root and still imports rules', () => {
72
98
  const home = fixtureHome('crtr-sync-project-guidance-');
@@ -158,7 +184,7 @@ Nested operating guidance.
158
184
  assert.match(nestedIndex, /on: read/);
159
185
  assert.match(nestedIndex, /packages\/tool\/\*\*\/\*\.ts/);
160
186
  assert.match(nestedIndex, /Nested operating guidance\./);
161
- const lint = lintMemoryStore(openProjectMemoryStore(nested));
187
+ const lint = lintFixtureStore(home, nested);
162
188
  assert.equal(lint.ok, true, JSON.stringify(lint.findings));
163
189
  });
164
190
  test('sync project-guidance imports nested rules as leaves without a synthetic nested index', () => {
@@ -0,0 +1,2 @@
1
+ import type { BranchDef, LeafDef } from '../../core/command.js';
2
+ export declare function defineSysBranch(children: (LeafDef | BranchDef)[]): BranchDef;
@@ -0,0 +1,19 @@
1
+ import { defineBranch } from '../../core/command.js';
2
+ const SYS_ROOT_ENTRY = {
3
+ concept: 'crtr configuration, diagnostics, and self-management',
4
+ desc: 'settings, config, setup, doctor, context, sync, migrate, update, version, feedback, logs, support, daemon',
5
+ useWhen: 'managing the crtr installation, inspecting diagnostics, or operating the crtrd supervisor process',
6
+ };
7
+ const SYS_HELP = {
8
+ name: 'sys',
9
+ summary: 'crtr system configuration, settings, diagnostics, and self-management',
10
+ model: 'Configuration and settings own durable behavior; diagnostics and support observe it. Setup, migration, sync, and update change installed or generated state, while daemon control owns the supervisor lifecycle.',
11
+ };
12
+ export function defineSysBranch(children) {
13
+ return defineBranch({
14
+ name: 'sys',
15
+ rootEntry: SYS_ROOT_ENTRY,
16
+ help: { ...SYS_HELP },
17
+ children,
18
+ });
19
+ }