@north-light/crouter 0.3.173 → 0.3.175

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (674) hide show
  1. package/bin/runtime-selector.mjs +8 -1
  2. package/dist/api/__tests__/{client.test.js → serial/client.test.js} +2 -135
  3. package/dist/api/client.d.ts +12 -21
  4. package/dist/api/client.js +22 -31
  5. package/dist/api/dto/broker-ops.d.ts +158 -0
  6. package/dist/api/dto/broker-ops.js +6 -0
  7. package/dist/api/dto/crons.d.ts +6 -0
  8. package/dist/api/dto/human.d.ts +7 -1
  9. package/dist/api/dto/inbox.d.ts +1 -71
  10. package/dist/api/dto/inbox.js +1 -9
  11. package/dist/api/dto/nodes.d.ts +6 -7
  12. package/dist/api/dto/reviews.d.ts +1 -11
  13. package/dist/api/routes.d.ts +7 -4
  14. package/dist/api/routes.js +8 -5
  15. package/dist/build-root.js +3 -3
  16. package/dist/builtin-memory/04-base-worker.md +1 -4
  17. package/dist/builtin-memory/05-kinds/advisor/00-base.md +1 -5
  18. package/dist/builtin-memory/05-kinds/advisor/01-orchestrator.md +2 -7
  19. package/dist/builtin-memory/05-kinds/design/00-base.md +1 -6
  20. package/dist/builtin-memory/05-kinds/developer/00-base.md +1 -6
  21. package/dist/builtin-memory/05-kinds/explore/00-base.md +1 -4
  22. package/dist/builtin-memory/05-kinds/explore/01-orchestrator.md +1 -2
  23. package/dist/builtin-memory/05-kinds/general/00-base.md +1 -3
  24. package/dist/builtin-memory/05-kinds/plan/00-base.md +1 -6
  25. package/dist/builtin-memory/05-kinds/plan/reviewers/00-base.md +1 -2
  26. package/dist/builtin-memory/05-kinds/plan/reviewers/architecture-fit.md +1 -3
  27. package/dist/builtin-memory/05-kinds/plan/reviewers/code-smells.md +1 -3
  28. package/dist/builtin-memory/05-kinds/plan/reviewers/pattern-consistency.md +1 -3
  29. package/dist/builtin-memory/05-kinds/plan/reviewers/requirements-coverage.md +1 -3
  30. package/dist/builtin-memory/05-kinds/plan/reviewers/security.md +1 -4
  31. package/dist/builtin-memory/05-kinds/review/companion/00-base.md +2 -3
  32. package/dist/builtin-memory/05-kinds/spec/00-base.md +1 -2
  33. package/dist/builtin-memory/advisor/council.md +1 -6
  34. package/dist/builtin-memory/design.md +2 -7
  35. package/dist/builtin-memory/development.md +9 -14
  36. package/dist/builtin-memory/internal/marketplaces.md +2 -6
  37. package/dist/builtin-memory/internal/nodes-and-canvas.md +1 -1
  38. package/dist/builtin-memory/internal/plugins.md +2 -8
  39. package/dist/builtin-memory/internal/storage-tiers.md +1 -2
  40. package/dist/builtin-memory/testing.md +41 -0
  41. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/{provider-rotation.test.ts → serial/provider-rotation.test.ts} +27 -179
  42. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/claude-plugin-commands.ts +5 -15
  43. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/index.ts +1 -28
  44. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/memory-slash-commands.ts +43 -88
  45. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.js +7 -1
  46. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +9 -1
  47. package/dist/cli.js +2 -2
  48. package/dist/clients/attach/__tests__/attach-remote-readonly.test.js +37 -131
  49. package/dist/clients/attach/__tests__/chat-view-snapshot-ordering.test.js +71 -152
  50. package/dist/clients/attach/__tests__/context-message.test.js +16 -174
  51. package/dist/clients/attach/__tests__/crtr-output.test.js +36 -2069
  52. package/dist/clients/attach/__tests__/diagram.test.js +2 -2
  53. package/dist/clients/attach/__tests__/edit-diff.test.js +0 -4
  54. package/dist/clients/attach/__tests__/file-review-focus.test.js +2 -1
  55. package/dist/clients/attach/__tests__/group-activity.test.js +40 -229
  56. package/dist/clients/attach/__tests__/oauth-dialog-lifecycle.test.js +26 -76
  57. package/dist/clients/attach/__tests__/prompt-preview.test.js +4 -70
  58. package/dist/clients/attach/__tests__/ref-autocomplete.test.js +11 -125
  59. package/dist/clients/attach/__tests__/titled-editor-preview.test.js +14 -205
  60. package/dist/clients/attach/command.d.ts +2 -1
  61. package/dist/clients/attach/command.js +81 -76
  62. package/dist/clients/attach/input/capabilities.d.ts +27 -0
  63. package/dist/clients/attach/input/capabilities.js +96 -0
  64. package/dist/clients/attach/input/controller.d.ts +20 -182
  65. package/dist/clients/attach/input/controller.js +128 -537
  66. package/dist/clients/attach/input/overlay-owner.d.ts +41 -0
  67. package/dist/clients/attach/input/overlay-owner.js +199 -0
  68. package/dist/clients/attach/overlays/file-review.d.ts +0 -4
  69. package/dist/clients/attach/overlays/file-review.js +13 -5
  70. package/dist/clients/attach/overlays/graph.js +2 -10
  71. package/dist/clients/attach/render/chat-view.d.ts +4 -3
  72. package/dist/clients/attach/render/chat-view.js +39 -33
  73. package/dist/clients/attach/render/group-activity.d.ts +1 -0
  74. package/dist/clients/attach/render/group-activity.js +20 -13
  75. package/dist/clients/attach/render/group-recap.js +12 -3
  76. package/dist/clients/attach/session/connection.js +9 -15
  77. package/dist/clients/attach/session/editor-inventory.d.ts +6 -5
  78. package/dist/clients/attach/session/editor-inventory.js +7 -8
  79. package/dist/clients/attach/session/file-links.d.ts +13 -0
  80. package/dist/clients/attach/session/file-links.js +107 -0
  81. package/dist/clients/attach/session/frame.d.ts +3 -0
  82. package/dist/clients/attach/session/frame.js +10 -1
  83. package/dist/clients/attach/session/frames.js +2 -3
  84. package/dist/clients/attach/session/input-wiring.d.ts +4 -1
  85. package/dist/clients/attach/session/input-wiring.js +15 -14
  86. package/dist/clients/attach/session/mouse.d.ts +6 -1
  87. package/dist/clients/attach/session/mouse.js +8 -5
  88. package/dist/clients/attach/session/profile-files.js +18 -12
  89. package/dist/clients/attach/session/reconnect.js +1 -1
  90. package/dist/clients/attach/session/state-sync.js +1 -2
  91. package/dist/clients/attach/session/surface-host.d.ts +3 -2
  92. package/dist/clients/attach/session/surface-host.js +4 -4
  93. package/dist/clients/attach/slash/dispatch.d.ts +8 -31
  94. package/dist/clients/attach/slash/dispatch.js +34 -81
  95. package/dist/clients/attach/viewer.js +820 -860
  96. package/dist/clients/conversation/projection.d.ts +79 -0
  97. package/dist/clients/conversation/projection.js +341 -0
  98. package/dist/clients/inbox/__tests__/serial/inbox-controller.test.js +159 -0
  99. package/dist/clients/inbox/__tests__/serial/mount-panel.test.js +151 -0
  100. package/dist/clients/inbox/controller.d.ts +0 -4
  101. package/dist/clients/inbox/controller.js +0 -2
  102. package/dist/clients/inbox/review/__tests__/review-core.test.js +4 -293
  103. package/dist/clients/inbox/review/__tests__/teardown-notice.test.js +100 -0
  104. package/dist/clients/inbox/review/comments-client.d.ts +3 -2
  105. package/dist/clients/inbox/review/comments-client.js +12 -12
  106. package/dist/clients/inbox/review/companion-pane.d.ts +30 -0
  107. package/dist/clients/inbox/review/companion-pane.js +86 -0
  108. package/dist/clients/inbox/review/document-surface.d.ts +182 -0
  109. package/dist/clients/inbox/review/{document-region.js → document-surface.js} +252 -48
  110. package/dist/clients/inbox/review/frame.js +5 -4
  111. package/dist/clients/inbox/review/launch.d.ts +8 -8
  112. package/dist/clients/inbox/review/launch.js +52 -92
  113. package/dist/clients/inbox/review/nvim.d.ts +2 -0
  114. package/dist/clients/inbox/review/nvim.js +14 -12
  115. package/dist/clients/inbox/review/review-client.d.ts +12 -8
  116. package/dist/clients/inbox/review/review-client.js +46 -35
  117. package/dist/clients/inbox/review-adapter.d.ts +3 -10
  118. package/dist/clients/inbox/review-adapter.js +27 -19
  119. package/dist/clients/inbox/surface.d.ts +0 -4
  120. package/dist/clients/inbox/surface.js +0 -2
  121. package/dist/clients/surfaces/host.d.ts +11 -3
  122. package/dist/commands/__tests__/api-client-cold-start-diagnostic.test.js +7 -34
  123. package/dist/commands/__tests__/human.test.js +11 -322
  124. package/dist/commands/api-client.d.ts +5 -5
  125. package/dist/commands/api-client.js +6 -85
  126. package/dist/commands/canvas-browse.js +3 -29
  127. package/dist/commands/canvas-config.js +1 -1
  128. package/dist/commands/canvas-use.js +3 -3
  129. package/dist/commands/canvas.js +1 -1
  130. package/dist/commands/cron.js +5 -1
  131. package/dist/commands/human/queue.d.ts +0 -4
  132. package/dist/commands/human/queue.js +7 -40
  133. package/dist/commands/memory/list.d.ts +14 -0
  134. package/dist/commands/memory/list.js +35 -31
  135. package/dist/commands/memory/read.d.ts +7 -0
  136. package/dist/commands/memory/read.js +14 -8
  137. package/dist/commands/memory/write.js +13 -12
  138. package/dist/commands/node/bash.d.ts +1 -0
  139. package/dist/commands/node/bash.js +198 -0
  140. package/dist/commands/node/create.d.ts +23 -0
  141. package/dist/commands/node/create.js +207 -0
  142. package/dist/commands/node/inspect.d.ts +2 -0
  143. package/dist/commands/node/inspect.js +302 -0
  144. package/dist/commands/node/lifecycle.d.ts +4 -0
  145. package/dist/commands/node/lifecycle.js +415 -0
  146. package/dist/commands/node/message.d.ts +1 -0
  147. package/dist/commands/node/message.js +164 -0
  148. package/dist/commands/node/pyramid.d.ts +2 -0
  149. package/dist/commands/node/pyramid.js +79 -0
  150. package/dist/commands/node/subscription.d.ts +1 -0
  151. package/dist/commands/node/subscription.js +82 -0
  152. package/dist/commands/node/wait.d.ts +1 -0
  153. package/dist/commands/node/wait.js +159 -0
  154. package/dist/commands/node-lifecycle-revive.js +10 -57
  155. package/dist/commands/node.d.ts +0 -42
  156. package/dist/commands/node.js +11 -2065
  157. package/dist/commands/search.js +1 -1
  158. package/dist/commands/surface/node/cycle.d.ts +1 -0
  159. package/dist/commands/surface/node/cycle.js +83 -0
  160. package/dist/commands/surface/node/focus.d.ts +1 -0
  161. package/dist/commands/surface/node/focus.js +67 -0
  162. package/dist/commands/surface/node/id.d.ts +1 -0
  163. package/dist/commands/surface/node/id.js +38 -0
  164. package/dist/commands/surface/node/pin.d.ts +1 -0
  165. package/dist/commands/surface/node/pin.js +42 -0
  166. package/dist/commands/surface/node/placement.d.ts +46 -0
  167. package/dist/commands/surface/node/placement.js +124 -0
  168. package/dist/commands/surface-node.js +4 -1
  169. package/dist/commands/surface-reload.js +1 -2
  170. package/dist/commands/surface-tmux-spread.js +1 -1
  171. package/dist/commands/surface.js +5 -20
  172. package/dist/commands/sys/__tests__/setup-core.test.js +18 -271
  173. package/dist/commands/sys/config.js +6 -6
  174. package/dist/commands/sys/logs.js +1 -1
  175. package/dist/commands/sys/panels/broker-limits-panel.d.ts +17 -0
  176. package/dist/commands/sys/panels/broker-limits-panel.js +104 -0
  177. package/dist/commands/sys/panels/dependencies-panel.d.ts +14 -0
  178. package/dist/commands/sys/panels/dependencies-panel.js +80 -0
  179. package/dist/commands/sys/panels/keybindings-panel.d.ts +56 -0
  180. package/dist/commands/sys/panels/keybindings-panel.js +703 -0
  181. package/dist/commands/sys/panels/keys-panel.d.ts +16 -0
  182. package/dist/commands/sys/panels/keys-panel.js +60 -0
  183. package/dist/commands/sys/panels/models-panel.d.ts +77 -0
  184. package/dist/commands/sys/panels/models-panel.js +647 -0
  185. package/dist/commands/sys/panels/panel.d.ts +45 -0
  186. package/dist/commands/sys/panels/panel.js +137 -0
  187. package/dist/commands/sys/panels/plugins-panel.d.ts +16 -0
  188. package/dist/commands/sys/panels/plugins-panel.js +80 -0
  189. package/dist/commands/sys/panels/prefs-panel.d.ts +21 -0
  190. package/dist/commands/sys/panels/prefs-panel.js +85 -0
  191. package/dist/commands/sys/panels/provider-panel.d.ts +62 -0
  192. package/dist/commands/sys/panels/provider-panel.js +538 -0
  193. package/dist/commands/sys/settings-shell.d.ts +55 -0
  194. package/dist/commands/sys/settings-shell.js +400 -0
  195. package/dist/commands/sys/settings.d.ts +2 -0
  196. package/dist/commands/sys/settings.js +31 -0
  197. package/dist/commands/sys/setup-core.d.ts +3 -33
  198. package/dist/commands/sys/setup-core.js +27 -78
  199. package/dist/commands/sys/setup-settings-runner.d.ts +24 -0
  200. package/dist/commands/sys/setup-settings-runner.js +63 -0
  201. package/dist/commands/sys/setup-wizard.d.ts +26 -125
  202. package/dist/commands/sys/setup-wizard.js +209 -2473
  203. package/dist/commands/sys/setup.js +5 -7
  204. package/dist/commands/sys.js +3 -2
  205. package/dist/core/__tests__/broker-extension-canvas-db-boundary.test.js +50 -0
  206. package/dist/core/__tests__/broker-launch-candidates.test.js +20 -9
  207. package/dist/core/__tests__/broker-preflight.test.js +1 -1
  208. package/dist/core/__tests__/canvas-inbox-watcher-hold.test.js +108 -27
  209. package/dist/core/__tests__/canvas-inbox-watcher.test.js +14 -0
  210. package/dist/core/__tests__/canvas.test.js +2 -36
  211. package/dist/core/__tests__/close.test.js +14 -3
  212. package/dist/core/__tests__/context-intro.test.js +32 -143
  213. package/dist/core/__tests__/cron-broker-capacity.test.js +22 -3
  214. package/dist/core/__tests__/daemon-boot.test.js +2 -20
  215. package/dist/core/__tests__/daemon-wedge.test.js +1 -1
  216. package/dist/core/__tests__/dead-node-policy-table.test.js +1 -18
  217. package/dist/core/__tests__/fixtures/fake-engine.d.ts +1 -1
  218. package/dist/core/__tests__/fixtures/fake-engine.js +2 -2
  219. package/dist/core/__tests__/fixtures/fake-pi-host.js +2 -2
  220. package/dist/core/__tests__/focuses.test.js +4 -98
  221. package/dist/core/__tests__/helpers/broker-clients.d.ts +0 -3
  222. package/dist/core/__tests__/helpers/broker-clients.js +0 -14
  223. package/dist/core/__tests__/helpers/harness.d.ts +0 -8
  224. package/dist/core/__tests__/helpers/harness.js +7 -87
  225. package/dist/core/__tests__/helpers/viewer-panes.js +1 -1
  226. package/dist/core/__tests__/inline-memory-refs.test.js +5 -134
  227. package/dist/core/__tests__/kickoff.test.js +1 -1
  228. package/dist/core/__tests__/memory-resolver-precedence.test.js +29 -1
  229. package/dist/core/__tests__/migration.test.js +35 -48
  230. package/dist/core/__tests__/on-read-dedup-resume.test.js +22 -12
  231. package/dist/core/__tests__/passive-subscription.test.js +26 -49
  232. package/dist/core/__tests__/preview-registry-sync.test.js +1 -2
  233. package/dist/core/__tests__/prune.test.js +94 -1
  234. package/dist/core/__tests__/review-model-floor.test.js +0 -32
  235. package/dist/core/__tests__/seam/broker-attach-multiclient.test.js +255 -0
  236. package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.js +39 -7
  237. package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.js +30 -29
  238. package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.js +54 -5
  239. package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.js +134 -82
  240. package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.js +15 -4
  241. package/dist/core/__tests__/{full/idle-release-settlement.test.js → seam/dormancy-release.test.js} +69 -17
  242. package/dist/core/__tests__/{full/yield-message-transaction.test.js → seam/yield-refresh-transaction.test.js} +31 -9
  243. package/dist/core/__tests__/secrets.test.js +1 -7
  244. package/dist/core/__tests__/{broker-fork-seam.test.js → serial/broker-fork-seam.test.js} +58 -7
  245. package/dist/core/__tests__/{broker-sdk-wiring.test.js → serial/broker-sdk-wiring.test.js} +18 -162
  246. package/dist/core/__tests__/{broker-snapshot-history.test.js → serial/broker-snapshot-history.test.js} +9 -9
  247. package/dist/core/__tests__/{command-plugins.test.js → serial/command-plugins.test.js} +105 -15
  248. package/dist/core/__tests__/{deferred-no-wake.test.js → serial/deferred-no-wake.test.js} +23 -20
  249. package/dist/core/__tests__/{flagship-lifecycle.test.js → serial/flagship-lifecycle.test.js} +7 -7
  250. package/dist/core/__tests__/{host-teardown-process-group.test.js → serial/host-teardown-process-group.test.js} +6 -6
  251. package/dist/core/__tests__/{human-deliver-e2e.test.js → serial/human-deliver-e2e.test.js} +12 -12
  252. package/dist/core/__tests__/{live-mutation.test.js → serial/live-mutation.test.js} +5 -5
  253. package/dist/core/__tests__/{refresh-stall-recycle.test.js → serial/refresh-stall-recycle.test.js} +5 -14
  254. package/dist/core/__tests__/{revive.test.js → serial/revive.test.js} +15 -100
  255. package/dist/core/__tests__/{spawn-root.test.js → serial/spawn-root.test.js} +32 -15
  256. package/dist/core/__tests__/serial/subscription-delivery.test.js +126 -0
  257. package/dist/core/__tests__/serial/tmux-surface.test.js +256 -0
  258. package/dist/core/__tests__/{worktree.test.js → serial/worktree.test.js} +15 -15
  259. package/dist/core/__tests__/session-model.test.js +0 -18
  260. package/dist/core/__tests__/spawn-worktree-id-conflict.test.js +9 -0
  261. package/dist/core/__tests__/watchdog-abort-arms-retry.test.js +50 -0
  262. package/dist/core/broker-client/__tests__/transport-relay.test.js +15 -16
  263. package/dist/core/broker-client/__tests__/transport-socket.test.js +28 -0
  264. package/dist/core/broker-client/client.d.ts +2 -2
  265. package/dist/core/broker-client/client.js +4 -7
  266. package/dist/core/broker-client/transport-relay.d.ts +13 -19
  267. package/dist/core/broker-client/transport-relay.js +19 -34
  268. package/dist/core/broker-client/transport-socket.d.ts +2 -2
  269. package/dist/core/broker-client/transport-socket.js +9 -2
  270. package/dist/core/broker-client/transport.d.ts +7 -3
  271. package/dist/core/broker-client/transport.js +4 -4
  272. package/dist/core/canvas/__tests__/attention.test.js +1 -18
  273. package/dist/core/canvas/__tests__/remote-canvas-source.test.js +7 -64
  274. package/dist/core/canvas/__tests__/remote-transport.test.js +2 -3
  275. package/dist/core/canvas/__tests__/render-remote.test.js +7 -52
  276. package/dist/core/canvas/browse/app.d.ts +2 -17
  277. package/dist/core/canvas/browse/app.js +16 -88
  278. package/dist/core/canvas/browse/model.d.ts +0 -4
  279. package/dist/core/canvas/browse/model.js +1 -12
  280. package/dist/core/canvas/browse/render.js +6 -3
  281. package/dist/core/canvas/crons.d.ts +8 -5
  282. package/dist/core/canvas/crons.js +7 -6
  283. package/dist/core/canvas/extensions.d.ts +7 -3
  284. package/dist/core/canvas/extensions.js +16 -4
  285. package/dist/core/canvas/nav-model.d.ts +0 -4
  286. package/dist/core/canvas/nav-model.js +2 -14
  287. package/dist/core/canvas/node-order.d.ts +3 -0
  288. package/dist/core/canvas/node-order.js +12 -0
  289. package/dist/core/canvas/remote-canvas-source.d.ts +3 -6
  290. package/dist/core/canvas/remote-canvas-source.js +8 -15
  291. package/dist/core/command.js +11 -4
  292. package/dist/core/config.js +3 -1
  293. package/dist/core/events/envelope.js +1 -1
  294. package/dist/core/events/read.js +7 -21
  295. package/dist/core/events/source.d.ts +0 -2
  296. package/dist/core/events/source.js +0 -16
  297. package/dist/core/events/types.d.ts +1 -1
  298. package/dist/core/fault-classifier.d.ts +1 -1
  299. package/dist/core/feed/passive.d.ts +0 -11
  300. package/dist/core/feed/passive.js +1 -62
  301. package/dist/core/human/__tests__/{inbox-core.test.js → serial/inbox-core.test.js} +6 -6
  302. package/dist/core/keybindings/__tests__/resolve.test.js +1 -96
  303. package/dist/core/keybindings/background-bash.js +3 -4
  304. package/dist/core/keybindings/catalog.js +1 -1
  305. package/dist/core/memory/inline-ref-grammar.js +3 -3
  306. package/dist/core/memory-resolver.d.ts +11 -25
  307. package/dist/core/memory-resolver.js +51 -33
  308. package/dist/core/model-routes.d.ts +15 -0
  309. package/dist/core/model-routes.js +12 -0
  310. package/dist/core/pool-credential-store.js +1 -1
  311. package/dist/core/preview-registry.js +8 -9
  312. package/dist/core/profiles/__tests__/root-profile.test.js +4 -14
  313. package/dist/core/review/realize.d.ts +0 -13
  314. package/dist/core/review/realize.js +0 -40
  315. package/dist/core/review/types.d.ts +1 -1
  316. package/dist/core/runtime/__tests__/engine-route.test.js +2 -2
  317. package/dist/core/runtime/bearings.js +1 -11
  318. package/dist/core/runtime/broker/client-registry.d.ts +33 -0
  319. package/dist/core/runtime/broker/client-registry.js +164 -0
  320. package/dist/core/runtime/broker/daemon-ops.d.ts +19 -0
  321. package/dist/core/runtime/broker/daemon-ops.js +49 -0
  322. package/dist/core/runtime/broker/event-projection.d.ts +42 -0
  323. package/dist/core/runtime/broker/event-projection.js +178 -0
  324. package/dist/core/runtime/broker/fault-retry.d.ts +39 -0
  325. package/dist/core/runtime/broker/fault-retry.js +277 -0
  326. package/dist/core/runtime/broker/frame-dispatch.d.ts +238 -0
  327. package/dist/core/runtime/broker/frame-dispatch.js +1537 -0
  328. package/dist/core/runtime/broker/inbox.d.ts +22 -0
  329. package/dist/core/runtime/broker/inbox.js +167 -0
  330. package/dist/core/runtime/broker/passive.d.ts +16 -0
  331. package/dist/core/runtime/broker/passive.js +44 -0
  332. package/dist/core/runtime/broker/read-ops.d.ts +23 -0
  333. package/dist/core/runtime/broker/read-ops.js +150 -0
  334. package/dist/core/runtime/broker/rebind.d.ts +74 -0
  335. package/dist/core/runtime/broker/rebind.js +211 -0
  336. package/dist/core/runtime/broker/tool-groups.d.ts +39 -0
  337. package/dist/core/runtime/broker/tool-groups.js +244 -0
  338. package/dist/core/runtime/broker-extension-render.d.ts +11 -0
  339. package/dist/core/runtime/broker-extension-render.js +181 -0
  340. package/dist/core/runtime/broker-persona-guidance.d.ts +13 -0
  341. package/dist/core/runtime/broker-persona-guidance.js +58 -0
  342. package/dist/core/runtime/broker-protocol.d.ts +1 -1
  343. package/dist/core/runtime/broker-protocol.js +1 -1
  344. package/dist/core/runtime/broker.d.ts +5 -196
  345. package/dist/core/runtime/broker.js +276 -3059
  346. package/dist/core/runtime/canvas-extensions.js +11 -2
  347. package/dist/core/runtime/fault.js +1 -1
  348. package/dist/core/runtime/model-selection.d.ts +9 -0
  349. package/dist/core/runtime/model-selection.js +12 -0
  350. package/dist/core/runtime/model-swap.d.ts +3 -3
  351. package/dist/core/runtime/model-swap.js +33 -25
  352. package/dist/core/runtime/placement-tmux.d.ts +3 -14
  353. package/dist/core/runtime/placement-tmux.js +11 -80
  354. package/dist/core/runtime/placement.d.ts +4 -2
  355. package/dist/core/runtime/placement.js +7 -12
  356. package/dist/core/runtime/promote.d.ts +14 -1
  357. package/dist/core/runtime/promote.js +1 -1
  358. package/dist/core/runtime/reset.d.ts +1 -1
  359. package/dist/core/runtime/roadmap.js +1 -1
  360. package/dist/core/runtime/spawn.d.ts +8 -0
  361. package/dist/core/runtime/spawn.js +36 -6
  362. package/dist/core/runtime/stop-guard.d.ts +4 -3
  363. package/dist/core/runtime/stop-guard.js +36 -18
  364. package/dist/core/runtime/stop-signals.d.ts +4 -1
  365. package/dist/core/runtime/stream-watchdog.js +4 -5
  366. package/dist/core/runtime/structured-output.d.ts +15 -2
  367. package/dist/core/runtime/structured-output.js +35 -12
  368. package/dist/core/runtime/tmux-bindings.d.ts +25 -0
  369. package/dist/core/runtime/tmux-bindings.js +682 -0
  370. package/dist/core/runtime/tmux-chrome.d.ts +2 -1
  371. package/dist/core/runtime/tmux-chrome.js +3 -2
  372. package/dist/core/runtime/{tmux.d.ts → tmux-driver.d.ts} +18 -26
  373. package/dist/core/runtime/tmux-driver.js +598 -0
  374. package/dist/core/runtime/view-socket.d.ts +14 -0
  375. package/dist/core/runtime/view-socket.js +83 -0
  376. package/dist/core/session-model/session-state.d.ts +1 -2
  377. package/dist/core/session-model/session-state.js +5 -8
  378. package/dist/core/spawn.d.ts +1 -1
  379. package/dist/core/spawn.js +2 -2
  380. package/dist/core/substrate/gate.d.ts +1 -1
  381. package/dist/core/substrate/on-read-pure.d.ts +7 -0
  382. package/dist/core/substrate/on-read-pure.js +272 -0
  383. package/dist/core/termrender/termrender.js +32 -2
  384. package/dist/core/user-settings.d.ts +23 -1
  385. package/dist/core/user-settings.js +18 -1
  386. package/dist/daemon/api/__tests__/node-model-validation.test.js +134 -0
  387. package/dist/daemon/api/__tests__/review-terminal-conflict.test.js +98 -0
  388. package/dist/daemon/api/__tests__/{full → seam}/api-server.test.js +6 -48
  389. package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.js +17 -44
  390. package/dist/daemon/api/__tests__/{full/push-parity.test.js → seam/leaf-api-parity.test.js} +61 -42
  391. package/dist/daemon/api/bridge.js +40 -81
  392. package/dist/daemon/api/handlers/broker-ops.d.ts +2 -0
  393. package/dist/daemon/api/handlers/broker-ops.js +383 -0
  394. package/dist/daemon/api/handlers/crons.js +9 -4
  395. package/dist/daemon/api/handlers/files.js +6 -7
  396. package/dist/daemon/api/handlers/inbox.js +2 -340
  397. package/dist/daemon/api/handlers/nodes.d.ts +10 -1
  398. package/dist/daemon/api/handlers/nodes.js +74 -39
  399. package/dist/daemon/api/handlers/review-comments.js +5 -1
  400. package/dist/daemon/api/handlers/reviews.js +0 -19
  401. package/dist/daemon/api/map.js +25 -4
  402. package/dist/daemon/api/router.js +2 -3
  403. package/dist/daemon/api/server.js +5 -7
  404. package/dist/daemon/cron-run.d.ts +4 -0
  405. package/dist/daemon/cron-run.js +30 -13
  406. package/dist/daemon/crtrd.d.ts +3 -58
  407. package/dist/daemon/crtrd.js +28 -1244
  408. package/dist/daemon/manage.js +0 -1
  409. package/dist/daemon/reconcilers/broker-supervision.d.ts +50 -0
  410. package/dist/daemon/reconcilers/broker-supervision.js +549 -0
  411. package/dist/daemon/reconcilers/cron-lane.d.ts +10 -0
  412. package/dist/daemon/reconcilers/cron-lane.js +32 -0
  413. package/dist/daemon/reconcilers/dormant-inbox.d.ts +18 -0
  414. package/dist/daemon/reconcilers/dormant-inbox.js +143 -0
  415. package/dist/daemon/reconcilers/storage-maintenance.d.ts +22 -0
  416. package/dist/daemon/reconcilers/storage-maintenance.js +213 -0
  417. package/dist/daemon/review/finish.js +2 -5
  418. package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +34 -53
  419. package/dist/pi-extensions/__tests__/canvas-recap.test.js +16 -113
  420. package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +72 -99
  421. package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.js +29 -12
  422. package/dist/pi-extensions/broker-local.d.ts +20 -0
  423. package/dist/pi-extensions/broker-local.js +89 -0
  424. package/dist/pi-extensions/canvas-context-intro.d.ts +3 -3
  425. package/dist/pi-extensions/canvas-context-intro.js +22 -11
  426. package/dist/pi-extensions/canvas-doc-substrate.js +17 -34
  427. package/dist/pi-extensions/canvas-goal-capture.js +7 -12
  428. package/dist/pi-extensions/canvas-inbox-watcher.js +124 -139
  429. package/dist/pi-extensions/canvas-passive-context.d.ts +3 -3
  430. package/dist/pi-extensions/canvas-passive-context.js +22 -18
  431. package/dist/pi-extensions/canvas-recap.d.ts +2 -2
  432. package/dist/pi-extensions/canvas-recap.js +48 -21
  433. package/dist/pi-extensions/canvas-review-boundary.js +10 -4
  434. package/dist/pi-extensions/canvas-stophook.d.ts +0 -5
  435. package/dist/pi-extensions/canvas-stophook.js +149 -431
  436. package/dist/pi-extensions/canvas-structured-output.js +52 -30
  437. package/dist/pi-extensions/envelope-merge.d.ts +13 -0
  438. package/dist/pi-extensions/envelope-merge.js +29 -0
  439. package/dist/shared/working-activity.d.ts +3 -2
  440. package/dist/shared/working-activity.js +3 -2
  441. package/dist/types.d.ts +6 -5
  442. package/dist/types.js +2 -2
  443. package/docs/compat/hearth-crtr-v1.md +4 -12
  444. package/docs/compat/hearth-crtr-v2.md +3 -11
  445. package/docs/compat/hearth-crtr-v3.md +4 -12
  446. package/docs/compat/hearth-crtr-v4.md +3 -11
  447. package/docs/compat/hearth-crtr-v5.md +3 -11
  448. package/docs/public-api.md +3 -7
  449. package/package.json +7 -49
  450. package/runtime.lock.json +2766 -14533
  451. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/claude-plugin-commands.test.ts +0 -49
  452. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/memory-slash-commands.test.ts +0 -194
  453. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/statusline.test.ts +0 -68
  454. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/test.ts +0 -119
  455. package/dist/clients/attach/__tests__/attach-chrome-remote.test.js +0 -439
  456. package/dist/clients/attach/__tests__/attach-keybindings.test.js +0 -170
  457. package/dist/clients/attach/__tests__/crtr-output-coverage.test.js +0 -57
  458. package/dist/clients/attach/__tests__/editor-frame-title.test.js +0 -19
  459. package/dist/clients/attach/__tests__/input-controller-extension-command.test.js +0 -32
  460. package/dist/clients/attach/__tests__/markdown-headings.test.js +0 -35
  461. package/dist/clients/attach/__tests__/session-identity-refresh.test.js +0 -32
  462. package/dist/clients/conversation/conversation.d.ts +0 -65
  463. package/dist/clients/conversation/conversation.js +0 -318
  464. package/dist/clients/conversation/frames.d.ts +0 -30
  465. package/dist/clients/conversation/frames.js +0 -52
  466. package/dist/clients/conversation/region.d.ts +0 -51
  467. package/dist/clients/conversation/region.js +0 -265
  468. package/dist/clients/inbox/__tests__/inbox-controller.test.js +0 -247
  469. package/dist/clients/inbox/__tests__/mount-panel.test.js +0 -776
  470. package/dist/clients/inbox/review/__tests__/remap.test.js +0 -196
  471. package/dist/clients/inbox/review/columns.d.ts +0 -22
  472. package/dist/clients/inbox/review/columns.js +0 -40
  473. package/dist/clients/inbox/review/composition.d.ts +0 -60
  474. package/dist/clients/inbox/review/composition.js +0 -278
  475. package/dist/clients/inbox/review/document-region.d.ts +0 -120
  476. package/dist/clients/surfaces/region.d.ts +0 -16
  477. package/dist/clients/web/__tests__/push-engine.test.js +0 -158
  478. package/dist/clients/web/__tests__/push-registry.test.d.ts +0 -1
  479. package/dist/clients/web/__tests__/push-registry.test.js +0 -177
  480. package/dist/clients/web/dev-server.d.ts +0 -7
  481. package/dist/clients/web/dev-server.js +0 -46
  482. package/dist/clients/web/events.d.ts +0 -19
  483. package/dist/clients/web/events.js +0 -163
  484. package/dist/clients/web/push-engine.d.ts +0 -44
  485. package/dist/clients/web/push-engine.js +0 -125
  486. package/dist/clients/web/push-registry.d.ts +0 -85
  487. package/dist/clients/web/push-registry.js +0 -373
  488. package/dist/clients/web/server.d.ts +0 -19
  489. package/dist/clients/web/server.js +0 -661
  490. package/dist/clients/web/web-client/shared/protocol.d.ts +0 -214
  491. package/dist/clients/web/web-client/shared/protocol.js +0 -8
  492. package/dist/clients/web/web-cmd.d.ts +0 -2
  493. package/dist/clients/web/web-cmd.js +0 -141
  494. package/dist/commands/__tests__/api-canvas-source.test.d.ts +0 -1
  495. package/dist/commands/__tests__/api-canvas-source.test.js +0 -37
  496. package/dist/commands/__tests__/canvas-config.test.d.ts +0 -1
  497. package/dist/commands/__tests__/canvas-config.test.js +0 -107
  498. package/dist/commands/__tests__/node-no-kickoff-flag.test.d.ts +0 -1
  499. package/dist/commands/__tests__/node-no-kickoff-flag.test.js +0 -73
  500. package/dist/commands/__tests__/node-worktree-flag.test.d.ts +0 -1
  501. package/dist/commands/__tests__/node-worktree-flag.test.js +0 -49
  502. package/dist/commands/__tests__/search-contents.test.d.ts +0 -1
  503. package/dist/commands/__tests__/search-contents.test.js +0 -52
  504. package/dist/commands/memory/__tests__/lint.test.d.ts +0 -1
  505. package/dist/commands/memory/__tests__/lint.test.js +0 -15
  506. package/dist/commands/sys/__tests__/config-broker-thresholds.test.d.ts +0 -1
  507. package/dist/commands/sys/__tests__/config-broker-thresholds.test.js +0 -95
  508. package/dist/commands/sys/__tests__/config-keybindings.test.d.ts +0 -1
  509. package/dist/commands/sys/__tests__/config-keybindings.test.js +0 -55
  510. package/dist/commands/sys/__tests__/helpers/setup-runtime.d.ts +0 -5
  511. package/dist/commands/sys/__tests__/helpers/setup-runtime.js +0 -19
  512. package/dist/commands/sys/__tests__/setup-front-door.test.d.ts +0 -1
  513. package/dist/commands/sys/__tests__/setup-front-door.test.js +0 -102
  514. package/dist/commands/sys/__tests__/setup-models.test.d.ts +0 -1
  515. package/dist/commands/sys/__tests__/setup-models.test.js +0 -205
  516. package/dist/commands/sys/__tests__/setup-providers-viewport.test.d.ts +0 -1
  517. package/dist/commands/sys/__tests__/setup-providers-viewport.test.js +0 -155
  518. package/dist/commands/sys/__tests__/sync-deps.test.d.ts +0 -1
  519. package/dist/commands/sys/__tests__/sync-deps.test.js +0 -179
  520. package/dist/commands/sys/__tests__/sync-import.test.d.ts +0 -1
  521. package/dist/commands/sys/__tests__/sync-import.test.js +0 -315
  522. package/dist/core/__tests__/base-worker-prompt.test.d.ts +0 -1
  523. package/dist/core/__tests__/base-worker-prompt.test.js +0 -57
  524. package/dist/core/__tests__/command-plugins-surfaces.test.d.ts +0 -1
  525. package/dist/core/__tests__/command-plugins-surfaces.test.js +0 -359
  526. package/dist/core/__tests__/connection-reconnect-resume.test.d.ts +0 -1
  527. package/dist/core/__tests__/connection-reconnect-resume.test.js +0 -36
  528. package/dist/core/__tests__/finalization-migration.test.d.ts +0 -1
  529. package/dist/core/__tests__/finalization-migration.test.js +0 -38
  530. package/dist/core/__tests__/fixtures/extra-extension.d.ts +0 -1
  531. package/dist/core/__tests__/fixtures/extra-extension.js +0 -3
  532. package/dist/core/__tests__/fixtures/spawn-proof-target.test.d.ts +0 -1
  533. package/dist/core/__tests__/fixtures/spawn-proof-target.test.js +0 -15
  534. package/dist/core/__tests__/fork.test.d.ts +0 -1
  535. package/dist/core/__tests__/fork.test.js +0 -108
  536. package/dist/core/__tests__/full/broker-attach-limits.test.d.ts +0 -1
  537. package/dist/core/__tests__/full/broker-attach-limits.test.js +0 -147
  538. package/dist/core/__tests__/full/broker-deliver-ack.test.d.ts +0 -1
  539. package/dist/core/__tests__/full/broker-deliver-ack.test.js +0 -73
  540. package/dist/core/__tests__/full/broker-dialogs.test.d.ts +0 -1
  541. package/dist/core/__tests__/full/broker-dialogs.test.js +0 -180
  542. package/dist/core/__tests__/full/broker-display-snapshot.test.d.ts +0 -1
  543. package/dist/core/__tests__/full/broker-display-snapshot.test.js +0 -75
  544. package/dist/core/__tests__/full/broker-dormant-wake.test.d.ts +0 -1
  545. package/dist/core/__tests__/full/broker-dormant-wake.test.js +0 -130
  546. package/dist/core/__tests__/full/broker-model-changed-broadcast.test.d.ts +0 -1
  547. package/dist/core/__tests__/full/broker-model-changed-broadcast.test.js +0 -57
  548. package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.d.ts +0 -1
  549. package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.js +0 -80
  550. package/dist/core/__tests__/full/cascade-close.test.d.ts +0 -1
  551. package/dist/core/__tests__/full/cascade-close.test.js +0 -240
  552. package/dist/core/__tests__/full/detach-focus.test.d.ts +0 -1
  553. package/dist/core/__tests__/full/detach-focus.test.js +0 -126
  554. package/dist/core/__tests__/full/idle-release-settlement.test.d.ts +0 -1
  555. package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.d.ts +0 -1
  556. package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.js +0 -107
  557. package/dist/core/__tests__/full/park-clock-release.test.d.ts +0 -1
  558. package/dist/core/__tests__/full/park-clock-release.test.js +0 -56
  559. package/dist/core/__tests__/full/yield-message-transaction.test.d.ts +0 -1
  560. package/dist/core/__tests__/memory-index-render.test.d.ts +0 -1
  561. package/dist/core/__tests__/memory-index-render.test.js +0 -60
  562. package/dist/core/__tests__/model-routes.test.d.ts +0 -1
  563. package/dist/core/__tests__/model-routes.test.js +0 -41
  564. package/dist/core/__tests__/on-read-identity.test.d.ts +0 -1
  565. package/dist/core/__tests__/on-read-identity.test.js +0 -61
  566. package/dist/core/__tests__/phase4-review-migration.test.d.ts +0 -1
  567. package/dist/core/__tests__/phase4-review-migration.test.js +0 -100
  568. package/dist/core/__tests__/prune-to-limit.test.d.ts +0 -1
  569. package/dist/core/__tests__/prune-to-limit.test.js +0 -126
  570. package/dist/core/__tests__/reset.test.d.ts +0 -1
  571. package/dist/core/__tests__/reset.test.js +0 -69
  572. package/dist/core/__tests__/spawn-no-kickoff.test.d.ts +0 -1
  573. package/dist/core/__tests__/spawn-no-kickoff.test.js +0 -115
  574. package/dist/core/__tests__/steer-note.test.d.ts +0 -1
  575. package/dist/core/__tests__/steer-note.test.js +0 -41
  576. package/dist/core/__tests__/subcommand-tier.test.d.ts +0 -1
  577. package/dist/core/__tests__/subcommand-tier.test.js +0 -99
  578. package/dist/core/__tests__/subscription-delivery.test.js +0 -211
  579. package/dist/core/__tests__/test-runner-cheap-sharding.test.d.ts +0 -1
  580. package/dist/core/__tests__/test-runner-cheap-sharding.test.js +0 -97
  581. package/dist/core/__tests__/tmux-surface.test.js +0 -484
  582. package/dist/core/__tests__/wake-bearings.test.d.ts +0 -1
  583. package/dist/core/__tests__/wake-bearings.test.js +0 -102
  584. package/dist/core/canvas/__tests__/remote-event-stream.test.d.ts +0 -1
  585. package/dist/core/canvas/__tests__/remote-event-stream.test.js +0 -146
  586. package/dist/core/canvas/__tests__/source-resolve.test.d.ts +0 -1
  587. package/dist/core/canvas/__tests__/source-resolve.test.js +0 -77
  588. package/dist/core/canvas/browse/__tests__/model.test.d.ts +0 -1
  589. package/dist/core/canvas/browse/__tests__/model.test.js +0 -290
  590. package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.d.ts +0 -1
  591. package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.js +0 -134
  592. package/dist/core/canvas/browse/__tests__/render.test.d.ts +0 -1
  593. package/dist/core/canvas/browse/__tests__/render.test.js +0 -111
  594. package/dist/core/canvas/browse/rebuild-coalescer.d.ts +0 -7
  595. package/dist/core/canvas/browse/rebuild-coalescer.js +0 -61
  596. package/dist/core/canvas/remote-event-stream.d.ts +0 -24
  597. package/dist/core/canvas/remote-event-stream.js +0 -94
  598. package/dist/core/feed/__tests__/coalesce-human.test.d.ts +0 -1
  599. package/dist/core/feed/__tests__/coalesce-human.test.js +0 -36
  600. package/dist/core/feed/__tests__/empty-node-guard.test.d.ts +0 -1
  601. package/dist/core/feed/__tests__/empty-node-guard.test.js +0 -45
  602. package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.d.ts +0 -1
  603. package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.js +0 -84
  604. package/dist/core/human/__tests__/visible-paths.test.d.ts +0 -1
  605. package/dist/core/human/__tests__/visible-paths.test.js +0 -28
  606. package/dist/core/keybindings/__tests__/inbox-affordance.test.d.ts +0 -1
  607. package/dist/core/keybindings/__tests__/inbox-affordance.test.js +0 -38
  608. package/dist/core/review/__tests__/project.test.d.ts +0 -1
  609. package/dist/core/review/__tests__/project.test.js +0 -71
  610. package/dist/core/runtime/__tests__/command-expansion.test.d.ts +0 -1
  611. package/dist/core/runtime/__tests__/command-expansion.test.js +0 -25
  612. package/dist/core/runtime/__tests__/session-visibility.test.d.ts +0 -1
  613. package/dist/core/runtime/__tests__/session-visibility.test.js +0 -119
  614. package/dist/core/runtime/__tests__/spawn-at-given-id.test.d.ts +0 -1
  615. package/dist/core/runtime/__tests__/spawn-at-given-id.test.js +0 -34
  616. package/dist/core/runtime/tmux.js +0 -1314
  617. package/dist/daemon/api/__tests__/full/push-parity.test.d.ts +0 -1
  618. package/dist/daemon/api/__tests__/full/worktree-parity.test.d.ts +0 -1
  619. package/dist/daemon/api/__tests__/full/worktree-parity.test.js +0 -160
  620. package/dist/daemon/api/__tests__/inbox.test.d.ts +0 -1
  621. package/dist/daemon/api/__tests__/inbox.test.js +0 -489
  622. package/dist/web-client/apple-touch-icon.png +0 -0
  623. package/dist/web-client/assets/fragment-mono-latin-400-normal-BYwT3kSJ.woff +0 -0
  624. package/dist/web-client/assets/fragment-mono-latin-400-normal-yxdJ5AmL.woff2 +0 -0
  625. package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-BbKYyvR9.woff2 +0 -0
  626. package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-CT4YFKeK.woff +0 -0
  627. package/dist/web-client/assets/index-CCPaLeW7.css +0 -2
  628. package/dist/web-client/assets/index-kyOWsnZK.js +0 -86
  629. package/dist/web-client/assets/martian-mono-cyrillic-wght-normal-B84CD5C_.woff2 +0 -0
  630. package/dist/web-client/assets/martian-mono-latin-ext-wght-normal-DlL6xMw5.woff2 +0 -0
  631. package/dist/web-client/assets/martian-mono-latin-wght-normal-5W32yIyr.woff2 +0 -0
  632. package/dist/web-client/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -2
  633. package/dist/web-client/icon-192.png +0 -0
  634. package/dist/web-client/icon-512.png +0 -0
  635. package/dist/web-client/icon-maskable-512.png +0 -0
  636. package/dist/web-client/index.html +0 -17
  637. package/dist/web-client/manifest.webmanifest +0 -1
  638. package/dist/web-client/sw.js +0 -1
  639. /package/dist/api/__tests__/{client.test.d.ts → serial/client.test.d.ts} +0 -0
  640. /package/dist/clients/inbox/__tests__/{inbox-controller.test.d.ts → serial/inbox-controller.test.d.ts} +0 -0
  641. /package/dist/clients/inbox/__tests__/{mount-panel.test.d.ts → serial/mount-panel.test.d.ts} +0 -0
  642. /package/dist/clients/{attach/__tests__/attach-chrome-remote.test.d.ts → inbox/review/__tests__/teardown-notice.test.d.ts} +0 -0
  643. /package/dist/{clients/attach/__tests__/attach-keybindings.test.d.ts → core/__tests__/broker-extension-canvas-db-boundary.test.d.ts} +0 -0
  644. /package/dist/{clients/attach/__tests__/crtr-output-coverage.test.d.ts → core/__tests__/seam/broker-attach-multiclient.test.d.ts} +0 -0
  645. /package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.d.ts +0 -0
  646. /package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.d.ts +0 -0
  647. /package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.d.ts +0 -0
  648. /package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.d.ts +0 -0
  649. /package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.d.ts +0 -0
  650. /package/dist/{clients/attach/__tests__/editor-frame-title.test.d.ts → core/__tests__/seam/dormancy-release.test.d.ts} +0 -0
  651. /package/dist/{clients/attach/__tests__/input-controller-extension-command.test.d.ts → core/__tests__/seam/yield-refresh-transaction.test.d.ts} +0 -0
  652. /package/dist/core/__tests__/{broker-fork-seam.test.d.ts → serial/broker-fork-seam.test.d.ts} +0 -0
  653. /package/dist/core/__tests__/{broker-sdk-wiring.test.d.ts → serial/broker-sdk-wiring.test.d.ts} +0 -0
  654. /package/dist/core/__tests__/{broker-snapshot-history.test.d.ts → serial/broker-snapshot-history.test.d.ts} +0 -0
  655. /package/dist/core/__tests__/{command-plugins.test.d.ts → serial/command-plugins.test.d.ts} +0 -0
  656. /package/dist/core/__tests__/{deferred-no-wake.test.d.ts → serial/deferred-no-wake.test.d.ts} +0 -0
  657. /package/dist/core/__tests__/{flagship-lifecycle.test.d.ts → serial/flagship-lifecycle.test.d.ts} +0 -0
  658. /package/dist/core/__tests__/{host-teardown-process-group.test.d.ts → serial/host-teardown-process-group.test.d.ts} +0 -0
  659. /package/dist/core/__tests__/{human-deliver-e2e.test.d.ts → serial/human-deliver-e2e.test.d.ts} +0 -0
  660. /package/dist/core/__tests__/{live-mutation.test.d.ts → serial/live-mutation.test.d.ts} +0 -0
  661. /package/dist/core/__tests__/{refresh-stall-recycle.test.d.ts → serial/refresh-stall-recycle.test.d.ts} +0 -0
  662. /package/dist/core/__tests__/{revive.test.d.ts → serial/revive.test.d.ts} +0 -0
  663. /package/dist/core/__tests__/{spawn-root.test.d.ts → serial/spawn-root.test.d.ts} +0 -0
  664. /package/dist/core/__tests__/{subscription-delivery.test.d.ts → serial/subscription-delivery.test.d.ts} +0 -0
  665. /package/dist/core/__tests__/{tmux-surface.test.d.ts → serial/tmux-surface.test.d.ts} +0 -0
  666. /package/dist/core/__tests__/{worktree.test.d.ts → serial/worktree.test.d.ts} +0 -0
  667. /package/dist/{clients/attach/__tests__/markdown-headings.test.d.ts → core/__tests__/watchdog-abort-arms-retry.test.d.ts} +0 -0
  668. /package/dist/{clients/attach/__tests__/session-identity-refresh.test.d.ts → core/broker-client/__tests__/transport-socket.test.d.ts} +0 -0
  669. /package/dist/core/human/__tests__/{inbox-core.test.d.ts → serial/inbox-core.test.d.ts} +0 -0
  670. /package/dist/{clients/inbox/review/__tests__/remap.test.d.ts → daemon/api/__tests__/node-model-validation.test.d.ts} +0 -0
  671. /package/dist/{clients/surfaces/region.js → daemon/api/__tests__/review-terminal-conflict.test.d.ts} +0 -0
  672. /package/dist/daemon/api/__tests__/{full → seam}/api-server.test.d.ts +0 -0
  673. /package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.d.ts +0 -0
  674. /package/dist/{clients/web/__tests__/push-engine.test.d.ts → daemon/api/__tests__/seam/leaf-api-parity.test.d.ts} +0 -0
