@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,31 +1,16 @@
1
- // Tests for the human subtree argv-model migration.
2
- // Run with: node --import tsx/esm --test 'src/commands/__tests__/human.test.ts'
1
+ // Regression: a caller passing BOTH a positional AND piped stdin (e.g.
2
+ // `crtr node new --kind x "title" < prompt.md`, or `crtr human ask -
3
+ // <<EOF`) used to have the positional silently win, with the entire piped
4
+ // body dropped on the floor. `-` must always mean "read stdin", and any
5
+ // OTHER positional alongside genuinely piped, non-empty stdin must error
6
+ // loudly rather than silently pick one.
3
7
  //
4
- // These tests exercise the leaf param schemas via parseArgv (framework) and
5
- // spot-check the leaf definitions directly — no subprocess spawning, no tmux.
6
- import { test, describe, beforeEach, afterEach } from 'node:test';
8
+ // Run with: node --import tsx/esm --test 'src/commands/__tests__/human.test.ts'
9
+ import { test, describe } from 'node:test';
7
10
  import assert from 'node:assert/strict';
8
- import { writeFileSync, mkdirSync } from 'node:fs';
9
- import { tmpdir } from 'node:os';
10
- import { join } from 'node:path';
11
- import { randomBytes } from 'node:crypto';
12
11
  import { Readable } from 'node:stream';
13
- import { parseArgv, unknownPathError } from '../../core/command.js';
14
- import { renderLeafArgv } from '../../core/help.js';
15
- import { humanAsk, sourceStamp } from '../human/prompts.js';
16
- import { humanReviewBranch } from '../human/review.js';
17
- import { registerHuman } from '../human.js';
18
- import { coerceSingleSelectAgainst } from '../human/queue.js';
19
- // ---------------------------------------------------------------------------
20
- // Helper: write a temp JSON file and return its path.
21
- // ---------------------------------------------------------------------------
22
- function tmpJson(obj) {
23
- const dir = join(tmpdir(), `crtr-human-test-${randomBytes(4).toString('hex')}`);
24
- mkdirSync(dir, { recursive: true });
25
- const p = join(dir, 'deck.json');
26
- writeFileSync(p, JSON.stringify(obj));
27
- return p;
28
- }
12
+ import { parseArgv } from '../../core/command.js';
13
+ import { humanAsk } from '../human/prompts.js';
29
14
  async function withPipedStdin(body, fn) {
30
15
  const original = process.stdin;
31
16
  const stdin = Readable.from([Buffer.from(body)]);
@@ -38,178 +23,7 @@ async function withPipedStdin(body, fn) {
38
23
  Object.defineProperty(process, 'stdin', { value: original, configurable: true });
39
24
  }
40
25
  }
