@north-light/crouter 0.3.172 → 0.3.174

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (673) hide show
  1. package/bin/runtime-selector.mjs +8 -1
  2. package/dist/api/__tests__/{client.test.js → serial/client.test.js} +2 -135
  3. package/dist/api/client.d.ts +12 -21
  4. package/dist/api/client.js +22 -31
  5. package/dist/api/dto/broker-ops.d.ts +158 -0
  6. package/dist/api/dto/broker-ops.js +6 -0
  7. package/dist/api/dto/crons.d.ts +6 -0
  8. package/dist/api/dto/human.d.ts +7 -1
  9. package/dist/api/dto/inbox.d.ts +1 -71
  10. package/dist/api/dto/inbox.js +1 -9
  11. package/dist/api/dto/nodes.d.ts +6 -7
  12. package/dist/api/dto/reviews.d.ts +1 -11
  13. package/dist/api/routes.d.ts +7 -4
  14. package/dist/api/routes.js +8 -5
  15. package/dist/build-root.js +3 -3
  16. package/dist/builtin-memory/04-base-worker.md +1 -4
  17. package/dist/builtin-memory/05-kinds/advisor/00-base.md +1 -5
  18. package/dist/builtin-memory/05-kinds/advisor/01-orchestrator.md +2 -7
  19. package/dist/builtin-memory/05-kinds/design/00-base.md +1 -6
  20. package/dist/builtin-memory/05-kinds/developer/00-base.md +1 -6
  21. package/dist/builtin-memory/05-kinds/explore/00-base.md +1 -4
  22. package/dist/builtin-memory/05-kinds/explore/01-orchestrator.md +1 -2
  23. package/dist/builtin-memory/05-kinds/general/00-base.md +1 -3
  24. package/dist/builtin-memory/05-kinds/plan/00-base.md +1 -6
  25. package/dist/builtin-memory/05-kinds/plan/reviewers/00-base.md +1 -2
  26. package/dist/builtin-memory/05-kinds/plan/reviewers/architecture-fit.md +1 -3
  27. package/dist/builtin-memory/05-kinds/plan/reviewers/code-smells.md +1 -3
  28. package/dist/builtin-memory/05-kinds/plan/reviewers/pattern-consistency.md +1 -3
  29. package/dist/builtin-memory/05-kinds/plan/reviewers/requirements-coverage.md +1 -3
  30. package/dist/builtin-memory/05-kinds/plan/reviewers/security.md +1 -4
  31. package/dist/builtin-memory/05-kinds/review/companion/00-base.md +2 -3
  32. package/dist/builtin-memory/05-kinds/spec/00-base.md +1 -2
  33. package/dist/builtin-memory/advisor/council.md +1 -6
  34. package/dist/builtin-memory/design.md +2 -7
  35. package/dist/builtin-memory/development.md +9 -14
  36. package/dist/builtin-memory/internal/marketplaces.md +2 -6
  37. package/dist/builtin-memory/internal/nodes-and-canvas.md +1 -1
  38. package/dist/builtin-memory/internal/plugins.md +2 -8
  39. package/dist/builtin-memory/internal/storage-tiers.md +1 -2
  40. package/dist/builtin-memory/testing.md +41 -0
  41. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/{provider-rotation.test.ts → serial/provider-rotation.test.ts} +106 -177
  42. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/claude-plugin-commands.ts +5 -15
  43. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/index.ts +1 -28
  44. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/memory-slash-commands.ts +43 -88
  45. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.js +55 -0
  46. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +60 -0
  47. package/dist/cli.js +2 -2
  48. package/dist/clients/attach/__tests__/attach-remote-readonly.test.js +37 -131
  49. package/dist/clients/attach/__tests__/chat-view-snapshot-ordering.test.js +71 -152
  50. package/dist/clients/attach/__tests__/context-message.test.js +16 -174
  51. package/dist/clients/attach/__tests__/crtr-output.test.js +36 -2069
  52. package/dist/clients/attach/__tests__/diagram.test.js +2 -2
  53. package/dist/clients/attach/__tests__/edit-diff.test.js +0 -4
  54. package/dist/clients/attach/__tests__/file-review-focus.test.js +2 -1
  55. package/dist/clients/attach/__tests__/group-activity.test.js +40 -229
  56. package/dist/clients/attach/__tests__/oauth-dialog-lifecycle.test.js +26 -76
  57. package/dist/clients/attach/__tests__/prompt-preview.test.js +4 -70
  58. package/dist/clients/attach/__tests__/ref-autocomplete.test.js +11 -125
  59. package/dist/clients/attach/__tests__/titled-editor-preview.test.js +14 -205
  60. package/dist/clients/attach/command.d.ts +2 -1
  61. package/dist/clients/attach/command.js +81 -76
  62. package/dist/clients/attach/input/capabilities.d.ts +27 -0
  63. package/dist/clients/attach/input/capabilities.js +96 -0
  64. package/dist/clients/attach/input/controller.d.ts +20 -182
  65. package/dist/clients/attach/input/controller.js +128 -537
  66. package/dist/clients/attach/input/overlay-owner.d.ts +41 -0
  67. package/dist/clients/attach/input/overlay-owner.js +199 -0
  68. package/dist/clients/attach/overlays/file-review.d.ts +0 -4
  69. package/dist/clients/attach/overlays/file-review.js +13 -5
  70. package/dist/clients/attach/overlays/graph.js +2 -10
  71. package/dist/clients/attach/render/chat-view.d.ts +4 -3
  72. package/dist/clients/attach/render/chat-view.js +39 -33
  73. package/dist/clients/attach/render/group-activity.d.ts +1 -0
  74. package/dist/clients/attach/render/group-activity.js +20 -13
  75. package/dist/clients/attach/render/group-recap.js +12 -3
  76. package/dist/clients/attach/session/connection.js +9 -15
  77. package/dist/clients/attach/session/editor-inventory.d.ts +6 -5
  78. package/dist/clients/attach/session/editor-inventory.js +7 -8
  79. package/dist/clients/attach/session/file-links.d.ts +13 -0
  80. package/dist/clients/attach/session/file-links.js +107 -0
  81. package/dist/clients/attach/session/frame.d.ts +3 -0
  82. package/dist/clients/attach/session/frame.js +10 -1
  83. package/dist/clients/attach/session/frames.js +2 -3
  84. package/dist/clients/attach/session/input-wiring.d.ts +4 -1
  85. package/dist/clients/attach/session/input-wiring.js +15 -14
  86. package/dist/clients/attach/session/mouse.d.ts +6 -1
  87. package/dist/clients/attach/session/mouse.js +8 -5
  88. package/dist/clients/attach/session/profile-files.js +18 -12
  89. package/dist/clients/attach/session/reconnect.js +1 -1
  90. package/dist/clients/attach/session/state-sync.js +1 -2
  91. package/dist/clients/attach/session/surface-host.d.ts +3 -2
  92. package/dist/clients/attach/session/surface-host.js +4 -4
  93. package/dist/clients/attach/slash/dispatch.d.ts +8 -31
  94. package/dist/clients/attach/slash/dispatch.js +34 -81
  95. package/dist/clients/attach/viewer.js +820 -860
  96. package/dist/clients/conversation/projection.d.ts +79 -0
  97. package/dist/clients/conversation/projection.js +341 -0
  98. package/dist/clients/inbox/__tests__/serial/inbox-controller.test.js +159 -0
  99. package/dist/clients/inbox/__tests__/serial/mount-panel.test.js +151 -0
  100. package/dist/clients/inbox/controller.d.ts +0 -4
  101. package/dist/clients/inbox/controller.js +0 -2
  102. package/dist/clients/inbox/review/__tests__/review-core.test.js +4 -293
  103. package/dist/clients/inbox/review/__tests__/teardown-notice.test.js +100 -0
  104. package/dist/clients/inbox/review/comments-client.d.ts +3 -2
  105. package/dist/clients/inbox/review/comments-client.js +12 -12
  106. package/dist/clients/inbox/review/companion-pane.d.ts +30 -0
  107. package/dist/clients/inbox/review/companion-pane.js +86 -0
  108. package/dist/clients/inbox/review/document-surface.d.ts +182 -0
  109. package/dist/clients/inbox/review/{document-region.js → document-surface.js} +252 -48
  110. package/dist/clients/inbox/review/frame.js +5 -4
  111. package/dist/clients/inbox/review/launch.d.ts +8 -8
  112. package/dist/clients/inbox/review/launch.js +52 -92
  113. package/dist/clients/inbox/review/nvim.d.ts +2 -0
  114. package/dist/clients/inbox/review/nvim.js +14 -12
  115. package/dist/clients/inbox/review/review-client.d.ts +12 -8
  116. package/dist/clients/inbox/review/review-client.js +46 -35
  117. package/dist/clients/inbox/review-adapter.d.ts +3 -10
  118. package/dist/clients/inbox/review-adapter.js +27 -19
  119. package/dist/clients/inbox/surface.d.ts +0 -4
  120. package/dist/clients/inbox/surface.js +0 -2
  121. package/dist/clients/surfaces/host.d.ts +11 -3
  122. package/dist/commands/__tests__/api-client-cold-start-diagnostic.test.js +7 -34
  123. package/dist/commands/__tests__/human.test.js +11 -322
  124. package/dist/commands/api-client.d.ts +5 -5
  125. package/dist/commands/api-client.js +6 -85
  126. package/dist/commands/canvas-browse.js +3 -29
  127. package/dist/commands/canvas-config.js +1 -1
  128. package/dist/commands/canvas-use.js +3 -3
  129. package/dist/commands/canvas.js +1 -1
  130. package/dist/commands/cron.js +5 -1
  131. package/dist/commands/human/queue.d.ts +0 -4
  132. package/dist/commands/human/queue.js +7 -40
  133. package/dist/commands/memory/list.d.ts +14 -0
  134. package/dist/commands/memory/list.js +35 -31
  135. package/dist/commands/memory/read.d.ts +7 -0
  136. package/dist/commands/memory/read.js +14 -8
  137. package/dist/commands/node/bash.d.ts +1 -0
  138. package/dist/commands/node/bash.js +198 -0
  139. package/dist/commands/node/create.d.ts +23 -0
  140. package/dist/commands/node/create.js +207 -0
  141. package/dist/commands/node/inspect.d.ts +2 -0
  142. package/dist/commands/node/inspect.js +302 -0
  143. package/dist/commands/node/lifecycle.d.ts +4 -0
  144. package/dist/commands/node/lifecycle.js +415 -0
  145. package/dist/commands/node/message.d.ts +1 -0
  146. package/dist/commands/node/message.js +164 -0
  147. package/dist/commands/node/pyramid.d.ts +2 -0
  148. package/dist/commands/node/pyramid.js +79 -0
  149. package/dist/commands/node/subscription.d.ts +1 -0
  150. package/dist/commands/node/subscription.js +82 -0
  151. package/dist/commands/node/wait.d.ts +1 -0
  152. package/dist/commands/node/wait.js +159 -0
  153. package/dist/commands/node-lifecycle-revive.js +10 -57
  154. package/dist/commands/node.d.ts +0 -42
  155. package/dist/commands/node.js +11 -2065
  156. package/dist/commands/search.js +1 -1
  157. package/dist/commands/surface/node/cycle.d.ts +1 -0
  158. package/dist/commands/surface/node/cycle.js +83 -0
  159. package/dist/commands/surface/node/focus.d.ts +1 -0
  160. package/dist/commands/surface/node/focus.js +67 -0
  161. package/dist/commands/surface/node/id.d.ts +1 -0
  162. package/dist/commands/surface/node/id.js +38 -0
  163. package/dist/commands/surface/node/pin.d.ts +1 -0
  164. package/dist/commands/surface/node/pin.js +42 -0
  165. package/dist/commands/surface/node/placement.d.ts +46 -0
  166. package/dist/commands/surface/node/placement.js +124 -0
  167. package/dist/commands/surface-node.js +4 -1
  168. package/dist/commands/surface-reload.js +1 -2
  169. package/dist/commands/surface-tmux-spread.js +1 -1
  170. package/dist/commands/surface.js +5 -20
  171. package/dist/commands/sys/__tests__/setup-core.test.js +18 -271
  172. package/dist/commands/sys/config.js +6 -6
  173. package/dist/commands/sys/logs.js +1 -1
  174. package/dist/commands/sys/panels/broker-limits-panel.d.ts +17 -0
  175. package/dist/commands/sys/panels/broker-limits-panel.js +104 -0
  176. package/dist/commands/sys/panels/dependencies-panel.d.ts +14 -0
  177. package/dist/commands/sys/panels/dependencies-panel.js +80 -0
  178. package/dist/commands/sys/panels/keybindings-panel.d.ts +56 -0
  179. package/dist/commands/sys/panels/keybindings-panel.js +703 -0
  180. package/dist/commands/sys/panels/keys-panel.d.ts +16 -0
  181. package/dist/commands/sys/panels/keys-panel.js +60 -0
  182. package/dist/commands/sys/panels/models-panel.d.ts +77 -0
  183. package/dist/commands/sys/panels/models-panel.js +647 -0
  184. package/dist/commands/sys/panels/panel.d.ts +45 -0
  185. package/dist/commands/sys/panels/panel.js +137 -0
  186. package/dist/commands/sys/panels/plugins-panel.d.ts +16 -0
  187. package/dist/commands/sys/panels/plugins-panel.js +80 -0
  188. package/dist/commands/sys/panels/prefs-panel.d.ts +21 -0
  189. package/dist/commands/sys/panels/prefs-panel.js +85 -0
  190. package/dist/commands/sys/panels/provider-panel.d.ts +62 -0
  191. package/dist/commands/sys/panels/provider-panel.js +538 -0
  192. package/dist/commands/sys/settings-shell.d.ts +55 -0
  193. package/dist/commands/sys/settings-shell.js +400 -0
  194. package/dist/commands/sys/settings.d.ts +2 -0
  195. package/dist/commands/sys/settings.js +31 -0
  196. package/dist/commands/sys/setup-core.d.ts +3 -33
  197. package/dist/commands/sys/setup-core.js +27 -78
  198. package/dist/commands/sys/setup-settings-runner.d.ts +24 -0
  199. package/dist/commands/sys/setup-settings-runner.js +63 -0
  200. package/dist/commands/sys/setup-wizard.d.ts +26 -125
  201. package/dist/commands/sys/setup-wizard.js +209 -2473
  202. package/dist/commands/sys/setup.js +5 -7
  203. package/dist/commands/sys.js +3 -2
  204. package/dist/core/__tests__/broker-extension-canvas-db-boundary.test.js +50 -0
  205. package/dist/core/__tests__/broker-launch-candidates.test.js +20 -9
  206. package/dist/core/__tests__/broker-preflight.test.js +1 -1
  207. package/dist/core/__tests__/canvas-inbox-watcher-hold.test.js +108 -27
  208. package/dist/core/__tests__/canvas-inbox-watcher.test.js +14 -0
  209. package/dist/core/__tests__/canvas.test.js +2 -36
  210. package/dist/core/__tests__/close.test.js +14 -3
  211. package/dist/core/__tests__/context-intro.test.js +32 -143
  212. package/dist/core/__tests__/cron-broker-capacity.test.js +22 -3
  213. package/dist/core/__tests__/daemon-boot.test.js +2 -20
  214. package/dist/core/__tests__/daemon-wedge.test.js +1 -1
  215. package/dist/core/__tests__/dead-node-policy-table.test.js +1 -18
  216. package/dist/core/__tests__/fixtures/fake-engine.d.ts +1 -1
  217. package/dist/core/__tests__/fixtures/fake-engine.js +2 -2
  218. package/dist/core/__tests__/fixtures/fake-pi-host.js +2 -2
  219. package/dist/core/__tests__/focuses.test.js +4 -98
  220. package/dist/core/__tests__/helpers/broker-clients.d.ts +0 -3
  221. package/dist/core/__tests__/helpers/broker-clients.js +0 -14
  222. package/dist/core/__tests__/helpers/harness.d.ts +0 -8
  223. package/dist/core/__tests__/helpers/harness.js +7 -87
  224. package/dist/core/__tests__/helpers/viewer-panes.js +1 -1
  225. package/dist/core/__tests__/inline-memory-refs.test.js +5 -134
  226. package/dist/core/__tests__/kickoff.test.js +1 -1
  227. package/dist/core/__tests__/memory-resolver-precedence.test.js +29 -1
  228. package/dist/core/__tests__/migration.test.js +35 -48
  229. package/dist/core/__tests__/on-read-dedup-resume.test.js +22 -12
  230. package/dist/core/__tests__/passive-subscription.test.js +26 -49
  231. package/dist/core/__tests__/preview-registry-sync.test.js +1 -2
  232. package/dist/core/__tests__/prune.test.js +94 -1
  233. package/dist/core/__tests__/review-model-floor.test.js +0 -32
  234. package/dist/core/__tests__/seam/broker-attach-multiclient.test.js +255 -0
  235. package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.js +39 -7
  236. package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.js +30 -29
  237. package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.js +54 -5
  238. package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.js +134 -82
  239. package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.js +15 -4
  240. package/dist/core/__tests__/{full/idle-release-settlement.test.js → seam/dormancy-release.test.js} +69 -17
  241. package/dist/core/__tests__/{full/yield-message-transaction.test.js → seam/yield-refresh-transaction.test.js} +31 -9
  242. package/dist/core/__tests__/secrets.test.js +1 -7
  243. package/dist/core/__tests__/{broker-fork-seam.test.js → serial/broker-fork-seam.test.js} +58 -7
  244. package/dist/core/__tests__/{broker-sdk-wiring.test.js → serial/broker-sdk-wiring.test.js} +18 -162
  245. package/dist/core/__tests__/{broker-snapshot-history.test.js → serial/broker-snapshot-history.test.js} +9 -9
  246. package/dist/core/__tests__/{command-plugins.test.js → serial/command-plugins.test.js} +105 -15
  247. package/dist/core/__tests__/{deferred-no-wake.test.js → serial/deferred-no-wake.test.js} +23 -20
  248. package/dist/core/__tests__/{flagship-lifecycle.test.js → serial/flagship-lifecycle.test.js} +7 -7
  249. package/dist/core/__tests__/{host-teardown-process-group.test.js → serial/host-teardown-process-group.test.js} +6 -6
  250. package/dist/core/__tests__/{human-deliver-e2e.test.js → serial/human-deliver-e2e.test.js} +12 -12
  251. package/dist/core/__tests__/{live-mutation.test.js → serial/live-mutation.test.js} +5 -5
  252. package/dist/core/__tests__/{refresh-stall-recycle.test.js → serial/refresh-stall-recycle.test.js} +5 -14
  253. package/dist/core/__tests__/{revive.test.js → serial/revive.test.js} +15 -100
  254. package/dist/core/__tests__/{spawn-root.test.js → serial/spawn-root.test.js} +32 -15
  255. package/dist/core/__tests__/serial/subscription-delivery.test.js +126 -0
  256. package/dist/core/__tests__/serial/tmux-surface.test.js +256 -0
  257. package/dist/core/__tests__/{worktree.test.js → serial/worktree.test.js} +15 -15
  258. package/dist/core/__tests__/session-model.test.js +0 -18
  259. package/dist/core/__tests__/spawn-worktree-id-conflict.test.js +9 -0
  260. package/dist/core/__tests__/watchdog-abort-arms-retry.test.js +50 -0
  261. package/dist/core/broker-client/__tests__/transport-relay.test.js +15 -16
  262. package/dist/core/broker-client/__tests__/transport-socket.test.js +28 -0
  263. package/dist/core/broker-client/client.d.ts +2 -2
  264. package/dist/core/broker-client/client.js +4 -7
  265. package/dist/core/broker-client/transport-relay.d.ts +13 -19
  266. package/dist/core/broker-client/transport-relay.js +19 -34
  267. package/dist/core/broker-client/transport-socket.d.ts +2 -2
  268. package/dist/core/broker-client/transport-socket.js +9 -2
  269. package/dist/core/broker-client/transport.d.ts +7 -3
  270. package/dist/core/broker-client/transport.js +4 -4
  271. package/dist/core/canvas/__tests__/attention.test.js +1 -18
  272. package/dist/core/canvas/__tests__/remote-canvas-source.test.js +7 -64
  273. package/dist/core/canvas/__tests__/remote-transport.test.js +2 -3
  274. package/dist/core/canvas/__tests__/render-remote.test.js +7 -52
  275. package/dist/core/canvas/browse/app.d.ts +2 -17
  276. package/dist/core/canvas/browse/app.js +16 -88
  277. package/dist/core/canvas/browse/model.d.ts +0 -4
  278. package/dist/core/canvas/browse/model.js +1 -12
  279. package/dist/core/canvas/browse/render.js +6 -3
  280. package/dist/core/canvas/crons.d.ts +8 -5
  281. package/dist/core/canvas/crons.js +7 -6
  282. package/dist/core/canvas/extensions.d.ts +7 -3
  283. package/dist/core/canvas/extensions.js +16 -4
  284. package/dist/core/canvas/nav-model.d.ts +0 -4
  285. package/dist/core/canvas/nav-model.js +2 -14
  286. package/dist/core/canvas/node-order.d.ts +3 -0
  287. package/dist/core/canvas/node-order.js +12 -0
  288. package/dist/core/canvas/remote-canvas-source.d.ts +3 -6
  289. package/dist/core/canvas/remote-canvas-source.js +8 -15
  290. package/dist/core/command.js +11 -4
  291. package/dist/core/config.js +3 -1
  292. package/dist/core/events/envelope.js +1 -1
  293. package/dist/core/events/read.js +7 -21
  294. package/dist/core/events/source.d.ts +0 -2
  295. package/dist/core/events/source.js +0 -16
  296. package/dist/core/events/types.d.ts +1 -1
  297. package/dist/core/fault-classifier.d.ts +1 -1
  298. package/dist/core/feed/passive.d.ts +0 -11
  299. package/dist/core/feed/passive.js +1 -62
  300. package/dist/core/human/__tests__/{inbox-core.test.js → serial/inbox-core.test.js} +6 -6
  301. package/dist/core/keybindings/__tests__/resolve.test.js +1 -96
  302. package/dist/core/keybindings/background-bash.js +3 -4
  303. package/dist/core/keybindings/catalog.js +1 -1
  304. package/dist/core/memory/inline-ref-grammar.js +3 -3
  305. package/dist/core/memory-resolver.d.ts +11 -25
  306. package/dist/core/memory-resolver.js +51 -33
  307. package/dist/core/model-routes.d.ts +15 -0
  308. package/dist/core/model-routes.js +12 -0
  309. package/dist/core/pool-credential-store.js +1 -1
  310. package/dist/core/preview-registry.js +8 -9
  311. package/dist/core/profiles/__tests__/root-profile.test.js +4 -14
  312. package/dist/core/review/realize.d.ts +0 -13
  313. package/dist/core/review/realize.js +0 -40
  314. package/dist/core/review/types.d.ts +1 -1
  315. package/dist/core/runtime/__tests__/engine-route.test.js +2 -2
  316. package/dist/core/runtime/bearings.js +1 -11
  317. package/dist/core/runtime/broker/client-registry.d.ts +33 -0
  318. package/dist/core/runtime/broker/client-registry.js +164 -0
  319. package/dist/core/runtime/broker/daemon-ops.d.ts +19 -0
  320. package/dist/core/runtime/broker/daemon-ops.js +49 -0
  321. package/dist/core/runtime/broker/event-projection.d.ts +42 -0
  322. package/dist/core/runtime/broker/event-projection.js +178 -0
  323. package/dist/core/runtime/broker/fault-retry.d.ts +39 -0
  324. package/dist/core/runtime/broker/fault-retry.js +277 -0
  325. package/dist/core/runtime/broker/frame-dispatch.d.ts +238 -0
  326. package/dist/core/runtime/broker/frame-dispatch.js +1537 -0
  327. package/dist/core/runtime/broker/inbox.d.ts +22 -0
  328. package/dist/core/runtime/broker/inbox.js +167 -0
  329. package/dist/core/runtime/broker/passive.d.ts +16 -0
  330. package/dist/core/runtime/broker/passive.js +44 -0
  331. package/dist/core/runtime/broker/read-ops.d.ts +23 -0
  332. package/dist/core/runtime/broker/read-ops.js +150 -0
  333. package/dist/core/runtime/broker/rebind.d.ts +74 -0
  334. package/dist/core/runtime/broker/rebind.js +211 -0
  335. package/dist/core/runtime/broker/tool-groups.d.ts +39 -0
  336. package/dist/core/runtime/broker/tool-groups.js +244 -0
  337. package/dist/core/runtime/broker-extension-render.d.ts +11 -0
  338. package/dist/core/runtime/broker-extension-render.js +181 -0
  339. package/dist/core/runtime/broker-persona-guidance.d.ts +13 -0
  340. package/dist/core/runtime/broker-persona-guidance.js +58 -0
  341. package/dist/core/runtime/broker-protocol.d.ts +1 -1
  342. package/dist/core/runtime/broker-protocol.js +1 -1
  343. package/dist/core/runtime/broker.d.ts +5 -196
  344. package/dist/core/runtime/broker.js +276 -3059
  345. package/dist/core/runtime/canvas-extensions.js +11 -2
  346. package/dist/core/runtime/fault.js +1 -1
  347. package/dist/core/runtime/model-selection.d.ts +9 -0
  348. package/dist/core/runtime/model-selection.js +12 -0
  349. package/dist/core/runtime/model-swap.d.ts +3 -3
  350. package/dist/core/runtime/model-swap.js +33 -25
  351. package/dist/core/runtime/placement-tmux.d.ts +3 -14
  352. package/dist/core/runtime/placement-tmux.js +11 -80
  353. package/dist/core/runtime/placement.d.ts +4 -2
  354. package/dist/core/runtime/placement.js +7 -12
  355. package/dist/core/runtime/promote.d.ts +14 -1
  356. package/dist/core/runtime/promote.js +1 -1
  357. package/dist/core/runtime/reset.d.ts +1 -1
  358. package/dist/core/runtime/roadmap.js +1 -1
  359. package/dist/core/runtime/spawn.d.ts +8 -0
  360. package/dist/core/runtime/spawn.js +36 -6
  361. package/dist/core/runtime/stop-guard.d.ts +4 -3
  362. package/dist/core/runtime/stop-guard.js +36 -18
  363. package/dist/core/runtime/stop-signals.d.ts +4 -1
  364. package/dist/core/runtime/stream-watchdog.js +4 -5
  365. package/dist/core/runtime/structured-output.d.ts +15 -2
  366. package/dist/core/runtime/structured-output.js +35 -12
  367. package/dist/core/runtime/tmux-bindings.d.ts +25 -0
  368. package/dist/core/runtime/tmux-bindings.js +682 -0
  369. package/dist/core/runtime/tmux-chrome.d.ts +2 -1
  370. package/dist/core/runtime/tmux-chrome.js +3 -2
  371. package/dist/core/runtime/{tmux.d.ts → tmux-driver.d.ts} +18 -26
  372. package/dist/core/runtime/tmux-driver.js +598 -0
  373. package/dist/core/runtime/view-socket.d.ts +14 -0
  374. package/dist/core/runtime/view-socket.js +83 -0
  375. package/dist/core/session-model/session-state.d.ts +1 -2
  376. package/dist/core/session-model/session-state.js +5 -8
  377. package/dist/core/spawn.d.ts +1 -1
  378. package/dist/core/spawn.js +2 -2
  379. package/dist/core/substrate/gate.d.ts +1 -1
  380. package/dist/core/substrate/on-read-pure.d.ts +7 -0
  381. package/dist/core/substrate/on-read-pure.js +272 -0
  382. package/dist/core/termrender/termrender.js +32 -2
  383. package/dist/core/user-settings.d.ts +23 -1
  384. package/dist/core/user-settings.js +18 -1
  385. package/dist/daemon/api/__tests__/node-model-validation.test.js +134 -0
  386. package/dist/daemon/api/__tests__/review-terminal-conflict.test.js +98 -0
  387. package/dist/daemon/api/__tests__/{full → seam}/api-server.test.js +6 -48
  388. package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.js +17 -44
  389. package/dist/daemon/api/__tests__/{full/push-parity.test.js → seam/leaf-api-parity.test.js} +61 -42
  390. package/dist/daemon/api/bridge.js +40 -81
  391. package/dist/daemon/api/handlers/broker-ops.d.ts +2 -0
  392. package/dist/daemon/api/handlers/broker-ops.js +383 -0
  393. package/dist/daemon/api/handlers/crons.js +9 -4
  394. package/dist/daemon/api/handlers/files.js +6 -7
  395. package/dist/daemon/api/handlers/inbox.js +2 -340
  396. package/dist/daemon/api/handlers/nodes.d.ts +10 -1
  397. package/dist/daemon/api/handlers/nodes.js +74 -39
  398. package/dist/daemon/api/handlers/review-comments.js +5 -1
  399. package/dist/daemon/api/handlers/reviews.js +0 -19
  400. package/dist/daemon/api/map.js +25 -4
  401. package/dist/daemon/api/router.js +2 -3
  402. package/dist/daemon/api/server.js +5 -7
  403. package/dist/daemon/cron-run.d.ts +4 -0
  404. package/dist/daemon/cron-run.js +30 -13
  405. package/dist/daemon/crtrd.d.ts +3 -58
  406. package/dist/daemon/crtrd.js +28 -1244
  407. package/dist/daemon/manage.js +0 -1
  408. package/dist/daemon/reconcilers/broker-supervision.d.ts +50 -0
  409. package/dist/daemon/reconcilers/broker-supervision.js +549 -0
  410. package/dist/daemon/reconcilers/cron-lane.d.ts +10 -0
  411. package/dist/daemon/reconcilers/cron-lane.js +32 -0
  412. package/dist/daemon/reconcilers/dormant-inbox.d.ts +18 -0
  413. package/dist/daemon/reconcilers/dormant-inbox.js +143 -0
  414. package/dist/daemon/reconcilers/storage-maintenance.d.ts +22 -0
  415. package/dist/daemon/reconcilers/storage-maintenance.js +213 -0
  416. package/dist/daemon/review/finish.js +2 -5
  417. package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +34 -53
  418. package/dist/pi-extensions/__tests__/canvas-recap.test.js +16 -113
  419. package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +72 -99
  420. package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.js +29 -12
  421. package/dist/pi-extensions/broker-local.d.ts +20 -0
  422. package/dist/pi-extensions/broker-local.js +89 -0
  423. package/dist/pi-extensions/canvas-context-intro.d.ts +3 -3
  424. package/dist/pi-extensions/canvas-context-intro.js +22 -11
  425. package/dist/pi-extensions/canvas-doc-substrate.js +17 -34
  426. package/dist/pi-extensions/canvas-goal-capture.js +7 -12
  427. package/dist/pi-extensions/canvas-inbox-watcher.js +124 -139
  428. package/dist/pi-extensions/canvas-passive-context.d.ts +3 -3
  429. package/dist/pi-extensions/canvas-passive-context.js +22 -18
  430. package/dist/pi-extensions/canvas-recap.d.ts +2 -2
  431. package/dist/pi-extensions/canvas-recap.js +48 -21
  432. package/dist/pi-extensions/canvas-review-boundary.js +10 -4
  433. package/dist/pi-extensions/canvas-stophook.d.ts +0 -5
  434. package/dist/pi-extensions/canvas-stophook.js +149 -431
  435. package/dist/pi-extensions/canvas-structured-output.js +52 -30
  436. package/dist/pi-extensions/envelope-merge.d.ts +13 -0
  437. package/dist/pi-extensions/envelope-merge.js +29 -0
  438. package/dist/shared/working-activity.d.ts +3 -2
  439. package/dist/shared/working-activity.js +3 -2
  440. package/dist/types.d.ts +6 -5
  441. package/dist/types.js +2 -2
  442. package/docs/compat/hearth-crtr-v1.md +4 -12
  443. package/docs/compat/hearth-crtr-v2.md +3 -11
  444. package/docs/compat/hearth-crtr-v3.md +4 -12
  445. package/docs/compat/hearth-crtr-v4.md +3 -11
  446. package/docs/compat/hearth-crtr-v5.md +3 -11
  447. package/docs/public-api.md +3 -7
  448. package/package.json +7 -49
  449. package/runtime.lock.json +2766 -14533
  450. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/claude-plugin-commands.test.ts +0 -49
  451. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/memory-slash-commands.test.ts +0 -194
  452. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/statusline.test.ts +0 -68
  453. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/test.ts +0 -119
  454. package/dist/clients/attach/__tests__/attach-chrome-remote.test.js +0 -439
  455. package/dist/clients/attach/__tests__/attach-keybindings.test.js +0 -170
  456. package/dist/clients/attach/__tests__/crtr-output-coverage.test.js +0 -57
  457. package/dist/clients/attach/__tests__/editor-frame-title.test.js +0 -19
  458. package/dist/clients/attach/__tests__/input-controller-extension-command.test.js +0 -32
  459. package/dist/clients/attach/__tests__/markdown-headings.test.js +0 -35
  460. package/dist/clients/attach/__tests__/session-identity-refresh.test.js +0 -32
  461. package/dist/clients/conversation/conversation.d.ts +0 -65
  462. package/dist/clients/conversation/conversation.js +0 -318
  463. package/dist/clients/conversation/frames.d.ts +0 -30
  464. package/dist/clients/conversation/frames.js +0 -52
  465. package/dist/clients/conversation/region.d.ts +0 -51
  466. package/dist/clients/conversation/region.js +0 -265
  467. package/dist/clients/inbox/__tests__/inbox-controller.test.js +0 -247
  468. package/dist/clients/inbox/__tests__/mount-panel.test.js +0 -776
  469. package/dist/clients/inbox/review/__tests__/remap.test.js +0 -196
  470. package/dist/clients/inbox/review/columns.d.ts +0 -22
  471. package/dist/clients/inbox/review/columns.js +0 -40
  472. package/dist/clients/inbox/review/composition.d.ts +0 -60
  473. package/dist/clients/inbox/review/composition.js +0 -278
  474. package/dist/clients/inbox/review/document-region.d.ts +0 -120
  475. package/dist/clients/surfaces/region.d.ts +0 -16
  476. package/dist/clients/web/__tests__/push-engine.test.js +0 -158
  477. package/dist/clients/web/__tests__/push-registry.test.d.ts +0 -1
  478. package/dist/clients/web/__tests__/push-registry.test.js +0 -177
  479. package/dist/clients/web/dev-server.d.ts +0 -7
  480. package/dist/clients/web/dev-server.js +0 -46
  481. package/dist/clients/web/events.d.ts +0 -19
  482. package/dist/clients/web/events.js +0 -163
  483. package/dist/clients/web/push-engine.d.ts +0 -44
  484. package/dist/clients/web/push-engine.js +0 -125
  485. package/dist/clients/web/push-registry.d.ts +0 -85
  486. package/dist/clients/web/push-registry.js +0 -373
  487. package/dist/clients/web/server.d.ts +0 -19
  488. package/dist/clients/web/server.js +0 -661
  489. package/dist/clients/web/web-client/shared/protocol.d.ts +0 -214
  490. package/dist/clients/web/web-client/shared/protocol.js +0 -8
  491. package/dist/clients/web/web-cmd.d.ts +0 -2
  492. package/dist/clients/web/web-cmd.js +0 -141
  493. package/dist/commands/__tests__/api-canvas-source.test.d.ts +0 -1
  494. package/dist/commands/__tests__/api-canvas-source.test.js +0 -37
  495. package/dist/commands/__tests__/canvas-config.test.d.ts +0 -1
  496. package/dist/commands/__tests__/canvas-config.test.js +0 -107
  497. package/dist/commands/__tests__/node-no-kickoff-flag.test.d.ts +0 -1
  498. package/dist/commands/__tests__/node-no-kickoff-flag.test.js +0 -73
  499. package/dist/commands/__tests__/node-worktree-flag.test.d.ts +0 -1
  500. package/dist/commands/__tests__/node-worktree-flag.test.js +0 -49
  501. package/dist/commands/__tests__/search-contents.test.d.ts +0 -1
  502. package/dist/commands/__tests__/search-contents.test.js +0 -52
  503. package/dist/commands/memory/__tests__/lint.test.d.ts +0 -1
  504. package/dist/commands/memory/__tests__/lint.test.js +0 -15
  505. package/dist/commands/sys/__tests__/config-broker-thresholds.test.d.ts +0 -1
  506. package/dist/commands/sys/__tests__/config-broker-thresholds.test.js +0 -95
  507. package/dist/commands/sys/__tests__/config-keybindings.test.d.ts +0 -1
  508. package/dist/commands/sys/__tests__/config-keybindings.test.js +0 -55
  509. package/dist/commands/sys/__tests__/helpers/setup-runtime.d.ts +0 -5
  510. package/dist/commands/sys/__tests__/helpers/setup-runtime.js +0 -19
  511. package/dist/commands/sys/__tests__/setup-front-door.test.d.ts +0 -1
  512. package/dist/commands/sys/__tests__/setup-front-door.test.js +0 -102
  513. package/dist/commands/sys/__tests__/setup-models.test.d.ts +0 -1
  514. package/dist/commands/sys/__tests__/setup-models.test.js +0 -205
  515. package/dist/commands/sys/__tests__/setup-providers-viewport.test.d.ts +0 -1
  516. package/dist/commands/sys/__tests__/setup-providers-viewport.test.js +0 -155
  517. package/dist/commands/sys/__tests__/sync-deps.test.d.ts +0 -1
  518. package/dist/commands/sys/__tests__/sync-deps.test.js +0 -179
  519. package/dist/commands/sys/__tests__/sync-import.test.d.ts +0 -1
  520. package/dist/commands/sys/__tests__/sync-import.test.js +0 -315
  521. package/dist/core/__tests__/base-worker-prompt.test.d.ts +0 -1
  522. package/dist/core/__tests__/base-worker-prompt.test.js +0 -57
  523. package/dist/core/__tests__/command-plugins-surfaces.test.d.ts +0 -1
  524. package/dist/core/__tests__/command-plugins-surfaces.test.js +0 -359
  525. package/dist/core/__tests__/connection-reconnect-resume.test.d.ts +0 -1
  526. package/dist/core/__tests__/connection-reconnect-resume.test.js +0 -36
  527. package/dist/core/__tests__/finalization-migration.test.d.ts +0 -1
  528. package/dist/core/__tests__/finalization-migration.test.js +0 -38
  529. package/dist/core/__tests__/fixtures/extra-extension.d.ts +0 -1
  530. package/dist/core/__tests__/fixtures/extra-extension.js +0 -3
  531. package/dist/core/__tests__/fixtures/spawn-proof-target.test.d.ts +0 -1
  532. package/dist/core/__tests__/fixtures/spawn-proof-target.test.js +0 -15
  533. package/dist/core/__tests__/fork.test.d.ts +0 -1
  534. package/dist/core/__tests__/fork.test.js +0 -108
  535. package/dist/core/__tests__/full/broker-attach-limits.test.d.ts +0 -1
  536. package/dist/core/__tests__/full/broker-attach-limits.test.js +0 -147
  537. package/dist/core/__tests__/full/broker-deliver-ack.test.d.ts +0 -1
  538. package/dist/core/__tests__/full/broker-deliver-ack.test.js +0 -73
  539. package/dist/core/__tests__/full/broker-dialogs.test.d.ts +0 -1
  540. package/dist/core/__tests__/full/broker-dialogs.test.js +0 -180
  541. package/dist/core/__tests__/full/broker-display-snapshot.test.d.ts +0 -1
  542. package/dist/core/__tests__/full/broker-display-snapshot.test.js +0 -75
  543. package/dist/core/__tests__/full/broker-dormant-wake.test.d.ts +0 -1
  544. package/dist/core/__tests__/full/broker-dormant-wake.test.js +0 -130
  545. package/dist/core/__tests__/full/broker-model-changed-broadcast.test.d.ts +0 -1
  546. package/dist/core/__tests__/full/broker-model-changed-broadcast.test.js +0 -57
  547. package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.d.ts +0 -1
  548. package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.js +0 -80
  549. package/dist/core/__tests__/full/cascade-close.test.d.ts +0 -1
  550. package/dist/core/__tests__/full/cascade-close.test.js +0 -240
  551. package/dist/core/__tests__/full/detach-focus.test.d.ts +0 -1
  552. package/dist/core/__tests__/full/detach-focus.test.js +0 -126
  553. package/dist/core/__tests__/full/idle-release-settlement.test.d.ts +0 -1
  554. package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.d.ts +0 -1
  555. package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.js +0 -107
  556. package/dist/core/__tests__/full/park-clock-release.test.d.ts +0 -1
  557. package/dist/core/__tests__/full/park-clock-release.test.js +0 -56
  558. package/dist/core/__tests__/full/yield-message-transaction.test.d.ts +0 -1
  559. package/dist/core/__tests__/memory-index-render.test.d.ts +0 -1
  560. package/dist/core/__tests__/memory-index-render.test.js +0 -60
  561. package/dist/core/__tests__/model-routes.test.d.ts +0 -1
  562. package/dist/core/__tests__/model-routes.test.js +0 -41
  563. package/dist/core/__tests__/on-read-identity.test.d.ts +0 -1
  564. package/dist/core/__tests__/on-read-identity.test.js +0 -61
  565. package/dist/core/__tests__/phase4-review-migration.test.d.ts +0 -1
  566. package/dist/core/__tests__/phase4-review-migration.test.js +0 -100
  567. package/dist/core/__tests__/prune-to-limit.test.d.ts +0 -1
  568. package/dist/core/__tests__/prune-to-limit.test.js +0 -126
  569. package/dist/core/__tests__/reset.test.d.ts +0 -1
  570. package/dist/core/__tests__/reset.test.js +0 -69
  571. package/dist/core/__tests__/spawn-no-kickoff.test.d.ts +0 -1
  572. package/dist/core/__tests__/spawn-no-kickoff.test.js +0 -115
  573. package/dist/core/__tests__/steer-note.test.d.ts +0 -1
  574. package/dist/core/__tests__/steer-note.test.js +0 -41
  575. package/dist/core/__tests__/subcommand-tier.test.d.ts +0 -1
  576. package/dist/core/__tests__/subcommand-tier.test.js +0 -99
  577. package/dist/core/__tests__/subscription-delivery.test.js +0 -211
  578. package/dist/core/__tests__/test-runner-cheap-sharding.test.d.ts +0 -1
  579. package/dist/core/__tests__/test-runner-cheap-sharding.test.js +0 -97
  580. package/dist/core/__tests__/tmux-surface.test.js +0 -484
  581. package/dist/core/__tests__/wake-bearings.test.d.ts +0 -1
  582. package/dist/core/__tests__/wake-bearings.test.js +0 -102
  583. package/dist/core/canvas/__tests__/remote-event-stream.test.d.ts +0 -1
  584. package/dist/core/canvas/__tests__/remote-event-stream.test.js +0 -146
  585. package/dist/core/canvas/__tests__/source-resolve.test.d.ts +0 -1
  586. package/dist/core/canvas/__tests__/source-resolve.test.js +0 -77
  587. package/dist/core/canvas/browse/__tests__/model.test.d.ts +0 -1
  588. package/dist/core/canvas/browse/__tests__/model.test.js +0 -290
  589. package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.d.ts +0 -1
  590. package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.js +0 -134
  591. package/dist/core/canvas/browse/__tests__/render.test.d.ts +0 -1
  592. package/dist/core/canvas/browse/__tests__/render.test.js +0 -111
  593. package/dist/core/canvas/browse/rebuild-coalescer.d.ts +0 -7
  594. package/dist/core/canvas/browse/rebuild-coalescer.js +0 -61
  595. package/dist/core/canvas/remote-event-stream.d.ts +0 -24
  596. package/dist/core/canvas/remote-event-stream.js +0 -94
  597. package/dist/core/feed/__tests__/coalesce-human.test.d.ts +0 -1
  598. package/dist/core/feed/__tests__/coalesce-human.test.js +0 -36
  599. package/dist/core/feed/__tests__/empty-node-guard.test.d.ts +0 -1
  600. package/dist/core/feed/__tests__/empty-node-guard.test.js +0 -45
  601. package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.d.ts +0 -1
  602. package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.js +0 -84
  603. package/dist/core/human/__tests__/visible-paths.test.d.ts +0 -1
  604. package/dist/core/human/__tests__/visible-paths.test.js +0 -28
  605. package/dist/core/keybindings/__tests__/inbox-affordance.test.d.ts +0 -1
  606. package/dist/core/keybindings/__tests__/inbox-affordance.test.js +0 -38
  607. package/dist/core/review/__tests__/project.test.d.ts +0 -1
  608. package/dist/core/review/__tests__/project.test.js +0 -71
  609. package/dist/core/runtime/__tests__/command-expansion.test.d.ts +0 -1
  610. package/dist/core/runtime/__tests__/command-expansion.test.js +0 -25
  611. package/dist/core/runtime/__tests__/session-visibility.test.d.ts +0 -1
  612. package/dist/core/runtime/__tests__/session-visibility.test.js +0 -119
  613. package/dist/core/runtime/__tests__/spawn-at-given-id.test.d.ts +0 -1
  614. package/dist/core/runtime/__tests__/spawn-at-given-id.test.js +0 -34
  615. package/dist/core/runtime/tmux.js +0 -1314
  616. package/dist/daemon/api/__tests__/full/push-parity.test.d.ts +0 -1
  617. package/dist/daemon/api/__tests__/full/worktree-parity.test.d.ts +0 -1
  618. package/dist/daemon/api/__tests__/full/worktree-parity.test.js +0 -160
  619. package/dist/daemon/api/__tests__/inbox.test.d.ts +0 -1
  620. package/dist/daemon/api/__tests__/inbox.test.js +0 -489
  621. package/dist/web-client/apple-touch-icon.png +0 -0
  622. package/dist/web-client/assets/fragment-mono-latin-400-normal-BYwT3kSJ.woff +0 -0
  623. package/dist/web-client/assets/fragment-mono-latin-400-normal-yxdJ5AmL.woff2 +0 -0
  624. package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-BbKYyvR9.woff2 +0 -0
  625. package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-CT4YFKeK.woff +0 -0
  626. package/dist/web-client/assets/index-CCPaLeW7.css +0 -2
  627. package/dist/web-client/assets/index-kyOWsnZK.js +0 -86
  628. package/dist/web-client/assets/martian-mono-cyrillic-wght-normal-B84CD5C_.woff2 +0 -0
  629. package/dist/web-client/assets/martian-mono-latin-ext-wght-normal-DlL6xMw5.woff2 +0 -0
  630. package/dist/web-client/assets/martian-mono-latin-wght-normal-5W32yIyr.woff2 +0 -0
  631. package/dist/web-client/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -2
  632. package/dist/web-client/icon-192.png +0 -0
  633. package/dist/web-client/icon-512.png +0 -0
  634. package/dist/web-client/icon-maskable-512.png +0 -0
  635. package/dist/web-client/index.html +0 -17
  636. package/dist/web-client/manifest.webmanifest +0 -1
  637. package/dist/web-client/sw.js +0 -1
  638. /package/dist/api/__tests__/{client.test.d.ts → serial/client.test.d.ts} +0 -0
  639. /package/dist/clients/inbox/__tests__/{inbox-controller.test.d.ts → serial/inbox-controller.test.d.ts} +0 -0
  640. /package/dist/clients/inbox/__tests__/{mount-panel.test.d.ts → serial/mount-panel.test.d.ts} +0 -0
  641. /package/dist/clients/{attach/__tests__/attach-chrome-remote.test.d.ts → inbox/review/__tests__/teardown-notice.test.d.ts} +0 -0
  642. /package/dist/{clients/attach/__tests__/attach-keybindings.test.d.ts → core/__tests__/broker-extension-canvas-db-boundary.test.d.ts} +0 -0
  643. /package/dist/{clients/attach/__tests__/crtr-output-coverage.test.d.ts → core/__tests__/seam/broker-attach-multiclient.test.d.ts} +0 -0
  644. /package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.d.ts +0 -0
  645. /package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.d.ts +0 -0
  646. /package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.d.ts +0 -0
  647. /package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.d.ts +0 -0
  648. /package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.d.ts +0 -0
  649. /package/dist/{clients/attach/__tests__/editor-frame-title.test.d.ts → core/__tests__/seam/dormancy-release.test.d.ts} +0 -0
  650. /package/dist/{clients/attach/__tests__/input-controller-extension-command.test.d.ts → core/__tests__/seam/yield-refresh-transaction.test.d.ts} +0 -0
  651. /package/dist/core/__tests__/{broker-fork-seam.test.d.ts → serial/broker-fork-seam.test.d.ts} +0 -0
  652. /package/dist/core/__tests__/{broker-sdk-wiring.test.d.ts → serial/broker-sdk-wiring.test.d.ts} +0 -0
  653. /package/dist/core/__tests__/{broker-snapshot-history.test.d.ts → serial/broker-snapshot-history.test.d.ts} +0 -0
  654. /package/dist/core/__tests__/{command-plugins.test.d.ts → serial/command-plugins.test.d.ts} +0 -0
  655. /package/dist/core/__tests__/{deferred-no-wake.test.d.ts → serial/deferred-no-wake.test.d.ts} +0 -0
  656. /package/dist/core/__tests__/{flagship-lifecycle.test.d.ts → serial/flagship-lifecycle.test.d.ts} +0 -0
  657. /package/dist/core/__tests__/{host-teardown-process-group.test.d.ts → serial/host-teardown-process-group.test.d.ts} +0 -0
  658. /package/dist/core/__tests__/{human-deliver-e2e.test.d.ts → serial/human-deliver-e2e.test.d.ts} +0 -0
  659. /package/dist/core/__tests__/{live-mutation.test.d.ts → serial/live-mutation.test.d.ts} +0 -0
  660. /package/dist/core/__tests__/{refresh-stall-recycle.test.d.ts → serial/refresh-stall-recycle.test.d.ts} +0 -0
  661. /package/dist/core/__tests__/{revive.test.d.ts → serial/revive.test.d.ts} +0 -0
  662. /package/dist/core/__tests__/{spawn-root.test.d.ts → serial/spawn-root.test.d.ts} +0 -0
  663. /package/dist/core/__tests__/{subscription-delivery.test.d.ts → serial/subscription-delivery.test.d.ts} +0 -0
  664. /package/dist/core/__tests__/{tmux-surface.test.d.ts → serial/tmux-surface.test.d.ts} +0 -0
  665. /package/dist/core/__tests__/{worktree.test.d.ts → serial/worktree.test.d.ts} +0 -0
  666. /package/dist/{clients/attach/__tests__/markdown-headings.test.d.ts → core/__tests__/watchdog-abort-arms-retry.test.d.ts} +0 -0
  667. /package/dist/{clients/attach/__tests__/session-identity-refresh.test.d.ts → core/broker-client/__tests__/transport-socket.test.d.ts} +0 -0
  668. /package/dist/core/human/__tests__/{inbox-core.test.d.ts → serial/inbox-core.test.d.ts} +0 -0
  669. /package/dist/{clients/inbox/review/__tests__/remap.test.d.ts → daemon/api/__tests__/node-model-validation.test.d.ts} +0 -0
  670. /package/dist/{clients/surfaces/region.js → daemon/api/__tests__/review-terminal-conflict.test.d.ts} +0 -0
  671. /package/dist/daemon/api/__tests__/{full → seam}/api-server.test.d.ts +0 -0
  672. /package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.d.ts +0 -0
  673. /package/dist/{clients/web/__tests__/push-engine.test.d.ts → daemon/api/__tests__/seam/leaf-api-parity.test.d.ts} +0 -0
