@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
@@ -20,8 +20,10 @@ test('setup keybinding draft edits, disables, resets, and discards transactional
20
20
  const draft = new SetupKeybindingsDraft({ 'crtr.attach.graph.toggle': ['alt+x'] });
21
21
  assert.equal(draft.expression('crtr.attach.graph.toggle'), 'alt+x');
22
22
  assert.equal(draft.dirty, false);
23
- assert.equal(draft.edit('crtr.attach.graph.toggle', 'M-Y, ctrl+g').ok, true);
24
- assert.deepEqual(draft.overrides()['crtr.attach.graph.toggle'], ['alt+shift+y', 'ctrl+g']);
23
+ // M-U (not M-Y): alt+shift+y is now the crtr.attach.copy.message default, so
24
+ // the uppercase-normalization probe must use a gesture no catalog entry owns.
25
+ assert.equal(draft.edit('crtr.attach.graph.toggle', 'M-U, ctrl+g').ok, true);
26
+ assert.deepEqual(draft.overrides()['crtr.attach.graph.toggle'], ['alt+shift+u', 'ctrl+g']);
25
27
  assert.equal(draft.dirty, true);
26
28
  assert.equal(draft.unbind('crtr.attach.graph.toggle').ok, true);
27
29
  assert.deepEqual(draft.overrides()['crtr.attach.graph.toggle'], []);
@@ -34,9 +36,11 @@ test('setup keybinding draft edits, disables, resets, and discards transactional
34
36
  });
