@north-light/crouter 0.3.170 → 0.3.172

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 (670) hide show
  1. package/dist/api/client.d.ts +37 -11
  2. package/dist/api/client.js +84 -15
  3. package/dist/api/dto/human.d.ts +53 -39
  4. package/dist/api/dto/human.js +2 -3
  5. package/dist/api/dto/inbox.d.ts +0 -1
  6. package/dist/api/dto/nodes.d.ts +12 -0
  7. package/dist/api/dto/review-comments.d.ts +137 -0
  8. package/dist/api/dto/review-comments.js +5 -0
  9. package/dist/api/dto/reviews.d.ts +109 -0
  10. package/dist/api/dto/reviews.js +5 -0
  11. package/dist/api/index.d.ts +2 -0
  12. package/dist/api/index.js +2 -0
  13. package/dist/api/routes.d.ts +17 -4
  14. package/dist/api/routes.js +21 -5
  15. package/dist/build-root.d.ts +1 -16
  16. package/dist/build-root.js +1 -25
  17. package/dist/builtin-memory/00-runtime-base.md +7 -5
  18. package/dist/builtin-memory/04-base-worker.md +1 -1
  19. package/dist/builtin-memory/04-orchestration-kernel.md +7 -7
  20. package/dist/builtin-memory/05-kinds/design/00-base.md +1 -1
  21. package/dist/builtin-memory/05-kinds/design/01-orchestrator.md +1 -1
  22. package/dist/builtin-memory/05-kinds/developer/00-base.md +1 -1
  23. package/dist/builtin-memory/05-kinds/explore/00-base.md +1 -1
  24. package/dist/builtin-memory/05-kinds/plan/00-base.md +1 -1
  25. package/dist/builtin-memory/05-kinds/plan/01-orchestrator.md +1 -1
  26. package/dist/builtin-memory/05-kinds/review/00-base.md +1 -1
  27. package/dist/builtin-memory/05-kinds/review/companion/00-base.md +20 -0
  28. package/dist/builtin-memory/05-kinds/spec/00-base.md +3 -7
  29. package/dist/builtin-memory/05-kinds/spec/01-orchestrator.md +3 -3
  30. package/dist/builtin-memory/05-kinds/spec/requirements.md +3 -3
  31. package/dist/builtin-memory/design.md +2 -2
  32. package/dist/builtin-memory/insights/capture.md +50 -0
  33. package/dist/builtin-memory/insights/init.md +45 -0
  34. package/dist/builtin-memory/insights/listen.md +9 -0
  35. package/dist/builtin-memory/internal/agent-shaping.md +2 -2
  36. package/dist/builtin-memory/internal/nodes-and-canvas.md +1 -1
  37. package/dist/builtin-memory/internal/plugins.md +12 -11
  38. package/dist/builtin-memory/internal/storage-tiers.md +2 -2
  39. package/dist/builtin-memory/{planning.md → plan/roadmap.md} +3 -3
  40. package/dist/builtin-memory/plan.md +19 -0
  41. package/dist/builtin-memory/spec/guide.md +38 -0
  42. package/dist/builtin-memory/spec/requirements.md +31 -0
  43. package/dist/builtin-memory/spec/roadmap.md +35 -0
  44. package/dist/builtin-memory/spec.md +10 -86
  45. package/dist/builtin-pi-packages/pi-crtr-extensions/README.md +3 -4
  46. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/provider-rotation.test.ts +49 -5
  47. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.d.ts +56 -0
  48. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.js +920 -0
  49. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +221 -156
  50. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/statusline.ts +4 -5
  51. package/dist/cli.js +2 -6
  52. package/dist/clients/attach/__tests__/attach-chrome-remote.test.js +7 -35
  53. package/dist/clients/attach/__tests__/attach-keybindings.test.js +32 -16
  54. package/dist/clients/attach/__tests__/context-message.test.js +142 -6
  55. package/dist/clients/attach/__tests__/crtr-output.test.js +29 -45
  56. package/dist/clients/attach/__tests__/diagram.test.js +1 -1
  57. package/dist/clients/attach/__tests__/file-review-focus.test.js +48 -0
  58. package/dist/clients/attach/__tests__/group-activity.test.js +266 -0
  59. package/dist/clients/attach/__tests__/input-controller-extension-command.test.js +32 -0
  60. package/dist/clients/attach/__tests__/session-identity-refresh.test.js +32 -0
  61. package/dist/clients/attach/__tests__/titled-editor-preview.test.js +1 -2
  62. package/dist/clients/attach/chrome/header.d.ts +10 -0
  63. package/dist/clients/attach/chrome/header.js +30 -0
  64. package/dist/clients/attach/chrome/recap.d.ts +7 -0
  65. package/dist/clients/attach/chrome/recap.js +19 -0
  66. package/dist/clients/attach/chrome/status-line.d.ts +3 -0
  67. package/dist/clients/attach/chrome/status-line.js +5 -0
  68. package/dist/clients/attach/chrome/widgets.js +11 -21
  69. package/dist/clients/attach/command.js +11 -7
  70. package/dist/clients/attach/config.d.ts +4 -0
  71. package/dist/clients/attach/config.js +3 -0
  72. package/dist/clients/attach/input/controller.d.ts +19 -0
  73. package/dist/clients/attach/input/controller.js +62 -28
  74. package/dist/clients/attach/input/titled-editor.d.ts +0 -4
  75. package/dist/clients/attach/input/titled-editor.js +2 -10
  76. package/dist/clients/attach/overlays/file-review.d.ts +9 -5
  77. package/dist/clients/attach/overlays/file-review.js +9 -70
  78. package/dist/clients/attach/overlays/help.d.ts +33 -0
  79. package/dist/clients/attach/overlays/help.js +204 -0
  80. package/dist/clients/attach/render/activity-slot.d.ts +4 -0
  81. package/dist/clients/attach/render/activity-slot.js +13 -0
  82. package/dist/clients/attach/render/chat-view.d.ts +117 -12
  83. package/dist/clients/attach/render/chat-view.js +604 -135
  84. package/dist/clients/attach/render/context-message.d.ts +2 -1
  85. package/dist/clients/attach/render/context-message.js +17 -13
  86. package/dist/clients/attach/render/crtr-output.js +1 -3
  87. package/dist/clients/attach/render/diagram.js +2 -2
  88. package/dist/clients/attach/render/edit-diff.d.ts +4 -1
  89. package/dist/clients/attach/render/edit-diff.js +7 -11
  90. package/dist/clients/attach/render/group-activity.d.ts +32 -0
  91. package/dist/clients/attach/render/group-activity.js +206 -0
  92. package/dist/clients/attach/render/group-recap.d.ts +10 -0
  93. package/dist/clients/attach/render/group-recap.js +93 -0
  94. package/dist/clients/attach/render/html-markdown.d.ts +17 -0
  95. package/dist/clients/attach/render/html-markdown.js +228 -0
  96. package/dist/clients/attach/render/measured-container.d.ts +96 -0
  97. package/dist/clients/attach/render/measured-container.js +322 -0
  98. package/dist/clients/attach/render/scroll-animation.d.ts +8 -0
  99. package/dist/clients/attach/render/scroll-animation.js +80 -0
  100. package/dist/clients/attach/render/tool-calls.js +6 -6
  101. package/dist/clients/attach/render/transcript-copy.d.ts +9 -0
  102. package/dist/clients/attach/render/transcript-copy.js +81 -0
  103. package/dist/clients/attach/render/viewport.d.ts +29 -0
  104. package/dist/clients/attach/render/viewport.js +159 -0
  105. package/dist/clients/attach/session/bindings.d.ts +10 -7
  106. package/dist/clients/attach/session/bindings.js +23 -8
  107. package/dist/clients/attach/session/connection.js +4 -5
  108. package/dist/clients/attach/session/context.d.ts +6 -4
  109. package/dist/clients/attach/session/frame.d.ts +34 -0
  110. package/dist/clients/attach/session/frame.js +176 -0
  111. package/dist/clients/attach/session/frames.d.ts +4 -1
  112. package/dist/clients/attach/session/frames.js +14 -1
  113. package/dist/clients/attach/session/identity.js +4 -3
  114. package/dist/clients/attach/session/input-wiring.d.ts +14 -4
  115. package/dist/clients/attach/session/input-wiring.js +15 -13
  116. package/dist/clients/attach/session/invariant.d.ts +9 -0
  117. package/dist/clients/attach/session/invariant.js +15 -0
  118. package/dist/clients/attach/session/keys.d.ts +10 -2
  119. package/dist/clients/attach/session/keys.js +13 -5
  120. package/dist/clients/attach/session/layout.d.ts +10 -8
  121. package/dist/clients/attach/session/layout.js +33 -34
  122. package/dist/clients/attach/session/mouse.d.ts +18 -0
  123. package/dist/clients/attach/session/mouse.js +64 -0
  124. package/dist/clients/attach/session/pane-tag.d.ts +3 -0
  125. package/dist/clients/attach/session/pane-tag.js +51 -8
  126. package/dist/clients/attach/session/reconnect.d.ts +3 -0
  127. package/dist/clients/attach/session/reconnect.js +42 -5
  128. package/dist/clients/attach/session/surface-frame.d.ts +20 -0
  129. package/dist/clients/attach/session/surface-frame.js +73 -0
  130. package/dist/clients/attach/session/surface-host.d.ts +64 -0
  131. package/dist/clients/attach/session/surface-host.js +255 -0
  132. package/dist/clients/attach/session/whip.d.ts +17 -0
  133. package/dist/clients/attach/session/whip.js +334 -0
  134. package/dist/clients/attach/slash/dispatch.d.ts +13 -1
  135. package/dist/clients/attach/slash/dispatch.js +51 -29
  136. package/dist/clients/attach/viewer.js +907 -819
  137. package/dist/clients/conversation/conversation.d.ts +65 -0
  138. package/dist/clients/conversation/conversation.js +318 -0
  139. package/dist/clients/conversation/frames.d.ts +30 -0
  140. package/dist/clients/conversation/frames.js +52 -0
  141. package/dist/clients/conversation/region.d.ts +51 -0
  142. package/dist/clients/conversation/region.js +265 -0
  143. package/dist/clients/conversation/submit.d.ts +38 -0
  144. package/dist/clients/conversation/submit.js +51 -0
  145. package/dist/clients/inbox/__tests__/inbox-controller.test.js +247 -0
  146. package/dist/clients/inbox/__tests__/mount-panel.test.js +776 -0
  147. package/dist/clients/inbox/controller.d.ts +79 -0
  148. package/dist/clients/inbox/controller.js +448 -0
  149. package/dist/clients/inbox/deck-adapter.d.ts +29 -0
  150. package/dist/clients/inbox/deck-adapter.js +62 -0
  151. package/dist/clients/inbox/layout.d.ts +8 -0
  152. package/dist/clients/inbox/layout.js +9 -0
  153. package/dist/clients/inbox/resolve.d.ts +10 -0
  154. package/dist/clients/inbox/resolve.js +34 -0
  155. package/dist/clients/inbox/review/__tests__/editor-roundtrip.test.js +29 -0
  156. package/dist/clients/inbox/review/__tests__/remap.test.js +196 -0
  157. package/dist/clients/inbox/review/__tests__/review-core.test.js +341 -0
  158. package/dist/clients/inbox/review/anchors.d.ts +41 -0
  159. package/dist/clients/inbox/review/anchors.js +89 -0
  160. package/dist/clients/inbox/review/columns.d.ts +22 -0
  161. package/dist/clients/inbox/review/columns.js +40 -0
  162. package/dist/clients/inbox/review/comments-client.d.ts +66 -0
  163. package/dist/clients/inbox/review/comments-client.js +98 -0
  164. package/dist/clients/inbox/review/composition.d.ts +60 -0
  165. package/dist/clients/inbox/review/composition.js +278 -0
  166. package/dist/clients/inbox/review/document-region.d.ts +120 -0
  167. package/dist/clients/inbox/review/document-region.js +902 -0
  168. package/dist/clients/inbox/review/frame.d.ts +45 -0
  169. package/dist/clients/inbox/review/frame.js +215 -0
  170. package/dist/clients/inbox/review/keys.d.ts +67 -0
  171. package/dist/clients/inbox/review/keys.js +130 -0
  172. package/dist/clients/inbox/review/launch.d.ts +10 -0
  173. package/dist/clients/inbox/review/launch.js +129 -0
  174. package/dist/clients/inbox/review/live-source.d.ts +24 -0
  175. package/dist/clients/inbox/review/live-source.js +160 -0
  176. package/dist/clients/inbox/review/nvim.d.ts +13 -0
  177. package/dist/clients/inbox/review/nvim.js +42 -0
  178. package/dist/clients/inbox/review/remap.d.ts +51 -0
  179. package/dist/clients/inbox/review/remap.js +157 -0
  180. package/dist/clients/inbox/review/review-client.d.ts +30 -0
  181. package/dist/clients/inbox/review/review-client.js +107 -0
  182. package/dist/clients/inbox/review/roundtrip.d.ts +5 -0
  183. package/dist/clients/inbox/review/roundtrip.js +36 -0
  184. package/dist/clients/inbox/review/state.d.ts +143 -0
  185. package/dist/clients/inbox/review/state.js +282 -0
  186. package/dist/clients/inbox/review-adapter.d.ts +29 -0
  187. package/dist/clients/inbox/review-adapter.js +92 -0
  188. package/dist/clients/inbox/review-visibility.d.ts +5 -0
  189. package/dist/clients/inbox/review-visibility.js +19 -0
  190. package/dist/clients/inbox/surface.d.ts +19 -0
  191. package/dist/clients/inbox/surface.js +128 -0
  192. package/dist/clients/inbox/tui/ansi.d.ts +66 -0
  193. package/dist/clients/inbox/tui/ansi.js +317 -0
  194. package/dist/clients/inbox/tui/clipboard.d.ts +2 -0
  195. package/dist/clients/inbox/tui/clipboard.js +26 -0
  196. package/dist/clients/inbox/tui/input.d.ts +7 -0
  197. package/dist/clients/inbox/tui/input.js +653 -0
  198. package/dist/clients/inbox/tui/keys.d.ts +28 -0
  199. package/dist/clients/inbox/tui/keys.js +111 -0
  200. package/dist/clients/inbox/tui/panel.d.ts +2 -0
  201. package/dist/clients/inbox/tui/panel.js +217 -0
  202. package/dist/clients/inbox/tui/render.d.ts +37 -0
  203. package/dist/clients/inbox/tui/render.js +476 -0
  204. package/dist/clients/inbox/tui/types.d.ts +57 -0
  205. package/dist/clients/inbox/tui/types.js +1 -0
  206. package/dist/clients/inbox/tui.d.ts +6 -0
  207. package/dist/clients/inbox/tui.js +74 -0
  208. package/dist/clients/surfaces/host.d.ts +66 -0
  209. package/dist/clients/surfaces/host.js +1 -0
  210. package/dist/clients/surfaces/region.d.ts +16 -0
  211. package/dist/clients/surfaces/region.js +1 -0
  212. package/dist/clients/web/__tests__/push-engine.test.js +14 -158
  213. package/dist/clients/web/dev-server.d.ts +3 -3
  214. package/dist/clients/web/dev-server.js +9 -23
  215. package/dist/clients/web/events.js +4 -6
  216. package/dist/clients/web/push-engine.d.ts +2 -66
  217. package/dist/clients/web/push-engine.js +30 -161
  218. package/dist/clients/web/push-registry.d.ts +0 -4
  219. package/dist/clients/web/push-registry.js +2 -7
  220. package/dist/clients/web/server.js +3 -35
  221. package/dist/clients/web/web-client/shared/protocol.d.ts +0 -108
  222. package/dist/clients/web/web-cmd.js +2 -2
  223. package/dist/commands/__tests__/human.test.js +27 -15
  224. package/dist/commands/api-client.js +3 -3
  225. package/dist/commands/canvas-browse.js +1 -1
  226. package/dist/commands/canvas-issue.js +1 -1
  227. package/dist/commands/canvas-use.js +1 -1
  228. package/dist/commands/human/doc.d.ts +2 -0
  229. package/dist/commands/human/doc.js +98 -0
  230. package/dist/commands/human/inbox.d.ts +2 -0
  231. package/dist/commands/human/inbox.js +101 -0
  232. package/dist/commands/human/prompts.d.ts +2 -3
  233. package/dist/commands/human/prompts.js +27 -180
  234. package/dist/commands/human/queue.d.ts +1 -5
  235. package/dist/commands/human/queue.js +54 -216
  236. package/dist/commands/human/review.d.ts +2 -0
  237. package/dist/commands/human/review.js +298 -0
  238. package/dist/commands/human/shared.d.ts +2 -69
  239. package/dist/commands/human/shared.js +1 -181
  240. package/dist/commands/human.js +15 -20
  241. package/dist/commands/memory/__tests__/lint.test.d.ts +1 -0
  242. package/dist/commands/memory/__tests__/lint.test.js +15 -0
  243. package/dist/commands/memory/delete.js +2 -2
  244. package/dist/commands/memory/lint.d.ts +1 -0
  245. package/dist/commands/memory/lint.js +21 -3
  246. package/dist/commands/memory/read.js +4 -4
  247. package/dist/commands/node.js +8 -7
  248. package/dist/commands/pkg/plugin-manage.js +143 -68
  249. package/dist/commands/surface-inspect.js +2 -2
  250. package/dist/commands/surface.js +6 -12
  251. package/dist/commands/sys/__tests__/setup-core.test.js +9 -5
  252. package/dist/commands/sys/__tests__/setup-front-door.test.js +7 -42
  253. package/dist/commands/sys/config.js +29 -3
  254. package/dist/commands/sys/feedback.js +1 -1
  255. package/dist/commands/sys/setup-core.d.ts +12 -11
  256. package/dist/commands/sys/setup-core.js +55 -46
  257. package/dist/commands/sys/setup-wizard.d.ts +4 -1
  258. package/dist/commands/sys/setup-wizard.js +50 -9
  259. package/dist/commands/sys/sync-deps.js +1 -1
  260. package/dist/commands/sys.js +4 -6
  261. package/dist/core/__tests__/broker-sdk-wiring.test.js +6 -1
  262. package/dist/core/__tests__/broker-snapshot-history.test.js +9 -1
  263. package/dist/core/__tests__/dead-node-policy-table.test.js +3 -4
  264. package/dist/core/__tests__/fixtures/fake-engine.d.ts +8 -5
  265. package/dist/core/__tests__/fixtures/fake-engine.js +28 -2
  266. package/dist/core/__tests__/full/broker-provider-retry.test.js +87 -2
  267. package/dist/core/__tests__/full/broker-whip-interrupt.test.d.ts +1 -0
  268. package/dist/core/__tests__/full/broker-whip-interrupt.test.js +39 -0
  269. package/dist/core/__tests__/full/detach-focus.test.js +1 -1
  270. package/dist/core/__tests__/human-deliver-e2e.test.js +64 -64
  271. package/dist/core/__tests__/human-deliver.test.js +71 -345
  272. package/dist/core/__tests__/inline-memory-refs.test.js +2 -12
  273. package/dist/core/__tests__/memory-resolver-precedence.test.js +12 -15
  274. package/dist/core/__tests__/migration.test.js +10 -0
  275. package/dist/core/__tests__/model-pin-durability.test.js +14 -0
  276. package/dist/core/__tests__/phase4-review-migration.test.d.ts +1 -0
  277. package/dist/core/__tests__/phase4-review-migration.test.js +100 -0
  278. package/dist/core/__tests__/phase4-review-store.test.d.ts +1 -0
  279. package/dist/core/__tests__/phase4-review-store.test.js +143 -0
  280. package/dist/core/__tests__/remote-canvas-target.test.js +2 -2
  281. package/dist/core/__tests__/revive.test.js +22 -53
  282. package/dist/core/__tests__/session-cycles.test.js +48 -18
  283. package/dist/core/__tests__/spawn-no-kickoff.test.js +8 -12
  284. package/dist/core/__tests__/stop-guard.test.js +16 -1
  285. package/dist/core/__tests__/tmux-surface.test.js +21 -25
  286. package/dist/core/asset-root.d.ts +7 -0
  287. package/dist/core/asset-root.js +18 -0
  288. package/dist/core/broker-client/client.d.ts +0 -7
  289. package/dist/core/broker-client/client.js +4 -10
  290. package/dist/core/broker-client/transport-relay.d.ts +3 -4
  291. package/dist/core/broker-client/transport-relay.js +3 -4
  292. package/dist/core/canvas/__tests__/attention.test.js +1 -1
  293. package/dist/core/canvas/__tests__/remote-canvas-source.test.js +1 -1
  294. package/dist/core/canvas/__tests__/remote-transport.test.d.ts +1 -0
  295. package/dist/core/{view/__tests__/transport-remote.test.js → canvas/__tests__/remote-transport.test.js} +2 -2
  296. package/dist/core/canvas/__tests__/render-remote.test.js +1 -1
  297. package/dist/core/canvas/attention.js +4 -4
  298. package/dist/core/canvas/canvas.d.ts +6 -11
  299. package/dist/core/canvas/canvas.js +11 -33
  300. package/dist/core/canvas/db.js +207 -38
  301. package/dist/core/canvas/extensions.d.ts +1 -1
  302. package/dist/core/canvas/extensions.js +8 -1
  303. package/dist/core/canvas/index.d.ts +0 -1
  304. package/dist/core/canvas/index.js +0 -1
  305. package/dist/core/canvas/nav-model.d.ts +1 -1
  306. package/dist/core/canvas/nav-model.js +1 -1
  307. package/dist/core/canvas/paths.d.ts +5 -0
  308. package/dist/core/canvas/paths.js +16 -0
  309. package/dist/core/canvas/remote-canvas-source.js +2 -2
  310. package/dist/core/canvas/remote-transport.d.ts +7 -0
  311. package/dist/core/{view/transport-remote.js → canvas/remote-transport.js} +3 -4
  312. package/dist/core/canvas/source.js +1 -1
  313. package/dist/core/canvas/status-glyph.js +4 -12
  314. package/dist/core/canvas/types.d.ts +10 -35
  315. package/dist/core/clipboard-text.d.ts +8 -0
  316. package/dist/core/clipboard-text.js +18 -0
  317. package/dist/core/command-manifests/registry.d.ts +1 -3
  318. package/dist/core/command-plugins/bundle.d.ts +29 -0
  319. package/dist/core/command-plugins/bundle.js +198 -0
  320. package/dist/core/command-plugins/discovery.d.ts +0 -8
  321. package/dist/core/command-plugins/discovery.js +2 -39
  322. package/dist/core/command-plugins/transport/http-fetch.d.ts +4 -30
  323. package/dist/core/command-plugins/transport/http-fetch.js +17 -95
  324. package/dist/core/command.d.ts +1 -13
  325. package/dist/core/command.js +1 -16
  326. package/dist/core/config.d.ts +4 -0
  327. package/dist/core/config.js +28 -3
  328. package/dist/core/document-lines.d.ts +4 -0
  329. package/dist/core/document-lines.js +6 -0
  330. package/dist/core/feed/feed.d.ts +2 -0
  331. package/dist/core/feed/feed.js +11 -7
  332. package/dist/core/human/__tests__/inbox-cancel-worker.d.ts +1 -0
  333. package/dist/core/human/__tests__/inbox-cancel-worker.js +7 -0
  334. package/dist/core/human/__tests__/inbox-claim-worker.d.ts +1 -0
  335. package/dist/core/human/__tests__/inbox-claim-worker.js +17 -0
  336. package/dist/core/human/__tests__/inbox-core.test.d.ts +1 -0
  337. package/dist/core/human/__tests__/inbox-core.test.js +144 -0
  338. package/dist/core/human/__tests__/inbox-stale-claim-worker.d.ts +1 -0
  339. package/dist/core/human/__tests__/inbox-stale-claim-worker.js +8 -0
  340. package/dist/core/human/__tests__/visible-paths.test.d.ts +1 -0
  341. package/dist/{clients/attach → core/human}/__tests__/visible-paths.test.js +9 -0
  342. package/dist/core/human/claim.d.ts +23 -0
  343. package/dist/core/human/claim.js +67 -0
  344. package/dist/core/human/convention.d.ts +30 -0
  345. package/dist/core/human/convention.js +202 -0
  346. package/dist/core/human/deck-factories.d.ts +8 -0
  347. package/dist/core/human/deck-factories.js +15 -0
  348. package/dist/core/human/deck-schema.d.ts +70 -0
  349. package/dist/core/human/deck-schema.js +92 -0
  350. package/dist/core/human/root.d.ts +7 -0
  351. package/dist/core/human/root.js +37 -0
  352. package/dist/core/human/scan.d.ts +3 -0
  353. package/dist/core/human/scan.js +76 -0
  354. package/dist/core/human/summary.d.ts +8 -0
  355. package/dist/core/human/summary.js +44 -0
  356. package/dist/core/human/tickets.d.ts +49 -0
  357. package/dist/core/human/tickets.js +190 -0
  358. package/dist/core/human/types.d.ts +136 -0
  359. package/dist/core/human/types.js +5 -0
  360. package/dist/{clients/attach → core/human}/visible-paths.d.ts +1 -1
  361. package/dist/{clients/attach → core/human}/visible-paths.js +3 -2
  362. package/dist/core/inspector/chrome.d.ts +6 -0
  363. package/dist/core/inspector/chrome.js +14 -0
  364. package/dist/core/inspector/contract.d.ts +105 -0
  365. package/dist/core/inspector/contract.js +1 -0
  366. package/dist/core/inspector/core.d.ts +4 -5
  367. package/dist/core/inspector/core.js +3 -5
  368. package/dist/core/inspector/host.d.ts +46 -0
  369. package/dist/core/{tui → inspector}/host.js +42 -208
  370. package/dist/core/inspector/text.d.ts +2 -2
  371. package/dist/core/inspector/transport.d.ts +6 -0
  372. package/dist/core/inspector/transport.js +36 -0
  373. package/dist/core/inspector/tui.d.ts +2 -2
  374. package/dist/core/inspector/tui.js +15 -15
  375. package/dist/core/keybindings/__tests__/inbox-affordance.test.js +11 -11
  376. package/dist/core/keybindings/__tests__/resolve.test.js +10 -19
  377. package/dist/core/keybindings/attach-control.d.ts +9 -3
  378. package/dist/core/keybindings/attach-control.js +3 -1
  379. package/dist/core/keybindings/catalog.d.ts +6 -5
  380. package/dist/core/keybindings/catalog.js +61 -133
  381. package/dist/core/keybindings/inbox.d.ts +5 -6
  382. package/dist/core/keybindings/inbox.js +9 -10
  383. package/dist/core/keybindings/index.d.ts +3 -3
  384. package/dist/core/keybindings/index.js +3 -3
  385. package/dist/core/keybindings/persistence.d.ts +5 -1
  386. package/dist/core/keybindings/persistence.js +24 -6
  387. package/dist/core/keybindings/resolve.d.ts +6 -0
  388. package/dist/core/keybindings/resolve.js +10 -3
  389. package/dist/core/memory/inline-ref-grammar.js +2 -3
  390. package/dist/core/memory-resolver.d.ts +27 -29
  391. package/dist/core/memory-resolver.js +45 -39
  392. package/dist/core/model-routes.d.ts +33 -0
  393. package/dist/core/model-routes.js +42 -3
  394. package/dist/core/preview-registry.js +17 -55
  395. package/dist/core/profiles/select.js +3 -3
  396. package/dist/core/{view/remote-canvas-target.d.ts → remote-canvas-target.d.ts} +2 -2
  397. package/dist/core/{view/remote-canvas-target.js → remote-canvas-target.js} +4 -4
  398. package/dist/core/review/__tests__/capture-origin.test.d.ts +1 -0
  399. package/dist/core/review/__tests__/capture-origin.test.js +139 -0
  400. package/dist/core/review/__tests__/comments.test.d.ts +1 -0
  401. package/dist/core/review/__tests__/comments.test.js +98 -0
  402. package/dist/core/review/__tests__/project.test.d.ts +1 -0
  403. package/dist/core/review/__tests__/project.test.js +71 -0
  404. package/dist/core/review/__tests__/remap.test.d.ts +1 -0
  405. package/dist/core/review/__tests__/remap.test.js +159 -0
  406. package/dist/core/review/__tests__/stage-identity.test.d.ts +1 -0
  407. package/dist/core/review/__tests__/stage-identity.test.js +140 -0
  408. package/dist/core/review/birth.d.ts +7 -0
  409. package/dist/core/review/birth.js +23 -0
  410. package/dist/core/review/comments.d.ts +69 -0
  411. package/dist/core/review/comments.js +295 -0
  412. package/dist/core/review/companion.d.ts +35 -0
  413. package/dist/core/review/companion.js +205 -0
  414. package/dist/core/review/document.d.ts +27 -0
  415. package/dist/core/review/document.js +138 -0
  416. package/dist/core/review/project.d.ts +13 -0
  417. package/dist/core/review/project.js +58 -0
  418. package/dist/core/review/realize.d.ts +19 -0
  419. package/dist/core/review/realize.js +217 -0
  420. package/dist/core/review/remap.d.ts +24 -0
  421. package/dist/core/review/remap.js +156 -0
  422. package/dist/core/review/signal.d.ts +5 -0
  423. package/dist/core/review/signal.js +31 -0
  424. package/dist/core/review/stage.d.ts +26 -0
  425. package/dist/core/review/stage.js +184 -0
  426. package/dist/core/review/store.d.ts +46 -0
  427. package/dist/core/review/store.js +163 -0
  428. package/dist/core/review/ticket-filter.d.ts +17 -0
  429. package/dist/core/review/ticket-filter.js +32 -0
  430. package/dist/core/review/types.d.ts +130 -0
  431. package/dist/core/review/types.js +23 -0
  432. package/dist/core/runtime/__tests__/session-visibility.test.d.ts +1 -0
  433. package/dist/core/runtime/__tests__/session-visibility.test.js +119 -0
  434. package/dist/core/runtime/bearings.d.ts +5 -17
  435. package/dist/core/runtime/bearings.js +88 -71
  436. package/dist/core/runtime/broker-protocol.d.ts +31 -8
  437. package/dist/core/runtime/broker.d.ts +15 -1
  438. package/dist/core/runtime/broker.js +573 -141
  439. package/dist/core/runtime/canvas-extensions.d.ts +4 -5
  440. package/dist/core/runtime/canvas-extensions.js +5 -5
  441. package/dist/core/runtime/front-door.js +4 -4
  442. package/dist/core/runtime/headless-pi.d.ts +24 -0
  443. package/dist/core/runtime/headless-pi.js +152 -0
  444. package/dist/core/runtime/kickoff.d.ts +1 -5
  445. package/dist/core/runtime/kickoff.js +1 -5
  446. package/dist/core/runtime/model-registry.d.ts +3 -0
  447. package/dist/core/runtime/model-registry.js +13 -0
  448. package/dist/core/runtime/naming-persist.d.ts +4 -0
  449. package/dist/core/runtime/naming-persist.js +27 -1
  450. package/dist/core/runtime/naming.d.ts +17 -12
  451. package/dist/core/runtime/naming.js +91 -140
  452. package/dist/core/runtime/node-read.js +19 -10
  453. package/dist/core/runtime/nodes.d.ts +9 -14
  454. package/dist/core/runtime/nodes.js +3 -53
  455. package/dist/core/runtime/package-health.d.ts +6 -21
  456. package/dist/core/runtime/package-health.js +12 -123
  457. package/dist/core/runtime/placement-tmux.d.ts +2 -1
  458. package/dist/core/runtime/placement-tmux.js +6 -4
  459. package/dist/core/runtime/placement.d.ts +1 -0
  460. package/dist/core/runtime/placement.js +4 -8
  461. package/dist/core/runtime/promote.js +3 -0
  462. package/dist/core/runtime/recap.d.ts +2 -7
  463. package/dist/core/runtime/recap.js +35 -69
  464. package/dist/core/runtime/revive.js +34 -77
  465. package/dist/core/runtime/session-cycles.d.ts +4 -0
  466. package/dist/core/runtime/session-cycles.js +14 -1
  467. package/dist/core/runtime/session-visibility.d.ts +37 -0
  468. package/dist/core/runtime/session-visibility.js +83 -0
  469. package/dist/core/runtime/spawn.js +10 -22
  470. package/dist/core/runtime/stop-guard.d.ts +1 -1
  471. package/dist/core/runtime/stop-guard.js +18 -13
  472. package/dist/core/runtime/surface-bg.js +1 -1
  473. package/dist/core/runtime/tmux-chrome.d.ts +1 -1
  474. package/dist/core/runtime/tmux-chrome.js +1 -1
  475. package/dist/core/runtime/tmux.d.ts +35 -7
  476. package/dist/core/runtime/tmux.js +439 -62
  477. package/dist/core/runtime/tool-group-summary.d.ts +19 -0
  478. package/dist/core/runtime/tool-group-summary.js +88 -0
  479. package/dist/core/scope.d.ts +2 -7
  480. package/dist/core/scope.js +9 -35
  481. package/dist/core/substrate/schema.d.ts +2 -2
  482. package/dist/core/termrender/code-doc.d.ts +12 -0
  483. package/dist/core/termrender/code-doc.js +92 -0
  484. package/dist/core/termrender/display.d.ts +12 -0
  485. package/dist/core/termrender/display.js +19 -0
  486. package/dist/core/termrender/termrender.d.ts +73 -0
  487. package/dist/core/termrender/termrender.js +795 -0
  488. package/dist/core/termrender/version.d.ts +1 -0
  489. package/dist/core/termrender/version.js +1 -0
  490. package/dist/core/tui/terminal.js +1 -2
  491. package/dist/core/user-settings.d.ts +71 -3
  492. package/dist/core/user-settings.js +83 -1
  493. package/dist/daemon/api/__tests__/inbox.test.js +44 -133
  494. package/dist/daemon/api/handlers/human.d.ts +0 -10
  495. package/dist/daemon/api/handlers/human.js +104 -702
  496. package/dist/daemon/api/handlers/inbox.js +113 -142
  497. package/dist/daemon/api/handlers/review-comments.d.ts +2 -0
  498. package/dist/daemon/api/handlers/review-comments.js +500 -0
  499. package/dist/daemon/api/handlers/reviews.d.ts +2 -0
  500. package/dist/daemon/api/handlers/reviews.js +287 -0
  501. package/dist/daemon/api/map.d.ts +22 -7
  502. package/dist/daemon/api/map.js +159 -11
  503. package/dist/daemon/api/server.js +4 -0
  504. package/dist/daemon/cron-run.js +6 -9
  505. package/dist/daemon/crtrd.js +17 -33
  506. package/dist/daemon/fleet.d.ts +1 -8
  507. package/dist/daemon/fleet.js +4 -30
  508. package/dist/daemon/human/finish.d.ts +14 -0
  509. package/dist/daemon/human/finish.js +115 -0
  510. package/dist/daemon/human/sweep.d.ts +6 -0
  511. package/dist/daemon/human/sweep.js +49 -0
  512. package/dist/daemon/messaging/node-message.d.ts +18 -0
  513. package/dist/daemon/messaging/node-message.js +70 -0
  514. package/dist/daemon/review/comment-notify.d.ts +26 -0
  515. package/dist/daemon/review/comment-notify.js +107 -0
  516. package/dist/daemon/review/deliver.d.ts +7 -0
  517. package/dist/daemon/review/deliver.js +56 -0
  518. package/dist/daemon/review/finish.d.ts +22 -0
  519. package/dist/daemon/review/finish.js +254 -0
  520. package/dist/daemon/review/sweep.d.ts +11 -0
  521. package/dist/daemon/review/sweep.js +120 -0
  522. package/dist/index.d.ts +2 -0
  523. package/dist/index.js +2 -2
  524. package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +42 -64
  525. package/dist/pi-extensions/__tests__/canvas-recap.test.d.ts +1 -0
  526. package/dist/pi-extensions/__tests__/canvas-recap.test.js +159 -0
  527. package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +16 -38
  528. package/dist/pi-extensions/__tests__/canvas-structured-output.test.d.ts +1 -0
  529. package/dist/pi-extensions/__tests__/canvas-structured-output.test.js +63 -0
  530. package/dist/pi-extensions/canvas-context-intro.d.ts +8 -11
  531. package/dist/pi-extensions/canvas-context-intro.js +50 -104
  532. package/dist/pi-extensions/canvas-recap.d.ts +15 -2
  533. package/dist/pi-extensions/canvas-recap.js +192 -69
  534. package/dist/pi-extensions/canvas-review-boundary.d.ts +59 -0
  535. package/dist/pi-extensions/canvas-review-boundary.js +81 -0
  536. package/dist/pi-extensions/canvas-stophook.d.ts +3 -3
  537. package/dist/pi-extensions/canvas-stophook.js +78 -128
  538. package/dist/pi-extensions/canvas-structured-output.js +52 -8
  539. package/dist/shared/generated-context.d.ts +29 -4
  540. package/dist/shared/generated-context.js +122 -7
  541. package/dist/shared/tool-groups.d.ts +23 -0
  542. package/dist/shared/tool-groups.js +60 -0
  543. package/dist/shared/working-activity.d.ts +8 -0
  544. package/dist/shared/working-activity.js +26 -0
  545. package/dist/types.d.ts +36 -2
  546. package/dist/types.js +51 -0
  547. package/dist/web-client/assets/index-CCPaLeW7.css +2 -0
  548. package/dist/web-client/assets/index-kyOWsnZK.js +86 -0
  549. package/dist/web-client/index.html +2 -2
  550. package/dist/web-client/sw.js +1 -1
  551. package/docs/compat/hearth-crtr-v4.md +2 -2
  552. package/docs/compat/hearth-crtr-v5.md +4 -2
  553. package/docs/public-api.md +3 -3
  554. package/package.json +21 -14
  555. package/runtime.lock.json +4661 -1453
  556. package/scripts/postinstall.mjs +15 -2
  557. package/dist/builtin-pi-packages/pi-mode-switch/README.md +0 -36
  558. package/dist/builtin-pi-packages/pi-mode-switch/bin/mode +0 -36
  559. package/dist/builtin-pi-packages/pi-mode-switch/extensions/index.ts +0 -449
  560. package/dist/builtin-pi-packages/pi-mode-switch/package.json +0 -14
  561. package/dist/builtin-pi-packages/pi-mode-switch/tsconfig.json +0 -9
  562. package/dist/builtin-views/_lib/states.mjs +0 -161
  563. package/dist/builtin-views/canvas/core.mjs +0 -657
  564. package/dist/builtin-views/canvas/text.mjs +0 -58
  565. package/dist/builtin-views/canvas/tui.mjs +0 -168
  566. package/dist/builtin-views/canvas/web.jsx +0 -121
  567. package/dist/builtin-views/chat/core.mjs +0 -684
  568. package/dist/builtin-views/chat/text.mjs +0 -101
  569. package/dist/builtin-views/chat/tui.mjs +0 -360
  570. package/dist/builtin-views/chat/web.jsx +0 -362
  571. package/dist/builtin-views/git-pr/core.mjs +0 -673
  572. package/dist/builtin-views/git-pr/text.mjs +0 -84
  573. package/dist/builtin-views/git-pr/tui.mjs +0 -301
  574. package/dist/builtin-views/git-pr/web.jsx +0 -216
  575. package/dist/builtin-views/inbox/_lib/render.mjs +0 -175
  576. package/dist/builtin-views/inbox/core.mjs +0 -1273
  577. package/dist/builtin-views/inbox/text.mjs +0 -73
  578. package/dist/builtin-views/inbox/tui.mjs +0 -314
  579. package/dist/builtin-views/inbox/web.jsx +0 -188
  580. package/dist/builtin-views/linkedin/core.mjs +0 -906
  581. package/dist/builtin-views/linkedin/text.mjs +0 -69
  582. package/dist/builtin-views/linkedin/tui.mjs +0 -413
  583. package/dist/builtin-views/linkedin/web.jsx +0 -206
  584. package/dist/builtin-views/prompt-review/core.mjs +0 -735
  585. package/dist/builtin-views/prompt-review/text.mjs +0 -15
  586. package/dist/builtin-views/prompt-review/tui.mjs +0 -196
  587. package/dist/builtin-views/prompt-review/web.jsx +0 -484
  588. package/dist/builtin-views/workspace-sidebar/__tests__/core.test.js +0 -50
  589. package/dist/builtin-views/workspace-sidebar/__tests__/core.test.ts +0 -53
  590. package/dist/builtin-views/workspace-sidebar/core.mjs +0 -670
  591. package/dist/builtin-views/workspace-sidebar/text.mjs +0 -53
  592. package/dist/builtin-views/workspace-sidebar/tui.mjs +0 -141
  593. package/dist/builtin-views/workspace-sidebar/web.jsx +0 -109
  594. package/dist/clients/attach/session/mode.d.ts +0 -25
  595. package/dist/clients/attach/session/mode.js +0 -97
  596. package/dist/commands/sys/promptstudio.d.ts +0 -2
  597. package/dist/commands/sys/promptstudio.js +0 -65
  598. package/dist/commands/view-cycle.d.ts +0 -2
  599. package/dist/commands/view-cycle.js +0 -130
  600. package/dist/commands/view-list.d.ts +0 -2
  601. package/dist/commands/view-list.js +0 -66
  602. package/dist/commands/view-new.d.ts +0 -2
  603. package/dist/commands/view-new.js +0 -74
  604. package/dist/commands/view-pick.d.ts +0 -6
  605. package/dist/commands/view-pick.js +0 -129
  606. package/dist/commands/view-run.d.ts +0 -2
  607. package/dist/commands/view-run.js +0 -214
  608. package/dist/commands/view.d.ts +0 -2
  609. package/dist/commands/view.js +0 -31
  610. package/dist/commands/workspace.d.ts +0 -2
  611. package/dist/commands/workspace.js +0 -165
  612. package/dist/core/__tests__/chat-view-reconnect.test.js +0 -105
  613. package/dist/core/__tests__/full/consult-startup-failure.test.js +0 -124
  614. package/dist/core/canvas/__tests__/human-work-outbox.test.js +0 -123
  615. package/dist/core/canvas/human-work-outbox.d.ts +0 -73
  616. package/dist/core/canvas/human-work-outbox.js +0 -261
  617. package/dist/core/command-plugins/store.d.ts +0 -16
  618. package/dist/core/command-plugins/store.js +0 -64
  619. package/dist/core/keybindings/__tests__/bespoke-consumers.test.js +0 -40
  620. package/dist/core/runtime/fault-recovery-nudge.d.ts +0 -3
  621. package/dist/core/runtime/fault-recovery-nudge.js +0 -3
  622. package/dist/core/tui/__tests__/host-keybindings.test.js +0 -113
  623. package/dist/core/tui/host.d.ts +0 -66
  624. package/dist/core/view/__tests__/transport-cache.test.js +0 -62
  625. package/dist/core/view/bridge.d.ts +0 -10
  626. package/dist/core/view/bridge.js +0 -31
  627. package/dist/core/view/chrome.d.ts +0 -9
  628. package/dist/core/view/chrome.js +0 -22
  629. package/dist/core/view/contract.d.ts +0 -205
  630. package/dist/core/view/contract.js +0 -23
  631. package/dist/core/view/loader.d.ts +0 -31
  632. package/dist/core/view/loader.js +0 -188
  633. package/dist/core/view/stream-local.d.ts +0 -3
  634. package/dist/core/view/stream-local.js +0 -231
  635. package/dist/core/view/transport-cache.d.ts +0 -8
  636. package/dist/core/view/transport-cache.js +0 -38
  637. package/dist/core/view/transport-local.d.ts +0 -7
  638. package/dist/core/view/transport-local.js +0 -83
  639. package/dist/core/view/transport-remote.d.ts +0 -2
  640. package/dist/core/view/transport.d.ts +0 -10
  641. package/dist/core/view/transport.js +0 -15
  642. package/dist/pi-extensions/naming-tool.d.ts +0 -24
  643. package/dist/pi-extensions/naming-tool.js +0 -67
  644. package/dist/prompts/view.d.ts +0 -7
  645. package/dist/prompts/view.js +0 -172
  646. package/dist/web/ViewChrome.d.ts +0 -7
  647. package/dist/web/ViewChrome.js +0 -28
  648. package/dist/web/ViewPane.d.ts +0 -39
  649. package/dist/web/ViewPane.js +0 -48
  650. package/dist/web/index.d.ts +0 -8
  651. package/dist/web/index.js +0 -22
  652. package/dist/web/runtime.d.ts +0 -39
  653. package/dist/web/runtime.js +0 -232
  654. package/dist/web/states.d.ts +0 -24
  655. package/dist/web/states.js +0 -24
  656. package/dist/web/transport-http.d.ts +0 -5
  657. package/dist/web/transport-http.js +0 -34
  658. package/dist/web/transport-stream.d.ts +0 -3
  659. package/dist/web/transport-stream.js +0 -204
  660. package/dist/web-client/assets/index-U_NZ66VE.js +0 -79
  661. package/dist/web-client/assets/index-aaeu4adv.css +0 -2
  662. /package/dist/{builtin-views/workspace-sidebar/__tests__/core.test.d.ts → clients/attach/__tests__/file-review-focus.test.d.ts} +0 -0
  663. /package/dist/clients/attach/__tests__/{visible-paths.test.d.ts → group-activity.test.d.ts} +0 -0
  664. /package/dist/{core/__tests__/chat-view-reconnect.test.d.ts → clients/attach/__tests__/input-controller-extension-command.test.d.ts} +0 -0
  665. /package/dist/{core/__tests__/full/consult-startup-failure.test.d.ts → clients/attach/__tests__/session-identity-refresh.test.d.ts} +0 -0
  666. /package/dist/{core/canvas/__tests__/human-work-outbox.test.d.ts → clients/inbox/__tests__/inbox-controller.test.d.ts} +0 -0
  667. /package/dist/{core/keybindings/__tests__/bespoke-consumers.test.d.ts → clients/inbox/__tests__/mount-panel.test.d.ts} +0 -0
  668. /package/dist/{core/tui/__tests__/host-keybindings.test.d.ts → clients/inbox/review/__tests__/editor-roundtrip.test.d.ts} +0 -0
  669. /package/dist/{core/view/__tests__/transport-cache.test.d.ts → clients/inbox/review/__tests__/remap.test.d.ts} +0 -0
  670. /package/dist/{core/view/__tests__/transport-remote.test.d.ts → clients/inbox/review/__tests__/review-core.test.d.ts} +0 -0
