@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
@@ -6,8 +6,8 @@
6
6
  // owns, so the db is authoritative for them.
7
7
  import { DatabaseSync } from 'node:sqlite';
8
8
  import { existsSync, readFileSync, readdirSync, appendFileSync } from 'node:fs';
9
- import { join } from 'node:path';
10
- import { canvasDbPath, ensureHome, nodesRoot, nodeMetaPath } from './paths.js';
9
+ import { basename, join, resolve } from 'node:path';
10
+ import { canvasDbPath, ensureHome, isSafeNodeId, nodesRoot, nodeMetaPath } from './paths.js';
11
11
  import { customExtensionPaths } from './extensions.js';
12
12
  import { updateJsonFileDurably } from './meta-file.js';
13
13
  // --- Schema as a forward-only migration list ------------------------------
@@ -448,46 +448,20 @@ function addMessageWaitGenerationColumn(db) {
448
448
  const columns = nodeColumns(db);
449
449
  addNodeColumnIfMissing(db, columns, 'waiting_for_generation', `ALTER TABLE nodes ADD COLUMN waiting_for_generation INTEGER NOT NULL DEFAULT 0;`);
450
450
  }
451
- /** v18 — the `consult_outbox` table: the receipted delivery record for a Lane B
452
- * follow-up consultation fork's answer (design-followup-consult-v2.md §B.4).
453
- * One row per consult fork (`node_id` PK). `status` walks armed → pending →
454
- * acked (happy path) or armed/pending → errored/canceled (failure/cancel
455
- * paths). `final_report` (the basename under the fork's `reports/`) is set
456
- * only when the row is promoted armed→pending inside the SAME SQLite
457
- * transaction that commits the fork's canonical final (`feed.ts
458
- * commitCanonicalFinal`) — that atomicity is the whole point of the outbox:
459
- * a crash between commit and dispatch still leaves a durable `pending` row
460
- * for follow-up reconciliation to redeliver. `dir`/`root`/`request_id` bind
461
- * the row back to the humanloop ticket + the exact follow-up request it
462
- * answers, so a stale/superseded fork's late delivery is a no-op at the
463
- * humanloop layer (compare-and-publish under `.followup-lock`), never here.
464
- *
465
- * NO foreign key on `node_id` (matches the authoritative design's schema
466
- * exactly — it declares no FK at all): unlike the retired `triggers`/`wakeups`
467
- * tables did, an
468
- * unsettled (`armed`/`pending`) receipt is the ONLY durable record that a
469
- * follow-up answer is still owed, and ordinary node pruning (`canvas.ts`
470
- * `pruneNodes`) deletes terminal node rows + their `reports/` dirs on a
471
- * routine schedule that has nothing to do with whether humanloop has
472
- * actually accepted the delivery. A `nodes` cascade would let a prune race
473
- * silently erase that receipt (and, once `final_report` is set, the report
474
- * file itself) before follow-up reconciliation/delivery ever
475
- * runs — the crash-safety net the whole table exists to provide. Only
476
- * `acked`/`errored`/`canceled` rows are truly done; those are reaped by the
477
- * outbox's own housekeeping, never by a `nodes` FK. Two composite indexes
478
- * back the request-bound and ticket-bound DAO reads a `_consult`/`_deliver`
479
- * caller needs (`getActiveFollowUpWorkByRequest`,
480
- * `listActiveFollowUpWorkByDir` in human-work-outbox.ts) without scanning
481
- * every row in the table. Additive, forward-only. */
451
+ /** v18 — create the historical `consult_outbox` table. The old schema stays
452
+ * replayable for existing databases until its later migration removes it.
453
+ * No current user-facing flow creates rows. Its remaining diagnostics and
454
+ * retention readers keep armed/pending legacy rows from losing their node
455
+ * before startup or crash reconciliation terminalizes those rows. */
482
456
  function addHumanWorkOutboxTable(db) {
483
457
  db.exec(`
484
458
  CREATE TABLE IF NOT EXISTS consult_outbox (
485
- node_id TEXT PRIMARY KEY, -- the consult fork's id
486
- dir TEXT NOT NULL, -- ticket dir
487
- root TEXT NOT NULL, -- registered root (for submitFollowUpResult auth)
488
- request_id TEXT NOT NULL, -- binds this fork to one follow-up request
459
+ node_id TEXT PRIMARY KEY, -- legacy work node id
460
+ dir TEXT NOT NULL, -- legacy ticket directory
461
+ root TEXT NOT NULL, -- legacy registered root
462
+ request_id TEXT NOT NULL, -- legacy request id
489
463
  status TEXT NOT NULL, -- armed | pending | acked | errored | canceled
490
- final_report TEXT, -- basename of reports/<...>-final.md, set on promote
464
+ final_report TEXT, -- legacy final report basename
491
465
  updated_at TEXT NOT NULL
492
466
  );
493
467
  CREATE INDEX IF NOT EXISTS idx_consult_outbox_status ON consult_outbox(status);
@@ -968,6 +942,196 @@ CREATE TABLE IF NOT EXISTS warm_pool (
968
942
  CREATE INDEX IF NOT EXISTS idx_warm_pool_recipe ON warm_pool(recipe_key, created);
969
943
  `);
970
944
  }
