@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
@@ -3,30 +3,25 @@
3
3
  //
4
4
  // A node's editor label is `<mode-icon> <name> <kind>` (see editorLabel in
5
5
  // labels.ts). The `<name>` is a 3-8 word kebab-case "description" derived from
6
- // the first prompt by asking pi headlessly (`pi -p`), persisted on the node's
7
- // meta so it survives revives and updates the live session name.
6
+ // the first prompt by asking Pi headlessly, persisted on the node's meta so it
7
+ // survives revives and updates the live session name.
8
8
  //
9
9
  // The namer returns a STRUCTURED result — {name, icon} — produced by constrained
10
- // sampling against the `name_session` tool in `pi-extensions/naming-tool.ts`,
11
- // not by parsing prose. The icon is a Nerd Font glyph the model picks freely
10
+ // sampling through the one-shot `name_session` tool, not by parsing prose. The
11
+ // icon is a Nerd Font glyph the model picks freely
12
12
  // (guided by example blocks, not a closed enum) and is stored as its own meta
13
13
  // field, so each surface decides whether to render it.
14
14
  //
15
- // One entry point: generateAndPersistName — async (execFile, non-blocking).
15
+ // One entry point: generateAndPersistName — async and non-blocking.
16
16
  // Naming happens INSIDE the named node's own pi process, off the first real
17
17
  // message (the kickoff task or a human's first line), never on the spawn path:
18
- // blocking spawn on an LLM round-trip used to freeze the caller's terminal for
19
- // 2-3s on every `crtr node new`. The headless namer runs with --no-extensions,
20
- // so it loads no canvas hooks and can never recurse into another spawn/name.
18
+ // the one-shot runs asynchronously, so it delays only its eventual label. The
19
+ // headless namer loads only provider rotation, so it carries no canvas hooks and
20
+ // cannot recurse into spawn/name.
21
21
  //
22
22
  // Best-effort: a failed/slow/garbled pi call falls back to a local slug of the
23
23
  // prompt, so a node always gets a sane name.
24
- import { execFile } from 'node:child_process';
25
- import { mkdtempSync, readFileSync, rmSync } from 'node:fs';
26
- import { tmpdir } from 'node:os';
27
- import { join } from 'node:path';
28
- import { bundledPiSubprocessEnv, resolveBundledPiCliPath } from './pi-cli.js';
29
- import { NAMING_TOOL_PATH } from './canvas-extensions.js';
24
+ import { headlessText, headlessToolCall } from './headless-pi.js';
30
25
  import { defaultProvider, modelLadders, stripThinkingSuffix } from './model-selection.js';
31
26
  /** Cap on prompt text fed to the namer — a name needs only the gist. */
32
27
  const PROMPT_CAP = 2000;
@@ -76,12 +71,12 @@ const NAME_SYSTEM_PROMPT = 'You name coding-agent work sessions. The name is a l
76
71
  'is actually about something.\n\n' +
77
72
  'Generic fallback set, by kind of work:\n' +
78
73
  ICON_EXAMPLES;