@@ -10,7 +10,7 @@
10
10
  //
11
11
  // See harness-design.md §4/§5 and vehicle-and-hooks.md §6 for the architecture
12
12
  // this implements. The ONE production seam used is CRTR_PI_BINARY in
13
- // piCommand (src/core/runtime/tmux.ts) — no production file is modified.
13
+ // piCommand (src/core/runtime/tmux-driver.ts) — no production file is modified.
14
14
  //
15
15
  // Isolation contract (harness-design.md §4a):
16
16
  // • The harness itself runs AS a canvas node, so its OWN process.env carries
@@ -28,7 +28,6 @@ import { fileURLToPath } from 'node:url';
28
28
  import { createRequire } from 'node:module';
29
29
  import { createNode, getNode, recordPid, subscribersOf, subscriptionsOf, } from '../../canvas/canvas.js';
30
30
  import { closeDb } from '../../canvas/db.js';
31
- import { isFocused } from '../../runtime/placement.js';
32
31
  import { reviveNode } from '../../runtime/revive.js';
33
32
  import { superviseTick } from '../../../daemon/crtrd.js';
34
33
  import { DaemonFleet } from '../../../daemon/fleet.js';
@@ -57,18 +56,13 @@ const TSX_ESM = COMPILED ? null : createRequire(import.meta.url).resolve('tsx/es
57
56
  // A multi-word launcher, baked verbatim ahead of the (shell-quoted) argv by the
58
57
  // seam. Absolute paths so it works regardless of the spawned window's cwd.
59
58
  const FAKE_PI_BINARY = [process.execPath, ...(TSX_ESM === null ? [] : ['--import', TSX_ESM]), FAKE_PI_HOST].join(' ');
60
- // Every raw `tmux` call the harness/full-tier tests make against the shared
59
+ // Every raw `tmux` call the harness/compiled-seam tests make against the shared
61
60
  // DEFAULT server is synchronous (spawnSync). Node's spawnSync blocks the WHOLE
62
61
  // worker (no event loop, no `node --test` timeout can preempt it) until the
63
- // child exits — with no `timeout` option it can wait FOREVER. A wedged/CPU-
64
- // starved tmux server (the acknowledged "intermittent Linux-only crash-revive
65
- // wedge", CI-only) has been observed to hang one of these calls indefinitely,
66
- // which permanently consumes one of the `--test-concurrency` slots; as more
67
- // full-tier files each hit the SAME wedged server, every slot eventually gets
68
- // consumed the same way and the whole suite flatlines with zero further TAP
69
- // output (confirmed 3/3 in CI, see ci-full-suite-hang-blocker.md). TMUX_TIMEOUT_MS
70
- // bounds every raw tmux spawnSync call so a wedge fails that ONE call (and the
71
- // test it belongs to) fast instead of hanging the run.
62
+ // child exits — with no `timeout` option it can wait forever. A wedged or
63
+ // CPU-starved tmux server would consume a serialized seam worker indefinitely.
64
+ // TMUX_TIMEOUT_MS makes that one call and its test fail instead of hanging the
65
+ // whole suite.
72
66
  export const TMUX_TIMEOUT_MS = 10_000;
73
67
  /** True when a usable tmux is on PATH — tests gate on this and SKIP otherwise. */
74
68
  export function hasTmux() {
@@ -382,7 +376,7 @@ export async function createHarness(opts = {}) {
382
376
  // count). Scope the scan to "one or more lowercase-alnum segments ending
383
377
  // in an 8-hex random suffix" so a stray non-node sibling under nodes/ is
384
378
  // never miscounted as a new node dir — e.g. a `reports/` dir created for
385
- // an empty node id (the rare CI flake on full-tier run 27459304455 that
379
+ // an empty node id (the rare CI flake on compiled-seam run 27459304455 that
386
380
  // broke the spawn counters with `expected exactly 1 new node dir, got
387
381
  // [<id>, reports]`), or literal `reports` (no hyphen, no hex suffix).
388
382
  return readdirSync(join(home, 'nodes')).filter((d) => /^[a-z0-9]+(?:-[a-z0-9]+)*-[0-9a-f]{8}$/.test(d));
@@ -513,27 +507,6 @@ export async function createHarness(opts = {}) {
513
507
  closeDb();
514
508
  return id;
515
509
  },
516
- async spawnChild(parentId, task, o = {}) {
517
- const before = new Set(nodeDirs());
518
- const args = ['node', 'new', task, '--parent', parentId, '--cwd', CROUTER];
519
- if (o.kind)
520
- args.push('--kind', o.kind);
521
- if (o.mode)
522
- args.push('--mode', o.mode);
523
- if (o.model)
524
- args.push('--model', o.model);
525
- const res = cli(parentId, args);
526
- if (res.code !== 0) {
527
- throw new Error(`spawnChild(${parentId}) failed (code ${res.code})\n--stdout--\n${res.stdout}\n--stderr--\n${res.stderr}`);
528
- }
529
- const added = nodeDirs().filter((d) => !before.has(d));
530
- if (added.length !== 1) {
531
- throw new Error(`spawnChild: expected exactly 1 new node dir, got [${added.join(', ')}]`);
532
- }
533
- const childId = added[0];
534
- await harness.awaitBoot(childId);
535
- return childId;
536
- },
537
510
  async spawnHeadlessChild(parentId, task, o = {}) {
538
511
  const before = new Set(nodeDirs());
539
512
  // The synchronous CLI must reach the separate API fixture process, which
@@ -576,48 +549,12 @@ export async function createHarness(opts = {}) {
576
549
  await harness.awaitBoot(childId, { minCount: priorBoots + 1 });
577
550
  return childId;
578
551
  },
579
- async spawnHeadlessChildNoBoot(parentId, task, o = {}) {
580
- const before = new Set(nodeDirs());
581
- const args = ['node', 'new', task, '--parent', parentId, '--cwd', CROUTER];
582
- if (o.kind)
583
- args.push('--kind', o.kind);
584
- if (o.mode)
585
- args.push('--mode', o.mode);
586
- if (o.model)
587
- args.push('--model', o.model);
588
- const res = cli(parentId, args);
589
- if (res.code !== 0) {
590
- throw new Error(`spawnHeadlessChildNoBoot(${parentId}) failed (code ${res.code})\n--stdout--\n${res.stdout}\n--stderr--\n${res.stderr}`);
591
- }
592
- const added = nodeDirs().filter((d) => !before.has(d));
593
- if (added.length !== 1) {
594
- throw new Error(`spawnHeadlessChildNoBoot: expected exactly 1 new node dir, got [${added.join(', ')}]`);
595
- }
596
- return added[0];
597
- },
598
552
  cli,
599
- async turn(nodeId, text = '') {
600
- const base = eventCount(nodeId, 'agent_end');
601
- sendCmd(nodeId, { cmd: 'turn', id: `turn-${Date.now()}`, text });
602
- await awaitAgentEnd(nodeId, base, `turn agent_end for ${nodeId}`);
603
- },
604
553
  async stop(nodeId, reason = 'stop', errorMessage) {
605
554
  const base = eventCount(nodeId, 'agent_end');
606
555
  sendCmd(nodeId, { cmd: 'stop', id: `stop-${Date.now()}`, reason, errorMessage });
607
556
  await awaitAgentEnd(nodeId, base, `stop agent_end for ${nodeId}`);
608
557
  },
609
- async finish(nodeId, finalText) {
610
- const res = cli(nodeId, ['push', 'final', finalText]);
611
- if (res.code !== 0) {
612
- throw new Error(`finish(${nodeId}): push final failed (code ${res.code})\n${res.stderr}`);
613
- }
614
- // Fire agent_end so the now-done node runs the real (b) done branch
615
- // (null presence + ctx.shutdown → window closes), exactly as real pi would.
616
- const base = eventCount(nodeId, 'agent_end');
617
- sendCmd(nodeId, { cmd: 'stop', id: `finish-${Date.now()}` });
618
- await awaitAgentEnd(nodeId, base, `finish agent_end for ${nodeId}`);
619
- await harness.waitForPaneGone(nodeId);
620
- },
621
558
  async tick(now) {
622
559
  closeDb();
623
560
  // On the lane, after every already-enqueued exit job — the same strict
@@ -632,7 +569,6 @@ export async function createHarness(opts = {}) {
632
569
  await drainLane();
633
570
  closeDb();
634
571
  },
635
- drainFleet: drainLane,
636
572
  async awaitFleetExit(nodeId, timeoutMs = 15_000) {
637
573
  await waitFor(() => !fleet.has(nodeId), {
638
574
  timeoutMs,
@@ -706,18 +642,6 @@ export async function createHarness(opts = {}) {
706
642
  }, { timeoutMs: o.timeoutMs ?? 15_000, label: `wake delivery for ${nodeId}` });
707
643
  return fresh.map((e) => e.content);
708
644
  },
709
- async waitForStatus(nodeId, status, timeoutMs = 20_000) {
710
- await waitFor(() => {
711
- closeDb();
712
- return getNode(nodeId)?.status === status;
713
- }, { timeoutMs, label: `status=${status} for ${nodeId}` });
714
- },
715
- async waitForPaneGone(nodeId, timeoutMs = 20_000) {
716
- await waitFor(() => {
717
- closeDb();
718
- return !isFocused(nodeId);
719
- }, { timeoutMs, label: `viewer gone for ${nodeId}` });
720
- },
721
645
  waitFor,
722
646
  node(nodeId) {
723
647
  closeDb();
@@ -727,10 +651,6 @@ export async function createHarness(opts = {}) {
727
651
  closeDb();
728
652
  return getNode(nodeId)?.status ?? null;
729
653
  },
730
- paneAlive(nodeId) {
731
- closeDb();
732
- return isFocused(nodeId);
733
- },
734
654
  inbox(nodeId) {
735
655
  closeDb();
736
656
  return readInboxSince(nodeId);
@@ -4,7 +4,7 @@
4
4
  // onto a tmux pane option that the `crtr surface attach` viewer self-sets once
5
5
  // its startup checkpoint clears (`clients/attach/session/pane-tag.ts`). These
6
6
  // helpers are the ground truth for "which pane is a node's viewer", shared by
7
- // every full-tier test that asserts viewer dedup or teardown.
7
+ // every compiled-seam test that asserts viewer dedup or teardown.
8
8
  //
9
9
  // The waiter dumps the live pane table AND each pane's rendered screen on
10
10
  // failure: when a viewer never tags, the reason is almost always printed inside
@@ -1,148 +1,19 @@
1
1
  // Run with: node --import tsx/esm --test src/core/__tests__/inline-memory-refs.test.ts
2
2
  //
3
- // Load-bearing shared-contract regression for the inline memory-reference
4
- // token grammar (spec §4.1): `src/core/memory/inline-ref-grammar.ts` is the
5
- // SINGLE implementation the broker, terminal attach viewer, and web composer
6
- // all consume. This file (Wave C1) covers the grammar/caret cases. Wave C4
7
- // extends it (below, in its own `describe`) with the
8
- // corpus/inventory/guidance cases: `buildRefInventory`'s precedence dedup,
9
- // both-kinds/gated/slash:false referenceability, INDEX naming, and
10
- // metadata-only output, plus `buildGuidance`'s exact-match resolution,
11
- // duplicate collapse, and first-appearance ordering.
3
+ // Load-bearing corpus regression for `buildRefInventory` — the authoritative
4
+ // inventory the broker and terminal attach viewer both resolve inline memory
5
+ // references against. Covers scope precedence dedup, referenceability
6
+ // (both kinds, gated and slash docs), INDEX folding, malformed-doc omission,
7
+ // metadata-only rows, and stable ordering, all over real on-disk fixtures.
12
8
  import { test, describe, before, beforeEach, after } from 'node:test';
13
9
  import assert from 'node:assert/strict';
14
10
  import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';
15
11
  import { tmpdir } from 'node:os';
16
12
  import { join } from 'node:path';
17
- import { findRefTokens, formatRefToken, findRefTokenAtCaret, } from '../memory/inline-ref-grammar.js';
18
13
  import { resetScopeCache } from '../scope.js';
19
14
  import { clearSessionCache } from '../substrate/session-cache.js';
20
15
  import { memoryDir as nodeMemoryDir } from '../runtime/memory.js';
21
16
  import { buildRefInventory } from '../memory/inline-ref-inventory.js';
22
- import { buildGuidance } from '../memory/inline-ref-guidance.js';
23
- // One compact case table drives `findRefTokens` over the spec §4.1 + §5
24
- // examples: candidate decoding, punctuation trimming, first-segment-only
25
- // stops, and ASCII whitespace-boundary rejection.
26
- const GRAMMAR_CASES = [
27
- { text: '/dev', expect: [{ raw: '/dev', candidate: 'dev' }] },
28
- { text: 'read /dev before starting', expect: [{ raw: '/dev', candidate: 'dev' }] },
29
- { text: '/taste:foo', expect: [{ raw: '/taste:foo', candidate: 'taste/foo' }] },
30
- { text: '/a:b:c', expect: [{ raw: '/a:b:c', candidate: 'a/b/c' }] },
31
- // Trailing punctuation is excluded (never even captured, since it is
32
- // outside the [A-Za-z0-9_:-] class).
33
- { text: 'read /dev. before starting', expect: [{ raw: '/dev', candidate: 'dev' }] },
34
- { text: 'see /taste:foo)', expect: [{ raw: '/taste:foo', candidate: 'taste/foo' }] },
35
- { text: '/dev,', expect: [{ raw: '/dev', candidate: 'dev' }] },
36
- // Trailing `:` `-` `_` inside the captured run ARE trimmed (step 3).
37
- { text: '/dev:', expect: [{ raw: '/dev', candidate: 'dev' }] },
38
- { text: '/dev-', expect: [{ raw: '/dev', candidate: 'dev' }] },
39
- { text: '/dev_', expect: [{ raw: '/dev', candidate: 'dev' }] },
40
- { text: '/dev__--::', expect: [{ raw: '/dev', candidate: 'dev' }] },
41
- // Nothing survives the trim -> no token.
42
- { text: '/___', expect: [] },
43
- { text: '/:::', expect: [] },
44
- // A first segment only: `/foo/bar` yields the token `/foo`; `/bar` is not
45
- // at a whitespace boundary.
46
- { text: '/foo/bar', expect: [{ raw: '/foo', candidate: 'foo' }] },
47
- // ASCII boundary rejection: a `/` preceded by any non-whitespace character
48
- // is not a token start.
49
- { text: 'http://example.com', expect: [] },
50
- { text: 'and/or', expect: [] },
51
- { text: '/usr/local/bin', expect: [{ raw: '/usr', candidate: 'usr' }] },
52
- // Case sensitivity: candidate preserves original case (no normalization).
53
- { text: '/Dev', expect: [{ raw: '/Dev', candidate: 'Dev' }] },
54
- { text: '/dev /Dev', expect: [{ raw: '/dev', candidate: 'dev' }, { raw: '/Dev', candidate: 'Dev' }] },
55
- // No leading text at all: start-of-input is a valid boundary.
56
- { text: '/dev fix the build', expect: [{ raw: '/dev', candidate: 'dev' }] },
57
- // No token characters at all after the slash.
58
- { text: 'a / b', expect: [] },
59
- ];
60
- test('findRefTokens: §4.1 grammar table', () => {
61
- for (const { text, expect } of GRAMMAR_CASES) {
62
- const tokens = findRefTokens(text);
63
- assert.deepEqual(tokens.map((t) => ({ raw: t.raw, candidate: t.candidate })), expect, `findRefTokens(${JSON.stringify(text)})`);
64
- // start/end must always bound `raw` exactly.
65
- for (const t of tokens) {
66
- assert.equal(text.slice(t.start, t.end), t.raw, `span mismatch for ${JSON.stringify(text)}`);
67
- }
68
- }
69
- });
70
- test('findRefTokens: nested-decode offsets are exact', () => {
71
- const text = 'see /taste:foo) now';
72
- const [tok] = findRefTokens(text);
73
- assert.equal(tok.start, 4);
74
- assert.equal(tok.end, 14); // just past 'o' in 'foo', before ')'
75
- assert.equal(text.slice(tok.start, tok.end), '/taste:foo');
76
- });
77
- test('formatRefToken: canonical name -> surface token', () => {
78
- assert.equal(formatRefToken('dev'), '/dev');
79
- assert.equal(formatRefToken('taste/foo'), '/taste:foo');
80
- assert.equal(formatRefToken('a/b/c'), '/a:b:c');
81
- });
82
- test('formatRefToken round-trips through findRefTokens candidates', () => {
83
- for (const name of ['dev', 'taste/foo', 'a/b/c', 'spec-driven-development/spec-writing']) {
84
- const surface = formatRefToken(name);
85
- const [tok] = findRefTokens(surface);
86
- assert.equal(tok?.candidate, name, `round-trip for ${name}`);
87
- }
88
- });
89
- test('findRefTokenAtCaret: incomplete prefix (no trailing name segment yet)', () => {
90
- const text = '/taste:';
91
- const caret = findRefTokenAtCaret(text, text.length);
92
- assert.deepEqual(caret, { start: 0, end: 7, surfacePrefix: '/taste:' });
93
- });
94
- test('findRefTokenAtCaret: caret mid-token is suffix-inclusive', () => {
95
- const text = 'before /dev after';
96
- const idx = text.indexOf('/dev') + 2; // caret between 'd' and 'e'
97
- const caret = findRefTokenAtCaret(text, idx);
98
- assert.deepEqual(caret, { start: 7, end: 11, surfacePrefix: '/d' });
99
- assert.equal(text.slice(caret.start, caret.end), '/dev');
100
- });
101
- test('findRefTokenAtCaret: caret just after a bare slash', () => {
102
- const text = 'prose / ';
103
- const caret = findRefTokenAtCaret(text, text.indexOf('/') + 1);
104
- assert.deepEqual(caret, { start: 6, end: 7, surfacePrefix: '/' });
105
- });
106
- test('findRefTokenAtCaret: no token touching caret -> null', () => {
107
- assert.equal(findRefTokenAtCaret('plain prose', 3), null);
108
- assert.equal(findRefTokenAtCaret('and/or here', 6), null); // '/' not a token start
109
- assert.equal(findRefTokenAtCaret('', 0), null);
110
- });
111
- test('findRefTokenAtCaret: caret at start of a leading token', () => {
112
- const text = '/dev fix this';
113
- const caret = findRefTokenAtCaret(text, 1); // right after the slash
114
- assert.deepEqual(caret, { start: 0, end: 4, surfacePrefix: '/' });
115
- });
116
- // ---------------------------------------------------------------------------
117
- // Wave C4 — buildGuidance: pure over (text, names), no filesystem/corpus
118
- // involved. See the fixture-backed buildRefInventory suite below for the
119
- // corpus/precedence/metadata cases.
120
- // ---------------------------------------------------------------------------
121
- const GUIDANCE_HEADER = 'The human explicitly referenced these memory documents. Before acting on the portion of their message that references each document, run the corresponding command and treat its returned content as authoritative context:';
122
- test('buildGuidance: single resolved ref emits the exact directive header + one read line', () => {
123
- const names = new Set(['dev']);
124
- const result = buildGuidance('read /dev before starting', names);
125
- assert.equal(result, [GUIDANCE_HEADER, '- crtr memory read dev'].join('\n'));
126
- });
127
- test('buildGuidance: nested-name candidates decode back to slash form in the read line', () => {
128
- const names = new Set(['taste/foo']);
129
- const result = buildGuidance('see /taste:foo) now', names);
130
- assert.equal(result, [GUIDANCE_HEADER, '- crtr memory read taste/foo'].join('\n'));
131
- });
132
- test('buildGuidance: duplicate refs collapse to one instruction; distinct refs list in first-appearance order', () => {
133
- const names = new Set(['dev', 'taste/foo']);
134
- const result = buildGuidance('/dev do X, then /taste:foo, and /dev again', names);
135
- assert.equal(result, [GUIDANCE_HEADER, '- crtr memory read dev', '- crtr memory read taste/foo'].join('\n'));
136
- });
137
- test('buildGuidance: an unresolved/unknown token produces no guidance', () => {
138
- assert.equal(buildGuidance('/nope has nothing to do with it', new Set(['dev'])), null);
139
- });
140
- test('buildGuidance: text with no slash tokens at all returns null', () => {
141
- assert.equal(buildGuidance('plain prose, nothing to see here', new Set(['dev'])), null);
142
- });
143
- test('buildGuidance: exact case-sensitive matching — a differently-cased token does not resolve', () => {
144
- assert.equal(buildGuidance('/Dev fix this', new Set(['dev'])), null);
145
- });
146
17
  // ---------------------------------------------------------------------------
147
18
  // Wave C4 — buildRefInventory: the authoritative corpus builder. Fixture-
148
19
  // backed (node/project/user scope docs on disk), since precedence dedup,
@@ -15,7 +15,7 @@ import { closeDb } from '../canvas/db.js';
15
15
  import { buildReviveKickoff, clearYieldMessage, drainBearings, readYieldMessage, writeYieldMessage, yieldMessagePath, } from '../runtime/kickoff.js';
16
16
  import { appendInbox, readCursor } from '../feed/inbox.js';
17
17
  import { appendSituationalContext } from '../runtime/situational-context.js';
18
- import { buildContextIntro } from '../../pi-extensions/canvas-context-intro.js';
18
+ import { buildContextBearings as buildContextIntro } from '../runtime/bearings.js';
19
19
  let home;
20
20
  function node(id) {
21
21
  return {
@@ -20,7 +20,7 @@ import { mkdtempSync, mkdirSync, rmSync, writeFileSync, realpathSync } from 'nod
20
20
  import { tmpdir } from 'node:os';
21
21
  import { join } from 'node:path';
22
22
  import { resetScopeCache } from '../scope.js';
23
- import { resolveMemoryDoc } from '../memory-resolver.js';
23
+ import { resolveMemoryDoc, resolveMemoryDocs } from '../memory-resolver.js';
24
24
  let home;
25
25
  let base;
26
26
  let root;
@@ -91,6 +91,18 @@ test('a physical-path query whose nearest match diverged in identity from a fart
91
91
  process.chdir(prevCwd);
92
92
  }
93
93
  });
94
+ test('batch resolution preserves direct-path precedence over a farther matching identity', () => {
95
+ process.chdir(child);
96
+ resetScopeCache();
97
+ try {
98
+ const doc = resolveMemoryDocs(['AGENTS']).get('AGENTS');
99
+ assert.equal(doc?.path, join(child, '.crouter', 'memory', 'AGENTS.md'));
100
+ assert.match(doc?.body ?? '', /CHILD AGENTS BODY/);
101
+ }
102
+ finally {
103
+ process.chdir(prevCwd);
104
+ }
105
+ });
94
106
  test('a migrated nested doc resolves by its explicit slashed identity', () => {
95
107
  process.chdir(grandchild);
96
108
  resetScopeCache();
@@ -128,6 +140,22 @@ test('a bare-directory query resolves to that dir\'s INDEX.md, nearest copy firs
128
140
  process.chdir(prevCwd);
129
141
  }
130
142
  });
143
+ test("an explicit '<dir>/INDEX' identity resolves to that physical INDEX.md", () => {
144
+ // The assembled memory tree addresses a directory INDEX by its extensionless
145
+ // resolver identity, so `<dir>/INDEX` must resolve to the physical INDEX.md
146
+ // and report back the same identifier it was asked for.
147
+ process.chdir(child);
148
+ resetScopeCache();
149
+ try {
150
+ const doc = resolveMemoryDoc('taste/INDEX');
151
+ assert.equal(doc.path, join(child, '.crouter', 'memory', 'taste', 'INDEX.md'));
152
+ assert.equal(doc.name, 'taste/INDEX');
153
+ assert.match(doc.body, /CHILD TASTE INDEX/);
154
+ }
155
+ finally {
156
+ process.chdir(prevCwd);
157
+ }
158
+ });
131
159
  test('--kind skips a nearer wrong-kind (frontmatter-less, kind-defaulted) doc and resolves the farther matching-kind doc', () => {
132
160
  process.chdir(child);
133
161
  resetScopeCache();
@@ -8,6 +8,7 @@ import { DatabaseSync } from 'node:sqlite';
8
8
  import { openDb, closeDb, migrate, MIGRATIONS } from '../canvas/db.js';
9
9
  import { canvasDbPath, ensureHome } from '../canvas/paths.js';
10
10
  import { customExtensionPaths } from '../canvas/extensions.js';
11
+ import { assertMandatoryCanvasExtensions, CANVAS_EXTENSIONS, mergeCanvasExtensions } from '../runtime/canvas-extensions.js';
11
12
  import { updateNode } from '../canvas/canvas.js';
12
13
  import { spawn, spawnSync } from 'node:child_process';
13
14
  const HERE = dirname(fileURLToPath(import.meta.url));
@@ -84,6 +85,21 @@ test('a persisted review-boundary canvas prefix is not treated as custom extensi
84
85
  const persisted = REVIEW_BOUNDARY_CANVAS_EXTENSION_NAMES.map((name) => `/old-generation/pi-extensions/${name}.js`);
85
86
  assert.deepEqual(customExtensionPaths(persisted), []);
86
87
  });
88
+ test('stale generation hooks are retired structurally without dropping user extensions', () => {
89
+ const stale = [
90
+ 'canvas-inbox-watcher', 'canvas-stophook', 'canvas-recap', 'canvas-goal-capture',
91
+ 'canvas-passive-context', 'canvas-context-intro', 'canvas-tool-guide',
92
+ 'canvas-doc-substrate', 'canvas-structured-output', 'canvas-bash-valve',
93
+ ].map((name) => `/Users/silasrhyneer/.crouter/runtime/generations/d3ff9346e6df88f88c44af898a028a8fd6f03466eb216d7cd3b70a734f71a11b/dist/pi-extensions/${name}.js`);
94
+ assert.deepEqual(customExtensionPaths(stale), []);
95
+ assert.deepEqual(customExtensionPaths([...stale, '/Users/silasrhyneer/extensions/canvas-foo.js']), ['/Users/silasrhyneer/extensions/canvas-foo.js']);
96
+ });
97
+ test('a retained custom extension sharing a canvas-hook basename still launches', () => {
98
+ const custom = '/Users/silasrhyneer/extensions/canvas-recap.js';
99
+ assert.deepEqual(customExtensionPaths([custom]), [custom]);
100
+ assert.doesNotThrow(() => assertMandatoryCanvasExtensions(mergeCanvasExtensions([custom])));
101
+ assert.throws(() => assertMandatoryCanvasExtensions([...CANVAS_EXTENSIONS, '/stale-root/pi-extensions/canvas-recap.js']), /duplicate mandatory canvas extension basename canvas-recap/);
102
+ });
87
103
  test('a v14 canvas normalizes historical canvas paths while retaining custom launch extras', () => {
88
104
  const metaPath = join(home, 'nodes', 'saved', 'meta.json');
89
105
  mkdirSync(join(home, 'nodes', 'saved'), { recursive: true });
@@ -265,54 +281,6 @@ test('v4 migrates a db with a pre-existing orphan edge without throwing', () =>
265
281
  assert.equal(surviving.from_id, 'n1');
266
282
  assert.equal(surviving.to_id, 'n2');
267
283
  });
268
- test('v4 leaves the FK live: an edge to a missing node is rejected', () => {
269
- const raw = buildV3Db();
270
- insertNode(raw, 'n1');
271
- raw.close();
272
- const db = openDb();
273
- assert.equal(userVersion(db), MIGRATIONS.length);
274
- // Inserting an edge whose endpoint has no node row now violates the FK.
275
- assert.throws(() => db
276
- .prepare('INSERT INTO edges (type, from_id, to_id, active, created) VALUES (?,?,?,?,?)')
277
- .run('spawned_by', 'n1', 'missing', 1, '2020-01-01T00:00:00Z'), /FOREIGN KEY|constraint/i);
278
- // A fully-valid edge (both endpoints present) still inserts fine.
279
- insertNode(db, 'n3');
280
- assert.doesNotThrow(() => db
281
- .prepare('INSERT INTO edges (type, from_id, to_id, active, created) VALUES (?,?,?,?,?)')
282
- .run('subscribes_to', 'n1', 'n3', 1, '2020-01-01T00:00:00Z'));
283
- });
284
- test('v4 deleting a node cascade-deletes its edges', () => {
285
- const raw = buildV3Db();
286
- insertNode(raw, 'a');
287
- insertNode(raw, 'b');
288
- insertEdge(raw, 'subscribes_to', 'a', 'b');
289
- insertEdge(raw, 'spawned_by', 'b', 'a');
290
- raw.close();
291
- const db = openDb();
292
- assert.equal(edgeCount(db), 2);
293
- // Delete one endpoint — every edge touching it cascades away.
294
- db.prepare('DELETE FROM nodes WHERE node_id = ?').run('a');
295
- assert.equal(edgeCount(db), 0);
296
- });
297
- test('v4 is idempotent on re-open', () => {
298
- const raw = buildV3Db();
299
- insertNode(raw, 'n1');
300
- insertEdge(raw, 'subscribes_to', 'n1', 'n1');
301
- raw.close();
302
- const db = openDb();
303
- assert.equal(userVersion(db), MIGRATIONS.length);
304
- assert.equal(edgeCount(db), 1);
305
- // Re-running migrate() directly is a no-op (gate skips applied steps); the
306
- // edges table is NOT rebuilt again.
307
- assert.doesNotThrow(() => migrate(db));
308
- assert.equal(userVersion(db), MIGRATIONS.length);
309
- assert.equal(edgeCount(db), 1);
310
- // Re-opening from disk is likewise a no-op — the FK + data persist.
311
- closeDb();
312
- const db2 = openDb();
313
- assert.equal(userVersion(db2), MIGRATIONS.length);
314
- assert.equal(edgeCount(db2), 1);
315
- });
316
284
  function buildV4DbWithLaterColumns() {
317
285
  ensureHome();
318
286
  const raw = new DatabaseSync(canvasDbPath());
@@ -365,6 +333,25 @@ test('bug #99: a stale v4 db with later columns already present migrates cleanly
365
333
  assert.equal(row.pane, '%9');
366
334
  assert.equal(row.host_kind, 'broker');
367
335
  });
336
+ test('v16 repairs a v15 database missing canonical finalization columns', () => {
337
+ ensureHome();
338
+ const db = new DatabaseSync(join(home, 'finalization.db'));
339
+ try {
340
+ MIGRATIONS[0](db);
341
+ db.exec('PRAGMA user_version = 15');
342
+ migrate(db);
343
+ const columns = nodeColumns(db);
344
+ assert.ok(columns.includes('final_report'));
345
+ assert.ok(columns.includes('finalized_at'));
346
+ // migrate() always brings a db to the latest schema, not just v16 — assert
347
+ // against the live migration count rather than a version snapshot that will
348
+ // go stale every time a new migration is appended.
349
+ assert.equal(userVersion(db), MIGRATIONS.length);
350
+ }
351
+ finally {
352
+ db.close();
353
+ }
354
+ });
368
355
  // --- v22: legacy schedules → crons ------------------------------------------
369
356
  function buildV21Db() {
370
357
  ensureHome();
@@ -1,16 +1,17 @@
1
1
  // On-read context surfaces at most once per conversation. The dedup set lives
2
2
  // at nodes/<id>/injected-docs.json so a process resumed onto the same transcript
3
- // rehydrates it, while a fresh transcript clears it.
3
+ // rehydrates it, while a fresh transcript clears it. The same loader resolves a
4
+ // doc's identity with the explicit-name-then-path-fallback rule the boot resolver
5
+ // uses (schema.ts's resolveDocName), never deriving `name` from the path alone.
4
6
  //
5
7
  // Run: node --import tsx/esm --test src/core/__tests__/on-read-dedup-resume.test.ts
6
8
  import { test, before, beforeEach, after } from 'node:test';
7
9
  import assert from 'node:assert/strict';
8
- import { mkdtempSync, mkdirSync, rmSync, writeFileSync, existsSync } from 'node:fs';
10
+ import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';
9
11
  import { tmpdir } from 'node:os';
10
12
  import { join } from 'node:path';
11
13
  import { closeDb } from '../canvas/db.js';
12
14
  import { resetScopeCache } from '../scope.js';
13
- import { injectedDocsPath } from '../canvas/paths.js';
14
15
  import { spawnNode } from '../runtime/nodes.js';
15
16
  import { renderOnReadDocs } from '../substrate/on-read.js';
16
17
  import { loadInjectedDocs, saveInjectedDocs, clearInjectedDocs, } from '../substrate/injected-store.js';
@@ -44,15 +45,6 @@ after(() => {
44
45
  else
45
46
  process.env['HOME'] = prevHomeEnv;
46
47
  });
47
- test('injected-store round-trips and clears', () => {
48
- const node = spawnNode({ kind: 'general', cwd: work, parent: null }).node_id;
49
- assert.deepEqual([...loadInjectedDocs(node)], [], 'cold load is empty');
50
- saveInjectedDocs(node, new Set(['/a', '/b']));
51
- assert.deepEqual([...loadInjectedDocs(node)].sort(), ['/a', '/b'], 'save then load round-trips');
52
- clearInjectedDocs(node);
53
- assert.ok(!existsSync(injectedDocsPath(node)), 'clear removes the file');
54
- assert.deepEqual([...loadInjectedDocs(node)], [], 'load after clear is empty');
55
- });
56
48
  test('project and user memory docs without applies-to do not fire on file reads', () => {
57
49
  const fakeHome = mkdtempSync(join(tmpdir(), 'crtr-onread-user-home-'));
58
50
  process.env['HOME'] = fakeHome;
@@ -107,3 +99,21 @@ test('on-read doc surfaces once, stays deduped across a revive(resume), re-surfa
107
99
  const seenFresh = loadInjectedDocs(node);
108
100
  assert.ok(renderOnReadDocs(node, readFile, seenFresh).includes(FIXTURE_BODY), 'a fresh transcript surfaces the doc again');
109
101
  });
102
+ test('an explicitly routed doc injects on-read under its frontmatter name, not the path-derived one', () => {
103
+ const node = spawnNode({ kind: 'general', cwd: work, parent: null }).node_id;
104
+ const memDir = join(work, '.crouter', 'memory');
105
+ mkdirSync(memDir, { recursive: true });
106
+ writeFileSync(join(memDir, 'physical-guide.md'), '---\nkind: knowledge\n' +
107
+ 'name: acme-project\n' +
108
+ 'when-and-why-to-read: When reading acme source, this knowledge should be read because it carries the project-specific implementation constraints.\n' +
109
+ 'file-read-visibility: content\n' +
110
+ 'applies-to: "src/**"\n---\n' +
111
+ 'ACME PROJECT OPERATING GUIDE\n');
112
+ const readFile = join(work, 'src', 'file.ts');
113
+ mkdirSync(join(work, 'src'), { recursive: true });
114
+ writeFileSync(readFile, 'export const x = 1;\n');
115
+ const rendered = renderOnReadDocs(node, readFile, new Set());
116
+ assert.ok(rendered.includes('ACME PROJECT OPERATING GUIDE'), 'the matching explicit route fires');
117
+ assert.ok(rendered.includes('<memory kind="knowledge" name="acme-project"'), `expected explicit frontmatter name "acme-project" in the injected envelope, got: ${rendered}`);
118
+ assert.ok(!rendered.includes('name="physical-guide"'), 'must not fall back to the path-derived name when frontmatter sets one');
119
+ });