@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
@@ -0,0 +1,83 @@
1
+ // Broker view-socket readiness — one connect probe and its distinct wait policies.
2
+ //
3
+ // A successful Unix-socket connect proves a broker is listening; socket-file
4
+ // existence alone can be stale after a broker exit. This stays canvas-db-free so
5
+ // command callers can wait without reaching a runtime placement owner.
6
+ import { createConnection } from 'node:net';
7
+ import { viewSocketPath } from '../canvas/paths.js';
8
+ const BROKER_FOCUS_SOCKET_WAIT_MS = 30_000;
9
+ const BROKER_FOCUS_SOCKET_RETRY_MS = 100;
10
+ /** The shared cold-start deadline (ms) a freshly-opened viewer waits for its
11
+ * broker's view.sock — one source of truth for CRTR_ATTACH_WAIT_MS. */
12
+ export const BROKER_VIEW_SOCKET_WAIT_MS = BROKER_FOCUS_SOCKET_WAIT_MS;
13
+ function sleep(ms) {
14
+ return new Promise((resolve) => {
15
+ setTimeout(resolve, ms);
16
+ });
17
+ }
18
+ /** Resolve true exactly when `sockPath` accepts a connection within `timeoutMs`. */
19
+ export function probeViewSocket(sockPath, timeoutMs) {
20
+ return new Promise((resolve) => {
21
+ let settled = false;
22
+ let socket = null;
23
+ const finish = (ok) => {
24
+ if (settled)
25
+ return;
26
+ settled = true;
27
+ if (socket !== null)
28
+ socket.destroy();
29
+ resolve(ok);
30
+ };
31
+ try {
32
+ socket = createConnection(sockPath);
33
+ }
34
+ catch {
35
+ finish(false);
36
+ return;
37
+ }
38
+ socket.once('connect', () => finish(true));
39
+ socket.once('error', () => finish(false));
40
+ socket.setTimeout(timeoutMs, () => finish(false));
41
+ });
42
+ }
43
+ /** Bounded retry for the revive leaf, which has no launch handle to observe. */
44
+ export async function waitForViewSocketReady(nodeId) {
45
+ const sockPath = viewSocketPath(nodeId);
46
+ const deadline = Date.now() + BROKER_FOCUS_SOCKET_WAIT_MS;
47
+ while (Date.now() <= deadline) {
48
+ if (await probeViewSocket(sockPath, BROKER_FOCUS_SOCKET_RETRY_MS))
49
+ return true;
50
+ await sleep(BROKER_FOCUS_SOCKET_RETRY_MS);
51
+ }
52
+ return false;
53
+ }
54
+ /** Wait for a launched broker's view.sock, failing fast when its launch handle
55
+ * exits. `exited` remains optional for existing callers that only need the same
56
+ * bounded readiness deadline without a handle. */
57
+ export async function waitForBrokerViewSocket(nodeId, exited) {
58
+ const sockPath = viewSocketPath(nodeId);
59
+ const deadline = Date.now() + BROKER_FOCUS_SOCKET_WAIT_MS;
60
+ const exitSeen = exited?.then(() => 'exit');
61
+ while (Date.now() <= deadline) {
62
+ const remaining = Math.max(0, deadline - Date.now());
63
+ const probe = probeViewSocket(sockPath, Math.min(BROKER_FOCUS_SOCKET_RETRY_MS, remaining))
64
+ .then((ok) => (ok ? 'ready' : 'retry'));
65
+ const outcome = exitSeen === undefined ? await probe : await Promise.race([probe, exitSeen]);
66
+ if (outcome === 'ready')
67
+ return true;
68
+ if (outcome === 'exit')
69
+ return false;
70
+ if (exitSeen !== undefined) {
71
+ const sleptOrExit = await Promise.race([
72
+ sleep(BROKER_FOCUS_SOCKET_RETRY_MS).then(() => 'sleep'),
73
+ exitSeen,
74
+ ]);
75
+ if (sleptOrExit === 'exit')
76
+ return false;
77
+ }
78
+ else {
79
+ await sleep(BROKER_FOCUS_SOCKET_RETRY_MS);
80
+ }
81
+ }
82
+ return false;
83
+ }
@@ -36,8 +36,7 @@ export interface SessionState {
36
36
  * a welcome is a COMPLETE catch-up, so a welcome naming none clears it.
37
37
  * (The terminal viewer does not read this field: its overlay is owned by
38
38
  * `InputController`, which holds a live TUI handle rather than data. The field
39
- * is still session state — it is derived solely from broker frames — and the
40
- * web SPA renders straight off it.) */
39
+ * remains session state because it is derived solely from broker frames.) */
41
40
  dialog: RpcExtensionUIRequest | null;