945
+ /** v26 — narrow `consult_outbox` for the humanloop absorption into
946
+ * `src/core/human/` (absorb-humanloop
947
+ * design, "The human-work receipt table"; Landing 2 Part E task E2). The
948
+ * five-column trust binding (`handler_command`, `handler_args_json`,
949
+ * `claim_token`, `generation_id`, `interaction_snapshot`) existed only to let
950
+ * crtrd re-verify that a Visual event arrived through crouter's own
951
+ * registered handler argv — that registry is deleted in this landing, so
952
+ * there is nothing left to bind. `dir`/`root` collapse into `ticket_node_id`,
953
+ * the bridge node id a ticket's directory is derived from at every call site
954
+ * (`ticketDir(nodeId)` in `src/core/human/root.ts`) — `basename(dir)` IS that
955
+ * node id today, already relied on as such at
956
+ * `src/daemon/api/handlers/human.ts:290` (`const jobId = basename(dir)`) and
957
+ * `src/core/canvas/attention.ts:21`.
958
+ *
959
+ * THIS IS A TABLE REBUILD, NOT `ALTER TABLE … DROP COLUMN`: six of the nine
960
+ * existing indexes are on `dir` (`idx_consult_outbox_dir`,
961
+ * `idx_consult_outbox_dir_request_status`, `idx_consult_outbox_dir_status`
962
+ * from v18; `idx_consult_outbox_human_work_dir_status`,
963
+ * `idx_consult_outbox_human_work_request_status`, and the partial-unique
964
+ * `idx_consult_outbox_visual_request` from v19), and SQLite refuses
965
+ * `DROP COLUMN` on any indexed column. `ticket_node_id` cannot be a SQL
966
+ * DEFAULT either — SQLite has no `basename()` — so it is computed per row in
967
+ * JS: read every existing row through a prepared SELECT, insert each into a
968
+ * freshly created `consult_outbox_new` with `ticket_node_id = basename(dir)`,
969
+ * drop the old table (dropping its indexes with it), rename the new table
970
+ * into place, and recreate exactly five indexes on the narrowed shape. Every
971
+ * row is carried, including terminal ones, EXCEPT a row whose legacy `dir` is
972
+ * not a canonical direct child of its recorded `root`, or whose basename is
973
+ * not a safe node id — either would create an unaddressable or aliased ticket
974
+ * id once `root` is discarded. A warning names how many are dropped.
975
+ *
976
+ * THERE IS NO ROLLBACK. A sealed older runtime generation still running
977
+ * against this canvas.db fails on the Visual lane (`INSERT INTO
978
+ * consult_outbox (… dir, root, handler_command …)`) once this has run —
979
+ * acceptable because this migration lands WITH a generation roll
980
+ * (`npm run build && npm run install-runtime && crtr sys daemon restart`),
981
+ * never alongside one. Not self-transactional: like every ordinary migration
982
+ * it runs inside `migrate()`'s per-step `BEGIN IMMEDIATE`, so an interrupted
983
+ * run leaves `consult_outbox` exactly as it was (SQLite DDL is transactional)
984
+ * and a re-open resumes cleanly at the same step. */
985
+ function narrowHumanWorkOutbox(db) {
986
+ const rows = db
987
+ .prepare('SELECT node_id, dir, root, request_id, work_kind, status, final_report, updated_at FROM consult_outbox')
988
+ .all();
989
+ db.exec(`
990
+ CREATE TABLE consult_outbox_new (
991
+ node_id TEXT PRIMARY KEY,
992
+ ticket_node_id TEXT NOT NULL,
993
+ request_id TEXT NOT NULL,
994
+ work_kind TEXT NOT NULL DEFAULT 'follow_up',
995
+ status TEXT NOT NULL,
996
+ final_report TEXT,
997
+ updated_at TEXT NOT NULL
998
+ );
999
+ `);
1000
+ const insert = db.prepare(`
1001
+ INSERT INTO consult_outbox_new (node_id, ticket_node_id, request_id, work_kind, status, final_report, updated_at)
1002
+ VALUES (?, ?, ?, ?, ?, ?, ?)`);
1003
+ let dropped = 0;
1004
+ for (const row of rows) {
1005
+ const ticketNodeId = basename(row.dir);
1006
+ const directChild = row.root === resolve(row.root) && row.dir === join(row.root, ticketNodeId);
1007
+ if (!directChild || !isSafeNodeId(ticketNodeId)) {
1008
+ dropped += 1;
1009
+ continue;
1010
+ }
1011
+ insert.run(row.node_id, ticketNodeId, row.request_id, row.work_kind, row.status, row.final_report, row.updated_at);
1012
+ }
1013
+ if (dropped > 0) {
1014
+ console.warn(`[canvas migration v26] dropped ${dropped} consult_outbox row(s) whose legacy ticket path cannot safely map to a ticket node id`);
1015
+ }
1016
+ db.exec(`
1017
+ DROP TABLE consult_outbox;
1018
+ ALTER TABLE consult_outbox_new RENAME TO consult_outbox;
1019
+
1020
+ CREATE INDEX IF NOT EXISTS idx_consult_outbox_status ON consult_outbox(status);
1021
+ CREATE INDEX IF NOT EXISTS idx_consult_outbox_human_work_status ON consult_outbox(work_kind, status);
1022
+ CREATE INDEX IF NOT EXISTS idx_consult_outbox_ticket_status ON consult_outbox(ticket_node_id, work_kind, status);
1023
+ CREATE INDEX IF NOT EXISTS idx_consult_outbox_ticket_request_status ON consult_outbox(ticket_node_id, request_id, work_kind, status);
1024
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_consult_outbox_visual_request ON consult_outbox(ticket_node_id, request_id, work_kind) WHERE work_kind = 'visual';
1025
+ `);
1026
+ }
1027
+ /** v27 — the canonical daemon-owned review record. */
1028
+ function addReviewsTable(db) {
1029
+ db.exec(`
1030
+ CREATE TABLE IF NOT EXISTS reviews (
1031
+ review_id TEXT PRIMARY KEY,
1032
+ idempotency_key TEXT NOT NULL UNIQUE,
1033
+ origin_kind TEXT NOT NULL CHECK (origin_kind IN ('ticket', 'inline')),
1034
+ origin_node_id TEXT NOT NULL,
1035
+ bridge_node_id TEXT,
1036
+ companion_node_id TEXT NOT NULL UNIQUE,
1037
+ review_dir TEXT NOT NULL,
1038
+ file TEXT NOT NULL,
1039
+ origin_session_file TEXT NOT NULL,
1040
+ origin_session_id TEXT NOT NULL,
1041
+ origin_leaf_id TEXT NOT NULL,
1042
+ model_spec TEXT NOT NULL,
1043
+ branch_file TEXT NOT NULL,
1044
+ baseline_sha256 TEXT NOT NULL,
1045
+ baseline_bytes INTEGER NOT NULL,
1046
+ anchor_base_sha256 TEXT NOT NULL,
1047
+ anchor_base_bytes BLOB NOT NULL,
1048
+ state TEXT NOT NULL CHECK (state IN ('binding', 'open', 'approved', 'canceled')),
1049
+ created TEXT NOT NULL,
1050
+ captured_at TEXT NOT NULL,
1051
+ opened_at TEXT,
1052
+ output_path TEXT,
1053
+ subtitle TEXT,
1054
+ approved_at TEXT,
1055
+ approved_sha256 TEXT,
1056
+ changed INTEGER,
1057
+ comments_total INTEGER,
1058
+ comments_unresolved INTEGER,
1059
+ result_json TEXT,
1060
+ canceled_at TEXT,
1061
+ cancel_reason TEXT,
1062
+ cancel_actor TEXT,
1063
+ delivery_entry_id TEXT,
1064
+ delivered_at TEXT,
1065
+ delivery_error TEXT,
1066
+ projected_at TEXT,
1067
+ projection_error TEXT
1068
+ );
1069
+ CREATE INDEX IF NOT EXISTS idx_reviews_state ON reviews(state);
1070
+ CREATE INDEX IF NOT EXISTS idx_reviews_origin ON reviews(origin_node_id);
1071
+ CREATE INDEX IF NOT EXISTS idx_reviews_file ON reviews(file);
1072
+ CREATE INDEX IF NOT EXISTS idx_reviews_bridge ON reviews(bridge_node_id);
1073
+ `);
1074
+ }
1075
+ /** v28 — current review-comment projection and append-only comment audit. */
1076
+ function addReviewCommentTables(db) {
1077
+ db.exec(`
1078
+ CREATE TABLE IF NOT EXISTS review_comments (
1079
+ comment_id TEXT PRIMARY KEY,
1080
+ review_id TEXT NOT NULL,
1081
+ status TEXT NOT NULL CHECK (status IN ('open', 'resolved', 'deleted')),
1082
+ revision INTEGER NOT NULL,
1083
+ text TEXT NOT NULL,
1084
+ anchor_line INTEGER NOT NULL,
1085
+ anchor_end_line INTEGER NOT NULL,
1086
+ anchor_col_start INTEGER,
1087
+ anchor_col_end INTEGER,
1088
+ anchor_quote TEXT,
1089
+ anchor_line_text TEXT NOT NULL,
1090
+ anchor_doc_hash TEXT NOT NULL,
1091
+ author_kind TEXT NOT NULL CHECK (author_kind IN ('human', 'node')),
1092
+ author_node_id TEXT,
1093
+ updated_by_kind TEXT NOT NULL CHECK (updated_by_kind IN ('human', 'node')),
1094
+ updated_by_node_id TEXT,
1095
+ created_at TEXT NOT NULL,
1096
+ updated_at TEXT NOT NULL,
1097
+ resolved_at TEXT,
1098
+ deleted_at TEXT,
1099
+ created_seq INTEGER NOT NULL
1100
+ );
1101
+ CREATE TABLE IF NOT EXISTS review_comment_events (
1102
+ seq INTEGER PRIMARY KEY AUTOINCREMENT,
1103
+ review_id TEXT NOT NULL,
1104
+ comment_id TEXT NOT NULL,
1105
+ kind TEXT NOT NULL CHECK (kind IN ('created', 'edited', 'resolved', 'reopened', 'deleted', 'reanchored', 'notified', 'notify_failed')),
1106
+ state_change INTEGER NOT NULL,
1107
+ revision_after INTEGER,
1108
+ actor_kind TEXT NOT NULL CHECK (actor_kind IN ('human', 'node', 'system')),
1109
+ actor_node_id TEXT,
1110
+ at TEXT NOT NULL,
1111
+ operation_id TEXT NOT NULL,
1112
+ payload TEXT
1113
+ );
1114
+ CREATE INDEX IF NOT EXISTS idx_review_comments_review_line_seq
1115
+ ON review_comments(review_id, anchor_line, created_seq);
1116
+ CREATE INDEX IF NOT EXISTS idx_review_comments_review_status
1117
+ ON review_comments(review_id, status);
1118
+ CREATE INDEX IF NOT EXISTS idx_review_comment_events_review_seq
1119
+ ON review_comment_events(review_id, seq);
1120
+ CREATE INDEX IF NOT EXISTS idx_review_comment_events_comment_seq
1121
+ ON review_comment_events(comment_id, seq);
1122
+ `);
1123
+ }
1124
+ /** v29 — durable review-comment anchor disposition. v28 is already released, so this corrects both fresh and migrated databases without rewriting its historical schema. */
1125
+ function addReviewCommentAnchorState(db) {
1126
+ db.exec(`
1127
+ ALTER TABLE review_comments
1128
+ ADD COLUMN anchor_state TEXT NOT NULL DEFAULT 'live' CHECK (anchor_state IN ('live', 'detached'));
1129
+ `);
1130
+ }
1131
+ /** v30 — remove the retired human-work receipt table after every runtime reader is gone. */
1132
+ function dropConsultOutbox(db) {
1133
+ db.exec('DROP TABLE IF EXISTS consult_outbox');
1134
+ }
971
1135
  /** The ordered migration list. Index `i` is migration version `i + 1`; the db's
972
1136
  * `user_version` tracks how many have been applied. Append only. */
