@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
@@ -0,0 +1,2 @@
1
+ import { type BranchDef } from '../../core/command.js';
2
+ export declare const humanDoc: BranchDef;
@@ -0,0 +1,98 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { resolve } from 'node:path';
3
+ import { defineBranch, defineLeaf } from '../../core/command.js';
4
+ import { InputError } from '../../core/io.js';
5
+ import { checkMarkdown, renderMarkdown } from '../../core/termrender/termrender.js';
6
+ function markdownSource(input, context) {
7
+ const path = input['path'];
8
+ const body = input['body'];
9
+ const stdinProvided = context?.providedParams.has('body') === true;
10
+ if (path === undefined && !stdinProvided) {
11
+ throw new InputError({
12
+ error: 'missing_parameter',
13
+ message: 'provide exactly one markdown source: PATH or stdin',
14
+ next: 'Run `crtr human doc check -h` or `crtr human doc render -h` and provide a path or pipe markdown on stdin.',
15
+ });
16
+ }
17
+ if (path !== undefined && path !== '-' && stdinProvided && body.trim() !== '') {
18
+ throw new InputError({
19
+ error: 'bad_invocation',
20
+ message: 'both a positional path and piped stdin were provided',
21
+ field: 'path, body',
22
+ next: 'Pass exactly one markdown source: either PATH or piped stdin, not both.',
23
+ });
24
+ }
25
+ if (path === undefined || path === '-')
26
+ return body;
27
+ const abs = resolve(path);
28
+ if (!existsSync(abs)) {
29
+ throw new InputError({
30
+ error: 'file_not_found',
31
+ message: `file not found: ${abs}`,
32
+ field: 'path',
33
+ next: 'Provide a path to an existing markdown file, or pipe markdown on stdin.',
34
+ });
35
+ }
36
+ return readFileSync(abs, 'utf8');
37
+ }
38
+ const humanDocCheck = defineLeaf({
39
+ name: 'check',
40
+ description: 'validate a directive-flavored markdown body',
41
+ whenToUse: 'validating a deck or review body before submitting it.',
42
+ help: {
43
+ name: 'human doc check',
44
+ summary: 'validate directive-flavored markdown through the pinned managed renderer',
45
+ guide: 'The pinned renderer runs from a private managed venv and is not on PATH, so this is the only way to validate a deck or review body before submitting it.',
46
+ params: [
47
+ { kind: 'positional', name: 'path', type: 'path', required: false, constraint: 'Markdown file to validate. Provide exactly one of PATH or stdin; use - to read stdin.' },
48
+ { kind: 'stdin', name: 'body', required: false, constraint: 'Markdown to validate. Provide exactly one of piped stdin or PATH.' },
49
+ ],
50
+ output: [
51
+ { name: 'ok', type: 'boolean', required: true, constraint: 'True when the markdown is valid.' },
52
+ { name: 'error', type: 'string', required: false, constraint: 'The renderer validation error when ok is false.' },
53
+ ],
54
+ outputKind: 'object',
55
+ effects: ['Read-only: invokes the private managed renderer to validate the supplied body.'],
56
+ },
57
+ run: async (input, context) => checkMarkdown(markdownSource(input, context)),
58
+ });
59
+ const humanDocRender = defineLeaf({
60
+ name: 'render',
61
+ description: 'render a directive-flavored markdown body',
62
+ whenToUse: 'previewing how a deck or review body renders before submitting it.',
63
+ help: {
64
+ name: 'human doc render',
65
+ summary: 'render directive-flavored markdown through the pinned managed renderer',
66
+ guide: 'The pinned renderer runs from a private managed venv and is not on PATH, so this is the only way to render a deck or review body before submitting it.',
67
+ params: [
68
+ { kind: 'positional', name: 'path', type: 'path', required: false, constraint: 'Markdown file to render. Provide exactly one of PATH or stdin; use - to read stdin.' },
69
+ { kind: 'stdin', name: 'body', required: false, constraint: 'Markdown to render. Provide exactly one of piped stdin or PATH.' },
70
+ { kind: 'flag', name: 'width', type: 'int', required: false, default: process.stdout.columns || 100, constraint: 'Render width in columns. Default: current stdout width, or 100.' },
71
+ { kind: 'flag', name: 'color', type: 'bool', required: false, default: true, constraint: 'Emit ANSI color. Default true; false strips ANSI escape sequences.' },
72
+ ],
73
+ output: [
74
+ { name: 'lines', type: 'string[]', required: true, constraint: 'Rendered terminal lines in display order.' },
75
+ { name: 'width', type: 'integer', required: true, constraint: 'The render width in columns.' },
76
+ ],
77
+ outputKind: 'object',
78
+ effects: ['Read-only: invokes the private managed renderer to render the supplied body.'],
79
+ },
80
+ run: async (input, context) => {
81
+ const width = input['width'];
82
+ const color = input['color'];
83
+ const lines = renderMarkdown(markdownSource(input, context), width);
84
+ return { lines: color ? lines : lines.map((line) => line.replace(/\x1b\[[0-9;]*[A-Za-z]/g, '')), width };
85
+ },
86
+ render: (result) => result['lines'].join('\n'),
87
+ });
88
+ export const humanDoc = defineBranch({
89
+ name: 'doc',
90
+ description: 'validate or render directive-flavored markdown bodies',
91
+ whenToUse: 'validating or previewing a directive-flavored markdown body before submitting it.',
92
+ help: {
93
+ name: 'human doc',
94
+ summary: 'validate and render directive-flavored markdown bodies',
95
+ model: 'Both leaves read exactly one body from a path or stdin through the private managed renderer.',
96
+ },
97
+ children: [humanDocCheck, humanDocRender],
98
+ });
@@ -0,0 +1,2 @@
1
+ import { type BranchDef } from '../../core/command.js';
2
+ export declare const humanInbox: BranchDef;
@@ -0,0 +1,101 @@
1
+ import { defineBranch, defineLeaf } from '../../core/command.js';
2
+ import { currentTmux, displayClientMessage, liveViewerPanes, paneLocation, selectPane, selectWindow, sendAttachControl, switchClient, } from '../../core/runtime/placement-tmux.js';
3
+ const NO_VIEWER_MESSAGE = 'No crouter viewer is running — attach to a node first (crtr surface attach to <node>).';
4
+ function tmuxSocketFromEnvironment() {
5
+ const socket = process.env['TMUX']?.split(',')[0]?.trim();
6
+ return socket === undefined || socket === '' ? undefined : socket;
7
+ }
8
+ function paneForInvocation(explicit) {
9
+ if (explicit !== undefined && explicit !== '')
10
+ return explicit;
11
+ const fromEnv = process.env['TMUX_PANE'];
12
+ if (fromEnv !== undefined && fromEnv !== '')
13
+ return fromEnv;
14
+ return currentTmux()?.pane;
15
+ }
16
+ function newestViewer(a, b) {
17
+ if (a.stampMs !== b.stampMs)
18
+ return b.stampMs - a.stampMs;
19
+ if (a.pane === b.pane)
20
+ return 0;
21
+ return a.pane < b.pane ? -1 : 1;
22
+ }
23
+ function selectViewer(viewers, targetPane, clientSession) {
24
+ const targeted = targetPane === undefined ? undefined : viewers.find((viewer) => viewer.pane === targetPane);
25
+ if (targeted !== undefined)
26
+ return targeted;
27
+ const inClientSession = clientSession === undefined ? [] : viewers.filter((viewer) => viewer.session === clientSession);
28
+ return [...(inClientSession.length > 0 ? inClientSession : viewers)].sort(newestViewer)[0];
29
+ }
30
+ function focusViewer(viewer, targetPane, clientSession) {
31
+ if (viewer.pane === targetPane)
32
+ return;
33
+ const location = paneLocation(viewer.pane);
34
+ if (location === null) {
35
+ selectPane(viewer.pane);
36
+ return;
37
+ }
38
+ if (clientSession !== location.session)
39
+ switchClient(location.session);
40
+ selectWindow(location.session, location.window);
41
+ selectPane(viewer.pane);
42
+ }
43
+ const humanInboxToggle = defineLeaf({
44
+ name: 'toggle',
45
+ description: 'deliver the inbox toggle to a live viewer',
46
+ whenToUse: 'toggling the human inbox surface in a running crouter viewer; the selected viewer receives the private attach-control action and is focused afterward.',
47
+ help: {
48
+ name: 'human inbox toggle',
49
+ summary: 'deliver the human inbox toggle to a live viewer',
50
+ guide: 'Selection prefers the target pane, then the resolved client session by newest viewer stamp, then newest globally; ties use pane id. The viewer decides whether the delivered toggle opens or closes the surface.',
51
+ params: [
52
+ { kind: 'flag', name: 'tmux-socket', type: 'path', required: false, constraint: 'Tmux server socket. Omit to use the first field of $TMUX.' },
53
+ { kind: 'flag', name: 'tmux-client', type: 'string', required: false, constraint: 'Tmux client name for the status-line message and client-session context.' },
54
+ { kind: 'flag', name: 'target-pane', type: 'string', required: false, constraint: 'Viewer pane to prefer. Omit to use $TMUX_PANE or the current tmux pane as the selection target.' },
55
+ { kind: 'flag', name: 'quiet', type: 'bool', required: false, default: false, constraint: 'Suppress the structured command result. A no-viewer status-line message is still shown.' },
56
+ ],
57
+ output: [
58
+ { name: 'action', type: 'opened | skipped', required: true, constraint: 'opened means the private inbox toggle sequence was delivered to a live viewer; it does not assert that the surface is now open. skipped means delivery did not happen.' },
59
+ { name: 'message', type: 'string', required: false, constraint: 'Present when action is skipped. With no live viewer, the same message is also shown in the tmux status line.' },
60
+ ],
61
+ outputKind: 'object',
62
+ effects: ['Sends the private inbox attach-control sequence to one live viewer and focuses that viewer unless it is already the target pane. Never opens a popup, launches a viewer, or wakes a node. With --quiet, suppresses only the structured result.'],
63
+ },
64
+ run: async (input) => {
65
+ const quiet = input['quiet'];
66
+ const socket = input['tmuxSocket'] ?? tmuxSocketFromEnvironment();
67
+ const client = input['tmuxClient'];
68
+ const targetPane = paneForInvocation(input['targetPane']);
69
+ if (socket === undefined) {
70
+ const outcome = { action: 'skipped', message: 'the inbox needs tmux' };
71
+ return quiet ? undefined : outcome;
72
+ }
73
+ const viewers = liveViewerPanes(socket);
74
+ const targetViewer = targetPane === undefined ? undefined : viewers.find((viewer) => viewer.pane === targetPane);
75
+ const clientSession = targetViewer?.session ?? (targetPane === undefined ? undefined : paneLocation(targetPane)?.session) ?? currentTmux()?.session;
76
+ const viewer = selectViewer(viewers, targetPane, clientSession);
77
+ if (viewer === undefined) {
78
+ displayClientMessage(socket, client, NO_VIEWER_MESSAGE);
79
+ const outcome = { action: 'skipped', message: NO_VIEWER_MESSAGE };
80
+ return quiet ? undefined : outcome;
81
+ }
82
+ if (!sendAttachControl(socket, viewer.pane, 'crtr.attach.inbox.toggle')) {
83
+ const outcome = { action: 'skipped', message: 'could not deliver the inbox toggle to the selected viewer' };
84
+ return quiet ? undefined : outcome;
85
+ }
86
+ focusViewer(viewer, targetPane, clientSession);
87
+ const outcome = { action: 'opened' };
88
+ return quiet ? undefined : outcome;
89
+ },
90
+ });
91
+ export const humanInbox = defineBranch({
92
+ name: 'inbox',
93
+ description: 'deliver the human inbox toggle to a live viewer',
94
+ whenToUse: 'answering, reviewing, or managing pending human tickets from a running crouter viewer.',
95
+ help: {
96
+ name: 'human inbox',
97
+ summary: 'deliver the human inbox toggle to a live viewer',
98
+ model: 'The toggle leaf sends a private viewer control action; it never hosts the inbox itself.',
99
+ },
100
+ children: [humanInboxToggle],
101
+ });
@@ -1,8 +1,7 @@
1
- import type { DeckSource } from '@crouton-kit/humanloop';
2
- /** Humanloop's optional presentation label. Ticket identity and attribution
1
+ import type { DeckSource } from '../../core/human/types.js';
2
+ /** Optional presentation label for crouter tickets. Ticket identity and attribution
3
3
  * come from the bridge node directory and parent relation, never ticket data. */
4
4
  export declare function sourceStamp(): Promise<DeckSource>;
5
5
  export declare const humanAsk: import("../../core/command.js").LeafDef;
6
- export declare const humanReview: import("../../core/command.js").LeafDef;
7
6
  export declare const humanNotify: import("../../core/command.js").LeafDef;
8
7
  export declare const humanShow: import("../../core/command.js").LeafDef;
@@ -6,21 +6,23 @@
6
6
  import { defineLeaf } from '../../core/command.js';
7
7
  import { InputError } from '../../core/io.js';
8
8
  import { cliClient } from '../api-client.js';
9
- import { nodeDir } from '../../core/canvas/paths.js';
10
- import { mkdirSync, existsSync } from 'node:fs';
11
- import { dirname, isAbsolute, join, resolve } from 'node:path';
12
- import { randomBytes, randomUUID } from 'node:crypto';
9
+ import { dirname, isAbsolute, join } from 'node:path';
10
+ import { randomBytes } from 'node:crypto';
13
11
  import { tmuxServerReachable } from '../../core/spawn.js';
14
- import { BrokerClient, BrokerUnavailableError } from '../../core/broker-client/index.js';
15
12
  import { markStopSignal } from '../../core/runtime/stop-signals.js';
16
- import { validateDeck, resolveDeckBodyPaths, notifyDeck, atomicWriteJson, submitDeck, submitReview, display, } from '@crouton-kit/humanloop';
17
- import { BODY_PATH_CONTRACT, DECK_SCHEMA_HINT, registerCrouterRoot, resolveMaxPanes } from './shared.js';
18
- import { inboxOpenInstruction, inboxPopupHint } from '../../core/keybindings/index.js';
13
+ import { validateDeck, resolveDeckBodyPaths } from '../../core/human/deck-schema.js';
14
+ import { notifyDeck } from '../../core/human/deck-factories.js';
15
+ import { atomicWriteJson } from '../../core/human/convention.js';
16
+ import { ticketDir } from '../../core/human/root.js';
17
+ import { submitDeck } from '../../core/human/tickets.js';
18
+ import { display } from '../../core/termrender/display.js';
19
+ import { BODY_PATH_CONTRACT, DECK_SCHEMA_HINT, resolveMaxPanes } from './shared.js';
20
+ import { inboxHint, inboxOpenInstruction } from '../../core/keybindings/index.js';
19
21
  /** The asking node's id, or null when run from a bare shell (no parent to route to). */
20
22
  function askingNode() {
21
23
  return process.env['CRTR_NODE_ID'] ?? null;
22
24
  }
23
- /** Humanloop's optional presentation label. Ticket identity and attribution
25
+ /** Optional presentation label for crouter tickets. Ticket identity and attribution
24
26
  * come from the bridge node directory and parent relation, never ticket data. */
25
27
  export async function sourceStamp() {
26
28
  const nodeId = askingNode();
@@ -88,7 +90,7 @@ function buildHumanAskDeck(title, subtitle, question) {
88
90
  });
89
91
  }