41
- // ---------------------------------------------------------------------------
42
- // human review new — positional file (path) + required --subtitle + optional --output
43
- // ---------------------------------------------------------------------------
44
- describe('human review command branch', () => {
45
- const review = registerHuman().children.find((child) => child.name === 'review');
46
- const newLeaf = humanReviewBranch.children.find((child) => child.name === 'new' && child.kind === 'leaf');
47
- test('registers the canonical review branch', () => {
48
- assert.equal(review, humanReviewBranch);
49
- assert.deepEqual(humanReviewBranch.children.map((child) => child.name), ['new', 'comment']);
50
- });
51
- test('bare review names valid children rather than accepting the legacy file positional', () => {
52
- const error = unknownPathError(humanReviewBranch, ['human', 'review'], '/tmp/plan.md');
53
- assert.equal(error.code, 'unknown_path');
54
- assert.match(error.message, /unknown subcommand: \/tmp\/plan\.md/);
55
- assert.match(String(error.details?.next), /Valid children: new, comment/);
56
- });
57
- test('new parses file + required subtitle', async () => {
58
- assert.ok(newLeaf);
59
- const result = await parseArgv(newLeaf.help.params ?? [], ['/tmp/plan.md', '--subtitle', 'Review this plan so implementation can begin safely.']);
60
- assert.equal(result['file'], '/tmp/plan.md');
61
- assert.equal(result['subtitle'], 'Review this plan so implementation can begin safely.');
62
- });
63
- test('new parses file + subtitle + --output', async () => {
64
- assert.ok(newLeaf);
65
- const result = await parseArgv(newLeaf.help.params ?? [], ['/tmp/plan.md', '--subtitle', 'Review this plan so implementation can begin safely.', '--output', '/tmp/fb.json']);
66
- assert.equal(result['file'], '/tmp/plan.md');
67
- assert.equal(result['output'], '/tmp/fb.json');
68
- });
69
- // Validation is complete, never first-failure: one invocation yields ONE
70
- // error naming every missing required parameter, and its Next: mandates the
71
- // schema read rather than patching the first field.
72
- test('new missing file AND subtitle throws ONE missing_parameter naming both', async () => {
73
- assert.ok(newLeaf);
74
- await assert.rejects(() => parseArgv(newLeaf.help.params ?? [], [], { leafPath: ['human', 'review', 'new'] }), (err) => {
75
- assert.match(err.message, /required parameters are missing: positional FILE, --subtitle/);
76
- assert.equal(err.details?.field, 'file, subtitle');
77
- assert.match(err.details?.next ?? '', /Run `crtr human review new -h` and read the full schema before re-issuing/);
78
- return true;
79
- });
80
- });
81
- });
82
- // ---------------------------------------------------------------------------
83
- // human notify — positional title + required --subtitle + optional --body
84
- // ---------------------------------------------------------------------------
85
- describe('human notify: params', () => {
86
- const params = [
87
- { kind: 'positional', name: 'title', type: 'string', required: true, constraint: 'Headline.' },
88
- { kind: 'flag', name: 'subtitle', type: 'string', required: true, constraint: 'Status and stakes.' },
89
- { kind: 'flag', name: 'body', type: 'string', required: false, constraint: 'Markdown body.' },
90
- ];
91
- test('parses positional title + required subtitle', async () => {
92
- const result = await parseArgv(params, ['Build done', '--subtitle', 'The build passed, so the change is ready to review.']);
93
- assert.equal(result['title'], 'Build done');
94
- assert.equal(result['subtitle'], 'The build passed, so the change is ready to review.');
95
- });
96
- test('parses title + subtitle + --body', async () => {
97
- const result = await parseArgv(params, ['Done', '--subtitle', 'All tests passed, so deployment can proceed.', '--body', 'All tests pass.']);
98
- assert.equal(result['title'], 'Done');
99
- assert.equal(result['body'], 'All tests pass.');
100
- });
101
- });
102
- // ---------------------------------------------------------------------------
103
- // human show — positional path + --watch bool + --window enum
104
- // ---------------------------------------------------------------------------
105
- describe('human show: params', () => {
106
- const params = [
107
- { kind: 'positional', name: 'path', type: 'path', required: true, constraint: 'File to render.' },
108
- { kind: 'flag', name: 'watch', type: 'bool', required: false, constraint: 'Presence = true.' },
109
- { kind: 'flag', name: 'window', type: 'enum', choices: ['auto', 'split', 'new'], required: false, default: 'auto', constraint: 'Placement.' },
110
- ];
111
- test('parses positional path', async () => {
112
- const result = await parseArgv(params, ['/tmp/doc.md']);
113
- assert.equal(result['path'], '/tmp/doc.md');
114
- });
115
- test('--watch absent → false (presence-only bool default)', async () => {
116
- const result = await parseArgv(params, ['/tmp/doc.md']);
117
- assert.equal(result['watch'], false);
118
- });
119
- test('--watch present → true', async () => {
120
- const result = await parseArgv(params, ['/tmp/doc.md', '--watch']);
121
- assert.equal(result['watch'], true);
122
- });
123
- test('--watch=true is rejected (bool takes no value)', async () => {
124
- await assert.rejects(() => parseArgv(params, ['/tmp/doc.md', '--watch=true']), (err) => { assert.match(err.message, /takes no value/); return true; });
125
- });
126
- test('--window default is auto', async () => {
127
- const result = await parseArgv(params, ['/tmp/doc.md']);
128
- assert.equal(result['window'], 'auto');
129
- });
130
- test('--window accepts valid enum value', async () => {
131
- const result = await parseArgv(params, ['/tmp/doc.md', '--window', 'split']);
132
- assert.equal(result['window'], 'split');
133
- });
134
- test('--window rejects invalid value', async () => {
135
- await assert.rejects(() => parseArgv(params, ['/tmp/doc.md', '--window', 'float']), (err) => { assert.match(err.message, /must be one of/); return true; });
136
- });
137
- });
138
- // ---------------------------------------------------------------------------
139
- // human ask — --context-file (context-file kind, key=deckFile)
140
- //
141
- // NOTE: The argv parser hardcodes the CLI token as `--context-file` regardless
142
- // of the param's `name` field. The `name` field ("deckFile") becomes the key
143
- // in the input record. So the correct invocation is:
144
- // crtr human ask --context-file deck.json
145
- // not --deck-file. Tests use --context-file accordingly.
146
- // ---------------------------------------------------------------------------
147
- describe('human ask: params', () => {
148
- const params = [
149
- { kind: 'context-file', name: 'deckFile', required: true, constraint: 'Humanloop deck JSON.' },
150
- ];
151
- test('--context-file parses JSON file and yields input.deckFile', async () => {
152
- const deck = { interactions: [{ id: 'q', title: 'Go?', subtitle: 'Approve going ahead so the work can continue.', options: [{ id: 'yes', label: 'Yes' }] }] };
153
- const path = tmpJson(deck);
154
- const result = await parseArgv(params, ['--context-file', path]);
155
- assert.deepEqual(result['deckFile'], deck);
156
- });
157
- test('--context-file missing → missing_parameter', async () => {
158
- await assert.rejects(() => parseArgv(params, []), (err) => { assert.match(err.message, /required parameter is missing/); return true; });
159
- });
160
- test('--context-file with nonexistent file → invalid_type', async () => {
161
- await assert.rejects(() => parseArgv(params, ['--context-file', '/no/such/deck.json']), (err) => { assert.match(err.message, /cannot read file/); return true; });
162
- });
163
- test('--context-file with non-JSON file → invalid_type', async () => {
164
- const dir = join(tmpdir(), `crtr-human-test-${randomBytes(4).toString('hex')}`);
165
- mkdirSync(dir, { recursive: true });
166
- const p = join(dir, 'bad.json');
167
- writeFileSync(p, 'not json at all');
168
- await assert.rejects(() => parseArgv(params, ['--context-file', p]), (err) => { assert.match(err.message, /not valid JSON/); return true; });
169
- });
170
- });
171
- // ---------------------------------------------------------------------------
172
- // human ask — stdin question + strict --context-file deck
173
- // ---------------------------------------------------------------------------
174
- describe('human ask: stdin question + strict deck', () => {
175
- test('help requires an explicit title with the literal stdin body', () => {
176
- const out = renderLeafArgv(humanAsk.help);
177
- assert.match(out, /^ --title TITLE\s+string, optional\. Required with stdin:/m);
178
- assert.match(out, /^ --subtitle SUBTITLE\s+string, optional\. Required with stdin:/m);
179
- assert.match(out, /^ stdin\s+optional\. Simple open-text ask body\./m);
180
- assert.match(out, /single-quoted heredoc/);
181
- assert.match(out, /--context-file PATH/);
182
- assert.match(out, /bodyPath is a relative path to the body file, resolved from the directory containing the deck JSON/);
183
- assert.match(out, /paths escaping with \.\. or symlinks are rejected; absolute paths are unsupported/);
184
- assert.doesNotMatch(out, /crtr human ask "<question>"/);
185
- });
186
- test('reads an explicit title and literal question bytes', async () => {
187
- const question = 'Literal `backticks`, $dollars, $(command), ; semicolon, * glob\nsecond line\n';
188
- const result = await withPipedStdin(question, () => parseArgv(humanAsk.help.params ?? [], ['--title', 'Release decision', '--subtitle', 'Choose whether to release now so the launch can proceed.']));
189
- assert.equal(result['title'], 'Release decision');
190
- assert.equal(result['subtitle'], 'Choose whether to release now so the launch can proceed.');
191
- assert.equal(result['question'], question);
192
- });
193
- test('required stdin errors prescribe stdin rather than a positional payload', async () => {
194
- const params = [{ kind: 'stdin', name: 'body', required: true, constraint: 'Markdown.' }];
195
- await assert.rejects(() => withPipedStdin('', () => parseArgv(params, [])), (err) => {
196
- assert.match(err.message, /required parameter is missing: stdin/);
197
- assert.equal(err.details?.field, 'body');
198
- assert.match(err.details?.next ?? '', /read the full schema before re-issuing/);
199
- assert.doesNotMatch(err.details?.next ?? '', /positional argument/);
200
- return true;
201
- });
202
- });
203
- test('retains positional input compatibility without advertising it to agents', async () => {
204
- const result = await parseArgv(humanAsk.help.params ?? [], ['Should we ship today?']);
205
- assert.equal(result['question'], 'Should we ship today?');
206
- });
207
- // Regression: a caller passing BOTH a positional AND piped stdin (e.g.
208
- // `crtr node new --kind x "title" < prompt.md`, or `crtr human ask -
209
- // <<EOF`) used to have the positional silently win, with the entire piped
210
- // body dropped on the floor. `-` must always mean "read stdin", and any
211
- // OTHER positional alongside genuinely piped, non-empty stdin must error
212
- // loudly rather than silently pick one.
26
+ describe('human ask: positional vs piped stdin', () => {
213
27
  test('`-` positional reads stdin instead of taking the literal value', async () => {
214
28
  const body = 'Should we ship today?\nmulti-line brief\n';
215
29
  const result = await withPipedStdin(body, () => parseArgv(humanAsk.help.params ?? [], ['-']));
@@ -230,129 +44,4 @@ describe('human ask: stdin question + strict deck', () => {
230
44
  const result = await withPipedStdin('', () => parseArgv(humanAsk.help.params ?? [], ['Should we ship today?']));
231
45
  assert.equal(result['question'], 'Should we ship today?');
232
46
  });
233
- test('parses --context-file into input.deck while keeping the strict deck path', async () => {
234
- const deck = {
235
- title: 'Choose a path',
236
- interactions: [
237
- { id: 'q', title: 'Pick one', subtitle: 'Choose the path that best supports the release.', options: [{ id: 'yes', label: 'Yes' }] },
238
- ],
239
- };
240
- const path = tmpJson(deck);
241
- const result = await withPipedStdin('', () => parseArgv(humanAsk.help.params ?? [], ['--context-file', path]));
242
- assert.deepEqual(result['deck'], deck);
243
- });
244
- });
245
- // ---------------------------------------------------------------------------
246
- // human cancel — positional job_id + optional --reason
247
- // ---------------------------------------------------------------------------
248
- describe('human cancel: params', () => {
249
- const params = [
250
- { kind: 'positional', name: 'job_id', type: 'string', required: true, constraint: 'Interaction node id.' },
251
- { kind: 'flag', name: 'reason', type: 'string', required: false, constraint: 'Why it was retracted.' },
252
- ];
253
- test('parses positional job_id', async () => {
254
- const result = await parseArgv(params, ['abc-1234']);
255
- assert.equal(result['job_id'], 'abc-1234');
256
- });
257
- test('parses job_id + --reason', async () => {
258
- const result = await parseArgv(params, ['abc-1234', '--reason', 'answered myself']);
259
- assert.equal(result['job_id'], 'abc-1234');
260
- assert.equal(result['reason'], 'answered myself');
261
- });
262
- test('missing job_id throws missing_parameter', async () => {
263
- await assert.rejects(() => parseArgv(params, []), (err) => { assert.match(err.message, /required parameter is missing/); return true; });
264
- });
265
- });
266
- // ---------------------------------------------------------------------------
267
- // sourceStamp — an optional presentation label, nothing more.
268
- //
269
- // Ticket identity and attribution come from the bridge node directory and its
270
- // parent relation, never from deck data — so the stamp carries at most
271
- // `{sessionName}`, resolved from CRTR_NODE_ID through crtrd. Without a node id,
272
- // or when crtrd cannot resolve one, the stamp is empty. `human cancel` is not
273
- // unit-testable in-process for the same reason: it delegates node lookup +
274
- // cancellation to crtrd, so exercising it needs a live daemon.
275
- // ---------------------------------------------------------------------------
276
- describe('sourceStamp: asking-node attribution', () => {
277
- beforeEach(() => {
278
- delete process.env['CRTR_NODE_ID'];
279
- });
280
- afterEach(() => {
281
- delete process.env['CRTR_NODE_ID'];
282
- });
283
- test('bare shell (no CRTR_NODE_ID) → empty stamp', async () => {
284
- assert.deepEqual(await sourceStamp(), {});
285
- });
286
- test('CRTR_NODE_ID crtrd cannot resolve → empty stamp, never a raw node id', async () => {
287
- process.env['CRTR_NODE_ID'] = 'ghost-node';
288
- assert.deepEqual(await sourceStamp(), {});
289
- });
290
- });
291
- // ---------------------------------------------------------------------------
292
- // human list — --limit int + --cursor string
293
- // ---------------------------------------------------------------------------
294
- describe('human list: params', () => {
295
- const params = [
296
- { kind: 'flag', name: 'limit', type: 'int', required: false, default: 20, constraint: 'Default 20.' },
297
- { kind: 'flag', name: 'cursor', type: 'string', required: false, constraint: 'Pagination token.' },
298
- ];
299
- test('defaults: limit=20, cursor=undefined', async () => {
300
- const result = await parseArgv(params, []);
301
- assert.equal(result['limit'], 20);
302
- assert.equal(result['cursor'], undefined);
303
- });
304
- test('--limit parses integer', async () => {
305
- const result = await parseArgv(params, ['--limit', '5']);
306
- assert.equal(result['limit'], 5);
307
- });
308
- test('--limit rejects non-integer', async () => {
309
- await assert.rejects(() => parseArgv(params, ['--limit', 'abc']), (err) => { assert.match(err.message, /must be an integer/); return true; });
310
- });
311
- test('--cursor passes through as string', async () => {
312
- const result = await parseArgv(params, ['--cursor', 'tok_abc123']);
313
- assert.equal(result['cursor'], 'tok_abc123');
314
- });
315
- });
316
- // ---------------------------------------------------------------------------
317
- // human resolve — web-array → humanloop single-select coercion.
318
- //
319
- // Regression: the web always posts `selectedOptionIds` (an array) for every
320
- // option pick, but humanloop's strict validator rejects an array on a
321
- // non-multiSelect interaction ("invalid multi-select response"). Every
322
- // single-select deck resolved from the web — notify acks, yes/no approvals,
323
- // radio decisions — failed until this coercion. Multi-select and freetext must
324
- // pass through untouched.
325
- // ---------------------------------------------------------------------------
326
- describe('coerceSingleSelectAgainst: web array → humanloop shape', () => {
327
- const deck = {
328
- interactions: [
329
- { id: 'notify', title: 'n', subtitle: 'Acknowledge this notice so the work can continue.', options: [{ id: 'ok', label: 'OK' }], kind: 'notify' },
330
- { id: 'pick', title: 'p', subtitle: 'Choose every applicable option so the plan can continue.', options: [{ id: 'a', label: 'A' }, { id: 'b', label: 'B' }], multiSelect: true },
331
- { id: 'ask', title: 'a', subtitle: 'Provide guidance so the work can continue.', options: [], allowFreetext: true },
332
- ],
333
- };
334
- test('single-select 1-element array folds to selectedOptionId', () => {
335
- const [r] = coerceSingleSelectAgainst([{ id: 'notify', selectedOptionIds: ['ok'] }], deck);
336
- assert.equal(r.selectedOptionId, 'ok');
337
- assert.equal(r.selectedOptionIds, undefined);
338
- });
339
- test('multi-select array passes through untouched', () => {
340
- const [r] = coerceSingleSelectAgainst([{ id: 'pick', selectedOptionIds: ['a', 'b'] }], deck);
341
- assert.deepEqual(r.selectedOptionIds, ['a', 'b']);
342
- assert.equal(r.selectedOptionId, undefined);
343
- });
344
- test('single-select multi-element array is left for humanloop to reject', () => {
345
- const [r] = coerceSingleSelectAgainst([{ id: 'notify', selectedOptionIds: ['ok', 'x'] }], deck);
346
- assert.deepEqual(r.selectedOptionIds, ['ok', 'x']);
347
- assert.equal(r.selectedOptionId, undefined);
348
- });
349
- test('freetext response passes through untouched', () => {
350
- const [r] = coerceSingleSelectAgainst([{ id: 'ask', freetext: 'hello' }], deck);
351
- assert.equal(r.freetext, 'hello');
352
- assert.equal(r.selectedOptionId, undefined);
353
- });
354
- test('already-singular response is preserved', () => {
355
- const [r] = coerceSingleSelectAgainst([{ id: 'notify', selectedOptionId: 'ok' }], deck);
356
- assert.equal(r.selectedOptionId, 'ok');
357
- });
358
47
  });
@@ -1,8 +1,8 @@
1
1
  import { CrtrClient } from '../api/index.js';
2
2
  import type { CanvasSource } from '../core/canvas/source.js';
3
- import type { NodeMeta, NodeRow, NodeStatus, SubscriptionRef } from '../core/canvas/types.js';
3
+ import type { NodeStatus, SubscriptionRef } from '../core/canvas/types.js';
4
4
  import type { Scope } from '../types.js';
5
- import type { NodeDetailDTO } from '../api/dto/nodes.js';
5
+ import type { NodeDetailDTO, NodeSummaryDTO } from '../api/dto/nodes.js';
6
6
  /** Rethrow an `ApiError` as the clean structured CLI error agents parse
7
7
  * (`core/io` `handle`) — instead of the generic "internal bug" stderr path a
8
8
  * raw non-`CrtrError` throw would take. The mapping itself lives in ONE place
@@ -65,11 +65,11 @@ export declare class ApiCanvasSource implements CanvasSource {
65
65
  /** Map a 404 from the API to the interface's `null` "not found" contract;
66
66
  * re-throw everything else. */
67
67
  private orNull;
68
- getNode(nodeId: string): Promise<NodeMeta | null>;
69
- getRow(nodeId: string): Promise<NodeRow | null>;
68
+ getNode(nodeId: string): Promise<NodeDetailDTO | null>;
69
+ getRow(nodeId: string): Promise<NodeDetailDTO | null>;
70
70
  listNodes(filter?: {
71
71
  status?: NodeStatus | NodeStatus[];
72
- }): Promise<NodeRow[]>;
72
+ }): Promise<NodeSummaryDTO[]>;
73
73
  subscriptionsOf(subscriber: string): Promise<SubscriptionRef[]>;
74
74
  subscribersOf(publisher: string): Promise<SubscriptionRef[]>;
75
75
  /** BFS over the active `subscribes_to` edges from `root` (its transitive view),
@@ -146,88 +146,11 @@ export function cliClient(opts) {
146
146
  });
147
147
  }
148
148
  // ---------------------------------------------------------------------------
149
- // DTO → internal projections
150
- //
151
- // The DTO boundary deliberately reshapes internals (spec §3.1), so these are
152
- // lossy in the read-only direction: fields the API surface does not carry
153
- // (tmux-presence runtime, per-edge `active`) are defaulted, matching the
154
- // documented parity bar (structural, not byte-identical). See the mapping notes
155
- // on each helper.
156
- // ---------------------------------------------------------------------------
157
- /** `NodeSummaryDTO` → `NodeRow`. The DTO carries every indexed identity + core
158
- * runtime column; the four fields it omits are LOCAL tmux-presence /
159
- * process-identity runtime (`window`/`tmux_session`/`pane`/`pi_pid_identity`),
160
- * which are meaningless to a remote/pure client and are defaulted to null. A
161
- * viewer reading canvas STRUCTURE never needs them; local placement reads them
162
- * from tmux, not the source. */
163
- function summaryToRow(s) {
164
- return {
165
- node_id: s.node_id,
166
- name: s.name,
167
- kind: s.kind,
168
- mode: s.mode,
169
- lifecycle: s.lifecycle,
170
- status: s.status,
171
- cwd: s.cwd,
172
- host_kind: s.host_kind,
173
- profile_id: s.profile_id,
174
- parent: s.parent,
175
- created: s.created,
176
- intent: s.intent,
177
- waiting_for: s.waiting_for,
178
- final_report: s.final_report ?? null,
179
- finalized_at: s.finalized_at ?? null,
180
- pi_pid: s.pi_pid,
181
- pi_pid_identity: null,
182
- window: null,
183
- tmux_session: null,
184
- pane: null,
185
- };
186
- }
187
- /** `NodeDetailDTO` → `NodeMeta`. Populates the durable-identity ∪ runtime fields
188
- * the DTO projects; the durable LAUNCH-RECIPE facts a projection cannot carry
189
- * (`launch`/`env`, `persona_ack`, `model_override`, `passive_default`,
190
- * `fork_from`, `pi_session_file`,
191
- * `cycle_pending`) are left undefined — read-only viewer/inspect consumers
192
- * (Stage B-7/B-9) never read them; the daemon owns the full meta for revive. */
193
- function detailToMeta(d) {
194
- return {
195
- node_id: d.node_id,
196
- name: d.name,
197
- description: d.description,
198
- icon: d.icon,
199
- cycles: d.cycles,
200
- created: d.created,
201
- cwd: d.cwd,
202
- host_kind: d.host_kind,
203
- profile_id: d.profile_id,
204
- kind: d.kind,
205
- mode: d.mode,
206
- lifecycle: d.lifecycle,
207
- parent: d.parent,
208
- spawned_by: d.edges.spawned_by,
209
- pi_session_id: d.pi_session_id ?? null,
210
- managed_worktree: d.worktree ?? null,
211
- // Runtime (from the authoritative row, projected onto the DTO).
212
- status: d.status,
213
- intent: d.intent,
214
- waiting_for: d.waiting_for,
215
- final_report: d.final_report ?? null,
216
- finalized_at: d.finalized_at ?? null,
217
- pi_pid: d.pi_pid,
218
- pi_pid_identity: d.pi_pid_identity ?? null,
219
- };
220
- }
221
- /** Edge ids → `SubscriptionRef[]`. KNOWN GAP: `NodeEdgesDTO` carries only the
222
- * peer node ids, not the per-edge `active` flag or `created` timestamp (the
223
- * `GET /nodes/{id}` projection built in A-1/A-7 does not expose them). We
224
- * default `active: true` (the SAFE direction — never under-reports a live
225
- * listener) and `created: ''` (matching `RemoteCanvasSource`'s same-shaped
226
- * fallback). Fully faithful `active`/`created` needs an additive DTO extension
227
- * (surface it as objects), which is an A-1/A-7 change, not B-0. */
228
- // ---------------------------------------------------------------------------
229
149
  // ApiCanvasSource — a read CanvasSource backed entirely by the crtrd API
230
150
  // ---------------------------------------------------------------------------
151
+ // NodeSummaryDTO now carries every NodeRow field and NodeDetailDTO extends it,
152
+ // so the viewer adapter returns the daemon's typed projections directly. It
153
+ // performs no lossy legacy reconstruction or invented local-presence values.
231
154
  // The attach viewer's recurring subtree walk (chrome/canvas-panels.ts + overlays/graph.ts
232
155
  // computeActivity/visitActivity) calls subscriptionsOf/subscribersOf once per
233
156
  // visited node on every poll tick; each call was previously its own
@@ -279,12 +202,10 @@ export class ApiCanvasSource {
279
202
  }
280
203
  }
281
204
  async getNode(nodeId) {
282
- const detail = await this.orNull(() => this.client.getNode(nodeId));
283
- return detail ? detailToMeta(detail) : null;
205
+ return this.orNull(() => this.client.getNode(nodeId));
284
206
  }
285
207
  async getRow(nodeId) {
286
- const detail = await this.orNull(() => this.client.getNode(nodeId));
287
- return detail ? summaryToRow(detail) : null;
208
+ return this.orNull(() => this.client.getNode(nodeId));
288
209
  }
289
210
  async listNodes(filter) {
290
211
  const status = filter?.status;
@@ -302,7 +223,7 @@ export class ApiCanvasSource {
302
223
  else {
303
224
  rows = await this.client.listNodes();
304
225
  }
305
- return rows.map(summaryToRow);
226
+ return rows;
306
227
  }
307
228
  async subscriptionsOf(subscriber) {
308
229
  const roster = await this.roster();
@@ -7,10 +7,7 @@
7
7
  // Outside a TTY it prints the static forest and exits 0 (see runBrowse).
8
8
  import { defineLeaf } from '../core/command.js';
9
9
  import { runBrowse } from '../core/canvas/browse/app.js';
10
- import { cliClient, cliCanvasSource } from './api-client.js';
11
- import { resolveRemoteCanvasTarget } from '../core/remote-canvas-target.js';
12
- import { RemoteEventStream } from '../core/canvas/remote-event-stream.js';
13
- import { readState } from '../core/config.js';
10
+ import { ApiCanvasSource, cliClient } from './api-client.js';
14
11
  import { getDefaultProfileId } from '../core/profiles/default-binding.js';
15
12
  export const browseLeaf = defineLeaf({
16
13
  name: 'browse',
@@ -41,13 +38,6 @@ export const browseLeaf = defineLeaf({
41
38
  required: false,
42
39
  constraint: 'Exact profile id for the initial profile filter (on by default; P toggles All profiles). Default: the launching node\'s profile via CRTR_PROFILE_ID, then this cwd\'s pinned default profile; absent means All profiles.',
43
40
  },
44
- {
45
- kind: 'flag',
46
- name: 'canvas',
47
- type: 'string',
48
- required: false,
49
- constraint: 'Read from the named remote canvas target (see `crtr canvas config list`) instead of the local canvas. Overrides `crtr canvas use`.',
50
- },
51
41
  ],
52
42
  output: [],
53
43
  outputKind: 'object',
@@ -63,20 +53,7 @@ export const browseLeaf = defineLeaf({
63
53
  process.env['CRTR_PROFILE_ID'] ??
64
54
  getDefaultProfileId(cwd) ??
65
55
  undefined;
66
- const canvasName = input['canvas'];
67
- const source = cliCanvasSource({ canvasName });
68
- // The EFFECTIVE remote target name — an explicit --canvas, or (mirroring
69
- // resolveCanvasSource's own precedence) the durable `crtr canvas use`
70
- // selection. Only a remote target needs an event stream; resolve its
71
- // credentials ONCE here (not re-derived inside app.ts, which stays
72
- // credential-agnostic).
73
- const effectiveCanvasName = canvasName ?? readState('user').activeCanvas ?? undefined;
74
- const eventStream = effectiveCanvasName !== undefined
75
- ? (() => {
76
- const { previewEndpoint, relayToken } = resolveRemoteCanvasTarget(effectiveCanvasName);
77
- return new RemoteEventStream(previewEndpoint, relayToken);
78
- })()
79
- : undefined;
56
+ const source = new ApiCanvasSource();
80
57
  // The `x` close-out routes through the daemon API (browse `x` = finish the
81
58
  // root to `done`); the callback keeps app.ts off the openDb-reaching
82
59
  // runtime/close.js.
@@ -85,10 +62,7 @@ export const browseLeaf = defineLeaf({
85
62
  cwd,
86
63
  profileId,
87
64
  source,
88
- eventStream,
89
- viewedNodeIds: effectiveCanvasName === undefined
90
- ? async () => new Set((await cliClient().listFocuses()).map((focus) => focus.node_id))
91
- : undefined,
65
+ viewedNodeIds: async () => new Set((await cliClient().listFocuses()).map((focus) => focus.node_id)),
92
66
  closeNode: (id) => cliClient().closeNode(id, { finish: true }).then((r) => ({ closed: r.closed })),
93
67
  });
94
68
  },
@@ -31,7 +31,7 @@ function maskedTarget(name, target, secrets) {
31
31
  const canvasConfigAdd = defineLeaf({
32
32
  name: 'add',
33
33
  description: 'register a remote canvas target (preview endpoint + relay token)',
34
- whenToUse: 'wiring up a remote canvas so `node inspect`, `canvas browse`, or `surface attach --canvas` can read it \u2014 stores the preview endpoint in config.json and the raw relay token in the 0600 secrets store (never together, never persisted to config.json or logged). Re-running with the same name overwrites both.',
34
+ whenToUse: 'wiring up a remote canvas so `node inspect` or `surface attach --canvas` can reach it \u2014 stores the preview endpoint in config.json and the raw relay token in the 0600 secrets store (never together, never persisted to config.json or logged). Re-running with the same name overwrites both.',
35
35
  help: {
36
36
  name: 'canvas config add',
37
37
  summary: 'register (or overwrite) a named remote canvas target',
@@ -1,5 +1,5 @@
1
- // `crtr canvas use` — durably select which canvas read commands
2
- // (`node inspect list/show`, `canvas browse`) default onto: a named remote
1
+ // `crtr canvas use` — durably select which remote-capable read commands
2
+ // (such as `node inspect list/show`) default onto: a named remote
3
3
  // target, or back to local. A single leaf, not a branch — there is exactly
4
4
  // one decision here (pick a target, or go local), not a family of verbs.
5
5
  import { defineLeaf } from '../core/command.js';
@@ -10,7 +10,7 @@ const SCOPE = 'user';
10
10
  export const canvasUseLeaf = defineLeaf({
11
11
  name: 'use',
12
12
  description: 'select the durable default canvas for read commands (a remote target, or local)',
13
- whenToUse: 'switching what `node inspect list/show` and `canvas browse` read from by default, without passing `--canvas <name>` on every invocation \u2014 select a remote target registered via `crtr canvas config add`, or switch back to local. A command\u2019s own `--canvas <name>` flag always overrides this for that one call.',
13
+ whenToUse: 'switching what remote-capable read commands such as `node inspect list/show` read from by default, without passing `--canvas <name>` on every invocation \u2014 select a remote target registered via `crtr canvas config add`, or switch back to local. A command\u2019s own `--canvas <name>` flag always overrides this for that one call.',
14
14
  help: {
15
15
  name: 'canvas use',
16
16
  summary: 'select the durable default canvas (a registered remote target, or local) for read commands',
@@ -43,7 +43,7 @@ export function registerCanvas() {
43
43
  help: {
44
44
  name: 'canvas',
45
45
  summary: 'observe and supervise the whole agent graph',
46
- model: 'Canvas-wide operations, distinct from per-node work (`node`) and a node\'s own spine write verb (`push`). `dashboard` renders the subscription forest as a tree; `browse` opens an interactive full-screen navigator (tabs/tree/search) over the whole canvas and resumes the chosen node; `attention` aggregates pending human asks across the graph; `revive --all` mass-reconnects every disconnected node (bringing back ONE named node is `node lifecycle revive <id>` instead); `history` searches and recalls the content record (reports + context docs) of past work in a cwd; `prune` bounds growth by deleting terminal nodes past a TTL. `config` registers/lists remote canvas targets (preview endpoint + relay token); `use` switches read commands (`node inspect`, `browse`) onto a configured remote target or back to local.',
46
+ model: 'Canvas-wide operations, distinct from per-node work (`node`) and a node\'s own spine write verb (`push`). `dashboard` renders the subscription forest as a tree; `browse` opens an interactive full-screen navigator (tabs/tree/search) over the whole canvas and resumes the chosen node; `attention` aggregates pending human asks across the graph; `revive --all` mass-reconnects every disconnected node (bringing back ONE named node is `node lifecycle revive <id>` instead); `history` searches and recalls the content record (reports + context docs) of past work in a cwd; `prune` bounds growth by deleting terminal nodes past a TTL. `config` registers/lists remote canvas targets (preview endpoint + relay token); `use` switches remote-capable read commands such as `node inspect` onto a configured target or back to local.',
47
47
  },
48
48
  children: [dashboardLeaf, canvasSnapshotLeaf, canvasRosterLeaf, browseLeaf, attentionBranch, reviveLeaf, historyBranch, chordLeaf, issueBranch, canvasPruneLeaf, canvasRebuildIndexLeaf, canvasConfigBranch, canvasUseLeaf],
49
49
  });
@@ -496,8 +496,12 @@ const cancelLeaf = defineLeaf({
496
496
  },
497
497
  run: async (input) => {
498
498
  const id = requireCronId(input);
499
+ const runId = process.env['CRTR_RUN_ID'];
499
500
  await cliClient()
500
- .cancelCron(id, scopeQuery())
501
+ .cancelCron(id, {
502
+ ...scopeQuery(),
503
+ ...(runId === undefined || runId === '' ? {} : { run_id: runId }),
504
+ })
501
505
  .catch((err) => rethrowAsCliError(err, 'Check the id against `crtr cron list`.'));
502
506
  return { canceled: id };
503
507
  },
@@ -1,8 +1,4 @@
1
- import type { Deck, InteractionResponse } from '../../core/human/types.js';
2
1
  export declare const humanList: import("../../core/command.js").LeafDef;
3
2
  export declare const humanDeck: import("../../core/command.js").LeafDef;
4
- /** Pure core of {@link coerceSingleSelect}, split out so it is testable without
5
- * a deck.json on disk. */
6
- export declare function coerceSingleSelectAgainst(responses: InteractionResponse[], deck: Deck): InteractionResponse[];
7
3
  export declare const humanResolve: import("../../core/command.js").LeafDef;
8
4
  export declare const humanCancel: import("../../core/command.js").LeafDef;