@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
@@ -85,48 +85,6 @@ function row(id) {
85
85
  pane: null,
86
86
  };
87
87
  }
88
- test('dashboardRowsAllFromSource shows a node watched through its live broker', async () => {
89
- const localRow = row('watched');
90
- mkdirSync(jobDir('watched'), { recursive: true });
91
- writeFileSync(join(jobDir('watched'), 'attach.json'), JSON.stringify({ viewers: 1 }));
92
- const source = {
93
- getNode: async () => meta('watched'),
94
- getRow: async () => localRow,
95
- listNodes: async () => [localRow],
96
- subscriptionsOf: async () => [],
97
- subscribersOf: async () => [],
98
- view: async () => [],
99
- ticketCountsForView: async () => ({}),
100
- hasActiveLiveSubscription: async () => false,
101
- };
102
- const rows = await dashboardRowsAllFromSource(source);
103
- assert.equal(rows[0]?.viewed, true);
104
- });
105
- test('enrichRowsFromSource serializes a full dashboard source read', async () => {
106
- const nodeRows = ['a', 'b', 'c'].map(row);
107
- let inFlight = 0;
108
- let maxInFlight = 0;
109
- const source = {
110
- getNode: async (id) => {
111
- inFlight++;
112
- maxInFlight = Math.max(maxInFlight, inFlight);
113
- await new Promise((resolve) => setImmediate(resolve));
114
- inFlight--;
115
- return meta(id);
116
- },
117
- getRow: async () => null,
118
- listNodes: async () => nodeRows,
119
- subscriptionsOf: async () => [],
120
- subscribersOf: async () => [],
121
- view: async () => [],
122
- ticketCountsForView: async () => ({}),
123
- hasActiveLiveSubscription: async () => false,
124
- };
125
- const rows = await dashboardRowsAllFromSource(source);
126
- await enrichRowsFromSource(source, rows);
127
- assert.equal(maxInFlight, 1);
128
- assert.deepEqual(rows.map((entry) => entry.name), ['a', 'b', 'c']);
129
- });
130
88
  let home;
131
89
  let localCwd;
132
90
  let sessionFile;
@@ -207,8 +165,7 @@ test('dashboardRowsAllFromSource / enrichRowsFromSource / loadPreviewFromSource
207
165
  return { status: 500, body: {} };
208
166
  });
209
167
  // Register the close BEFORE any assertion runs — a listening server left
210
- // open by a thrown assertion keeps this test file's process alive forever
211
- // (see the CI-hang postmortem on rebuild-coalescer.test.ts).
168
+ // open by a thrown assertion keeps this test file's process alive forever.
212
169
  t.after(() => server.close());
213
170
  const source = new RemoteCanvasSource(server.url, 'tok');
214
171
  const rows = await dashboardRowsAllFromSource(source);
@@ -227,14 +184,12 @@ test('dashboardRowsAllFromSource / enrichRowsFromSource / loadPreviewFromSource
227
184
  assert.equal(previewed.lastAssistant, undefined, 'a local session transcript must not leak into a remote preview');
228
185
  assert.equal(previewed.previewLoaded, true);
229
186
  });