90
92
  /** Crouter authors decision decks by default. Persist the explicit kind so
91
- * consumers can rely on Humanloop's strict interaction-kind contract. */
93
+ * consumers can rely on the ticket store's strict interaction-kind contract. */
92
94
  function canonicalizeAskKinds(deck) {
93
95
  return {
94
96
  ...deck,
@@ -98,54 +100,6 @@ function canonicalizeAskKinds(deck) {
98
100
  })),
99
101
  };
100
102
  }
101
- const HUMAN_FORK_COORDINATES_TIMEOUT_MS = 10_000;
102
- const EXACT_MODEL_SPEC = /^[^/\s:]+\/[^/\s:]+:(?:off|minimal|low|medium|high|xhigh|max)$/;
103
- class InvalidHumanForkCoordinatesError extends Error {
104
- }
105
- class InvalidHumanForkModelError extends Error {
106
- }
107
- /** Read one pure ask-time coordinate from the source broker. Materialization is
108
- * deliberately separate so this observer connection can never change its live
109
- * session manager. */
110
- function getHumanForkCoordinates(nodeId) {
111
- return new Promise((resolve, reject) => {
112
- const client = new BrokerClient(nodeId);
113
- let settled = false;
114
- const timer = setTimeout(() => finish(() => reject(new BrokerUnavailableError(nodeId))), HUMAN_FORK_COORDINATES_TIMEOUT_MS);
115
- if (typeof timer.unref === 'function')
116
- timer.unref();
117
- function finish(act) {
118
- if (settled)
119
- return;
120
- settled = true;
121
- clearTimeout(timer);
122
- client.close();
123
- act();
124
- }
125
- client.on('error', () => finish(() => reject(new BrokerUnavailableError(nodeId))));
126
- client.on('close', () => finish(() => reject(new BrokerUnavailableError(nodeId))));
127
- client.on('connect', () => {
128
- client.send({ type: 'hello', role: 'observer', client_id: randomUUID() });
129
- client
130
- .request({ type: 'get_human_fork_coordinates' })
131
- .then((frame) => finish(() => resolve(frame)))
132
- .catch(() => finish(() => reject(new BrokerUnavailableError(nodeId))));
133
- });
134
- client.connect();
135
- });
136
- }
137
- function assertHumanForkCoordinates(coordinates) {
138
- if (coordinates.kind !== 'human_fork_coordinates' || !isAbsolute(coordinates.sourceFile) || coordinates.sourceSessionId === '' || coordinates.leafId === '') {
139
- throw new InvalidHumanForkCoordinatesError('broker returned invalid human fork coordinates');
140
- }
141
- if (coordinates.modelSpec === null || !EXACT_MODEL_SPEC.test(coordinates.modelSpec)) {
142
- throw new InvalidHumanForkModelError('broker returned no exact human fork model');
143
- }
144
- }
145
- function unavailableForkDetail(err) {
146
- const detail = err instanceof Error ? err.message : String(err);
147
- return detail === '' ? undefined : detail.slice(0, 240);
148
- }
149
103
  /** The non-blocking status peek returned by ask/review. Resolved per call so
150
104
  * the inbox affordance reflects the human's current keybinding (or the CLI
151
105
  * fallback when the toggle is disabled). */
