@north-light/crouter 0.3.173 → 0.3.175

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (674) hide show
  1. package/bin/runtime-selector.mjs +8 -1
  2. package/dist/api/__tests__/{client.test.js → serial/client.test.js} +2 -135
  3. package/dist/api/client.d.ts +12 -21
  4. package/dist/api/client.js +22 -31
  5. package/dist/api/dto/broker-ops.d.ts +158 -0
  6. package/dist/api/dto/broker-ops.js +6 -0
  7. package/dist/api/dto/crons.d.ts +6 -0
  8. package/dist/api/dto/human.d.ts +7 -1
  9. package/dist/api/dto/inbox.d.ts +1 -71
  10. package/dist/api/dto/inbox.js +1 -9
  11. package/dist/api/dto/nodes.d.ts +6 -7
  12. package/dist/api/dto/reviews.d.ts +1 -11
  13. package/dist/api/routes.d.ts +7 -4
  14. package/dist/api/routes.js +8 -5
  15. package/dist/build-root.js +3 -3
  16. package/dist/builtin-memory/04-base-worker.md +1 -4
  17. package/dist/builtin-memory/05-kinds/advisor/00-base.md +1 -5
  18. package/dist/builtin-memory/05-kinds/advisor/01-orchestrator.md +2 -7
  19. package/dist/builtin-memory/05-kinds/design/00-base.md +1 -6
  20. package/dist/builtin-memory/05-kinds/developer/00-base.md +1 -6
  21. package/dist/builtin-memory/05-kinds/explore/00-base.md +1 -4
  22. package/dist/builtin-memory/05-kinds/explore/01-orchestrator.md +1 -2
  23. package/dist/builtin-memory/05-kinds/general/00-base.md +1 -3
  24. package/dist/builtin-memory/05-kinds/plan/00-base.md +1 -6
  25. package/dist/builtin-memory/05-kinds/plan/reviewers/00-base.md +1 -2
  26. package/dist/builtin-memory/05-kinds/plan/reviewers/architecture-fit.md +1 -3
  27. package/dist/builtin-memory/05-kinds/plan/reviewers/code-smells.md +1 -3
  28. package/dist/builtin-memory/05-kinds/plan/reviewers/pattern-consistency.md +1 -3
  29. package/dist/builtin-memory/05-kinds/plan/reviewers/requirements-coverage.md +1 -3
  30. package/dist/builtin-memory/05-kinds/plan/reviewers/security.md +1 -4
  31. package/dist/builtin-memory/05-kinds/review/companion/00-base.md +2 -3
  32. package/dist/builtin-memory/05-kinds/spec/00-base.md +1 -2
  33. package/dist/builtin-memory/advisor/council.md +1 -6
  34. package/dist/builtin-memory/design.md +2 -7
  35. package/dist/builtin-memory/development.md +9 -14
  36. package/dist/builtin-memory/internal/marketplaces.md +2 -6
  37. package/dist/builtin-memory/internal/nodes-and-canvas.md +1 -1
  38. package/dist/builtin-memory/internal/plugins.md +2 -8
  39. package/dist/builtin-memory/internal/storage-tiers.md +1 -2
  40. package/dist/builtin-memory/testing.md +41 -0
  41. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/{provider-rotation.test.ts → serial/provider-rotation.test.ts} +27 -179
  42. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/claude-plugin-commands.ts +5 -15
  43. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/index.ts +1 -28
  44. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/memory-slash-commands.ts +43 -88
  45. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.js +7 -1
  46. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +9 -1
  47. package/dist/cli.js +2 -2
  48. package/dist/clients/attach/__tests__/attach-remote-readonly.test.js +37 -131
  49. package/dist/clients/attach/__tests__/chat-view-snapshot-ordering.test.js +71 -152
  50. package/dist/clients/attach/__tests__/context-message.test.js +16 -174
  51. package/dist/clients/attach/__tests__/crtr-output.test.js +36 -2069
  52. package/dist/clients/attach/__tests__/diagram.test.js +2 -2
  53. package/dist/clients/attach/__tests__/edit-diff.test.js +0 -4
  54. package/dist/clients/attach/__tests__/file-review-focus.test.js +2 -1
  55. package/dist/clients/attach/__tests__/group-activity.test.js +40 -229
  56. package/dist/clients/attach/__tests__/oauth-dialog-lifecycle.test.js +26 -76
  57. package/dist/clients/attach/__tests__/prompt-preview.test.js +4 -70
  58. package/dist/clients/attach/__tests__/ref-autocomplete.test.js +11 -125
  59. package/dist/clients/attach/__tests__/titled-editor-preview.test.js +14 -205
  60. package/dist/clients/attach/command.d.ts +2 -1
  61. package/dist/clients/attach/command.js +81 -76
  62. package/dist/clients/attach/input/capabilities.d.ts +27 -0
  63. package/dist/clients/attach/input/capabilities.js +96 -0
  64. package/dist/clients/attach/input/controller.d.ts +20 -182
  65. package/dist/clients/attach/input/controller.js +128 -537
  66. package/dist/clients/attach/input/overlay-owner.d.ts +41 -0
  67. package/dist/clients/attach/input/overlay-owner.js +199 -0
  68. package/dist/clients/attach/overlays/file-review.d.ts +0 -4
  69. package/dist/clients/attach/overlays/file-review.js +13 -5
  70. package/dist/clients/attach/overlays/graph.js +2 -10
  71. package/dist/clients/attach/render/chat-view.d.ts +4 -3
  72. package/dist/clients/attach/render/chat-view.js +39 -33
  73. package/dist/clients/attach/render/group-activity.d.ts +1 -0
  74. package/dist/clients/attach/render/group-activity.js +20 -13
  75. package/dist/clients/attach/render/group-recap.js +12 -3
  76. package/dist/clients/attach/session/connection.js +9 -15
  77. package/dist/clients/attach/session/editor-inventory.d.ts +6 -5
  78. package/dist/clients/attach/session/editor-inventory.js +7 -8
  79. package/dist/clients/attach/session/file-links.d.ts +13 -0
  80. package/dist/clients/attach/session/file-links.js +107 -0
  81. package/dist/clients/attach/session/frame.d.ts +3 -0
  82. package/dist/clients/attach/session/frame.js +10 -1
  83. package/dist/clients/attach/session/frames.js +2 -3
  84. package/dist/clients/attach/session/input-wiring.d.ts +4 -1
  85. package/dist/clients/attach/session/input-wiring.js +15 -14
  86. package/dist/clients/attach/session/mouse.d.ts +6 -1
  87. package/dist/clients/attach/session/mouse.js +8 -5
  88. package/dist/clients/attach/session/profile-files.js +18 -12
  89. package/dist/clients/attach/session/reconnect.js +1 -1
  90. package/dist/clients/attach/session/state-sync.js +1 -2
  91. package/dist/clients/attach/session/surface-host.d.ts +3 -2
  92. package/dist/clients/attach/session/surface-host.js +4 -4
  93. package/dist/clients/attach/slash/dispatch.d.ts +8 -31
  94. package/dist/clients/attach/slash/dispatch.js +34 -81
  95. package/dist/clients/attach/viewer.js +820 -860
  96. package/dist/clients/conversation/projection.d.ts +79 -0
  97. package/dist/clients/conversation/projection.js +341 -0
  98. package/dist/clients/inbox/__tests__/serial/inbox-controller.test.js +159 -0
  99. package/dist/clients/inbox/__tests__/serial/mount-panel.test.js +151 -0
  100. package/dist/clients/inbox/controller.d.ts +0 -4
  101. package/dist/clients/inbox/controller.js +0 -2
  102. package/dist/clients/inbox/review/__tests__/review-core.test.js +4 -293
  103. package/dist/clients/inbox/review/__tests__/teardown-notice.test.js +100 -0
  104. package/dist/clients/inbox/review/comments-client.d.ts +3 -2
  105. package/dist/clients/inbox/review/comments-client.js +12 -12
  106. package/dist/clients/inbox/review/companion-pane.d.ts +30 -0
  107. package/dist/clients/inbox/review/companion-pane.js +86 -0
  108. package/dist/clients/inbox/review/document-surface.d.ts +182 -0
  109. package/dist/clients/inbox/review/{document-region.js → document-surface.js} +252 -48
  110. package/dist/clients/inbox/review/frame.js +5 -4
  111. package/dist/clients/inbox/review/launch.d.ts +8 -8
  112. package/dist/clients/inbox/review/launch.js +52 -92
  113. package/dist/clients/inbox/review/nvim.d.ts +2 -0
  114. package/dist/clients/inbox/review/nvim.js +14 -12
  115. package/dist/clients/inbox/review/review-client.d.ts +12 -8
  116. package/dist/clients/inbox/review/review-client.js +46 -35
  117. package/dist/clients/inbox/review-adapter.d.ts +3 -10
  118. package/dist/clients/inbox/review-adapter.js +27 -19
  119. package/dist/clients/inbox/surface.d.ts +0 -4
  120. package/dist/clients/inbox/surface.js +0 -2
  121. package/dist/clients/surfaces/host.d.ts +11 -3
  122. package/dist/commands/__tests__/api-client-cold-start-diagnostic.test.js +7 -34
  123. package/dist/commands/__tests__/human.test.js +11 -322
  124. package/dist/commands/api-client.d.ts +5 -5
  125. package/dist/commands/api-client.js +6 -85
  126. package/dist/commands/canvas-browse.js +3 -29
  127. package/dist/commands/canvas-config.js +1 -1
  128. package/dist/commands/canvas-use.js +3 -3
  129. package/dist/commands/canvas.js +1 -1
  130. package/dist/commands/cron.js +5 -1
  131. package/dist/commands/human/queue.d.ts +0 -4
  132. package/dist/commands/human/queue.js +7 -40
  133. package/dist/commands/memory/list.d.ts +14 -0
  134. package/dist/commands/memory/list.js +35 -31
  135. package/dist/commands/memory/read.d.ts +7 -0
  136. package/dist/commands/memory/read.js +14 -8
  137. package/dist/commands/memory/write.js +13 -12
  138. package/dist/commands/node/bash.d.ts +1 -0
  139. package/dist/commands/node/bash.js +198 -0
  140. package/dist/commands/node/create.d.ts +23 -0
  141. package/dist/commands/node/create.js +207 -0
  142. package/dist/commands/node/inspect.d.ts +2 -0
  143. package/dist/commands/node/inspect.js +302 -0
  144. package/dist/commands/node/lifecycle.d.ts +4 -0
  145. package/dist/commands/node/lifecycle.js +415 -0
  146. package/dist/commands/node/message.d.ts +1 -0
  147. package/dist/commands/node/message.js +164 -0
  148. package/dist/commands/node/pyramid.d.ts +2 -0
  149. package/dist/commands/node/pyramid.js +79 -0
  150. package/dist/commands/node/subscription.d.ts +1 -0
  151. package/dist/commands/node/subscription.js +82 -0
  152. package/dist/commands/node/wait.d.ts +1 -0
  153. package/dist/commands/node/wait.js +159 -0
  154. package/dist/commands/node-lifecycle-revive.js +10 -57
  155. package/dist/commands/node.d.ts +0 -42
  156. package/dist/commands/node.js +11 -2065
  157. package/dist/commands/search.js +1 -1
  158. package/dist/commands/surface/node/cycle.d.ts +1 -0
  159. package/dist/commands/surface/node/cycle.js +83 -0
  160. package/dist/commands/surface/node/focus.d.ts +1 -0
  161. package/dist/commands/surface/node/focus.js +67 -0
  162. package/dist/commands/surface/node/id.d.ts +1 -0
  163. package/dist/commands/surface/node/id.js +38 -0
  164. package/dist/commands/surface/node/pin.d.ts +1 -0
  165. package/dist/commands/surface/node/pin.js +42 -0
  166. package/dist/commands/surface/node/placement.d.ts +46 -0
  167. package/dist/commands/surface/node/placement.js +124 -0
  168. package/dist/commands/surface-node.js +4 -1
  169. package/dist/commands/surface-reload.js +1 -2
  170. package/dist/commands/surface-tmux-spread.js +1 -1
  171. package/dist/commands/surface.js +5 -20
  172. package/dist/commands/sys/__tests__/setup-core.test.js +18 -271
  173. package/dist/commands/sys/config.js +6 -6
  174. package/dist/commands/sys/logs.js +1 -1
  175. package/dist/commands/sys/panels/broker-limits-panel.d.ts +17 -0
  176. package/dist/commands/sys/panels/broker-limits-panel.js +104 -0
  177. package/dist/commands/sys/panels/dependencies-panel.d.ts +14 -0
  178. package/dist/commands/sys/panels/dependencies-panel.js +80 -0
  179. package/dist/commands/sys/panels/keybindings-panel.d.ts +56 -0
  180. package/dist/commands/sys/panels/keybindings-panel.js +703 -0
  181. package/dist/commands/sys/panels/keys-panel.d.ts +16 -0
  182. package/dist/commands/sys/panels/keys-panel.js +60 -0
  183. package/dist/commands/sys/panels/models-panel.d.ts +77 -0
  184. package/dist/commands/sys/panels/models-panel.js +647 -0
  185. package/dist/commands/sys/panels/panel.d.ts +45 -0
  186. package/dist/commands/sys/panels/panel.js +137 -0
  187. package/dist/commands/sys/panels/plugins-panel.d.ts +16 -0
  188. package/dist/commands/sys/panels/plugins-panel.js +80 -0
  189. package/dist/commands/sys/panels/prefs-panel.d.ts +21 -0
  190. package/dist/commands/sys/panels/prefs-panel.js +85 -0
  191. package/dist/commands/sys/panels/provider-panel.d.ts +62 -0
  192. package/dist/commands/sys/panels/provider-panel.js +538 -0
  193. package/dist/commands/sys/settings-shell.d.ts +55 -0
  194. package/dist/commands/sys/settings-shell.js +400 -0
  195. package/dist/commands/sys/settings.d.ts +2 -0
  196. package/dist/commands/sys/settings.js +31 -0
  197. package/dist/commands/sys/setup-core.d.ts +3 -33
  198. package/dist/commands/sys/setup-core.js +27 -78
  199. package/dist/commands/sys/setup-settings-runner.d.ts +24 -0
  200. package/dist/commands/sys/setup-settings-runner.js +63 -0
  201. package/dist/commands/sys/setup-wizard.d.ts +26 -125
  202. package/dist/commands/sys/setup-wizard.js +209 -2473
  203. package/dist/commands/sys/setup.js +5 -7
  204. package/dist/commands/sys.js +3 -2
  205. package/dist/core/__tests__/broker-extension-canvas-db-boundary.test.js +50 -0
  206. package/dist/core/__tests__/broker-launch-candidates.test.js +20 -9
  207. package/dist/core/__tests__/broker-preflight.test.js +1 -1
  208. package/dist/core/__tests__/canvas-inbox-watcher-hold.test.js +108 -27
  209. package/dist/core/__tests__/canvas-inbox-watcher.test.js +14 -0
  210. package/dist/core/__tests__/canvas.test.js +2 -36
  211. package/dist/core/__tests__/close.test.js +14 -3
  212. package/dist/core/__tests__/context-intro.test.js +32 -143
  213. package/dist/core/__tests__/cron-broker-capacity.test.js +22 -3
  214. package/dist/core/__tests__/daemon-boot.test.js +2 -20
  215. package/dist/core/__tests__/daemon-wedge.test.js +1 -1
  216. package/dist/core/__tests__/dead-node-policy-table.test.js +1 -18
  217. package/dist/core/__tests__/fixtures/fake-engine.d.ts +1 -1
  218. package/dist/core/__tests__/fixtures/fake-engine.js +2 -2
  219. package/dist/core/__tests__/fixtures/fake-pi-host.js +2 -2
  220. package/dist/core/__tests__/focuses.test.js +4 -98
  221. package/dist/core/__tests__/helpers/broker-clients.d.ts +0 -3
  222. package/dist/core/__tests__/helpers/broker-clients.js +0 -14
  223. package/dist/core/__tests__/helpers/harness.d.ts +0 -8
  224. package/dist/core/__tests__/helpers/harness.js +7 -87
  225. package/dist/core/__tests__/helpers/viewer-panes.js +1 -1
  226. package/dist/core/__tests__/inline-memory-refs.test.js +5 -134
  227. package/dist/core/__tests__/kickoff.test.js +1 -1
  228. package/dist/core/__tests__/memory-resolver-precedence.test.js +29 -1
  229. package/dist/core/__tests__/migration.test.js +35 -48
  230. package/dist/core/__tests__/on-read-dedup-resume.test.js +22 -12
  231. package/dist/core/__tests__/passive-subscription.test.js +26 -49
  232. package/dist/core/__tests__/preview-registry-sync.test.js +1 -2
  233. package/dist/core/__tests__/prune.test.js +94 -1
  234. package/dist/core/__tests__/review-model-floor.test.js +0 -32
  235. package/dist/core/__tests__/seam/broker-attach-multiclient.test.js +255 -0
  236. package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.js +39 -7
  237. package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.js +30 -29
  238. package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.js +54 -5
  239. package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.js +134 -82
  240. package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.js +15 -4
  241. package/dist/core/__tests__/{full/idle-release-settlement.test.js → seam/dormancy-release.test.js} +69 -17
  242. package/dist/core/__tests__/{full/yield-message-transaction.test.js → seam/yield-refresh-transaction.test.js} +31 -9
  243. package/dist/core/__tests__/secrets.test.js +1 -7
  244. package/dist/core/__tests__/{broker-fork-seam.test.js → serial/broker-fork-seam.test.js} +58 -7
  245. package/dist/core/__tests__/{broker-sdk-wiring.test.js → serial/broker-sdk-wiring.test.js} +18 -162
  246. package/dist/core/__tests__/{broker-snapshot-history.test.js → serial/broker-snapshot-history.test.js} +9 -9
  247. package/dist/core/__tests__/{command-plugins.test.js → serial/command-plugins.test.js} +105 -15
  248. package/dist/core/__tests__/{deferred-no-wake.test.js → serial/deferred-no-wake.test.js} +23 -20
  249. package/dist/core/__tests__/{flagship-lifecycle.test.js → serial/flagship-lifecycle.test.js} +7 -7
  250. package/dist/core/__tests__/{host-teardown-process-group.test.js → serial/host-teardown-process-group.test.js} +6 -6
  251. package/dist/core/__tests__/{human-deliver-e2e.test.js → serial/human-deliver-e2e.test.js} +12 -12
  252. package/dist/core/__tests__/{live-mutation.test.js → serial/live-mutation.test.js} +5 -5
  253. package/dist/core/__tests__/{refresh-stall-recycle.test.js → serial/refresh-stall-recycle.test.js} +5 -14
  254. package/dist/core/__tests__/{revive.test.js → serial/revive.test.js} +15 -100
  255. package/dist/core/__tests__/{spawn-root.test.js → serial/spawn-root.test.js} +32 -15
  256. package/dist/core/__tests__/serial/subscription-delivery.test.js +126 -0
  257. package/dist/core/__tests__/serial/tmux-surface.test.js +256 -0
  258. package/dist/core/__tests__/{worktree.test.js → serial/worktree.test.js} +15 -15
  259. package/dist/core/__tests__/session-model.test.js +0 -18
  260. package/dist/core/__tests__/spawn-worktree-id-conflict.test.js +9 -0
  261. package/dist/core/__tests__/watchdog-abort-arms-retry.test.js +50 -0
  262. package/dist/core/broker-client/__tests__/transport-relay.test.js +15 -16
  263. package/dist/core/broker-client/__tests__/transport-socket.test.js +28 -0
  264. package/dist/core/broker-client/client.d.ts +2 -2
  265. package/dist/core/broker-client/client.js +4 -7
  266. package/dist/core/broker-client/transport-relay.d.ts +13 -19
  267. package/dist/core/broker-client/transport-relay.js +19 -34
  268. package/dist/core/broker-client/transport-socket.d.ts +2 -2
  269. package/dist/core/broker-client/transport-socket.js +9 -2
  270. package/dist/core/broker-client/transport.d.ts +7 -3
  271. package/dist/core/broker-client/transport.js +4 -4
  272. package/dist/core/canvas/__tests__/attention.test.js +1 -18
  273. package/dist/core/canvas/__tests__/remote-canvas-source.test.js +7 -64
  274. package/dist/core/canvas/__tests__/remote-transport.test.js +2 -3
  275. package/dist/core/canvas/__tests__/render-remote.test.js +7 -52
  276. package/dist/core/canvas/browse/app.d.ts +2 -17
  277. package/dist/core/canvas/browse/app.js +16 -88
  278. package/dist/core/canvas/browse/model.d.ts +0 -4
  279. package/dist/core/canvas/browse/model.js +1 -12
  280. package/dist/core/canvas/browse/render.js +6 -3
  281. package/dist/core/canvas/crons.d.ts +8 -5
  282. package/dist/core/canvas/crons.js +7 -6
  283. package/dist/core/canvas/extensions.d.ts +7 -3
  284. package/dist/core/canvas/extensions.js +16 -4
  285. package/dist/core/canvas/nav-model.d.ts +0 -4
  286. package/dist/core/canvas/nav-model.js +2 -14
  287. package/dist/core/canvas/node-order.d.ts +3 -0
  288. package/dist/core/canvas/node-order.js +12 -0
  289. package/dist/core/canvas/remote-canvas-source.d.ts +3 -6
  290. package/dist/core/canvas/remote-canvas-source.js +8 -15
  291. package/dist/core/command.js +11 -4
  292. package/dist/core/config.js +3 -1
  293. package/dist/core/events/envelope.js +1 -1
  294. package/dist/core/events/read.js +7 -21
  295. package/dist/core/events/source.d.ts +0 -2
  296. package/dist/core/events/source.js +0 -16
  297. package/dist/core/events/types.d.ts +1 -1
  298. package/dist/core/fault-classifier.d.ts +1 -1
  299. package/dist/core/feed/passive.d.ts +0 -11
  300. package/dist/core/feed/passive.js +1 -62
  301. package/dist/core/human/__tests__/{inbox-core.test.js → serial/inbox-core.test.js} +6 -6
  302. package/dist/core/keybindings/__tests__/resolve.test.js +1 -96
  303. package/dist/core/keybindings/background-bash.js +3 -4
  304. package/dist/core/keybindings/catalog.js +1 -1
  305. package/dist/core/memory/inline-ref-grammar.js +3 -3
  306. package/dist/core/memory-resolver.d.ts +11 -25
  307. package/dist/core/memory-resolver.js +51 -33
  308. package/dist/core/model-routes.d.ts +15 -0
  309. package/dist/core/model-routes.js +12 -0
  310. package/dist/core/pool-credential-store.js +1 -1
  311. package/dist/core/preview-registry.js +8 -9
  312. package/dist/core/profiles/__tests__/root-profile.test.js +4 -14
  313. package/dist/core/review/realize.d.ts +0 -13
  314. package/dist/core/review/realize.js +0 -40
  315. package/dist/core/review/types.d.ts +1 -1
  316. package/dist/core/runtime/__tests__/engine-route.test.js +2 -2
  317. package/dist/core/runtime/bearings.js +1 -11
  318. package/dist/core/runtime/broker/client-registry.d.ts +33 -0
  319. package/dist/core/runtime/broker/client-registry.js +164 -0
  320. package/dist/core/runtime/broker/daemon-ops.d.ts +19 -0
  321. package/dist/core/runtime/broker/daemon-ops.js +49 -0
  322. package/dist/core/runtime/broker/event-projection.d.ts +42 -0
  323. package/dist/core/runtime/broker/event-projection.js +178 -0
  324. package/dist/core/runtime/broker/fault-retry.d.ts +39 -0
  325. package/dist/core/runtime/broker/fault-retry.js +277 -0
  326. package/dist/core/runtime/broker/frame-dispatch.d.ts +238 -0
  327. package/dist/core/runtime/broker/frame-dispatch.js +1537 -0
  328. package/dist/core/runtime/broker/inbox.d.ts +22 -0
  329. package/dist/core/runtime/broker/inbox.js +167 -0
  330. package/dist/core/runtime/broker/passive.d.ts +16 -0
  331. package/dist/core/runtime/broker/passive.js +44 -0
  332. package/dist/core/runtime/broker/read-ops.d.ts +23 -0
  333. package/dist/core/runtime/broker/read-ops.js +150 -0
  334. package/dist/core/runtime/broker/rebind.d.ts +74 -0
  335. package/dist/core/runtime/broker/rebind.js +211 -0
  336. package/dist/core/runtime/broker/tool-groups.d.ts +39 -0
  337. package/dist/core/runtime/broker/tool-groups.js +244 -0
  338. package/dist/core/runtime/broker-extension-render.d.ts +11 -0
  339. package/dist/core/runtime/broker-extension-render.js +181 -0
  340. package/dist/core/runtime/broker-persona-guidance.d.ts +13 -0
  341. package/dist/core/runtime/broker-persona-guidance.js +58 -0
  342. package/dist/core/runtime/broker-protocol.d.ts +1 -1
  343. package/dist/core/runtime/broker-protocol.js +1 -1
  344. package/dist/core/runtime/broker.d.ts +5 -196
  345. package/dist/core/runtime/broker.js +276 -3059
  346. package/dist/core/runtime/canvas-extensions.js +11 -2
  347. package/dist/core/runtime/fault.js +1 -1
  348. package/dist/core/runtime/model-selection.d.ts +9 -0
  349. package/dist/core/runtime/model-selection.js +12 -0
  350. package/dist/core/runtime/model-swap.d.ts +3 -3
  351. package/dist/core/runtime/model-swap.js +33 -25
  352. package/dist/core/runtime/placement-tmux.d.ts +3 -14
  353. package/dist/core/runtime/placement-tmux.js +11 -80
  354. package/dist/core/runtime/placement.d.ts +4 -2
  355. package/dist/core/runtime/placement.js +7 -12
  356. package/dist/core/runtime/promote.d.ts +14 -1
  357. package/dist/core/runtime/promote.js +1 -1
  358. package/dist/core/runtime/reset.d.ts +1 -1
  359. package/dist/core/runtime/roadmap.js +1 -1
  360. package/dist/core/runtime/spawn.d.ts +8 -0
  361. package/dist/core/runtime/spawn.js +36 -6
  362. package/dist/core/runtime/stop-guard.d.ts +4 -3
  363. package/dist/core/runtime/stop-guard.js +36 -18
  364. package/dist/core/runtime/stop-signals.d.ts +4 -1
  365. package/dist/core/runtime/stream-watchdog.js +4 -5
  366. package/dist/core/runtime/structured-output.d.ts +15 -2
  367. package/dist/core/runtime/structured-output.js +35 -12
  368. package/dist/core/runtime/tmux-bindings.d.ts +25 -0
  369. package/dist/core/runtime/tmux-bindings.js +682 -0
  370. package/dist/core/runtime/tmux-chrome.d.ts +2 -1
  371. package/dist/core/runtime/tmux-chrome.js +3 -2
  372. package/dist/core/runtime/{tmux.d.ts → tmux-driver.d.ts} +18 -26
  373. package/dist/core/runtime/tmux-driver.js +598 -0
  374. package/dist/core/runtime/view-socket.d.ts +14 -0
  375. package/dist/core/runtime/view-socket.js +83 -0
  376. package/dist/core/session-model/session-state.d.ts +1 -2
  377. package/dist/core/session-model/session-state.js +5 -8
  378. package/dist/core/spawn.d.ts +1 -1
  379. package/dist/core/spawn.js +2 -2
  380. package/dist/core/substrate/gate.d.ts +1 -1
  381. package/dist/core/substrate/on-read-pure.d.ts +7 -0
  382. package/dist/core/substrate/on-read-pure.js +272 -0
  383. package/dist/core/termrender/termrender.js +32 -2
  384. package/dist/core/user-settings.d.ts +23 -1
  385. package/dist/core/user-settings.js +18 -1
  386. package/dist/daemon/api/__tests__/node-model-validation.test.js +134 -0
  387. package/dist/daemon/api/__tests__/review-terminal-conflict.test.js +98 -0
  388. package/dist/daemon/api/__tests__/{full → seam}/api-server.test.js +6 -48
  389. package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.js +17 -44
  390. package/dist/daemon/api/__tests__/{full/push-parity.test.js → seam/leaf-api-parity.test.js} +61 -42
  391. package/dist/daemon/api/bridge.js +40 -81
  392. package/dist/daemon/api/handlers/broker-ops.d.ts +2 -0
  393. package/dist/daemon/api/handlers/broker-ops.js +383 -0
  394. package/dist/daemon/api/handlers/crons.js +9 -4
  395. package/dist/daemon/api/handlers/files.js +6 -7
  396. package/dist/daemon/api/handlers/inbox.js +2 -340
  397. package/dist/daemon/api/handlers/nodes.d.ts +10 -1
  398. package/dist/daemon/api/handlers/nodes.js +74 -39
  399. package/dist/daemon/api/handlers/review-comments.js +5 -1
  400. package/dist/daemon/api/handlers/reviews.js +0 -19
  401. package/dist/daemon/api/map.js +25 -4
  402. package/dist/daemon/api/router.js +2 -3
  403. package/dist/daemon/api/server.js +5 -7
  404. package/dist/daemon/cron-run.d.ts +4 -0
  405. package/dist/daemon/cron-run.js +30 -13
  406. package/dist/daemon/crtrd.d.ts +3 -58
  407. package/dist/daemon/crtrd.js +28 -1244
  408. package/dist/daemon/manage.js +0 -1
  409. package/dist/daemon/reconcilers/broker-supervision.d.ts +50 -0
  410. package/dist/daemon/reconcilers/broker-supervision.js +549 -0
  411. package/dist/daemon/reconcilers/cron-lane.d.ts +10 -0
  412. package/dist/daemon/reconcilers/cron-lane.js +32 -0
  413. package/dist/daemon/reconcilers/dormant-inbox.d.ts +18 -0
  414. package/dist/daemon/reconcilers/dormant-inbox.js +143 -0
  415. package/dist/daemon/reconcilers/storage-maintenance.d.ts +22 -0
  416. package/dist/daemon/reconcilers/storage-maintenance.js +213 -0
  417. package/dist/daemon/review/finish.js +2 -5
  418. package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +34 -53
  419. package/dist/pi-extensions/__tests__/canvas-recap.test.js +16 -113
  420. package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +72 -99
  421. package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.js +29 -12
  422. package/dist/pi-extensions/broker-local.d.ts +20 -0
  423. package/dist/pi-extensions/broker-local.js +89 -0
  424. package/dist/pi-extensions/canvas-context-intro.d.ts +3 -3
  425. package/dist/pi-extensions/canvas-context-intro.js +22 -11
  426. package/dist/pi-extensions/canvas-doc-substrate.js +17 -34
  427. package/dist/pi-extensions/canvas-goal-capture.js +7 -12
  428. package/dist/pi-extensions/canvas-inbox-watcher.js +124 -139
  429. package/dist/pi-extensions/canvas-passive-context.d.ts +3 -3
  430. package/dist/pi-extensions/canvas-passive-context.js +22 -18
  431. package/dist/pi-extensions/canvas-recap.d.ts +2 -2
  432. package/dist/pi-extensions/canvas-recap.js +48 -21
  433. package/dist/pi-extensions/canvas-review-boundary.js +10 -4
  434. package/dist/pi-extensions/canvas-stophook.d.ts +0 -5
  435. package/dist/pi-extensions/canvas-stophook.js +149 -431
  436. package/dist/pi-extensions/canvas-structured-output.js +52 -30
  437. package/dist/pi-extensions/envelope-merge.d.ts +13 -0
  438. package/dist/pi-extensions/envelope-merge.js +29 -0
  439. package/dist/shared/working-activity.d.ts +3 -2
  440. package/dist/shared/working-activity.js +3 -2
  441. package/dist/types.d.ts +6 -5
  442. package/dist/types.js +2 -2
  443. package/docs/compat/hearth-crtr-v1.md +4 -12
  444. package/docs/compat/hearth-crtr-v2.md +3 -11
  445. package/docs/compat/hearth-crtr-v3.md +4 -12
  446. package/docs/compat/hearth-crtr-v4.md +3 -11
  447. package/docs/compat/hearth-crtr-v5.md +3 -11
  448. package/docs/public-api.md +3 -7
  449. package/package.json +7 -49
  450. package/runtime.lock.json +2766 -14533
  451. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/claude-plugin-commands.test.ts +0 -49
  452. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/memory-slash-commands.test.ts +0 -194
  453. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/statusline.test.ts +0 -68
  454. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/test.ts +0 -119
  455. package/dist/clients/attach/__tests__/attach-chrome-remote.test.js +0 -439
  456. package/dist/clients/attach/__tests__/attach-keybindings.test.js +0 -170
  457. package/dist/clients/attach/__tests__/crtr-output-coverage.test.js +0 -57
  458. package/dist/clients/attach/__tests__/editor-frame-title.test.js +0 -19
  459. package/dist/clients/attach/__tests__/input-controller-extension-command.test.js +0 -32
  460. package/dist/clients/attach/__tests__/markdown-headings.test.js +0 -35
  461. package/dist/clients/attach/__tests__/session-identity-refresh.test.js +0 -32
  462. package/dist/clients/conversation/conversation.d.ts +0 -65
  463. package/dist/clients/conversation/conversation.js +0 -318
  464. package/dist/clients/conversation/frames.d.ts +0 -30
  465. package/dist/clients/conversation/frames.js +0 -52
  466. package/dist/clients/conversation/region.d.ts +0 -51
  467. package/dist/clients/conversation/region.js +0 -265
  468. package/dist/clients/inbox/__tests__/inbox-controller.test.js +0 -247
  469. package/dist/clients/inbox/__tests__/mount-panel.test.js +0 -776
  470. package/dist/clients/inbox/review/__tests__/remap.test.js +0 -196
  471. package/dist/clients/inbox/review/columns.d.ts +0 -22
  472. package/dist/clients/inbox/review/columns.js +0 -40
  473. package/dist/clients/inbox/review/composition.d.ts +0 -60
  474. package/dist/clients/inbox/review/composition.js +0 -278
  475. package/dist/clients/inbox/review/document-region.d.ts +0 -120
  476. package/dist/clients/surfaces/region.d.ts +0 -16
  477. package/dist/clients/web/__tests__/push-engine.test.js +0 -158
  478. package/dist/clients/web/__tests__/push-registry.test.d.ts +0 -1
  479. package/dist/clients/web/__tests__/push-registry.test.js +0 -177
  480. package/dist/clients/web/dev-server.d.ts +0 -7
  481. package/dist/clients/web/dev-server.js +0 -46
  482. package/dist/clients/web/events.d.ts +0 -19
  483. package/dist/clients/web/events.js +0 -163
  484. package/dist/clients/web/push-engine.d.ts +0 -44
  485. package/dist/clients/web/push-engine.js +0 -125
  486. package/dist/clients/web/push-registry.d.ts +0 -85
  487. package/dist/clients/web/push-registry.js +0 -373
  488. package/dist/clients/web/server.d.ts +0 -19
  489. package/dist/clients/web/server.js +0 -661
  490. package/dist/clients/web/web-client/shared/protocol.d.ts +0 -214
  491. package/dist/clients/web/web-client/shared/protocol.js +0 -8
  492. package/dist/clients/web/web-cmd.d.ts +0 -2
  493. package/dist/clients/web/web-cmd.js +0 -141
  494. package/dist/commands/__tests__/api-canvas-source.test.d.ts +0 -1
  495. package/dist/commands/__tests__/api-canvas-source.test.js +0 -37
  496. package/dist/commands/__tests__/canvas-config.test.d.ts +0 -1
  497. package/dist/commands/__tests__/canvas-config.test.js +0 -107
  498. package/dist/commands/__tests__/node-no-kickoff-flag.test.d.ts +0 -1
  499. package/dist/commands/__tests__/node-no-kickoff-flag.test.js +0 -73
  500. package/dist/commands/__tests__/node-worktree-flag.test.d.ts +0 -1
  501. package/dist/commands/__tests__/node-worktree-flag.test.js +0 -49
  502. package/dist/commands/__tests__/search-contents.test.d.ts +0 -1
  503. package/dist/commands/__tests__/search-contents.test.js +0 -52
  504. package/dist/commands/memory/__tests__/lint.test.d.ts +0 -1
  505. package/dist/commands/memory/__tests__/lint.test.js +0 -15
  506. package/dist/commands/sys/__tests__/config-broker-thresholds.test.d.ts +0 -1
  507. package/dist/commands/sys/__tests__/config-broker-thresholds.test.js +0 -95
  508. package/dist/commands/sys/__tests__/config-keybindings.test.d.ts +0 -1
  509. package/dist/commands/sys/__tests__/config-keybindings.test.js +0 -55
  510. package/dist/commands/sys/__tests__/helpers/setup-runtime.d.ts +0 -5
  511. package/dist/commands/sys/__tests__/helpers/setup-runtime.js +0 -19
  512. package/dist/commands/sys/__tests__/setup-front-door.test.d.ts +0 -1
  513. package/dist/commands/sys/__tests__/setup-front-door.test.js +0 -102
  514. package/dist/commands/sys/__tests__/setup-models.test.d.ts +0 -1
  515. package/dist/commands/sys/__tests__/setup-models.test.js +0 -205
  516. package/dist/commands/sys/__tests__/setup-providers-viewport.test.d.ts +0 -1
  517. package/dist/commands/sys/__tests__/setup-providers-viewport.test.js +0 -155
  518. package/dist/commands/sys/__tests__/sync-deps.test.d.ts +0 -1
  519. package/dist/commands/sys/__tests__/sync-deps.test.js +0 -179
  520. package/dist/commands/sys/__tests__/sync-import.test.d.ts +0 -1
  521. package/dist/commands/sys/__tests__/sync-import.test.js +0 -315
  522. package/dist/core/__tests__/base-worker-prompt.test.d.ts +0 -1
  523. package/dist/core/__tests__/base-worker-prompt.test.js +0 -57
  524. package/dist/core/__tests__/command-plugins-surfaces.test.d.ts +0 -1
  525. package/dist/core/__tests__/command-plugins-surfaces.test.js +0 -359
  526. package/dist/core/__tests__/connection-reconnect-resume.test.d.ts +0 -1
  527. package/dist/core/__tests__/connection-reconnect-resume.test.js +0 -36
  528. package/dist/core/__tests__/finalization-migration.test.d.ts +0 -1
  529. package/dist/core/__tests__/finalization-migration.test.js +0 -38
  530. package/dist/core/__tests__/fixtures/extra-extension.d.ts +0 -1
  531. package/dist/core/__tests__/fixtures/extra-extension.js +0 -3
  532. package/dist/core/__tests__/fixtures/spawn-proof-target.test.d.ts +0 -1
  533. package/dist/core/__tests__/fixtures/spawn-proof-target.test.js +0 -15
  534. package/dist/core/__tests__/fork.test.d.ts +0 -1
  535. package/dist/core/__tests__/fork.test.js +0 -108
  536. package/dist/core/__tests__/full/broker-attach-limits.test.d.ts +0 -1
  537. package/dist/core/__tests__/full/broker-attach-limits.test.js +0 -147
  538. package/dist/core/__tests__/full/broker-deliver-ack.test.d.ts +0 -1
  539. package/dist/core/__tests__/full/broker-deliver-ack.test.js +0 -73
  540. package/dist/core/__tests__/full/broker-dialogs.test.d.ts +0 -1
  541. package/dist/core/__tests__/full/broker-dialogs.test.js +0 -180
  542. package/dist/core/__tests__/full/broker-display-snapshot.test.d.ts +0 -1
  543. package/dist/core/__tests__/full/broker-display-snapshot.test.js +0 -75
  544. package/dist/core/__tests__/full/broker-dormant-wake.test.d.ts +0 -1
  545. package/dist/core/__tests__/full/broker-dormant-wake.test.js +0 -130
  546. package/dist/core/__tests__/full/broker-model-changed-broadcast.test.d.ts +0 -1
  547. package/dist/core/__tests__/full/broker-model-changed-broadcast.test.js +0 -57
  548. package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.d.ts +0 -1
  549. package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.js +0 -80
  550. package/dist/core/__tests__/full/cascade-close.test.d.ts +0 -1
  551. package/dist/core/__tests__/full/cascade-close.test.js +0 -240
  552. package/dist/core/__tests__/full/detach-focus.test.d.ts +0 -1
  553. package/dist/core/__tests__/full/detach-focus.test.js +0 -126
  554. package/dist/core/__tests__/full/idle-release-settlement.test.d.ts +0 -1
  555. package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.d.ts +0 -1
  556. package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.js +0 -107
  557. package/dist/core/__tests__/full/park-clock-release.test.d.ts +0 -1
  558. package/dist/core/__tests__/full/park-clock-release.test.js +0 -56
  559. package/dist/core/__tests__/full/yield-message-transaction.test.d.ts +0 -1
  560. package/dist/core/__tests__/memory-index-render.test.d.ts +0 -1
  561. package/dist/core/__tests__/memory-index-render.test.js +0 -60
  562. package/dist/core/__tests__/model-routes.test.d.ts +0 -1
  563. package/dist/core/__tests__/model-routes.test.js +0 -41
  564. package/dist/core/__tests__/on-read-identity.test.d.ts +0 -1
  565. package/dist/core/__tests__/on-read-identity.test.js +0 -61
  566. package/dist/core/__tests__/phase4-review-migration.test.d.ts +0 -1
  567. package/dist/core/__tests__/phase4-review-migration.test.js +0 -100
  568. package/dist/core/__tests__/prune-to-limit.test.d.ts +0 -1
  569. package/dist/core/__tests__/prune-to-limit.test.js +0 -126
  570. package/dist/core/__tests__/reset.test.d.ts +0 -1
  571. package/dist/core/__tests__/reset.test.js +0 -69
  572. package/dist/core/__tests__/spawn-no-kickoff.test.d.ts +0 -1
  573. package/dist/core/__tests__/spawn-no-kickoff.test.js +0 -115
  574. package/dist/core/__tests__/steer-note.test.d.ts +0 -1
  575. package/dist/core/__tests__/steer-note.test.js +0 -41
  576. package/dist/core/__tests__/subcommand-tier.test.d.ts +0 -1
  577. package/dist/core/__tests__/subcommand-tier.test.js +0 -99
  578. package/dist/core/__tests__/subscription-delivery.test.js +0 -211
  579. package/dist/core/__tests__/test-runner-cheap-sharding.test.d.ts +0 -1
  580. package/dist/core/__tests__/test-runner-cheap-sharding.test.js +0 -97
  581. package/dist/core/__tests__/tmux-surface.test.js +0 -484
  582. package/dist/core/__tests__/wake-bearings.test.d.ts +0 -1
  583. package/dist/core/__tests__/wake-bearings.test.js +0 -102
  584. package/dist/core/canvas/__tests__/remote-event-stream.test.d.ts +0 -1
  585. package/dist/core/canvas/__tests__/remote-event-stream.test.js +0 -146
  586. package/dist/core/canvas/__tests__/source-resolve.test.d.ts +0 -1
  587. package/dist/core/canvas/__tests__/source-resolve.test.js +0 -77
  588. package/dist/core/canvas/browse/__tests__/model.test.d.ts +0 -1
  589. package/dist/core/canvas/browse/__tests__/model.test.js +0 -290
  590. package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.d.ts +0 -1
  591. package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.js +0 -134
  592. package/dist/core/canvas/browse/__tests__/render.test.d.ts +0 -1
  593. package/dist/core/canvas/browse/__tests__/render.test.js +0 -111
  594. package/dist/core/canvas/browse/rebuild-coalescer.d.ts +0 -7
  595. package/dist/core/canvas/browse/rebuild-coalescer.js +0 -61
  596. package/dist/core/canvas/remote-event-stream.d.ts +0 -24
  597. package/dist/core/canvas/remote-event-stream.js +0 -94
  598. package/dist/core/feed/__tests__/coalesce-human.test.d.ts +0 -1
  599. package/dist/core/feed/__tests__/coalesce-human.test.js +0 -36
  600. package/dist/core/feed/__tests__/empty-node-guard.test.d.ts +0 -1
  601. package/dist/core/feed/__tests__/empty-node-guard.test.js +0 -45
  602. package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.d.ts +0 -1
  603. package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.js +0 -84
  604. package/dist/core/human/__tests__/visible-paths.test.d.ts +0 -1
  605. package/dist/core/human/__tests__/visible-paths.test.js +0 -28
  606. package/dist/core/keybindings/__tests__/inbox-affordance.test.d.ts +0 -1
  607. package/dist/core/keybindings/__tests__/inbox-affordance.test.js +0 -38
  608. package/dist/core/review/__tests__/project.test.d.ts +0 -1
  609. package/dist/core/review/__tests__/project.test.js +0 -71
  610. package/dist/core/runtime/__tests__/command-expansion.test.d.ts +0 -1
  611. package/dist/core/runtime/__tests__/command-expansion.test.js +0 -25
  612. package/dist/core/runtime/__tests__/session-visibility.test.d.ts +0 -1
  613. package/dist/core/runtime/__tests__/session-visibility.test.js +0 -119
  614. package/dist/core/runtime/__tests__/spawn-at-given-id.test.d.ts +0 -1
  615. package/dist/core/runtime/__tests__/spawn-at-given-id.test.js +0 -34
  616. package/dist/core/runtime/tmux.js +0 -1314
  617. package/dist/daemon/api/__tests__/full/push-parity.test.d.ts +0 -1
  618. package/dist/daemon/api/__tests__/full/worktree-parity.test.d.ts +0 -1
  619. package/dist/daemon/api/__tests__/full/worktree-parity.test.js +0 -160
  620. package/dist/daemon/api/__tests__/inbox.test.d.ts +0 -1
  621. package/dist/daemon/api/__tests__/inbox.test.js +0 -489
  622. package/dist/web-client/apple-touch-icon.png +0 -0
  623. package/dist/web-client/assets/fragment-mono-latin-400-normal-BYwT3kSJ.woff +0 -0
  624. package/dist/web-client/assets/fragment-mono-latin-400-normal-yxdJ5AmL.woff2 +0 -0
  625. package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-BbKYyvR9.woff2 +0 -0
  626. package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-CT4YFKeK.woff +0 -0
  627. package/dist/web-client/assets/index-CCPaLeW7.css +0 -2
  628. package/dist/web-client/assets/index-kyOWsnZK.js +0 -86
  629. package/dist/web-client/assets/martian-mono-cyrillic-wght-normal-B84CD5C_.woff2 +0 -0
  630. package/dist/web-client/assets/martian-mono-latin-ext-wght-normal-DlL6xMw5.woff2 +0 -0
  631. package/dist/web-client/assets/martian-mono-latin-wght-normal-5W32yIyr.woff2 +0 -0
  632. package/dist/web-client/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -2
  633. package/dist/web-client/icon-192.png +0 -0
  634. package/dist/web-client/icon-512.png +0 -0
  635. package/dist/web-client/icon-maskable-512.png +0 -0
  636. package/dist/web-client/index.html +0 -17
  637. package/dist/web-client/manifest.webmanifest +0 -1
  638. package/dist/web-client/sw.js +0 -1
  639. /package/dist/api/__tests__/{client.test.d.ts → serial/client.test.d.ts} +0 -0
  640. /package/dist/clients/inbox/__tests__/{inbox-controller.test.d.ts → serial/inbox-controller.test.d.ts} +0 -0
  641. /package/dist/clients/inbox/__tests__/{mount-panel.test.d.ts → serial/mount-panel.test.d.ts} +0 -0
  642. /package/dist/clients/{attach/__tests__/attach-chrome-remote.test.d.ts → inbox/review/__tests__/teardown-notice.test.d.ts} +0 -0
  643. /package/dist/{clients/attach/__tests__/attach-keybindings.test.d.ts → core/__tests__/broker-extension-canvas-db-boundary.test.d.ts} +0 -0
  644. /package/dist/{clients/attach/__tests__/crtr-output-coverage.test.d.ts → core/__tests__/seam/broker-attach-multiclient.test.d.ts} +0 -0
  645. /package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.d.ts +0 -0
  646. /package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.d.ts +0 -0
  647. /package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.d.ts +0 -0
  648. /package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.d.ts +0 -0
  649. /package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.d.ts +0 -0
  650. /package/dist/{clients/attach/__tests__/editor-frame-title.test.d.ts → core/__tests__/seam/dormancy-release.test.d.ts} +0 -0
  651. /package/dist/{clients/attach/__tests__/input-controller-extension-command.test.d.ts → core/__tests__/seam/yield-refresh-transaction.test.d.ts} +0 -0
  652. /package/dist/core/__tests__/{broker-fork-seam.test.d.ts → serial/broker-fork-seam.test.d.ts} +0 -0
  653. /package/dist/core/__tests__/{broker-sdk-wiring.test.d.ts → serial/broker-sdk-wiring.test.d.ts} +0 -0
  654. /package/dist/core/__tests__/{broker-snapshot-history.test.d.ts → serial/broker-snapshot-history.test.d.ts} +0 -0
  655. /package/dist/core/__tests__/{command-plugins.test.d.ts → serial/command-plugins.test.d.ts} +0 -0
  656. /package/dist/core/__tests__/{deferred-no-wake.test.d.ts → serial/deferred-no-wake.test.d.ts} +0 -0
  657. /package/dist/core/__tests__/{flagship-lifecycle.test.d.ts → serial/flagship-lifecycle.test.d.ts} +0 -0
  658. /package/dist/core/__tests__/{host-teardown-process-group.test.d.ts → serial/host-teardown-process-group.test.d.ts} +0 -0
  659. /package/dist/core/__tests__/{human-deliver-e2e.test.d.ts → serial/human-deliver-e2e.test.d.ts} +0 -0
  660. /package/dist/core/__tests__/{live-mutation.test.d.ts → serial/live-mutation.test.d.ts} +0 -0
  661. /package/dist/core/__tests__/{refresh-stall-recycle.test.d.ts → serial/refresh-stall-recycle.test.d.ts} +0 -0
  662. /package/dist/core/__tests__/{revive.test.d.ts → serial/revive.test.d.ts} +0 -0
  663. /package/dist/core/__tests__/{spawn-root.test.d.ts → serial/spawn-root.test.d.ts} +0 -0
  664. /package/dist/core/__tests__/{subscription-delivery.test.d.ts → serial/subscription-delivery.test.d.ts} +0 -0
  665. /package/dist/core/__tests__/{tmux-surface.test.d.ts → serial/tmux-surface.test.d.ts} +0 -0
  666. /package/dist/core/__tests__/{worktree.test.d.ts → serial/worktree.test.d.ts} +0 -0
  667. /package/dist/{clients/attach/__tests__/markdown-headings.test.d.ts → core/__tests__/watchdog-abort-arms-retry.test.d.ts} +0 -0
  668. /package/dist/{clients/attach/__tests__/session-identity-refresh.test.d.ts → core/broker-client/__tests__/transport-socket.test.d.ts} +0 -0
  669. /package/dist/core/human/__tests__/{inbox-core.test.d.ts → serial/inbox-core.test.d.ts} +0 -0
  670. /package/dist/{clients/inbox/review/__tests__/remap.test.d.ts → daemon/api/__tests__/node-model-validation.test.d.ts} +0 -0
  671. /package/dist/{clients/surfaces/region.js → daemon/api/__tests__/review-terminal-conflict.test.d.ts} +0 -0
  672. /package/dist/daemon/api/__tests__/{full → seam}/api-server.test.d.ts +0 -0
  673. /package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.d.ts +0 -0
  674. /package/dist/{clients/web/__tests__/push-engine.test.d.ts → daemon/api/__tests__/seam/leaf-api-parity.test.d.ts} +0 -0
