@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
@@ -2,8 +2,8 @@
2
2
  // relay-token-authed `/__crtr/source` transport (see `remote-transport.ts`).
3
3
  // Every method shells out to an EXISTING `crtr --json <subcommand>` in-guest —
4
4
  // no new in-guest command, no remote SQLite read, no drive-plane verb. A
5
- // short-TTL cache coalesces the fan-out a single browse/inspect frame would
6
- // otherwise make into the same node.
5
+ // short-TTL cache coalesces the repeated reads a single remote inspection or
6
+ // dashboard render would otherwise make for the same node.
7
7
  //
8
8
  // P2 DEFERRAL (Stage-C, plan C-1/C-5): this remote path still targets the
9
9
  // `/__crtr/source` in-guest fulfillment endpoint on a preview host, NOT the
@@ -45,7 +45,7 @@ function isValidShowResponse(x) {
45
45
  if (!isPlainObject(paths) ||
46
46
  typeof paths['context_dir'] !== 'string' ||
47
47
  typeof paths['reports_dir'] !== 'string' ||
48
- (paths['session_file'] !== null && typeof paths['session_file'] !== 'string'))
48
+ ('session_file' in paths && paths['session_file'] !== null && typeof paths['session_file'] !== 'string'))
49
49
  return false;
50
50
  if (typeof x['follow_up'] !== 'string')
51
51
  return false;