42
41
  }
43
42
  export declare function initialSessionState(role?: ClientRole): SessionState;
@@ -1,23 +1,20 @@
1
1
  // session-state.ts — the ONE model of "what the broker has told this viewer".
2
2
  //
3
- // Both viewers (the terminal `crtr surface attach` client and the web SPA) used
4
- // to hand-maintain their own copies of the same facts, patched imperatively from
5
- // their own frame switches, and they DRIFTED: the terminal learned to clear
6
- // `isStreaming` on `agent_settled` (the frozen-`Working…` fix) and the web never
7
- // did. One reducer, two heads.
3
+ // Terminal attach folds every broker-derived fact through this reducer instead
4
+ // of patching mutable state in individual frame handlers. One reducer keeps the
5
+ // protocol projection coherent across every terminal consumer.
8
6
  //
9
7
  // The cut line is mechanical:
10
8
  //
11
9
  // SESSION state = anything derived SOLELY from what the broker sent.
12
- // VIEWER state = anything derived from local input or this terminal/tab.
10
+ // VIEWER state = anything derived from local input or this terminal viewer.
13
11
  //
14
12
  // So `role` belongs here even though it differs per viewer (the broker fixes it
15
13
  // from this viewer's `hello` and never changes it — "identical across viewers"
16
14
  // would get it wrong), while a transient notice, a connection phase, a
17
15
  // correlation id this viewer minted, and the transcript
18
16
  // RENDERING all stay with the viewer. The transcript itself is deliberately out
19
- // of scope: the terminal accumulates into a scrollback and the web replaces
20
- // wholesale, and that difference is legitimate.
17
+ // of scope because the terminal accumulates it into scrollback.
21
18
  //
22
19
  // `reduce` is pure and total over `BrokerToClient`: unknown/irrelevant frames
23
20
  // return the SAME object reference, so a viewer can drive its repaints off
@@ -5,7 +5,7 @@
5
5
  * nodes of human-in-the-loop. */
6
6
  export declare function isInTmux(): boolean;