79
- /** Put the raw task text FIRST in a delimited block, then the instruction, so the
80
- * model reads the content before being told what to do and never mistakes the
81
- * prompt's own text for the instruction. The prompt is capped first, so the
82
- * closing tag is always present. */
83
- function nameUserPrompt(prompt) {
84
- return `<prompt>\n${prompt.slice(0, PROMPT_CAP)}\n</prompt>\n\nName this session based on the task above, and pick an icon depicting it. Call \`name_session\` once, then stop.`;
74
+ /** Put the source text FIRST in a delimited block, then the instruction, so the
75
+ * model reads the work before being told what to do and never mistakes source
76
+ * text for the instruction. The source is capped first, so the closing tag is
77
+ * always present. */
78
+ function nameUserPrompt(source, sourceCap = PROMPT_CAP) {
79
+ return `<source>\n${source.slice(0, sourceCap)}\n</source>\n\nName this session based on the work described above, and pick an icon depicting it. Call \`name_session\` once, then stop.`;
85
80
  }
86
81
  /** A short stop-word set so the local-slug fallback skips filler words. */
87
82
  const STOPWORDS = new Set([
@@ -114,63 +109,43 @@ export function slugFromPrompt(prompt) {
114
109
  return sanitizeSessionName(picked.join('-')) || 'session';
115
110
  }
116
111
  /** The namer's model: the `light` rung of the DEFAULT provider's ladder, with
117
- * any thinking suffix stripped (we pass `--thinking off` explicitly — naming is
118
- * a trivial classification that never needs a reasoning budget). Reading the
119
- * ladder rather than pinning a concrete model id keeps naming working for a
112
+ * any thinking suffix stripped because the one-shot session uses thinking off.
113
+ * Reading the ladder rather than pinning a concrete model id keeps naming working for a
120
114
  * user who never configured Anthropic: an OpenAI default provider resolves to
121
115
  * its own light rung. `CRTR_NAME_MODEL` still overrides. */
122
- function nameModel() {
123
- const override = process.env['CRTR_NAME_MODEL'];
116
+ export function lightModel(overrideEnv) {
117
+ const override = overrideEnv === undefined ? undefined : process.env[overrideEnv];
124
118
  if (override !== undefined && override.trim() !== '')
125
119
  return override.trim();
126
120
  const ladders = modelLadders();
127
121
  return stripThinkingSuffix(ladders[defaultProvider(ladders)].light);
128
122
  }
129
- /** The pi argv for a headless TEXT request (issue titles). Stripped down (no
130
- * tools, session, context files, extensions, skills, templates, themes) so
131
- * it's fast and side-effect free. */
132
- function piTextArgs(systemPrompt, userPrompt) {
133
- const model = nameModel();
134
- return [
135
- '-p',
136
- '--no-session',
137
- '--no-context-files',
138
- '--no-extensions',
139
- '--no-skills',
140
- '--no-prompt-templates',
141
- '--no-themes',
142
- '--no-tools',
143
- '--mode', 'text',
144
- // A trivial one-line classification — no thinking budget, ever.
145
- '--thinking', 'off',
146
- '--model', model,
147
- '--system-prompt', systemPrompt,
148
- userPrompt,
149
- ];
150
- }
151
- /** The pi argv for a headless STRUCTURED name request: same stripped-down run,
152
- * but with the naming tool loaded explicitly (`-e` still works under
153
- * `--no-extensions`) and the tool allowlist narrowed to it, so the model's only
154
- * possible action is one constrained-schema emission. */
155
- function nameArgs(prompt) {
156
- return [
157
- '-p',
158
- '--no-session',
159
- '--no-context-files',
160
- '--no-extensions',
161
- '--no-skills',
162
- '--no-prompt-templates',
163
- '--no-themes',
164
- '-e', NAMING_TOOL_PATH,
165
- '--tools', 'name_session',
166
- '--mode', 'text',
167
- // A trivial one-shot classification — no thinking budget, ever.
168
- '--thinking', 'off',
169
- '--model', nameModel(),
170
- '--system-prompt', NAME_SYSTEM_PROMPT,
171
- nameUserPrompt(prompt),
172
- ];
123
+ function nameModelRequest() {
124
+ const override = process.env['CRTR_NAME_MODEL'];
125
+ if (override !== undefined && override.trim() !== '')
126
+ return { modelSpec: override.trim() };
127
+ const ladders = modelLadders();
128
+ const provider = defaultProvider(ladders);
129
+ return {
130
+ modelSpec: stripThinkingSuffix(ladders[provider].light),
131
+ modelIntent: `${provider}/light`,
132
+ };
173
133
  }
134
+ const NAME_SESSION_SCHEMA = {
135
+ type: 'object',
136
+ properties: {
137
+ name: {
138
+ type: 'string',
139
+ description: 'A 3-8 word kebab-case session name: lowercase words joined by single hyphens, e.g. refactor-auth-token-flow. No punctuation, quotes, or prose.',
140
+ },
141
+ icon: {
142
+ type: 'string',
143
+ description: 'The Nerd Font glyph depicting this session, as a codepoint in U+XXXX form (e.g. U+F188).',
144
+ },
145
+ },
146
+ required: ['name', 'icon'],
147
+ additionalProperties: false,
148
+ };
174
149
  /** Normalize a model-supplied icon to a single renderable glyph, or '' when
175
150
  * nothing usable came back.
176
151
  *
@@ -206,64 +181,41 @@ export function sanitizeIcon(raw) {
206
181
  return '';
207
182
  return points[0].codePointAt(0) >= 0x2000 ? trimmed : '';
208
183
  }
209
- /** Ask pi headlessly for a structured {name, icon} for `body`, async. Resolves
210
- * to a sanitized SessionName, or `{name:'',icon:''}` on any failure (non-zero
211
- * exit, timeout, no tool call, garbled emission) so the caller can fall back to
212
- * a local slug. Owns the subprocess mechanics — crucially it hands pi an
213
- * immediate stdin EOF: `pi -p` reads stdin, and execFile's default stdin is an
214
- * OPEN pipe that never closes, so without this pi blocks waiting for EOF and
215
- * the call exits non-zero (the regression that silently lost every LLM name to
216
- * the slug fallback).
184
+ /** Ask Pi headlessly for a structured {name, icon} for `body`, async. Resolves
185
+ * to a sanitized SessionName, or `{name:'',icon:''}` on timeout, a missing tool
186
+ * call, or a malformed emission so the caller can fall back to a local slug.
217
187
  *
218
188
  * Exported (not just for tests): the canvas-coupled persistence wrapper
219
189
  * generateAndPersistName lives in naming-persist.ts to keep this module
220
190
  * canvas-free, and imports this pure helper. */
221
- export function headlessName(body) {
191
+ export async function headlessName(body, sourceCap = PROMPT_CAP) {
222
192
  const empty = { name: '', icon: '' };
223
- return new Promise((resolve) => {
224
- let dir = null;
225
- try {
226
- dir = mkdtempSync(join(tmpdir(), 'crtr-name-'));
227
- const resultFile = join(dir, 'name.json');
228
- const done = (value) => {
229
- if (dir !== null) {
230
- try {
231
- rmSync(dir, { recursive: true, force: true });
232
- }
233
- catch { /* temp */ }
234
- }
235
- resolve(value);
236
- };
237
- const child = execFile(process.execPath, [resolveBundledPiCliPath(), ...nameArgs(body)], {
238
- encoding: 'utf8',
239
- timeout: NAME_TIMEOUT_MS,
240
- env: { ...bundledPiSubprocessEnv(), CRTR_NAME_RESULT_FILE: resultFile },
241
- }, () => {
242
- // The tool call is the ONLY channel: a non-zero exit still counts when
243
- // the emission already landed (pi print-mode can exit oddly after a
244
- // terminating tool), and a clean exit without the file is a failure.
245
- try {
246
- const parsed = JSON.parse(readFileSync(resultFile, 'utf8'));
247
- const name = sanitizeSessionName(typeof parsed['name'] === 'string' ? parsed['name'] : '');
248
- const icon = sanitizeIcon(typeof parsed['icon'] === 'string' ? parsed['icon'] : '');
249
- done(name !== '' ? { name, icon } : empty);
250
- }
251
- catch {
252
- done(empty);
253
- }
254
- });
255
- child.stdin?.end(); // immediate EOF — see the doc above
256
- }
257
- catch {
258
- if (dir !== null) {
259
- try {
260
- rmSync(dir, { recursive: true, force: true });
261
- }
262
- catch { /* temp */ }
263
- }
264
- resolve(empty);
265
- }
193
+ const route = nameModelRequest();
194
+ const emitted = await headlessToolCall({
195
+ systemPrompt: NAME_SYSTEM_PROMPT,
196
+ userPrompt: nameUserPrompt(body, sourceCap),
197
+ ...route,
198
+ timeoutMs: NAME_TIMEOUT_MS,
199
+ tool: {
200
+ name: 'name_session',
201
+ label: 'Name session',
202
+ description: 'Record the name and icon for this coding session. Call exactly once, then stop.',
203
+ parameters: NAME_SESSION_SCHEMA,
204
+ constrainedSampling: { type: 'json_schema', strict: 'prefer' },
205
+ },
266
206
  });
207
+ if (emitted === null || typeof emitted !== 'object')
208
+ return empty;
209
+ const parsed = emitted;
210
+ const name = sanitizeSessionName(typeof parsed['name'] === 'string' ? parsed['name'] : '');
211
+ const icon = sanitizeIcon(typeof parsed['icon'] === 'string' ? parsed['icon'] : '');
212
+ return name !== '' ? { name, icon } : empty;
213
+ }
214
+ /** Generate a name from a bounded conversation source rather than a single
215
+ * kickoff message. The caller owns selecting representative conversation text;
216
+ * this cap keeps the one-shot prompt compact. */
217
+ export function headlessNameFromConversation(conversation) {
218
+ return headlessName(conversation, 30_000);
267
219
  }
268
220
  // ---------------------------------------------------------------------------
269
221
  // Issue titles — turn a free-text todo/idea/bug note into a short, human-readable
@@ -293,25 +245,24 @@ export function titleSlug(title) {
293
245
  .filter((w) => w !== '');
294
246
  return words.slice(0, 8).join('-') || 'untitled';
295
247
  }
296
- /** Ask pi headlessly for a one-line issue title for `note`. Resolves to the
297
- * generated title, or a local first-line fallback on any failure (non-zero
298
- * exit, timeout, empty output). Async; never throws. */
299
- export function generateIssueTitle(note) {
248
+ /** Ask Pi headlessly for a one-line issue title for `note`. Resolves to the
249
+ * generated title, or a local first-line fallback on timeout or empty output.
250
+ * Async; never throws. */
251
+ export async function generateIssueTitle(note) {
300
252
  const body = (note ?? '').trim();
301
253
  if (body === '')
302
- return Promise.resolve('untitled');
303
- return new Promise((resolve) => {
304
- try {
305
- const child = execFile(process.execPath, [resolveBundledPiCliPath(), ...piTextArgs(TITLE_SYSTEM_PROMPT, titleUserPrompt(body))], { encoding: 'utf8', timeout: NAME_TIMEOUT_MS, env: bundledPiSubprocessEnv() }, (err, stdout) => {
306
- if (err || typeof stdout !== 'string')
307
- return resolve(firstLineTitle(body));
308
- const t = stdout.trim().split('\n').map((l) => l.trim()).find((l) => l !== '') ?? '';
309
- resolve(t !== '' ? t.replace(/^["']|["']$/g, '').replace(/\.$/, '') : firstLineTitle(body));
310
- });
311
- child.stdin?.end(); // immediate EOF — pi -p reads stdin (see headlessName)
312
- }
313
- catch {
314
- resolve(firstLineTitle(body));
315
- }
316
- });
254
+ return 'untitled';
255
+ try {
256
+ const reply = await headlessText({
257
+ systemPrompt: TITLE_SYSTEM_PROMPT,
258
+ userPrompt: titleUserPrompt(body),
259
+ ...nameModelRequest(),
260
+ timeoutMs: NAME_TIMEOUT_MS,
261
+ });
262
+ const title = reply.split('\n').map((line) => line.trim()).find((line) => line !== '') ?? '';
263
+ return title !== '' ? title.replace(/^["']|["']$/g, '').replace(/\.$/, '') : firstLineTitle(body);
264
+ }
265
+ catch {
266
+ return firstLineTitle(body);
267
+ }
317
268
  }
@@ -8,17 +8,18 @@
8
8
  // and were imported into the handlers from there; Stage B-3 relocated them here
9
9
  // so the CLI leaves' import graph reaches no canvas state store (spec §1/§10).
10
10
  import { copyFileSync, existsSync, mkdtempSync, readFileSync, rmSync } from 'node:fs';
11
+ import { readJsonIfExists } from '../fs-utils.js';
11
12
  import { tmpdir } from 'node:os';
12
13
  import { basename, join } from 'node:path';
13
14
  import { InputError } from '../io.js';
14
15
  import { fullName, getNode } from '../canvas/index.js';
15
16
  import { jobDir, nodeDir, sessionPtrPath } from '../canvas/paths.js';
16
17
  import { SessionManager } from './broker-sdk.js';
17
- import { piAgentDir } from './package-health.js';
18
+ import { openModelRegistry } from './model-registry.js';
18
19
  import { BUILTIN_SLASH_COMMANDS } from './pi-vendored.js';
19
20
  import { cycleAwareMessages } from './session-cycles.js';
20
- import { ModelRegistry, ModelRuntime } from '@earendil-works/pi-coding-agent';
21
- import { PoolCredentialStore } from '../pool-credential-store.js';
21
+ import { visibleMessages } from './session-visibility.js';
22
+ import { normalizeToolGroupSummaryRecord } from '../../shared/tool-groups.js';
22
23
  /** A session `.jsonl` records only `{ provider, modelId }` — pi never persists a
23
24
  * whole `Model`. Resolve it back through pi's own registry so a dormant
24
25
  * snapshot's `state.model` is the SAME `Model` a live broker's `get_state`
@@ -35,12 +36,7 @@ async function resolveRecordedModel(recorded) {
35
36
  if (recorded === null)
36
37
  return undefined;
37
38
  try {
38
- const agentDir = piAgentDir();
39
- const runtime = await ModelRuntime.create({
40
- credentials: new PoolCredentialStore(join(agentDir, 'auth.json')),
41
- modelsPath: join(agentDir, 'models.json'),
42
- });
43
- return new ModelRegistry(runtime).find(recorded.provider, recorded.modelId);
39
+ return (await openModelRegistry()).find(recorded.provider, recorded.modelId);
44
40
  }
45
41
  catch {
46
42
  return undefined;
@@ -131,6 +127,15 @@ function readIfPresent(path) {
131
127
  return null;
132
128
  }
133
129
  }
130
+ function readToolGroupSummaries(nodeId) {
131
+ try {
132
+ const raw = readJsonIfExists(join(jobDir(nodeId), 'tool-summaries.json'));
133
+ return normalizeToolGroupSummaryRecord(raw);
134
+ }
135
+ catch {
136
+ return {};
137
+ }
138
+ }
134
139
  /** Reconstruct a persisted session without launching its broker. Backs the
135
140
  * machine-readable snapshot endpoint and the human transcript render. */
136
141
  export async function readNodeSnapshot(nodeId) {
@@ -148,7 +153,7 @@ export async function readNodeSnapshot(nodeId) {
148
153
  copyFileSync(sessionFile, copy);
149
154
  const manager = SessionManager.open(copy);
150
155
  const context = manager.buildSessionContext();
151
- const messages = cycleAwareMessages(manager);
156
+ const messages = visibleMessages(cycleAwareMessages(manager), { reviewCompanion: node.review_binding != null });
152
157
  const sessionId = manager.getSessionId();
153
158
  const sessionName = manager.getSessionName();
154
159
  const snapshot = {
@@ -175,6 +180,10 @@ export async function readNodeSnapshot(nodeId) {
175
180
  // process state (last setStatus/setWidget/setTitle) and is not persisted,
176
181
  // so an offline read has none.
177
182
  display: { statuses: {}, widgets: {}, title: undefined },
183
+ // Sidecar summaries survive broker exit so a dormant transcript receives
184
+ // the same completed-group data as a live welcome snapshot. Malformed or
185
+ // absent sidecars are deliberately ignored: tool calls remain visible.
186
+ toolGroupSummaries: readToolGroupSummaries(nodeId),
178
187
  };
179
188
  return {
180
189
  nodeId,
@@ -1,4 +1,4 @@
1
- import { type NodeMeta, type Mode, type Lifecycle, type LaunchSpec, type ManagedWorktree, type HumanWorkTarget, type PrivateForkPhase, type PrivateForkRecipe } from '../canvas/index.js';
1
+ import { type NodeMeta, type Mode, type Lifecycle, type LaunchSpec, type ManagedWorktree, type ReviewBinding } from '../canvas/index.js';
2
2
  /** Explicitly set the resolved install id. crtrd calls this once at boot,
3
3
  * immediately after `resolveInstallId()` — see crtrd.ts — so a provisioning
4
4
  * mismatch fails the daemon loudly at STARTUP rather than lazily on first
@@ -70,14 +70,12 @@ export interface SpawnNodeOpts {
70
70
  * the boot intro can re-assert this node's OWN identity over the source's
71
71
  * copied-in conversation. Omit for a fresh node. */
72
72
  forkFrom?: string | null;
73
- /** Immutable private-human-work binding. Omit for every ordinary node. */
74
- humanWorkTarget?: HumanWorkTarget | null;
75
- /** Explicit private-fork birth phase. Set with `privateForkRecipe` only for a
76
- * lifecycle-owned human-work child. */
77
- privateForkPhase?: PrivateForkPhase | null;
78
- /** Immutable one-shot kickoff consumed only while `privateForkPhase` is
79
- * `fork_pending`; the recipe remains persisted after session bind for audit. */
80
- privateForkRecipe?: PrivateForkRecipe | null;
73
+ /** Suppress the spawn-time parent→child ACTIVE subscription. Default true
74
+ * (every existing caller keeps its edge). False gives ordinary canvas
75
+ * placement with no wake path back to the parent. */
76
+ subscribe?: boolean;
77
+ /** Immutable review-companion provenance. Omit for every ordinary node. */
78
+ reviewBinding?: ReviewBinding | null;
81
79
  /** New subscriptions this node opens default to passive when true. */
82
80
  passiveDefault?: boolean;
83
81
  /** Resolved pi launch recipe (from resolve(kind,mode)). */
@@ -96,12 +94,9 @@ export interface SpawnNodeOpts {
96
94
  profile_id?: string | null;
97
95
  /** Managed worktree already created for this node, if any. */
98
96
  managedWorktree?: ManagedWorktree;
99
- /** Keep a private human-work child inert until its request has been rechecked
100
- * and `reviveNode()` authorizes its one lifecycle-owned launch. */
101
- initialStatus?: 'canceled';
102
97
  /** Override the generated id — either an internally pre-allocated id
103
- * (worktree naming, private-fork births; always valid+fresh) or an
104
- * external caller's explicit id (`--node-id`), which is format-validated
98
+ * (worktree naming; always valid+fresh) or an external caller's explicit id
99
+ * (`--node-id`), which is format-validated
105
100
  * and duplicate-rejected (`NodeIdConflictError`) here. */
106
101
  nodeId?: string;
107
102
  }
@@ -14,7 +14,6 @@
14
14
  // is also recorded.
15
15
  import { randomBytes } from 'node:crypto';
16
16
  import { mkdirSync } from 'node:fs';
17
- import { isAbsolute } from 'node:path';
18
17
  import { createNode, getNode, getRow, subscribe, recordSpawn, contextDir, } from '../canvas/index.js';
19
18
  import { memoryDir } from './memory.js';
20
19
  import { resolveInstallId } from '../canvas/install-id.js';
@@ -207,59 +206,12 @@ export function nodeEnv(meta) {
207
206
  // Merge any launch-spec env last (it may override / extend).
208
207
  return { ...env, ...(meta.launch?.env ?? {}) };
209
208
  }
210
- // ---------------------------------------------------------------------------
211
- // Birth
212
- // ---------------------------------------------------------------------------
213
- function isHumanWorkTarget(value) {
214
- if (value === null || typeof value !== 'object')
215
- return false;
216
- const target = value;
217
- return ((target.work_kind === 'follow_up' || target.work_kind === 'visual') &&
218
- typeof target.dir === 'string' && target.dir !== '' &&
219
- typeof target.request_id === 'string' && target.request_id !== '' &&
220
- typeof target.root === 'string' && target.root !== '');
221
- }
222
- /** Refuse malformed private claims before createNode leaves a durable half-node.
223
- * This is intentionally private to the lifecycle-owned human-work birth API;
224
- * ordinary spawn callers do not acquire a second generic validation surface. */
225
- function validatePrivateForkBirth(opts) {
226
- const hasTarget = opts.humanWorkTarget != null;
227
- const hasPhase = opts.privateForkPhase != null;
228
- const hasRecipe = opts.privateForkRecipe != null;
229
- if (!hasTarget && !hasPhase && !hasRecipe) {
230
- if (opts.initialStatus !== undefined)
231
- throw new Error('only private human-work births may start inert');
232
- return;
233
- }
234
- if (!isHumanWorkTarget(opts.humanWorkTarget)) {
235
- throw new Error('private human-work birth requires a recognized humanWorkTarget');
236
- }
237
- if (opts.privateForkPhase !== 'fork_pending') {
238
- throw new Error('private human-work birth requires privateForkPhase=fork_pending');
239
- }
240
- if (typeof opts.privateForkRecipe?.kickoff !== 'string' || opts.privateForkRecipe.kickoff.trim() === '') {
241
- throw new Error('private human-work birth requires a non-empty kickoff recipe');
242
- }
243
- if (typeof opts.forkFrom !== 'string' || !isAbsolute(opts.forkFrom)) {
244
- throw new Error('private human-work birth requires an absolute forkFrom provenance file');
245
- }
246
- if (opts.parent !== null && opts.parent !== undefined) {
247
- throw new Error('private human-work birth must be parent-null');
248
- }
249
- if ((opts.lifecycle ?? 'terminal') !== 'terminal') {
250
- throw new Error('private human-work birth must be terminal');
251
- }
252
- if (opts.launch?.modelExact !== true || typeof opts.launch.model !== 'string' || opts.launch.model.trim() === '') {
253
- throw new Error('private human-work birth requires an exact persisted model');
254
- }
255
- }
256
209
  /** Create a node on the canvas and wire its spawn-time edges.
257
210
  *
258
211
  * For a child (parent given): the parent auto-subscribes ACTIVE to the child
259
212
  * (so it's woken when the child finishes), and a spawned_by audit edge is
260
213
  * recorded. For a root (no parent): no edges, resident by default. */
261
214
  export function spawnNode(opts) {
262
- validatePrivateForkBirth(opts);
263
215
  const nodeId = opts.nodeId !== undefined ? validatedExplicitNodeId(opts.nodeId) : newNodeId();
264
216
  const parent = opts.parent ?? null;
265
217
  const isRoot = parent === null;
@@ -288,13 +240,11 @@ export function spawnNode(opts) {
288
240
  // guidance" for the state it starts in (its bearings carry it), so the
289
241
  // persona injector sees no drift on its first turn boundary.
290
242
  persona_ack: { mode, lifecycle },
291
- status: opts.initialStatus ?? 'active',
243
+ status: 'active',
292
244
  parent,
293
245
  spawned_by: spawnedBy,
294
246
  fork_from: opts.forkFrom,
295
- human_work_target: opts.humanWorkTarget,
296
- private_fork_phase: opts.privateForkPhase,
297
- private_fork_recipe: opts.privateForkRecipe,
247
+ review_binding: opts.reviewBinding,
298
248
  model_override: opts.modelOverride ?? null,
299
249
  passive_default: opts.passiveDefault ?? false,
300
250
  ...(opts.managedWorktree !== undefined ? { managed_worktree: opts.managedWorktree } : {}),
@@ -316,7 +266,7 @@ export function spawnNode(opts) {
316
266
  if (meta.kind !== 'human') {
317
267
  mkdirSync(memoryDir(meta.node_id), { recursive: true });
318
268
  }
319
- if (parent !== null) {
269
+ if (parent !== null && opts.subscribe !== false) {
320
270
  // The load-bearing seed: parent subscribes (active) to child so it learns
321
271
  // when the work finishes. This mirrors spawn structure into the spine.
322
272
  // A root (parent=null) gets NO subscription — nobody is woken by it.
@@ -4,27 +4,12 @@ export interface MissingPackage {
4
4
  /** Absolute path it resolved to (which does not exist). */
5
5
  resolved: string;
6
6
  }
7
- export interface GlobalHumanloopHealth {
8
- bundledVersion: string | null;
9
- globalVersion: string | null;
10
- current: boolean;
11
- }
12
- /** Read the installed library's version rather than coupling this check to the
13
- * dependency range in crouter's package.json. The bundled copy is the floor
14
- * required by crouter's generated `hl inbox toggle` binding. */
15
- export declare function bundledHumanloopVersion(): string | null;
16
- /** Read the PATH-visible `hl` package directly. Spawning `npm ls -g` here
17
- * makes every front-door boot pay for npm's global dependency-tree scan; a
18
- * linked development install can make that scan take many seconds. The real
19
- * executable points into the package for both ordinary and npm-linked installs,
20
- * so walking upward to its package.json is authoritative for the CLI crtr will
21
- * actually invoke. */
22
- export declare function globalHumanloopVersion(): string | null;
23
- export declare function globalHumanloopHealth(): GlobalHumanloopHealth;
24
- /** A non-fatal action-oriented diagnostic for a missing, unreadable, or stale
25
- * global `hl` executable. */
26
- export declare function globalHumanloopWarning(): string | null;
27
- export declare function globalHumanloopInstallCommand(): string;
7
+ /** A non-fatal, action-oriented diagnostic for an unprovisioned managed
8
+ * renderer — the one remaining out-of-tree dependency. Deliberately calls
9
+ * `isRendererReady()`, NOT `ensureRenderer()`: this runs on the front-door boot
10
+ * path and at crtrd startup, where a `uv pip install` (up to 180s) must never
11
+ * happen. Readiness is a handful of fs stats, no subprocess. */
12
+ export declare function rendererWarning(): string | null;
28
13
  /**
29
14
  * The pi agent config dir (`~/.pi/agent`, or `$PI_CODING_AGENT_DIR`) — a local
30
15
  * reimplementation of pi's `getAgentDir()`. Reimplemented (not imported) ON