@@ -199,44 +199,44 @@ test('tmux installer remaps owned pairs and preserves occupied user bindings', (
199
199
  // item name between the previous group and the header).
200
200
  assert.ok((defaultMenu.match(/'' "-#\[bold\]/g) ?? []).length >= 3, defaultMenu);
201
201
  assert.ok(defaultMenu.indexOf('promote to orchestrator') > defaultMenu.indexOf('-#[bold]Lifecycle'));
202
- assert.match(defaultMenu, /"create ›" i .*display-menu.*idea.*bug/);
202
+ assert.match(defaultMenu, /"create ›" c .*display-menu.*idea.*bug/);
203
203
  assert.match(defaultMenu, /"Alt\+C to close" M-c refresh-client/);
204
204
  const explore = defaultMenu.indexOf('-#[bold]Explore');
205
205
  const currentNode = defaultMenu.indexOf('-#[bold]Current node');
206
206
  const lifecycle = defaultMenu.indexOf('-#[bold]Lifecycle');
207
207
  const system = defaultMenu.indexOf('-#[bold]System');
208
- for (const item of ['resume node', 'graph view', 'focus manager', 'show ›', 'view settings ›']) {
208
+ for (const item of ['find node', 'canvas graph', 'go to manager', 'inspect ›', 'display ›']) {
209
209
  assert.ok(defaultMenu.indexOf(item) > explore && defaultMenu.indexOf(item) < currentNode, `${item} belongs in Explore`);
210
210
  }
211
- assert.match(defaultMenu, /"show ›" s .*display-menu.*metadata.*context \+ reports/);
212
- for (const item of ['background bash command', 'copy node id']) {
211
+ assert.match(defaultMenu, /"inspect ›" i .*display-menu.*metadata.*context \+ reports/);
212
+ for (const item of ['background running bash', 'copy node id']) {
213
213
  assert.ok(defaultMenu.indexOf(item) > currentNode && defaultMenu.indexOf(item) < lifecycle, `${item} belongs to the current node`);
214
214
  }
215
215
  assert.ok(defaultMenu.indexOf('fork into idle root') > lifecycle && defaultMenu.indexOf('fork into idle root') < system, 'fork belongs in Lifecycle');
216
- assert.match(defaultMenu, /"view settings ›" w .*display-menu.*fold finished tool calls/);
217
- assert.match(defaultMenu, /"attach ›" a .*display-menu.*search profile files/);
216
+ assert.match(defaultMenu, /"display ›" z .*display-menu.*fold finished tool calls/);
217
+ assert.match(defaultMenu, /"attach viewer ›" a .*display-menu.*search profile files/);
218
+ // File review is reachable from the top-level menu and alt+shift+R only:
219
+ // its attach-submenu selector ships unbound, so the row must not render.
220
+ assert.doesNotMatch(defaultMenu, /"review a file" r /);
218
221
  assert.match(defaultMenu, /send-keys -l/);
219
222
  assert.match(defaultMenu, /crtr\.attach\.profile-files/, 'the menu path must work while the profile-files direct binding is disabled by default');
220
- // Matched with its selector, so the Explore group's "view settings ›" item
221
- // (selector `w`) cannot satisfy this assertion by substring.
222
- assert.ok(defaultMenu.indexOf('settings p ') > system, 'settings belongs in System');
223
+ // Matched with its selector, so the Explore group's "display ›" item
224
+ // cannot satisfy this assertion by substring.
225
+ assert.ok(defaultMenu.indexOf('settings , ') > system, 'settings belongs in System');
223
226
  assert.ok(defaultMenu.indexOf('create ›') > system, 'create belongs in System');
224
- assert.match(tmuxBinding(socket, 'root', 'M-v') ?? '', /switch-client/);
225
227
  // The inbox toggle installs at its default key (alt+i → M-i) in the same sweep.
226
- assert.match(tmuxBinding(socket, 'root', 'M-i') ?? '', /hl inbox toggle/);
228
+ assert.match(tmuxBinding(socket, 'root', 'M-i') ?? '', /crtr human inbox toggle/);
227
229
  const attachMenuDisabled = Object.fromEntries(ATTACH_CONTROL_BINDINGS.map(({ menuId }) => [menuId, []]));
228
230
  const withoutAttach = installTmuxBindings(resolveKeybindings(attachMenuDisabled));
229
231
  assert.equal(withoutAttach.ok, true, JSON.stringify(withoutAttach.diagnostics));
230
232
  const menuWithoutAttach = tmuxBinding(socket, 'root', 'M-c') ?? '';
231
- assert.doesNotMatch(menuWithoutAttach, /attach ›/, 'an empty attach submenu must hide its opener');
233
+ assert.doesNotMatch(menuWithoutAttach, /attach viewer ›/, 'an empty attach submenu must hide its opener');
232
234
  assert.doesNotMatch(menuWithoutAttach, /search profile files/);
233
235
  const remapped = installTmuxBindings(resolveKeybindings({
234
236
  'crtr.tmux.menu.open': ['alt+shift+z'],
235
237
  'crtr.tmux.menu.graph': ['shift+z'],
236
238
  'crtr.tmux.menu-global.fold-tools': ['alt+shift+f'],
237
239
  'crtr.tmux.node.next': [],
238
- 'crtr.tmux.view.next': ['alt+z > n'],
239
- 'crtr.tmux.view.previous': ['alt+z > p'],
240
240
  }));
241
241
  assert.equal(remapped.ok, true, JSON.stringify(remapped.diagnostics));
242
242
  assert.equal(tmuxBinding(socket, 'root', 'M-c'), null);
@@ -247,16 +247,12 @@ test('tmux installer remaps owned pairs and preserves occupied user bindings', (
247
247
  assert.match(foldTools, /fold-tools/);
248
248
  assert.doesNotMatch(foldTools, /#\{pane_id\}/);
249
249
  const menu = tmuxBinding(socket, 'root', 'M-S-Z') ?? '';
250
- assert.match(menu, /graph view/);
250
+ assert.match(menu, /canvas graph/);
251
251
  assert.match(menu, /Z/);
252
252
  assert.match(menu, /"Alt\+Shift\+Z to close" M-S-Z refresh-client/);
253
- const prefix = tmuxBinding(socket, 'root', 'M-z') ?? '';
254
- assert.match(prefix, /switch-client/);
255
253
  const again = installTmuxBindings(resolveKeybindings({
256
254
  'crtr.tmux.menu.open': ['alt+shift+y'],
257
255
  'crtr.tmux.node.next': [],
258
- 'crtr.tmux.view.next': ['alt+z > n'],
259
- 'crtr.tmux.view.previous': ['alt+z > p'],
260
256
  }));
261
257
  assert.equal(again.ok, true, JSON.stringify(again.diagnostics));
262
258
  isolatedTmux(socket, ['bind-key', '-T', 'root', 'M-S-Z', 'display-message', 'user-owned']);
@@ -297,11 +293,11 @@ test('tmux installer replaces an untracked stale crouter menu even when a partia
297
293
  ]);
298
294
  const stale = tmuxBinding(socket, 'root', 'M-c') ?? '';
299
295
  assert.match(stale, /crtr canvas chord/);
300
- assert.doesNotMatch(stale, /background bash command/);
296
+ assert.doesNotMatch(stale, /background running bash/);
301
297
  const result = installTmuxBindings(resolveKeybindings());
302
298
  assert.equal(result.ok, true, JSON.stringify(result.diagnostics));
303
299
  assert.ok(!result.diagnostics.some((d) => d.bindingId === 'crtr.tmux.menu.open'), JSON.stringify(result.diagnostics));
304
- assert.match(tmuxBinding(socket, 'root', 'M-c') ?? '', /background bash command/);
300
+ assert.match(tmuxBinding(socket, 'root', 'M-c') ?? '', /background running bash/);
305
301
  }
306
302
  finally {
307
303
  if (priorTmux === undefined)
@@ -340,7 +336,7 @@ test('tmux installer rebinds/disables the inbox toggle and adopts the legacy hl-
340
336
  assert.equal(first.ok, true, JSON.stringify(first.diagnostics));
341
337
  // Adopted, not foreign: M-i is now crouter's inbox toggle, no occupied diag.
342
338
  assert.ok(!first.diagnostics.some((d) => d.bindingId === 'crtr.tmux.inbox.toggle'), JSON.stringify(first.diagnostics));
343
- assert.match(tmuxBinding(socket, 'root', 'M-i') ?? '', /hl inbox toggle/);
339
+ assert.match(tmuxBinding(socket, 'root', 'M-i') ?? '', /crtr human inbox toggle/);
344
340
  assert.ok(first.installed.some((pair) => pair.table === 'root' && pair.key === 'M-i'));
345
341
  // The obsolete flat key file is deleted by the cleanup.
346
342
  assert.equal(existsSync(legacyKeyFile), false, 'legacy inbox-key file should be removed');
@@ -349,7 +345,7 @@ test('tmux installer rebinds/disables the inbox toggle and adopts the legacy hl-
349
345
  const rebound = installTmuxBindings(resolveKeybindings({ 'crtr.tmux.inbox.toggle': ['alt+j'] }));
350
346
  assert.equal(rebound.ok, true, JSON.stringify(rebound.diagnostics));
351
347
  assert.equal(tmuxBinding(socket, 'root', 'M-i'), null);
352
- assert.match(tmuxBinding(socket, 'root', 'M-j') ?? '', /hl inbox toggle/);
348
+ assert.match(tmuxBinding(socket, 'root', 'M-j') ?? '', /crtr human inbox toggle/);
353
349
  // Disable via empty gesture list: no inbox key installed at all, no error.
354
350
  const disabled = installTmuxBindings(resolveKeybindings({ 'crtr.tmux.inbox.toggle': [] }));
355
351
  assert.equal(disabled.ok, true, JSON.stringify(disabled.diagnostics));
@@ -399,7 +395,7 @@ test('tmux installer adopts the legacy hl-owned inbox key when a crouter manifes
399
395
  // Cleanup ran despite the existing manifest: M-i is crouter's tracked inbox
400
396
  // toggle, no occupied/foreign diagnostic, and the key file is gone.
401
397
  assert.ok(!result.diagnostics.some((d) => d.bindingId === 'crtr.tmux.inbox.toggle'), JSON.stringify(result.diagnostics));
402
- assert.match(tmuxBinding(socket, 'root', 'M-i') ?? '', /hl inbox toggle/);
398
+ assert.match(tmuxBinding(socket, 'root', 'M-i') ?? '', /crtr human inbox toggle/);
403
399
  assert.ok(result.installed.some((pair) => pair.table === 'root' && pair.key === 'M-i'));
404
400
  assert.equal(existsSync(legacyKeyFile), false, 'legacy inbox-key file should be removed');
405
401
  }
@@ -446,7 +442,7 @@ test('tmux installer removes a legacy custom inbox key recorded in the state fil
446
442
  // The orphaned custom-key binding is gone — not left as an untracked live
447
443
  // shortcut — and was not imported into crouter's config (M-z stays unbound).
448
444
  assert.equal(tmuxBinding(socket, 'root', 'M-z'), null, 'legacy custom key must be unbound');
449
- assert.match(tmuxBinding(socket, 'root', 'M-i') ?? '', /hl inbox toggle/);
445
+ assert.match(tmuxBinding(socket, 'root', 'M-i') ?? '', /crtr human inbox toggle/);
450
446
  assert.equal(existsSync(legacyKeyFile), false, 'legacy inbox-key file should be removed');
451
447
  }
452
448
  finally {
@@ -0,0 +1,7 @@
1
+ /** The source or runtime directory containing every shipped asset tree.
2
+ *
3
+ * `import.meta.url` names the module when loaded directly, but names the
4
+ * attach viewer bundle when esbuild inlines this module. Walking to the
5
+ * directory marked by the built-in assets preserves one resolution rule for
6
+ * both loading contexts. */
7
+ export declare function assetRoot(): string;
@@ -0,0 +1,18 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { dirname, join } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ /** The source or runtime directory containing every shipped asset tree.
5
+ *
6
+ * `import.meta.url` names the module when loaded directly, but names the
7
+ * attach viewer bundle when esbuild inlines this module. Walking to the
8
+ * directory marked by the built-in assets preserves one resolution rule for
9
+ * both loading contexts. */
10
+ export function assetRoot() {
11
+ for (let current = dirname(fileURLToPath(import.meta.url));; current = dirname(current)) {
12
+ if (existsSync(join(current, 'builtin-memory')) && existsSync(join(current, 'builtin-pi-packages')))
13
+ return current;
14
+ const parent = dirname(current);
15
+ if (parent === current)
16
+ throw new Error(`cannot locate crouter assets from ${import.meta.url}`);
17
+ }
18
+ }
@@ -16,12 +16,6 @@ export interface BrokerClientOptions {
16
16
  * to attach a remote node instead; every method behaves identically either
17
17
  * way. */
18
18
  transport?: Transport;
19
- /** Re-emit a `data` frame that matches no in-flight request as a generic
20
- * `frame` event. OFF by default: the attach viewer's frame router would
21
- * mis-handle a stray `data` frame as a pi `AgentSessionEvent`. The operator
22
- * view (`core/view/stream-local.ts`) passes read-op replies through to its
23
- * own consumer and is the one caller that needs `true`. */
24
- emitUnmatchedDataFrames?: boolean;
25
19
  }
26
20
  /** The reconnect supervisor's give-up predicate (extracted pure so it is
27
21
  * testable without a socket or TUI). After a broker close the viewer KEEPS
@@ -51,7 +45,6 @@ export interface BrokerClient {
51
45
  export declare class BrokerClient extends EventEmitter {
52
46
  private readonly nodeId;
53
47
  private readonly transport;
54
- private readonly emitUnmatchedDataFrames;
55
48
  private closeEmitted;
56
49
  /** Tracks live connect↔close state so {@link request} can fail fast on a
57
50
  * dead/absent connection rather than parking a promise the reply will
@@ -1,7 +1,7 @@
1
1
  // client.ts — THE broker protocol client. Every Node process that talks to a
2
2
  // node's broker over `view.sock` uses this one class: the `crtr surface attach`
3
- // viewer, `core/view/stream-local`, `auth-reload`, `model-swap`, and the
4
- // human-prompt dequeue path. (The browser has its own module under
3
+ // viewer, `auth-reload`, `model-swap`, and the human-prompt dequeue path.
4
+ // (The browser has its own module under
5
5
  // `clients/web/web-client/` until that is made isomorphic — see the target
6
6
  // architecture note; `daemon/api/bridge.ts` is a byte relay, not a client.)
7
7
  //
@@ -57,7 +57,6 @@ export function reconnectShouldGiveUp(row) {
57
57
  export class BrokerClient extends EventEmitter {
58
58
  nodeId;
59
59
  transport;
60
- emitUnmatchedDataFrames;
61
60
  closeEmitted = false;
62
61
  /** Tracks live connect↔close state so {@link request} can fail fast on a
63
62
  * dead/absent connection rather than parking a promise the reply will
@@ -76,7 +75,6 @@ export class BrokerClient extends EventEmitter {
76
75
  constructor(nodeId, options = {}) {
77
76
  super();
78
77
  this.nodeId = nodeId;
79
- this.emitUnmatchedDataFrames = options.emitUnmatchedDataFrames ?? false;
80
78
  this.transport = options.transport ?? new SocketTransport(nodeId);
81
79
  this.transport.on('connect', () => {
82
80
  this.closeEmitted = false;
@@ -148,9 +146,8 @@ export class BrokerClient extends EventEmitter {
148
146
  // would otherwise treat a `data` frame as an AgentSessionEvent). A `data`
149
147
  // frame is ALWAYS a reply, so by default it is swallowed unconditionally —
150
148
  // even a late post-timeout one (no pending entry) is dropped, never leaked
151
- // to the router; `emitUnmatchedDataFrames` opts a caller into seeing those.
152
- // An `error` is correlated only when its `id` matches an in-flight request;
153
- // an uncorrelated error still flows through.
149
+ // to the router. An `error` is correlated only when its `id` matches an
150
+ // in-flight request; an uncorrelated error still flows through.
154
151
  if (frame.type === 'data') {
155
152
  const entry = typeof frame.id === 'string' ? this.pending.get(frame.id) : undefined;
156
153
  if (entry) {
@@ -158,9 +155,6 @@ export class BrokerClient extends EventEmitter {
158
155
  clearTimeout(entry.timer);
159
156
  entry.resolve(frame);
160
157
  }
161
- else if (this.emitUnmatchedDataFrames) {
162
- this.emit('frame', frame);
163
- }
164
158
  return;
165
159
  }
166
160
  if (frame.type === 'error' && typeof frame.id === 'string' && this.pending.has(frame.id)) {
@@ -1,7 +1,7 @@
1
1
  import { EventEmitter } from 'node:events';
2
2
  import type { ClientToBroker } from '../runtime/broker-protocol.js';
3
3
  import { type Transport } from './transport.js';
4
- /** A resolved remote canvas target — see `core/view/remote-canvas-target.ts` for how
4
+ /** A resolved remote canvas target — see `core/remote-canvas-target.ts` for how
5
5
  * this is assembled from config (`relayTokenRef`) plus the 0600 secrets store
6
6
  * via `resolveRemoteCanvasTarget`. This transport itself never takes the
7
7
  * token from argv — `canvas config add --relay-token -` is the only accepted
@@ -29,9 +29,8 @@ export declare class RelayTransport extends EventEmitter implements Transport {
29
29
  destroy(): void;
30
30
  private onMessage;
31
31
  private onError;
32
- /** WS close codes mirror the SAME semantics the browser relay client
33
- * (`clients/web/web-client/broker-client.ts`'s `onclose` / `src/web/
34
- * transport-stream.ts`'s `classifyClose`): 1008 invalid id, or a 1011 whose
32
+ /** WS close codes mirror the browser relay client's semantics: 1008 invalid
33
+ * id, or a 1011 whose
35
34
  * REASON starts with "no running broker"/"no node " (the relay's exact
36
35
  * wording — `src/clients/web/server.ts`), are the terminal "gone" signals —
37
36
  * surfaced as BrokerUnavailableError so the reconnect supervisor's normal
@@ -13,7 +13,7 @@
13
13
  //
14
14
  // The relay token is the SAME in-guest credential model-auth-front already
15
15
  // gates on; holding it is the in-guest trust tier, not a new one. Callers
16
- // must keep it off argv/shell history (see `core/view/remote-canvas-target.ts`) — this
16
+ // must keep it off argv/shell history (see `core/remote-canvas-target.ts`) — this
17
17
  // transport only ever sends it as a request header, never logs it.
18
18
  import { EventEmitter } from 'node:events';
19
19
  import { WebSocket } from 'ws';
@@ -132,9 +132,8 @@ export class RelayTransport extends EventEmitter {
132
132
  this.emitError(new Error(`relay transport error: ${err.message}`));
133
133
  // 'close' follows 'error'; teardown converges there.
134
134
  }
135
- /** WS close codes mirror the SAME semantics the browser relay client
136
- * (`clients/web/web-client/broker-client.ts`'s `onclose` / `src/web/
137
- * transport-stream.ts`'s `classifyClose`): 1008 invalid id, or a 1011 whose
135
+ /** WS close codes mirror the browser relay client's semantics: 1008 invalid
136
+ * id, or a 1011 whose
138
137
  * REASON starts with "no running broker"/"no node " (the relay's exact
139
138
  * wording — `src/clients/web/server.ts`), are the terminal "gone" signals —
140
139
  * surfaced as BrokerUnavailableError so the reconnect supervisor's normal
@@ -4,7 +4,7 @@ import assert from 'node:assert/strict';
4
4
  import { mkdtempSync, rmSync, mkdirSync } from 'node:fs';
5
5
  import { tmpdir } from 'node:os';
6
6
  import { join } from 'node:path';
7
- import { atomicWriteJson, deckPath } from '@crouton-kit/humanloop';
7
+ import { atomicWriteJson, deckPath } from '../../human/convention.js';
8
8
  import { createNode } from '../canvas.js';
9
9
  import { closeDb } from '../db.js';
10
10
  import { nodeDir } from '../paths.js';
@@ -1,6 +1,6 @@
1
1
  // remote-canvas-source.test.ts — `RemoteCanvasSource` (`../remote-canvas-source.ts`)
2
2
  // over its real wire contract: a POST to `/__crtr/source` carrying
3
- // `{kind:'exec', bin, args}` (see `../../view/transport-remote.ts`), bearer-
3
+ // `{kind:'exec', bin, args}` (see `../remote-transport.ts`), bearer-
4
4
  // authed. Mirrors `src/core/broker-client/__tests__/transport-relay.test.ts`'s
5
5
  // `startMockRelay` shape — a plain `node:http` server standing in for the
6
6
  // remote canvas's `/__crtr/source` endpoint, recording every request so
@@ -1,4 +1,4 @@
1
- // transport-remote.test.ts — `createRemoteExec` (`../transport-remote.ts`), the
1
+ // remote-transport.test.ts — `createRemoteExec` (`../remote-transport.ts`), the
2
2
  // Node-side POST transport `RemoteCanvasSource` shells every remote read
3
3
  // through. Covers the one thing a bare `fetch(...)` with no
4
4
  // AbortController/timeout doesn't give you for free: a hung endpoint fails
@@ -8,7 +8,7 @@
8
8
  import { test } from 'node:test';
9
9
  import assert from 'node:assert/strict';
10
10
  import { createServer } from 'node:http';
11
- import { createRemoteExec } from '../transport-remote.js';
11
+ import { createRemoteExec } from '../remote-transport.js';
12
12
  function startStalledServer() {
13
13
  return new Promise((resolve) => {
14
14
  // Accept the connection but never write a response — the request just
@@ -19,7 +19,7 @@ import { createServer } from 'node:http';
19
19
  import { mkdtempSync, rmSync, mkdirSync, writeFileSync } from 'node:fs';
20
20
  import { tmpdir } from 'node:os';
21
21
  import { join } from 'node:path';
22
- import { atomicWriteJson, deckPath } from '@crouton-kit/humanloop';
22
+ import { atomicWriteJson, deckPath } from '#core/human/convention';
23
23
  import { RemoteCanvasSource } from '../remote-canvas-source.js';
24
24
  import { dashboardRowsAllFromSource, enrichRowsFromSource, loadPreviewFromSource, renderForestFromSource } from '../render.js';
25
25
  import { createNode } from '../canvas.js';
@@ -5,8 +5,8 @@
5
5
  // node, so storage identity and attribution come from the canvas graph rather
6
6
  // than duplicated attribution fields in deck/review data.
7
7
  import { basename } from 'node:path';
8
- import { scanInbox } from '@crouton-kit/humanloop';
9
- import { nodesRoot } from './paths.js';
8
+ import { scanInbox } from '../human/scan.js';
9
+ import { filterTerminalReviewTickets } from '../review/ticket-filter.js';
10
10
  import { getNode, listNodes, view } from './canvas.js';
11
11
  function askingNodeId(ticketDir) {
12
12
  const bridge = getNode(basename(ticketDir));
@@ -38,14 +38,14 @@ function ticketCounts() {
38
38
  }
39
39
  const counts = new Map();
40
40
  try {
41
- for (const ticket of scanInbox([nodesRoot()])) {
41
+ for (const ticket of filterTerminalReviewTickets(scanInbox())) {
42
42
  const nodeId = askingNodeId(ticket.dir);
43
43
  if (nodeId !== null)
44
44
  counts.set(nodeId, (counts.get(nodeId) ?? 0) + 1);
45
45
  }
46
46
  }
47
47
  catch {
48
- // Humanloop unavailable or an absent root has no display consequence.
48
+ // An unavailable ticket store or absent root has no display consequence.
49
49
  }
50
50
  ticketCountCache = { at: Date.now(), counts };
51
51
  return counts;
@@ -295,10 +295,8 @@ export interface DeleteNodeResult {
295
295
  * GCs its edges) and remove its on-disk `nodes/<id>/` dir. The single-node
296
296
  * analogue of {@link pruneNodes}, for IMMEDIATE reaping — e.g. an empty node the
297
297
  * user closed or detached from. An open managed worktree is never deleted: its
298
- * node retains the ownership needed for `node worktree close`. Nor is a node
299
- * with a LIVE (`armed`/`pending`) follow-up human-work receipt — its report payload
300
- * is still needed for delivery (integrated-review Major-2). Pure persisted-
301
- * state removal: the caller MUST have already torn down the broker engine +
298
+ * node retains the ownership needed for `node worktree close`. Pure persisted-state
299
+ * removal: the caller MUST have already torn down the broker engine +
302
300
  * viewer (this does not signal any process). The node row and its FK-coupled
303
301
  * state are removed in one canvas write boundary. Best-effort dir removal
304
302
  * follows the commit. */
@@ -334,14 +332,11 @@ export declare function pruneNodes(opts: {
334
332
  *
335
333
  * Protected (never a prune candidate, regardless of recency rank): any
336
334
  * non-terminal node — status active|idle — REGARDLESS of `pi_pid` liveness,
337
- * a node with an open managed worktree, and a node with a LIVE
338
- * (`armed`/`pending`) follow-up human-work receipt. A crashed-but-non-terminal row
335
+ * or a node with an open managed worktree. A crashed-but-non-terminal row
339
336
  * (dead pid, status still active/idle) must survive for daemon crash-recovery
340
- * to resume, an open worktree must retain its node ownership until
341
- * `node worktree close`, and a live consult receipt's report payload is still
342
- * needed for delivery (integrated-review Major-2); none of the three is
343
- * eligible for count-based pruning. The caller ($CRTR_NODE_ID) is also always
344
- * protected.
337
+ * to resume, and an open worktree must retain its node ownership until
338
+ * `node worktree close`; neither is eligible for count-based pruning. The caller
339
+ * ($CRTR_NODE_ID) is also always protected.
345
340
  *
346
341
  * Algorithm: order ALL nodes by recency DESC (telemetry.json mtime, falling back
347
342
  * to `created`); `target = max(maxNodes, protectedCount)`; delete every node
@@ -22,8 +22,8 @@ import { ensureHome, ensureNodeDirs, nodeMetaPath, nodeDir, nodesRoot, jobDir, }
22
22
  * can ever leak onto disk even when a fully-hydrated NodeMeta is handed in. */
23
23
  const IDENTITY_KEYS = [
24
24
  'node_id', 'name', 'description', 'icon', 'cycles', 'created', 'cwd', 'host_kind', 'profile_id', 'kind', 'mode',
25
- 'lifecycle', 'persona_ack', 'parent', 'spawned_by', 'fork_from', 'human_work_target', 'private_fork_phase',
26
- 'private_fork_recipe', 'passive_default', 'pi_session_id', 'pi_session_file', 'cycle_pending', 'model_override',
25
+ 'lifecycle', 'persona_ack', 'parent', 'spawned_by', 'fork_from', 'review_binding', 'passive_default', 'pi_session_id',
26
+ 'pi_session_file', 'cycle_pending', 'model_override',
27
27
  'launch', 'managed_worktree',
28
28
  ];
29
29
  /** Project any node object down to its durable-identity subset. */
@@ -713,36 +713,17 @@ export function rebuildIndex() {
713
713
  function hasOpenManagedWorktree(nodeId) {
714
714
  return getNode(nodeId)?.managed_worktree?.state === 'open';
715
715
  }
716
- /** True when this node still carries a LIVE (`armed`/`pending`) follow-up human-work
717
- * receipt (design-followup-consult-v2.md §B.4; integrated-review Major-2).
718
- * An `armed` fork has not yet committed its final report; a `pending` fork
719
- * HAS committed it (promoted atomically inside `commitCanonicalFinal`'s own
720
- * transaction) but the receipt has not yet been acknowledged by
721
- * `submitFollowUpResult` — in both cases the node's on-disk report payload
722
- * (`reports/<final_report>` once pending) is still needed for delivery, so
723
- * neither status may ever be pruned/deleted out from under it. Queried via
724
- * raw SQL against the `consult_outbox` table directly (not the
725
- * `human-work-outbox.ts` peer module) to avoid a canvas.ts↔human-work-outbox.ts
726
- * import cycle — that module itself imports `getNode` from here. */
727
- function hasLiveFollowUpReceipt(nodeId) {
728
- const r = openDb()
729
- .prepare("SELECT 1 FROM consult_outbox WHERE node_id = ? AND work_kind = 'follow_up' AND status IN ('armed', 'pending') LIMIT 1")
730
- .get(nodeId);
731
- return r !== undefined;
732
- }
733
716
  /** Hard-delete ONE node: drop its row (the edges→nodes FK, ON DELETE CASCADE,
734
717
  * GCs its edges) and remove its on-disk `nodes/<id>/` dir. The single-node
735
718
  * analogue of {@link pruneNodes}, for IMMEDIATE reaping — e.g. an empty node the
736
719
  * user closed or detached from. An open managed worktree is never deleted: its
737
- * node retains the ownership needed for `node worktree close`. Nor is a node
738
- * with a LIVE (`armed`/`pending`) follow-up human-work receipt — its report payload
739
- * is still needed for delivery (integrated-review Major-2). Pure persisted-
740
- * state removal: the caller MUST have already torn down the broker engine +
720
+ * node retains the ownership needed for `node worktree close`. Pure persisted-state
721
+ * removal: the caller MUST have already torn down the broker engine +
741
722
  * viewer (this does not signal any process). The node row and its FK-coupled
742
723
  * state are removed in one canvas write boundary. Best-effort dir removal
743
724
  * follows the commit. */
744
725
  export function deleteNode(nodeId) {
745
- if (hasOpenManagedWorktree(nodeId) || hasLiveFollowUpReceipt(nodeId))
726
+ if (hasOpenManagedWorktree(nodeId))
746
727
  return { deleted: false };
747
728
  const result = withCanvasWrite((db) => {
748
729
  db.prepare('DELETE FROM nodes WHERE node_id = ?').run(nodeId);
@@ -802,7 +783,7 @@ export function pruneNodes(opts) {
802
783
  status: r['status'],
803
784
  created: r['created'],
804
785
  }));
805
- const candidates = [...terminal, ...stale].filter((node) => !hasOpenManagedWorktree(node.node_id) && !hasLiveFollowUpReceipt(node.node_id));
786
+ const candidates = [...terminal, ...stale].filter((node) => !hasOpenManagedWorktree(node.node_id));
806
787
  if (dryRun || candidates.length === 0)
807
788
  return { pruned: candidates, dryRun };
808
789
  deletePrunedNodes(candidates);
@@ -850,14 +831,11 @@ function recencyMs(nodeId, created) {
850
831
  *
851
832
  * Protected (never a prune candidate, regardless of recency rank): any
852
833
  * non-terminal node — status active|idle — REGARDLESS of `pi_pid` liveness,
853
- * a node with an open managed worktree, and a node with a LIVE
854
- * (`armed`/`pending`) follow-up human-work receipt. A crashed-but-non-terminal row
834
+ * or a node with an open managed worktree. A crashed-but-non-terminal row
855
835
  * (dead pid, status still active/idle) must survive for daemon crash-recovery
856
- * to resume, an open worktree must retain its node ownership until
857
- * `node worktree close`, and a live consult receipt's report payload is still
858
- * needed for delivery (integrated-review Major-2); none of the three is
859
- * eligible for count-based pruning. The caller ($CRTR_NODE_ID) is also always
860
- * protected.
836
+ * to resume, and an open worktree must retain its node ownership until
837
+ * `node worktree close`; neither is eligible for count-based pruning. The caller
838
+ * ($CRTR_NODE_ID) is also always protected.
861
839
  *
862
840
  * Algorithm: order ALL nodes by recency DESC (telemetry.json mtime, falling back
863
841
  * to `created`); `target = max(maxNodes, protectedCount)`; delete every node
@@ -882,7 +860,7 @@ export function pruneToLimit(opts) {
882
860
  status: r.status,
883
861
  created: r.created,
884
862
  recency: recencyMs(r.node_id, r.created),
885
- protected: r.status === 'active' || r.status === 'idle' || hasOpenManagedWorktree(r.node_id) || hasLiveFollowUpReceipt(r.node_id),
863
+ protected: r.status === 'active' || r.status === 'idle' || hasOpenManagedWorktree(r.node_id),
886
864
  }))
887
865
  .sort((a, b) => b.recency - a.recency);
888
866
  const protectedCount = ranked.filter((r) => r.protected).length;