@north-light/crouter 0.3.173 → 0.3.174

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (673) hide show
  1. package/bin/runtime-selector.mjs +8 -1
  2. package/dist/api/__tests__/{client.test.js → serial/client.test.js} +2 -135
  3. package/dist/api/client.d.ts +12 -21
  4. package/dist/api/client.js +22 -31
  5. package/dist/api/dto/broker-ops.d.ts +158 -0
  6. package/dist/api/dto/broker-ops.js +6 -0
  7. package/dist/api/dto/crons.d.ts +6 -0
  8. package/dist/api/dto/human.d.ts +7 -1
  9. package/dist/api/dto/inbox.d.ts +1 -71
  10. package/dist/api/dto/inbox.js +1 -9
  11. package/dist/api/dto/nodes.d.ts +6 -7
  12. package/dist/api/dto/reviews.d.ts +1 -11
  13. package/dist/api/routes.d.ts +7 -4
  14. package/dist/api/routes.js +8 -5
  15. package/dist/build-root.js +3 -3
  16. package/dist/builtin-memory/04-base-worker.md +1 -4
  17. package/dist/builtin-memory/05-kinds/advisor/00-base.md +1 -5
  18. package/dist/builtin-memory/05-kinds/advisor/01-orchestrator.md +2 -7
  19. package/dist/builtin-memory/05-kinds/design/00-base.md +1 -6
  20. package/dist/builtin-memory/05-kinds/developer/00-base.md +1 -6
  21. package/dist/builtin-memory/05-kinds/explore/00-base.md +1 -4
  22. package/dist/builtin-memory/05-kinds/explore/01-orchestrator.md +1 -2
  23. package/dist/builtin-memory/05-kinds/general/00-base.md +1 -3
  24. package/dist/builtin-memory/05-kinds/plan/00-base.md +1 -6
  25. package/dist/builtin-memory/05-kinds/plan/reviewers/00-base.md +1 -2
  26. package/dist/builtin-memory/05-kinds/plan/reviewers/architecture-fit.md +1 -3
  27. package/dist/builtin-memory/05-kinds/plan/reviewers/code-smells.md +1 -3
  28. package/dist/builtin-memory/05-kinds/plan/reviewers/pattern-consistency.md +1 -3
  29. package/dist/builtin-memory/05-kinds/plan/reviewers/requirements-coverage.md +1 -3
  30. package/dist/builtin-memory/05-kinds/plan/reviewers/security.md +1 -4
  31. package/dist/builtin-memory/05-kinds/review/companion/00-base.md +2 -3
  32. package/dist/builtin-memory/05-kinds/spec/00-base.md +1 -2
  33. package/dist/builtin-memory/advisor/council.md +1 -6
  34. package/dist/builtin-memory/design.md +2 -7
  35. package/dist/builtin-memory/development.md +9 -14
  36. package/dist/builtin-memory/internal/marketplaces.md +2 -6
  37. package/dist/builtin-memory/internal/nodes-and-canvas.md +1 -1
  38. package/dist/builtin-memory/internal/plugins.md +2 -8
  39. package/dist/builtin-memory/internal/storage-tiers.md +1 -2
  40. package/dist/builtin-memory/testing.md +41 -0
  41. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/{provider-rotation.test.ts → serial/provider-rotation.test.ts} +27 -179
  42. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/claude-plugin-commands.ts +5 -15
  43. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/index.ts +1 -28
  44. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/memory-slash-commands.ts +43 -88
  45. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.js +7 -1
  46. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +9 -1
  47. package/dist/cli.js +2 -2
  48. package/dist/clients/attach/__tests__/attach-remote-readonly.test.js +37 -131
  49. package/dist/clients/attach/__tests__/chat-view-snapshot-ordering.test.js +71 -152
  50. package/dist/clients/attach/__tests__/context-message.test.js +16 -174
  51. package/dist/clients/attach/__tests__/crtr-output.test.js +36 -2069
  52. package/dist/clients/attach/__tests__/diagram.test.js +2 -2
  53. package/dist/clients/attach/__tests__/edit-diff.test.js +0 -4
  54. package/dist/clients/attach/__tests__/file-review-focus.test.js +2 -1
  55. package/dist/clients/attach/__tests__/group-activity.test.js +40 -229
  56. package/dist/clients/attach/__tests__/oauth-dialog-lifecycle.test.js +26 -76
  57. package/dist/clients/attach/__tests__/prompt-preview.test.js +4 -70
  58. package/dist/clients/attach/__tests__/ref-autocomplete.test.js +11 -125
  59. package/dist/clients/attach/__tests__/titled-editor-preview.test.js +14 -205
  60. package/dist/clients/attach/command.d.ts +2 -1
  61. package/dist/clients/attach/command.js +81 -76
  62. package/dist/clients/attach/input/capabilities.d.ts +27 -0
  63. package/dist/clients/attach/input/capabilities.js +96 -0
  64. package/dist/clients/attach/input/controller.d.ts +20 -182
  65. package/dist/clients/attach/input/controller.js +128 -537
  66. package/dist/clients/attach/input/overlay-owner.d.ts +41 -0
  67. package/dist/clients/attach/input/overlay-owner.js +199 -0
  68. package/dist/clients/attach/overlays/file-review.d.ts +0 -4
  69. package/dist/clients/attach/overlays/file-review.js +13 -5
  70. package/dist/clients/attach/overlays/graph.js +2 -10
  71. package/dist/clients/attach/render/chat-view.d.ts +4 -3
  72. package/dist/clients/attach/render/chat-view.js +39 -33
  73. package/dist/clients/attach/render/group-activity.d.ts +1 -0
  74. package/dist/clients/attach/render/group-activity.js +20 -13
  75. package/dist/clients/attach/render/group-recap.js +12 -3
  76. package/dist/clients/attach/session/connection.js +9 -15
  77. package/dist/clients/attach/session/editor-inventory.d.ts +6 -5
  78. package/dist/clients/attach/session/editor-inventory.js +7 -8
  79. package/dist/clients/attach/session/file-links.d.ts +13 -0
  80. package/dist/clients/attach/session/file-links.js +107 -0
  81. package/dist/clients/attach/session/frame.d.ts +3 -0
  82. package/dist/clients/attach/session/frame.js +10 -1
  83. package/dist/clients/attach/session/frames.js +2 -3
  84. package/dist/clients/attach/session/input-wiring.d.ts +4 -1
  85. package/dist/clients/attach/session/input-wiring.js +15 -14
  86. package/dist/clients/attach/session/mouse.d.ts +6 -1
  87. package/dist/clients/attach/session/mouse.js +8 -5
  88. package/dist/clients/attach/session/profile-files.js +18 -12
  89. package/dist/clients/attach/session/reconnect.js +1 -1
  90. package/dist/clients/attach/session/state-sync.js +1 -2
  91. package/dist/clients/attach/session/surface-host.d.ts +3 -2
  92. package/dist/clients/attach/session/surface-host.js +4 -4
  93. package/dist/clients/attach/slash/dispatch.d.ts +8 -31
  94. package/dist/clients/attach/slash/dispatch.js +34 -81
  95. package/dist/clients/attach/viewer.js +820 -860
  96. package/dist/clients/conversation/projection.d.ts +79 -0
  97. package/dist/clients/conversation/projection.js +341 -0
  98. package/dist/clients/inbox/__tests__/serial/inbox-controller.test.js +159 -0
  99. package/dist/clients/inbox/__tests__/serial/mount-panel.test.js +151 -0
  100. package/dist/clients/inbox/controller.d.ts +0 -4
  101. package/dist/clients/inbox/controller.js +0 -2
  102. package/dist/clients/inbox/review/__tests__/review-core.test.js +4 -293
  103. package/dist/clients/inbox/review/__tests__/teardown-notice.test.js +100 -0
  104. package/dist/clients/inbox/review/comments-client.d.ts +3 -2
  105. package/dist/clients/inbox/review/comments-client.js +12 -12
  106. package/dist/clients/inbox/review/companion-pane.d.ts +30 -0
  107. package/dist/clients/inbox/review/companion-pane.js +86 -0
  108. package/dist/clients/inbox/review/document-surface.d.ts +182 -0
  109. package/dist/clients/inbox/review/{document-region.js → document-surface.js} +252 -48
  110. package/dist/clients/inbox/review/frame.js +5 -4
  111. package/dist/clients/inbox/review/launch.d.ts +8 -8
  112. package/dist/clients/inbox/review/launch.js +52 -92
  113. package/dist/clients/inbox/review/nvim.d.ts +2 -0
  114. package/dist/clients/inbox/review/nvim.js +14 -12
  115. package/dist/clients/inbox/review/review-client.d.ts +12 -8
  116. package/dist/clients/inbox/review/review-client.js +46 -35
  117. package/dist/clients/inbox/review-adapter.d.ts +3 -10
  118. package/dist/clients/inbox/review-adapter.js +27 -19
  119. package/dist/clients/inbox/surface.d.ts +0 -4
  120. package/dist/clients/inbox/surface.js +0 -2
  121. package/dist/clients/surfaces/host.d.ts +11 -3
  122. package/dist/commands/__tests__/api-client-cold-start-diagnostic.test.js +7 -34
  123. package/dist/commands/__tests__/human.test.js +11 -322
  124. package/dist/commands/api-client.d.ts +5 -5
  125. package/dist/commands/api-client.js +6 -85
  126. package/dist/commands/canvas-browse.js +3 -29
  127. package/dist/commands/canvas-config.js +1 -1
  128. package/dist/commands/canvas-use.js +3 -3
  129. package/dist/commands/canvas.js +1 -1
  130. package/dist/commands/cron.js +5 -1
  131. package/dist/commands/human/queue.d.ts +0 -4
  132. package/dist/commands/human/queue.js +7 -40
  133. package/dist/commands/memory/list.d.ts +14 -0
  134. package/dist/commands/memory/list.js +35 -31
  135. package/dist/commands/memory/read.d.ts +7 -0
  136. package/dist/commands/memory/read.js +14 -8
  137. package/dist/commands/node/bash.d.ts +1 -0
  138. package/dist/commands/node/bash.js +198 -0
  139. package/dist/commands/node/create.d.ts +23 -0
  140. package/dist/commands/node/create.js +207 -0
  141. package/dist/commands/node/inspect.d.ts +2 -0
  142. package/dist/commands/node/inspect.js +302 -0
  143. package/dist/commands/node/lifecycle.d.ts +4 -0
  144. package/dist/commands/node/lifecycle.js +415 -0
  145. package/dist/commands/node/message.d.ts +1 -0
  146. package/dist/commands/node/message.js +164 -0
  147. package/dist/commands/node/pyramid.d.ts +2 -0
  148. package/dist/commands/node/pyramid.js +79 -0
  149. package/dist/commands/node/subscription.d.ts +1 -0
  150. package/dist/commands/node/subscription.js +82 -0
  151. package/dist/commands/node/wait.d.ts +1 -0
  152. package/dist/commands/node/wait.js +159 -0
  153. package/dist/commands/node-lifecycle-revive.js +10 -57
  154. package/dist/commands/node.d.ts +0 -42
  155. package/dist/commands/node.js +11 -2065
  156. package/dist/commands/search.js +1 -1
  157. package/dist/commands/surface/node/cycle.d.ts +1 -0
  158. package/dist/commands/surface/node/cycle.js +83 -0
  159. package/dist/commands/surface/node/focus.d.ts +1 -0
  160. package/dist/commands/surface/node/focus.js +67 -0
  161. package/dist/commands/surface/node/id.d.ts +1 -0
  162. package/dist/commands/surface/node/id.js +38 -0
  163. package/dist/commands/surface/node/pin.d.ts +1 -0
  164. package/dist/commands/surface/node/pin.js +42 -0
  165. package/dist/commands/surface/node/placement.d.ts +46 -0
  166. package/dist/commands/surface/node/placement.js +124 -0
  167. package/dist/commands/surface-node.js +4 -1
  168. package/dist/commands/surface-reload.js +1 -2
  169. package/dist/commands/surface-tmux-spread.js +1 -1
  170. package/dist/commands/surface.js +5 -20
  171. package/dist/commands/sys/__tests__/setup-core.test.js +18 -271
  172. package/dist/commands/sys/config.js +6 -6
  173. package/dist/commands/sys/logs.js +1 -1
  174. package/dist/commands/sys/panels/broker-limits-panel.d.ts +17 -0
  175. package/dist/commands/sys/panels/broker-limits-panel.js +104 -0
  176. package/dist/commands/sys/panels/dependencies-panel.d.ts +14 -0
  177. package/dist/commands/sys/panels/dependencies-panel.js +80 -0
  178. package/dist/commands/sys/panels/keybindings-panel.d.ts +56 -0
  179. package/dist/commands/sys/panels/keybindings-panel.js +703 -0
  180. package/dist/commands/sys/panels/keys-panel.d.ts +16 -0
  181. package/dist/commands/sys/panels/keys-panel.js +60 -0
  182. package/dist/commands/sys/panels/models-panel.d.ts +77 -0
  183. package/dist/commands/sys/panels/models-panel.js +647 -0
  184. package/dist/commands/sys/panels/panel.d.ts +45 -0
  185. package/dist/commands/sys/panels/panel.js +137 -0
  186. package/dist/commands/sys/panels/plugins-panel.d.ts +16 -0
  187. package/dist/commands/sys/panels/plugins-panel.js +80 -0
  188. package/dist/commands/sys/panels/prefs-panel.d.ts +21 -0
  189. package/dist/commands/sys/panels/prefs-panel.js +85 -0
  190. package/dist/commands/sys/panels/provider-panel.d.ts +62 -0
  191. package/dist/commands/sys/panels/provider-panel.js +538 -0
  192. package/dist/commands/sys/settings-shell.d.ts +55 -0
  193. package/dist/commands/sys/settings-shell.js +400 -0
  194. package/dist/commands/sys/settings.d.ts +2 -0
  195. package/dist/commands/sys/settings.js +31 -0
  196. package/dist/commands/sys/setup-core.d.ts +3 -33
  197. package/dist/commands/sys/setup-core.js +27 -78
  198. package/dist/commands/sys/setup-settings-runner.d.ts +24 -0
  199. package/dist/commands/sys/setup-settings-runner.js +63 -0
  200. package/dist/commands/sys/setup-wizard.d.ts +26 -125
  201. package/dist/commands/sys/setup-wizard.js +209 -2473
  202. package/dist/commands/sys/setup.js +5 -7
  203. package/dist/commands/sys.js +3 -2
  204. package/dist/core/__tests__/broker-extension-canvas-db-boundary.test.js +50 -0
  205. package/dist/core/__tests__/broker-launch-candidates.test.js +20 -9
  206. package/dist/core/__tests__/broker-preflight.test.js +1 -1
  207. package/dist/core/__tests__/canvas-inbox-watcher-hold.test.js +108 -27
  208. package/dist/core/__tests__/canvas-inbox-watcher.test.js +14 -0
  209. package/dist/core/__tests__/canvas.test.js +2 -36
  210. package/dist/core/__tests__/close.test.js +14 -3
  211. package/dist/core/__tests__/context-intro.test.js +32 -143
  212. package/dist/core/__tests__/cron-broker-capacity.test.js +22 -3
  213. package/dist/core/__tests__/daemon-boot.test.js +2 -20
  214. package/dist/core/__tests__/daemon-wedge.test.js +1 -1
  215. package/dist/core/__tests__/dead-node-policy-table.test.js +1 -18
  216. package/dist/core/__tests__/fixtures/fake-engine.d.ts +1 -1
  217. package/dist/core/__tests__/fixtures/fake-engine.js +2 -2
  218. package/dist/core/__tests__/fixtures/fake-pi-host.js +2 -2
  219. package/dist/core/__tests__/focuses.test.js +4 -98
  220. package/dist/core/__tests__/helpers/broker-clients.d.ts +0 -3
  221. package/dist/core/__tests__/helpers/broker-clients.js +0 -14
  222. package/dist/core/__tests__/helpers/harness.d.ts +0 -8
  223. package/dist/core/__tests__/helpers/harness.js +7 -87
  224. package/dist/core/__tests__/helpers/viewer-panes.js +1 -1
  225. package/dist/core/__tests__/inline-memory-refs.test.js +5 -134
  226. package/dist/core/__tests__/kickoff.test.js +1 -1
  227. package/dist/core/__tests__/memory-resolver-precedence.test.js +29 -1
  228. package/dist/core/__tests__/migration.test.js +35 -48
  229. package/dist/core/__tests__/on-read-dedup-resume.test.js +22 -12
  230. package/dist/core/__tests__/passive-subscription.test.js +26 -49
  231. package/dist/core/__tests__/preview-registry-sync.test.js +1 -2
  232. package/dist/core/__tests__/prune.test.js +94 -1
  233. package/dist/core/__tests__/review-model-floor.test.js +0 -32
  234. package/dist/core/__tests__/seam/broker-attach-multiclient.test.js +255 -0
  235. package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.js +39 -7
  236. package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.js +30 -29
  237. package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.js +54 -5
  238. package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.js +134 -82
  239. package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.js +15 -4
  240. package/dist/core/__tests__/{full/idle-release-settlement.test.js → seam/dormancy-release.test.js} +69 -17
  241. package/dist/core/__tests__/{full/yield-message-transaction.test.js → seam/yield-refresh-transaction.test.js} +31 -9
  242. package/dist/core/__tests__/secrets.test.js +1 -7
  243. package/dist/core/__tests__/{broker-fork-seam.test.js → serial/broker-fork-seam.test.js} +58 -7
  244. package/dist/core/__tests__/{broker-sdk-wiring.test.js → serial/broker-sdk-wiring.test.js} +18 -162
  245. package/dist/core/__tests__/{broker-snapshot-history.test.js → serial/broker-snapshot-history.test.js} +9 -9
  246. package/dist/core/__tests__/{command-plugins.test.js → serial/command-plugins.test.js} +105 -15
  247. package/dist/core/__tests__/{deferred-no-wake.test.js → serial/deferred-no-wake.test.js} +23 -20
  248. package/dist/core/__tests__/{flagship-lifecycle.test.js → serial/flagship-lifecycle.test.js} +7 -7
  249. package/dist/core/__tests__/{host-teardown-process-group.test.js → serial/host-teardown-process-group.test.js} +6 -6
  250. package/dist/core/__tests__/{human-deliver-e2e.test.js → serial/human-deliver-e2e.test.js} +12 -12
  251. package/dist/core/__tests__/{live-mutation.test.js → serial/live-mutation.test.js} +5 -5
  252. package/dist/core/__tests__/{refresh-stall-recycle.test.js → serial/refresh-stall-recycle.test.js} +5 -14
  253. package/dist/core/__tests__/{revive.test.js → serial/revive.test.js} +15 -100
  254. package/dist/core/__tests__/{spawn-root.test.js → serial/spawn-root.test.js} +32 -15
  255. package/dist/core/__tests__/serial/subscription-delivery.test.js +126 -0
  256. package/dist/core/__tests__/serial/tmux-surface.test.js +256 -0
  257. package/dist/core/__tests__/{worktree.test.js → serial/worktree.test.js} +15 -15
  258. package/dist/core/__tests__/session-model.test.js +0 -18
  259. package/dist/core/__tests__/spawn-worktree-id-conflict.test.js +9 -0
  260. package/dist/core/__tests__/watchdog-abort-arms-retry.test.js +50 -0
  261. package/dist/core/broker-client/__tests__/transport-relay.test.js +15 -16
  262. package/dist/core/broker-client/__tests__/transport-socket.test.js +28 -0
  263. package/dist/core/broker-client/client.d.ts +2 -2
  264. package/dist/core/broker-client/client.js +4 -7
  265. package/dist/core/broker-client/transport-relay.d.ts +13 -19
  266. package/dist/core/broker-client/transport-relay.js +19 -34
  267. package/dist/core/broker-client/transport-socket.d.ts +2 -2
  268. package/dist/core/broker-client/transport-socket.js +9 -2
  269. package/dist/core/broker-client/transport.d.ts +7 -3
  270. package/dist/core/broker-client/transport.js +4 -4
  271. package/dist/core/canvas/__tests__/attention.test.js +1 -18
  272. package/dist/core/canvas/__tests__/remote-canvas-source.test.js +7 -64
  273. package/dist/core/canvas/__tests__/remote-transport.test.js +2 -3
  274. package/dist/core/canvas/__tests__/render-remote.test.js +7 -52
  275. package/dist/core/canvas/browse/app.d.ts +2 -17
  276. package/dist/core/canvas/browse/app.js +16 -88
  277. package/dist/core/canvas/browse/model.d.ts +0 -4
  278. package/dist/core/canvas/browse/model.js +1 -12
  279. package/dist/core/canvas/browse/render.js +6 -3
  280. package/dist/core/canvas/crons.d.ts +8 -5
  281. package/dist/core/canvas/crons.js +7 -6
  282. package/dist/core/canvas/extensions.d.ts +7 -3
  283. package/dist/core/canvas/extensions.js +16 -4
  284. package/dist/core/canvas/nav-model.d.ts +0 -4
  285. package/dist/core/canvas/nav-model.js +2 -14
  286. package/dist/core/canvas/node-order.d.ts +3 -0
  287. package/dist/core/canvas/node-order.js +12 -0
  288. package/dist/core/canvas/remote-canvas-source.d.ts +3 -6
  289. package/dist/core/canvas/remote-canvas-source.js +8 -15
  290. package/dist/core/command.js +11 -4
  291. package/dist/core/config.js +3 -1
  292. package/dist/core/events/envelope.js +1 -1
  293. package/dist/core/events/read.js +7 -21
  294. package/dist/core/events/source.d.ts +0 -2
  295. package/dist/core/events/source.js +0 -16
  296. package/dist/core/events/types.d.ts +1 -1
  297. package/dist/core/fault-classifier.d.ts +1 -1
  298. package/dist/core/feed/passive.d.ts +0 -11
  299. package/dist/core/feed/passive.js +1 -62
  300. package/dist/core/human/__tests__/{inbox-core.test.js → serial/inbox-core.test.js} +6 -6
  301. package/dist/core/keybindings/__tests__/resolve.test.js +1 -96
  302. package/dist/core/keybindings/background-bash.js +3 -4
  303. package/dist/core/keybindings/catalog.js +1 -1
  304. package/dist/core/memory/inline-ref-grammar.js +3 -3
  305. package/dist/core/memory-resolver.d.ts +11 -25
  306. package/dist/core/memory-resolver.js +51 -33
  307. package/dist/core/model-routes.d.ts +15 -0
  308. package/dist/core/model-routes.js +12 -0
  309. package/dist/core/pool-credential-store.js +1 -1
  310. package/dist/core/preview-registry.js +8 -9
  311. package/dist/core/profiles/__tests__/root-profile.test.js +4 -14
  312. package/dist/core/review/realize.d.ts +0 -13
  313. package/dist/core/review/realize.js +0 -40
  314. package/dist/core/review/types.d.ts +1 -1
  315. package/dist/core/runtime/__tests__/engine-route.test.js +2 -2
  316. package/dist/core/runtime/bearings.js +1 -11
  317. package/dist/core/runtime/broker/client-registry.d.ts +33 -0
  318. package/dist/core/runtime/broker/client-registry.js +164 -0
  319. package/dist/core/runtime/broker/daemon-ops.d.ts +19 -0
  320. package/dist/core/runtime/broker/daemon-ops.js +49 -0
  321. package/dist/core/runtime/broker/event-projection.d.ts +42 -0
  322. package/dist/core/runtime/broker/event-projection.js +178 -0
  323. package/dist/core/runtime/broker/fault-retry.d.ts +39 -0
  324. package/dist/core/runtime/broker/fault-retry.js +277 -0
  325. package/dist/core/runtime/broker/frame-dispatch.d.ts +238 -0
  326. package/dist/core/runtime/broker/frame-dispatch.js +1537 -0
  327. package/dist/core/runtime/broker/inbox.d.ts +22 -0
  328. package/dist/core/runtime/broker/inbox.js +167 -0
  329. package/dist/core/runtime/broker/passive.d.ts +16 -0
  330. package/dist/core/runtime/broker/passive.js +44 -0
  331. package/dist/core/runtime/broker/read-ops.d.ts +23 -0
  332. package/dist/core/runtime/broker/read-ops.js +150 -0
  333. package/dist/core/runtime/broker/rebind.d.ts +74 -0
  334. package/dist/core/runtime/broker/rebind.js +211 -0
  335. package/dist/core/runtime/broker/tool-groups.d.ts +39 -0
  336. package/dist/core/runtime/broker/tool-groups.js +244 -0
  337. package/dist/core/runtime/broker-extension-render.d.ts +11 -0
  338. package/dist/core/runtime/broker-extension-render.js +181 -0
  339. package/dist/core/runtime/broker-persona-guidance.d.ts +13 -0
  340. package/dist/core/runtime/broker-persona-guidance.js +58 -0
  341. package/dist/core/runtime/broker-protocol.d.ts +1 -1
  342. package/dist/core/runtime/broker-protocol.js +1 -1
  343. package/dist/core/runtime/broker.d.ts +5 -196
  344. package/dist/core/runtime/broker.js +276 -3059
  345. package/dist/core/runtime/canvas-extensions.js +11 -2
  346. package/dist/core/runtime/fault.js +1 -1
  347. package/dist/core/runtime/model-selection.d.ts +9 -0
  348. package/dist/core/runtime/model-selection.js +12 -0
  349. package/dist/core/runtime/model-swap.d.ts +3 -3
  350. package/dist/core/runtime/model-swap.js +33 -25
  351. package/dist/core/runtime/placement-tmux.d.ts +3 -14
  352. package/dist/core/runtime/placement-tmux.js +11 -80
  353. package/dist/core/runtime/placement.d.ts +4 -2
  354. package/dist/core/runtime/placement.js +7 -12
  355. package/dist/core/runtime/promote.d.ts +14 -1
  356. package/dist/core/runtime/promote.js +1 -1
  357. package/dist/core/runtime/reset.d.ts +1 -1
  358. package/dist/core/runtime/roadmap.js +1 -1
  359. package/dist/core/runtime/spawn.d.ts +8 -0
  360. package/dist/core/runtime/spawn.js +36 -6
  361. package/dist/core/runtime/stop-guard.d.ts +4 -3
  362. package/dist/core/runtime/stop-guard.js +36 -18
  363. package/dist/core/runtime/stop-signals.d.ts +4 -1
  364. package/dist/core/runtime/stream-watchdog.js +4 -5
  365. package/dist/core/runtime/structured-output.d.ts +15 -2
  366. package/dist/core/runtime/structured-output.js +35 -12
  367. package/dist/core/runtime/tmux-bindings.d.ts +25 -0
  368. package/dist/core/runtime/tmux-bindings.js +682 -0
  369. package/dist/core/runtime/tmux-chrome.d.ts +2 -1
  370. package/dist/core/runtime/tmux-chrome.js +3 -2
  371. package/dist/core/runtime/{tmux.d.ts → tmux-driver.d.ts} +18 -26
  372. package/dist/core/runtime/tmux-driver.js +598 -0
  373. package/dist/core/runtime/view-socket.d.ts +14 -0
  374. package/dist/core/runtime/view-socket.js +83 -0
  375. package/dist/core/session-model/session-state.d.ts +1 -2
  376. package/dist/core/session-model/session-state.js +5 -8
  377. package/dist/core/spawn.d.ts +1 -1
  378. package/dist/core/spawn.js +2 -2
  379. package/dist/core/substrate/gate.d.ts +1 -1
  380. package/dist/core/substrate/on-read-pure.d.ts +7 -0
  381. package/dist/core/substrate/on-read-pure.js +272 -0
  382. package/dist/core/termrender/termrender.js +32 -2
  383. package/dist/core/user-settings.d.ts +23 -1
  384. package/dist/core/user-settings.js +18 -1
  385. package/dist/daemon/api/__tests__/node-model-validation.test.js +134 -0
  386. package/dist/daemon/api/__tests__/review-terminal-conflict.test.js +98 -0
  387. package/dist/daemon/api/__tests__/{full → seam}/api-server.test.js +6 -48
  388. package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.js +17 -44
  389. package/dist/daemon/api/__tests__/{full/push-parity.test.js → seam/leaf-api-parity.test.js} +61 -42
  390. package/dist/daemon/api/bridge.js +40 -81
  391. package/dist/daemon/api/handlers/broker-ops.d.ts +2 -0
  392. package/dist/daemon/api/handlers/broker-ops.js +383 -0
  393. package/dist/daemon/api/handlers/crons.js +9 -4
  394. package/dist/daemon/api/handlers/files.js +6 -7
  395. package/dist/daemon/api/handlers/inbox.js +2 -340
  396. package/dist/daemon/api/handlers/nodes.d.ts +10 -1
  397. package/dist/daemon/api/handlers/nodes.js +74 -39
  398. package/dist/daemon/api/handlers/review-comments.js +5 -1
  399. package/dist/daemon/api/handlers/reviews.js +0 -19
  400. package/dist/daemon/api/map.js +25 -4
  401. package/dist/daemon/api/router.js +2 -3
  402. package/dist/daemon/api/server.js +5 -7
  403. package/dist/daemon/cron-run.d.ts +4 -0
  404. package/dist/daemon/cron-run.js +30 -13
  405. package/dist/daemon/crtrd.d.ts +3 -58
  406. package/dist/daemon/crtrd.js +28 -1244
  407. package/dist/daemon/manage.js +0 -1
  408. package/dist/daemon/reconcilers/broker-supervision.d.ts +50 -0
  409. package/dist/daemon/reconcilers/broker-supervision.js +549 -0
  410. package/dist/daemon/reconcilers/cron-lane.d.ts +10 -0
  411. package/dist/daemon/reconcilers/cron-lane.js +32 -0
  412. package/dist/daemon/reconcilers/dormant-inbox.d.ts +18 -0
  413. package/dist/daemon/reconcilers/dormant-inbox.js +143 -0
  414. package/dist/daemon/reconcilers/storage-maintenance.d.ts +22 -0
  415. package/dist/daemon/reconcilers/storage-maintenance.js +213 -0
  416. package/dist/daemon/review/finish.js +2 -5
  417. package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +34 -53
  418. package/dist/pi-extensions/__tests__/canvas-recap.test.js +16 -113
  419. package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +72 -99
  420. package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.js +29 -12
  421. package/dist/pi-extensions/broker-local.d.ts +20 -0
  422. package/dist/pi-extensions/broker-local.js +89 -0
  423. package/dist/pi-extensions/canvas-context-intro.d.ts +3 -3
  424. package/dist/pi-extensions/canvas-context-intro.js +22 -11
  425. package/dist/pi-extensions/canvas-doc-substrate.js +17 -34
  426. package/dist/pi-extensions/canvas-goal-capture.js +7 -12
  427. package/dist/pi-extensions/canvas-inbox-watcher.js +124 -139
  428. package/dist/pi-extensions/canvas-passive-context.d.ts +3 -3
  429. package/dist/pi-extensions/canvas-passive-context.js +22 -18
  430. package/dist/pi-extensions/canvas-recap.d.ts +2 -2
  431. package/dist/pi-extensions/canvas-recap.js +48 -21
  432. package/dist/pi-extensions/canvas-review-boundary.js +10 -4
  433. package/dist/pi-extensions/canvas-stophook.d.ts +0 -5
  434. package/dist/pi-extensions/canvas-stophook.js +149 -431
  435. package/dist/pi-extensions/canvas-structured-output.js +52 -30
  436. package/dist/pi-extensions/envelope-merge.d.ts +13 -0
  437. package/dist/pi-extensions/envelope-merge.js +29 -0
  438. package/dist/shared/working-activity.d.ts +3 -2
  439. package/dist/shared/working-activity.js +3 -2
  440. package/dist/types.d.ts +6 -5
  441. package/dist/types.js +2 -2
  442. package/docs/compat/hearth-crtr-v1.md +4 -12
  443. package/docs/compat/hearth-crtr-v2.md +3 -11
  444. package/docs/compat/hearth-crtr-v3.md +4 -12
  445. package/docs/compat/hearth-crtr-v4.md +3 -11
  446. package/docs/compat/hearth-crtr-v5.md +3 -11
  447. package/docs/public-api.md +3 -7
  448. package/package.json +7 -49
  449. package/runtime.lock.json +2766 -14533
  450. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/claude-plugin-commands.test.ts +0 -49
  451. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/memory-slash-commands.test.ts +0 -194
  452. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/statusline.test.ts +0 -68
  453. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/test.ts +0 -119
  454. package/dist/clients/attach/__tests__/attach-chrome-remote.test.js +0 -439
  455. package/dist/clients/attach/__tests__/attach-keybindings.test.js +0 -170
  456. package/dist/clients/attach/__tests__/crtr-output-coverage.test.js +0 -57
  457. package/dist/clients/attach/__tests__/editor-frame-title.test.js +0 -19
  458. package/dist/clients/attach/__tests__/input-controller-extension-command.test.js +0 -32
  459. package/dist/clients/attach/__tests__/markdown-headings.test.js +0 -35
  460. package/dist/clients/attach/__tests__/session-identity-refresh.test.js +0 -32
  461. package/dist/clients/conversation/conversation.d.ts +0 -65
  462. package/dist/clients/conversation/conversation.js +0 -318
  463. package/dist/clients/conversation/frames.d.ts +0 -30
  464. package/dist/clients/conversation/frames.js +0 -52
  465. package/dist/clients/conversation/region.d.ts +0 -51
  466. package/dist/clients/conversation/region.js +0 -265
  467. package/dist/clients/inbox/__tests__/inbox-controller.test.js +0 -247
  468. package/dist/clients/inbox/__tests__/mount-panel.test.js +0 -776
  469. package/dist/clients/inbox/review/__tests__/remap.test.js +0 -196
  470. package/dist/clients/inbox/review/columns.d.ts +0 -22
  471. package/dist/clients/inbox/review/columns.js +0 -40
  472. package/dist/clients/inbox/review/composition.d.ts +0 -60
  473. package/dist/clients/inbox/review/composition.js +0 -278
  474. package/dist/clients/inbox/review/document-region.d.ts +0 -120
  475. package/dist/clients/surfaces/region.d.ts +0 -16
  476. package/dist/clients/web/__tests__/push-engine.test.js +0 -158
  477. package/dist/clients/web/__tests__/push-registry.test.d.ts +0 -1
  478. package/dist/clients/web/__tests__/push-registry.test.js +0 -177
  479. package/dist/clients/web/dev-server.d.ts +0 -7
  480. package/dist/clients/web/dev-server.js +0 -46
  481. package/dist/clients/web/events.d.ts +0 -19
  482. package/dist/clients/web/events.js +0 -163
  483. package/dist/clients/web/push-engine.d.ts +0 -44
  484. package/dist/clients/web/push-engine.js +0 -125
  485. package/dist/clients/web/push-registry.d.ts +0 -85
  486. package/dist/clients/web/push-registry.js +0 -373
  487. package/dist/clients/web/server.d.ts +0 -19
  488. package/dist/clients/web/server.js +0 -661
  489. package/dist/clients/web/web-client/shared/protocol.d.ts +0 -214
  490. package/dist/clients/web/web-client/shared/protocol.js +0 -8
  491. package/dist/clients/web/web-cmd.d.ts +0 -2
  492. package/dist/clients/web/web-cmd.js +0 -141
  493. package/dist/commands/__tests__/api-canvas-source.test.d.ts +0 -1
  494. package/dist/commands/__tests__/api-canvas-source.test.js +0 -37
  495. package/dist/commands/__tests__/canvas-config.test.d.ts +0 -1
  496. package/dist/commands/__tests__/canvas-config.test.js +0 -107
  497. package/dist/commands/__tests__/node-no-kickoff-flag.test.d.ts +0 -1
  498. package/dist/commands/__tests__/node-no-kickoff-flag.test.js +0 -73
  499. package/dist/commands/__tests__/node-worktree-flag.test.d.ts +0 -1
  500. package/dist/commands/__tests__/node-worktree-flag.test.js +0 -49
  501. package/dist/commands/__tests__/search-contents.test.d.ts +0 -1
  502. package/dist/commands/__tests__/search-contents.test.js +0 -52
  503. package/dist/commands/memory/__tests__/lint.test.d.ts +0 -1
  504. package/dist/commands/memory/__tests__/lint.test.js +0 -15
  505. package/dist/commands/sys/__tests__/config-broker-thresholds.test.d.ts +0 -1
  506. package/dist/commands/sys/__tests__/config-broker-thresholds.test.js +0 -95
  507. package/dist/commands/sys/__tests__/config-keybindings.test.d.ts +0 -1
  508. package/dist/commands/sys/__tests__/config-keybindings.test.js +0 -55
  509. package/dist/commands/sys/__tests__/helpers/setup-runtime.d.ts +0 -5
  510. package/dist/commands/sys/__tests__/helpers/setup-runtime.js +0 -19
  511. package/dist/commands/sys/__tests__/setup-front-door.test.d.ts +0 -1
  512. package/dist/commands/sys/__tests__/setup-front-door.test.js +0 -102
  513. package/dist/commands/sys/__tests__/setup-models.test.d.ts +0 -1
  514. package/dist/commands/sys/__tests__/setup-models.test.js +0 -205
  515. package/dist/commands/sys/__tests__/setup-providers-viewport.test.d.ts +0 -1
  516. package/dist/commands/sys/__tests__/setup-providers-viewport.test.js +0 -155
  517. package/dist/commands/sys/__tests__/sync-deps.test.d.ts +0 -1
  518. package/dist/commands/sys/__tests__/sync-deps.test.js +0 -179
  519. package/dist/commands/sys/__tests__/sync-import.test.d.ts +0 -1
  520. package/dist/commands/sys/__tests__/sync-import.test.js +0 -315
  521. package/dist/core/__tests__/base-worker-prompt.test.d.ts +0 -1
  522. package/dist/core/__tests__/base-worker-prompt.test.js +0 -57
  523. package/dist/core/__tests__/command-plugins-surfaces.test.d.ts +0 -1
  524. package/dist/core/__tests__/command-plugins-surfaces.test.js +0 -359
  525. package/dist/core/__tests__/connection-reconnect-resume.test.d.ts +0 -1
  526. package/dist/core/__tests__/connection-reconnect-resume.test.js +0 -36
  527. package/dist/core/__tests__/finalization-migration.test.d.ts +0 -1
  528. package/dist/core/__tests__/finalization-migration.test.js +0 -38
  529. package/dist/core/__tests__/fixtures/extra-extension.d.ts +0 -1
  530. package/dist/core/__tests__/fixtures/extra-extension.js +0 -3
  531. package/dist/core/__tests__/fixtures/spawn-proof-target.test.d.ts +0 -1
  532. package/dist/core/__tests__/fixtures/spawn-proof-target.test.js +0 -15
  533. package/dist/core/__tests__/fork.test.d.ts +0 -1
  534. package/dist/core/__tests__/fork.test.js +0 -108
  535. package/dist/core/__tests__/full/broker-attach-limits.test.d.ts +0 -1
  536. package/dist/core/__tests__/full/broker-attach-limits.test.js +0 -147
  537. package/dist/core/__tests__/full/broker-deliver-ack.test.d.ts +0 -1
  538. package/dist/core/__tests__/full/broker-deliver-ack.test.js +0 -73
  539. package/dist/core/__tests__/full/broker-dialogs.test.d.ts +0 -1
  540. package/dist/core/__tests__/full/broker-dialogs.test.js +0 -180
  541. package/dist/core/__tests__/full/broker-display-snapshot.test.d.ts +0 -1
  542. package/dist/core/__tests__/full/broker-display-snapshot.test.js +0 -75
  543. package/dist/core/__tests__/full/broker-dormant-wake.test.d.ts +0 -1
  544. package/dist/core/__tests__/full/broker-dormant-wake.test.js +0 -130
  545. package/dist/core/__tests__/full/broker-model-changed-broadcast.test.d.ts +0 -1
  546. package/dist/core/__tests__/full/broker-model-changed-broadcast.test.js +0 -57
  547. package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.d.ts +0 -1
  548. package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.js +0 -80
  549. package/dist/core/__tests__/full/cascade-close.test.d.ts +0 -1
  550. package/dist/core/__tests__/full/cascade-close.test.js +0 -240
  551. package/dist/core/__tests__/full/detach-focus.test.d.ts +0 -1
  552. package/dist/core/__tests__/full/detach-focus.test.js +0 -126
  553. package/dist/core/__tests__/full/idle-release-settlement.test.d.ts +0 -1
  554. package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.d.ts +0 -1
  555. package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.js +0 -107
  556. package/dist/core/__tests__/full/park-clock-release.test.d.ts +0 -1
  557. package/dist/core/__tests__/full/park-clock-release.test.js +0 -56
  558. package/dist/core/__tests__/full/yield-message-transaction.test.d.ts +0 -1
  559. package/dist/core/__tests__/memory-index-render.test.d.ts +0 -1
  560. package/dist/core/__tests__/memory-index-render.test.js +0 -60
  561. package/dist/core/__tests__/model-routes.test.d.ts +0 -1
  562. package/dist/core/__tests__/model-routes.test.js +0 -41
  563. package/dist/core/__tests__/on-read-identity.test.d.ts +0 -1
  564. package/dist/core/__tests__/on-read-identity.test.js +0 -61
  565. package/dist/core/__tests__/phase4-review-migration.test.d.ts +0 -1
  566. package/dist/core/__tests__/phase4-review-migration.test.js +0 -100
  567. package/dist/core/__tests__/prune-to-limit.test.d.ts +0 -1
  568. package/dist/core/__tests__/prune-to-limit.test.js +0 -126
  569. package/dist/core/__tests__/reset.test.d.ts +0 -1
  570. package/dist/core/__tests__/reset.test.js +0 -69
  571. package/dist/core/__tests__/spawn-no-kickoff.test.d.ts +0 -1
  572. package/dist/core/__tests__/spawn-no-kickoff.test.js +0 -115
  573. package/dist/core/__tests__/steer-note.test.d.ts +0 -1
  574. package/dist/core/__tests__/steer-note.test.js +0 -41
  575. package/dist/core/__tests__/subcommand-tier.test.d.ts +0 -1
  576. package/dist/core/__tests__/subcommand-tier.test.js +0 -99
  577. package/dist/core/__tests__/subscription-delivery.test.js +0 -211
  578. package/dist/core/__tests__/test-runner-cheap-sharding.test.d.ts +0 -1
  579. package/dist/core/__tests__/test-runner-cheap-sharding.test.js +0 -97
  580. package/dist/core/__tests__/tmux-surface.test.js +0 -484
  581. package/dist/core/__tests__/wake-bearings.test.d.ts +0 -1
  582. package/dist/core/__tests__/wake-bearings.test.js +0 -102
  583. package/dist/core/canvas/__tests__/remote-event-stream.test.d.ts +0 -1
  584. package/dist/core/canvas/__tests__/remote-event-stream.test.js +0 -146
  585. package/dist/core/canvas/__tests__/source-resolve.test.d.ts +0 -1
  586. package/dist/core/canvas/__tests__/source-resolve.test.js +0 -77
  587. package/dist/core/canvas/browse/__tests__/model.test.d.ts +0 -1
  588. package/dist/core/canvas/browse/__tests__/model.test.js +0 -290
  589. package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.d.ts +0 -1
  590. package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.js +0 -134
  591. package/dist/core/canvas/browse/__tests__/render.test.d.ts +0 -1
  592. package/dist/core/canvas/browse/__tests__/render.test.js +0 -111
  593. package/dist/core/canvas/browse/rebuild-coalescer.d.ts +0 -7
  594. package/dist/core/canvas/browse/rebuild-coalescer.js +0 -61
  595. package/dist/core/canvas/remote-event-stream.d.ts +0 -24
  596. package/dist/core/canvas/remote-event-stream.js +0 -94
  597. package/dist/core/feed/__tests__/coalesce-human.test.d.ts +0 -1
  598. package/dist/core/feed/__tests__/coalesce-human.test.js +0 -36
  599. package/dist/core/feed/__tests__/empty-node-guard.test.d.ts +0 -1
  600. package/dist/core/feed/__tests__/empty-node-guard.test.js +0 -45
  601. package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.d.ts +0 -1
  602. package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.js +0 -84
  603. package/dist/core/human/__tests__/visible-paths.test.d.ts +0 -1
  604. package/dist/core/human/__tests__/visible-paths.test.js +0 -28
  605. package/dist/core/keybindings/__tests__/inbox-affordance.test.d.ts +0 -1
  606. package/dist/core/keybindings/__tests__/inbox-affordance.test.js +0 -38
  607. package/dist/core/review/__tests__/project.test.d.ts +0 -1
  608. package/dist/core/review/__tests__/project.test.js +0 -71
  609. package/dist/core/runtime/__tests__/command-expansion.test.d.ts +0 -1
  610. package/dist/core/runtime/__tests__/command-expansion.test.js +0 -25
  611. package/dist/core/runtime/__tests__/session-visibility.test.d.ts +0 -1
  612. package/dist/core/runtime/__tests__/session-visibility.test.js +0 -119
  613. package/dist/core/runtime/__tests__/spawn-at-given-id.test.d.ts +0 -1
  614. package/dist/core/runtime/__tests__/spawn-at-given-id.test.js +0 -34
  615. package/dist/core/runtime/tmux.js +0 -1314
  616. package/dist/daemon/api/__tests__/full/push-parity.test.d.ts +0 -1
  617. package/dist/daemon/api/__tests__/full/worktree-parity.test.d.ts +0 -1
  618. package/dist/daemon/api/__tests__/full/worktree-parity.test.js +0 -160
  619. package/dist/daemon/api/__tests__/inbox.test.d.ts +0 -1
  620. package/dist/daemon/api/__tests__/inbox.test.js +0 -489
  621. package/dist/web-client/apple-touch-icon.png +0 -0
  622. package/dist/web-client/assets/fragment-mono-latin-400-normal-BYwT3kSJ.woff +0 -0
  623. package/dist/web-client/assets/fragment-mono-latin-400-normal-yxdJ5AmL.woff2 +0 -0
  624. package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-BbKYyvR9.woff2 +0 -0
  625. package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-CT4YFKeK.woff +0 -0
  626. package/dist/web-client/assets/index-CCPaLeW7.css +0 -2
  627. package/dist/web-client/assets/index-kyOWsnZK.js +0 -86
  628. package/dist/web-client/assets/martian-mono-cyrillic-wght-normal-B84CD5C_.woff2 +0 -0
  629. package/dist/web-client/assets/martian-mono-latin-ext-wght-normal-DlL6xMw5.woff2 +0 -0
  630. package/dist/web-client/assets/martian-mono-latin-wght-normal-5W32yIyr.woff2 +0 -0
  631. package/dist/web-client/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -2
  632. package/dist/web-client/icon-192.png +0 -0
  633. package/dist/web-client/icon-512.png +0 -0
  634. package/dist/web-client/icon-maskable-512.png +0 -0
  635. package/dist/web-client/index.html +0 -17
  636. package/dist/web-client/manifest.webmanifest +0 -1
  637. package/dist/web-client/sw.js +0 -1
  638. /package/dist/api/__tests__/{client.test.d.ts → serial/client.test.d.ts} +0 -0
  639. /package/dist/clients/inbox/__tests__/{inbox-controller.test.d.ts → serial/inbox-controller.test.d.ts} +0 -0
  640. /package/dist/clients/inbox/__tests__/{mount-panel.test.d.ts → serial/mount-panel.test.d.ts} +0 -0
  641. /package/dist/clients/{attach/__tests__/attach-chrome-remote.test.d.ts → inbox/review/__tests__/teardown-notice.test.d.ts} +0 -0
  642. /package/dist/{clients/attach/__tests__/attach-keybindings.test.d.ts → core/__tests__/broker-extension-canvas-db-boundary.test.d.ts} +0 -0
  643. /package/dist/{clients/attach/__tests__/crtr-output-coverage.test.d.ts → core/__tests__/seam/broker-attach-multiclient.test.d.ts} +0 -0
  644. /package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.d.ts +0 -0
  645. /package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.d.ts +0 -0
  646. /package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.d.ts +0 -0
  647. /package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.d.ts +0 -0
  648. /package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.d.ts +0 -0
  649. /package/dist/{clients/attach/__tests__/editor-frame-title.test.d.ts → core/__tests__/seam/dormancy-release.test.d.ts} +0 -0
  650. /package/dist/{clients/attach/__tests__/input-controller-extension-command.test.d.ts → core/__tests__/seam/yield-refresh-transaction.test.d.ts} +0 -0
  651. /package/dist/core/__tests__/{broker-fork-seam.test.d.ts → serial/broker-fork-seam.test.d.ts} +0 -0
  652. /package/dist/core/__tests__/{broker-sdk-wiring.test.d.ts → serial/broker-sdk-wiring.test.d.ts} +0 -0
  653. /package/dist/core/__tests__/{broker-snapshot-history.test.d.ts → serial/broker-snapshot-history.test.d.ts} +0 -0
  654. /package/dist/core/__tests__/{command-plugins.test.d.ts → serial/command-plugins.test.d.ts} +0 -0
  655. /package/dist/core/__tests__/{deferred-no-wake.test.d.ts → serial/deferred-no-wake.test.d.ts} +0 -0
  656. /package/dist/core/__tests__/{flagship-lifecycle.test.d.ts → serial/flagship-lifecycle.test.d.ts} +0 -0
  657. /package/dist/core/__tests__/{host-teardown-process-group.test.d.ts → serial/host-teardown-process-group.test.d.ts} +0 -0
  658. /package/dist/core/__tests__/{human-deliver-e2e.test.d.ts → serial/human-deliver-e2e.test.d.ts} +0 -0
  659. /package/dist/core/__tests__/{live-mutation.test.d.ts → serial/live-mutation.test.d.ts} +0 -0
  660. /package/dist/core/__tests__/{refresh-stall-recycle.test.d.ts → serial/refresh-stall-recycle.test.d.ts} +0 -0
  661. /package/dist/core/__tests__/{revive.test.d.ts → serial/revive.test.d.ts} +0 -0
  662. /package/dist/core/__tests__/{spawn-root.test.d.ts → serial/spawn-root.test.d.ts} +0 -0
  663. /package/dist/core/__tests__/{subscription-delivery.test.d.ts → serial/subscription-delivery.test.d.ts} +0 -0
  664. /package/dist/core/__tests__/{tmux-surface.test.d.ts → serial/tmux-surface.test.d.ts} +0 -0
  665. /package/dist/core/__tests__/{worktree.test.d.ts → serial/worktree.test.d.ts} +0 -0
  666. /package/dist/{clients/attach/__tests__/markdown-headings.test.d.ts → core/__tests__/watchdog-abort-arms-retry.test.d.ts} +0 -0
  667. /package/dist/{clients/attach/__tests__/session-identity-refresh.test.d.ts → core/broker-client/__tests__/transport-socket.test.d.ts} +0 -0
  668. /package/dist/core/human/__tests__/{inbox-core.test.d.ts → serial/inbox-core.test.d.ts} +0 -0
  669. /package/dist/{clients/inbox/review/__tests__/remap.test.d.ts → daemon/api/__tests__/node-model-validation.test.d.ts} +0 -0
  670. /package/dist/{clients/surfaces/region.js → daemon/api/__tests__/review-terminal-conflict.test.d.ts} +0 -0
  671. /package/dist/daemon/api/__tests__/{full → seam}/api-server.test.d.ts +0 -0
  672. /package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.d.ts +0 -0
  673. /package/dist/{clients/web/__tests__/push-engine.test.d.ts → daemon/api/__tests__/seam/leaf-api-parity.test.d.ts} +0 -0
@@ -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;