@@ -1,359 +0,0 @@
1
- // Phase-2 surface tests: the lifecycle surfaces (pkg plugin install / show and
2
- // sys doctor) must surface the Phase-1 validator's STABLE TYPED ISSUES to the
3
- // caller, and must do so WITHOUT executing the plugin binary. Covers spec item
4
- // 6 at the surface seam (the validator itself is tested in
5
- // command-plugins.test.ts). Run with:
6
- // node --import tsx/esm --test src/core/__tests__/command-plugins-surfaces.test.ts
7
- //
8
- // Every test runs against an ISOLATED home (HOME → temp) with cwd pinned to a
9
- // dir that has no .crouter ancestor, so discovery is deterministic. Each fixture
10
- // executable writes a sentinel file if it is ever spawned; every surface
11
- // assertion also checks the sentinel is absent — proving validation stayed
12
- // static.
13
- import { test, describe, before, after, beforeEach, afterEach } from 'node:test';
14
- import assert from 'node:assert/strict';
15
- import { mkdtempSync, mkdirSync, writeFileSync, rmSync, chmodSync, existsSync } from 'node:fs';
16
- import { tmpdir } from 'node:os';
17
- import { join } from 'node:path';
18
- import { pluginInstall, pluginUpdate } from '../../commands/pkg/plugin-manage.js';
19
- import { pluginShow } from '../../commands/pkg/plugin-inspect.js';
20
- import { sysDoctorLeaf } from '../../commands/sys/doctor.js';
21
- import { discoverCommandContributions } from '../command-plugins/discovery.js';
22
- import { resetScopeCache } from '../scope.js';
23
- import { createApiServer } from '../../daemon/api/server.js';
24
- import { apiSocketPath, crtrHome } from '../canvas/paths.js';
25
- import { closeDb } from '../canvas/db.js';
26
- // A real executable that records the fact it ran. No surface should ever spawn
27
- // it — the sentinel must never appear.
28
- const SENTINEL_EXEC = `#!/usr/bin/env node
29
- const fs = require('fs');
30
- if (process.env.CMDPLUGIN_SENTINEL) fs.writeFileSync(process.env.CMDPLUGIN_SENTINEL, 'executed');
31
- process.stdout.write(JSON.stringify({ protocolVersion: 1, ok: true, result: { app_id: 'x', status: 'running' } }));
32
- `;
33
- function validManifest() {
34
- return {
35
- schemaVersion: 1,
36
- mounts: [
37
- {
38
- parent: [],
39
- node: {
40
- kind: 'branch',
41
- name: 'app',
42
- description: 'application lifecycle and inspection',
43
- whenToUse: 'you need to create, deploy, inspect, or remove an application',
44
- rootEntry: {
45
- concept: 'applications hosted by a crouter home',
46
- description: 'application lifecycle and inspection',
47
- whenToUse: 'you need to create, deploy, inspect, or remove an application',
48
- },
49
- summary: 'application lifecycle and inspection',
50
- children: [
51
- {
52
- kind: 'leaf',
53
- name: 'show',
54
- description: 'show one application',
55
- whenToUse: 'inspect a single application by id',
56
- summary: 'show one application details',
57
- params: [{ kind: 'positional', name: 'app-id', required: true, constraint: 'the application id' }],
58
- output: [{ name: 'app_id', type: 'string', required: true, constraint: 'the echoed application id' }],
59
- outputKind: 'object',
60
- effects: ['None. Read-only.'],
61
- },
62
- ],
63
- },
64
- },
65
- ],
66
- };
67
- }
68
- const CASES = [
69
- { name: 'escaping executable path', code: 'command_path_unsafe', executable: '../../../../bin/sh' },
70
- { name: 'non-executable file', code: 'command_not_executable', execBit: false },
71
- (() => { const m = validManifest(); m['schemaVersion'] = 2; return { name: 'unknown schemaVersion', code: 'command_schema_version', manifest: m }; })(),
72
- (() => { const m = validManifest(); m['requires'] = { crtr: '>=1' }; return { name: 'unknown top-level key', code: 'command_manifest_invalid', manifest: m }; })(),
73
- ];
74
- function nestedManifest() {
75
- const manifest = validManifest();
76
- const mounts = manifest['mounts'];
77
- const topLevel = mounts[0];
78
- const child = topLevel.node['children'][0];
79
- topLevel.node['children'] = [{
80
- kind: 'branch',
81
- name: 'tools',
82
- description: 'application tools',
83
- whenToUse: 'inspect application tools',
84
- summary: 'application tools',
85
- children: [],
86
- }];
87
- mounts.push({ parent: ['app', 'tools'], node: { ...child, name: 'status' } });
88
- return manifest;
89
- }
90
- // ---------------------------------------------------------------------------
91
- // Isolated home + cwd
92
- // ---------------------------------------------------------------------------
93
- let home;
94
- let userRoot;
95
- let emptyStart;
96
- let sourceRoot; // holds source plugin dirs for install tests
97
- let sentinel;
98
- let realHome;
99
- let realProfile;
100
- let realCwd;
101
- // `sys doctor` scans live nodes for faults via `cliClient().listNodes()` — a
102
- // thin CLI forwarder since the crtrd-API re-plumb. No node is ever created here
103
- // (these tests only exercise the static command-plugin validation surface), so
104
- // the fault scan just needs a reachable daemon that answers with an empty
105
- // roster. Stand up a real in-process `createApiServer()` on the isolated home's
106
- // socket so that call resolves instead of trying to autostart a subprocess.
107
- let server;
108
- async function waitForSocket(path) {
109
- for (let i = 0; i < 200; i++) {
110
- if (existsSync(path))
111
- return;
112
- await new Promise((r) => setTimeout(r, 25));
113
- }
114
- throw new Error(`api socket never bound at ${path}`);
115
- }
116
- before(() => {
117
- realHome = process.env['HOME'];
118
- realProfile = process.env['CRTR_PROFILE_ID'];
119
- realCwd = process.cwd();
120
- delete process.env['CRTR_PROFILE_ID'];
121
- });
122
- after(() => {
123
- process.chdir(realCwd);
124
- if (realHome !== undefined)
125
- process.env['HOME'] = realHome;
126
- else
127
- delete process.env['HOME'];
128
- if (realProfile !== undefined)
129
- process.env['CRTR_PROFILE_ID'] = realProfile;
130
- delete process.env['CMDPLUGIN_SENTINEL'];
131
- // Remove EVERY test's temp dirs, not just the last beforeEach's set.
132
- for (const d of tempDirs) {
133
- try {
134
- rmSync(d, { recursive: true, force: true });
135
- }
136
- catch { /* ignore */ }
137
- }
138
- resetScopeCache();
139
- });
140
- const tempDirs = [];
141
- function mintDir(prefix) {
142
- const d = mkdtempSync(join(tmpdir(), prefix));
143
- tempDirs.push(d);
144
- return d;
145
- }
146
- beforeEach(async () => {
147
- home = mintDir('crtr-cmdsurf-home-');
148
- process.env['HOME'] = home;
149
- userRoot = join(home, '.crouter');
150
- mkdirSync(join(userRoot, 'plugins'), { recursive: true });
151
- emptyStart = mintDir('crtr-cmdsurf-empty-');
152
- sourceRoot = mintDir('crtr-cmdsurf-src-');
153
- sentinel = join(emptyStart, 'EXECUTED');
154
- process.env['CMDPLUGIN_SENTINEL'] = sentinel;
155
- process.chdir(emptyStart); // no .crouter ancestor → project scope is empty
156
- resetScopeCache();
157
- // Canvas home is `<HOME>/.crouter/canvas` (no CRTR_HOME set); create it so the
158
- // socket can bind, then stand up the in-process daemon.
159
- mkdirSync(crtrHome(), { recursive: true });
160
- server = createApiServer();
161
- await waitForSocket(apiSocketPath());
162
- });
163
- afterEach(async () => {
164
- await server?.close();
165
- closeDb();
166
- });
167
- /** Write a plugin at `<dir>/<name>/` with a command manifest + executable. */
168
- function writePlugin(dir, name, c) {
169
- const root = join(dir, name);
170
- mkdirSync(join(root, '.crouter-plugin'), { recursive: true });
171
- mkdirSync(join(root, 'bin'), { recursive: true });
172
- writeFileSync(join(root, '.crouter-plugin', 'plugin.json'), JSON.stringify({
173
- name,
174
- version: '0.1.0',
175
- description: 'fixture',
176
- commands: 'commands.json',
177
- transport: { kind: 'exec', executable: c.executable ?? 'bin/cmd.js' },
178
- }));
179
- writeFileSync(join(root, 'commands.json'), JSON.stringify(c.manifest ?? validManifest()));
180
- const execPath = join(root, 'bin', 'cmd.js');
181
- writeFileSync(execPath, SENTINEL_EXEC);
182
- chmodSync(execPath, c.execBit === false ? 0o644 : 0o755);
183
- return root;
184
- }
185
- function assertNotExecuted() {
186
- assert.equal(existsSync(sentinel), false, 'the plugin binary must never be spawned by a validation surface');
187
- }
188
- // ---------------------------------------------------------------------------
189
- // pkg plugin show
190
- // ---------------------------------------------------------------------------
191
- describe('pkg plugin show surfaces command validation', () => {
192
- for (const c of CASES) {
193
- test(`${c.name} → ${c.code} in commands.issues, no execution`, async () => {
194
- writePlugin(join(userRoot, 'plugins'), 'p', c);
195
- resetScopeCache();
196
- const out = await pluginShow.run({ name: 'p' });
197
- const commands = out['commands'];
198
- assert.ok(commands, 'show must inventory commands for a plugin declaring a manifest');
199
- assert.ok(commands.issues.some((i) => i.code === c.code), `expected ${c.code}, got ${JSON.stringify(commands.issues.map((i) => i.code))}`);
200
- // Typed issues render with received/expected/next.
201
- const issue = commands.issues.find((i) => i.code === c.code);
202
- assert.ok(typeof issue.received === 'string' && typeof issue.expected === 'string' && typeof issue.next === 'string');
203
- assert.equal(commands.mounts.length, 0, 'a rejected manifest contributes no mounts');
204
- assertNotExecuted();
205
- });
206
- }
207
- test('valid manifest → inventory with the accepted mount and zero issues', async () => {
208
- writePlugin(join(userRoot, 'plugins'), 'p', { name: 'valid', code: '' });
209
- resetScopeCache();
210
- const out = await pluginShow.run({ name: 'p' });
211
- const commands = out['commands'];
212
- const manifest = out['manifest'];
213
- assert.deepEqual(commands.mounts, ['app']);
214
- assert.equal(commands.issues.length, 0);
215
- assert.deepEqual(manifest.transport, { kind: 'exec', executable: 'bin/cmd.js' }, 'the executable belongs to plugin.json transport, not commands.json');
216
- assertNotExecuted();
217
- });
218
- test('a nested mount composes into an empty exec branch instead of being rejected', async () => {
219
- writePlugin(join(userRoot, 'plugins'), 'p', { name: 'nested mount', code: '', manifest: nestedManifest() });
220
- resetScopeCache();
221
- const out = await pluginShow.run({ name: 'p' });
222
- const commands = out['commands'];
223
- assert.deepEqual(commands.mounts, ['app']);
224
- assert.equal(commands.issues.length, 0);
225
- const snapshot = discoverCommandContributions(new Set(), emptyStart);
226
- const tools = snapshot.contributions[0].node.children.find((node) => node.name === 'tools');
227
- assert.equal(tools.kind, 'branch');
228
- assert.deepEqual(tools.children.map((node) => node.name), ['status']);
229
- assertNotExecuted();
230
- });
231
- });
232
- // ---------------------------------------------------------------------------
233
- // sys doctor
234
- // ---------------------------------------------------------------------------
235
- describe('sys doctor surfaces command validation', () => {
236
- for (const c of CASES) {
237
- test(`${c.name} → fail check with human_action remediation, no execution`, async () => {
238
- writePlugin(join(userRoot, 'plugins'), 'p', c);
239
- resetScopeCache();
240
- const out = await sysDoctorLeaf.run({ scope: 'user', fix: false, remote: false });
241
- const checks = out['checks'];
242
- const cmdCheck = checks.find((k) => k.name.startsWith('plugin:p:commands') && k.status === 'fail');
243
- assert.ok(cmdCheck, `expected a failing command check, got ${JSON.stringify(checks.map((k) => k.name + ':' + k.status))}`);
244
- assert.match(cmdCheck.message, new RegExp(c.code));
245
- assert.equal(cmdCheck.remediation?.kind, 'human_action', 'command remediation is never auto-applied');
246
- assert.equal(out['ok'], false);
247
- assertNotExecuted();
248
- });
249
- }
250
- test('--fix never touches plugin content and leaves the command issue unresolved', async () => {
251
- writePlugin(join(userRoot, 'plugins'), 'p', { name: 'non-executable file', code: 'command_not_executable', execBit: false });
252
- resetScopeCache();
253
- const out = await sysDoctorLeaf.run({ scope: 'user', fix: true, remote: false });
254
- const checks = out['checks'];
255
- const cmdCheck = checks.find((k) => k.name.startsWith('plugin:p:commands') && k.status === 'fail');
256
- assert.ok(cmdCheck, 'the command issue is still reported under --fix');
257
- assert.notEqual(cmdCheck.fixed, true, '--fix must not chmod the plugin executable');
258
- assertNotExecuted();
259
- });
260
- test('valid manifest → a passing command check', async () => {
261
- writePlugin(join(userRoot, 'plugins'), 'p', { name: 'valid', code: '' });
262
- resetScopeCache();
263
- const out = await sysDoctorLeaf.run({ scope: 'user', fix: false, remote: false });
264
- const checks = out['checks'];
265
- const cmdCheck = checks.find((k) => k.name === 'plugin:p:commands');
266
- assert.ok(cmdCheck && cmdCheck.status === 'pass', 'a valid manifest yields a pass check');
267
- assert.match(cmdCheck.message, /app/);
268
- assertNotExecuted();
269
- });
270
- });
271
- // ---------------------------------------------------------------------------
272
- // Cross-plugin top-level collision (drop-both + issue, visible on surfaces)
273
- // ---------------------------------------------------------------------------
274
- describe('cross-plugin top-level collision surfaces on doctor and show', () => {
275
- function installTwoClaimants() {
276
- // Two distinct plugins, both valid in isolation, both claiming `app`.
277
- writePlugin(join(userRoot, 'plugins'), 'p-one', { name: 'valid', code: '' });
278
- writePlugin(join(userRoot, 'plugins'), 'p-two', { name: 'valid', code: '' });
279
- resetScopeCache();
280
- }
281
- test('neither claimant mounts: discovery drops the collided command from the tree', () => {
282
- installTwoClaimants();
283
- const snapshot = discoverCommandContributions(new Set(['sys']));
284
- assert.equal(snapshot.contributions.length, 0, 'a collided top-level command must not be mounted by ANY claimant');
285
- const collisions = snapshot.issues.filter((i) => i.code === 'command_collision');
286
- assert.deepEqual(collisions.map((i) => i.plugin).sort(), ['p-one', 'p-two'], 'both claimants are flagged');
287
- });
288
- test('sys doctor fails BOTH claimants with the collision (no false pass)', async () => {
289
- installTwoClaimants();
290
- const out = await sysDoctorLeaf.run({ scope: 'user', fix: false, remote: false });
291
- const checks = out['checks'];
292
- for (const name of ['p-one', 'p-two']) {
293
- const passCheck = checks.find((k) => k.name === `plugin:${name}:commands` && k.status === 'pass');
294
- assert.equal(passCheck, undefined, `${name} must not PASS while its command is dropped by a collision`);
295
- const failCheck = checks.find((k) => k.name.startsWith(`plugin:${name}:commands`) && k.status === 'fail' && /command_collision/.test(k.message));
296
- assert.ok(failCheck, `${name} must fail with command_collision, got ${JSON.stringify(checks.map((k) => k.name + ':' + k.status))}`);
297
- assert.match(failCheck.message, /claimed by multiple plugins/);
298
- assert.match(failCheck.message, /p-one/);
299
- assert.match(failCheck.message, /p-two/);
300
- assert.equal(failCheck.remediation?.kind, 'human_action');
301
- }
302
- assert.equal(out['ok'], false);
303
- assertNotExecuted();
304
- });
305
- test('pkg plugin show reports the collision on each claimant and lists no mounts', async () => {
306
- installTwoClaimants();
307
- for (const name of ['p-one', 'p-two']) {
308
- const out = await pluginShow.run({ name });
309
- const commands = out['commands'];
310
- assert.deepEqual(commands.mounts, [], `${name} must not list the collided command as an accepted mount`);
311
- const issue = commands.issues.find((i) => i.code === 'command_collision');
312
- assert.ok(issue, `${name} show must carry the command_collision issue`);
313
- assert.deepEqual(issue.received.split(', ').sort(), ['p-one', 'p-two'], 'the issue names both claimants');
314
- }
315
- assertNotExecuted();
316
- });
317
- });
318
- // ---------------------------------------------------------------------------
319
- // pkg plugin install / update
320
- // ---------------------------------------------------------------------------
321
- describe('pkg plugin install/update surface command validation', () => {
322
- for (const c of CASES) {
323
- test(`install ${c.name} → ${c.code} in result.commands.issues, no execution`, async () => {
324
- const src = writePlugin(sourceRoot, 'p', c);
325
- resetScopeCache();
326
- const out = await pluginInstall.run({ installRef: src, scope: 'user' });
327
- const commands = out['commands'];
328
- assert.ok(commands, 'install reports command validation for a plugin declaring a manifest');
329
- assert.ok(commands.issues.some((i) => i.code === c.code), `expected ${c.code}, got ${JSON.stringify(commands.issues.map((i) => i.code))}`);
330
- assert.equal(commands.mounts.length, 0);
331
- assertNotExecuted();
332
- });
333
- }
334
- test('install valid manifest → accepted contribution, zero issues, no execution', async () => {
335
- const src = writePlugin(sourceRoot, 'p', { name: 'valid', code: '' });
336
- resetScopeCache();
337
- const out = await pluginInstall.run({ installRef: src, scope: 'user' });
338
- const commands = out['commands'];
339
- assert.deepEqual(commands.mounts, ['app']);
340
- assert.equal(commands.issues.length, 0);
341
- assertNotExecuted();
342
- });
343
- test('update re-reports the current command validation for an edited manifest', async () => {
344
- // Install valid, then break the on-disk manifest, then update: the report
345
- // must reflect the CURRENT (broken) state — validation is per-call.
346
- const src = writePlugin(sourceRoot, 'p', { name: 'valid', code: '' });
347
- resetScopeCache();
348
- await pluginInstall.run({ installRef: src, scope: 'user' });
349
- // Break the installed copy's manifest in place.
350
- writeFileSync(join(userRoot, 'plugins', 'p', 'commands.json'), JSON.stringify((() => { const m = validManifest(); m['schemaVersion'] = 2; return m; })()));
351
- resetScopeCache();
352
- const out = await pluginUpdate.run({ name: 'p' });
353
- const updated = out['updated'];
354
- const entry = updated.find((u) => u.name === 'p');
355
- assert.ok(entry.commands, 'update reports command validation');
356
- assert.ok(entry.commands.issues.some((i) => i.code === 'command_schema_version'));
357
- assertNotExecuted();
358
- });
359
- });
@@ -1,36 +0,0 @@
1
- // Run with: node --import tsx/esm --test src/core/__tests__/connection-reconnect-resume.test.ts
2
- //
3
- // BUG-REGRESSION: connection faults follow the shared broker-owned retry schedule.
4
- // The broker exercises this policy table directly.
5
- import { test } from 'node:test';
6
- import assert from 'node:assert/strict';
7
- import { nextFaultRetry, policyFor } from '../runtime/fault-recovery.js';
8
- const NOW = Date.parse('2026-06-23T20:00:00.000Z');
9
- const ISO = (ms) => new Date(ms).toISOString();
10
- // ---------------------------------------------------------------------------
11
- // J1 — the policy table itself: connection faults retry on a 5s → 2x → 60s
12
- // cap, and the planner advances the next attempt.
13
- // ---------------------------------------------------------------------------
14
- test('J1 policy table: connection faults use the shared retry schedule', () => {
15
- assert.deepEqual(policyFor('connection'), {
16
- kind: 'connection',
17
- gate: 'online',
18
- max: 8,
19
- baseDelayMs: 5_000,
20
- capDelayMs: 60_000,
21
- fatal: false,
22
- });
23
- const plan = nextFaultRetry({
24
- link: 'pi→provider',
25
- op: 'generation turn',
26
- kind: 'connection',
27
- retry: { disposition: 'auto', by: 'daemon' },
28
- message: 'Connection error.',
29
- since: ISO(NOW),
30
- }, NOW);
31
- assert.equal(plan.attempt, 1, 'the first plan primes attempt 1');
32
- assert.equal(plan.max, 8, 'connection max attempts stay at 8');
33
- assert.equal(plan.nextAt, ISO(NOW + 5_000), 'connection starts at 5s');
34
- assert.equal(plan.fault.retry.attempt, 1, 'planned marker carries the primed attempt');
35
- assert.equal(plan.fault.retry.disposition, 'auto', 'planned marker stays auto');
36
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,38 +0,0 @@
1
- import { after, before, test } from 'node:test';
2
- import assert from 'node:assert/strict';
3
- import { mkdtempSync, rmSync } from 'node:fs';
4
- import { tmpdir } from 'node:os';
5
- import { join } from 'node:path';
6
- import { DatabaseSync } from 'node:sqlite';
7
- import { MIGRATIONS, migrate } from '../canvas/db.js';
8
- let home;
9
- const previousHome = process.env['CRTR_HOME'];
10
- before(() => {
11
- home = mkdtempSync(join(tmpdir(), 'crtr-finalization-migration-'));
12
- process.env['CRTR_HOME'] = home;
13
- });
14
- after(() => {
15
- rmSync(home, { recursive: true, force: true });
16
- if (previousHome === undefined)
17
- delete process.env['CRTR_HOME'];
18
- else
19
- process.env['CRTR_HOME'] = previousHome;
20
- });
21
- test('v16 repairs a v15 database missing canonical finalization columns', () => {
22
- const db = new DatabaseSync(join(home, 'migration.db'));
23
- try {
24
- MIGRATIONS[0](db);
25
- db.exec('PRAGMA user_version = 15');
26
- migrate(db);
27
- const columns = db.prepare('PRAGMA table_info(nodes)').all();
28
- assert.ok(columns.some(({ name }) => name === 'final_report'));
29
- assert.ok(columns.some(({ name }) => name === 'finalized_at'));
30
- // migrate() always brings a db to the latest schema, not just v16 — assert
31
- // against the live migration count rather than a version snapshot that will
32
- // go stale every time a new migration is appended.
33
- assert.equal(db.prepare('PRAGMA user_version').get().user_version, MIGRATIONS.length);
34
- }
35
- finally {
36
- db.close();
37
- }
38
- });
@@ -1 +0,0 @@
1
- export default function register(_pi: unknown): void;
@@ -1,3 +0,0 @@
1
- export default function register(_pi) {
2
- return;
3
- }
@@ -1,15 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import test from 'node:test';
3
- import { writeFileSync } from 'node:fs';
4
- // Target-only fixture for the test-runner's nested-spawn regression coverage
5
- // (see ../test-runner-cheap-sharding.test.ts). Run directly by the real
6
- // suite it is a trivial always-passing test; that regression instead spawns
7
- // it through runTier() with CRTR_SPAWN_PROOF_FILE set and checks that this
8
- // marker file was actually written, proving the spawned process really
9
- // executed this file's test body rather than silently skipping it.
10
- test('writes an observable proof marker when asked, otherwise no-ops', () => {
11
- const proofFile = process.env.CRTR_SPAWN_PROOF_FILE;
12
- if (proofFile)
13
- writeFileSync(proofFile, 'ran');
14
- assert.ok(true);
15
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,108 +0,0 @@
1
- // Run with: node --import tsx/esm --test src/core/__tests__/fork.test.ts
2
- //
3
- // Covers `crtr node new --fork-from`: the spawn-time branch where a new node is
4
- // born as a COPY of an existing pi conversation. Two pure layers are unit-tested
5
- // here — `buildPiArgv` emitting `--fork` (vs `--session`), and `resolveForkSource`
6
- // turning a node id / path / uuid into the `--fork <path|id>` argument. The tmux
7
- // spawn itself is exercised elsewhere (it needs a live pi + tmux).
8
- import { test, before, after, beforeEach } from 'node:test';
9
- import assert from 'node:assert/strict';
10
- import { mkdtempSync, rmSync } from 'node:fs';
11
- import { tmpdir } from 'node:os';
12
- import { join } from 'node:path';
13
- import { createNode } from '../canvas/canvas.js';
14
- import { closeDb } from '../canvas/db.js';
15
- import { buildPiArgv } from '../runtime/launch.js';
16
- import { resolveForkSource } from '../runtime/spawn.js';
17
- let home;
18
- function node(id, over = {}) {
19
- return {
20
- node_id: id,
21
- name: id,
22
- created: new Date().toISOString(),
23
- cwd: '/tmp/work',
24
- kind: 'developer',
25
- mode: 'base',
26
- lifecycle: 'terminal',
27
- status: 'active',
28
- ...over,
29
- };
30
- }
31
- before(() => {
32
- home = mkdtempSync(join(tmpdir(), 'crtr-fork-'));
33
- process.env['CRTR_HOME'] = home;
34
- });
35
- beforeEach(() => {
36
- closeDb();
37
- rmSync(home, { recursive: true, force: true });
38
- });
39
- after(() => {
40
- closeDb();
41
- rmSync(home, { recursive: true, force: true });
42
- delete process.env['CRTR_HOME'];
43
- });
44
- // ---------------------------------------------------------------------------
45
- // buildPiArgv — `--fork` is the spawn-time branch (not `--session`)
46
- // ---------------------------------------------------------------------------
47
- test('buildPiArgv emits --fork <src> and delivers the kickoff prompt', () => {
48
- const m = node('n');
49
- const { argv } = buildPiArgv(m, { prompt: 'continue from here', forkFrom: '/abs/src.jsonl' });
50
- const i = argv.indexOf('--fork');
51
- assert.ok(i >= 0, 'argv carries --fork');
52
- assert.equal(argv[i + 1], '/abs/src.jsonl', 'forks from the resolved source');
53
- assert.ok(!argv.includes('--session'), 'a fork never also resumes');
54
- assert.equal(argv[argv.length - 1], 'continue from here', 'the kickoff prompt is the last positional');
55
- });
56
- test('buildPiArgv prefers --fork over --session when both are somehow set', () => {
57
- const m = node('n');
58
- const { argv } = buildPiArgv(m, { forkFrom: '/abs/src.jsonl', resumeSessionPath: '/abs/own.jsonl' });
59
- assert.ok(argv.includes('--fork'), 'fork wins');
60
- assert.ok(!argv.includes('--session'), 'resume is suppressed when forking');
61
- });
62
- test('buildPiArgv without forkFrom is unchanged (fresh launch, no --fork)', () => {
63
- const m = node('n');
64
- const { argv } = buildPiArgv(m, { prompt: 'go' });
65
- assert.ok(!argv.includes('--fork'), 'no fork on an ordinary fresh launch');
66
- assert.ok(!argv.includes('--session'), 'no resume either');
67
- });
68
- // ---------------------------------------------------------------------------
69
- // resolveForkSource — node id / path / uuid → the `--fork` argument
70
- // ---------------------------------------------------------------------------
71
- test('resolveForkSource resolves a node id to its absolute session FILE', () => {
72
- createNode(node('src', { pi_session_id: 'uuid-1', pi_session_file: '/abs/src.jsonl' }));
73
- assert.equal(resolveForkSource('src'), '/abs/src.jsonl');
74
- });
75
- test('resolveForkSource THROWS when a node has a session id but no captured FILE', () => {
76
- // Broker-cut contract (U6/§B.broker): the broker forks an absolute .jsonl PATH,
77
- // never a bare session id. A node row carrying only pi_session_id (no
78
- // pi_session_file) can no longer be forked — it fails loudly pre-launch.
79
- createNode(node('src', { pi_session_id: 'uuid-1' }));
80
- assert.throws(() => resolveForkSource('src'), /no pi session yet|session FILE/);
81
- });
82
- test('resolveForkSource throws when the node has no pi session to fork yet', () => {
83
- createNode(node('fresh'));
84
- assert.throws(() => resolveForkSource('fresh'), /no pi session yet/);
85
- });
86
- test('resolveForkSource passes an absolute path straight through', () => {
87
- assert.equal(resolveForkSource('/some/where/sess.jsonl'), '/some/where/sess.jsonl');
88
- });
89
- test('resolveForkSource makes a relative path absolute', () => {
90
- assert.equal(resolveForkSource('sub/sess.jsonl'), join(process.cwd(), 'sub/sess.jsonl'));
91
- });
92
- test('resolveForkSource THROWS on a bare/partial uuid that resolves to no session', () => {
93
- // Broker-cut contract (U6): an unknown bare/partial uuid is scanned against
94
- // pi's sessions store and fails loudly when it matches nothing — it is no
95
- // longer passed through verbatim (the broker fork won't resolve a uuid).
96
- const sessRoot = mkdtempSync(join(tmpdir(), 'crtr-pi-agent-'));
97
- process.env['PI_CODING_AGENT_DIR'] = sessRoot;
98
- try {
99
- assert.throws(() => resolveForkSource('019e8ce3-322e'), /no pi session/);
100
- }
101
- finally {
102
- delete process.env['PI_CODING_AGENT_DIR'];
103
- rmSync(sessRoot, { recursive: true, force: true });
104
- }
105
- });
106
- test('resolveForkSource rejects an empty reference', () => {
107
- assert.throws(() => resolveForkSource(' '), /requires a node id/);
108
- });