@@ -5,8 +5,8 @@
5
5
  // return is only a handoff. Exact cursor persistence at agent_settled is the
6
6
  // durable boundary; an uncommitted process exit is recovered by rereading from
7
7
  // the unchanged cursor.
8
- import { coalesce, readCanceledEntryIds, readCursor, readInboxRange, readInboxSince, writeCursor, } from '../core/feed/inbox.js';
9
- import { getNode } from '../core/canvas/index.js';
8
+ import { coalesceBrokerInbox, readBrokerCanceledEntryIds, readBrokerCursor, readBrokerInboxSince, } from '../core/runtime/broker/inbox.js';
9
+ import { advanceBrokerInboxCursor, brokerExtensionState } from '../core/runtime/broker/daemon-ops.js';
10
10
  import { emitEvent } from '../core/events/emit.js';
11
11
  import { errorClassFromError } from '../core/events/errors.js';
12
12
  import { operationIdContext } from '../core/events/operation-id.js';
@@ -14,8 +14,6 @@ import { readSituationalContext, SITUATIONAL_CONTEXT_CUSTOM_TYPE } from '../core
14
14
  const DEFAULT_TICK_MS = 800;
15
15
  const DEFAULT_DEBOUNCE_MS = 1000;
16
16
  const MAX_PENDING_HANDOFFS = 64;