7
7
  /** Is the canvas tmux SERVER reachable? The canvas runs on the DEFAULT tmux
8
- * socket (no -L/-S in core/runtime/tmux.ts), so any `crtr` child — including a
8
+ * socket (no -L/-S in core/runtime/tmux-driver.ts), so any `crtr` child — including a
9
9
  * headless-broker child that has deleted its own $TMUX — can split panes into
10
10
  * it. The human surface gates on THIS (can I reach the server to open a pane
11
11
  * the user is watching?), not on the caller's $TMUX. `list-clients` exits 0
@@ -3,7 +3,7 @@
3
3
  // The human surface gates on whether the canvas tmux server is reachable
4
4
  // (tmuxServerReachable) so it can decide whether to surface a prompt or degrade
5
5
  // to the inbox-drain follow-up. The canvas runtime has its own
6
- // one-window-per-node machinery in core/runtime/tmux.ts.
6
+ // one-window-per-node machinery in core/runtime/placement-tmux.ts.
7
7
  import { spawnSync } from 'node:child_process';
8
8
  /** Does THIS process sit inside a tmux client (its own $TMUX is set)? NOT the
9
9
  * gate for the human surface — see tmuxServerReachable. A headless-broker child
@@ -14,7 +14,7 @@ export function isInTmux() {
14
14
  return Boolean(process.env.TMUX);
15
15
  }
16
16
  /** Is the canvas tmux SERVER reachable? The canvas runs on the DEFAULT tmux
17
- * socket (no -L/-S in core/runtime/tmux.ts), so any `crtr` child — including a
17
+ * socket (no -L/-S in core/runtime/tmux-driver.ts), so any `crtr` child — including a
18
18
  * headless-broker child that has deleted its own $TMUX — can split panes into
19
19
  * it. The human surface gates on THIS (can I reach the server to open a pane
20
20
  * the user is watching?), not on the caller's $TMUX. `list-clients` exits 0
@@ -1,5 +1,5 @@
1
1
  import type { SubstrateDoc } from './schema.js';
2
- import type { NodeConfigSubject } from './subject.js';
2
+ import type { NodeConfigSubject } from './subject-fields.js';
3
3
  /** Does `doc` pass its gate for `subject`?
4
4
  *
5
5
  * - No gate (field absent) ⇒ `true`: always eligible (the common case).
@@ -0,0 +1,7 @@
1
+ import type { NodeConfigSubject } from './subject-fields.js';
2
+ /** Surface docs matched by a successful read tool call using the caller-supplied
3
+ * daemon snapshot subject. */
4
+ export declare function renderOnReadDocsForSubject(subject: NodeConfigSubject, readFilePath: string, seen?: Set<string>): string;
5
+ /** Workspace boot docs using the snapshot's cwd/profile instead of a canvas
6
+ * lookup. */
7
+ export declare function renderWorkspaceOpenDocsForSubject(subject: NodeConfigSubject, cwd: string, profileId: string | null): string;
@@ -0,0 +1,272 @@
1
+ // on-read.ts — file-context delivery for the document substrate.
2
+ //
3
+ // A memory with file-read visibility participates only through an explicit
4
+ // `applies-to` path glob (authoring lint requires one). Two events use that one
5
+ // routing mechanism:
6
+ //
7
+ // • A successful `read` tool call evaluates the read file against every
8
+ // visible substrate doc. Project stores encountered between that file and
9
+ // the filesystem root join the resolved cwd/profile corpus, so a nested
10
+ // workspace can contribute guidance exactly when a file beneath it is read.
11
+ // • Opening a workspace evaluates the reserved `applies-to: "."` target for
12
+ // every project store mounted by the cwd and selected profile. This happens
13
+ // while the first-message bearings are assembled, so workspace-wide context
14
+ // arrives before the task rather than waiting for an arbitrary first file.
15
+ //
16
+ // `read-when` remains an additional OR trigger over a read markdown file's own
17
+ // frontmatter. It does not replace `applies-to`: every non-none file-read rung
18
+ // still declares its path boundary explicitly.
19
+ //
20
+ // Every candidate renders at its own fileReadVisibility rung. Explicit routing
21
+ // is the whole on-read model, so directory INDEX ceilings remain a boot-catalog
22
+ // concern and do not cap a deliberately matched document.
23
+ import { realpathSync } from 'node:fs';
24
+ import { homedir } from 'node:os';
25
+ import { basename, dirname, matchesGlob, parse, relative, sep } from 'node:path';
26
+ import { CRTR_DIR_NAME } from '../../types.js';
27
+ import { pathExists, readText, walkFiles } from '../fs-utils.js';
28
+ import { parseFrontmatterGeneric } from '../frontmatter.js';
29
+ import { evalCondition } from '../predicate.js';
30
+ import { listAllMemoryDocs, listProjectMemoryDocs } from '../memory-resolver.js';
31
+ import { userScopeRoot } from '../scope.js';
32
+ import { displayName } from './ceiling.js';
33
+ import { gatePasses } from './gate.js';
34
+ import { normalizeDocName, parseSubstrateDoc, parseSubstrateFrontmatter, previewLine, resolveDocName } from './schema.js';
35
+ import { cachedSubstrateDocs } from './session-cache.js';
36
+ const JUNK_DIRS = new Set(['node_modules', '.git', 'dist', 'build', '.next', '.cache', '.yalc']);
37
+ function realpathOrSelf(p) {
38
+ try {
39
+ return realpathSync(p);
40
+ }
41
+ catch {
42
+ return p;
43
+ }
44
+ }
45
+ function attr(s) {
46
+ return s
47
+ .replace(/&/g, '&amp;')
48
+ .replace(/"/g, '&quot;')
49
+ .replace(/</g, '&lt;')
50
+ .replace(/>/g, '&gt;');
51
+ }
52
+ function gitRootOf(p) {
53
+ let d = p;
54
+ const root = parse(d).root;
55
+ while (true) {
56
+ if (pathExists(`${d}${sep}.git`))
57
+ return d;
58
+ if (d === root)
59
+ return null;
60
+ const parent = dirname(d);
61
+ if (parent === d)
62
+ return null;
63
+ d = parent;
64
+ }
65
+ }
66
+ function disp(p) {
67
+ const root = gitRootOf(p);
68
+ if (!root)
69
+ return p;
70
+ const rel = relative(root, p);
71
+ return rel === '' ? '.' : rel;
72
+ }
73
+ function isJunkAncestor(dir) {
74
+ return dir.split(sep).some((segment) => JUNK_DIRS.has(segment));
75
+ }
76
+ function owningRootOf(doc) {
77
+ const parts = doc.path.split(sep);
78
+ const idx = parts.lastIndexOf(CRTR_DIR_NAME);
79
+ if (idx <= 0)
80
+ return null;
81
+ return parts.slice(0, idx).join(sep) || sep;
82
+ }
83
+ function loadProjectDoc(file, memoryDir) {
84
+ try {
85
+ const raw = relative(memoryDir, file)
86
+ .replace(/\.md$/i, '')
87
+ .split(sep)
88
+ .join('/');
89
+ const fallbackName = normalizeDocName(raw);
90
+ if (fallbackName === '')
91
+ return null;
92
+ const { data, body } = parseFrontmatterGeneric(readText(file));
93
+ const schema = parseSubstrateFrontmatter(data);
94
+ if (schema === null)
95
+ return null;
96
+ return {
97
+ ...schema,
98
+ name: resolveDocName(data, fallbackName),
99
+ scope: 'project',
100
+ path: file,
101
+ body,
102
+ };
103
+ }
104
+ catch {
105
+ return null;
106
+ }
107
+ }
108
+ function safeWalkMarkdown(dir) {
109
+ try {
110
+ return walkFiles(dir, (name) => name.toLowerCase().endsWith('.md'));
111
+ }
112
+ catch {
113
+ return [];
114
+ }
115
+ }
116
+ /** Project docs from every workspace store enclosing the read file. This is a
117
+ * discovery walk only: each returned doc must still match an explicit trigger. */
118
+ function enclosingProjectDocs(absReadFile) {
119
+ const docs = [];
120
+ const seen = new Set();
121
+ const home = realpathOrSelf(homedir());
122
+ const userRoot = realpathOrSelf(userScopeRoot());
123
+ const fsRoot = parse(absReadFile).root;
124
+ let dir = dirname(absReadFile);
125
+ while (true) {
126
+ if (dir !== home && dir !== userRoot && !isJunkAncestor(dir)) {
127
+ const memoryDir = `${dir}${sep}${CRTR_DIR_NAME}${sep}memory`;
128
+ if (pathExists(memoryDir)) {
129
+ for (const file of safeWalkMarkdown(memoryDir)) {
130
+ const real = realpathOrSelf(file);
131
+ if (seen.has(real))
132
+ continue;
133
+ seen.add(real);
134
+ const doc = loadProjectDoc(file, memoryDir);
135
+ if (doc !== null)
136
+ docs.push(doc);
137
+ }
138
+ }
139
+ }
140
+ if (dir === home || dir === fsRoot)
141
+ break;
142
+ const parent = dirname(dir);
143
+ if (parent === dir)
144
+ break;
145
+ dir = parent;
146
+ }
147
+ return docs;
148
+ }
149
+ function resolvedDocs() {
150
+ try {
151
+ return cachedSubstrateDocs(listAllMemoryDocs, parseSubstrateDoc);
152
+ }
153
+ catch {
154
+ return [];
155
+ }
156
+ }
157
+ function dedupeByPhysicalPath(docs) {
158
+ const seen = new Set();
159
+ const out = [];
160
+ for (const doc of docs) {
161
+ const real = realpathOrSelf(doc.path);
162
+ if (seen.has(real))
163
+ continue;
164
+ seen.add(real);
165
+ out.push(doc);
166
+ }
167
+ return out;
168
+ }
169
+ function globMatches(glob, absReadFile, owningRoot) {
170
+ const targets = [absReadFile, basename(absReadFile)];
171
+ if (owningRoot !== null)
172
+ targets.push(relative(owningRoot, absReadFile));
173
+ return targets.some((target) => {
174
+ try {
175
+ return matchesGlob(target, glob);
176
+ }
177
+ catch {
178
+ return false;
179
+ }
180
+ });
181
+ }
182
+ function readFileFrontmatter(absReadFile) {
183
+ if (!/\.(md|mdx|markdown)$/i.test(absReadFile))
184
+ return {};
185
+ try {
186
+ return parseFrontmatterGeneric(readText(absReadFile)).data ?? {};
187
+ }
188
+ catch {
189
+ return {};
190
+ }
191
+ }
192
+ function matchesReadEvent(doc, absReadFile, readFrontmatter) {
193
+ const pathMatch = doc.appliesTo?.some((glob) => globMatches(glob, absReadFile, owningRootOf(doc))) === true;
194
+ const frontmatterMatch = doc.readWhen !== undefined &&
195
+ Object.keys(readFrontmatter).length > 0 &&
196
+ evalCondition(doc.readWhen, readFrontmatter);
197
+ return pathMatch || frontmatterMatch;
198
+ }
199
+ function envelopeName(doc) {
200
+ const displayed = displayName(doc.name);
201
+ if (displayed !== '')
202
+ return displayed;
203
+ const root = owningRootOf(doc);
204
+ return root === null ? doc.name : basename(root);
205
+ }
206
+ function renderDocEnvelope(doc) {
207
+ const rung = doc.fileReadVisibility;
208
+ if (rung === 'none')
209
+ return null;
210
+ let body = '';
211
+ if (rung === 'content')
212
+ body = doc.body.trim();
213
+ else if (rung === 'preview')
214
+ body = previewLine(doc);
215
+ const attrs = `kind="${attr(doc.kind)}" name="${attr(envelopeName(doc))}" src="${attr(disp(doc.path))}"`;
216
+ return body === '' ? `<memory ${attrs} />` : `<memory ${attrs}>\n${body}\n</memory>`;
217
+ }
218
+ function renderCandidates(subject, docs, seen) {
219
+ const rendered = [];
220
+ for (const doc of docs) {
221
+ const real = realpathOrSelf(doc.path);
222
+ if (seen.has(real))
223
+ continue;
224
+ try {
225
+ if (!gatePasses(doc, subject))
226
+ continue;
227
+ const block = renderDocEnvelope(doc);
228
+ if (block === null)
229
+ continue;
230
+ seen.add(real);
231
+ rendered.push(block);
232
+ }
233
+ catch {
234
+ continue;
235
+ }
236
+ }
237
+ return rendered.length === 0
238
+ ? ''
239
+ : `<auto-loaded-context>\n${rendered.join('\n')}\n</auto-loaded-context>`;
240
+ }
241
+ /** Surface docs matched by a successful read tool call using the caller-supplied
242
+ * daemon snapshot subject. */
243
+ export function renderOnReadDocsForSubject(subject, readFilePath, seen = new Set()) {
244
+ const absReadFile = realpathOrSelf(readFilePath);
245
+ const readFrontmatter = readFileFrontmatter(absReadFile);
246
+ const docs = dedupeByPhysicalPath([...enclosingProjectDocs(absReadFile), ...resolvedDocs()])
247
+ .filter((doc) => realpathOrSelf(doc.path) !== absReadFile)
248
+ .filter((doc) => matchesReadEvent(doc, absReadFile, readFrontmatter));
249
+ return renderCandidates(subject, docs, seen);
250
+ }
251
+ /** Workspace boot docs using the snapshot's cwd/profile instead of a canvas
252
+ * lookup. */
253
+ export function renderWorkspaceOpenDocsForSubject(subject, cwd, profileId) {
254
+ let docs;
255
+ try {
256
+ docs = listProjectMemoryDocs(cwd, profileId)
257
+ .map(parseSubstrateDoc)
258
+ .filter((doc) => doc !== null);
259
+ }
260
+ catch {
261
+ return '';
262
+ }
263
+ docs = dedupeByPhysicalPath(docs)
264
+ .filter((doc) => doc.appliesTo?.some((glob) => glob.trim() === '.') === true)
265
+ .sort((a, b) => {
266
+ const aRoot = owningRootOf(a) ?? '';
267
+ const bRoot = owningRootOf(b) ?? '';
268
+ const depth = aRoot.split(sep).filter(Boolean).length - bRoot.split(sep).filter(Boolean).length;
269
+ return depth || aRoot.localeCompare(bRoot) || a.path.localeCompare(b.path);
270
+ });
271
+ return renderCandidates(subject, docs, new Set());
272
+ }
@@ -458,7 +458,37 @@ function wrap(text, maxWidth) {
458
458
  return out.length > 0 ? out : [''];
459
459
  }
460
460
  // ── Render surface ───────────────────────────────────────────────────────────
461
- const _bodyCache = new Map();
461
+ /** Simple bounded LRU cache: evicts the oldest (first) entry when maxEntries is reached.
462
+ * Preserves Map's insertion-order invariant so iteration order is LRU order. */
463
+ class BoundedLRUCache {
464
+ map = new Map();
465
+ maxEntries;
466
+ constructor(maxEntries) {
467
+ this.maxEntries = maxEntries;
468
+ }
469
+ get(key) {
470
+ if (!this.map.has(key))
471
+ return undefined;
472
+ const value = this.map.get(key);
473
+ // Move to end (most recently used) by delete+re-insert.
474
+ this.map.delete(key);
475
+ this.map.set(key, value);
476
+ return value;
477
+ }
478
+ set(key, value) {
479
+ // Remove if exists to update order.
480
+ if (this.map.has(key)) {
481
+ this.map.delete(key);
482
+ }
483
+ else if (this.map.size >= this.maxEntries) {
484
+ // Evict oldest (first entry in iteration order).
485
+ const firstKey = this.map.keys().next().value;
486
+ this.map.delete(firstKey);
487
+ }
488
+ this.map.set(key, value);
489
+ }
490
+ }
491
+ const _bodyCache = new BoundedLRUCache(20);
462
492
  /** Render markdown to terminal lines via the pinned binary; plaintext fallback. */
463
493
  export function renderMarkdown(md, width) {
464
494
  const key = `${md}\0${width}`;
@@ -618,7 +648,7 @@ function fallbackDocWithMap(md, width) {
618
648
  });
619
649
  return { lines, rows, spans, blocks };
620
650
  }