@@ -54,7 +54,7 @@ function isValidShowResponse(x) {
54
54
  /** A `reports`/`managers` entry (`RemoteShowResponse`) — validated per-element
55
55
  * because `isValidShowResponse` only checks the array wrapper. Without this,
56
56
  * a malformed neighbor (`null`, `{}`) survives into `subscriptionsOf`/
57
- * `subscribersOf`'s `.map()` and node.ts's remote `show` passthrough render,
57
+ * `subscribersOf`'s `.map()` and `node/inspect.ts`'s remote `show` passthrough render,
58
58
  * both of which dereference `.node_id`/`.active` unguarded. */
59
59
  function isValidNeighborEntry(x) {
60
60
  return (isPlainObject(x) &&
@@ -67,8 +67,8 @@ function isValidNeighborEntry(x) {
67
67
  /** A `NodeRow` element from `node inspect list`'s `nodes` array — validated
68
68
  * per-element because a remote success payload can be `{nodes:[null]}` (the
69
69
  * outer array check alone lets that through). Requires the string identity/
70
- * lifecycle fields browse's tree-building code dereferences unguarded
71
- * (`browse/app.ts`'s `rebuildSnapshot`); the remaining nullable runtime
70
+ * lifecycle fields local/API-backed row renderers dereference unguarded;
71
+ * the remaining nullable runtime
72
72
  * fields (host_kind, parent, pi_pid, ...) are left to cast through as-is. */
73
73
  function isValidNodeRow(x) {
74
74
  if (!isPlainObject(x))
@@ -94,13 +94,6 @@ export class RemoteCanvasSource {
94
94
  this.relayToken = relayToken;
95
95
  this.exec = createRemoteExec(previewEndpoint, relayToken);
96
96
  }
97
- /** Drops every cached entry — called on a `RemoteEventStream` `'nodes'` (or
98
- * `'inbox'`) event so the next read re-fetches fresh state. */
99
- invalidate() {
100
- this.nodeCache.clear();
101
- this.rosterCache.clear();
102
- this.viewCache.clear();
103
- }
104
97
  async execJson(args) {
105
98
  let raw;
106
99
  try {
@@ -127,7 +120,7 @@ export class RemoteCanvasSource {
127
120
  const raw = await this.execJson(['node', 'inspect', 'show', id]);
128
121
  // Sanitize reports/managers elements here (not just the outer array shape)
129
122
  // so both consumers — subscriptionsOf/subscribersOf's `.map()` below AND
130
- // node.ts's remote `show` passthrough render — see only well-formed
123
+ // node/inspect.ts's remote `show` passthrough render — see only well-formed
131
124
  // neighbor entries, never a malformed one they'd dereference unguarded.
132
125
  const res = isValidShowResponse(raw)
133
126
  ? { ...raw, reports: raw.reports.filter(isValidNeighborEntry), managers: raw.managers.filter(isValidNeighborEntry) }
@@ -136,7 +129,7 @@ export class RemoteCanvasSource {
136
129
  return res;
137
130
  }
138
131
  /** The full passthrough object `node inspect show` produces — used by
139
- * `nodeShow`'s remote branch (`src/commands/node.ts`) to return the exact
132
+ * `nodeShow`'s remote branch (`src/commands/node/inspect.ts`) to return the exact
140
133
  * same shape a local read would, without re-deriving it. */
141
134
  async rawShow(id) {
142
135
  return this.fetchShow(id);
@@ -18,18 +18,25 @@ import { resolve } from 'node:path';
18
18
  // ---------------------------------------------------------------------------
19
19
  // Factory functions
20
20
  // ---------------------------------------------------------------------------
21
+ function freezeCommandMetadata(value) {
22
+ if (value === null || typeof value !== 'object' || Object.isFrozen(value))
23
+ return value;
24
+ for (const child of Object.values(value))
25
+ freezeCommandMetadata(child);
26
+ return Object.freeze(value);
27
+ }
21
28
  export function defineLeaf(opts) {
22
- return {
29
+ return Object.freeze({
23
30
  kind: 'leaf',
24
31
  name: opts.name,
25
32
  description: opts.description,
26
33
  whenToUse: opts.whenToUse,
27
34
  tier: opts.tier,
28
- help: opts.help,
29
- slash: opts.slash,
35
+ help: freezeCommandMetadata(opts.help),
36
+ slash: opts.slash === undefined ? undefined : freezeCommandMetadata(opts.slash),
30
37
  run: opts.run,
31
38
  render: opts.render,
32
- };
39
+ });
33
40
  }
34
41
  /** Number of a node's own non-hidden subcommands (direct children). Leaves and
35
42
  * childless branches return 0. */
@@ -452,7 +452,9 @@ function mergeConfig(partial) {
452
452
  : defaults.auto_open_child_viewers;
453
453
  const brokerThresholds = mergeBrokerThresholds(partial.brokerThresholds, defaults.brokerThresholds);
454
454
  const completion_bell = typeof partial.completion_bell === 'boolean' ? partial.completion_bell : defaults.completion_bell;
455
- const working_gerunds = normalizeWorkingGerunds(partial.working_gerunds);
455
+ const working_gerunds = partial.working_gerunds === undefined
456
+ ? [...defaults.working_gerunds]
457
+ : normalizeWorkingGerunds(partial.working_gerunds);
456
458
  const whip_mode = typeof partial.whip_mode === 'boolean' ? partial.whip_mode : defaults.whip_mode;
457
459
  const whip_messages = normalizeWhipMessages(partial.whip_messages);
458
460
  const mouse_mode_default = MOUSE_MODE_DEFAULTS.includes(partial.mouse_mode_default)
@@ -2,7 +2,7 @@ import { errorClassCodes, eventErrorFromUnknown } from './errors.js';
2
2
  import { generateOperationId, operationIdContext, validateOperationId } from './operation-id.js';
3
3
  const eventName = /^[a-z][a-z0-9]*(?:[._][a-z0-9]+)*$/;
4
4
  const levels = new Set(['error', 'warn', 'info', 'debug']);
5
- const components = new Set(['daemon', 'broker', 'web', 'control-plane', 'front', 'sentinel']);
5
+ const components = new Set(['daemon', 'broker', 'control-plane', 'front', 'sentinel']);
6
6
  const outcomes = new Set(['succeeded', 'failed', 'skipped']);
7
7
  const dispositions = new Set(['auto', 'manual', 'fatal']);
8
8
  const classes = new Set(errorClassCodes);
@@ -9,7 +9,6 @@ const MAX_CANONICAL_SOURCE_BYTES = 6 * 1024 * 1024;
9
9
  const MAX_RAW_SOURCE_BYTES = 256 * 1024;
10
10
  const MAX_CANONICAL_CONTENT_BYTES = MAX_EVENT_RECORD_BYTES - 1;
11
11
  const NO_FOLLOW_FLAG = typeof constants.O_NOFOLLOW === 'number' ? constants.O_NOFOLLOW : 0;
12
- const WEB_BASENAME = /^web\.([0-9a-f]{16})\.log\.jsonl(?:\.([12]))?$/;
13
12
  const EVENT_NAME = /^[a-z][a-z0-9]*(?:[._][a-z0-9]+)*$/;
14
13
  const CANONICAL_TIMESTAMP = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/;
15
14
  const ISO_TIMESTAMP = /^\d{4}-\d{2}-\d{2}T/;
@@ -36,7 +35,7 @@ const TOP_LEVEL_KEYS = new Set([
36
35
  'dropped_fields_count',
37
36
  ]);
38
37
  const LEVELS = new Set(['debug', 'info', 'warn', 'error']);
39
- const COMPONENTS = new Set(['daemon', 'broker', 'web']);
38
+ const COMPONENTS = new Set(['daemon', 'broker']);
40
39
  const OUTCOMES = new Set(['succeeded', 'failed', 'skipped']);
41
40
  const RETRY_DISPOSITIONS = new Set(['auto', 'manual', 'fatal']);
42
41
  const ERROR_CLASSES = new Set(errorClassCodes);
@@ -167,7 +166,7 @@ function forEachDirectoryEntry(proof, consume) {
167
166
  const entry = directory.readSync();
168
167
  if (entry === null)
169
168
  break;
170
- consume(entry.name);
169
+ consume(entry.name, entry.isDirectory());
171
170
  }
172
171
  }
173
172
  finally {
@@ -575,22 +574,6 @@ export function readLogSnapshot(query, includeRaw) {
575
574
  if (rawCompatible)
576
575
  scanRawSource(state, home, rootChain, join(home, 'crtrd.err'), 'daemon');
577
576
  }
578
- if (selected(normalized, 'web')) {
579
- forEachDirectoryEntry(root, (name) => {
580
- const match = WEB_BASENAME.exec(name);
581
- if (match === null)
582
- return;
583
- const streamId = match[1];
584
- const generation = (match[2] === undefined ? 0 : Number(match[2]));
585
- scanCanonicalSource(state, home, rootChain, {
586
- component: 'web',
587
- streamKey: `web:${streamId}`,
588
- activeAbsolute: join(home, `web.${streamId}.log.jsonl`),
589
- generation,
590
- boundStreamId: streamId,
591
- });
592
- });
593
- }
594
577
  const canonicalBroker = selected(normalized, 'broker');
595
578
  const rawBroker = rawCompatible && selected(normalized, 'broker');
596
579
  if (canonicalBroker || rawBroker) {
@@ -602,8 +585,11 @@ export function readLogSnapshot(query, includeRaw) {
602
585
  scanBrokerNode(state, home, parents, normalized.nodeId, canonicalBroker, rawBroker);
603
586
  }
604
587
  else {
605
- forEachDirectoryEntry(nodes, (nodeId) => {
606
- if (isSafeNodeId(nodeId))
588
+ forEachDirectoryEntry(nodes, (nodeId, isDirectory) => {
589
+ // The node root may contain ordinary filesystem metadata such as
590
+ // .DS_Store. Only a directory can be a node; proveDirectory still
591
+ // revalidates it to reject a replacement or symlink race.
592
+ if (isDirectory && isSafeNodeId(nodeId))
607
593
  scanBrokerNode(state, home, parents, nodeId, canonicalBroker, rawBroker);
608
594
  });
609
595
  }
@@ -7,8 +7,6 @@ export interface BoundEventSource {
7
7
  }
8
8
  export declare function bindDaemonEventSource(): void;
9
9
  export declare function bindBrokerEventSource(nodeId: string): void;
10
- export declare function webStreamId(host: string, port: number): string;
11
- export declare function bindWebEventSource(host: string, port: number): void;
12
10
  export declare function eventSource(): BoundEventSource | undefined;
13
11
  /** Test-only: clear the process-global binding. A single test process can
14
12
  * legitimately play several components in sequence (an in-process revive binds
@@ -1,4 +1,3 @@
1
- import { createHash } from 'node:crypto';
2
1
  import { join } from 'node:path';
3
2
  import { crtrHome, isSafeNodeId, jobDir } from '../canvas/paths.js';
4
3
  let bound;
@@ -21,21 +20,6 @@ export function bindBrokerEventSource(nodeId) {
21
20
  throw new TypeError('node_id must be a non-empty path segment of at most 128 UTF-8 bytes');
22
21
  bind({ component: 'broker', node_id: nodeId, path: join(jobDir(nodeId), 'log.jsonl') });
23
22
  }
24
- function normalizeHost(host) {
25
- const unbracketed = host.trim().toLowerCase().replace(/^\[|\]$/g, '');
26
- if (unbracketed === '' || unbracketed === '0.0.0.0' || unbracketed === '::')
27
- return 'localhost';
28
- return unbracketed;
29
- }
30
- export function webStreamId(host, port) {
31
- if (!Number.isInteger(port) || port < 0 || port > 65_535)
32
- throw new TypeError('web port is invalid');
33
- return createHash('sha256').update(`${normalizeHost(host)}\0${port}`).digest('hex').slice(0, 16);
34
- }
35
- export function bindWebEventSource(host, port) {
36
- const stream_id = webStreamId(host, port);
37
- bind({ component: 'web', stream_id, path: join(crtrHome(), `web.${stream_id}.log.jsonl`) });
38
- }
39
23
  export function eventSource() { return bound; }
40
24
  /** Test-only: clear the process-global binding. A single test process can
41
25
  * legitimately play several components in sequence (an in-process revive binds
@@ -1,5 +1,5 @@
1
1
  export type EventLevel = 'error' | 'warn' | 'info' | 'debug';
2
- export type EventComponent = 'daemon' | 'broker' | 'web' | 'control-plane' | 'front' | 'sentinel';
2
+ export type EventComponent = 'daemon' | 'broker' | 'control-plane' | 'front' | 'sentinel';
3
3
  export type EventOutcome = 'succeeded' | 'failed' | 'skipped';
4
4
  export type RetryDisposition = 'auto' | 'manual' | 'fatal';
5
5
  export type OperationId = string & {
@@ -1,5 +1,5 @@
1
1
  import type { ErrorClass, OperationId } from './events/types.js';
2
- export type FaultLink = 'pi→provider' | 'viewer↔broker' | 'relay↔broker' | 'browser↔relay' | 'cli→exa' | 'daemon→node' | 'crtr→pi';
2
+ export type FaultLink = 'pi→provider' | 'viewer↔broker' | 'relay↔broker' | 'viewer↔crtrd' | 'cli→exa' | 'daemon→node' | 'crtr→pi';
3
3
  export type FaultKind = 'rate-limit' | 'overloaded' | 'connection' | 'auth' | 'protocol' | 'context-overflow' | 'other' | 'wedged' | 'model-not-found';
4
4
  export type FaultRetryDisposition = 'auto' | 'manual' | 'fatal';
5
5
  export type FaultRetryOwner = 'sdk' | 'daemon' | 'client';
@@ -1,14 +1,3 @@
1
1
  import { type InboxEntry, type InboxEntryInput } from './inbox.js';
2
2
  /** Atomically append one finalized entry to `nodes/<nodeId>/passive.jsonl`. */
3
3
  export declare function appendPassive(nodeId: string, entry: InboxEntryInput): InboxEntry;
4
- /** Return every accumulated passive entry (oldest first) without clearing. */
5
- export declare function readPassive(nodeId: string): InboxEntry[];
6
- /**
7
- * Read AND clear the accumulator in one shot — the drain-on-message primitive.
8
- *
9
- * We rename the file aside before reading so a concurrent `appendPassive` (a
10
- * publisher pushing at the same instant) starts a fresh file and is never lost
11
- * to the truncate: at worst it lands in the next drain. The renamed snapshot is
12
- * removed after a successful read. Returns the drained entries (oldest first).
13
- */
14
- export declare function drainPassive(nodeId: string): InboxEntry[];
@@ -13,7 +13,7 @@
13
13
  //
14
14
  // Same entry shape as the inbox (InboxEntry) so the two stores stay symmetric
15
15
  // and a passive edge can be flipped active without reshaping data.
16
- import { appendFileSync, existsSync, readFileSync, renameSync, rmSync, mkdirSync, } from 'node:fs';
16
+ import { appendFileSync, existsSync, mkdirSync } from 'node:fs';
17
17
  import { dirname } from 'node:path';
18
18
  import { passivePath } from '../canvas/index.js';
19
19
  import { emitEvent } from '../events/emit.js';
@@ -51,64 +51,3 @@ function emitPassiveAppendFailure(nodeId, entry, error) {
51
51
  // Event emission is observational; the original append failure remains authoritative.
52
52
  }
53
53
  }
54
- /**
55
- * Parse jsonl text into entries, tolerating corruption: each line is parsed on
56
- * its own and a single malformed line is SKIPPED, never the whole feed. The
57
- * drain path renames + deletes its snapshot, so a non-tolerant parse here would
58
- * silently discard every accumulated entry the moment one bad line appears.
59
- */
60
- function parseEntries(text) {
61
- const entries = [];
62
- for (const line of text.split('\n')) {
63
- if (line.trim() === '')
64
- continue;
65
- try {
66
- entries.push(JSON.parse(line));
67
- }
68
- catch {
69
- // Skip only the corrupt line — the rest of the feed survives.
70
- }
71
- }
72
- return entries;
73
- }
74
- /** Return every accumulated passive entry (oldest first) without clearing. */
75
- export function readPassive(nodeId) {
76
- const p = passivePath(nodeId);
77
- if (!existsSync(p))
78
- return [];
79
- return parseEntries(readFileSync(p, 'utf8'));
80
- }
81
- /**
82
- * Read AND clear the accumulator in one shot — the drain-on-message primitive.
83
- *
84
- * We rename the file aside before reading so a concurrent `appendPassive` (a
85
- * publisher pushing at the same instant) starts a fresh file and is never lost
86
- * to the truncate: at worst it lands in the next drain. The renamed snapshot is
87
- * removed after a successful read. Returns the drained entries (oldest first).
88
- */
89
- export function drainPassive(nodeId) {
90
- const p = passivePath(nodeId);
91
- if (!existsSync(p))
92
- return [];
93
- const snapshot = `${p}.draining`;
94
- try {
95
- renameSync(p, snapshot);
96
- }
97
- catch {
98
- // Lost the race (file vanished) — nothing to drain.
99
- return [];
100
- }
101
- // Parse with the tolerant per-line parser BEFORE removing the snapshot, so a
102
- // single corrupt line can never discard the whole accumulated feed.
103
- let entries = [];
104
- try {
105
- entries = parseEntries(readFileSync(snapshot, 'utf8'));
106
- }
107
- finally {
108
- try {
109
- rmSync(snapshot, { force: true });
110
- }
111
- catch { /* best-effort cleanup */ }
112
- }
113
- return entries;
114
- }
@@ -3,12 +3,12 @@ import { existsSync, mkdirSync, mkdtempSync, readFileSync, realpathSync, rmSync,
3
3
  import { spawn } from 'node:child_process';
4
4
  import { tmpdir } from 'node:os';
5
5
  import { join } from 'node:path';
6
- import { submitDeck, submitReview, completeDeck, cancelTicket, readTicketResult } from '../tickets.js';
7
- import { claimTicket } from '../claim.js';
8
- import { scanInbox } from '../scan.js';
9
- import { atomicWriteJson, progressPath, responsePath } from '../convention.js';
10
- import { validateDeck } from '../deck-schema.js';
11
- import { ticketDir } from '../root.js';
6
+ import { submitDeck, submitReview, completeDeck, cancelTicket, readTicketResult } from '../../tickets.js';
7
+ import { claimTicket } from '../../claim.js';
8
+ import { scanInbox } from '../../scan.js';
9
+ import { atomicWriteJson, progressPath, responsePath } from '../../convention.js';
10
+ import { validateDeck } from '../../deck-schema.js';
11
+ import { ticketDir } from '../../root.js';
12
12
  const temp = mkdtempSync(join(tmpdir(), 'crtr-inbox-core-'));
13
13
  process.env['CRTR_HOME'] = temp;
14
14
  const source = join(temp, 'source.md');
@@ -3,7 +3,7 @@ import assert from 'node:assert/strict';
3
3
  import { mkdtempSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
4
4
  import { tmpdir } from 'node:os';
5
5
  import { join } from 'node:path';
6
- import { ATTACH_CONTROL_BINDINGS, BINDING_CATALOG, KeybindingConcurrentEditError, KeybindingValidationError, SAFETY_REQUIREMENTS, canonicalTerminalStroke, formatStroke, matchesTerminalInput, normalizeGesture, normalizeSparseOverrides, persistUserKeybindings, resolveKeybindings, resolveUserKeybindings, } from '../index.js';
6
+ import { KeybindingConcurrentEditError, KeybindingValidationError, canonicalTerminalStroke, matchesTerminalInput, normalizeSparseOverrides, persistUserKeybindings, resolveKeybindings, resolveUserKeybindings, } from '../index.js';
7
7
  import { readConfig } from '../../config.js';
8
8
  const typeCheckedBindingId = 'crtr.graph.down';
9
9
  // @ts-expect-error The catalog type rejects IDs that are not built in.
@@ -13,50 +13,6 @@ const rejectedAttachGlobalId = 'crtr.tmux.menu-global.attach';
13
13
  void typeCheckedBindingId;
14
14
  void rejectedBindingId;
15
15
  void rejectedAttachGlobalId;
16
- function ids(prefix, actions) {
17
- return actions.map((action) => `${prefix}.${action}`);
18
- }
19
- function pairedMenuIds(actions) {
20
- return actions.flatMap((action) => [`crtr.tmux.menu.${action}`, `crtr.tmux.menu-global.${action}`]);
21
- }
22
- function pairedAttachIds(pairs) {
23
- return pairs.flatMap(([menuAction, directId]) => [`crtr.tmux.menu.attach.${menuAction}`, directId]);
24
- }
25
- const REQUIRED_IDS = [
26
- 'crtr.tmux.menu.open',
27
- 'crtr.tmux.menu.attach',
28
- ...pairedMenuIds(['promote', 'resume', 'fork', 'demote', 'detach', 'close-subtree', 'background-bash', 'file-review', 'pin', 'show', 'view-settings', 'fold-tools', 'metadata', 'context', 'providers', 'graph', 'focus-manager', 'copy-id', 'reload-viewer', 'recap', 'issues', 'issue.idea', 'issue.bug']),
29
- ...ids('crtr.tmux.node', ['next', 'previous']),
30
- 'crtr.tmux.inbox.toggle',
31
- ...pairedAttachIds([
32
- ['detach', 'crtr.attach.detach'],
33
- ['clear-or-detach', 'crtr.attach.clear-or-detach'],
34
- ['graph.toggle', 'crtr.attach.graph.toggle'],
35
- ['help.toggle', 'crtr.attach.help.toggle'],
36
- ['inbox.toggle', 'crtr.attach.inbox.toggle'],
37
- ['model-ladder.next', 'crtr.attach.model-ladder.next'],
38
- ['model-ladder.previous', 'crtr.attach.model-ladder.previous'],
39
- ['command.inspect', 'crtr.attach.command.inspect'],
40
- ['file-review', 'crtr.attach.file-review'],
41
- ['profile-files', 'crtr.attach.profile-files'],
42
- ['whip', 'crtr.attach.whip'],
43
- ]),
44
- ...ids('crtr.attach.scroll', ['up', 'down', 'page-up', 'page-down', 'live']),
45
- 'crtr.attach.mouse.toggle',
46
- 'crtr.attach.copy.message',
47
- ...ids('crtr.graph', ['down', 'up', 'first', 'last', 'collapse-or-manager', 'expand-or-child', 'focus', 'revive', 'focus-manager', 'close-subtree', 'dismiss']),
48
- ...ids('crtr.graph.confirm', ['accept', 'cancel']),
49
- ...ids('crtr.inspector', ['force-quit', 'down', 'up', 'section-next', 'section-prev', 'page-down', 'page-up', 'toggle-detail', 'cancel-item', 'open-log', 'confirm', 'dismiss', 'retarget', 'refresh', 'quit']),
50
- ...ids('crtr.browse', ['quit', 'down', 'up', 'first', 'last', 'expand-or-child', 'collapse-or-parent', 'toggle-fold', 'tab-next', 'tab-previous', 'tab.1', 'tab.2', 'tab.3', 'tab.4', 'tab.5', 'close-subtree', 'confirm-close', 'sort', 'scope', 'profile', 'residents', 'preview', 'search', 'revive-now', 'focus', 'focus-background']),
51
- ...ids('crtr.browse.search', ['cancel', 'commit', 'delete', 'quit']),
52
- ...ids('crtr.profile.menu', ['up', 'down', 'select', 'accept-default', 'abort', 'slot.1', 'slot.2', 'slot.3', 'slot.4', 'slot.5', 'slot.6', 'slot.7', 'slot.8', 'slot.9', 'create', 'search-existing', 'use-root', 'set-default', 'add-directory', 'unpin']),
53
- ...ids('crtr.profile.search', ['up', 'down', 'pick', 'back', 'delete', 'abort']),
54
- ...ids('crtr.setup', ['cancel', 'tab-next', 'tab-previous', 'open', 'list-down', 'list-up', 'toggle', 'details', 'advance']),
55
- ...ids('crtr.setup.confirm', ['accept', 'back']),
56
- ...ids('crtr.setup.keybindings', ['edit', 'commit-edit', 'cancel-edit', 'unbind', 'reset-row', 'reset-all', 'save', 'discard', 'page-up', 'page-down', 'filter', 'filter-delete', 'filter-clear']),
57
- ...ids('crtr.setup', ['cell-previous', 'cell-next']),
58
- ...ids('crtr.setup.models', ['open', 'scope-next', 'commit', 'cancel']),
59
- ];
60
16
  let home;
61
17
  let realHome;
62
18
  let realCwd;
@@ -77,57 +33,6 @@ after(() => {
77
33
  process.env['HOME'] = realHome;
78
34
  });
79
35
  test.afterEach(() => rmSync(home, { recursive: true, force: true }));
80
- test('catalog is closed, complete, ordered, and has valid collision-free defaults', () => {
81
- const actualIds = BINDING_CATALOG.map((definition) => definition.id);
82
- assert.deepEqual(actualIds, REQUIRED_IDS);
83
- assert.equal(actualIds.length, REQUIRED_IDS.length);
84
- assert.equal(new Set(actualIds).size, actualIds.length);
85
- for (const definition of BINDING_CATALOG) {
86
- assert.match(definition.id, /^crtr\.[a-z0-9.-]+$/);
87
- assert.ok(definition.name.length > 0);
88
- assert.ok(definition.description.length > 0);
89
- assert.ok(definition.contexts.length > 0);
90
- for (const gesture of definition.defaults)
91
- assert.equal(normalizeGesture(gesture, definition), gesture);
92
- }
93
- const byId = new Map(BINDING_CATALOG.map((definition) => [definition.id, definition]));
94
- for (const definition of BINDING_CATALOG) {
95
- if (definition.pair === undefined)
96
- continue;
97
- const paired = byId.get(definition.pair.pairedId);
98
- assert.equal(paired?.pair?.pairedId, definition.id, `${definition.id} must have a reciprocal pair`);
99
- assert.notEqual(paired?.pair?.field, definition.pair.field, `${definition.id} pair fields must differ`);
100
- assert.ok(definition.pair.field === 'menu' || paired?.pair?.field === 'menu', `${definition.id} must pair with a menu selector`);
101
- }
102
- for (const { menuId, actionId } of ATTACH_CONTROL_BINDINGS) {
103
- assert.equal(byId.get(menuId)?.pair?.field, 'menu');
104
- assert.equal(byId.get(menuId)?.pair?.pairedId, actionId);
105
- assert.equal(byId.get(actionId)?.pair?.field, 'direct');
106
- assert.equal(byId.get(actionId)?.pair?.pairedId, menuId);
107
- }
108
- const resolved = resolveKeybindings();
109
- assert.equal(resolved.bindings.size, BINDING_CATALOG.length);
110
- assert.deepEqual(resolved.diagnostics, []);
111
- assert.ok(SAFETY_REQUIREMENTS.length > 0);
112
- });
113
- test('normalizes aliases, modifier order, uppercase printables, sequences, and duplicate gestures', () => {
114
- assert.equal(normalizeGesture('M-C-X'), 'ctrl+alt+shift+x');
115
- assert.equal(normalizeGesture('alt+ctrl+x'), 'ctrl+alt+x');
116
- assert.equal(normalizeGesture('return'), 'enter');
117
- assert.equal(normalizeGesture('esc'), 'escape');
118
- assert.equal(normalizeGesture('meta+j'), 'alt+j');
119
- assert.equal(normalizeGesture('+'), '+');
120
- assert.equal(normalizeGesture('ctrl++'), 'ctrl++');
121
- assert.equal(normalizeGesture('alt+>'), 'alt+>');
122
- assert.equal(formatStroke('ctrl++'), 'Ctrl++');
123
- assert.equal(canonicalTerminalStroke({ input: '+', ctrl: true }), 'ctrl++');
124
- const resolved = resolveKeybindings({
125
- 'crtr.attach.graph.toggle': ['M-X', 'alt+x'],
126
- 'crtr.tmux.menu.promote': ['space'],
127
- });
128
- assert.deepEqual(resolved.gestures('crtr.attach.graph.toggle'), ['alt+shift+x', 'alt+x']);
129
- assert.deepEqual(resolved.gestures('crtr.tmux.menu.promote'), ['space']);
130
- });
131
36
  test('terminal literal space matches named space bindings', () => {
132
37
  const raw = { input: ' ' };
133
38
  assert.equal(canonicalTerminalStroke(raw), 'space');
@@ -3,10 +3,9 @@ import { resolveUserKeybindings } from './resolve.js';
3
3
  const MENU_OPEN = 'crtr.tmux.menu.open';
4
4
  const BACKGROUND_BASH = 'crtr.tmux.menu.background-bash';
5
5
  /** The tmux menu's own shift-aware selector rendering (bare key -> itself,
6
- * shift+letter -> uppercase, shift+space -> a literal space) — duplicated
7
- * from the private `menuSelector` in `runtime/tmux.ts` rather than imported,
8
- * since tmux.ts already pulls this module in transitively via
9
- * `keybindings/index.ts` and importing back would cycle. */
6
+ * shift+letter -> uppercase, shift+space -> a literal space) stays local
7
+ * because `runtime/tmux-bindings.ts` consumes this module through
8
+ * `keybindings/index.ts`; importing its private selector here would cycle. */
10
9
  function selectorLabel(stroke) {
11
10
  const parts = stroke.split('+');
12
11
  const key = parts.at(-1);
@@ -73,7 +73,7 @@ export const BINDING_CATALOG = Object.freeze([
73
73
  ...attachEntry('crtr.tmux.menu.attach.model-ladder.previous', 'crtr.attach.model-ladder.previous', 'Previous model', 'Move to the previous model ladder rung.', ['['], ['alt+shift+m']),
74
74
  ...attachEntry('crtr.tmux.menu.attach.command.inspect', 'crtr.attach.command.inspect', 'Inspect loaded command', 'Open the loaded slash command’s expanded prompt.', ['h'], ['alt+shift+h']),
75
75
  ...attachEntry('crtr.tmux.menu.attach.file-review', 'crtr.attach.file-review', 'Review a file', 'Open a line-anchored review of a file named in the transcript.', [], ['alt+shift+r']),
76
- ...attachEntry('crtr.tmux.menu.attach.profile-files', 'crtr.attach.profile-files', 'Search profile files', 'Search files across the node’s profile projects, cwd, and ancestor crouter memory stores.', ['f'], []),
76
+ ...attachEntry('crtr.tmux.menu.attach.profile-files', 'crtr.attach.profile-files', 'Search profile files', 'Search files across the node’s profile projects, profile memory, cwd, and ancestor crouter memory stores.', ['f'], ['ctrl+f']),
77
77
  ...attachEntry('crtr.tmux.menu.attach.whip', 'crtr.attach.whip', 'Whip agent', 'Interrupt the agent and send a playful command.', ['w'], []),
78
78
  b('crtr.attach.scroll.up', 'Attach', 'Scroll up', 'Scroll the transcript one line up.', ['shift+up'], 'terminal', ATTACH_CONTEXTS),
79
79
  b('crtr.attach.scroll.down', 'Attach', 'Scroll down', 'Scroll the transcript one line down.', ['shift+down'], 'terminal', ATTACH_CONTEXTS),
@@ -1,7 +1,7 @@
1
1
  // inline-ref-grammar.ts — the single source of truth for the inline
2
- // memory-reference token grammar (spec §4.1). Zero imports, pure string ops,
3
- // browser-safe: the broker, terminal attach viewer, and web composer all import
4
- // this module directly rather than each re-implementing `[A-Za-z0-9_:-]`,
2
+ // memory-reference token grammar (spec §4.1). The broker and terminal attach
3
+ // viewer import these zero-dependency string operations directly rather than
4
+ // each re-implementing `[A-Za-z0-9_:-]`,
5
5
  // trimming, boundary detection, or `:` decoding. Divergence between the
6
6
  // viewer's highlight rule and the broker's resolution rule would let a
7
7
  // highlighted token yield no guidance (or vice versa) — see the spec and
@@ -81,29 +81,15 @@ export declare function listProjectMemoryDocs(startDir?: string, profileId?: str
81
81
  * native docs are emitted before enabled-plugin docs, so native wins on the
82
82
  * caller's first-wins dedup. */
83
83
  export declare function listAllMemoryDocs(scope?: MemoryScope, quiet?: boolean): MemoryDoc[];
84
- /**
85
- * Resolve a memory document name to a single memory document.
86
- *
87
- * Accepted identifier forms:
88
- * <name> — bare name; resolved by scope precedence project>user>builtin
89
- * <scope>/<name> — pinned to one scope (user|project)
90
- * `<name>` may carry topical subdirs (`taste/foo`); a bare leaf (`foo`) falls
91
- * back to a last-segment match within the resolved scopes.
92
- *
93
- * Strong matches resolve before fallback matches. The first pass visits every
94
- * source nearest-first and checks, within each source: (1) exact substrate
95
- * identity (`doc.name === query` — the explicit frontmatter `name`, else its
96
- * normalized path-derived fallback, the SAME identity `listAllMemoryDocs`
97
- * reports); then (2) direct `memory/<name>.md` physical-path lookup (the
98
- * bare-dir → INDEX.md and bare-plugin-name → plugin root INDEX.md conveniences
99
- * neither identity nor a literal path expresses). Only if that pass finds
100
- * nothing does a second nearest-first pass try bare leaf-name fallback (final
101
- * path segment), ambiguous when two DIFFERENT identities in the SAME source
102
- * share a leaf. A farther canonical identity therefore beats a nearer leaf,
103
- * while scope precedence still decides between equally strong matches.
104
- *
105
- * `opts.kind`, when given, is a resolution CONSTRAINT, not a post-filter: in
106
- * both passes a candidate whose `effectiveDocKind` doesn't match is skipped,
107
- * so resolution keeps looking for a matching-kind document.
108
- */
84
+ export interface MemoryDocSnapshot {
85
+ /** Every document in default scope precedence order, loaded once. */
86
+ docs: readonly MemoryDoc[];
87
+ /** Resolve names against that source snapshot; failures are omitted so
88
+ * callers can retain their own per-document error behavior. */
89
+ resolve(names: readonly string[]): Map<string, MemoryDoc>;
90
+ }
91
+ export declare function createMemoryDocSnapshot(): MemoryDocSnapshot;
92
+ /** Resolve several unqualified names over one memory-source snapshot. Failed
93
+ * names are omitted so callers can preserve their per-document error behavior. */
94
+ export declare function resolveMemoryDocs(names: readonly string[]): Map<string, MemoryDoc>;
109
95
  export declare function resolveMemoryDoc(rawName: string, opts?: MemoryResolutionOpts): MemoryDoc;