@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
@@ -1,261 +0,0 @@
1
- // human-work-outbox.ts — the CONSULT_OUTBOX storage ABI's data-access layer.
2
- //
3
- // `consult_outbox` remains the physical table name so live older runtimes keep
4
- // their storage contract. Code calls the generalized record human work:
5
- // follow-up work retains its original armed/pending receipting lifecycle, while
6
- // Visual work reserves its own namespaced statuses and immutable bindings.
7
- import { readFileSync } from 'node:fs';
8
- import { basename, join } from 'node:path';
9
- import { submitFollowUpResult, submitVisualResult } from '@crouton-kit/humanloop';
10
- import { openDb } from './db.js';
11
- import { getNode } from './canvas.js';
12
- import { reportsDir } from './paths.js';
13
- function rowFrom(r) {
14
- return {
15
- node_id: r['node_id'],
16
- dir: r['dir'],
17
- root: r['root'],
18
- request_id: r['request_id'],
19
- work_kind: r['work_kind'],
20
- status: r['status'],
21
- final_report: r['final_report'] ?? null,
22
- interaction_id: r['interaction_id'] ?? null,
23
- generation_id: r['generation_id'] ?? null,
24
- interaction_snapshot: r['interaction_snapshot'] ?? null,
25
- handler_command: r['handler_command'] ?? null,
26
- handler_args_json: r['handler_args_json'] ?? null,
27
- claim_token: r['claim_token'] ?? null,
28
- updated_at: r['updated_at'],
29
- };
30
- }
31
- function nowIso() {
32
- return new Date().toISOString();
33
- }
34
- /** Insert a follow-up receipt before its fork launches. `work_kind` is explicit
35
- * even though the migration default preserves old inserts, so new code never
36
- * depends on a compatibility default. */
37
- export function armFollowUpWork(opts) {
38
- openDb()
39
- .prepare("INSERT INTO consult_outbox (node_id, dir, root, request_id, work_kind, status, final_report, updated_at) VALUES (?, ?, ?, ?, 'follow_up', 'armed', NULL, ?)")
40
- .run(opts.nodeId, opts.dir, opts.root, opts.requestId, nowIso());
41
- }
42
- /** Promote only follow-up work inside the canonical-final transaction. */
43
- export function promoteFollowUpWork(nodeId, finalReportBasename) {
44
- const result = openDb()
45
- .prepare("UPDATE consult_outbox SET status = 'pending', final_report = ?, updated_at = ? WHERE node_id = ? AND work_kind = 'follow_up' AND status = 'armed'")
46
- .run(finalReportBasename, nowIso(), nodeId);
47
- return result.changes > 0;
48
- }
49
- export function ackFollowUpWork(nodeId) {
50
- openDb().prepare("UPDATE consult_outbox SET status = 'acked', updated_at = ? WHERE node_id = ? AND work_kind = 'follow_up'").run(nowIso(), nodeId);
51
- }
52
- export function errorFollowUpWork(nodeId) {
53
- openDb().prepare("UPDATE consult_outbox SET status = 'errored', updated_at = ? WHERE node_id = ? AND work_kind = 'follow_up'").run(nowIso(), nodeId);
54
- }
55
- export function cancelFollowUpWork(nodeId) {
56
- openDb().prepare("UPDATE consult_outbox SET status = 'canceled', updated_at = ? WHERE node_id = ? AND work_kind = 'follow_up'").run(nowIso(), nodeId);
57
- }
58
- /** Create or return the one immutable Visual claim for a request. A conflicting
59
- * duplicate fails closed; a byte-identical duplicate reuses its original row. */
60
- export function claimVisualWork(binding) {
61
- const db = openDb();
62
- const handlerArgsJson = JSON.stringify(binding.handlerArgs);
63
- db.exec('BEGIN IMMEDIATE');
64
- try {
65
- const existing = db
66
- .prepare("SELECT * FROM consult_outbox WHERE dir = ? AND request_id = ? AND work_kind = 'visual'")
67
- .get(binding.dir, binding.requestId);
68
- if (existing !== undefined) {
69
- const row = rowFrom(existing);
70
- const exact = row.root === binding.root
71
- && row.interaction_id === binding.interactionId
72
- && row.generation_id === binding.generationId
73
- && row.interaction_snapshot === binding.interactionSnapshot
74
- && row.handler_command === binding.handlerCommand
75
- && row.handler_args_json === handlerArgsJson
76
- && row.claim_token === binding.claimToken;
77
- if (!exact)
78
- throw new Error(`conflicting Visual work claim for ${binding.dir}/${binding.requestId}`);
79
- db.exec('COMMIT');
80
- return { row, created: false };
81
- }
82
- db.prepare("INSERT INTO consult_outbox (node_id, dir, root, request_id, work_kind, status, final_report, interaction_id, generation_id, interaction_snapshot, handler_command, handler_args_json, claim_token, updated_at) VALUES (?, ?, ?, ?, 'visual', 'visual_armed', NULL, ?, ?, ?, ?, ?, ?, ?)").run(binding.nodeId, binding.dir, binding.root, binding.requestId, binding.interactionId, binding.generationId, binding.interactionSnapshot, binding.handlerCommand, handlerArgsJson, binding.claimToken, nowIso());
83
- const row = getHumanWorkRow(binding.nodeId);
84
- if (row === null)
85
- throw new Error(`Visual work claim disappeared for ${binding.nodeId}`);
86
- db.exec('COMMIT');
87
- return { row, created: true };
88
- }
89
- catch (error) {
90
- db.exec('ROLLBACK');
91
- throw error;
92
- }
93
- }
94
- /** The future Visual finalizer may promote only its exact armed claim. */
95
- export function promoteVisualWork(nodeId, finalReportBasename) {
96
- const result = openDb()
97
- .prepare("UPDATE consult_outbox SET status = 'visual_pending', final_report = ?, updated_at = ? WHERE node_id = ? AND work_kind = 'visual' AND status = 'visual_armed'")
98
- .run(finalReportBasename, nowIso(), nodeId);
99
- return result.changes > 0;
100
- }
101
- /** Retire only an exact Visual request binding; cancellation never creates work. */
102
- export function retireVisualWork(dir, requestId) {
103
- const result = openDb()
104
- .prepare("UPDATE consult_outbox SET status = 'visual_retired', updated_at = ? WHERE dir = ? AND request_id = ? AND work_kind = 'visual' AND status IN ('visual_armed', 'visual_pending')")
105
- .run(nowIso(), dir, requestId);
106
- return result.changes > 0;
107
- }
108
- export function getHumanWorkRow(nodeId) {
109
- const r = openDb().prepare('SELECT * FROM consult_outbox WHERE node_id = ?').get(nodeId);
110
- return r ? rowFrom(r) : null;
111
- }
112
- export function getFollowUpWorkRow(nodeId) {
113
- const r = openDb()
114
- .prepare("SELECT * FROM consult_outbox WHERE node_id = ? AND work_kind = 'follow_up'")
115
- .get(nodeId);
116
- return r ? rowFrom(r) : null;
117
- }
118
- export function listActiveVisualWorkByDir(dir) {
119
- return openDb().prepare("SELECT * FROM consult_outbox WHERE dir = ? AND work_kind = 'visual' AND status IN ('visual_armed', 'visual_pending')").all(dir).map(rowFrom);
120
- }
121
- export function getVisualWorkByRequest(dir, requestId) {
122
- const r = openDb()
123
- .prepare("SELECT * FROM consult_outbox WHERE dir = ? AND request_id = ? AND work_kind = 'visual'")
124
- .get(dir, requestId);
125
- return r ? rowFrom(r) : null;
126
- }
127
- export function listPendingFollowUpWork() {
128
- return openDb().prepare("SELECT * FROM consult_outbox WHERE work_kind = 'follow_up' AND status = 'pending'").all().map(rowFrom);
129
- }
130
- export function listArmedFollowUpWork() {
131
- return openDb().prepare("SELECT * FROM consult_outbox WHERE work_kind = 'follow_up' AND status = 'armed'").all().map(rowFrom);
132
- }
133
- export function getActiveFollowUpWorkByRequest(dir, requestId) {
134
- const r = openDb()
135
- .prepare("SELECT * FROM consult_outbox WHERE dir = ? AND request_id = ? AND work_kind = 'follow_up' AND status IN ('armed', 'pending') LIMIT 1")
136
- .get(dir, requestId);
137
- return r ? rowFrom(r) : null;
138
- }
139
- export function listActiveFollowUpWorkByDir(dir) {
140
- return openDb().prepare("SELECT * FROM consult_outbox WHERE dir = ? AND work_kind = 'follow_up' AND status IN ('armed', 'pending')").all(dir).map(rowFrom);
141
- }
142
- function stripReportFrontmatter(raw) {
143
- const match = /^---\nnode: [^\n]*\nkind: [^\n]*\nts: [^\n]*\n---\n/.exec(raw);
144
- return match ? raw.slice(match[0].length) : raw;
145
- }
146
- /** Deliver one pending follow-up receipt. */
147
- export function dispatchFollowUpWork(nodeId) {
148
- const row = getHumanWorkRow(nodeId);
149
- if (row === null || row.work_kind !== 'follow_up' || row.status !== 'pending')
150
- return;
151
- let markdown = null;
152
- let readError = null;
153
- if (row.final_report === null) {
154
- readError = 'consultation produced no final report';
155
- }
156
- else {
157
- try {
158
- markdown = stripReportFrontmatter(readFileSync(join(reportsDir(nodeId), row.final_report), 'utf8'));
159
- }
160
- catch (err) {
161
- readError = err.message;
162
- }
163
- }
164
- try {
165
- if (markdown !== null)
166
- submitFollowUpResult(row.root, row.dir, { requestId: row.request_id, status: 'ready', markdown });
167
- else
168
- submitFollowUpResult(row.root, row.dir, { requestId: row.request_id, status: 'error', error: readError ?? 'consultation failed' });
169
- }
170
- catch {
171
- return;
172
- }
173
- ackFollowUpWork(nodeId);
174
- }
175
- function visualSubmission(row, outcome) {
176
- if (row.interaction_id === null || row.generation_id === null || row.interaction_snapshot === null || row.claim_token === null)
177
- throw new Error('Visual work row lacks immutable correlation');
178
- const interaction = JSON.parse(row.interaction_snapshot);
179
- submitVisualResult(row.root, row.dir, {
180
- requestId: row.request_id,
181
- generationId: row.generation_id,
182
- interactionId: row.interaction_id,
183
- interaction,
184
- claimToken: row.claim_token,
185
- ...outcome,
186
- });
187
- }
188
- /** Dispatch a checked canonical final as the single correlated Visual result. */
189
- export function dispatchVisualWork(nodeId) {
190
- const row = getHumanWorkRow(nodeId);
191
- if (row === null || row.work_kind !== 'visual' || row.status !== 'visual_pending')
192
- return;
193
- try {
194
- const node = getNode(nodeId);
195
- if (node === null || node.final_report === null || row.final_report === null || node.final_report !== row.final_report || basename(row.final_report) !== row.final_report)
196
- throw new Error('Visual work produced no canonical final report');
197
- const raw = readFileSync(join(reportsDir(nodeId), row.final_report), 'utf8');
198
- const match = new RegExp(`^---\\nnode: ${nodeId}\\nkind: final\\nts: ([^\\n]+)\\n---\\n([\\s\\S]*)$`).exec(raw);
199
- if (match === null || Number.isNaN(Date.parse(match[1])) || match[2].trim() === '')
200
- throw new Error('Visual work produced an invalid final report');
201
- visualSubmission(row, { status: 'ready', markdown: match[2] });
202
- }
203
- catch (error) {
204
- try {
205
- visualSubmission(row, { status: 'error', error: `Visual generation failed: ${String(error)}`.slice(0, 8_192) });
206
- }
207
- catch {
208
- return;
209
- }
210
- }
211
- retireVisualWork(row.dir, row.request_id);
212
- }
213
- /** Reconcile this durable lane after a dead private child or interrupted dispatch. */
214
- export function reconcileVisualWork() {
215
- const rows = openDb().prepare("SELECT * FROM consult_outbox WHERE work_kind = 'visual' AND status IN ('visual_armed', 'visual_pending')").all();
216
- for (const row of rows.map(rowFrom)) {
217
- try {
218
- if (row.status === 'visual_pending') {
219
- dispatchVisualWork(row.node_id);
220
- continue;
221
- }
222
- const node = getNode(row.node_id);
223
- // A fork_pending child is intentionally persisted as canceled until the
224
- // start handler rechecks its request and reviveNode consumes this armed
225
- // claim. Visual cancellation retires the claim before canceling its node,
226
- // so an armed fork in this state remains launchable.
227
- if (node?.status === 'canceled' && node.private_fork_phase === 'fork_pending')
228
- continue;
229
- if (node === null || node.status === 'dead' || node.status === 'canceled') {
230
- visualSubmission(row, { status: 'error', error: 'Visual generation could not complete' });
231
- retireVisualWork(row.dir, row.request_id);
232
- }
233
- }
234
- catch { /* retain the immutable claim for a later reconciliation */ }
235
- }
236
- }
237
- /** Reconcile only follow-up work. */
238
- export function reconcileFollowUpWork() {
239
- for (const row of listPendingFollowUpWork()) {
240
- try {
241
- dispatchFollowUpWork(row.node_id);
242
- }
243
- catch {
244
- /* best-effort — never let one receipt block the rest */
245
- }
246
- }
247
- for (const row of listArmedFollowUpWork()) {
248
- try {
249
- const node = getNode(row.node_id);
250
- const deadOrMissing = node === null || node.status === 'dead' || node.status === 'canceled';
251
- const hasFinal = node !== null && node.final_report !== null && node.final_report !== undefined;
252
- if (deadOrMissing && !hasFinal) {
253
- submitFollowUpResult(row.root, row.dir, { requestId: row.request_id, status: 'error', error: 'consultation could not complete' });
254
- errorFollowUpWork(row.node_id);
255
- }
256
- }
257
- catch {
258
- /* leave the armed receipt retryable */
259
- }
260
- }
261
- }
@@ -1,16 +0,0 @@
1
- import type { HttpPluginRegistration } from './endpoint.js';
2
- /** A root-confined HTTP manifest location, created only by
3
- * `resolveHttpPluginManifestStore`. Store operations accept this resolved
4
- * location rather than a manifest declaration. */
5
- export declare class HttpPluginManifestStore {
6
- #private;
7
- private constructor();
8
- get path(): string;
9
- static resolve(plugin: Pick<HttpPluginRegistration, 'root' | 'commands'>): HttpPluginManifestStore | null;
10
- }
11
- /** Resolve an HTTP manifest declaration to a path confined to the plugin root.
12
- * Existing target and ancestor symlinks are resolved before use; an absent target
13
- * is allowed only beneath an existing real ancestor inside that root. */
14
- export declare function resolveHttpPluginManifestStore(plugin: Pick<HttpPluginRegistration, 'root' | 'commands'>): HttpPluginManifestStore | null;
15
- export declare function readHttpPluginManifest(store: HttpPluginManifestStore): Uint8Array | null;
16
- export declare function writeHttpPluginManifest(store: HttpPluginManifestStore, rawManifest: Uint8Array): void;
@@ -1,64 +0,0 @@
1
- import { existsSync, readFileSync, realpathSync, statSync } from 'node:fs';
2
- import { dirname, resolve, sep } from 'node:path';
3
- import { atomicWriteText, pathExists } from '../fs-utils.js';
4
- /** A root-confined HTTP manifest location, created only by
5
- * `resolveHttpPluginManifestStore`. Store operations accept this resolved
6
- * location rather than a manifest declaration. */
7
- export class HttpPluginManifestStore {
8
- #path;
9
- constructor(path) {
10
- this.#path = path;
11
- }
12
- get path() {
13
- return this.#path;
14
- }
15
- static resolve(plugin) {
16
- if (typeof plugin.commands !== 'string' || plugin.commands.length === 0)
17
- return null;
18
- try {
19
- const root = realpathSync(plugin.root);
20
- const path = resolve(root, plugin.commands);
21
- if (!isInside(root, path))
22
- return null;
23
- if (existsSync(path)) {
24
- const real = realpathSync(path);
25
- if (!isInside(root, real) || !statSync(real).isFile())
26
- return null;
27
- }
28
- else {
29
- let ancestor = dirname(path);
30
- while (!existsSync(ancestor) && ancestor !== dirname(ancestor))
31
- ancestor = dirname(ancestor);
32
- const realAncestor = realpathSync(ancestor);
33
- if (!isInside(root, realAncestor) && realAncestor !== root)
34
- return null;
35
- }
36
- return new HttpPluginManifestStore(path);
37
- }
38
- catch {
39
- return null;
40
- }
41
- }
42
- }
43
- function isInside(root, path) {
44
- return path !== root && path.startsWith(root + sep);
45
- }
46
- /** Resolve an HTTP manifest declaration to a path confined to the plugin root.
47
- * Existing target and ancestor symlinks are resolved before use; an absent target
48
- * is allowed only beneath an existing real ancestor inside that root. */
49
- export function resolveHttpPluginManifestStore(plugin) {
50
- return HttpPluginManifestStore.resolve(plugin);
51
- }
52
- export function readHttpPluginManifest(store) {
53
- if (!pathExists(store.path))
54
- return null;
55
- try {
56
- return readFileSync(store.path);
57
- }
58
- catch {
59
- return null;
60
- }
61
- }
62
- export function writeHttpPluginManifest(store, rawManifest) {
63
- atomicWriteText(store.path, rawManifest);
64
- }
@@ -1,40 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import test from 'node:test';
3
- import { resolveViewPickAction } from '../../../commands/view-pick.js';
4
- import { resolveBrowseNavAction, resolveBrowseSearchAction } from '../../canvas/browse/app.js';
5
- import { resolveProfileMenuAction, resolveProfileSearchAction } from '../../profiles/select.js';
6
- import { resolveKeybindings } from '../index.js';
7
- test('bespoke consumers resolve defaults and replacements without retaining old gestures', () => {
8
- const defaults = resolveKeybindings();
9
- assert.equal(resolveViewPickAction(defaults, { input: 'j' }), 'crtr.view-picker.down');
10
- assert.equal(resolveBrowseNavAction(defaults, { input: 'G' }), 'crtr.browse.last');
11
- // Unit 1's terminal-space canonicalization lets a literal space key resolve the
12
- // catalog `space` gesture — the browse fold toggle now flows through the catalog.
13
- assert.equal(resolveBrowseNavAction(defaults, { input: ' ' }), 'crtr.browse.toggle-fold');
14
- assert.equal(resolveBrowseSearchAction(defaults, { return: true }), 'crtr.browse.search.commit');
15
- assert.equal(resolveProfileMenuAction(defaults, { input: '3' }), 'crtr.profile.menu.slot.3');
16
- assert.equal(resolveProfileSearchAction(defaults, { input: 'p', ctrl: true }), 'crtr.profile.search.up');
17
- const remapped = resolveKeybindings({
18
- 'crtr.view-picker.down': ['z'],
19
- 'crtr.browse.last': ['z'],
20
- 'crtr.browse.search.commit': ['z'],
21
- 'crtr.profile.menu.slot.3': ['z'],
22
- 'crtr.profile.search.up': ['z'],
23
- });
24
- assert.equal(remapped.diagnostics.length, 0);
25
- assert.equal(resolveViewPickAction(remapped, { input: 'j' }), null);
26
- assert.equal(resolveViewPickAction(remapped, { input: 'z' }), 'crtr.view-picker.down');
27
- assert.equal(resolveBrowseNavAction(remapped, { input: 'G' }), null);
28
- assert.equal(resolveBrowseNavAction(remapped, { input: 'z' }), 'crtr.browse.last');
29
- assert.equal(resolveBrowseSearchAction(remapped, { return: true }), null);
30
- assert.equal(resolveBrowseSearchAction(remapped, { input: 'z' }), 'crtr.browse.search.commit');
31
- assert.equal(resolveProfileMenuAction(remapped, { input: '3' }), null);
32
- assert.equal(resolveProfileMenuAction(remapped, { input: 'z' }), 'crtr.profile.menu.slot.3');
33
- assert.equal(resolveProfileSearchAction(remapped, { input: 'p', ctrl: true }), null);
34
- assert.equal(resolveProfileSearchAction(remapped, { input: 'z' }), 'crtr.profile.search.up');
35
- });
36
- test('profile search leaves printable filter payloads outside catalog actions', () => {
37
- const bindings = resolveKeybindings();
38
- assert.equal(resolveProfileSearchAction(bindings, { input: 'w' }), null);
39
- assert.equal(resolveProfileSearchAction(bindings, { input: '文' }), null);
40
- });
@@ -1,3 +0,0 @@
1
- export declare const AUTH_FAULT_RECOVERY_BODY = "Provider credentials were just updated (a new login landed). Your previous turn stopped on a provider authentication failure. Continue from where you left off and retry the work that failed.";
2
- export declare const CONNECTION_FAULT_RECOVERY_BODY = "The network connection is back online. Your previous turn stopped on a connection error (the network was down). Continue from where you left off and retry the work that failed.";
3
- export declare const PROVIDER_FAULT_RECOVERY_BODY = "Your previous turn stopped on a provider fault. Continue from where you left off and retry the work that failed.";
@@ -1,3 +0,0 @@
1
- export const AUTH_FAULT_RECOVERY_BODY = 'Provider credentials were just updated (a new login landed). Your previous turn stopped on a provider authentication failure. Continue from where you left off and retry the work that failed.';
2
- export const CONNECTION_FAULT_RECOVERY_BODY = 'The network connection is back online. Your previous turn stopped on a connection error (the network was down). Continue from where you left off and retry the work that failed.';
3
- export const PROVIDER_FAULT_RECOVERY_BODY = 'Your previous turn stopped on a provider fault. Continue from where you left off and retry the work that failed.';
@@ -1,113 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import test from 'node:test';
3
- import { resolveKeybindings } from '../../keybindings/index.js';
4
- import { matchViewBinding, matchesViewHostBinding, parseViewKeypress, resolveViewKeyHints } from '../host.js';
5
- function key(input = '', patch = {}) {
6
- return {
7
- upArrow: false,
8
- downArrow: false,
9
- leftArrow: false,
10
- rightArrow: false,
11
- return: false,
12
- escape: false,
13
- ctrl: false,
14
- meta: false,
15
- tab: false,
16
- shiftTab: false,
17
- backspace: false,
18
- ...patch,
19
- };
20
- }
21
- test('catalog view bindings use defaults, remaps, and effective hint labels', () => {
22
- const keymap = [
23
- { bindingId: 'crtr.view.canvas.down', intent: 'down', hint: { label: 'move' } },
24
- ];
25
- const defaults = resolveKeybindings();
26
- assert.deepEqual(matchViewBinding(keymap, defaults, 'j', key('j'), { row: 0 }), { intent: 'down', payload: undefined });
27
- // Bare printable keys render as typed — `j`, not a `J` nobody can press.
28
- assert.deepEqual(resolveViewKeyHints(keymap, defaults, { row: 0 }), [{ keys: 'j / Down', label: 'move' }]);
29
- const remapped = resolveKeybindings({ 'crtr.view.canvas.down': ['x'] });
30
- assert.equal(matchViewBinding(keymap, remapped, 'j', key('j'), { row: 0 }), null);
31
- assert.deepEqual(matchViewBinding(keymap, remapped, 'x', key('x'), { row: 0 }), { intent: 'down', payload: undefined });
32
- assert.deepEqual(resolveViewKeyHints(keymap, remapped, { row: 0 }), [{ keys: 'x', label: 'move' }]);
33
- });
34
- test('custom view literals retain their matching and presenter-authored hints', () => {
35
- const keymap = [
36
- { keys: ['z'], intent: 'custom', hint: { keys: 'z', label: 'custom' } },
37
- ];
38
- const bindings = resolveKeybindings();
39
- assert.deepEqual(matchViewBinding(keymap, bindings, 'z', key('z'), undefined), { intent: 'custom', payload: undefined });
40
- assert.equal(matchViewBinding(keymap, bindings, 'x', key('x'), undefined), null);
41
- assert.deepEqual(resolveViewKeyHints(keymap, bindings, undefined), [{ keys: 'z', label: 'custom' }]);
42
- });
43
- test('Alt+<letter> does not falsely match a bare custom literal', () => {
44
- const keymap = [{ keys: ['q'], intent: 'quit' }];
45
- const bindings = resolveKeybindings();
46
- const altQ = parseViewKeypress(Buffer.from('\x1bq'));
47
- assert.equal(matchViewBinding(keymap, bindings, altQ.input, altQ.key, undefined, altQ.raw), null);
48
- const q = parseViewKeypress(Buffer.from('q'));
49
- assert.deepEqual(matchViewBinding(keymap, bindings, q.input, q.key, undefined, q.raw), { intent: 'quit', payload: undefined });
50
- });
51
- test('host force quit and capture deletion follow catalog IDs through raw terminal decoding', () => {
52
- const defaults = resolveKeybindings();
53
- const ctrlC = parseViewKeypress(Buffer.from('\x03'));
54
- const del = parseViewKeypress(Buffer.from('\x7f'), defaults);
55
- const bs = parseViewKeypress(Buffer.from('\b'), defaults);
56
- assert.ok(matchesViewHostBinding(defaults, 'crtr.view.host.force-quit', ctrlC.raw));
57
- assert.ok(matchesViewHostBinding(defaults, 'crtr.view.host.editor.backspace', del.raw));
58
- // 0x08 stays Backspace under default config so ^H-erase terminals still delete.
59
- assert.ok(matchesViewHostBinding(defaults, 'crtr.view.host.editor.backspace', bs.raw));
60
- const remapped = resolveKeybindings({
61
- 'crtr.view.host.force-quit': ['alt+x'],
62
- 'crtr.view.host.editor.backspace': ['ctrl+h'],
63
- });
64
- const altX = parseViewKeypress(Buffer.from('\x1bx'), remapped);
65
- const ctrlH = parseViewKeypress(Buffer.from('\b'), remapped);
66
- const delRemap = parseViewKeypress(Buffer.from('\x7f'), remapped);
67
- assert.equal(matchesViewHostBinding(remapped, 'crtr.view.host.force-quit', ctrlC.raw), false);
68
- assert.ok(matchesViewHostBinding(remapped, 'crtr.view.host.force-quit', altX.raw));
69
- // With deletion remapped to Ctrl-H, the 0x08 byte deletes and DEL no longer does.
70
- assert.equal(matchesViewHostBinding(remapped, 'crtr.view.host.editor.backspace', delRemap.raw), false);
71
- assert.ok(matchesViewHostBinding(remapped, 'crtr.view.host.editor.backspace', ctrlH.raw));
72
- });
73
- test('Alt+Backspace deletes like Backspace under default config', () => {
74
- const defaults = resolveKeybindings();
75
- const altDel = parseViewKeypress(Buffer.from('\x1b\x7f'), defaults);
76
- const altBs = parseViewKeypress(Buffer.from('\x1b\b'), defaults);
77
- assert.ok(matchesViewHostBinding(defaults, 'crtr.view.host.editor.backspace', altDel.raw));
78
- assert.ok(matchesViewHostBinding(defaults, 'crtr.view.host.editor.backspace', altBs.raw));
79
- });
80
- test('raw terminal decoding covers modified arrows and enter/return equivalence', () => {
81
- const keymap = [{ bindingId: 'crtr.view.chat.submit', intent: 'submit' }];
82
- const bindings = resolveKeybindings();
83
- const cr = parseViewKeypress(Buffer.from('\r'));
84
- const lf = parseViewKeypress(Buffer.from('\n'));
85
- assert.deepEqual(matchViewBinding(keymap, bindings, cr.input, cr.key, undefined, cr.raw), { intent: 'submit', payload: undefined });
86
- assert.deepEqual(matchViewBinding(keymap, bindings, lf.input, lf.key, undefined, lf.raw), { intent: 'submit', payload: undefined });
87
- const ctrlUp = parseViewKeypress(Buffer.from('\x1b[1;5A'));
88
- assert.equal(ctrlUp.raw.upArrow, true);
89
- assert.equal(ctrlUp.raw.ctrl, true);
90
- const up = parseViewKeypress(Buffer.from('\x1b[A'));
91
- assert.equal(up.raw.upArrow, true);
92
- assert.equal(up.raw.ctrl, false);
93
- });
94
- test('a disabled binding neither matches nor renders a hint', () => {
95
- const keymap = [
96
- { bindingId: 'crtr.view.canvas.refresh', intent: 'refresh', hint: { label: 'refresh' } },
97
- ];
98
- const bindings = resolveKeybindings({ 'crtr.view.canvas.refresh': [] });
99
- const g = parseViewKeypress(Buffer.from('g'));
100
- assert.equal(matchViewBinding(keymap, bindings, g.input, g.key, undefined, g.raw), null);
101
- assert.deepEqual(resolveViewKeyHints(keymap, bindings, undefined), []);
102
- });
103
- test('capture hints are host-owned, mode-gated, and keep custom KeyHint keys verbatim', () => {
104
- const gated = [
105
- { capture: 'setDraft', when: (state) => state.compose, hint: { label: 'compose' } },
106
- ];
107
- assert.deepEqual(resolveViewKeyHints(gated, resolveKeybindings(), { compose: true }), [{ keys: 'type', label: 'compose' }]);
108
- assert.deepEqual(resolveViewKeyHints(gated, resolveKeybindings(), { compose: false }), []);
109
- const custom = [
110
- { capture: 'setDraft', when: () => true, hint: { keys: 'edit', label: 'compose' } },
111
- ];
112
- assert.deepEqual(resolveViewKeyHints(custom, resolveKeybindings(), undefined), [{ keys: 'edit', label: 'compose' }]);
113
- });
@@ -1,66 +0,0 @@
1
- import { type Key } from './terminal.js';
2
- import { type Draw, type Rect, type Size } from './draw.js';
3
- import type { ViewCore, TuiPresenter, TextPresenter, KeyBinding, KeyHint, BannerLevel } from '../view/contract.js';
4
- import { type BindingId, type BindingResolution, type RawTerminalInput } from '../keybindings/index.js';
5
- export interface RunViewOptions {
6
- /** CLI flags forwarded verbatim to the view via host.options. */
7
- options?: Record<string, string>;
8
- }
9
- /** The host-tracked chrome state. `banner` + `busy` + `loaded` derive the title
10
- * state chip; `tick` advances the spinner under the busy-tick repaint. */
11
- export interface Chrome {
12
- status: string | null;
13
- banner: {
14
- msg: string;
15
- level: BannerLevel;
16
- } | null;
17
- busy: boolean;
18
- loaded: boolean;
19
- lastRefresh: number;
20
- tick: number;
21
- subtitle: string | null;
22
- mode: string | null;
23
- }
24
- /** The slice of a view's manifest that drawChrome reads (title + subtitle), plus
25
- * the footer hints lifted from the TuiPresenter's keymap bindings. */
26
- export interface ChromeManifest {
27
- title: string;
28
- subtitle?: string;
29
- keymap?: KeyHint[];
30
- }
31
- /** Draw the host chrome into `draw` and return the content Rect for the view.
32
- * Three zones: title row (state rail + title/subtitle + state chip + liveness),
33
- * a hairline, and a footer (status left, keymap right) with a severity banner
34
- * on the row above it when set. */
35
- declare function drawChrome(draw: Draw, size: Size, manifest: ChromeManifest, c: Chrome, now?: number): Rect;
36
- export { drawChrome };
37
- /** Tokens a keystroke can match a keymap binding's `keys` against. Arrows →
38
- * up/down/left/right, return → return|enter, escape → escape|esc, a printable
39
- * char → the char itself (+ 'space' for ' '), ctrl+x → ctrl+x|c-x. */
40
- export interface ViewKeypress {
41
- readonly input: string;
42
- readonly key: Key;
43
- readonly raw: RawTerminalInput;
44
- }
45
- /** Extend the shared legacy parser with the terminal gestures the catalog can
46
- * express. The raw shape goes only to the catalog matcher; custom literals keep
47
- * their established Key-based matching. When `bindings` is supplied the ambiguous
48
- * 0x08 byte resolves to Ctrl-H only if an effective binding claims it. */
49
- export declare function parseViewKeypress(data: Buffer, bindings?: BindingResolution<BindingId>): ViewKeypress;
50
- /** Resolve footer hints for the CURRENT state: only bindings whose `when(state)`
51
- * passes contribute, so mode-gated affordances (compose/react send/cancel/pick)
52
- * appear exactly while active. Catalog bindings render the effective key label
53
- * (omitted entirely when disabled); custom-view literal hints stay verbatim. */
54
- export declare function resolveViewKeyHints<S>(keymap: KeyBinding<S>[], bindings: BindingResolution<BindingId>, state: S): KeyHint[];
55
- /** The first non-capture binding whose key matches and whose `when` (if any)
56
- * passes — catalog IDs use the terminal matcher; custom literals retain their
57
- * presenter-authored matching. */
58
- export declare function matchViewBinding<S>(keymap: KeyBinding<S>[], bindings: BindingResolution<BindingId>, input: string, key: Key, state: S, raw?: RawTerminalInput): {
59
- intent: string;
60
- payload: unknown;
61
- } | null;
62
- /** Match a host-owned generic-view action through the same catalog snapshot. */
63
- export declare function matchesViewHostBinding(bindings: BindingResolution<BindingId>, id: 'crtr.view.host.force-quit' | 'crtr.view.host.editor.backspace', raw: RawTerminalInput): boolean;
64
- /** Host a dual-target ViewCore + TuiPresenter in the alt screen until it quits
65
- * (or Ctrl-C). `text` is the optional text presenter for the piped path. */
66
- export declare function runCoreView<S>(core: ViewCore<S>, tui: TuiPresenter<S>, text: TextPresenter<S> | null, opts?: RunViewOptions): Promise<void>;
@@ -1,62 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import { test } from 'node:test';
3
- import { createBurstCoalescingTransport } from '../transport-cache.js';
4
- function makeInner() {
5
- const calls = [];
6
- const releases = [];
7
- return {
8
- calls,
9
- send(req) {
10
- calls.push(req);
11
- return new Promise((resolve) => {
12
- releases.push(resolve);
13
- });
14
- },
15
- release(response) {
16
- const resolve = releases.shift();
17
- if (resolve === undefined)
18
- throw new Error('release called with no pending send');
19
- resolve(response);
20
- },
21
- open() {
22
- throw new Error('not used');
23
- },
24
- };
25
- }
26
- test('burst coalescing shares identical in-flight requests and serves the short TTL cache', async () => {
27
- let now = 1_000;
28
- const inner = makeInner();
29
- const req = { kind: 'exec', bin: 'crtr', args: ['canvas', 'snapshot', '--json'] };
30
- const transport = createBurstCoalescingTransport(inner, {
31
- ttlMs: 350,
32
- now: () => now,
33
- shouldCache: (candidate) => candidate.kind === 'exec',
34
- });
35
- const first = transport.send(req);
36
- const second = transport.send(req);
37
- assert.equal(inner.calls.length, 1);
38
- inner.release({ ok: true, exitCode: 0, stdout: '{"nodes":[]}', stderr: '' });
39
- assert.deepEqual(await first, { ok: true, exitCode: 0, stdout: '{"nodes":[]}', stderr: '' });
40
- assert.deepEqual(await second, { ok: true, exitCode: 0, stdout: '{"nodes":[]}', stderr: '' });
41
- assert.deepEqual(await transport.send(req), { ok: true, exitCode: 0, stdout: '{"nodes":[]}', stderr: '' });
42
- assert.equal(inner.calls.length, 1);
43
- now += 351;
44
- const afterTtl = transport.send(req);
45
- assert.equal(inner.calls.length, 2);
46
- inner.release({ ok: true, exitCode: 0, stdout: '{"nodes":[1]}', stderr: '' });
47
- assert.deepEqual(await afterTtl, { ok: true, exitCode: 0, stdout: '{"nodes":[1]}', stderr: '' });
48
- });
49
- test('burst coalescing leaves non-cacheable requests untouched', async () => {
50
- const inner = makeInner();
51
- const req = { kind: 'exec', bin: 'crtr', args: ['node', 'new', '--json'], stdin: 'hi' };
52
- const transport = createBurstCoalescingTransport(inner, {
53
- ttlMs: 350,
54
- shouldCache: () => false,
55
- });
56
- const first = transport.send(req);
57
- const second = transport.send(req);
58
- assert.equal(inner.calls.length, 2);
59
- inner.release({ ok: true, exitCode: 0, stdout: '{}', stderr: '' });
60
- inner.release({ ok: true, exitCode: 0, stdout: '{}', stderr: '' });
61
- await Promise.all([first, second]);
62
- });
@@ -1,10 +0,0 @@
1
- import type { Transport } from './transport.js';
2
- export interface BridgeResult {
3
- status: number;
4
- body: string;
5
- }
6
- /** Decode a POST body as a SourceRequest and run it through `transport`,
7
- * returning the HTTP status + JSON-encoded RawResponse the bridge should send
8
- * back. Never throws — a malformed body or a transport failure both come back
9
- * as a RawResponse with ok:false. */
10
- export declare function runSourceRequest(transport: Transport, rawBody: string): Promise<BridgeResult>;