230
- // The non-TTY `canvas browse` path (browse/app.ts's `if (!process.stdin.isTTY)`
231
- // branch) calls `renderForestFromSource(source)` directly — a SEPARATE code
232
- // path from `dashboardRowsAllFromSource`/`enrichRowsFromSource`/
233
- // `loadPreviewFromSource` above, with its own remote suppression in
234
- // `renderTreeFromSource`/`nodeLineFromSource` (render.ts). The poisoned-state
235
- // test above never exercises it, so a regression that reintroduced local
236
- // telemetry/ask/fault reads into the static forest renderer specifically would
237
- // pass that test while still leaking poisoned local state here.
187
+ // `renderForestFromSource` is a separate path from
188
+ // `dashboardRowsAllFromSource`/`enrichRowsFromSource`/`loadPreviewFromSource`
189
+ // above, with its own remote suppression in `renderTreeFromSource`/
190
+ // `nodeLineFromSource` (render.ts). The poisoned-state test above never
191
+ // exercises it, so a regression that reintroduced local telemetry/ask/fault
192
+ // reads into the static forest renderer would still leak poisoned local state.
238
193
  test('renderForestFromSource suppresses local-read fields (ctx, asks, hanging) for a RemoteCanvasSource, even with conflicting local state for the same node id', async (t) => {
239
194
  const sf = seedPoisonedLocalState();
240
195
  const server = await startMockCrtrServer((args) => {
@@ -1,34 +1,19 @@
1
1
  import type { CanvasSource } from '../source.js';
2
- import type { RemoteEventStream } from '../remote-event-stream.js';
3
- import { type CoalescedRebuilder } from './rebuild-coalescer.js';
4
2
  import { type BindingId, type BindingResolution, type RawTerminalInput } from '../../keybindings/index.js';
5
3
  declare const BROWSE_NAV_ACTIONS: readonly ["crtr.browse.quit", "crtr.browse.down", "crtr.browse.up", "crtr.browse.first", "crtr.browse.last", "crtr.browse.expand-or-child", "crtr.browse.collapse-or-parent", "crtr.browse.toggle-fold", "crtr.browse.tab-next", "crtr.browse.tab-previous", "crtr.browse.tab.1", "crtr.browse.tab.2", "crtr.browse.tab.3", "crtr.browse.tab.4", "crtr.browse.tab.5", "crtr.browse.close-subtree", "crtr.browse.sort", "crtr.browse.scope", "crtr.browse.profile", "crtr.browse.residents", "crtr.browse.preview", "crtr.browse.search", "crtr.browse.revive-now", "crtr.browse.focus", "crtr.browse.focus-background"];
6
4
  declare const BROWSE_SEARCH_ACTIONS: readonly ["crtr.browse.search.cancel", "crtr.browse.search.commit", "crtr.browse.search.delete", "crtr.browse.search.quit"];
7
5
  export declare function resolveBrowseNavAction(bindings: BindingResolution<BindingId>, raw: RawTerminalInput): (typeof BROWSE_NAV_ACTIONS)[number] | null;
8
6
  export declare function resolveBrowseSearchAction(bindings: BindingResolution<BindingId>, raw: RawTerminalInput): (typeof BROWSE_SEARCH_ACTIONS)[number] | null;
9
- /** Wires a RemoteEventStream's `nodes`/`inbox` events through the coalescer
10
- * (`rebuild-coalescer.ts`) so a burst of SSE events collapses to ONE rebuild
11
- * round, never one N+1 remote-subprocess rebuild per event. Exported (rather
12
- * than left inline in `runBrowse`) so the coalescer integration test can
13
- * drive this ACTUAL wiring, not just `createCoalescedRebuilder` in isolation
14
- * — the test asserts this function routes through the coalescer rather than
15
- * calling `rebuild()` directly per event. */
16
- export declare function wireEventStreamRebuild(eventStream: Pick<RemoteEventStream, 'subscribe' | 'start'>, rebuild: () => Promise<void>): {
17
- rebuilder: CoalescedRebuilder;
18
- unsubscribe: () => void;
19
- };
20
7
  export declare function runBrowse(opts: {
21
8
  returnPane?: string;
22
9
  cwd?: string;
23
10
  /** Profile to show initially. Undefined means no profile is selected, so the
24
11
  * initial view includes all profiles and the profile toggle is unavailable. */
25
12
  profileId?: string;
26
- /** The read source (required) — canvas-browse always injects one
27
- * (`cliCanvasSource`/remote); no in-process openDb fallback exists here. */
13
+ /** The local API-backed read source. No in-process openDb fallback exists here. */
28
14
  source: CanvasSource;
29
- eventStream?: RemoteEventStream;
30
15
  /** Local viewer registry projection. Kept separate from CanvasSource because
31
- * focus rows describe this machine's screens, not remote canvas state. */
16
+ * focus rows describe this machine's screens. */
32
17
  viewedNodeIds?: () => Promise<ReadonlySet<string>>;
33
18
  /** Route the `x` close-out through the daemon API (the CLI injects
34
19
  * `cliClient().closeNode(id, { finish: true })`). Kept as a callback so this
@@ -10,11 +10,9 @@
10
10
  import { execFileSync } from 'node:child_process';
11
11
  import { resolve } from 'node:path';
12
12
  import { dashboardRowsAllFromSource, enrichRowsFromSource, loadPreviewFromSource, renderForestFromSource } from '../render-source.js';
13
- import { RemoteCanvasSource } from '../remote-canvas-source.js';
14
13
  import { setupTerminal, restoreTerminal, getTerminalSize, parseKeypress, } from '../../tui/terminal.js';
15
14
  import { buildTree, flatten, pruneNode, TABS } from './model.js';
16
15
  import { loadPins, savePins } from './pins.js';
17
- import { createCoalescedRebuilder } from './rebuild-coalescer.js';
18
16
  import { matchesTerminalInput, resolveUserKeybindings, } from '../../keybindings/index.js';
19
17
  const BROWSE_NAV_ACTIONS = [
20
18
  'crtr.browse.quit', 'crtr.browse.down', 'crtr.browse.up', 'crtr.browse.first', 'crtr.browse.last',
@@ -49,22 +47,8 @@ function viewportHeight(rowsTotal, inputLine, previewOn) {
49
47
  const previewH = previewOn ? PREVIEW_HEIGHT : 0;
50
48
  return Math.max(1, rows - headerHeight(inputLine) - 1 /* footer */ - previewH);
51
49
  }
52
- /** Wires a RemoteEventStream's `nodes`/`inbox` events through the coalescer
53
- * (`rebuild-coalescer.ts`) so a burst of SSE events collapses to ONE rebuild
54
- * round, never one N+1 remote-subprocess rebuild per event. Exported (rather
55
- * than left inline in `runBrowse`) so the coalescer integration test can
56
- * drive this ACTUAL wiring, not just `createCoalescedRebuilder` in isolation
57
- * — the test asserts this function routes through the coalescer rather than
58
- * calling `rebuild()` directly per event. */
59
- export function wireEventStreamRebuild(eventStream, rebuild) {
60
- const rebuilder = createCoalescedRebuilder(rebuild);
61
- const unsubscribe = eventStream.subscribe(() => rebuilder.trigger());
62
- eventStream.start();
63
- return { rebuilder, unsubscribe };
64
- }
65
50
  export async function runBrowse(opts) {
66
51
  const source = opts.source;
67
- const isRemote = source instanceof RemoteCanvasSource;
68
52
  const bindings = resolveUserKeybindings();
69
53
  // No TTY → print the static forest and exit 0 (no raw mode).
70
54
  if (!process.stdin.isTTY) {
@@ -73,25 +57,20 @@ export async function runBrowse(opts) {
73
57
  }
74
58
  // Snapshot the canvas. Drop kind:'human' control-plane decks — they have no pi
75
59
  // session, so `surface node focus` refuses them; they are never a navigation/resume
76
- // target (mirrors the surface-node focus guard). Factored into a function so the SSE
77
- // listener below can re-pull the tree on a `nodes`/`inbox` event instead of
78
- // recomputing over a stale snapshot.
60
+ // target (mirrors the surface-node focus guard).
79
61
  let rows;
80
62
  let nodeRows;
81
63
  let rootIds;
82
64
  let childIds;
83
65
  let tree;
84
66
  let totalNodes;
85
- // Remote-only: pending human-ticket counts per node, merged from one
86
- // `ticketCountsForView` call per forest root (RemoteCanvasSource.ticketCountsForView
87
- // already shells a single `canvas attention map --view <root>` per root, same
88
- // cost class as the per-node `subscriptionsOf` fan-out this snapshot already
89
- // does below) — fetched once per snapshot rebuild, not per flush/keystroke, so
90
- // enrichRowsFromSource's per-row loop stays a pure sync-shaped map lookup.
91
- let remoteAskCounts = {};
67
+ // Pending human-ticket counts per node, merged from one `ticketCountsForView`
68
+ // call per forest root. Fetch once per snapshot rebuild, not per flush or
69
+ // keystroke, so enrichRowsFromSource's per-row loop stays a pure map lookup.
70
+ let askCounts = {};
92
71
  const rebuildSnapshot = async () => {
93
72
  let viewedNodeIds = new Set();
94
- if (!isRemote && opts.viewedNodeIds !== undefined) {
73
+ if (opts.viewedNodeIds !== undefined) {
95
74
  try {
96
75
  viewedNodeIds = await opts.viewedNodeIds();
97
76
  }
@@ -110,11 +89,9 @@ export async function runBrowse(opts) {
110
89
  tree = buildTree(rows, rootIds, (id) => childIds.get(id) ?? []);
111
90
  totalNodes = tree.nodes.size;
112
91
  // Ask counts per node, merged from one `ticketCountsForView` call per root
113
- // (covers the whole canvas — rootIds is every non-human root). Fetched for BOTH
114
- // the local API source and a remote canvas, since neither can do a per-node
115
- // openDb ticket scan; feeds enrichRowsFromSource's per-row map lookup.
92
+ // (covers the whole canvas — rootIds is every non-human root).
116
93
  const maps = await Promise.all(rootIds.map((root) => source.ticketCountsForView(root).catch(() => ({}))));
117
- remoteAskCounts = Object.assign({}, ...maps);
94
+ askCounts = Object.assign({}, ...maps);
118
95
  };
119
96
  await rebuildSnapshot();
120
97
  // The launch dir is retained only as the optional cwd filter target. Browse opens
@@ -164,43 +141,10 @@ export async function runBrowse(opts) {
164
141
  restoreTerminal();
165
142
  }
166
143
  catch { /* best-effort */ }
167
- unsubscribeEventStream?.();
168
- rebuilder?.stop();
169
- opts.eventStream?.stop();
170
144
  };
171
145
  // Safety net: an uncaught throw in the (un-unit-tested) keystroke path must
172
146
  // never strand the tty in raw + alt-screen + hidden-cursor.
173
147
  process.once('exit', cleanup);
174
- // Remote-only live invalidation: `canvas browse` has no local fs-watch/poll to
175
- // replace (there is none — this is a one-shot snapshot TUI, re-rendering only
176
- // on keystrokes). This is net-new plumbing for the remote case only: when a
177
- // pre-built RemoteEventStream is threaded in (canvas-browse.ts, once it has
178
- // already resolved the target's credentials), a `nodes`/`inbox` SSE event
179
- // invalidates the remote source's cache and triggers the same recompute +
180
- // coalesced repaint a keystroke would. The local (no eventStream) path is
181
- // untouched.
182
- let unsubscribeEventStream;
183
- let rebuilder;
184
- if (opts.eventStream !== undefined) {
185
- if (source instanceof RemoteCanvasSource)
186
- source.invalidate();
187
- // `trigger()` debounces a burst into one rebuild, and single-flights it
188
- // against an already-in-flight rebuild — see wireEventStreamRebuild above.
189
- const wired = wireEventStreamRebuild(opts.eventStream, async () => {
190
- try {
191
- if (source instanceof RemoteCanvasSource)
192
- source.invalidate();
193
- await rebuildSnapshot();
194
- recompute(curRow()?.id);
195
- scheduleFlush();
196
- }
197
- catch (err) {
198
- logAsyncFailure('SSE rebuild failed', err);
199
- }
200
- });
201
- rebuilder = wired.rebuilder;
202
- unsubscribeEventStream = wired.unsubscribe;
203
- }
204
148
  const logAsyncFailure = (label, err) => {
205
149
  process.stderr.write(`[crtr browse] ${label}: ${String(err?.message ?? err)}\n`);
206
150
  };
@@ -287,7 +231,7 @@ export async function runBrowse(opts) {
287
231
  if (r !== undefined)
288
232
  slice.push(r);
289
233
  }
290
- await enrichRowsFromSource(source, slice, remoteAskCounts);
234
+ await enrichRowsFromSource(source, slice, askCounts);
291
235
  const cur = curRow();
292
236
  if (cur !== undefined) {
293
237
  const r = rowOf(cur.id);
@@ -302,7 +246,7 @@ export async function runBrowse(opts) {
302
246
  pinned: state.pinned, help: state.help,
303
247
  rename: state.rename, renameBuf: state.renameBuf,
304
248
  message: state.message, messageBuf: state.messageBuf,
305
- readOnly: isRemote,
249
+ readOnly: false,
306
250
  }, size, caps);
307
251
  process.stdout.write(frame);
308
252
  };
@@ -708,10 +652,7 @@ export async function runBrowse(opts) {
708
652
  }
709
653
  // Close-out the selected node (+ its exclusive subtree). If anything in that
710
654
  // subtree is actively streaming, confirm first (y/n); otherwise close at once.
711
- // No-op against a remote canvas — mutations are disabled (footer says so).
712
655
  if (action === 'crtr.browse.close-subtree') {
713
- if (isRemote)
714
- return;
715
656
  if (row === undefined) {
716
657
  scheduleFlush();
717
658
  return;
@@ -756,7 +697,7 @@ export async function runBrowse(opts) {
756
697
  scheduleFlush();
757
698
  return;
758
699
  }
759
- // Pin / unpin (local, view-only — works against a remote canvas too).
700
+ // Pin or unpin in the local, view-only pin set.
760
701
  if (input === 'f') {
761
702
  if (row !== undefined)
762
703
  togglePin(row.id);
@@ -769,10 +710,8 @@ export async function runBrowse(opts) {
769
710
  scheduleFlush();
770
711
  return;
771
712
  }
772
- // Rename the node inline (mutation — no-op on a remote canvas).
713
+ // Rename the node inline.
773
714
  if (input === 'R') {
774
- if (isRemote)
775
- return;
776
715
  if (row !== undefined) {
777
716
  state.rename = true;
778
717
  state.renameTarget = row.id;
@@ -781,10 +720,8 @@ export async function runBrowse(opts) {
781
720
  scheduleFlush();
782
721
  return;
783
722
  }
784
- // Message the node without resuming it (mutation — no-op on a remote canvas).
723
+ // Message the node without resuming it.
785
724
  if (input === 'm') {
786
- if (isRemote)
787
- return;
788
725
  if (row !== undefined) {
789
726
  state.message = true;
790
727
  state.messageTarget = row.id;
@@ -810,10 +747,7 @@ export async function runBrowse(opts) {
810
747
  // waiting out the 5-min auto-revive grace. Shells `node lifecycle revive <id>
811
748
  // --now` (browse goes through commands, never touching the runtime directly). 'k' is
812
749
  // vim-up here, so the kick is on SHIFT-K.
813
- // No-op against a remote canvas — mutations are disabled (footer says so).
814
750
  if (action === 'crtr.browse.revive-now') {
815
- if (isRemote)
816
- return;
817
751
  if (row !== undefined) {
818
752
  const r = rowOf(row.id);
819
753
  if (r?.hanging != null)
@@ -822,21 +756,15 @@ export async function runBrowse(opts) {
822
756
  scheduleFlush();
823
757
  return;
824
758
  }
825
- // Resume. No-op against a remote canvas — mutations/focus are disabled
826
- // (footer says so).
759
+ // Resume the selected node.
827
760
  if (action === 'crtr.browse.focus') {
828
- if (isRemote)
829
- return;
830
761
  if (row !== undefined)
831
762
  selectAndFocus(row.id);
832
763
  return;
833
764
  }
834
765
  // Resume in the BACKGROUND (Shift+O): focus the node into the pane behind this
835
- // popup but keep the navigator open so you can resume more nodes. Same remote
836
- // guard as plain focus.
766
+ // popup but keep the navigator open so you can resume more nodes.
837
767
  if (action === 'crtr.browse.focus-background') {
838
- if (isRemote)
839
- return;
840
768
  if (row !== undefined)
841
769
  selectAndFocusKeepOpen(row.id);
842
770
  scheduleFlush();
@@ -877,7 +805,7 @@ export async function runBrowse(opts) {
877
805
  return;
878
806
  const end = Math.min(warmIdx + WARM_CHUNK, warmRows.length);
879
807
  const slice = warmRows.slice(warmIdx, end);
880
- await enrichRowsFromSource(source, slice, remoteAskCounts);
808
+ await enrichRowsFromSource(source, slice, askCounts);
881
809
  await Promise.all(slice.map((r) => loadPreviewFromSource(source, r)));
882
810
  warmIdx = end;
883
811
  // A live search may match the freshly-warmed prompts → recompute + repaint.
@@ -1,5 +1,4 @@
1
1
  import type { DashboardRow } from '../render.js';
2
- import type { NodeStatus } from '../types.js';
3
2
  export type Tab = 'All' | 'Live' | 'Dormant' | 'Attention' | 'Pinned';
4
3
  export declare const TABS: readonly Tab[];
5
4
  /** How the visible rows are ordered.
@@ -28,9 +27,6 @@ export interface Tree {
28
27
  roots: string[];
29
28
  nodes: Map<string, TreeNode>;
30
29
  }
31
- /** Sort rank for roots/stragglers — live first (active, then idle), dormant
32
- * after. Mirrors render.ts statusRank. */
33
- export declare function statusRank(status: NodeStatus): number;
34
30
  /**
35
31
  * Build a spanning tree of the whole canvas.
36
32
  * - `rows` — one DashboardRow per node (display text + status/asks).
@@ -4,6 +4,7 @@
4
4
  // it is exhaustively unit-testable. The app layer (app.ts) wires the canvas data
5
5
  // access (dashboardRowsAll / listNodes / subscriptionsOf) into buildTree, then
6
6
  // drives flatten() on each keystroke.
7
+ import { statusRank } from '../node-order.js';
7
8
  export const TABS = ['All', 'Live', 'Dormant', 'Attention', 'Pinned'];
8
9
  export const SORTS = ['tree', 'attention', 'relevance', 'recency'];
9
10
  /** Does a node belong to this tab's slice?
@@ -21,18 +22,6 @@ export function tabPredicate(tab, row, isPinned = false) {
21
22
  case 'Pinned': return isPinned;
22
23
  }
23
24
  }
24
- /** Sort rank for roots/stragglers — live first (active, then idle), dormant
25
- * after. Mirrors render.ts statusRank. */
26
- export function statusRank(status) {
27
- switch (status) {
28
- case 'active': return 0;
29
- case 'idle': return 1;
30
- case 'done': return 2;
31
- case 'canceled': return 3;
32
- case 'dead': return 4;
33
- default: return 5;
34
- }
35
- }
36
25
  /**
37
26
  * Build a spanning tree of the whole canvas.
38
27
  * - `rows` — one DashboardRow per node (display text + status/asks).
@@ -316,9 +316,12 @@ function statusLine(state) {
316
316
  const dim = (s) => `${DIM}${s}${RESET}`;
317
317
  const profile = state.profileScope === undefined ? 'all profiles' : 'current';
318
318
  const scope = state.cwdScope === null ? 'all dirs' : baseDir(state.cwdScope);
319
- const segs = [`${dim('profile')} ${profile}`, `${dim('scope')} ${scope}`, `${dim('sort')} ${state.sort}`];
320
- if (state.residentsOnly)
321
- segs.push(`${dim('show')} residents`);
319
+ const segs = [
320
+ `${dim('profile')} ${profile}`,
321
+ `${dim('scope')} ${scope}`,
322
+ `${dim('sort')} ${state.sort}`,
323
+ `${dim('lifecycle')} ${state.residentsOnly ? 'residents' : 'all'}`,
324
+ ];
322
325
  if (!state.search && state.query !== '')
323
326
  segs.push(`${dim('filter')} ${state.query}`);
324
327
  return segs.join(dim(' · '));
@@ -138,11 +138,14 @@ export declare function listCrons(scope: {
138
138
  }): Cron[];
139
139
  /** DELETE one cron — the explicit user/surface cancel. Idempotent: an absent
140
140
  * row is a no-op `false`. Kills any in-flight run process group before
141
- * deleting, under one canvas write boundary (the reapThenDelete precedent):
142
- * lease acquisition linearizes either before this selection (the run is
143
- * observed and killed) or after the delete (and loses the lease). The FK
144
- * cascade reaps the cron's run history with it. */
145
- export declare function cancelCron(cron_id: string): boolean;
141
+ * deleting unless the daemon has proved the caller is that exact run; then
142
+ * the process must finish and deliver its already-produced output. The lease
143
+ * acquisition still linearizes before this selection (the run is observed
144
+ * and killed) or after the delete (and loses the lease). The FK cascade reaps
145
+ * the cron's run history with it. */
146
+ export declare function cancelCron(cron_id: string, options?: {
147
+ preserveRunningProcess?: boolean;
148
+ }): boolean;
146
149
  /** DELETE one cron by id — one-shot consumption after its run settles.
147
150
  * Returns whether a live row was removed, so a consumer racing an explicit
148
151
  * cancel can no-op instead of double-settling. */
@@ -172,17 +172,18 @@ export function listCrons(scope) {
172
172
  }
173
173
  /** DELETE one cron — the explicit user/surface cancel. Idempotent: an absent
174
174
  * row is a no-op `false`. Kills any in-flight run process group before
175
- * deleting, under one canvas write boundary (the reapThenDelete precedent):
176
- * lease acquisition linearizes either before this selection (the run is
177
- * observed and killed) or after the delete (and loses the lease). The FK
178
- * cascade reaps the cron's run history with it. */
179
- export function cancelCron(cron_id) {
175
+ * deleting unless the daemon has proved the caller is that exact run; then
176
+ * the process must finish and deliver its already-produced output. The lease
177
+ * acquisition still linearizes before this selection (the run is observed
178
+ * and killed) or after the delete (and loses the lease). The FK cascade reaps
179
+ * the cron's run history with it. */
180
+ export function cancelCron(cron_id, options) {
180
181
  return withCanvasWrite((db) => {
181
182
  const row = db.prepare('SELECT * FROM crons WHERE cron_id = ?').get(cron_id);
182
183
  if (row === undefined)
183
184
  return false;
184
185
  const cron = cronFrom(row);
185
- if (cron.run_state === 'running')
186
+ if (cron.run_state === 'running' && options?.preserveRunningProcess !== true)
186
187
  killLeasedCronRun(cron);
187
188
  db.prepare('DELETE FROM crons WHERE cron_id = ?').run(cron_id);
188
189
  return true;
@@ -1,5 +1,9 @@
1
1
  export declare const CANVAS_EXTENSION_NAMES: readonly ["canvas-inbox-watcher", "canvas-review-boundary", "canvas-stophook", "canvas-recap", "canvas-goal-capture", "canvas-passive-context", "canvas-context-intro", "canvas-tool-guide", "canvas-doc-substrate", "canvas-structured-output", "canvas-bash-valve"];
2
- /** Remove a complete persisted canvas prefix while retaining every genuine
3
- * caller/kind extra, including a custom extension whose basename happens to
4
- * resemble a canvas hook. */
2
+ /** Structural shipped-hook identity: a canvas-hook stem directly under a
3
+ * `pi-extensions` directory. A user's own extension elsewhere may share the
4
+ * stem and is not shipped. */
5
+ export declare function isShippedCanvasExtension(path: string): boolean;
6
+ /** Remove persisted shipped canvas extensions while retaining genuine
7
+ * caller/kind extras, including a custom extension whose basename happens to
8
+ * resemble a canvas hook outside a pi-extensions directory. */
5
9
  export declare function customExtensionPaths(extensions: readonly string[] | undefined): string[];
@@ -1,3 +1,4 @@
1
+ import { extname } from 'node:path';
1
2
  // Canvas-extension identity is structural, not basename-based: old runtime roots
2
3
  // are recognized only when they carry a complete shipped canvas prefix.
3
4
  // canvas-inbox-watcher must load before canvas-stophook: at agent_settled it
@@ -44,10 +45,21 @@ function extensionPrefixLength(extensions) {
44
45
  const prefixes = [CANVAS_EXTENSION_NAMES, ...HISTORICAL_CANVAS_EXTENSION_PREFIXES];
45
46
  return prefixes.find((names) => matchesExtensionPrefix(extensions, names))?.length ?? 0;
46
47
  }
47
- /** Remove a complete persisted canvas prefix while retaining every genuine
48
- * caller/kind extra, including a custom extension whose basename happens to
49
- * resemble a canvas hook. */
48
+ /** Structural shipped-hook identity: a canvas-hook stem directly under a
49
+ * `pi-extensions` directory. A user's own extension elsewhere may share the
50
+ * stem and is not shipped. */
51
+ export function isShippedCanvasExtension(path) {
52
+ const normalized = path.replaceAll('\\', '/');
53
+ const lastSlash = normalized.lastIndexOf('/');
54
+ const parent = normalized.slice(0, lastSlash).split('/').at(-1);
55
+ const filename = normalized.slice(lastSlash + 1);
56
+ const name = filename.slice(0, filename.length - extname(filename).length);
57
+ return parent === 'pi-extensions' && CANVAS_EXTENSION_NAMES.includes(name);
58
+ }
59
+ /** Remove persisted shipped canvas extensions while retaining genuine
60
+ * caller/kind extras, including a custom extension whose basename happens to
61
+ * resemble a canvas hook outside a pi-extensions directory. */
50
62
  export function customExtensionPaths(extensions) {
51
63
  const paths = extensions ?? [];
52
- return paths.slice(extensionPrefixLength(paths));
64
+ return paths.slice(extensionPrefixLength(paths)).filter((path) => !isShippedCanvasExtension(path));
53
65
  }
@@ -34,10 +34,6 @@ export declare function subtreeIds(root: string): string[];
34
34
  * with navigable children (folded or not). In GRAPH the ▸ caret separately marks
35
35
  * a collapsed row, so this stays a pure count and never doubles as a fold badge. */
36
36
  export declare function childBadge(node: NodeMeta | null): string;
37
- /** Sort rank for sibling ordering — live nodes (active, then idle) ahead of
38
- * terminal ones, so sessions still running surface at the TOP of each child
39
- * group instead of being buried under finished/failed ones. */
40
- export declare function statusRank(id: string): number;
41
37
  /** Direct children, live-first — the sibling order used both when flattening
42
38
  * the tree and when stepping into a subtree (`l`). Array.sort is stable, so
43
39
  * equal-status siblings keep their creation order. */
@@ -14,6 +14,7 @@ import { getNode, subscribersOf, subscriptionsOf } from './index.js';
14
14
  import { activeFaultForDisplay } from './render.js';
15
15
  import { readFault } from '../runtime/fault.js';
16
16
  import { faultSummary } from './status-glyph.js';
17
+ import { statusRank } from './node-order.js';
17
18
  import { beginFrameTelem, nodeGlyph, navLabel, shortId, tokensCell, activityCell, cycleBadge, askBadge, liveBelowBadge, truncate, fillBar, fillWidth, isAttached, BOLD, DIM, RESET, REVERSE, BG_ATTACHED, } from './nav-render.js';
18
19
  // Re-export the pure render/telemetry half so existing nav-model importers
19
20
  // (chrome/canvas-panels, overlays/graph, resume) keep resolving these here.
@@ -170,24 +171,11 @@ export function childBadge(node) {
170
171
  const m = childCount(node.node_id);
171
172
  return m > 0 ? ` ${DIM}⤳${m}${RESET}` : '';
172
173
  }
173
- /** Sort rank for sibling ordering — live nodes (active, then idle) ahead of
174
- * terminal ones, so sessions still running surface at the TOP of each child
175
- * group instead of being buried under finished/failed ones. */
176
- export function statusRank(id) {
177
- switch (cNode(id)?.status) {
178
- case 'active': return 0;
179
- case 'idle': return 1;
180
- case 'done': return 2;
181
- case 'canceled': return 3;
182
- case 'dead': return 4;
183
- default: return 5;
184
- }
185
- }
186
174
  /** Direct children, live-first — the sibling order used both when flattening
187
175
  * the tree and when stepping into a subtree (`l`). Array.sort is stable, so
188
176
  * equal-status siblings keep their creation order. */
189
177
  export function sortedChildIds(id) {
190
- return convoChildIds(id).sort((a, b) => statusRank(a) - statusRank(b));
178
+ return convoChildIds(id).sort((a, b) => statusRank(cNode(a)?.status) - statusRank(cNode(b)?.status));
191
179
  }
192
180
  // ---------------------------------------------------------------------------
193
181
  // GRAPH model — flatten the local graph fold-aware. Rebuilt every render (cheap
@@ -0,0 +1,3 @@
1
+ import type { NodeStatus } from './types.js';
2
+ /** Sort live work before terminal work; unknown statuses sort last. */
3
+ export declare function statusRank(status: NodeStatus | undefined): number;
@@ -0,0 +1,12 @@
1
+ // node-order.ts — canonical live-first ordering for canvas node statuses.
2
+ /** Sort live work before terminal work; unknown statuses sort last. */
3
+ export function statusRank(status) {
4
+ switch (status) {
5
+ case 'active': return 0;
6
+ case 'idle': return 1;
7
+ case 'done': return 2;
8
+ case 'canceled': return 3;
9
+ case 'dead': return 4;
10
+ default: return 5;
11
+ }
12
+ }
@@ -1,7 +1,7 @@
1
1
  import type { CanvasSource } from './source.js';
2
2
  import type { NodeMeta, NodeRow, NodeStatus, SubscriptionRef } from './types.js';
3
3
  /** The exact JSON shape `crtr --json node inspect show <id>` emits (see
4
- * `nodeShow`'s `run`, `src/commands/node.ts`) — mirrored here, not imported,
4
+ * `nodeShow` in `src/commands/node/inspect.ts`) — mirrored here, not imported,
5
5
  * to avoid a commands→canvas value dependency. */
6
6
  export interface RemoteShowResponse {
7
7
  node: NodeMeta;
@@ -28,7 +28,7 @@ export interface RemoteShowResponse {
28
28
  paths: {
29
29
  context_dir: string;
30
30
  reports_dir: string;
31
- session_file: string | null;
31
+ session_file?: string | null;
32
32
  };
33
33
  follow_up: string;
34
34
  }
@@ -40,13 +40,10 @@ export declare class RemoteCanvasSource implements CanvasSource {
40
40
  private rosterCache;
41
41
  private viewCache;
42
42
  constructor(previewEndpoint: string, relayToken: string);
43
- /** Drops every cached entry — called on a `RemoteEventStream` `'nodes'` (or
44
- * `'inbox'`) event so the next read re-fetches fresh state. */
45
- invalidate(): void;
46
43
  private execJson;
47
44
  private fetchShow;
48
45
  /** The full passthrough object `node inspect show` produces — used by
49
- * `nodeShow`'s remote branch (`src/commands/node.ts`) to return the exact
46
+ * `nodeShow`'s remote branch (`src/commands/node/inspect.ts`) to return the exact
50
47
  * same shape a local read would, without re-deriving it. */
51
48
  rawShow(id: string): Promise<RemoteShowResponse | null>;
52
49
  getNode(id: string): Promise<NodeMeta | null>;