@@ -161,8 +115,8 @@ export const humanAsk = defineLeaf({
161
115
  whenToUse: 'you would otherwise lay a decision, a set of options, or a question out for the user as prose — reach for this instead, for anything from a quick yes/no to a judgment-heavy call: gating a handoff, merge, deploy, destructive/irreversible operation, or real budget on an explicit human sign-off (offer Yes/No options), reviewing all the requirements before building, choosing among implementation patterns, walking a list of risks and deciding what to do about each, settling a naming or scope question, picking which of several findings to act on. Works for open-ended asks too (set `allowFreetext`, offer a few `options` as starting points).',
162
116
  help: {
163
117
  name: 'human ask',
164
- summary: 'put a humanloop decision deck in front of a person; returns a job handle immediately.',
165
- guide: 'Write every interaction as a self-contained decision brief for a supervisor who has not followed this agent or task: use the title to identify the inbox topic; write a one-sentence subtitle stating the decision, your recommendation, and what it changes; then give the minimum plain-language context and tradeoffs needed to decide in the body. Never coin a term, code name, or shorthand for a system, mechanism, or state, and expand any project-internal name you do use: name the thing plainly and say what it does. Invented vocabulary is not compression — the reader has to decode it before they can decide. Put supporting evidence, chronology, and technical detail under `## Details` so the person can answer without logs, screenshots, or prior conversation. For a simple open-text question, supply the short topic with --title, the required sentence with --subtitle, and pipe the markdown body on stdin. Use --context-file for a fully structured deck; its deck title and every interaction title and subtitle are required. The deck body is directive-flavored markdown rendered by termrender (panels, columns, trees, callouts, mermaid) — see `termrender doc -h` for the directive set before authoring one. Ask only what materially changes your next step, and offer genuine alternatives as `options`.',
118
+ summary: "submit a decision ticket to crouter's inbox; returns a job handle immediately.",
119
+ guide: 'Write every interaction as a self-contained decision brief for a supervisor who has not followed this agent or task: use the title to identify the inbox topic; write a one-sentence subtitle stating the decision, your recommendation, and what it changes; then give the minimum plain-language context and tradeoffs needed to decide in the body. Never coin a term, code name, or shorthand for a system, mechanism, or state, and expand any project-internal name you do use: name the thing plainly and say what it does. Invented vocabulary is not compression — the reader has to decode it before they can decide. Put supporting evidence, chronology, and technical detail under `## Details` so the person can answer without logs, screenshots, or prior conversation. For a simple open-text question, supply the short topic with --title, the required sentence with --subtitle, and pipe the markdown body on stdin. Use --context-file for a fully structured deck; its deck title and every interaction title and subtitle are required. The deck body is directive-flavored markdown rendered by termrender (panels, columns, trees, callouts, mermaid) — see `crtr human doc check` before authoring one. Ask only what materially changes your next step, and offer genuine alternatives as `options`.',
166
120
  params: [
167
121
  { kind: 'flag', name: 'title', type: 'string', required: false, constraint: 'Required with stdin: a short ≤~4-word inbox topic. Mutually exclusive with --context-file, whose JSON carries its own required title.' },
168
122
  { kind: 'flag', name: 'subtitle', type: 'string', required: false, constraint: 'Required with stdin: one plain-English sentence stating the decision, recommendation, and stakes. Mutually exclusive with --context-file, whose JSON requires every interaction subtitle.' },
@@ -176,8 +130,8 @@ export const humanAsk = defineLeaf({
176
130
  ],
177
131
  outputKind: 'object',
178
132
  effects: [
179
- 'Creates a kind:"human" node under you and enqueues a decision deck in the humanloop inbox.',
180
- `Returns immediately; nothing opens on screen. The human answers from the inbox popup (${inboxPopupHint()}) on their own time.`,
133
+ 'Creates a kind:"human" node under you and enqueues a decision deck in the human inbox.',
134
+ `Returns immediately; nothing opens on screen. The human answers from the inbox (${inboxHint()}) on their own time.`,
181
135
  ],
182
136
  },
183
137
  run: async (input, context) => {
@@ -228,125 +182,20 @@ export const humanAsk = defineLeaf({
228
182
  }
229
183
  // Crouter owns this provenance. Never synthesize labels from deck content:
230
184
  // an unavailable daemon leaves only machine attribution for routing.
231
- deck = { ...deck, source: { ...await sourceStamp(), visual: 'humanloop.visual/v1' } };
185
+ deck = { ...deck, source: await sourceStamp() };
232
186
  const cwd = process.cwd();
233
187
  const jobId = (await cliClient().createHumanBridge({ kind: 'human', parent: askingNode(), cwd, name: 'human-ask' })).node_id;
234
- const idir = nodeDir(jobId);
235
- mkdirSync(idir, { recursive: true });
188
+ const idir = ticketDir(jobId);
236
189
  const rc = { mode: 'ask', job_id: jobId };
237
- const capturedAt = new Date().toISOString();
238
- const originNodeId = askingNode();
239
- if (originNodeId === null) {
240
- rc.conversation_fork = { status: 'unavailable', reason: 'no_origin', captured_at: capturedAt };
241
- }
242
- else {
243
- try {
244
- const coordinates = await getHumanForkCoordinates(originNodeId);
245
- assertHumanForkCoordinates(coordinates);
246
- // Loaded on demand: session-branch pulls pi's SessionManager, whose
247
- // module graph costs ~385ms. Only a conversation fork needs it, so a
248
- // static import would charge that to EVERY `crtr human` invocation.
249
- const { materializeSessionBranchAt } = await import('../../core/runtime/session-branch.js');
250
- materializeSessionBranchAt(coordinates, join(idir, 'branch-point.jsonl'));
251
- rc.conversation_fork = {
252
- status: 'ready',
253
- source_node_id: originNodeId,
254
- source_file: coordinates.sourceFile,
255
- source_session_id: coordinates.sourceSessionId,
256
- leaf_id: coordinates.leafId,
257
- model_spec: coordinates.modelSpec,
258
- branch_point: 'branch-point.jsonl',
259
- captured_at: new Date().toISOString(),
260
- };
261
- }
262
- catch (err) {
263
- const reason = err instanceof BrokerUnavailableError
264
- ? 'broker_unavailable'
265
- : err instanceof InvalidHumanForkCoordinatesError
266
- ? 'invalid_coordinates'
267
- : err instanceof InvalidHumanForkModelError
268
- ? 'invalid_model'
269
- : 'materialization_failed';
270
- rc.conversation_fork = {
271
- status: 'unavailable',
272
- reason,
273
- detail: unavailableForkDetail(err),
274
- captured_at: capturedAt,
275
- };
276
- }
277
- }
278
190
  atomicWriteJson(join(idir, 'run.json'), rc);
279
- const root = registerCrouterRoot();
280
- const { dir } = submitDeck({ root, id: jobId, deck });
191
+ const { dir } = submitDeck({ dir: ticketDir(jobId), deck });
192
+ const originNodeId = askingNode();
281
193
  if (originNodeId !== null && originNodeId !== '')
282
194
  markStopSignal(originNodeId, 'askedHuman');
283
195
  return { job_id: jobId, dir, follow_up: queuedFollowUp() };
284
196
  },
285
197
  });
286
198
  // ---------------------------------------------------------------------------
287
- // review
288
- // ---------------------------------------------------------------------------
289
- export const humanReview = defineLeaf({
290
- name: 'review',
291
- description: 'collect anchored comments on a document or source file',
292
- whenToUse: 'a human should comment line-by-line on a document rather than give one overall answer: reviewing a plan or spec before you build it, marking up a draft, flagging specific sections to change. The comments come back anchored to the lines they touch. Use `ask` instead for a single yes/no sign-off on the whole thing, or to pose a discrete choice',
293
- help: {
294
- name: 'human review',
295
- summary: "queue a .md artifact or a source file for anchored, line-by-line human comments; returns a job handle instantly (a non-blocking kickoff, like ask). The human opens it from the inbox popup, which previews the live doc and re-reads it on every save, so edit in place rather than re-presenting.",
296
- guide: `A kickoff, not a blocking call: it returns at once and the human reviews on their own time from the inbox (${inboxPopupHint()}). When they submit, the FeedbackResult (anchored comments, plus any line edits they made) is pushed to your inbox — waking you — and autosaved to \`output\`. The inbox preview is a LIVE view of the file: keep editing it in place and it updates, so do not cancel and re-present to show a change. Write the subtitle and the document itself in plain words: no coined terms or internal shorthand for a system or concept — name it and explain what it does, with enough context for someone who has not followed this work. A .md file is directive-flavored markdown rendered by termrender (panels, columns, trees, callouts, mermaid) — see \`termrender doc -h\` for the directive set before authoring one. Any other UTF-8 text file (a .ts/.py/.sql source) is reviewed as a syntax-highlighted source panel anchored to its real line numbers; limits are 2 MB and 5,000 lines.`,
297
- params: [
298
- { kind: 'positional', name: 'file', type: 'path', required: true, constraint: 'Absolute path to an existing UTF-8 text file: a .md artifact, or a source file to review as code.' },
299
- { kind: 'flag', name: 'subtitle', type: 'string', required: true, constraint: 'One plain-English sentence stating what review feedback is needed and why it matters.' },
300
- { kind: 'flag', name: 'output', type: 'path', required: false, constraint: 'Where the FeedbackResult JSON is written. Default: <dir>/feedback.json.' },
301
- ],
302
- output: [
303
- { name: 'job_id', type: 'string', required: true, constraint: 'Node id of the kind:"human" node backing this review. Its FeedbackResult is pushed to your inbox when the human submits.' },
304
- { name: 'dir', type: 'string', required: true, constraint: 'Interaction directory holding run.json and the autosaved feedback.json.' },
305
- { name: 'output', type: 'string', required: true, constraint: 'Path the FeedbackResult JSON is autosaved to when the human submits.' },
306
- { name: 'follow_up', type: 'string', required: true, constraint: 'A non-blocking status peek; comments arrive via your inbox when the human submits.' },
307
- ],
308
- outputKind: 'object',
309
- effects: [
310
- 'Creates a kind:"human" node under you and enqueues an anchored review in the humanloop inbox.',
311
- `Returns immediately; nothing opens on screen. The human reviews from the inbox popup (${inboxPopupHint()}); comments fan into your inbox when they submit.`,
312
- ],
313
- },
314
- run: async (input) => {
315
- const fileArg = input['file'];
316
- const abs = resolve(fileArg);
317
- if (!existsSync(abs)) {
318
- throw new InputError({
319
- error: 'file_not_found',
320
- message: `file not found: ${abs}`,
321
- field: 'file',
322
- next: 'Provide an absolute path to an existing file.',
323
- });
324
- }
325
- const subtitle = requireSubtitle(input['subtitle']);
326
- const cwd = process.cwd();
327
- const jobId = (await cliClient().createHumanBridge({ kind: 'human', parent: askingNode(), cwd, name: 'human-review' })).node_id;
328
- const idir = nodeDir(jobId);
329
- mkdirSync(idir, { recursive: true });
330
- const rc = { mode: 'review', job_id: jobId };
331
- atomicWriteJson(join(idir, 'run.json'), rc);
332
- const outputArg = input['output'];
333
- const root = registerCrouterRoot();
334
- const { dir } = submitReview({
335
- root,
336
- id: jobId,
337
- review: {
338
- file: abs,
339
- ...(outputArg !== undefined ? { output: resolve(outputArg) } : {}),
340
- title: abs.split('/').pop() ?? abs,
341
- subtitle,
342
- source: await sourceStamp(),
343
- },
344
- });
345
- const output = outputArg !== undefined ? resolve(outputArg) : join(dir, 'feedback.json');
346
- return { job_id: jobId, dir, output, follow_up: queuedFollowUp() };
347
- },
348
- });
349
- // ---------------------------------------------------------------------------
350
199
  // notify (no job)
351
200
  // ---------------------------------------------------------------------------
352
201
  export const humanNotify = defineLeaf({
@@ -356,14 +205,14 @@ export const humanNotify = defineLeaf({
356
205
  help: {
357
206
  name: 'human notify',
358
207
  summary: 'enqueue a fire-and-forget acknowledgement in the human inbox; creates no job',
359
- guide: 'State what happened in plain words — no coined terms or internal shorthand for a system or concept; name it and say what it does. The body is directive-flavored markdown rendered by termrender (panels, columns, trees, callouts, mermaid) — see `termrender doc -h` for the directive set before authoring one.',
208
+ guide: 'State what happened in plain words — no coined terms or internal shorthand for a system or concept; name it and say what it does. The body is directive-flavored markdown rendered by termrender (panels, columns, trees, callouts, mermaid) — see `crtr human doc check` before authoring one.',
360
209
  params: [
361
210
  { kind: 'positional', name: 'title', type: 'string', required: true, constraint: 'The notification headline.' },
362
211
  { kind: 'flag', name: 'subtitle', type: 'string', required: true, constraint: 'One plain-English sentence stating the notification status and stakes.' },
363
212
  { kind: 'flag', name: 'body', type: 'string', required: false, constraint: 'Optional markdown body.' },
364
213
  ],
365
214
  output: [
366
- { name: 'queued', type: 'boolean', required: true, constraint: 'Always true — the notify deck is durable inbox state the human acknowledges from the popup.' },
215
+ { name: 'queued', type: 'boolean', required: true, constraint: 'Always true — the notify deck is durable inbox state the human acknowledges from the inbox.' },
367
216
  { name: 'dir', type: 'string', required: true, constraint: 'Interaction directory holding deck.json.' },
368
217
  ],
369
218
  outputKind: 'object',
@@ -378,12 +227,10 @@ export const humanNotify = defineLeaf({
378
227
  let deck = notifyDeck(title, { subtitle, ...(body !== undefined ? { body } : {}) });
379
228
  deck = { ...deck, source: await sourceStamp() };
380
229
  const id = `nfy-${randomBytes(4).toString('hex')}`;
381
- const idir = nodeDir(id);
382
- mkdirSync(idir, { recursive: true });
230
+ const idir = ticketDir(id);
383
231
  const rc = { mode: 'notify' };
384
232
  atomicWriteJson(join(idir, 'run.json'), rc);
385
- const root = registerCrouterRoot();
386
- const { dir } = submitDeck({ root, id, deck });
233
+ const { dir } = submitDeck({ dir: ticketDir(id), deck });
387
234
  return { queued: true, dir };
388
235
  },
389
236
  });
@@ -398,8 +245,8 @@ export const humanShow = defineLeaf({
398
245
  whenToUse: 'displaying a doc on screen while a human comments',
399
246
  help: {
400
247
  name: 'human show',
401
- summary: 'put a file live on screen in a tmux pane via humanloop display',
402
- guide: 'The pane always watches the file and live-updates on every save — a displayed doc is a live view by definition, so point it at a file something keeps rewriting (a status board, a running summary) and it stays current. The file is directive-flavored markdown rendered by termrender (panels, columns, trees, callouts, mermaid) — see `termrender doc -h` for the directive set before authoring one.',
248
+ summary: "put a file live on screen in a tmux pane with crouter's renderer",
249
+ guide: 'The pane always watches the file and live-updates on every save — a displayed doc is a live view by definition, so point it at a file something keeps rewriting (a status board, a running summary) and it stays current. The file is directive-flavored markdown rendered by termrender (panels, columns, trees, callouts, mermaid) — see `crtr human doc render` before authoring one.',
403
250
  params: [
404
251
  { kind: 'positional', name: 'path', type: 'path', required: true, constraint: 'Path to the file to render.' },
405
252
  { kind: 'flag', name: 'window', type: 'enum', choices: ['auto', 'split', 'new'], required: false, default: 'auto', constraint: 'Placement. Default auto.' },
@@ -416,7 +263,7 @@ export const humanShow = defineLeaf({
416
263
  const windowArg = input['window'];
417
264
  const window = windowArg !== undefined ? windowArg : 'auto';
418
265
  // `human show` must never fail the caller: any display error degrades to
419
- // {pane_id:null, reason} with exit 0 (matches humanloop display semantics).
266
+ // {pane_id:null, reason} with exit 0 (matches crouter renderer display semantics).
420
267
  let paneId;
421
268
  try {
422
269
  const r = display(path, { window, maxPanes: resolveMaxPanes() });
@@ -1,4 +1,4 @@
1
- import type { Deck, InteractionResponse } from '@crouton-kit/humanloop';
1
+ import type { Deck, InteractionResponse } from '../../core/human/types.js';
2
2
  export declare const humanList: import("../../core/command.js").LeafDef;
3
3
  export declare const humanDeck: import("../../core/command.js").LeafDef;
4
4
  /** Pure core of {@link coerceSingleSelect}, split out so it is testable without
@@ -6,7 +6,3 @@ export declare const humanDeck: import("../../core/command.js").LeafDef;
6
6
  export declare function coerceSingleSelectAgainst(responses: InteractionResponse[], deck: Deck): InteractionResponse[];
7
7
  export declare const humanResolve: import("../../core/command.js").LeafDef;
8
8
  export declare const humanCancel: import("../../core/command.js").LeafDef;
9
- export declare const humanDeliver: import("../../core/command.js").LeafDef;
10
- export declare const humanConsult: import("../../core/command.js").LeafDef;
11
- export declare const humanVisual: import("../../core/command.js").LeafDef;
12
- export declare const humanFocus: import("../../core/command.js").LeafDef;