17
- const REPLAY_RESERVED_HANDOFFS = 2;
18
- const MAX_ORDINARY_HANDOFFS = MAX_PENDING_HANDOFFS - REPLAY_RESERVED_HANDOFFS;
19
17
  const MAX_SOURCE_OPERATION_IDS = 16;
20
18
  let currentWatcher;
21
19
  let nextGeneration = 0;
@@ -181,12 +179,13 @@ class CanvasInboxWatcher {
181
179
  buffer = [];
182
180
  lastArrival = 0;
183
181
  pendingHandoffs = [];
184
- replay;
182
+ pendingCommit;
185
183
  seeded = false;
186
184
  disposed = false;
187
185
  disposalReason;
188
186
  fatalError;
189
187
  fatalEscaped = false;
188
+ reportNodes = new Map();
190
189
  constructor(pi, cadence, generation) {
191
190
  this.pi = pi;
192
191
  this.cadence = cadence;
@@ -212,6 +211,7 @@ class CanvasInboxWatcher {
212
211
  return;
213
212
  this.captureCtx(event, ctx);
214
213
  this.arm();
214
+ void this.refreshReportNodes(currentNodeId());
215
215
  });
216
216
  this.pi.on('turn_end', capture);
217
217
  this.pi.on('agent_start', (event, ctx) => {
@@ -227,7 +227,7 @@ class CanvasInboxWatcher {
227
227
  this.streaming = false;
228
228
  // agent_end can precede retry, compaction, or queued continuation.
229
229
  });
230
- this.pi.on('agent_settled', (event, ctx) => {
230
+ this.pi.on('agent_settled', async (event, ctx) => {
231
231
  if (!this.canMutate())
232
232
  return;
233
233
  this.captureCtx(event, ctx);
@@ -236,22 +236,19 @@ class CanvasInboxWatcher {
236
236
  return;
237
237
  try {
238
238
  this.assertNodeOwnership(nodeId, 'settle');
239
- const refreshHeld = this.readRefreshIntentOrFatal(nodeId, 'settle');
240
- if (refreshHeld) {
241
- this.dispose('refresh', true, ctx);
242
- }
243
- else {
244
- // agent_settled is the authoritative durable boundary: pi guarantees
245
- // every queued continuation has drained, so hasPendingMessages() must
246
- // not veto the commit here.
247
- this.settle(nodeId, ctx, false, false);
248
- }
239
+ // agent_settled is the authoritative durable boundary: Pi guarantees
240
+ // every queued continuation has drained, so hasPendingMessages() must
241
+ // not veto the commit here. Await crtrd before changing the in-memory
242
+ // durable cursor; a failed commit remains replayable after process exit.
243
+ const result = await this.settle(nodeId, ctx, false);
244
+ if (result === 'refresh_held')
245
+ this.dispose('refresh', false);
249
246
  }
250
247
  catch (error) {
251
248
  this.dispose('shutdown', false, undefined, { error, stage: 'settle' });
252
249
  }
253
250
  });
254
- this.pi.on('session_shutdown', (event) => {
251
+ this.pi.on('session_shutdown', async (event) => {
255
252
  if (!this.canMutate())
256
253
  return;
257
254
  let runtimeReason;
@@ -273,12 +270,10 @@ class CanvasInboxWatcher {
273
270
  });
274
271
  }
275
272
  try {
276
- const nodeId = currentNodeId();
277
- const refreshHeld = nodeId !== undefined && this.readRefreshIntentOrFatal(nodeId, 'settle');
278
273
  // This is the graceful fallback when no agent_settled fired before exit.
279
- // It holds both an unconsumed queued handoff and every handoff made to a
280
- // conversation being discarded by refresh.
281
- this.dispose(reason, true, this.lastCtx, undefined, refreshHeld);
274
+ // crtrd rejects a cursor commit for a refresh, preserving every handoff
275
+ // that may have reached this discarded conversation for the next broker.
276
+ await this.disposeAtSettlement(reason, this.lastCtx);
282
277
  }
283
278
  catch (error) {
284
279
  this.dispose(reason, false, undefined, { error, stage: 'settle' });
@@ -290,6 +285,19 @@ class CanvasInboxWatcher {
290
285
  * or any other re-emission all land here). Called only from the
291
286
  * `session_start` handler above, so it never runs before Pi's action
292
287
  * methods are bound. */
288
+ async refreshReportNodes(nodeId) {
289
+ if (nodeId === undefined)
290
+ return;
291
+ try {
292
+ const state = await brokerExtensionState(nodeId);
293
+ if (!this.canMutate())
294
+ return;
295
+ this.reportNodes = new Map(state.report_nodes.map((node) => [node.node_id, node]));
296
+ }
297
+ catch {
298
+ // Report bodies remain canonical pointers until the daemon projection is available.
299
+ }
300
+ }
293
301
  arm() {
294
302
  if (this.armed)
295
303
  return;
@@ -301,31 +309,41 @@ class CanvasInboxWatcher {
301
309
  // the normal debounce owns delivery instead of waiting a full tick.
302
310
  this.runTick('schedule');
303
311
  }
304
- dispose(reason, atSettleBoundary, settleCtx, fatalDisposal, refreshHeld = reason === 'refresh') {
305
- if (this.disposed)
312
+ /** Settle the graceful-shutdown fallback before disposing its retry state.
313
+ * The daemon decides whether a refresh preserves the cursor, and this method
314
+ * awaits that decision so a process exit never outruns an accepted commit. */
315
+ async disposeAtSettlement(reason, ctx) {
316
+ const nodeId = currentNodeId();
317
+ if (nodeId === undefined) {
318
+ this.dispose(reason, false);
306
319
  return;
307
- this.disposed = true;
308
- this.disposalReason = reason;
309
- this.clearTimer();
310
- let fatal = fatalDisposal;
320
+ }
311
321
  try {
312
- if (atSettleBoundary) {
313
- const nodeId = currentNodeId();
314
- if (nodeId !== undefined) {
315
- this.assertNodeOwnership(nodeId, 'settle');
316
- this.settle(nodeId, settleCtx, refreshHeld, reason !== 'refresh');
317
- }
318
- }
322
+ this.assertNodeOwnership(nodeId, 'settle');
323
+ const result = await this.settle(nodeId, ctx, reason !== 'refresh');
324
+ this.dispose(result === 'refresh_held' ? 'refresh' : reason, false);
319
325
  }
320
326
  catch (error) {
321
- fatal = { error, stage: 'settle' };
327
+ this.dispose(reason, false, undefined, { error, stage: 'settle' });
322
328
  }
323
- finally {
324
- const abandoned = this.pendingHandoffs.splice(0);
329
+ }
330
+ dispose(reason, _atSettleBoundary, _settleCtx, fatalDisposal) {
331
+ if (this.disposed)
332
+ return;
333
+ this.disposed = true;
334
+ this.disposalReason = reason;
335
+ this.clearTimer();
336
+ const fatal = fatalDisposal;
337
+ {
338
+ const abandoned = [
339
+ ...(this.pendingCommit?.handoffs ?? []),
340
+ ...this.pendingHandoffs.splice(0),
341
+ ];
325
342
  this.buffer.length = 0;
326
343
  this.cursor = undefined;
327
344
  this.durableCursor = undefined;
328
- this.replay = undefined;
345
+ this.reportNodes.clear();
346
+ this.pendingCommit = undefined;
329
347
  this.nodeId = undefined;
330
348
  this.lastCtx = undefined;
331
349
  this.lastArrival = 0;
@@ -367,14 +385,6 @@ class CanvasInboxWatcher {
367
385
  }
368
386
  return !this.streaming;
369
387
  }
370
- readRefreshIntentOrFatal(nodeId, stage) {
371
- try {
372
- return getNode(nodeId)?.intent === 'refresh';
373
- }
374
- catch (error) {
375
- this.raiseReadFatal(stage, error);
376
- }
377
- }
378
388
  assertNodeOwnership(nodeId, stage) {
379
389
  if (!this.seeded || this.nodeId === undefined || this.nodeId === nodeId)
380
390
  return;
@@ -398,12 +408,6 @@ class CanvasInboxWatcher {
398
408
  raiseReadFatal(stage, error) {
399
409
  return this.raiseFatal('inbox.read.failed', `inbox ${stage} state is corrupt`, error, { stage });
400
410
  }
401
- raiseReplayFatal(gate, error) {
402
- return this.raiseFatal('inbox.replay.load_failed', 'inbox replay range could not be loaded', error, {
403
- after_entry_id: gate.afterEntryId ?? null,
404
- through_entry_id: gate.throughEntryId,
405
- });
406
- }
407
411
  raiseSituationalFatal(markerEntryId, error) {
408
412
  return this.raiseFatal('inbox.situational_context.missing', 'situational context marker has no readable sidecar', error, {
409
413
  entry_id: markerEntryId,
@@ -471,7 +475,7 @@ class CanvasInboxWatcher {
471
475
  this.assertNodeOwnership(nodeId, 'poll');
472
476
  if (this.seeded)
473
477
  return true;
474
- const initial = this.pollRead(() => readCursor(nodeId));
478
+ const initial = this.pollRead(() => readBrokerCursor(nodeId));
475
479
  if (!initial.ok)
476
480
  return false;
477
481
  this.nodeId = nodeId;
@@ -484,25 +488,21 @@ class CanvasInboxWatcher {
484
488
  const nodeId = currentNodeId();
485
489
  if (nodeId === undefined || !this.seed(nodeId))
486
490
  return;
487
- if ((this.replay !== undefined || this.buffer.length > 0) && this.readRefreshIntentOrFatal(nodeId, 'poll'))
488
- return;
489
- if (this.replay !== undefined) {
490
- this.processReplay(nodeId);
491
+ if (this.pendingCommit !== undefined) {
492
+ this.retryPendingCommitOnTick(nodeId);
491
493
  return;
492
494
  }
493
- if (this.buffer.length === 0 && this.pendingHandoffs.length >= MAX_ORDINARY_HANDOFFS)
495
+ if (this.buffer.length === 0 && this.pendingHandoffs.length >= MAX_PENDING_HANDOFFS)
494
496
  return;
495
497
  if (this.buffer.length > 0) {
496
498
  const plan = this.ordinaryPlan();
497
- if (plan.sendCount > 0 && this.pendingHandoffs.length + plan.sendCount > MAX_ORDINARY_HANDOFFS)
499
+ if (plan.sendCount > 0 && this.pendingHandoffs.length + plan.sendCount > MAX_PENDING_HANDOFFS)
498
500
  return;
499
501
  }
500
- const read = this.pollRead(() => readInboxSince(nodeId, this.cursor));
502
+ const read = this.pollRead(() => readBrokerInboxSince(nodeId, this.cursor));
501
503
  if (!read.ok)
502
504
  return;
503
505
  const newEntries = read.value;
504
- if ((newEntries.length > 0 || this.buffer.length > 0) && this.readRefreshIntentOrFatal(nodeId, 'poll'))
505
- return;
506
506
  if (newEntries.length > 0) {
507
507
  this.cursor = newEntries.at(-1).entry_id;
508
508
  this.buffer.push(...newEntries);
@@ -516,11 +516,10 @@ class CanvasInboxWatcher {
516
516
  // Interrupt-canceled entries (a human Esc racing a not-yet-injected send —
517
517
  // `POST /v1/nodes/{id}/interrupt`) are excluded from BOTH channels. Read
518
518
  // fresh each plan build: the cancel can land AFTER the entry was buffered.
519
- // Filtering here keeps buildPlan and replayCoverageComplete in agreement,
520
- // so a fully-canceled replay range still completes. Skipped entries are
521
- // never handed off; the durable cursor covers them positionally when a
522
- // later entry settles (or they are simply re-filtered after a restart).
523
- const canceled = this.nodeId === undefined ? undefined : readCanceledEntryIds(this.nodeId);
519
+ // Skipped entries are never handed off; the durable cursor covers them
520
+ // positionally when a later entry settles (or they are re-filtered after a
521
+ // restart).
522
+ const canceled = this.nodeId === undefined ? undefined : readBrokerCanceledEntryIds(this.nodeId);
524
523
  const live = canceled === undefined || canceled.size === 0
525
524
  ? entries
526
525
  : entries.filter((entry) => !canceled.has(entry.entry_id));
@@ -580,7 +579,7 @@ class CanvasInboxWatcher {
580
579
  }
581
580
  digest(entries, stage) {
582
581
  try {
583
- return coalesce([...entries]);
582
+ return coalesceBrokerInbox(entries, this.reportNodes);
584
583
  }
585
584
  catch (error) {
586
585
  this.raiseReadFatal(stage, error);
@@ -715,7 +714,7 @@ class CanvasInboxWatcher {
715
714
  const plan = this.ordinaryPlan();
716
715
  if (plan.deferredHold)
717
716
  return 'held';
718
- if (this.pendingHandoffs.length + plan.sendCount > MAX_ORDINARY_HANDOFFS)
717
+ if (this.pendingHandoffs.length + plan.sendCount > MAX_PENDING_HANDOFFS)
719
718
  return 'capacity-blocked';
720
719
  const batch = [...this.buffer];
721
720
  const execution = this.executePlan(nodeId, plan, 'poll');
@@ -725,45 +724,6 @@ class CanvasInboxWatcher {
725
724
  this.requeueFromBatch(batch, execution.retryEntryIds);
726
725
  return 'attempted';
727
726
  }
728
- processReplay(nodeId) {
729
- const gate = this.replay;
730
- if (gate === undefined)
731
- return;
732
- if (gate.entries === undefined) {
733
- if (gate.attempted) {
734
- this.raiseReplayFatal(gate, new Error('replay range was already attempted without retained entries'));
735
- }
736
- gate.attempted = true;
737
- let entries;
738
- try {
739
- entries = readInboxRange(nodeId, gate.afterEntryId, gate.throughEntryId);
740
- }
741
- catch (error) {
742
- this.raiseReplayFatal(gate, error);
743
- }
744
- if (entries.length === 0 || entries.at(-1).entry_id !== gate.throughEntryId) {
745
- this.raiseReplayFatal(gate, new Error('replay range did not retain its inclusive target'));
746
- }
747
- gate.entries = entries;
748
- }
749
- const entries = gate.entries;
750
- const plan = this.buildPlan(entries);
751
- if (plan.hiddenEntries.length === 0 && plan.visibleEntries.length === 0) {
752
- if (this.replay === gate)
753
- this.replay = undefined;
754
- return;
755
- }
756
- if (plan.deferredHold)
757
- return;
758
- if (this.pendingHandoffs.length + plan.sendCount > MAX_PENDING_HANDOFFS)
759
- return;
760
- const execution = this.executePlan(nodeId, plan, 'poll');
761
- if (execution.inactive)
762
- return;
763
- if (this.canMutate() && this.replay === gate && this.replayCoverageComplete(entries)) {
764
- this.replay = undefined;
765
- }
766
- }
767
727
  coveredEntryIds(channel) {
768
728
  const covered = new Set();
769
729
  for (const handoff of this.pendingHandoffs) {
@@ -774,13 +734,54 @@ class CanvasInboxWatcher {
774
734
  }
775
735
  return covered;
776
736
  }
777
- replayCoverageComplete(entries) {
778
- const missing = this.missingChannelEntries(entries);
779
- return missing.hiddenEntries.length === 0 && missing.visibleEntries.length === 0;
737
+ retryPendingCommitOnTick(nodeId) {
738
+ void this.retryPendingCommit(nodeId).then((result) => {
739
+ if (result === 'refresh_held' && this.canMutate())
740
+ this.dispose('refresh', false);
741
+ }).catch((error) => {
742
+ if (this.canMutate())
743
+ this.dispose('shutdown', false, undefined, { error, stage: 'settle' });
744
+ });
745
+ }
746
+ retryPendingCommit(nodeId) {
747
+ const pending = this.pendingCommit;
748
+ if (pending === undefined)
749
+ return Promise.resolve('settled');
750
+ if (pending.attempt !== undefined)
751
+ return pending.attempt;
752
+ const attempt = this.attemptPendingCommit(nodeId, pending).finally(() => {
753
+ if (pending.attempt === attempt)
754
+ pending.attempt = undefined;
755
+ });
756
+ pending.attempt = attempt;
757
+ return attempt;
780
758
  }
781
- settle(nodeId, ctx, refreshHeld, holdPendingMessages) {
782
- if (refreshHeld)
759
+ async attemptPendingCommit(nodeId, pending) {
760
+ try {
761
+ const directive = await advanceBrokerInboxCursor(nodeId, {
762
+ throughEntryId: pending.throughEntryId,
763
+ brokerPid: process.pid,
764
+ });
765
+ if (directive.action === 'hold_refresh')
766
+ return 'refresh_held';
767
+ }
768
+ catch (error) {
769
+ if (this.pendingCommit === pending) {
770
+ for (const handoff of pending.handoffs) {
771
+ emitDeliveryFailure(handoff.operationId, handoff, 'cursor_commit', error);
772
+ }
773
+ }
783
774
  return 'held';
775
+ }
776
+ if (this.pendingCommit !== pending)
777
+ return 'settled';
778
+ this.durableCursor = pending.throughEntryId;
779
+ this.pendingCommit = undefined;
780
+ for (const handoff of pending.handoffs)
781
+ emitDeliveryCompleted(handoff);
782
+ return 'settled';
783
+ }
784
+ async settle(nodeId, ctx, holdPendingMessages) {
784
785
  if (holdPendingMessages) {
785
786
  try {
786
787
  if (ctx?.hasPendingMessages?.() === true)
@@ -790,8 +791,8 @@ class CanvasInboxWatcher {
790
791
  // A missing context signal does not invent a pending-message hold.
791
792
  }
792
793
  }
793
- if (this.replay !== undefined)
794
- return 'held';
794
+ if (this.pendingCommit !== undefined)
795
+ return this.retryPendingCommit(nodeId);
795
796
  if (this.pendingHandoffs.length === 0)
796
797
  return 'settled';
797
798
  const physical = this.readPhysicalSettlementState(nodeId);
@@ -811,33 +812,17 @@ class CanvasInboxWatcher {
811
812
  if (physical.throughIndexes.get(handoff) > physical.throughIndexes.get(target))
812
813
  target = handoff;
813
814
  }
814
- const targetIndex = physical.throughIndexes.get(target);
815
- try {
816
- writeCursor(nodeId, target.throughEntryId);
817
- }
818
- catch (error) {
819
- const eligibleSet = new Set(eligible);
820
- const failed = this.detachPending((handoff) => eligibleSet.has(handoff));
821
- this.replay = {
822
- afterEntryId: this.durableCursor,
823
- throughEntryId: target.throughEntryId,
824
- attempted: false,
825
- };
826
- for (const handoff of failed) {
827
- emitDeliveryFailure(handoff.operationId, handoff, 'cursor_commit', error);
828
- }
829
- return 'settled';
830
- }
831
- this.durableCursor = target.throughEntryId;
832
- const completed = this.detachPending((handoff) => physical.throughIndexes.get(handoff) <= targetIndex);
833
- for (const handoff of completed)
834
- emitDeliveryCompleted(handoff);
835
- return 'settled';
815
+ const committing = new Set(eligible);
816
+ this.pendingCommit = {
817
+ handoffs: this.detachPending((handoff) => committing.has(handoff)),
818
+ throughEntryId: target.throughEntryId,
819
+ };
820
+ return this.retryPendingCommit(nodeId);
836
821
  }
837
822
  readPhysicalSettlementState(nodeId) {
838
823
  let entries;
839
824
  try {
840
- entries = readInboxSince(nodeId);
825
+ entries = readBrokerInboxSince(nodeId);
841
826
  }
842
827
  catch (error) {
843
828
  this.raiseReadFatal('settle', error);
@@ -1,4 +1,4 @@
1
- import type { InboxEntry } from '../core/feed/inbox.js';
1
+ import { type BrokerPassiveEntry } from '../core/runtime/broker/passive.js';
2
2
  interface InputEventLike {
3
3
  type: 'input';
4
4
  text: string;
@@ -15,13 +15,13 @@ type InputEventResultLike = {
15
15
  action: 'handled';
16
16
  };
17
17
  interface PiLike {
18
- on: (event: 'input', handler: (event: InputEventLike, ctx: any) => InputEventResultLike | void) => void;
18
+ on: (event: 'input', handler: (event: InputEventLike, ctx: any) => InputEventResultLike | void | Promise<InputEventResultLike | void>) => void;
19
19
  }
20
20
  /**
21
21
  * Render drained passive entries (oldest first) into one XML pre-text block.
22
22
  * Each accumulated message is its own timestamped `<update>` element.
23
23
  */
24
- export declare function formatPassive(entries: InboxEntry[]): string;
24
+ export declare function formatPassive(entries: BrokerPassiveEntry[], reportNodes?: ReadonlyMap<string, unknown>): string;
25
25
  /**
26
26
  * Register the passive-context drain on `pi`.
27
27
  *
@@ -19,8 +19,9 @@
19
19
  // Plain TS-with-types — no imports from @earendil-works/* so this compiles inside
20
20
  // crouter's own tsc build without a dep on the pi packages.
21
21
  import { existsSync, readFileSync } from 'node:fs';
22
- import { resolveRef } from '../core/canvas/history.js';
23
- import { drainPassive } from '../core/feed/passive.js';
22
+ import { brokerExtensionState } from '../core/runtime/broker/daemon-ops.js';
23
+ import { reportPathFromRef } from '../core/runtime/broker-extension-render.js';
24
+ import { drainBrokerPassive } from '../core/runtime/broker/passive.js';
24
25
  // Per-entry body cap so a single fat report can't blow the context budget. The
25
26
  // full report stays on disk at `ref` if the agent needs more.
26
27
  const BODY_CAP = 4_000;
@@ -37,24 +38,25 @@ function stripFrontmatter(raw) {
37
38
  }
38
39
  /** The content for one accumulated entry: the dereferenced report body when the
39
40
  * pointer carries a `ref`, else the entry's own label/data. Capped + trimmed. */
40
- function entryContent(e) {
41
+ function entryContent(e, reportNodes) {
41
42
  if (e.ref !== undefined && e.ref !== '') {
42
- // Push entries carry a canonical history handle; resolve it through the
43
- // same path as `canvas history read`. Direct-message spill refs remain
44
- // absolute filesystem paths and keep their existing dereference behavior.
45
- try {
46
- const resolved = resolveRef(e.ref);
47
- if (resolved?.source === 'report') {
48
- const body = resolved.body.trim();
43
+ // Push entries carry a canonical history handle. crtrd has already
44
+ // projected the sender set; use that metadata to validate the local path
45
+ // without importing the canvas history resolver. Direct-message spill refs
46
+ // remain absolute filesystem paths and keep their existing behavior.
47
+ const reportPath = reportPathFromRef(e.ref, reportNodes);
48
+ if (reportPath !== null) {
49
+ try {
50
+ const body = stripFrontmatter(readFileSync(reportPath, 'utf8')).trim();
49
51
  if (body !== '') {
50
52
  return body.length > BODY_CAP
51
53
  ? `${body.slice(0, BODY_CAP)}\n… (truncated; read the full report with \`crtr canvas history read ${e.ref}\`)`
52
54
  : body;
53
55
  }
54
56
  }
55
- }
56
- catch {
57
- /* fall through to the absolute spill-file path */
57
+ catch {
58
+ /* fall through to the absolute spill-file path */
59
+ }
58
60
  }
59
61
  if (existsSync(e.ref)) {
60
62
  try {
@@ -87,13 +89,13 @@ function attr(s) {
87
89
  * Render drained passive entries (oldest first) into one XML pre-text block.
88
90
  * Each accumulated message is its own timestamped `<update>` element.
89
91
  */
90
- export function formatPassive(entries) {
92
+ export function formatPassive(entries, reportNodes = new Map()) {
91
93
  const blocks = entries
92
94
  .map((e) => {
93
95
  const from = attr(e.from ?? 'system');
94
96
  const refAttr = e.ref !== undefined && e.ref !== '' ? ` ref="${attr(e.ref)}"` : '';
95
97
  return (`<update from="${from}" kind="${attr(e.kind)}" at="${attr(e.ts)}"${refAttr}>\n` +
96
- `${entryContent(e)}\n` +
98
+ `${entryContent(e, reportNodes)}\n` +
97
99
  `</update>`);
98
100
  })
99
101
  .join('\n');
@@ -113,15 +115,17 @@ export function formatPassive(entries) {
113
115
  * is the whole extension: drain on every message, prepend when non-empty.
114
116
  */
115
117
  export function registerCanvasPassiveContext(pi) {
116
- pi.on('input', (event) => {
118
+ pi.on('input', async (event) => {
117
119
  try {
118
120
  const nodeId = process.env['CRTR_NODE_ID'];
119
121
  if (nodeId === undefined || nodeId.trim() === '')
120
122
  return; // not a canvas node
121
- const drained = drainPassive(nodeId);
123
+ const drained = drainBrokerPassive(nodeId);
122
124
  if (drained.length === 0)
123
125
  return; // nothing accumulated → leave the message as-is
124
- const preText = formatPassive(drained);
126
+ const state = await brokerExtensionState(nodeId);
127
+ const reportNodes = new Map(state.report_nodes.map((node) => [node.node_id, node]));
128
+ const preText = formatPassive(drained, reportNodes);
125
129
  const text = event.text.trim() === '' ? preText : `${preText}\n\n${event.text}`;
126
130
  return { action: 'transform', text, images: event.images };
127
131
  }
@@ -1,4 +1,3 @@
1
- import { regenerateAndPersistName } from '../core/runtime/naming-persist.js';
2
1
  import { generateRecap } from '../core/runtime/recap.js';
3
2
  interface TextContentLike {
4
3
  type: string;
@@ -44,11 +43,12 @@ interface PiLike {
44
43
  getSessionName?(): string | undefined;
45
44
  setSessionName?(name: string): void;
46
45
  }
46
+ type NameRegenerator = (nodeId: string, conversation: string, isStillAutomatic: () => boolean, onNamed?: (editorLabel: string) => void) => void;
47
47
  /**
48
48
  * Register the inactivity-recap chrome on `pi`.
49
49
  *
50
50
  * Returns immediately (inert) when CRTR_NODE_ID is absent — a plain pi session
51
51
  * or legacy job agent loads it as a no-op.
52
52
  */
53
- export declare function registerCanvasRecap(pi: PiLike, recapGenerator?: typeof generateRecap, nameRegenerator?: typeof regenerateAndPersistName): void;
53
+ export declare function registerCanvasRecap(pi: PiLike, recapGenerator?: typeof generateRecap, nameRegenerator?: NameRegenerator): void;
54
54
  export default registerCanvasRecap;