@north-light/crouter 0.3.173 → 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} +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/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
@@ -61,7 +61,6 @@ export const DAEMON_ENV_STRIP_KEYS = [
61
61
  // suspected poison vectors.
62
62
  'CRTR_BROKER_ENGINE',
63
63
  'CRTR_PI_BINARY',
64
- 'CRTR_FAULT_RETRY_PROBE',
65
64
  // Generic Node.js env poisoning (a stray dev/debug flag from the restarting
66
65
  // shell).
67
66
  'NODE_OPTIONS',
@@ -0,0 +1,50 @@
1
+ import { type NodeRow } from '../../core/canvas/index.js';
2
+ import type { FleetRegistry } from '../../core/runtime/fleet.js';
3
+ export interface DetachedWorkLifecycle {
4
+ acceptsDetachedWork(): boolean;
5
+ registerDetached(work: Promise<void>): void;
6
+ }
7
+ export interface BrokerSupervisionContext {
8
+ fleet: FleetRegistry;
9
+ lifecycle: DetachedWorkLifecycle;
10
+ }
11
+ export declare function brokerThresholdsForDaemon(): {
12
+ warning: number;
13
+ automaticReviveCap: number;
14
+ };
15
+ export declare const YIELD_STALL_GRACE_MS: number;
16
+ export declare const WEDGE_QUIET_MS: number;
17
+ export declare const WEDGE_CPU_MAX_PERCENT = 2;
18
+ export declare function unattendedParkMsForDaemon(): number;
19
+ export type WedgeVerdict = 'leave' | 'pending' | 'wedged';
20
+ export declare function yieldStallVerdict(piPidAlive: boolean | null, intent: NodeRow['intent'], busy: boolean, stalledFor: number | null): 'leave' | 'pending' | 'kill';
21
+ export declare function wedgeVerdict(input: {
22
+ busy: boolean;
23
+ quietForMs: number | null;
24
+ cpuPercent: number | null;
25
+ }): WedgeVerdict;
26
+ export declare function sumTreeCpu(psOutput: string, rootPid: number): number | null;
27
+ export declare function treeHasDescendants(psOutput: string, rootPid: number): boolean | null;
28
+ export declare class BrokerSupervisionReconciler {
29
+ private readonly yieldStallSince;
30
+ private readonly yieldTermAt;
31
+ private readonly wedgeNotifiedAt;
32
+ private readonly fatalFaultNotifiedAt;
33
+ private readonly unattendedSince;
34
+ private knownAuthMtimeMs;
35
+ private lastOverCapWarnAt;
36
+ private lastCapacityLogAt;
37
+ run(now: number, ctx: BrokerSupervisionContext): Promise<{
38
+ warning: number;
39
+ automaticReviveCap: number;
40
+ }>;
41
+ private handleUnattendedParking;
42
+ private warnOverCapInTmux;
43
+ private handleYieldStall;
44
+ private readTreeSample;
45
+ private handleWedgeDetection;
46
+ private handleFatalFault;
47
+ private handleAuthReload;
48
+ hasBrokerCapacity(max: number, fleet: FleetRegistry): boolean;
49
+ hasStartupRecoveryCapacity(fleet: FleetRegistry): boolean;
50
+ }
@@ -0,0 +1,549 @@
1
+ import { statSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ import { execFile } from 'node:child_process';
5
+ import { promisify } from 'node:util';
6
+ import { getRow, getNode, subscribersOf } from '../../core/canvas/index.js';
7
+ import { contextDir, isSafeNodeId } from '../../core/canvas/paths.js';
8
+ import { fullName } from '../../core/canvas/labels.js';
9
+ import { recordedPidLiveness } from '../../core/canvas/pid.js';
10
+ import { transition } from '../../core/runtime/lifecycle.js';
11
+ import { isBusy, busySince } from '../../core/runtime/busy.js';
12
+ import { readFault, recordFault } from '../../core/runtime/fault.js';
13
+ import { nextFaultRetry } from '../../core/runtime/fault-recovery.js';
14
+ import { fanDoctrineWake } from '../../core/runtime/close.js';
15
+ import { headlessBrokerHost } from '../../core/runtime/host.js';
16
+ import { reloadAuthLive } from '../../core/runtime/auth-reload.js';
17
+ import { readConfig } from '../../core/config.js';
18
+ import { emitEvent } from '../../core/events/emit.js';
19
+ import { operationIdContext } from '../../core/events/operation-id.js';
20
+ import { readCursor, readInboxSince } from '../../core/feed/inbox.js';
21
+ import { activeBackgroundBashJobs } from '../../core/bash-jobs.js';
22
+ import { focusOf } from '../../core/runtime/placement.js';
23
+ const execFileAsync = promisify(execFile);
24
+ function configuredPositiveInteger(name, fallback) {
25
+ const raw = process.env[name];
26
+ if (raw === undefined || raw === '')
27
+ return fallback;
28
+ const n = Number(raw);
29
+ return Number.isSafeInteger(n) && n >= 1 ? n : fallback;
30
+ }
31
+ export function brokerThresholdsForDaemon() {
32
+ const configured = readConfig('user').brokerThresholds;
33
+ const automaticReviveCap = configuredPositiveInteger('CRTR_MAX_LIVE_BROKERS', configured.automaticReviveCap);
34
+ const warning = configuredPositiveInteger('CRTR_WARN_LIVE_BROKERS', configured.warning);
35
+ return { warning: Math.min(warning, automaticReviveCap), automaticReviveCap };
36
+ }
37
+ export const YIELD_STALL_GRACE_MS = 3 * 60_000;
38
+ const KILL_ESCALATE_MS = 20_000;
39
+ export const WEDGE_QUIET_MS = 20 * 60_000;
40
+ export const WEDGE_CPU_MAX_PERCENT = 2;
41
+ const OVER_CAP_WARN_THROTTLE_MS = 5 * 60_000;
42
+ const CAPACITY_LOG_THROTTLE_MS = 30_000;
43
+ const DEFAULT_UNATTENDED_PARK_MS = 15 * 60_000;
44
+ export function unattendedParkMsForDaemon() {
45
+ const raw = process.env['CRTR_TEST_UNATTENDED_PARK_MS'];
46
+ if (raw === undefined)
47
+ return DEFAULT_UNATTENDED_PARK_MS;
48
+ const parsed = Number(raw);
49
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : DEFAULT_UNATTENDED_PARK_MS;
50
+ }
51
+ export function yieldStallVerdict(piPidAlive, intent, busy, stalledFor) {
52
+ if (piPidAlive !== true)
53
+ return 'leave';
54
+ if (intent !== 'refresh')
55
+ return 'leave';
56
+ if (busy)
57
+ return 'leave';
58
+ if (stalledFor === null || stalledFor < YIELD_STALL_GRACE_MS)
59
+ return 'pending';
60
+ return 'kill';
61
+ }
62
+ export function wedgeVerdict(input) {
63
+ if (!input.busy)
64
+ return 'leave';
65
+ if (input.quietForMs === null || input.quietForMs < WEDGE_QUIET_MS)
66
+ return 'leave';
67
+ if (input.cpuPercent === null || input.cpuPercent > WEDGE_CPU_MAX_PERCENT)
68
+ return 'pending';
69
+ return 'wedged';
70
+ }
71
+ function parsePsTree(psOutput) {
72
+ const byPid = new Map();
73
+ const childrenOf = new Map();
74
+ for (const line of psOutput.split('\n')) {
75
+ const trimmed = line.trim();
76
+ if (trimmed === '')
77
+ continue;
78
+ const parts = trimmed.split(/\s+/);
79
+ if (parts.length < 3)
80
+ continue;
81
+ const pid = Number(parts[0]);
82
+ const ppid = Number(parts[1]);
83
+ const pcpu = Number(parts[2]);
84
+ if (!Number.isFinite(pid) || !Number.isFinite(ppid) || !Number.isFinite(pcpu))
85
+ continue;
86
+ byPid.set(pid, pcpu);
87
+ const siblings = childrenOf.get(ppid);
88
+ if (siblings === undefined)
89
+ childrenOf.set(ppid, [pid]);
90
+ else
91
+ siblings.push(pid);
92
+ }
93
+ return { byPid, childrenOf };
94
+ }
95
+ export function sumTreeCpu(psOutput, rootPid) {
96
+ const { byPid, childrenOf } = parsePsTree(psOutput);
97
+ if (!byPid.has(rootPid))
98
+ return null;
99
+ let total = 0;
100
+ const stack = [rootPid];
101
+ const seen = new Set();
102
+ while (stack.length > 0) {
103
+ const pid = stack.pop();
104
+ if (seen.has(pid))
105
+ continue;
106
+ seen.add(pid);
107
+ total += byPid.get(pid) ?? 0;
108
+ const kids = childrenOf.get(pid);
109
+ if (kids !== undefined)
110
+ stack.push(...kids);
111
+ }
112
+ return total;
113
+ }
114
+ export function treeHasDescendants(psOutput, rootPid) {
115
+ const { byPid, childrenOf } = parsePsTree(psOutput);
116
+ if (!byPid.has(rootPid))
117
+ return null;
118
+ return (childrenOf.get(rootPid) ?? []).length > 0;
119
+ }
120
+ function piCredentialPaths() {
121
+ const env = process.env['PI_CODING_AGENT_DIR'];
122
+ const agentDir = env !== undefined && env !== '' ? env : join(homedir(), '.pi', 'agent');
123
+ return [
124
+ join(agentDir, 'auth.json'),
125
+ join(agentDir, 'anthropic-subscriptions.json'),
126
+ join(agentDir, 'openai-codex-subscriptions.json'),
127
+ ];
128
+ }
129
+ export class BrokerSupervisionReconciler {
130
+ yieldStallSince = new Map();
131
+ yieldTermAt = new Map();
132
+ wedgeNotifiedAt = new Map();
133
+ fatalFaultNotifiedAt = new Map();
134
+ unattendedSince = new Map();
135
+ knownAuthMtimeMs = null;
136
+ lastOverCapWarnAt = Number.NEGATIVE_INFINITY;
137
+ lastCapacityLogAt = Number.NEGATIVE_INFINITY;
138
+ async run(now, ctx) {
139
+ await this.handleAuthReload(now, ctx.fleet);
140
+ const thresholds = brokerThresholdsForDaemon();
141
+ if (ctx.fleet.size() >= thresholds.warning && ctx.lifecycle.acceptsDetachedWork()) {
142
+ const warning = operationIdContext.fresh(() => this.warnOverCapInTmux(ctx.fleet.size(), thresholds.warning, thresholds.automaticReviveCap));
143
+ ctx.lifecycle.registerDetached(warning);
144
+ }
145
+ for (const [id, entry] of Array.from(ctx.fleet.entries())) {
146
+ await operationIdContext.fresh(async () => {
147
+ try {
148
+ const row = getRow(id);
149
+ if (row === null || (row.status !== 'active' && row.status !== 'idle')) {
150
+ this.unattendedSince.delete(id);
151
+ return;
152
+ }
153
+ this.handleYieldStall(row, entry.pid, now);
154
+ await this.handleWedgeDetection(id, entry.pid, row.pi_pid_identity, now);
155
+ this.handleFatalFault(id);
156
+ this.handleUnattendedParking(id, getNode(id), entry.pid, now);
157
+ }
158
+ catch (err) {
159
+ this.unattendedSince.delete(id);
160
+ emitEvent({
161
+ level: 'error',
162
+ event: 'broker.supervision.failed',
163
+ ...(isSafeNodeId(id) ? { node_id: id } : { fields: { affected_node_id: id } }),
164
+ error: err,
165
+ });
166
+ }
167
+ });
168
+ }
169
+ for (const id of this.unattendedSince.keys()) {
170
+ if (!ctx.fleet.has(id))
171
+ this.unattendedSince.delete(id);
172
+ }
173
+ return thresholds;
174
+ }
175
+ handleUnattendedParking(id, row, livePid, now) {
176
+ if (row === null
177
+ || row.pi_session_id == null
178
+ || row.pi_pid !== livePid
179
+ || row.status === 'done'
180
+ || row.status === 'canceled'
181
+ || row.status === 'dead'
182
+ || row.intent !== null
183
+ || isBusy(id)
184
+ || activeBackgroundBashJobs(contextDir(id)).length > 0
185
+ || focusOf(id) !== null) {
186
+ this.unattendedSince.delete(id);
187
+ return;
188
+ }
189
+ const fault = readFault(id);
190
+ const activeAutoProviderRetry = fault !== null
191
+ && fault.retry.disposition === 'auto'
192
+ && fault.retry.by === 'daemon'
193
+ && (fault.kind === 'connection' || fault.kind === 'rate-limit' || fault.kind === 'overloaded')
194
+ && (fault.retry.nextAt !== undefined || nextFaultRetry(fault, now) !== null);
195
+ if (activeAutoProviderRetry
196
+ || readInboxSince(id, readCursor(id)).some((entry) => entry.tier !== 'deferred')) {
197
+ this.unattendedSince.delete(id);
198
+ return;
199
+ }
200
+ const since = this.unattendedSince.get(id);
201
+ if (since === undefined) {
202
+ this.unattendedSince.set(id, now);
203
+ return;
204
+ }
205
+ if (now - since < unattendedParkMsForDaemon())
206
+ return;
207
+ this.unattendedSince.delete(id);
208
+ transition(id, 'release');
209
+ headlessBrokerHost.teardown(id);
210
+ }
211
+ async warnOverCapInTmux(count, warning, max) {
212
+ const now = Date.now();
213
+ if (now - this.lastOverCapWarnAt < OVER_CAP_WARN_THROTTLE_MS)
214
+ return;
215
+ this.lastOverCapWarnAt = now;
216
+ emitEvent({
217
+ level: 'warn',
218
+ event: 'broker.capacity.warning',
219
+ fields: { live_count: count, warning_threshold: warning, hard_cap: max },
220
+ });
221
+ const msg = `⚠ crtrd: ${count} live brokers (warning ${warning}; hard cap ${max}) — possible broker leak. ps -ax | grep broker-cli.js`;
222
+ try {
223
+ const clients = await execFileAsync('tmux', ['list-clients', '-F', '#{client_name}'], {
224
+ encoding: 'utf8',
225
+ timeout: 2000,
226
+ });
227
+ if (typeof clients.stdout !== 'string')
228
+ return;
229
+ await Promise.allSettled(clients.stdout.split('\n').map(async (client) => {
230
+ if (client === '')
231
+ return;
232
+ try {
233
+ await execFileAsync('tmux', ['display-message', '-d', '10000', '-c', client, msg], {
234
+ encoding: 'utf8',
235
+ timeout: 2000,
236
+ });
237
+ }
238
+ catch {
239
+ try {
240
+ await execFileAsync('tmux', ['display-message', '-c', client, msg], {
241
+ encoding: 'utf8',
242
+ timeout: 2000,
243
+ });
244
+ }
245
+ catch {
246
+ /* no display channel for this client */
247
+ }
248
+ }
249
+ }));
250
+ }
251
+ catch {
252
+ /* no tmux server — the canonical event above still records the condition */
253
+ }
254
+ }
255
+ handleYieldStall(row, pid, now) {
256
+ const id = row.node_id;
257
+ if (row.intent !== 'refresh' || isBusy(id)) {
258
+ this.yieldStallSince.delete(id);
259
+ this.yieldTermAt.delete(id);
260
+ return;
261
+ }
262
+ const since = this.yieldStallSince.get(id);
263
+ if (since === undefined) {
264
+ this.yieldStallSince.set(id, now);
265
+ return;
266
+ }
267
+ if (yieldStallVerdict(true, row.intent, false, now - since) !== 'kill')
268
+ return;
269
+ if (row.pi_pid_identity == null || recordedPidLiveness(pid, row.pi_pid_identity) !== 'alive')
270
+ return;
271
+ const termed = this.yieldTermAt.get(id);
272
+ if (termed === undefined) {
273
+ emitEvent({
274
+ level: 'warn',
275
+ event: 'broker.yield_stall.sigterm',
276
+ ...(isSafeNodeId(id) ? { node_id: id } : {}),
277
+ fields: {
278
+ ...(isSafeNodeId(id) ? {} : { affected_node_id: id }),
279
+ pid,
280
+ elapsed_ms: now - since,
281
+ grace_ms: YIELD_STALL_GRACE_MS,
282
+ },
283
+ });
284
+ try {
285
+ process.kill(pid, 'SIGTERM');
286
+ }
287
+ catch {
288
+ /* already gone */
289
+ }
290
+ this.yieldTermAt.set(id, now);
291
+ }
292
+ else if (now - termed >= KILL_ESCALATE_MS) {
293
+ emitEvent({
294
+ level: 'warn',
295
+ event: 'broker.yield_stall.sigkill',
296
+ ...(isSafeNodeId(id) ? { node_id: id } : {}),
297
+ fields: {
298
+ ...(isSafeNodeId(id) ? {} : { affected_node_id: id }),
299
+ pid,
300
+ elapsed_ms: now - termed,
301
+ grace_ms: KILL_ESCALATE_MS,
302
+ stall_elapsed_ms: now - since,
303
+ },
304
+ });
305
+ try {
306
+ process.kill(pid, 'SIGKILL');
307
+ }
308
+ catch {
309
+ /* already gone */
310
+ }
311
+ }
312
+ }
313
+ async readTreeSample(pid) {
314
+ try {
315
+ const { stdout } = await execFileAsync('ps', ['-ax', '-o', 'pid=,ppid=,pcpu='], {
316
+ encoding: 'utf8',
317
+ timeout: 2000,
318
+ });
319
+ if (typeof stdout !== 'string')
320
+ return null;
321
+ const cpuPercent = sumTreeCpu(stdout, pid);
322
+ const hasDescendants = treeHasDescendants(stdout, pid);
323
+ if (cpuPercent === null || hasDescendants === null)
324
+ return null;
325
+ return { cpuPercent, hasDescendants };
326
+ }
327
+ catch {
328
+ return null;
329
+ }
330
+ }
331
+ async handleWedgeDetection(id, pid, expectedIdentity, now) {
332
+ if (!isBusy(id)) {
333
+ this.wedgeNotifiedAt.delete(id);
334
+ return;
335
+ }
336
+ const since = busySince(id);
337
+ const quietForMs = since === null ? null : now - since;
338
+ const sample = quietForMs !== null && quietForMs >= WEDGE_QUIET_MS ? await this.readTreeSample(pid) : null;
339
+ const cpuPercent = sample?.cpuPercent ?? null;
340
+ if (wedgeVerdict({ busy: true, quietForMs, cpuPercent }) !== 'wedged')
341
+ return;
342
+ if (since !== null && this.wedgeNotifiedAt.get(id) === since)
343
+ return;
344
+ if (sample?.hasDescendants === false && (expectedIdentity == null || recordedPidLiveness(pid, expectedIdentity) !== 'alive'))
345
+ return;
346
+ if (since !== null)
347
+ this.wedgeNotifiedAt.set(id, since);
348
+ const meta = getNode(id);
349
+ const name = meta !== null ? fullName(meta) : id;
350
+ const minutes = Math.round((quietForMs ?? WEDGE_QUIET_MS) / 60_000);
351
+ const hasDescendants = sample?.hasDescendants ?? true;
352
+ let label;
353
+ if (hasDescendants) {
354
+ label =
355
+ `Child wedged — ${name} (${id}) is alive and mid-turn but has shown NO engine progress for ` +
356
+ `${minutes}+ minutes and its process is near-idle. It will NOT recover on its own — read ` +
357
+ `\`crtr memory read wedged-child-on-runaway-bash\` and kill the runaway SUBPROCESS (not this ` +
358
+ `node) so its turn can resume with no lost context.`;
359
+ }
360
+ else {
361
+ label =
362
+ `Child wedged — ${name} (${id}) is alive and mid-turn but has shown NO engine progress for ` +
363
+ `${minutes}+ minutes, its process is near-idle, AND it has no subprocess to kill (the engine ` +
364
+ `itself stalled). Kicking it now: SIGTERM to the broker — the daemon will resume a cleanly ` +
365
+ `aborted session with a continuation, or start a recovery cycle if the abort cannot settle.`;
366
+ try {
367
+ process.kill(pid, 'SIGTERM');
368
+ }
369
+ catch {
370
+ /* already gone — its ChildProcess exit event still owns recovery */
371
+ }
372
+ }
373
+ emitEvent({
374
+ level: 'error',
375
+ event: 'broker.wedge.detected',
376
+ ...(isSafeNodeId(id) ? { node_id: id } : {}),
377
+ fields: {
378
+ ...(isSafeNodeId(id) ? {} : { affected_node_id: id }),
379
+ pid,
380
+ quiet_ms: quietForMs,
381
+ cpu_percent: cpuPercent,
382
+ has_descendants: hasDescendants,
383
+ kicked: !hasDescendants,
384
+ },
385
+ });
386
+ try {
387
+ recordFault(id, {
388
+ link: 'daemon→node',
389
+ op: 'engine wedge',
390
+ kind: 'wedged',
391
+ retry: { disposition: 'manual' },
392
+ message: label,
393
+ });
394
+ }
395
+ catch {
396
+ /* best-effort — the doctrine wake below is the load-bearing notice */
397
+ }
398
+ try {
399
+ fanDoctrineWake(id, subscribersOf(id), label, {
400
+ reason: 'child-wedged',
401
+ child: id,
402
+ quiet_ms: quietForMs,
403
+ cpu_percent: cpuPercent,
404
+ kicked: !hasDescendants,
405
+ });
406
+ }
407
+ catch {
408
+ /* best-effort, mirrors every other fan-out in this file */
409
+ }
410
+ }
411
+ handleFatalFault(id) {
412
+ const fault = readFault(id);
413
+ if (fault === null) {
414
+ this.fatalFaultNotifiedAt.delete(id);
415
+ return;
416
+ }
417
+ if (fault.retry.disposition !== 'fatal' || fault.link !== 'pi→provider')
418
+ return;
419
+ if (this.fatalFaultNotifiedAt.get(id) === fault.since)
420
+ return;
421
+ this.fatalFaultNotifiedAt.set(id, fault.since);
422
+ const meta = getNode(id);
423
+ const name = meta !== null ? fullName(meta) : id;
424
+ const isAuth = fault.kind === 'auth';
425
+ const firstLine = (fault.message.split('\n')[0] ?? '').slice(0, 200);
426
+ const terminalOverflow = fault.kind === 'context-overflow';
427
+ const label = terminalOverflow
428
+ ? `Child failed — ${name} (${id}) exceeded its model context window and is now dead. ` +
429
+ `Shrink the task or loaded context, or choose a larger-context model before spawning it again. Error: ${firstLine}`
430
+ : `Child hit a fatal provider fault — ${name} (${id}) got a non-retryable ${fault.kind} error and will NOT recover on its own; ` +
431
+ `it stays alive but every wake re-fails until the fault clears. ` +
432
+ (isAuth
433
+ ? `Its provider credential is dead — re-authenticate (\`/login\`, or re-auth crtr); the child recovers on its next wake once the auth reloads. `
434
+ : ``) +
435
+ `Error: ${firstLine}`;
436
+ if (terminalOverflow) {
437
+ try {
438
+ transition(id, 'crash');
439
+ headlessBrokerHost.teardown(id);
440
+ }
441
+ catch {
442
+ /* the terminal notice remains useful if teardown raced the broker exit */
443
+ }
444
+ }
445
+ emitEvent({
446
+ level: 'error',
447
+ event: 'fault.fatal.fanout',
448
+ ...(isSafeNodeId(id) ? { node_id: id } : {}),
449
+ fields: {
450
+ ...(isSafeNodeId(id) ? {} : { affected_node_id: id }),
451
+ kind: fault.kind,
452
+ link: fault.link,
453
+ terminal_overflow: terminalOverflow,
454
+ },
455
+ });
456
+ try {
457
+ fanDoctrineWake(id, subscribersOf(id), label, {
458
+ reason: terminalOverflow ? 'child-context-overflow' : 'child-fault-fatal',
459
+ child: id,
460
+ kind: fault.kind,
461
+ message: firstLine,
462
+ });
463
+ }
464
+ catch {
465
+ /* best-effort, mirrors every other fan-out in this file */
466
+ }
467
+ }
468
+ async handleAuthReload(now, fleet) {
469
+ void now;
470
+ let mtimeMs = 0;
471
+ for (const path of piCredentialPaths()) {
472
+ try {
473
+ mtimeMs = Math.max(mtimeMs, statSync(path).mtimeMs);
474
+ }
475
+ catch {
476
+ /* not written yet — nothing to observe for this file */
477
+ }
478
+ }
479
+ if (mtimeMs === 0)
480
+ return;
481
+ if (this.knownAuthMtimeMs === null) {
482
+ this.knownAuthMtimeMs = mtimeMs;
483
+ return;
484
+ }
485
+ if (mtimeMs === this.knownAuthMtimeMs)
486
+ return;
487
+ this.knownAuthMtimeMs = mtimeMs;
488
+ await operationIdContext.fresh(async () => {
489
+ try {
490
+ const live = Array.from(fleet.entries(), ([id]) => id);
491
+ if (live.length === 0)
492
+ return;
493
+ const results = await Promise.allSettled(live.map(async (id) => {
494
+ try {
495
+ await reloadAuthLive(id);
496
+ }
497
+ catch (err) {
498
+ emitEvent({
499
+ level: 'error',
500
+ event: 'auth.reload.broker_failed',
501
+ ...(isSafeNodeId(id) ? { node_id: id } : { fields: { broker_id: id } }),
502
+ error: err,
503
+ });
504
+ throw err;
505
+ }
506
+ }));
507
+ const ok = results.filter((r) => r.status === 'fulfilled').length;
508
+ emitEvent({
509
+ level: 'info',
510
+ event: 'auth.reload.completed',
511
+ outcome: ok === live.length ? 'succeeded' : 'failed',
512
+ fields: {
513
+ broker_count: live.length,
514
+ succeeded_count: ok,
515
+ failed_count: live.length - ok,
516
+ },
517
+ });
518
+ }
519
+ catch (err) {
520
+ emitEvent({ level: 'error', event: 'auth.reload.failed', error: err });
521
+ }
522
+ });
523
+ }
524
+ hasBrokerCapacity(max, fleet) {
525
+ if (fleet.size() < max)
526
+ return true;
527
+ const now = Date.now();
528
+ if (now - this.lastCapacityLogAt >= CAPACITY_LOG_THROTTLE_MS) {
529
+ this.lastCapacityLogAt = now;
530
+ emitEvent({
531
+ level: 'warn',
532
+ event: 'broker.capacity.revive_deferred',
533
+ fields: { live_count: fleet.size(), hard_cap: max },
534
+ });
535
+ }
536
+ return false;
537
+ }
538
+ hasStartupRecoveryCapacity(fleet) {
539
+ const { automaticReviveCap } = brokerThresholdsForDaemon();
540
+ if (fleet.size() < automaticReviveCap)
541
+ return true;
542
+ emitEvent({
543
+ level: 'warn',
544
+ event: 'daemon.recovery_sweep.capacity_deferred',
545
+ fields: { live_count: fleet.size() },
546
+ });
547
+ return false;
548
+ }
549
+ }
@@ -0,0 +1,10 @@
1
+ import type { DetachedWorkLifecycle } from './broker-supervision.js';
2
+ export interface CronLaneContext {
3
+ lifecycle: DetachedWorkLifecycle;
4
+ /** P3.4's capacity authority, bound to the thresholds returned by the live
5
+ * supervision pass for this same tick. */
6
+ hasBrokerCapacity(): boolean;
7
+ }
8
+ export declare class CronLaneReconciler {
9
+ run(now: number, ctx: CronLaneContext): void;
10
+ }
@@ -0,0 +1,32 @@
1
+ import { emitEvent } from '../../core/events/emit.js';
2
+ import { operationIdContext } from '../../core/events/operation-id.js';
3
+ import { recoverStaleCronLeases, runDueCrons } from '../cron-run.js';
4
+ export class CronLaneReconciler {
5
+ run(now, ctx) {
6
+ // Recover stale leases before admitting due work. Every settlement remains
7
+ // detached from the serial tick but is registered for teardown drain.
8
+ operationIdContext.fresh(() => {
9
+ try {
10
+ recoverStaleCronLeases(now, {
11
+ register: (settlement) => ctx.lifecycle.registerDetached(settlement),
12
+ });
13
+ }
14
+ catch (err) {
15
+ emitEvent({ level: 'error', event: 'cron.lease_recovery.failed', error: err });
16
+ }
17
+ });
18
+ if (!ctx.lifecycle.acceptsDetachedWork())
19
+ return;
20
+ try {
21
+ runDueCrons(now, {
22
+ register: (settlement) => ctx.lifecycle.registerDetached(settlement),
23
+ // A due run that would launch or revive a node stays due until P3.4's
24
+ // capacity authority admits it.
25
+ hasBrokerCapacity: ctx.hasBrokerCapacity,
26
+ });
27
+ }
28
+ catch (err) {
29
+ emitEvent({ level: 'error', event: 'cron.run.failed', error: err });
30
+ }
31
+ }
32
+ }
@@ -0,0 +1,18 @@
1
+ import { type NodeRow } from '../../core/canvas/index.js';
2
+ import type { FleetRegistry } from '../../core/runtime/fleet.js';
3
+ export interface ControllerDeathContext {
4
+ rows: readonly NodeRow[];
5
+ }
6
+ export interface DormantInboxContext extends ControllerDeathContext {
7
+ fleet: FleetRegistry;
8
+ /** P3.4's capacity authority, bound to the thresholds returned by the live
9
+ * supervision pass for this same tick. */
10
+ hasBrokerCapacity(): boolean;
11
+ }
12
+ export declare class ControllerDeathReconciler {
13
+ run(_now: number, ctx: ControllerDeathContext): void;
14
+ }
15
+ export declare class DormantInboxReconciler {
16
+ private readonly relaunchState;
17
+ run(now: number, ctx: DormantInboxContext): void;
18
+ }