973
1137
  export const MIGRATIONS = [
@@ -998,6 +1162,11 @@ export const MIGRATIONS = [
998
1162
  /* v23 */ addCronRunPidIdentityColumn,
999
1163
  /* v24 */ addCronOutOfBandColumn,
1000
1164
  /* v25 */ addWarmPoolTable,
1165
+ /* v26 */ narrowHumanWorkOutbox,
1166
+ /* v27 */ addReviewsTable,
1167
+ /* v28 */ addReviewCommentTables,
1168
+ /* v29 */ addReviewCommentAnchorState,
1169
+ /* v30 */ dropConsultOutbox,
1001
1170
  ];
1002
1171
  /** Migration indexes that manage their OWN transaction and therefore must not
1003
1172
  * be wrapped by `migrate()` — `node:sqlite` rejects a nested BEGIN. Index 3
@@ -1,4 +1,4 @@
1
- export declare const CANVAS_EXTENSION_NAMES: readonly ["canvas-inbox-watcher", "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"];
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
2
  /** Remove a complete persisted canvas prefix while retaining every genuine
3
3
  * caller/kind extra, including a custom extension whose basename happens to
4
4
  * resemble a canvas hook. */
@@ -3,12 +3,19 @@
3
3
  // canvas-inbox-watcher must load before canvas-stophook: at agent_settled it
4
4
  // commits the cursor the stophook then reads to decide idle release.
5
5
  export const CANVAS_EXTENSION_NAMES = [
6
- 'canvas-inbox-watcher', 'canvas-stophook', 'canvas-recap',
6
+ 'canvas-inbox-watcher', 'canvas-review-boundary', 'canvas-stophook', 'canvas-recap',
7
7
  'canvas-goal-capture', 'canvas-passive-context', 'canvas-context-intro',
8
8
  'canvas-tool-guide', 'canvas-doc-substrate', 'canvas-structured-output',
9
9
  'canvas-bash-valve',
10
10
  ];
11
11
  const HISTORICAL_CANVAS_EXTENSION_PREFIXES = [
12
+ [
13
+ 'canvas-inbox-watcher', 'canvas-stophook', 'canvas-recap',
14
+ 'canvas-goal-capture', 'canvas-passive-context', 'canvas-review-boundary',
15
+ 'canvas-context-intro',
16
+ 'canvas-tool-guide', 'canvas-doc-substrate', 'canvas-structured-output',
17
+ 'canvas-bash-valve',
18
+ ],
12
19
  [
13
20
  'canvas-inbox-watcher', 'canvas-stophook', 'canvas-recap',
14
21
  'canvas-goal-capture', 'canvas-passive-context', 'canvas-context-intro',
@@ -6,6 +6,5 @@ export * from './source.js';
6
6
  export * from './history.js';
7
7
  export * from './focuses.js';
8
8
  export * from './crons.js';
9
- export * from './human-work-outbox.js';
10
9
  export * from './telemetry.js';
11
10
  export { openDb, closeDb } from './db.js';
@@ -8,6 +8,5 @@ export * from './source.js';
8
8
  export * from './history.js';
9
9
  export * from './focuses.js';
10
10
  export * from './crons.js';
11
- export * from './human-work-outbox.js';
12
11
  export * from './telemetry.js';
13
12
  export { openDb, closeDb } from './db.js';
@@ -10,7 +10,7 @@ export declare function cSubscriptions(id: string): SubscriptionRef[];
10
10
  export declare function cSubscribers(id: string): SubscriptionRef[];
11
11
  /** First manager (by created) — the UP step for the ancestry spine. */
12
12
  export declare function managerOf(id: string): string | undefined;
13
- /** A kind:'human' node is a control-plane ASK (a humanloop deck on the human's
13
+ /** A kind:'human' node is a control-plane ASK (a deck on the human's
14
14
  * screen), NOT a pi conversation — it has no session, so focusing/reviving it
15
15
  * boots a confused blank "you have been revived" pi. Its pending-ask signal
16
16
  * already rides the ⚑ badge on the ASKING node (attention.ts follows the
@@ -101,7 +101,7 @@ export function cSubscribers(id) {
101
101
  export function managerOf(id) {
102
102
  return cSubscribers(id)[0]?.node_id;
103
103
  }
104
- /** A kind:'human' node is a control-plane ASK (a humanloop deck on the human's
104
+ /** A kind:'human' node is a control-plane ASK (a deck on the human's
105
105
  * screen), NOT a pi conversation — it has no session, so focusing/reviving it
106
106
  * boots a confused blank "you have been revived" pi. Its pending-ask signal
107
107
  * already rides the ⚑ badge on the ASKING node (attention.ts follows the
@@ -16,6 +16,11 @@ export declare function canvasDbPath(): string;
16
16
  * it binds. */
17
17
  export declare function viewSocketPath(nodeId: string): string;
18
18
  export declare function nodesRoot(): string;
19
+ export declare function reviewsRoot(): string;
20
+ export declare function reviewDir(reviewId: string): string;
21
+ export declare function reviewBranchPath(reviewId: string): string;
22
+ export declare function reviewResultPath(reviewId: string): string;
23
+ export declare function ensureReviewDir(reviewId: string): void;
19
24
  /** Absolute path to crtrd's API listener unix socket, a sibling of
20
25
  * `canvasDbPath()` under the canvas home (`~/.crouter/canvas/crtrd.sock` unless
21
26
  * `CRTR_HOME` is set). Pure path builder — no db reach — so both the daemon
@@ -47,6 +47,22 @@ export function viewSocketPath(nodeId) {
47
47
  export function nodesRoot() {
48
48
  return join(crtrHome(), 'nodes');
49
49
  }
50
+ export function reviewsRoot() {
51
+ return join(crtrHome(), 'reviews');
52
+ }
53
+ export function reviewDir(reviewId) {
54
+ assertSafeNodeId(reviewId);
55
+ return join(reviewsRoot(), reviewId);
56
+ }
57
+ export function reviewBranchPath(reviewId) {
58
+ return join(reviewDir(reviewId), 'branch-point.jsonl');
59
+ }
60
+ export function reviewResultPath(reviewId) {
61
+ return join(reviewDir(reviewId), 'result.json');
62
+ }
63
+ export function ensureReviewDir(reviewId) {
64
+ mkdirSync(reviewDir(reviewId), { recursive: true, mode: 0o700 });
65
+ }
50
66
  /** Absolute path to crtrd's API listener unix socket, a sibling of
51
67
  * `canvasDbPath()` under the canvas home (`~/.crouter/canvas/crtrd.sock` unless
52
68
  * `CRTR_HOME` is set). Pure path builder — no db reach — so both the daemon
@@ -1,5 +1,5 @@
1
1
  // remote-canvas-source.ts — a CanvasSource backed by a remote canvas over the
2
- // relay-token-authed `/__crtr/source` transport (see `transport-remote.ts`).
2
+ // relay-token-authed `/__crtr/source` transport (see `remote-transport.ts`).
3
3
  // Every method shells out to an EXISTING `crtr --json <subcommand>` in-guest —
4
4
  // no new in-guest command, no remote SQLite read, no drive-plane verb. A
5
5
  // short-TTL cache coalesces the fan-out a single browse/inspect frame would
@@ -10,7 +10,7 @@
10
10
  // crtrd `/v1` API. Repointing remote canvases at a crtrd proxy shell is a P2
11
11
  // item; until then this subsystem is a settled, intentional exception to the
12
12
  // "every process is a /v1 client" architecture (which governs LOCAL access).
13
- import { createRemoteExec } from '../view/transport-remote.js';
13
+ import { createRemoteExec } from './remote-transport.js';
14
14
  const CACHE_TTL_MS = 1000;
15
15
  // ---------------------------------------------------------------------------
16
16
  // Remote JSON shape validation.
@@ -0,0 +1,7 @@
1
+ export interface RemoteExecResponse {
2
+ ok: boolean;
3
+ exitCode?: number;
4
+ stdout: string;
5
+ stderr: string;
6
+ }
7
+ export declare function createRemoteExec(previewEndpoint: string, relayToken: string, timeoutMs?: number): (bin: string, args: string[]) => Promise<RemoteExecResponse>;
@@ -1,7 +1,6 @@
1
- // transport-remote.ts — the Node-side remote exec transport for a
2
- // RemoteCanvasSource. POSTs a SourceRequest to a Blaxel preview endpoint's
3
- // `/__crtr/source` route (the SAME in-guest source-fulfillment endpoint the
4
- // browser/web transport already speaks), bearer-authed with the relay token.
1
+ // remote-transport.ts — the Node-side remote exec transport for a
2
+ // RemoteCanvasSource. POSTs an exec request to a Blaxel preview endpoint's
3
+ // `/__crtr/source` route, bearer-authed with the relay token.
5
4
  //
6
5
  // This is the ONLY way RemoteCanvasSource reaches the remote canvas: it never
7
6
  // reads a remote SQLite file, and it never invokes an in-guest command that
@@ -1,7 +1,7 @@
1
1
  import { getNode, getRow, listNodes, subscriptionsOf, subscribersOf, view, hasActiveLiveSubscription, } from './canvas.js';
2
2
  import { ticketCountsForNodes } from './attention.js';
3
3
  import { readState } from '../config.js';
4
- import { resolveRemoteCanvasTarget } from '../view/remote-canvas-target.js';
4
+ import { resolveRemoteCanvasTarget } from '../remote-canvas-target.js';
5
5
  import { RemoteCanvasSource } from './remote-canvas-source.js';
6
6
  export class LocalCanvasSource {
7
7
  async getNode(nodeId) {
@@ -1,14 +1,6 @@
1
- // status-glyph.ts — the canonical status→glyph/color map + overlay resolution
2
- // for the TS canvas-GRAPH surfaces (the ASCII forest `render.ts` and the
3
- // interactive `browse/render.ts`). It replaces the copy-pasted STATUS_GLYPH /
4
- // STATUS_COLOR literals those two files used to carry.
5
- //
6
- // SCOPE: only the surfaces the hanging-node feature touches. The workspace rail,
7
- // feed/push roster, and attach chat-view keep their own glyph copies (out of
8
- // scope). The portable `.mjs` canvas monitor view CANNOT import this (TS dist) —
9
- // it carries its own mirrored map with a pointer back to fault.ts.
10
- //
11
- // OVERLAY PRECEDENCE: hanging > streaming > status. `hanging` and `streaming` are
1
+ // status-glyph.ts — the canonical status glyph and color map used by the canvas
2
+ // ASCII forest and interactive browser. The overlay precedence is
3
+ // hanging > streaming > status. `hanging` and `streaming` are
12
4
  // mutually exclusive in practice (hanging means the turn ended, so `busy` is
13
5
  // gone) but the precedence is defined regardless.
14
6
  import { FAULT_QUIET_MS } from '../runtime/fault.js';
@@ -20,7 +12,7 @@ export const STATUS_GLYPH = {
20
12
  dead: '✗',
21
13
  canceled: '⊘',
22
14
  };
23
- // ── Status hue: numeric SGR codes per status (lifted from browse/render.ts). ───
15
+ // ── Status hue: numeric SGR codes per status. ─────────────────────────────────
24
16
  // Reinforces the glyph; the glyph SHAPE stays the NO_COLOR carrier.
25
17
  export const STATUS_COLOR = {
26
18
  active: 32, // green
@@ -56,30 +56,14 @@ export interface ManagedWorktree {
56
56
  created: string;
57
57
  closed?: string;
58
58
  }
59
- /** The private human task a lifecycle-owned fork answers. The discriminator is
60
- * deliberately closed over the two supported lanes; adding another private
61
- * worker kind requires an explicit contract rather than an untyped target. */
62
- export type HumanWorkTarget = {
63
- work_kind: 'follow_up';
64
- dir: string;
65
- request_id: string;
66
- root: string;
67
- } | {
68
- work_kind: 'visual';
69
- dir: string;
70
- request_id: string;
71
- root: string;
72
- };
73
- /** Whether a private human-work fork still needs its first writable Pi session
74
- * created from immutable provenance, or has bound that child session and can
75
- * only resume it. */
76
- export type PrivateForkPhase = 'fork_pending' | 'session_started';
77
- /** The one-shot portion of a private fork's persisted launch recipe. The other
78
- * immutable recipe facts stay in their existing canonical fields:
79
- * `NodeIdentity.fork_from` is the absolute provenance file and
80
- * `LaunchSpec.model` with `modelExact` is the exact runtime selection. */
81
- export interface PrivateForkRecipe {
82
- kickoff: string;
59
+ /** Immutable review-companion provenance. The origin session/leaf/model
60
+ * coordinates remain canonical in the review row rather than being duplicated
61
+ * into node metadata. */
62
+ export interface ReviewBinding {
63
+ review_id: string;
64
+ origin_node_id: string;
65
+ branch_file: string;
66
+ target_file: string;
83
67
  }
84
68
  /** A node's DURABLE IDENTITY — the subset that `meta.json` persists on disk.
85
69
  * Written rarely (birth, polymorph, session-id capture, naming); never touched
@@ -147,17 +131,8 @@ export interface NodeIdentity {
147
131
  * (without it a fork impersonates its source). Undefined for a fresh node;
148
132
  * identity/audit only. */
149
133
  fork_from?: string | null;
150
- /** Immutable private-human-work binding. Delivery remains owned by the
151
- * corresponding outbox protocol; this target identifies what the private
152
- * lifecycle child exists to answer. Undefined for ordinary nodes. */
153
- human_work_target?: HumanWorkTarget | null;
154
- /** Private fork birth is explicit across the pre-session crash boundary.
155
- * `fork_pending` launches only from the immutable provenance + kickoff;
156
- * `session_started` launches only from the bound child session. */
157
- private_fork_phase?: PrivateForkPhase | null;
158
- /** Persisted one-shot kickoff for `fork_pending`; ignored after the child
159
- * session is bound. See `PrivateForkRecipe` for the rest of the recipe. */
160
- private_fork_recipe?: PrivateForkRecipe | null;
134
+ /** Immutable review-companion binding. Undefined for ordinary nodes. */
135
+ review_binding?: ReviewBinding | null;
161
136
  /** New subscriptions this node opens default to passive when true. */
162
137
  passive_default?: boolean;
163
138
  /** The pi session id for `--session <id>` revival. */
@@ -1,3 +1,11 @@
1
1
  /** Write `text` to the system clipboard. Returns true on success, false when no
2
2
  * clipboard tool is available or every attempt failed. Never throws. */
3
3
  export declare function writeClipboardText(text: string): boolean;
4
+ /** Write `text` to the system clipboard AND, inside tmux, to the tmux paste
5
+ * buffer via `tmux load-buffer -w -` (which makes tmux emit OSC 52 outward on
6
+ * the app's behalf). Never emits OSC 52 from this process. Never throws.
7
+ * Returns which operations succeeded. */
8
+ export declare function writeClipboardTextEverywhere(text: string): {
9
+ system: boolean;
10
+ tmux: boolean;
11
+ };
@@ -37,3 +37,21 @@ export function writeClipboardText(text) {
37
37
  }
38
38
  return false;
39
39
  }
40
+ /** Write `text` to the system clipboard AND, inside tmux, to the tmux paste
41
+ * buffer via `tmux load-buffer -w -` (which makes tmux emit OSC 52 outward on
42
+ * the app's behalf). Never emits OSC 52 from this process. Never throws.
43
+ * Returns which operations succeeded. */
44
+ export function writeClipboardTextEverywhere(text) {
45
+ const system = writeClipboardText(text);
46
+ let tmux = false;
47
+ if (process.env.TMUX !== undefined) {
48
+ const result = spawnSync('tmux', ['load-buffer', '-w', '-'], {
49
+ input: text,
50
+ timeout: SPAWN_TIMEOUT_MS,
51
+ encoding: 'utf-8',
52
+ });
53
+ // Success if no error and exit status 0.
54
+ tmux = !result.error && result.status === 0;
55
+ }
56
+ return { system, tmux };
57
+ }
@@ -25,9 +25,7 @@ export interface ContributorIssue extends CommandManifestIssue {
25
25
  contributor: CommandContributorRef;
26
26
  }
27
27
  /** Invocation-local registry snapshot after collision resolution: the accepted
28
- * contributions and every discovered issue. The amended spec has no freshness
29
- * machinery, so there is no owner-routing map — an unknown-token miss hydrates
30
- * ALL absent-store registrations once (§5.1), never a single known owner. */
28
+ * contributions and every discovered issue. */
31
29
  export interface CommandRegistrySnapshot {
32
30
  /** Accepted top-level contributions, deterministically ordered by
33
31
  * contributor name. */
@@ -0,0 +1,29 @@
1
+ import { type ValidatedCommandManifest } from '../command-manifests/manifest.js';
2
+ export interface BundleIssue {
3
+ code: string;
4
+ path?: string;
5
+ message: string;
6
+ received: string;
7
+ expected: string;
8
+ next: string;
9
+ }
10
+ export interface ValidatedBundle {
11
+ bundleVersion: 1;
12
+ commands: ValidatedCommandManifest;
13
+ commandsBytes: Uint8Array;
14
+ directories: ReadonlyArray<{
15
+ path: string;
16
+ }>;
17
+ memory: ReadonlyArray<{
18
+ path: string;
19
+ bytes: Uint8Array;
20
+ }>;
21
+ }
22
+ export interface PluginBundleValidation {
23
+ bundle?: ValidatedBundle;
24
+ issues: BundleIssue[];
25
+ }
26
+ /** Validate a Core-served plugin directory archive entirely in memory. */
27
+ export declare function validatePluginBundle(archive: Uint8Array, options: {
28
+ reservedCoreNames: ReadonlySet<string>;
29
+ }): Promise<PluginBundleValidation>;