621
- const _mapCache = new Map();
651
+ const _mapCache = new BoundedLRUCache(20);
622
652
  /** Render markdown with a row→source-line map via the pinned binary
623
653
  * (`doc render --line-map`); plaintext paragraph-block fallback. */
624
654
  export function renderMarkdownWithMap(md, width) {
@@ -1,10 +1,17 @@
1
1
  import type { ScopeConfig } from '../types.js';
2
+ /**
3
+ * Which settings destination owns a preference row. Every settings-surface row
4
+ * must name one, so a new preference cannot be added without deciding where a
5
+ * human finds it.
6
+ */
7
+ export type UserSettingGroup = 'display' | 'panes' | 'updates';
2
8
  export interface UserSettingDefinition<Key extends string = string> {
3
9
  key: Key;
4
10
  label: string;
5
11
  description: string;
6
12
  valueConstraint: string;
7
13
  applies: string;
14
+ group: UserSettingGroup;
8
15
  order: number;
9
16
  format: (config: ScopeConfig) => string;
10
17
  cycle: (config: ScopeConfig, delta: number) => void;
@@ -40,6 +47,7 @@ export declare const CONFIG_SETTINGS_COVERAGE: {
40
47
  description: string;
41
48
  valueConstraint: string;
42
49
  applies: string;
50
+ group: "updates";
43
51
  order: number;
44
52
  format: (config: ScopeConfig) => "notify" | "apply" | "off";
45
53
  cycle: (config: ScopeConfig, delta: number) => void;
@@ -51,6 +59,7 @@ export declare const CONFIG_SETTINGS_COVERAGE: {
51
59
  description: string;
52
60
  valueConstraint: string;
53
61
  applies: string;
62
+ group: "updates";
54
63
  order: number;
55
64
  format: (config: ScopeConfig) => "notify" | "apply" | "off";
56
65
  cycle: (config: ScopeConfig, delta: number) => void;
@@ -62,6 +71,7 @@ export declare const CONFIG_SETTINGS_COVERAGE: {
62
71
  description: string;
63
72
  valueConstraint: string;
64
73
  applies: string;
74
+ group: "updates";
65
75
  order: number;
66
76
  format: (config: ScopeConfig) => string;
67
77
  cycle: (config: ScopeConfig, delta: number) => void;
@@ -77,6 +87,7 @@ export declare const CONFIG_SETTINGS_COVERAGE: {
77
87
  description: string;
78
88
  valueConstraint: string;
79
89
  applies: string;
90
+ group: "panes";
80
91
  order: number;
81
92
  format: (config: ScopeConfig) => string;
82
93
  cycle: (config: ScopeConfig, delta: number) => void;
@@ -91,6 +102,7 @@ export declare const CONFIG_SETTINGS_COVERAGE: {
91
102
  description: string;
92
103
  valueConstraint: string;
93
104
  applies: string;
105
+ group: "panes";
94
106
  order: number;
95
107
  format: (config: ScopeConfig) => "on" | "off";
96
108
  cycle: (config: ScopeConfig) => void;
@@ -109,6 +121,7 @@ export declare const CONFIG_SETTINGS_COVERAGE: {
109
121
  description: string;
110
122
  valueConstraint: string;
111
123
  applies: string;
124
+ group: "display";
112
125
  order: number;
113
126
  format: (config: ScopeConfig) => "on" | "off";
114
127
  cycle: (config: ScopeConfig) => void;
@@ -127,6 +140,7 @@ export declare const CONFIG_SETTINGS_COVERAGE: {
127
140
  description: string;
128
141
  valueConstraint: string;
129
142
  applies: string;
143
+ group: "display";
130
144
  order: number;
131
145
  format: (config: ScopeConfig) => "on" | "off";
132
146
  cycle: (config: ScopeConfig) => void;
@@ -145,6 +159,7 @@ export declare const CONFIG_SETTINGS_COVERAGE: {
145
159
  description: string;
146
160
  valueConstraint: string;
147
161
  applies: string;
162
+ group: "display";
148
163
  order: number;
149
164
  format: (config: ScopeConfig) => "on" | "off" | "follow tmux";
150
165
  cycle: (config: ScopeConfig, delta: number) => void;
@@ -159,6 +174,7 @@ export declare const CONFIG_SETTINGS_COVERAGE: {
159
174
  description: string;
160
175
  valueConstraint: string;
161
176
  applies: string;
177
+ group: "display";
162
178
  order: number;
163
179
  format: (config: ScopeConfig) => string;
164
180
  cycle: (config: ScopeConfig, delta: number) => void;
@@ -173,6 +189,7 @@ export declare const CONFIG_SETTINGS_COVERAGE: {
173
189
  description: string;
174
190
  valueConstraint: string;
175
191
  applies: string;
192
+ group: "display";
176
193
  order: number;
177
194
  format: (config: ScopeConfig) => "user" | "none" | "agent" | "both";
178
195
  cycle: (config: ScopeConfig, delta: number) => void;
@@ -187,6 +204,7 @@ export declare const CONFIG_SETTINGS_COVERAGE: {
187
204
  description: string;
188
205
  valueConstraint: string;
189
206
  applies: string;
207
+ group: "display";
190
208
  order: number;
191
209
  format: (config: ScopeConfig) => "on" | "off";
192
210
  cycle: (config: ScopeConfig) => void;
@@ -201,6 +219,7 @@ export declare const CONFIG_SETTINGS_COVERAGE: {
201
219
  description: string;
202
220
  valueConstraint: string;
203
221
  applies: string;
222
+ group: "display";
204
223
  order: number;
205
224
  format: (config: ScopeConfig) => "on" | "off";
206
225
  cycle: (config: ScopeConfig) => void;
@@ -215,6 +234,7 @@ export declare const CONFIG_SETTINGS_COVERAGE: {
215
234
  description: string;
216
235
  valueConstraint: string;
217
236
  applies: string;
237
+ group: "display";
218
238
  order: number;
219
239
  format: (config: ScopeConfig) => "on" | "off";
220
240
  cycle: (config: ScopeConfig) => void;
@@ -256,6 +276,8 @@ export declare const CONFIG_SETTINGS_COVERAGE: {
256
276
  };
257
277
  /** The exhaustive top-level key list used by config persistence and help. */
258
278
  export declare const SCOPE_CONFIG_KEYS: (keyof ScopeConfig)[];
259
- /** The single row registry shared by `sys setup` and `sys config set`. */
279
+ /** The single row registry shared by `sys settings` and `sys config set`. */
260
280
  export declare const USER_SETTINGS: readonly UserSettingDefinition[];
261
281
  export declare function findUserSetting(key: string): UserSettingDefinition | undefined;
282
+ /** The rows one settings destination owns, in registry order. */
283
+ export declare function userSettingsInGroup(group: UserSettingGroup): readonly UserSettingDefinition[];