35
37
  test('setup keybinding draft binds the comma key, which doubles as the gesture separator', () => {
36
38
  const draft = new SetupKeybindingsDraft(undefined);
37
- // A comma with nothing on one side is the comma KEY, not a separator.
38
- assert.equal(draft.edit('crtr.tmux.menu.providers', ',').ok, true);
39
- assert.deepEqual(draft.overrides()['crtr.tmux.menu.providers'], [',']);
39
+ // A comma with nothing on one side is the comma KEY, not a separator. Bound
40
+ // onto a menu selector whose default is NOT the comma (settings already
41
+ // defaults to it), so the draft records a real override.
42
+ assert.equal(draft.edit('crtr.tmux.menu.attach.whip', ',').ok, true);
43
+ assert.deepEqual(draft.overrides()['crtr.tmux.menu.attach.whip'], [',']);
40
44
  // A list containing the comma key round-trips through the rendered expression.
41
45
  assert.equal(draft.edit('crtr.attach.graph.toggle', ', , ctrl+g').ok, true);
42
46
  assert.deepEqual(draft.overrides()['crtr.attach.graph.toggle'], [',', 'ctrl+g']);
@@ -1,28 +1,18 @@
1
1
  // Run with: node --import tsx/esm --test src/commands/sys/__tests__/setup-front-door.test.ts
2
2
  //
3
- // M1 — `crtr sys setup` front-door reconciliation. Setup refreshes crouter's
4
- // tmux bindings (including the inbox toggle) and registers the single canvas
5
- // nodes root to owner 'crouter' so a resolved humanloop ticket can call back
6
- // into the asking node (both best-effort). The humanloop registry is
7
- // isolated with a temp XDG_STATE_HOME (see human-deliver.test.ts); the canvas is
8
- // isolated with a temp CRTR_HOME + HOME.
9
- //
10
- // Stage B-9: `reconcileInboxFrontDoor` no longer opens canvas.db — its node
11
- // enumeration goes through the crtrd API (`cliClient().listNodes()`). Each test
12
- // therefore stands up an in-process `createApiServer()` bound to the isolated
13
- // CRTR_HOME's unix socket; `cliClient()` (autostart on) connects to it, so no
14
- // real daemon is spawned. `spawnNode` still seeds the canvas rows the server
15
- // reads back.
3
+ // M1 — `crtr sys setup` front-door reconciliation refreshes crouter's tmux
4
+ // bindings, including the inbox toggle, as a best-effort operation. The fixture
5
+ // isolates its canvas with a temporary CRTR_HOME + HOME and legacy binding state
6
+ // with a temporary XDG_STATE_HOME.
16
7
  import { test, before, beforeEach, afterEach, after } from 'node:test';
17
8
  import assert from 'node:assert/strict';
18
9
  import { spawnSync } from 'node:child_process';
19
- import { existsSync, mkdtempSync, realpathSync } from 'node:fs';
10
+ import { existsSync, mkdtempSync } from 'node:fs';
20
11
  import { tmpdir } from 'node:os';
21
12
  import { join } from 'node:path';
22
- import { listInboxRoots } from '@crouton-kit/humanloop';
23
13
  import { spawnNode } from '../../../core/runtime/nodes.js';
24
14
  import { closeDb } from '../../../core/canvas/index.js';
25
- import { apiSocketPath, nodesRoot } from '../../../core/canvas/paths.js';
15
+ import { apiSocketPath } from '../../../core/canvas/paths.js';
26
16
  import { createApiServer } from '../../../daemon/api/server.js';
27
17
  import { reconcileInboxFrontDoor } from '../setup-core.js';
28
18
  import { sysSetupLeaf } from '../setup.js';
@@ -66,19 +56,6 @@ after(() => {
66
56
  delete process.env['CRTR_HOME'];
67
57
  delete process.env['XDG_STATE_HOME'];
68
58
  });
69
- test('reconcile registers the one canvas nodes root, regardless of how many node cwds exist', async () => {
70
- // Node cwds no longer fan out into per-cwd roots: every bridge ticket lives
71
- // under the canvas nodes root, so that single root is the whole contract.
72
- const otherCwd = mkdtempSync(join(tmpdir(), 'crtr-setup-cwd-'));
73
- spawnNode({ kind: 'general', parent: null, cwd: home, name: 'a' });
74
- spawnNode({ kind: 'general', parent: null, cwd: home, name: 'b' });
75
- spawnNode({ kind: 'general', parent: null, cwd: otherCwd, name: 'c' });
76
- const { interactionRootsRegistered } = await reconcileInboxFrontDoor();
77
- assert.equal(interactionRootsRegistered, 1, 'exactly one registration: the canvas nodes root');
78
- const crouterRoots = listInboxRoots().filter((r) => r.owner === 'crouter');
79
- assert.equal(crouterRoots.length, 1, 'no per-cwd roots linger in the humanloop registry');
80
- assert.equal(crouterRoots[0]?.root, realpathSync(nodesRoot()), 'the registered root is the canvas nodes root');
81
- });
82
59
  test('invoking `crtr sys setup` (non-TTY leaf run) reconciles the front door', async () => {
83
60
  // Exercise the real control flow — sysSetupLeaf.run() → runSetup() →
84
61
  // reconcileInboxFrontDoor — not the helper directly. With no TTY the leaf
@@ -97,11 +74,6 @@ test('invoking `crtr sys setup` (non-TTY leaf run) reconciles the front door', a
97
74
  process.stdout.write = originalWrite;
98
75
  Object.defineProperty(process.stdout, 'isTTY', { value: originalIsTTY, configurable: true });
99
76
  }
100
- const homeReal = realpathSync(home);
101
- const crouterRoots = listInboxRoots().filter((r) => r.owner === 'crouter');
102
- // registerCrouterRoot maps the node cwd to its workspace interactions dir
103
- // under that cwd, so the registered root is rooted at the node's home.
104
- assert.ok(crouterRoots.some((r) => r.root.startsWith(homeReal)), 'the leaf invocation registered the node cwd as an owner-crouter interaction root');
105
77
  });
106
78
  test('reconcile refreshes the inbox tmux binding', async (t) => {
107
79
  if (spawnSync('tmux', ['-V']).status !== 0) {
@@ -118,7 +90,7 @@ test('reconcile refreshes the inbox tmux binding', async (t) => {
118
90
  try {
119
91
  await reconcileInboxFrontDoor();
120
92
  const binding = spawnSync('tmux', ['-S', socket, 'list-keys', '-T', 'root'], { encoding: 'utf8' }).stdout;
121
- assert.match(binding, /bind-key\s+-T root M-i\s+run-shell.*hl inbox toggle/);
93
+ assert.match(binding, /bind-key\s+-T root M-i\s+run-shell.*crtr human inbox toggle/);
122
94
  }
123
95
  finally {
124
96
  if (priorTmux === undefined)
@@ -128,10 +100,3 @@ test('reconcile refreshes the inbox tmux binding', async (t) => {
128
100
  spawnSync('tmux', ['-S', socket, 'kill-server'], { encoding: 'utf8' });
129
101
  }
130
102
  });
131
- test('reconcile is idempotent for owner crouter — re-running does not error and keeps the roots', async () => {
132
- spawnNode({ kind: 'general', parent: null, cwd: home, name: 'a' });
133
- await reconcileInboxFrontDoor();
134
- const { interactionRootsRegistered } = await reconcileInboxFrontDoor();
135
- assert.equal(interactionRootsRegistered, 1);
136
- assert.ok(listInboxRoots().some((r) => r.owner === 'crouter'));
137
- });
@@ -41,6 +41,16 @@ function assertUserScopeBrokerThresholds(key, scope) {
41
41
  throw usage('brokerThresholds are available only in user scope');
42
42
  }
43
43
  }
44
+ function assertWorkingGerundsScope(key, scope) {
45
+ if (key === 'working_gerunds' && scope !== 'user') {
46
+ throw usage('working_gerunds is available only in user scope');
47
+ }
48
+ }
49
+ function assertWhipMessagesScope(key, scope) {
50
+ if (key === 'whip_messages' && scope !== 'user') {
51
+ throw usage('whip_messages are available only in user scope');
52
+ }
53
+ }
44
54
  function assertUserSettingScope(key, scope) {
45
55
  if (findUserSetting(key) !== undefined && scope !== 'user') {
46
56
  throw usage(`${key} is available only in user scope`);
@@ -80,6 +90,20 @@ function modelLadderPatch(key, rawValue) {
80
90
  function setNestedValue(cfg, key, rawValue, value) {
81
91
  const parts = key.split('.');
82
92
  const topKey = parts[0];
93
+ if (key === 'working_gerunds' || key === 'whip_messages') {
94
+ let parsed;
95
+ try {
96
+ parsed = JSON.parse(rawValue);
97
+ }
98
+ catch {
99
+ throw usage(`${key} must be a JSON array of non-empty strings`);
100
+ }
101
+ if (!Array.isArray(parsed) || parsed.length === 0 || !parsed.every((entry) => typeof entry === 'string' && entry.trim() !== '')) {
102
+ throw usage(`${key} must be a non-empty JSON array of non-empty strings`);
103
+ }
104
+ cfg[key] = parsed.map((entry) => entry.trim());
105
+ return;
106
+ }
83
107
  if (topKey === 'keybindings') {
84
108
  throw usage('keybindings are edited only through `crtr sys setup`');
85
109
  }
@@ -152,13 +176,13 @@ const configGet = defineLeaf({
152
176
  const configSet = defineLeaf({
153
177
  name: 'set',
154
178
  description: 'write a config value by key',
155
- whenToUse: 'you want to change a supported scalar crtr setting in user or project scope. Use sys setup instead for keybindings, and sys config get to inspect values.',
179
+ whenToUse: 'you want to change a supported crtr setting in user or project scope. Use sys setup instead for keybindings, and sys config get to inspect values.',
156
180
  help: {
157
181
  name: 'sys config set',
158
182
  summary: 'write a config value by dotted key',
159
183
  params: [
160
- { kind: 'positional', name: 'key', type: 'string', required: true, constraint: `Dotted key path. User-scope scalar settings: ${SCALAR_SETTING_HELP}. Also supported: brokerThresholds.warning and brokerThresholds.automaticReviveCap (user scope; integer >= 1), modelLadders.defaultProvider, and modelLadders.<anthropic|openai>.<ultra|strong|medium|light>. Keybindings are edited only through sys setup.` },
161
- { kind: 'flag', name: 'value', type: 'string', required: true, constraint: 'value VALUE — string, required. Stored as-is if quoted; coerced to number or boolean when unambiguous.' },
184
+ { kind: 'positional', name: 'key', type: 'string', required: true, constraint: `Dotted key path. User-scope scalar settings: ${SCALAR_SETTING_HELP}. Also supported: working_gerunds and whip_messages (non-empty JSON string arrays), brokerThresholds.warning and brokerThresholds.automaticReviveCap (user scope; integer >= 1), modelLadders.defaultProvider, and modelLadders.<anthropic|openai>.<ultra|strong|medium|light>. Keybindings are edited only through sys setup.` },
185
+ { kind: 'flag', name: 'value', type: 'string', required: true, constraint: 'value VALUE — string, required. working_gerunds and whip_messages accept JSON arrays; other values are stored as-is if quoted and coerced to number or boolean when unambiguous.' },
162
186
  { kind: 'flag', name: 'scope', type: 'enum', choices: ['user', 'project'], required: false, constraint: 'Scope to write to. Default: user. Project scope is supported only for modelLadders.' },
163
187
  ],
164
188
  output: [
@@ -174,6 +198,8 @@ const configSet = defineLeaf({
174
198
  const rawValue = input['value'];
175
199
  const scope = resolveScope(input['scope']);
176
200
  assertUserScopeBrokerThresholds(key, scope);
201
+ assertWorkingGerundsScope(key, scope);
202
+ assertWhipMessagesScope(key, scope);
177
203
  assertUserSettingScope(key, scope);
178
204
  // Flags are stringly-typed; coerce to number or boolean when unambiguous
179
205
  const parsed = parseConfigValue(rawValue);
@@ -18,7 +18,7 @@ import { projectTier1Event, readLogSnapshot } from '../../core/events/read.js';
18
18
  import { readPackageVersion } from './shared.js';
19
19
  /** Canonical repo for crtr harness feedback — feedback is always about the
20
20
  * tool, regardless of which project the reporting agent is working in. */
21
- const FEEDBACK_REPO = 'crouton-labs/crouter';
21
+ const FEEDBACK_REPO = 'vallum-security/crouter';
22
22
  async function collectContext() {
23
23
  const env = process.env;
24
24
  const nodeId = env['CRTR_NODE_ID'] ?? null;
@@ -1,5 +1,5 @@
1
1
  import { type BindingId, type BindingResolution, type KeybindingDiagnostic, type SparseKeybindingOverrides } from '../../core/keybindings/index.js';
2
- export type SetupPackageId = 'crtr-extensions' | 'mode-switch' | 'oauth-adapter' | 'capture-plugin';
2
+ export type SetupPackageId = 'crtr-extensions' | 'oauth-adapter' | 'capture-plugin';
3
3
  /** `nerd-font` is not a command on PATH like the other two — it is an installed
4
4
  * font face, detected by fontconfig/font-directory scan. The viewer renders
5
5
  * every tool and command icon with Nerd Font codepoints, so without it a fresh
@@ -55,7 +55,6 @@ export interface SetupExecutionSummary {
55
55
  skipped: string[];
56
56
  exaKeyWritten: boolean;
57
57
  exaKeyPath: string;
58
- interactionRootsRegistered: number;
59
58
  }
60
59
  export interface SetupInitialState {
61
60
  manifest: SetupPackageManifestEntry[];
@@ -75,10 +74,17 @@ export declare class SetupKeybindingsDraft {
75
74
  private baselineInvalidRoot;
76
75
  private invalidRoot;
77
76
  private resolutionCache;
78
- constructor(rawKeybindings: unknown);
77
+ private expectedPassthrough;
78
+ private baselinePassthrough;
79
+ private currentPassthrough;
80
+ constructor(rawKeybindings: unknown, rawTmuxPassthrough?: unknown);
79
81
  get dirty(): boolean;
80
82
  overrides(): Record<string, unknown>;
81
83
  expectedKeybindings(): unknown;
84
+ tmuxPassthrough(): readonly BindingId[];
85
+ expectedTmuxPassthrough(): unknown;
86
+ usesTmuxPassthrough(id: BindingId): boolean;
87
+ toggleTmuxPassthrough(id: BindingId): void;
82
88
  resolution(): BindingResolution<BindingId>;
83
89
  /** True while the persisted `keybindings` root is a non-object (e.g. a string):
84
90
  * edits cannot be layered onto an invalid root, so the tab must reset-all first. */
@@ -89,7 +95,7 @@ export declare class SetupKeybindingsDraft {
89
95
  resetRow(id: BindingId): void;
90
96
  resetAll(): void;
91
97
  discard(): void;
92
- markSaved(overrides: SparseKeybindingOverrides<BindingId>): void;
98
+ markSaved(overrides: SparseKeybindingOverrides<BindingId>, tmuxPassthrough?: readonly BindingId[]): void;
93
99
  }
94
100
  export declare function buildSetupManifest(resolveBuiltinPackageDir?: (name: string) => string): SetupPackageManifestEntry[];
95
101
  export declare function normalizePackageIdentity(source: string, settingsDir: string, homeDir: string): SetupPackageIdentity;
@@ -123,12 +129,8 @@ export declare function buildSetupStaticInstructions(opts: {
123
129
  }): SetupStaticInstructions;
124
130
  export declare function renderSetupStaticInstructions(state: Pick<SetupInitialState, 'manifest' | 'installedPackageIds' | 'systemTools' | 'exaKeyPath'>): string;
125
131
  export declare function writeExaKey(exaKeyPath: string, exaKey: string): Promise<void>;
126
- /** Refresh crouter-owned tmux bindings and register the one canvas node root
127
- * with humanloop so every bridge ticket can call back into `human _deliver`.
128
- * Both are best-effort: setup must never fail because tmux or humanloop is unavailable. */
129
- export declare function reconcileInboxFrontDoor(): Promise<{
130
- interactionRootsRegistered: number;
131
- }>;
132
+ /** Refresh crouter-owned tmux bindings. Setup must never fail because tmux is unavailable. */
133
+ export declare function reconcileInboxFrontDoor(): Promise<void>;
132
134
  export declare function summarizeSetupExecution(result: {
133
135
  installedPackages: string[];
134
136
  skippedPackages: string[];
@@ -136,7 +138,6 @@ export declare function summarizeSetupExecution(result: {
136
138
  skippedSystemDeps: string[];
137
139
  exaKeyWritten: boolean;
138
140
  exaKeyPath: string;
139
- interactionRootsRegistered: number;
140
141
  }): SetupExecutionSummary;
141
142
  export declare function formatSetupExecutionSummary(summary: SetupExecutionSummary): string;
142
143
  export declare function executeSetupSubmission(submission: SetupSubmission): Promise<SetupExecutionSummary>;
@@ -9,9 +9,9 @@ import { builtinPiPackageDir } from '../../core/scope.js';
9
9
  import { readJsonIfExists } from '../../core/fs-utils.js';
10
10
  import { resolveBundledPiCliPath } from '../../core/runtime/pi-cli.js';
11
11
  import { installTmuxBindings } from '../../core/runtime/tmux-chrome.js';
12
+ import { normalizeTmuxPassthrough } from '../../core/config.js';
12
13
  import { detectNerdFont, nerdFontInstallCommand, NERD_FONT_SELECT_HINT } from '../../core/runtime/nerd-font.js';
13
- import { globalHumanloopHealth, globalHumanloopInstallCommand } from '../../core/runtime/package-health.js';
14
- import { registerCrouterRoot } from '../human/shared.js';
14
+ import { ensureRenderer, isRendererReady } from '../../core/termrender/termrender.js';
15
15
  import { installFromMarketplace } from '../pkg/plugin-manage.js';
16
16
  import { findPluginByName } from '../../core/resolver.js';
17
17
  function isKeybindingsObject(value) {
@@ -33,16 +33,23 @@ export class SetupKeybindingsDraft {
33
33
  baselineInvalidRoot;
34
34
  invalidRoot;
35
35
  resolutionCache;
36
- constructor(rawKeybindings) {
36
+ expectedPassthrough;
37
+ baselinePassthrough;
38
+ currentPassthrough;
39
+ constructor(rawKeybindings, rawTmuxPassthrough = undefined) {
37
40
  this.expected = rawKeybindings;
38
41
  this.baseline = cloneKeybindings(rawKeybindings);
39
42
  this.current = cloneKeybindings(rawKeybindings);
40
43
  this.baselineInvalidRoot = rawKeybindings !== undefined && !isKeybindingsObject(rawKeybindings) ? rawKeybindings : undefined;
41
44
  this.invalidRoot = this.baselineInvalidRoot;
45
+ this.expectedPassthrough = rawTmuxPassthrough;
46
+ this.baselinePassthrough = normalizeTmuxPassthrough(rawTmuxPassthrough);
47
+ this.currentPassthrough = [...this.baselinePassthrough];
42
48
  }
43
49
  get dirty() {
44
50
  return !isDeepStrictEqual(this.current, this.baseline)
45
- || !isDeepStrictEqual(this.invalidRoot, this.baselineInvalidRoot);
51
+ || !isDeepStrictEqual(this.invalidRoot, this.baselineInvalidRoot)
52
+ || !isDeepStrictEqual(this.currentPassthrough, this.baselinePassthrough);
46
53
  }
47
54
  overrides() {
48
55
  return cloneKeybindings(this.current);
@@ -50,6 +57,20 @@ export class SetupKeybindingsDraft {
50
57
  expectedKeybindings() {
51
58
  return this.expected;
52
59
  }
60
+ tmuxPassthrough() {
61
+ return [...this.currentPassthrough];
62
+ }
63
+ expectedTmuxPassthrough() {
64
+ return this.expectedPassthrough;
65
+ }
66
+ usesTmuxPassthrough(id) {
67
+ return this.currentPassthrough.includes(id);
68
+ }
69
+ toggleTmuxPassthrough(id) {
70
+ this.currentPassthrough = this.currentPassthrough.includes(id)
71
+ ? this.currentPassthrough.filter((candidate) => candidate !== id)
72
+ : [...this.currentPassthrough, id];
73
+ }
53
74
  resolution() {
54
75
  if (this.resolutionCache === undefined) {
55
76
  this.resolutionCache = resolveKeybindings(this.invalidRoot === undefined ? this.current : this.invalidRoot);
@@ -124,18 +145,23 @@ export class SetupKeybindingsDraft {
124
145
  }
125
146
  resetAll() {
126
147
  this.current = {};
148
+ this.currentPassthrough = [];
127
149
  this.invalidRoot = undefined;
128
150
  this.resolutionCache = undefined;
129
151
  }
130
152
  discard() {
131
153
  this.current = cloneKeybindings(this.baseline);
154
+ this.currentPassthrough = [...this.baselinePassthrough];
132
155
  this.invalidRoot = this.baselineInvalidRoot;
133
156
  this.resolutionCache = undefined;
134
157
  }
135
- markSaved(overrides) {
158
+ markSaved(overrides, tmuxPassthrough = []) {
136
159
  this.expected = Object.keys(overrides).length === 0 ? undefined : cloneKeybindings(overrides);
137
160
  this.baseline = cloneKeybindings(overrides);
138
161
  this.current = cloneKeybindings(overrides);
162
+ this.expectedPassthrough = tmuxPassthrough.length === 0 ? undefined : [...tmuxPassthrough];
163
+ this.baselinePassthrough = [...tmuxPassthrough];
164
+ this.currentPassthrough = [...tmuxPassthrough];
139
165
  this.baselineInvalidRoot = undefined;
140
166
  this.invalidRoot = undefined;
141
167
  this.resolutionCache = undefined;
@@ -147,11 +173,6 @@ const PACKAGE_COPY = {
147
173
  shortDescription: 'crtr companion extensions — command palette, help gating, statusline, subscription/OAuth rotation, nested context.',
148
174
  longDescription: 'Bundles the extensions built for crtr: a crtr slash-command palette, crtr/crouter help gating, surfacing of Claude Code marketplace plugin commands, nested AGENTS.md/CLAUDE.md loading, a model/subscription/token statusline badge, OAuth login + rotation across multiple Claude subscriptions (provider-rotation), and system-prompt trimming. The OAuth/rotation piece is what lets crtr authenticate your Claude account.',
149
175
  },
150
- 'mode-switch': {
151
- name: 'pi-mode-switch',
152
- shortDescription: 'Alt+Shift+P cycles spec / plan / normal modes; injects mode-specific guidance on change.',
153
- longDescription: 'Press Alt+Shift+P to rotate between three operating modes — spec (requirements gathering), plan (design before code), and normal (execution). Each switch appends mode-tailored guidance to keep the agent in the right gear.',
154
- },
155
176
  'oauth-adapter': {
156
177
  name: 'pi-claude-oauth-adapter',
157
178
  shortDescription: 'Anthropic OAuth / Claude Code credential compatibility for pi.',
@@ -165,20 +186,17 @@ const PACKAGE_COPY = {
165
186
  };
166
187
  const PACKAGE_SOURCES = {
167
188
  'crtr-extensions': { kind: 'local-path', source: builtinPiPackageDir('pi-crtr-extensions') },
168
- 'mode-switch': { kind: 'local-path', source: builtinPiPackageDir('pi-mode-switch') },
169
189
  'oauth-adapter': { kind: 'npm', source: 'npm:pi-claude-oauth-adapter@0.1.2' },
170
190
  'capture-plugin': { kind: 'marketplace-plugin', source: 'crouter-official-marketplace/capture' },
171
191
  };
172
192
  const LOCAL_PACKAGE_NAME_ALIASES = {
173
193
  'crtr-extensions': ['pi-crtr-extensions'],
174
- 'mode-switch': ['pi-mode-switch'],
175
194
  'oauth-adapter': [],
176
195
  'capture-plugin': [],
177
196
  };
178
197
  export function buildSetupManifest(resolveBuiltinPackageDir = builtinPiPackageDir) {
179
198
  return [
180
199
  'crtr-extensions',
181
- 'mode-switch',
182
200
  'oauth-adapter',
183
201
  'capture-plugin',
184
202
  ].map((id) => {
@@ -452,7 +470,7 @@ export function renderSetupStaticInstructions(state) {
452
470
  '',
453
471
  instructions.exaLine,
454
472
  '',
455
- `Inbox popup: the inbox-toggle key (${inboxShortcut() ?? 'disabled'}) is a crouter keybinding — view or rebind it in the \`crtr sys setup\` keybindings tab; it is installed on the same tmux server as every other crouter binding. \`crtr sys setup\` also registers known nodes' interaction roots (best-effort).`,
473
+ `Inbox: the inbox-toggle key (${inboxShortcut() ?? 'disabled'}) is a crouter keybinding — view or rebind it in the \`crtr sys setup\` keybindings tab; it is installed on the same tmux server as every other crouter binding.`,
456
474
  instructions.footer,
457
475
  ].join('\n') + '\n';
458
476
  }
@@ -468,38 +486,27 @@ function installPiPackage(source, piCliPath = resolveBundledPiCliPath()) {
468
486
  throw new Error(`pi install failed: ${source}`);
469
487
  }
470
488
  }
471
- /** Keep the PATH-global executable used by the tmux inbox binding at least as
472
- * new as crouter's bundled humanloop library. This is deliberately separate
473
- * from pi's companion package install: `hl` is a global npm binary, not a pi
474
- * package entry in settings.json. */
475
- function ensureGlobalHumanloop() {
476
- if (globalHumanloopHealth().current)
477
- return false;
478
- const command = globalHumanloopInstallCommand();
479
- process.stdout.write(`Updating global hl CLI: ${command}\n`);
480
- runShellCommand(command);
481
- return true;
489
+ /** Provision the pinned termrender venv — crouter's one remaining out-of-tree
490
+ * dependency. Best-effort: a renderer that will not provision (no `uv`, no
491
+ * network) reports as skipped and never fails setup. */
492
+ function ensureManagedRenderer() {
493
+ if (isRendererReady())
494
+ return 'current';
495
+ process.stdout.write('Provisioning the pinned termrender renderer…\n');
496
+ ensureRenderer();
497
+ return isRendererReady() ? 'provisioned' : 'unavailable';
482
498
  }
483
499
  export async function writeExaKey(exaKeyPath, exaKey) {
484
500
  await mkdir(dirname(exaKeyPath), { recursive: true });
485
501
  await writeFile(exaKeyPath, `${exaKey}\n`, 'utf8');
486
502
  await chmod(exaKeyPath, 0o600).catch(() => undefined);
487
503
  }
488
- /** Refresh crouter-owned tmux bindings and register the one canvas node root
489
- * with humanloop so every bridge ticket can call back into `human _deliver`.
490
- * Both are best-effort: setup must never fail because tmux or humanloop is unavailable. */
504
+ /** Refresh crouter-owned tmux bindings. Setup must never fail because tmux is unavailable. */
491
505
  export async function reconcileInboxFrontDoor() {
492
506
  try {
493
507
  installTmuxBindings();
494
508
  }
495
509
  catch { /* best-effort: no tmux server */ }
496
- try {
497
- registerCrouterRoot();
498
- return { interactionRootsRegistered: 1 };
499
- }
500
- catch {
501
- return { interactionRootsRegistered: 0 };
502
- }
503
510
  }
504
511
  export function summarizeSetupExecution(result) {
505
512
  return {
@@ -507,7 +514,6 @@ export function summarizeSetupExecution(result) {
507
514
  skipped: [...result.skippedPackages, ...result.skippedSystemDeps],
508
515
  exaKeyWritten: result.exaKeyWritten,
509
516
  exaKeyPath: result.exaKeyPath,
510
- interactionRootsRegistered: result.interactionRootsRegistered,
511
517
  };
512
518
  }
513
519
  export function formatSetupExecutionSummary(summary) {
@@ -516,7 +522,6 @@ export function formatSetupExecutionSummary(summary) {
516
522
  summary.installed.length > 0 ? `installed: ${summary.installed.join(', ')}` : 'installed: none',
517
523
  summary.skipped.length > 0 ? `skipped: ${summary.skipped.join(', ')}` : 'skipped: none',
518
524
  summary.exaKeyWritten ? `exa key written: ${summary.exaKeyPath}` : 'exa key written: no',
519
- `interaction roots registered: ${summary.interactionRootsRegistered}`,
520
525
  ].join('\n') + '\n';
521
526
  }
522
527
  /** Marketplace-plugin manifest entries already installed in any scope — the
@@ -572,18 +577,23 @@ export async function executeSetupSubmission(submission) {
572
577
  runShellCommand(plan.command);
573
578
  installedSystemDeps.push(plan.tool);
574
579
  }
575
- if (ensureGlobalHumanloop())
576
- installedPackages.push('global hl CLI');
577
- else
578
- skippedPackages.push('global hl CLI (current)');
580
+ switch (ensureManagedRenderer()) {
581
+ case 'provisioned':
582
+ installedPackages.push('termrender renderer');
583
+ break;
584
+ case 'current':
585
+ skippedPackages.push('termrender renderer (current)');
586
+ break;
587
+ case 'unavailable':
588
+ skippedPackages.push('termrender renderer (unavailable — install uv)');
589
+ break;
590
+ }
579
591
  const exaKeyWritten = submission.exaKey.trim() !== '';
580
592
  if (exaKeyWritten) {
581
593
  await writeExaKey(submission.exaKeyPath, submission.exaKey);
582
594
  }
583
- // Front-door reconciliation: refresh the crouter-owned tmux bindings and
584
- // register known nodes' interaction roots for `human _deliver`. Both are
585
- // best-effort.
586
- const { interactionRootsRegistered } = await reconcileInboxFrontDoor();
595
+ // Front-door reconciliation refreshes crouter-owned tmux bindings.
596
+ await reconcileInboxFrontDoor();
587
597
  return summarizeSetupExecution({
588
598
  installedPackages,
589
599
  skippedPackages,
@@ -591,6 +601,5 @@ export async function executeSetupSubmission(submission) {
591
601
  skippedSystemDeps,
592
602
  exaKeyWritten,
593
603
  exaKeyPath: submission.exaKeyPath,
594
- interactionRootsRegistered,
595
604
  });
596
605
  }
@@ -61,6 +61,7 @@ export declare class SetupWizard implements Component, Focusable {
61
61
  private keyDiagnostics;
62
62
  private keyConfirm;
63
63
  private keyNotice;
64
+ private keyTmuxOccupancy;
64
65
  private brokerLimitIndex;
65
66
  private brokerLimitNotice;
66
67
  private settingsIndex;
@@ -71,7 +72,7 @@ export declare class SetupWizard implements Component, Focusable {
71
72
  private _focused;
72
73
  onSubmit?: (submission: SetupSubmission) => void;
73
74
  onCancel?: () => void;
74
- constructor(manifest: SetupPackageManifestEntry[], installedPackageIds: Set<SetupPackageId>, systemTools: SetupSystemToolState[], tui: TUI, agentDir: string, runtime: ModelRuntime, registry: ModelRegistry, openingBindings: BindingResolution<BindingId>, rawKeybindings: unknown, terminalRows: () => number);
75
+ constructor(manifest: SetupPackageManifestEntry[], installedPackageIds: Set<SetupPackageId>, systemTools: SetupSystemToolState[], tui: TUI, agentDir: string, runtime: ModelRuntime, registry: ModelRegistry, openingBindings: BindingResolution<BindingId>, rawKeybindings: unknown, terminalRows: () => number, rawTmuxPassthrough?: unknown);
75
76
  set focused(value: boolean);
76
77
  get focused(): boolean;
77
78
  invalidate(): void;
@@ -107,6 +108,8 @@ export declare class SetupWizard implements Component, Focusable {
107
108
  private filteredKeybindings;
108
109
  private selectedKeyRow;
109
110
  private selectedKeybinding;
111
+ private tmuxPassthroughOffer;
112
+ private toggleTmuxPassthrough;
110
113
  private moveKey;
111
114
  private moveKeyField;
112
115
  private keyViewportLines;