@north-light/crouter 0.3.173 → 0.3.174

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