@north-light/crouter 0.3.172 → 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} +106 -177
  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 +55 -0
  46. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +60 -0
  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
@@ -57,6 +57,7 @@ export const CONFIG_SETTINGS_COVERAGE = {
57
57
  description: 'Notify about crouter releases, install them automatically, or turn checks off.',
58
58
  valueConstraint: 'true|false|notify|apply; true stores notify',
59
59
  applies: 'Applies on the next crouter command.',
60
+ group: 'updates',
60
61
  order: 70,
61
62
  format: (config) => config.auto_update.crtr === false ? 'off' : config.auto_update.crtr,
62
63
  cycle: (config, delta) => { config.auto_update.crtr = cycleChoice(AUTO_UPDATE_MODES, config.auto_update.crtr, delta); },
@@ -74,6 +75,7 @@ export const CONFIG_SETTINGS_COVERAGE = {
74
75
  description: 'Notify about plugin and marketplace updates, apply them automatically, or turn checks off.',
75
76
  valueConstraint: 'false|notify|apply',
76
77
  applies: 'Applies on the next crouter command.',
78
+ group: 'updates',
77
79
  order: 80,
78
80
  format: (config) => config.auto_update.content === false ? 'off' : config.auto_update.content,
79
81
  cycle: (config, delta) => { config.auto_update.content = cycleChoice(AUTO_UPDATE_MODES, config.auto_update.content, delta); },
@@ -90,6 +92,7 @@ export const CONFIG_SETTINGS_COVERAGE = {
90
92
  description: 'Minimum hours between automatic update checks. Zero checks on every command.',
91
93
  valueConstraint: 'integer >= 0',
92
94
  applies: 'Applies on the next crouter command.',
95
+ group: 'updates',
93
96
  order: 90,
94
97
  format: (config) => `${config.auto_update.interval_hours}h`,
95
98
  cycle: (config, delta) => { config.auto_update.interval_hours = cycleNumber(UPDATE_INTERVAL_HOURS, config.auto_update.interval_hours, delta); },
@@ -111,6 +114,7 @@ export const CONFIG_SETTINGS_COVERAGE = {
111
114
  description: 'Maximum human-review panes placed in one tmux window before using another window.',
112
115
  valueConstraint: 'integer >= 1',
113
116
  applies: 'Applies to the next pane placement.',
117
+ group: 'panes',
114
118
  order: 20,
115
119
  format: (config) => String(config.max_panes_per_window),
116
120
  cycle: (config, delta) => { config.max_panes_per_window = cycleNumber(MAX_PANES, config.max_panes_per_window, delta); },
@@ -131,6 +135,7 @@ export const CONFIG_SETTINGS_COVERAGE = {
131
135
  description: 'Open each managed child beside its watched parent. Off keeps new children running in the background.',
132
136
  valueConstraint: 'true|false',
133
137
  applies: 'Applies to the next managed child created; independent roots still open their attended viewer.',
138
+ group: 'panes',
134
139
  order: 10,
135
140
  format: (config) => config.auto_open_child_viewers ? 'on' : 'off',
136
141
  cycle: (config) => { config.auto_open_child_viewers = !config.auto_open_child_viewers; },
@@ -152,6 +157,7 @@ export const CONFIG_SETTINGS_COVERAGE = {
152
157
  description: 'Ring a short sound when the node in an attached viewer finishes a turn.',
153
158
  valueConstraint: 'true|false',
154
159
  applies: 'Applies on the next turn end.',
160
+ group: 'display',
155
161
  order: 40,
156
162
  format: (config) => config.completion_bell ? 'on' : 'off',
157
163
  cycle: (config) => { config.completion_bell = !config.completion_bell; },
@@ -173,6 +179,7 @@ export const CONFIG_SETTINGS_COVERAGE = {
173
179
  description: 'Play the whip animation when you send a prompt and when an automatically opened child viewer starts.',
174
180
  valueConstraint: 'true|false',
175
181
  applies: 'Applies on the next attach.',
182
+ group: 'display',
176
183
  order: 39,
177
184
  format: (config) => config.whip_mode ? 'on' : 'off',
178
185
  cycle: (config) => { config.whip_mode = !config.whip_mode; },
@@ -194,6 +201,7 @@ export const CONFIG_SETTINGS_COVERAGE = {
194
201
  description: 'Initial mouse wheel scrolling for each attached viewer.',
195
202
  valueConstraint: MOUSE_MODE_DEFAULTS.join('|'),
196
203
  applies: 'Applies on the next attach.',
204
+ group: 'display',
197
205
  order: 38,
198
206
  format: (config) => config.mouse_mode_default === 'tmux' ? 'follow tmux' : config.mouse_mode_default,
199
207
  cycle: (config, delta) => { config.mouse_mode_default = cycleChoice(MOUSE_MODE_DEFAULTS, config.mouse_mode_default, delta); },
@@ -213,6 +221,7 @@ export const CONFIG_SETTINGS_COVERAGE = {
213
221
  description: 'Trailing refresh cycles rendered at full fidelity; older cycles condense to text.',
214
222
  valueConstraint: 'integer >= 1',
215
223
  applies: 'Applies on the next attach.',
224
+ group: 'display',
216
225
  order: 50,
217
226
  format: (config) => String(config.live_cycles),
218
227
  cycle: (config, delta) => { config.live_cycles = cycleNumber(LIVE_CYCLES, config.live_cycles, delta); },
@@ -233,6 +242,7 @@ export const CONFIG_SETTINGS_COVERAGE = {
233
242
  description: 'Messages retained from condensed cycles. Tool calls are never kept.',
234
243
  valueConstraint: CONDENSED_HISTORY_MODES.join('|'),
235
244
  applies: 'Applies on the next attach.',
245
+ group: 'display',
236
246
  order: 60,
237
247
  format: (config) => config.condensed_history,
238
248
  cycle: (config, delta) => { config.condensed_history = cycleChoice(CONDENSED_HISTORY_MODES, config.condensed_history, delta); },
@@ -252,6 +262,7 @@ export const CONFIG_SETTINGS_COVERAGE = {
252
262
  description: 'Fold every settled tool call to its call line. Toggle live with /fold-tools.',
253
263
  valueConstraint: 'true|false',
254
264
  applies: 'Applies on the next attach.',
265
+ group: 'display',
255
266
  order: 30,
256
267
  format: (config) => config.fold_finished_tools ? 'on' : 'off',
257
268
  cycle: (config) => { config.fold_finished_tools = !config.fold_finished_tools; },
@@ -272,6 +283,7 @@ export const CONFIG_SETTINGS_COVERAGE = {
272
283
  description: 'Replace completed folded tool-call groups with a one-line broker summary when available.',
273
284
  valueConstraint: 'true|false',
274
285
  applies: 'Applies when the next visible message closes a tool-call group.',
286
+ group: 'display',
275
287
  order: 35,
276
288
  format: (config) => config.summarize_tool_calls ? 'on' : 'off',
277
289
  cycle: (config) => { config.summarize_tool_calls = !config.summarize_tool_calls; },
@@ -292,6 +304,7 @@ export const CONFIG_SETTINGS_COVERAGE = {
292
304
  description: 'Show each memory read and edited file in folded tool recaps. Off shows a compact count line instead.',
293
305
  valueConstraint: 'true|false',
294
306
  applies: 'Applies on the next attach.',
307
+ group: 'display',
295
308
  order: 36,
296
309
  format: (config) => config.detailed_tool_recaps ? 'on' : 'off',
297
310
  cycle: (config) => { config.detailed_tool_recaps = !config.detailed_tool_recaps; },
@@ -327,8 +340,12 @@ function collectUserSettings() {
327
340
  }
328
341
  return out.sort((a, b) => a.order - b.order);
329
342
  }
330
- /** The single row registry shared by `sys setup` and `sys config set`. */
343
+ /** The single row registry shared by `sys settings` and `sys config set`. */
331
344
  export const USER_SETTINGS = collectUserSettings();
332
345
  export function findUserSetting(key) {
333
346
  return USER_SETTINGS.find((setting) => setting.key === key);
334
347
  }
348
+ /** The rows one settings destination owns, in registry order. */
349
+ export function userSettingsInGroup(group) {
350
+ return USER_SETTINGS.filter((setting) => setting.group === group);
351
+ }
@@ -0,0 +1,134 @@
1
+ import { after, before, beforeEach, test } from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
4
+ import { tmpdir } from 'node:os';
5
+ import { join } from 'node:path';
6
+ import { createNode, getNode, listNodes } from '../../../core/canvas/canvas.js';
7
+ import { closeDb } from '../../../core/canvas/db.js';
8
+ import { CrtrError } from '../../../core/errors.js';
9
+ import { handleConfig, handleCreate, handlePromote, handleYield } from '../handlers/nodes.js';
10
+ const previousCrtrHome = process.env['CRTR_HOME'];
11
+ let home = '';
12
+ before(() => {
13
+ closeDb();
14
+ home = mkdtempSync(join(tmpdir(), 'crtr-node-model-validation-'));
15
+ process.env['CRTR_HOME'] = home;
16
+ });
17
+ beforeEach(() => {
18
+ closeDb();
19
+ rmSync(home, { recursive: true, force: true });
20
+ mkdirSync(home, { recursive: true });
21
+ });
22
+ after(() => {
23
+ closeDb();
24
+ rmSync(home, { recursive: true, force: true });
25
+ if (previousCrtrHome === undefined)
26
+ delete process.env['CRTR_HOME'];
27
+ else
28
+ process.env['CRTR_HOME'] = previousCrtrHome;
29
+ });
30
+ function node(id, cwd = home) {
31
+ return {
32
+ node_id: id,
33
+ name: id,
34
+ created: new Date().toISOString(),
35
+ cwd,
36
+ kind: 'developer',
37
+ mode: 'base',
38
+ lifecycle: 'terminal',
39
+ status: 'active',
40
+ parent: null,
41
+ profile_id: null,
42
+ launch: { model: 'anthropic/original', extensions: [], env: {} },
43
+ };
44
+ }
45
+ function ctx(method, path, id, body) {
46
+ return {
47
+ method,
48
+ path,
49
+ params: { id },
50
+ query: new URLSearchParams(),
51
+ body,
52
+ };
53
+ }
54
+ const missingRegistry = {
55
+ find: () => undefined,
56
+ hasConfiguredAuth: () => false,
57
+ };
58
+ async function rejectsUnregistered(action) {
59
+ await assert.rejects(action, (error) => {
60
+ assert.ok(error instanceof CrtrError);
61
+ assert.equal(error.code, 'usage');
62
+ assert.match(error.message, /openai-codex\/fast/);
63
+ return true;
64
+ });
65
+ }
66
+ test('create rejects an unregistered concrete model before creating a node row', async () => {
67
+ const beforeRows = listNodes().length;
68
+ const ctx = {
69
+ method: 'POST',
70
+ path: '/v1/nodes',
71
+ params: {},
72
+ query: new URLSearchParams(),
73
+ body: {
74
+ kind: 'developer',
75
+ root: true,
76
+ profile: null,
77
+ cwd: home,
78
+ prompt: 'must never launch',
79
+ model: 'openai-codex/fast',
80
+ },
81
+ };
82
+ await assert.rejects(() => handleCreate(ctx, { modelRegistry: missingRegistry }), (error) => {
83
+ assert.ok(error instanceof CrtrError);
84
+ assert.equal(error.code, 'usage');
85
+ assert.match(error.message, /openai-codex\/fast/);
86
+ assert.match(error.details?.['next'], /ultra\|strong\|medium\|light/);
87
+ return true;
88
+ });
89
+ assert.equal(listNodes().length, beforeRows);
90
+ });
91
+ test('promote and yield reject unregistered model recipes before reshaping the node', async () => {
92
+ for (const operation of ['promote', 'yield']) {
93
+ const id = `${operation}-model`;
94
+ createNode(node(id));
95
+ const before = getNode(id);
96
+ const request = ctx('POST', `/v1/nodes/${id}/${operation}`, id, { model: 'openai-codex/fast' });
97
+ await rejectsUnregistered(() => operation === 'promote'
98
+ ? handlePromote(request, { modelRegistry: missingRegistry })
99
+ : handleYield(request, { modelRegistry: missingRegistry }));
100
+ const after = getNode(id);
101
+ assert.equal(after?.model_override, before?.model_override, `${operation} did not persist the rejected override`);
102
+ assert.deepEqual(after?.launch, before?.launch, `${operation} did not rewrite the launch recipe`);
103
+ assert.equal(after?.mode, before?.mode, `${operation} did not reshape the node`);
104
+ }
105
+ });
106
+ test('config normalizes portable models against the target node scope', async () => {
107
+ const cwd = join(home, 'target-project');
108
+ mkdirSync(join(cwd, '.crouter'), { recursive: true });
109
+ writeFileSync(join(cwd, '.crouter', 'config.json'), JSON.stringify({
110
+ modelLadders: {
111
+ anthropic: {
112
+ ultra: 'target-anthropic/a-ultra',
113
+ strong: 'target-anthropic/a-strong',
114
+ medium: 'target-anthropic/a-medium',
115
+ light: 'target-anthropic/a-light',
116
+ },
117
+ openai: {
118
+ ultra: 'target-openai/o-ultra',
119
+ strong: 'target-openai/o-strong',
120
+ medium: 'target-openai/o-medium',
121
+ light: 'target-openai/o-light',
122
+ },
123
+ },
124
+ }));
125
+ const id = 'target-scope-model';
126
+ createNode(node(id, cwd));
127
+ const registry = {
128
+ find: (providerId, modelId) => providerId === 'target-openai' && modelId === 'o-strong' ? { providerId, modelId } : undefined,
129
+ hasConfiguredAuth: () => false,
130
+ };
131
+ await handleConfig(ctx('PATCH', `/v1/nodes/${id}/config`, id, { model: 'openai/strong' }), { modelRegistry: registry });
132
+ assert.equal(getNode(id)?.model_override, 'target-openai/o-strong');
133
+ assert.equal(getNode(id)?.launch?.model, 'target-openai/o-strong');
134
+ });
@@ -0,0 +1,98 @@
1
+ import assert from 'node:assert/strict';
2
+ import { mkdtempSync, rmSync } from 'node:fs';
3
+ import { tmpdir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ import { test } from 'node:test';
6
+ import { closeDb, openDb } from '../../../core/canvas/db.js';
7
+ import { reviewResultPath } from '../../../core/canvas/paths.js';
8
+ import { toErrorBody } from '../map.js';
9
+ import { reviewCommentRoutes } from '../handlers/review-comments.js';
10
+ test('comment create reports the terminal review winner', async () => {
11
+ const home = mkdtempSync(join(tmpdir(), 'crtr-review-terminal-conflict-'));
12
+ const previousHome = process.env['CRTR_HOME'];
13
+ process.env['CRTR_HOME'] = home;
14
+ try {
15
+ const route = reviewCommentRoutes.find((candidate) => candidate.method === 'POST' && candidate.pattern === '/v1/human/reviews/:review_id/comments');
16
+ assert.ok(route, 'the canonical comment-create route is registered');
17
+ for (const terminal of [
18
+ {
19
+ state: 'canceled',
20
+ terminalColumns: ['2026-01-02T00:00:00.000Z', null, null, null, null, 'out of band cancel', 'human'],
21
+ terminalDTO: {
22
+ canceled_at: '2026-01-02T00:00:00.000Z',
23
+ cancel_reason: 'out of band cancel',
24
+ cancel_actor: 'human',
25
+ },
26
+ },
27
+ {
28
+ state: 'approved',
29
+ terminalColumns: [null, '2026-01-03T00:00:00.000Z', 1, 2, 1, null, null],
30
+ terminalDTO: {
31
+ approved_at: '2026-01-03T00:00:00.000Z',
32
+ changed: true,
33
+ comments_total: 2,
34
+ comments_unresolved: 1,
35
+ },
36
+ },
37
+ ]) {
38
+ const reviewId = `${terminal.state}-review`;
39
+ openDb().prepare(`
40
+ INSERT INTO reviews
41
+ (review_id, idempotency_key, origin_kind, origin_node_id, companion_node_id, review_dir,
42
+ file, origin_session_file, origin_session_id, origin_leaf_id, model_spec, branch_file,
43
+ baseline_sha256, baseline_bytes, anchor_base_sha256, anchor_base_bytes, state, created, captured_at,
44
+ canceled_at, approved_at, changed, comments_total, comments_unresolved, cancel_reason, cancel_actor)
45
+ VALUES (?, ?, 'inline', 'origin', ?, '/tmp/review', '/tmp/source.md',
46
+ '/tmp/session.jsonl', 'session', 'leaf', 'anthropic/claude', '/tmp/branch.jsonl',
47
+ 'baseline', 4, 'baseline', ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
48
+ `).run(reviewId, `idempotency-${reviewId}`, `${terminal.state}-companion`, Buffer.from('base'), terminal.state, '2026-01-01T00:00:00.000Z', '2026-01-01T00:00:00.000Z', ...terminal.terminalColumns);
49
+ let thrown;
50
+ try {
51
+ await route.handler({
52
+ method: 'POST',
53
+ path: `/v1/human/reviews/${reviewId}/comments`,
54
+ params: { review_id: reviewId },
55
+ query: new URLSearchParams(),
56
+ body: {
57
+ text: 'late comment',
58
+ anchor: { line: 1, end_line: 1 },
59
+ doc_hash: 'a'.repeat(64),
60
+ actor_node_id: null,
61
+ },
62
+ });
63
+ }
64
+ catch (error) {
65
+ thrown = error;
66
+ }
67
+ const { status, body } = toErrorBody(thrown);
68
+ assert.equal(status, 409);
69
+ assert.equal(body.error.code, 'review_terminal_conflict');
70
+ assert.deepEqual(body.error.details, {
71
+ state: terminal.state,
72
+ requested: 'comment',
73
+ review: {
74
+ review_id: reviewId,
75
+ origin_kind: 'inline',
76
+ origin_node_id: 'origin',
77
+ bridge_node_id: null,
78
+ companion_node_id: `${terminal.state}-companion`,
79
+ file: '/tmp/source.md',
80
+ state: terminal.state,
81
+ created: '2026-01-01T00:00:00.000Z',
82
+ source_missing: true,
83
+ anchor_base_sha256: 'baseline',
84
+ ...terminal.terminalDTO,
85
+ ...(terminal.state === 'approved' ? { result_path: reviewResultPath(reviewId) } : {}),
86
+ },
87
+ });
88
+ }
89
+ }
90
+ finally {
91
+ closeDb();
92
+ rmSync(home, { recursive: true, force: true });
93
+ if (previousHome === undefined)
94
+ delete process.env['CRTR_HOME'];
95
+ else
96
+ process.env['CRTR_HOME'] = previousHome;
97
+ }
98
+ });
@@ -1,16 +1,14 @@
1
- // Run with: node --import tsx/esm --test src/daemon/api/__tests__/full/api-server.test.ts
1
+ // Run with: node --import tsx/esm --test src/daemon/api/__tests__/seam/api-server.test.ts
2
2
  //
3
3
  // A-11 — the Stage-A acceptance gate for the crtrd API server (spec §10, plan
4
4
  // §Stage A). Proves A1–A8: the `CrtrClient` HTTP+WS transport drives the FULL
5
5
  // server → router → handlers → bridge stack over the real unix socket, against a
6
6
  // CRTR_HOME-isolated crtrd, with a fake broker engine (zero LLM cost).
7
7
  //
8
- // FULL TIER (real-boot-bound): this file lives in `__tests__/full/` so the
9
- // runner (scripts/test-runner.mjs, `file.includes('/__tests__/full/')`) gives it
10
- // the 30s-per-test / CI-only tier, exactly like the tmux-free
11
- // `src/core/__tests__/full/broker-attach-stream.test.ts` precedent. It is
12
- // tmux-free (createHeadlessHarness) but boots REAL broker processes, so it is NOT
13
- // on the fast local loop.
8
+ // COMPILED SEAM (real-boot-bound): this file lives in `__tests__/seam/`, so
9
+ // `npm run test:seam` runs it from emitted JavaScript with the other real broker
10
+ // and tmux journeys. It is tmux-free (createHeadlessHarness) but boots REAL
11
+ // broker processes, so it is outside the ordinary local loop.
14
12
  //
15
13
  // APPROACH (see this node's a11-plan.md): the harness stands in for crtrd
16
14
  // (in-process superviseTick, fake-live-daemon pidfile, isolated CRTR_HOME + the
@@ -29,8 +27,7 @@ import { test, before, after } from 'node:test';
29
27
  import assert from 'node:assert/strict';
30
28
  import { statSync, existsSync, readFileSync, mkdtempSync, rmSync, mkdirSync, writeFileSync } from 'node:fs';
31
29
  import { tmpdir } from 'node:os';
32
- import { join, dirname, resolve } from 'node:path';
33
- import { fileURLToPath } from 'node:url';
30
+ import { join, dirname } from 'node:path';
34
31
  import WebSocket from 'ws';
35
32
  import { createHeadlessHarness } from '../../../../core/__tests__/helpers/harness.js';
36
33
  import { createAttachKit } from '../../../../core/__tests__/helpers/broker-clients.js';
@@ -331,42 +328,3 @@ test('files/peek: 400-usage (missing + relative) and 404 error mapping', async (
331
328
  await assert.rejects(client.peekFile('relative/not/absolute.txt'), (e) => e instanceof ApiError && e.status === 400 && e.code === 'usage', 'relative path → 400 usage');
332
329
  await assert.rejects(client.peekFile(join(tmpdir(), 'crtr-peek-does-not-exist-xyz', 'nope.txt')), (e) => e instanceof ApiError && e.status === 404 && e.code === 'not_found', 'nonexistent absolute path → 404 not_found');
333
330
  });
334
- // ---------------------------------------------------------------------------
335
- // A7 — emitted dist/api/index.js require-graph reaches zero dist/core/* /
336
- // dist/clients/*. Static assertion against the EMITTED output — requires a
337
- // prior `npm run build`.
338
- // ---------------------------------------------------------------------------
339
- test('A7: emitted dist/api/index.js import graph reaches no dist/core/* or dist/clients/*', () => {
340
- const ROOT = fileURLToPath(new URL('../../../../../', import.meta.url)); // repo root
341
- const entry = join(ROOT, 'dist', 'api', 'index.js');
342
- if (!existsSync(entry)) {
343
- assert.fail(`dist/api/index.js is missing — run \`npm run build\` before this test (A7 checks emitted output)`);
344
- }
345
- // Walk the transitive graph over LOCAL relative imports/exports only. Node
346
- // built-ins and bare-specifier deps are irrelevant to the CLI/core purity
347
- // boundary; any reach into dist/core or dist/clients would surface as a
348
- // relative `../core/...` / `../clients/...` specifier resolving into those
349
- // trees.
350
- const spec = /(?:from|import)\s*['"](\.[^'"]+)['"]/g;
351
- const seen = new Set();
352
- const stack = [entry];
353
- while (stack.length > 0) {
354
- const file = stack.pop();
355
- if (seen.has(file))
356
- continue;
357
- seen.add(file);
358
- let src;
359
- try {
360
- src = readFileSync(file, 'utf8');
361
- }
362
- catch {
363
- continue; // a .d.ts-only or absent sibling — not part of the runtime graph
364
- }
365
- for (let m = spec.exec(src); m !== null; m = spec.exec(src)) {
366
- stack.push(resolve(dirname(file), m[1]));
367
- }
368
- }
369
- const leaks = [...seen].filter((f) => f.includes('/dist/core/') || f.includes('/dist/clients/'));
370
- assert.deepEqual(leaks, [], `dist/api must not reach dist/core/* or dist/clients/* — leaked into:\n${leaks.join('\n')}`);
371
- assert.ok(seen.size > 1, 'the graph walk actually followed dist/api imports (sanity)');
372
- });
@@ -1,4 +1,4 @@
1
- // Run with: node --import tsx/esm --test src/daemon/api/__tests__/full/b10-attach-modelauth.test.ts
1
+ // Run with: node --import tsx/esm --test src/daemon/api/__tests__/seam/b10-attach-modelauth.test.ts
2
2
  //
3
3
  // B-10 acceptance gate (spec §7.2 surface-attach hybrid + §7.6 model-auth
4
4
  // install). Proves spec acceptance **B2** for the two client swaps this batch
@@ -14,10 +14,9 @@
14
14
  // /model-auth/{provider}): collection stays client-side; the route persists
15
15
  // the credential to auth.json, which crtrd's mtime watcher fans as
16
16
  // `reload_auth` to live brokers. B2 shape: auth.json write (assert content) +
17
- // the reload FAN (assert the reloadAuthLive RPC acks against a live broker) +
18
- // old-path vs API-path STRUCTURAL PARITY (byte-identical auth.json).
17
+ // the reload FAN (assert the reloadAuthLive RPC acks against a live broker).
19
18
  //
20
- // FULL TIER (real-boot-bound): lives in `__tests__/full/` for the 30s-per-test /
19
+ // COMPILED SEAM (real-boot-bound): lives in `__tests__/seam/` for the 30s-per-test /
21
20
  // CI-only tier, exactly like api-server.test.ts (the A-11 sibling). tmux-free
22
21
  // (createHeadlessHarness) but boots REAL broker processes with the fake engine
23
22
  // (zero LLM cost). Reuses A-11's approach: createApiServer() in-process binds the
@@ -117,7 +116,7 @@ test('B2-attach: ensureAttach revives a dormant node, snapshot streams, detach l
117
116
  // reload FAN acks against a live broker, and the API path is byte-identical to
118
117
  // the old direct-write path.
119
118
  // ---------------------------------------------------------------------------
120
- test('B2-modelauth: installCredential writes auth.json, the reload fan acks a live broker, API path == old path', async () => {
119
+ test('B2-modelauth: installCredential writes auth.json and the reload fan acks a live broker', async () => {
121
120
  // Sandbox pi's credential store so the write lands in a throwaway dir, never the
122
121
  // developer's real ~/.pi/agent/auth.json. authPath() honors PI_CODING_AGENT_DIR.
123
122
  const savedPiDir = process.env['PI_CODING_AGENT_DIR'];
@@ -142,19 +141,6 @@ test('B2-modelauth: installCredential writes auth.json, the reload fan acks a li
142
141
  // watcher invokes after this write; the mtime poll itself is crtrd-internal
143
142
  // and out of B-10's scope — see the honest-proxy note in the header). ---
144
143
  await assert.doesNotReject(reloadAuthLive(liveId), 'reloadAuthLive resolves — the live broker acked the reload_auth fan after the auth.json write');
145
- // --- STRUCTURAL PARITY: the old path (setup.ts wrote directly via
146
- // a direct credential write to authPath()). Write
147
- // that same credential into a second sandbox and assert byte-identical
148
- // auth.json — the API swap changed the CALLER, not the on-disk structure. ---
149
- const oldDir = mkdtempSync(join(tmpdir(), 'crtr-b10-old-'));
150
- try {
151
- await setAuthCredential('anthropic', { type: 'api_key', key: 'sk-b10-test-key' }, join(oldDir, 'auth.json'));
152
- const oldContents = readFileSync(join(oldDir, 'auth.json'), 'utf8');
153
- assert.equal(apiContents, oldContents, 'API-path auth.json is byte-identical to the old direct-write path (structural parity)');
154
- }
155
- finally {
156
- rmSync(oldDir, { recursive: true, force: true });
157
- }
158
144
  }
159
145
  finally {
160
146
  if (savedPiDir === undefined)
@@ -167,15 +153,12 @@ test('B2-modelauth: installCredential writes auth.json, the reload fan acks a li
167
153
  // ---------------------------------------------------------------------------
168
154
  // B2 (model-auth, oauth) — non-managed OAuth install must PRESERVE
169
155
  // provider-specific extra credential fields (e.g. github-copilot's
170
- // `enterpriseUrl`, load-bearing for enterprise routing/refresh). OLD
171
- // `AuthStorage.login` spread the FULL credential object; the API swap forwards
172
- // non-standard keys through `extra` and the handler re-spreads them. Regression
173
- // guard for review M1 (a dropped enterpriseUrl breaks GitHub-Enterprise Copilot).
174
- // Parity here is STRUCTURAL (parsed deep-equal), not byte-identical: the
175
- // extra-then-tokens spread order legitimately differs from OLD's credential key
176
- // order, but the stored credential is the same object.
156
+ // `enterpriseUrl`, load-bearing for enterprise routing/refresh). The client
157
+ // forwards non-standard keys through `extra` and the handler re-spreads them.
158
+ // Regression guard for review M1 (a dropped enterpriseUrl breaks
159
+ // GitHub-Enterprise Copilot).
177
160
  // ---------------------------------------------------------------------------
178
- test('B2-modelauth-oauth: installCredential(oauth) preserves extra fields (enterpriseUrl) — structural parity with OLD login spread', async () => {
161
+ test('B2-modelauth-oauth: installCredential(oauth) preserves extra fields (enterpriseUrl)', async () => {
179
162
  const savedPiDir = process.env['PI_CODING_AGENT_DIR'];
180
163
  const apiDir = mkdtempSync(join(tmpdir(), 'crtr-b10-oauth-api-'));
181
164
  process.env['PI_CODING_AGENT_DIR'] = apiDir;
@@ -192,24 +175,14 @@ test('B2-modelauth-oauth: installCredential(oauth) preserves extra fields (enter
192
175
  const apiContents = readFileSync(join(apiDir, 'auth.json'), 'utf8');
193
176
  assert.ok(apiContents.includes('enterpriseUrl'), 'enterpriseUrl key survived the swap (M1 regression guard)');
194
177
  assert.ok(apiContents.includes('ghe.example.com'), 'the enterprise domain value is preserved');
195
- // OLD path: the login persist wrote { type:'oauth', ...credentials } —
196
- // spreading the FULL credential (tokens + enterpriseUrl + availableModelIds).
197
- const oldDir = mkdtempSync(join(tmpdir(), 'crtr-b10-oauth-old-'));
198
- try {
199
- await setAuthCredential('github-copilot', {
200
- type: 'oauth',
201
- access: 'gho-access-xyz',
202
- refresh: 'ghr-refresh-xyz',
203
- expires: expiresMs,
204
- enterpriseUrl: 'https://ghe.example.com',
205
- availableModelIds: ['gpt-4o'],
206
- }, join(oldDir, 'auth.json'));
207
- const oldContents = readFileSync(join(oldDir, 'auth.json'), 'utf8');
208
- assert.deepEqual(JSON.parse(apiContents), JSON.parse(oldContents), 'oauth API-path auth.json is structurally identical to the OLD full-spread login path (no field dropped)');
209
- }
210
- finally {
211
- rmSync(oldDir, { recursive: true, force: true });
212
- }
178
+ assert.deepEqual(JSON.parse(apiContents)['github-copilot'], {
179
+ type: 'oauth',
180
+ enterpriseUrl: 'https://ghe.example.com',
181
+ availableModelIds: ['gpt-4o'],
182
+ access: 'gho-access-xyz',
183
+ refresh: 'ghr-refresh-xyz',
184
+ expires: expiresMs,
185
+ }, 'the stored oauth credential carries the tokens AND every extra field');
213
186
  }
214
187
  finally {
215
188
  if (savedPiDir === undefined)