@north-light/crouter 0.3.170 → 0.3.172

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (670) hide show
  1. package/dist/api/client.d.ts +37 -11
  2. package/dist/api/client.js +84 -15
  3. package/dist/api/dto/human.d.ts +53 -39
  4. package/dist/api/dto/human.js +2 -3
  5. package/dist/api/dto/inbox.d.ts +0 -1
  6. package/dist/api/dto/nodes.d.ts +12 -0
  7. package/dist/api/dto/review-comments.d.ts +137 -0
  8. package/dist/api/dto/review-comments.js +5 -0
  9. package/dist/api/dto/reviews.d.ts +109 -0
  10. package/dist/api/dto/reviews.js +5 -0
  11. package/dist/api/index.d.ts +2 -0
  12. package/dist/api/index.js +2 -0
  13. package/dist/api/routes.d.ts +17 -4
  14. package/dist/api/routes.js +21 -5
  15. package/dist/build-root.d.ts +1 -16
  16. package/dist/build-root.js +1 -25
  17. package/dist/builtin-memory/00-runtime-base.md +7 -5
  18. package/dist/builtin-memory/04-base-worker.md +1 -1
  19. package/dist/builtin-memory/04-orchestration-kernel.md +7 -7
  20. package/dist/builtin-memory/05-kinds/design/00-base.md +1 -1
  21. package/dist/builtin-memory/05-kinds/design/01-orchestrator.md +1 -1
  22. package/dist/builtin-memory/05-kinds/developer/00-base.md +1 -1
  23. package/dist/builtin-memory/05-kinds/explore/00-base.md +1 -1
  24. package/dist/builtin-memory/05-kinds/plan/00-base.md +1 -1
  25. package/dist/builtin-memory/05-kinds/plan/01-orchestrator.md +1 -1
  26. package/dist/builtin-memory/05-kinds/review/00-base.md +1 -1
  27. package/dist/builtin-memory/05-kinds/review/companion/00-base.md +20 -0
  28. package/dist/builtin-memory/05-kinds/spec/00-base.md +3 -7
  29. package/dist/builtin-memory/05-kinds/spec/01-orchestrator.md +3 -3
  30. package/dist/builtin-memory/05-kinds/spec/requirements.md +3 -3
  31. package/dist/builtin-memory/design.md +2 -2
  32. package/dist/builtin-memory/insights/capture.md +50 -0
  33. package/dist/builtin-memory/insights/init.md +45 -0
  34. package/dist/builtin-memory/insights/listen.md +9 -0
  35. package/dist/builtin-memory/internal/agent-shaping.md +2 -2
  36. package/dist/builtin-memory/internal/nodes-and-canvas.md +1 -1
  37. package/dist/builtin-memory/internal/plugins.md +12 -11
  38. package/dist/builtin-memory/internal/storage-tiers.md +2 -2
  39. package/dist/builtin-memory/{planning.md → plan/roadmap.md} +3 -3
  40. package/dist/builtin-memory/plan.md +19 -0
  41. package/dist/builtin-memory/spec/guide.md +38 -0
  42. package/dist/builtin-memory/spec/requirements.md +31 -0
  43. package/dist/builtin-memory/spec/roadmap.md +35 -0
  44. package/dist/builtin-memory/spec.md +10 -86
  45. package/dist/builtin-pi-packages/pi-crtr-extensions/README.md +3 -4
  46. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/provider-rotation.test.ts +49 -5
  47. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.d.ts +56 -0
  48. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.js +920 -0
  49. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +221 -156
  50. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/statusline.ts +4 -5
  51. package/dist/cli.js +2 -6
  52. package/dist/clients/attach/__tests__/attach-chrome-remote.test.js +7 -35
  53. package/dist/clients/attach/__tests__/attach-keybindings.test.js +32 -16
  54. package/dist/clients/attach/__tests__/context-message.test.js +142 -6
  55. package/dist/clients/attach/__tests__/crtr-output.test.js +29 -45
  56. package/dist/clients/attach/__tests__/diagram.test.js +1 -1
  57. package/dist/clients/attach/__tests__/file-review-focus.test.js +48 -0
  58. package/dist/clients/attach/__tests__/group-activity.test.js +266 -0
  59. package/dist/clients/attach/__tests__/input-controller-extension-command.test.js +32 -0
  60. package/dist/clients/attach/__tests__/session-identity-refresh.test.js +32 -0
  61. package/dist/clients/attach/__tests__/titled-editor-preview.test.js +1 -2
  62. package/dist/clients/attach/chrome/header.d.ts +10 -0
  63. package/dist/clients/attach/chrome/header.js +30 -0
  64. package/dist/clients/attach/chrome/recap.d.ts +7 -0
  65. package/dist/clients/attach/chrome/recap.js +19 -0
  66. package/dist/clients/attach/chrome/status-line.d.ts +3 -0
  67. package/dist/clients/attach/chrome/status-line.js +5 -0
  68. package/dist/clients/attach/chrome/widgets.js +11 -21
  69. package/dist/clients/attach/command.js +11 -7
  70. package/dist/clients/attach/config.d.ts +4 -0
  71. package/dist/clients/attach/config.js +3 -0
  72. package/dist/clients/attach/input/controller.d.ts +19 -0
  73. package/dist/clients/attach/input/controller.js +62 -28
  74. package/dist/clients/attach/input/titled-editor.d.ts +0 -4
  75. package/dist/clients/attach/input/titled-editor.js +2 -10
  76. package/dist/clients/attach/overlays/file-review.d.ts +9 -5
  77. package/dist/clients/attach/overlays/file-review.js +9 -70
  78. package/dist/clients/attach/overlays/help.d.ts +33 -0
  79. package/dist/clients/attach/overlays/help.js +204 -0
  80. package/dist/clients/attach/render/activity-slot.d.ts +4 -0
  81. package/dist/clients/attach/render/activity-slot.js +13 -0
  82. package/dist/clients/attach/render/chat-view.d.ts +117 -12
  83. package/dist/clients/attach/render/chat-view.js +604 -135
  84. package/dist/clients/attach/render/context-message.d.ts +2 -1
  85. package/dist/clients/attach/render/context-message.js +17 -13
  86. package/dist/clients/attach/render/crtr-output.js +1 -3
  87. package/dist/clients/attach/render/diagram.js +2 -2
  88. package/dist/clients/attach/render/edit-diff.d.ts +4 -1
  89. package/dist/clients/attach/render/edit-diff.js +7 -11
  90. package/dist/clients/attach/render/group-activity.d.ts +32 -0
  91. package/dist/clients/attach/render/group-activity.js +206 -0
  92. package/dist/clients/attach/render/group-recap.d.ts +10 -0
  93. package/dist/clients/attach/render/group-recap.js +93 -0
  94. package/dist/clients/attach/render/html-markdown.d.ts +17 -0
  95. package/dist/clients/attach/render/html-markdown.js +228 -0
  96. package/dist/clients/attach/render/measured-container.d.ts +96 -0
  97. package/dist/clients/attach/render/measured-container.js +322 -0
  98. package/dist/clients/attach/render/scroll-animation.d.ts +8 -0
  99. package/dist/clients/attach/render/scroll-animation.js +80 -0
  100. package/dist/clients/attach/render/tool-calls.js +6 -6
  101. package/dist/clients/attach/render/transcript-copy.d.ts +9 -0
  102. package/dist/clients/attach/render/transcript-copy.js +81 -0
  103. package/dist/clients/attach/render/viewport.d.ts +29 -0
  104. package/dist/clients/attach/render/viewport.js +159 -0
  105. package/dist/clients/attach/session/bindings.d.ts +10 -7
  106. package/dist/clients/attach/session/bindings.js +23 -8
  107. package/dist/clients/attach/session/connection.js +4 -5
  108. package/dist/clients/attach/session/context.d.ts +6 -4
  109. package/dist/clients/attach/session/frame.d.ts +34 -0
  110. package/dist/clients/attach/session/frame.js +176 -0
  111. package/dist/clients/attach/session/frames.d.ts +4 -1
  112. package/dist/clients/attach/session/frames.js +14 -1
  113. package/dist/clients/attach/session/identity.js +4 -3
  114. package/dist/clients/attach/session/input-wiring.d.ts +14 -4
  115. package/dist/clients/attach/session/input-wiring.js +15 -13
  116. package/dist/clients/attach/session/invariant.d.ts +9 -0
  117. package/dist/clients/attach/session/invariant.js +15 -0
  118. package/dist/clients/attach/session/keys.d.ts +10 -2
  119. package/dist/clients/attach/session/keys.js +13 -5
  120. package/dist/clients/attach/session/layout.d.ts +10 -8
  121. package/dist/clients/attach/session/layout.js +33 -34
  122. package/dist/clients/attach/session/mouse.d.ts +18 -0
  123. package/dist/clients/attach/session/mouse.js +64 -0
  124. package/dist/clients/attach/session/pane-tag.d.ts +3 -0
  125. package/dist/clients/attach/session/pane-tag.js +51 -8
  126. package/dist/clients/attach/session/reconnect.d.ts +3 -0
  127. package/dist/clients/attach/session/reconnect.js +42 -5
  128. package/dist/clients/attach/session/surface-frame.d.ts +20 -0
  129. package/dist/clients/attach/session/surface-frame.js +73 -0
  130. package/dist/clients/attach/session/surface-host.d.ts +64 -0
  131. package/dist/clients/attach/session/surface-host.js +255 -0
  132. package/dist/clients/attach/session/whip.d.ts +17 -0
  133. package/dist/clients/attach/session/whip.js +334 -0
  134. package/dist/clients/attach/slash/dispatch.d.ts +13 -1
  135. package/dist/clients/attach/slash/dispatch.js +51 -29
  136. package/dist/clients/attach/viewer.js +907 -819
  137. package/dist/clients/conversation/conversation.d.ts +65 -0
  138. package/dist/clients/conversation/conversation.js +318 -0
  139. package/dist/clients/conversation/frames.d.ts +30 -0
  140. package/dist/clients/conversation/frames.js +52 -0
  141. package/dist/clients/conversation/region.d.ts +51 -0
  142. package/dist/clients/conversation/region.js +265 -0
  143. package/dist/clients/conversation/submit.d.ts +38 -0
  144. package/dist/clients/conversation/submit.js +51 -0
  145. package/dist/clients/inbox/__tests__/inbox-controller.test.js +247 -0
  146. package/dist/clients/inbox/__tests__/mount-panel.test.js +776 -0
  147. package/dist/clients/inbox/controller.d.ts +79 -0
  148. package/dist/clients/inbox/controller.js +448 -0
  149. package/dist/clients/inbox/deck-adapter.d.ts +29 -0
  150. package/dist/clients/inbox/deck-adapter.js +62 -0
  151. package/dist/clients/inbox/layout.d.ts +8 -0
  152. package/dist/clients/inbox/layout.js +9 -0
  153. package/dist/clients/inbox/resolve.d.ts +10 -0
  154. package/dist/clients/inbox/resolve.js +34 -0
  155. package/dist/clients/inbox/review/__tests__/editor-roundtrip.test.js +29 -0
  156. package/dist/clients/inbox/review/__tests__/remap.test.js +196 -0
  157. package/dist/clients/inbox/review/__tests__/review-core.test.js +341 -0
  158. package/dist/clients/inbox/review/anchors.d.ts +41 -0
  159. package/dist/clients/inbox/review/anchors.js +89 -0
  160. package/dist/clients/inbox/review/columns.d.ts +22 -0
  161. package/dist/clients/inbox/review/columns.js +40 -0
  162. package/dist/clients/inbox/review/comments-client.d.ts +66 -0
  163. package/dist/clients/inbox/review/comments-client.js +98 -0
  164. package/dist/clients/inbox/review/composition.d.ts +60 -0
  165. package/dist/clients/inbox/review/composition.js +278 -0
  166. package/dist/clients/inbox/review/document-region.d.ts +120 -0
  167. package/dist/clients/inbox/review/document-region.js +902 -0
  168. package/dist/clients/inbox/review/frame.d.ts +45 -0
  169. package/dist/clients/inbox/review/frame.js +215 -0
  170. package/dist/clients/inbox/review/keys.d.ts +67 -0
  171. package/dist/clients/inbox/review/keys.js +130 -0
  172. package/dist/clients/inbox/review/launch.d.ts +10 -0
  173. package/dist/clients/inbox/review/launch.js +129 -0
  174. package/dist/clients/inbox/review/live-source.d.ts +24 -0
  175. package/dist/clients/inbox/review/live-source.js +160 -0
  176. package/dist/clients/inbox/review/nvim.d.ts +13 -0
  177. package/dist/clients/inbox/review/nvim.js +42 -0
  178. package/dist/clients/inbox/review/remap.d.ts +51 -0
  179. package/dist/clients/inbox/review/remap.js +157 -0
  180. package/dist/clients/inbox/review/review-client.d.ts +30 -0
  181. package/dist/clients/inbox/review/review-client.js +107 -0
  182. package/dist/clients/inbox/review/roundtrip.d.ts +5 -0
  183. package/dist/clients/inbox/review/roundtrip.js +36 -0
  184. package/dist/clients/inbox/review/state.d.ts +143 -0
  185. package/dist/clients/inbox/review/state.js +282 -0
  186. package/dist/clients/inbox/review-adapter.d.ts +29 -0
  187. package/dist/clients/inbox/review-adapter.js +92 -0
  188. package/dist/clients/inbox/review-visibility.d.ts +5 -0
  189. package/dist/clients/inbox/review-visibility.js +19 -0
  190. package/dist/clients/inbox/surface.d.ts +19 -0
  191. package/dist/clients/inbox/surface.js +128 -0
  192. package/dist/clients/inbox/tui/ansi.d.ts +66 -0
  193. package/dist/clients/inbox/tui/ansi.js +317 -0
  194. package/dist/clients/inbox/tui/clipboard.d.ts +2 -0
  195. package/dist/clients/inbox/tui/clipboard.js +26 -0
  196. package/dist/clients/inbox/tui/input.d.ts +7 -0
  197. package/dist/clients/inbox/tui/input.js +653 -0
  198. package/dist/clients/inbox/tui/keys.d.ts +28 -0
  199. package/dist/clients/inbox/tui/keys.js +111 -0
  200. package/dist/clients/inbox/tui/panel.d.ts +2 -0
  201. package/dist/clients/inbox/tui/panel.js +217 -0
  202. package/dist/clients/inbox/tui/render.d.ts +37 -0
  203. package/dist/clients/inbox/tui/render.js +476 -0
  204. package/dist/clients/inbox/tui/types.d.ts +57 -0
  205. package/dist/clients/inbox/tui/types.js +1 -0
  206. package/dist/clients/inbox/tui.d.ts +6 -0
  207. package/dist/clients/inbox/tui.js +74 -0
  208. package/dist/clients/surfaces/host.d.ts +66 -0
  209. package/dist/clients/surfaces/host.js +1 -0
  210. package/dist/clients/surfaces/region.d.ts +16 -0
  211. package/dist/clients/surfaces/region.js +1 -0
  212. package/dist/clients/web/__tests__/push-engine.test.js +14 -158
  213. package/dist/clients/web/dev-server.d.ts +3 -3
  214. package/dist/clients/web/dev-server.js +9 -23
  215. package/dist/clients/web/events.js +4 -6
  216. package/dist/clients/web/push-engine.d.ts +2 -66
  217. package/dist/clients/web/push-engine.js +30 -161
  218. package/dist/clients/web/push-registry.d.ts +0 -4
  219. package/dist/clients/web/push-registry.js +2 -7
  220. package/dist/clients/web/server.js +3 -35
  221. package/dist/clients/web/web-client/shared/protocol.d.ts +0 -108
  222. package/dist/clients/web/web-cmd.js +2 -2
  223. package/dist/commands/__tests__/human.test.js +27 -15
  224. package/dist/commands/api-client.js +3 -3
  225. package/dist/commands/canvas-browse.js +1 -1
  226. package/dist/commands/canvas-issue.js +1 -1
  227. package/dist/commands/canvas-use.js +1 -1
  228. package/dist/commands/human/doc.d.ts +2 -0
  229. package/dist/commands/human/doc.js +98 -0
  230. package/dist/commands/human/inbox.d.ts +2 -0
  231. package/dist/commands/human/inbox.js +101 -0
  232. package/dist/commands/human/prompts.d.ts +2 -3
  233. package/dist/commands/human/prompts.js +27 -180
  234. package/dist/commands/human/queue.d.ts +1 -5
  235. package/dist/commands/human/queue.js +54 -216
  236. package/dist/commands/human/review.d.ts +2 -0
  237. package/dist/commands/human/review.js +298 -0
  238. package/dist/commands/human/shared.d.ts +2 -69
  239. package/dist/commands/human/shared.js +1 -181
  240. package/dist/commands/human.js +15 -20
  241. package/dist/commands/memory/__tests__/lint.test.d.ts +1 -0
  242. package/dist/commands/memory/__tests__/lint.test.js +15 -0
  243. package/dist/commands/memory/delete.js +2 -2
  244. package/dist/commands/memory/lint.d.ts +1 -0
  245. package/dist/commands/memory/lint.js +21 -3
  246. package/dist/commands/memory/read.js +4 -4
  247. package/dist/commands/node.js +8 -7
  248. package/dist/commands/pkg/plugin-manage.js +143 -68
  249. package/dist/commands/surface-inspect.js +2 -2
  250. package/dist/commands/surface.js +6 -12
  251. package/dist/commands/sys/__tests__/setup-core.test.js +9 -5
  252. package/dist/commands/sys/__tests__/setup-front-door.test.js +7 -42
  253. package/dist/commands/sys/config.js +29 -3
  254. package/dist/commands/sys/feedback.js +1 -1
  255. package/dist/commands/sys/setup-core.d.ts +12 -11
  256. package/dist/commands/sys/setup-core.js +55 -46
  257. package/dist/commands/sys/setup-wizard.d.ts +4 -1
  258. package/dist/commands/sys/setup-wizard.js +50 -9
  259. package/dist/commands/sys/sync-deps.js +1 -1
  260. package/dist/commands/sys.js +4 -6
  261. package/dist/core/__tests__/broker-sdk-wiring.test.js +6 -1
  262. package/dist/core/__tests__/broker-snapshot-history.test.js +9 -1
  263. package/dist/core/__tests__/dead-node-policy-table.test.js +3 -4
  264. package/dist/core/__tests__/fixtures/fake-engine.d.ts +8 -5
  265. package/dist/core/__tests__/fixtures/fake-engine.js +28 -2
  266. package/dist/core/__tests__/full/broker-provider-retry.test.js +87 -2
  267. package/dist/core/__tests__/full/broker-whip-interrupt.test.d.ts +1 -0
  268. package/dist/core/__tests__/full/broker-whip-interrupt.test.js +39 -0
  269. package/dist/core/__tests__/full/detach-focus.test.js +1 -1
  270. package/dist/core/__tests__/human-deliver-e2e.test.js +64 -64
  271. package/dist/core/__tests__/human-deliver.test.js +71 -345
  272. package/dist/core/__tests__/inline-memory-refs.test.js +2 -12
  273. package/dist/core/__tests__/memory-resolver-precedence.test.js +12 -15
  274. package/dist/core/__tests__/migration.test.js +10 -0
  275. package/dist/core/__tests__/model-pin-durability.test.js +14 -0
  276. package/dist/core/__tests__/phase4-review-migration.test.d.ts +1 -0
  277. package/dist/core/__tests__/phase4-review-migration.test.js +100 -0
  278. package/dist/core/__tests__/phase4-review-store.test.d.ts +1 -0
  279. package/dist/core/__tests__/phase4-review-store.test.js +143 -0
  280. package/dist/core/__tests__/remote-canvas-target.test.js +2 -2
  281. package/dist/core/__tests__/revive.test.js +22 -53
  282. package/dist/core/__tests__/session-cycles.test.js +48 -18
  283. package/dist/core/__tests__/spawn-no-kickoff.test.js +8 -12
  284. package/dist/core/__tests__/stop-guard.test.js +16 -1
  285. package/dist/core/__tests__/tmux-surface.test.js +21 -25
  286. package/dist/core/asset-root.d.ts +7 -0
  287. package/dist/core/asset-root.js +18 -0
  288. package/dist/core/broker-client/client.d.ts +0 -7
  289. package/dist/core/broker-client/client.js +4 -10
  290. package/dist/core/broker-client/transport-relay.d.ts +3 -4
  291. package/dist/core/broker-client/transport-relay.js +3 -4
  292. package/dist/core/canvas/__tests__/attention.test.js +1 -1
  293. package/dist/core/canvas/__tests__/remote-canvas-source.test.js +1 -1
  294. package/dist/core/canvas/__tests__/remote-transport.test.d.ts +1 -0
  295. package/dist/core/{view/__tests__/transport-remote.test.js → canvas/__tests__/remote-transport.test.js} +2 -2
  296. package/dist/core/canvas/__tests__/render-remote.test.js +1 -1
  297. package/dist/core/canvas/attention.js +4 -4
  298. package/dist/core/canvas/canvas.d.ts +6 -11
  299. package/dist/core/canvas/canvas.js +11 -33
  300. package/dist/core/canvas/db.js +207 -38
  301. package/dist/core/canvas/extensions.d.ts +1 -1
  302. package/dist/core/canvas/extensions.js +8 -1
  303. package/dist/core/canvas/index.d.ts +0 -1
  304. package/dist/core/canvas/index.js +0 -1
  305. package/dist/core/canvas/nav-model.d.ts +1 -1
  306. package/dist/core/canvas/nav-model.js +1 -1
  307. package/dist/core/canvas/paths.d.ts +5 -0
  308. package/dist/core/canvas/paths.js +16 -0
  309. package/dist/core/canvas/remote-canvas-source.js +2 -2
  310. package/dist/core/canvas/remote-transport.d.ts +7 -0
  311. package/dist/core/{view/transport-remote.js → canvas/remote-transport.js} +3 -4
  312. package/dist/core/canvas/source.js +1 -1
  313. package/dist/core/canvas/status-glyph.js +4 -12
  314. package/dist/core/canvas/types.d.ts +10 -35
  315. package/dist/core/clipboard-text.d.ts +8 -0
  316. package/dist/core/clipboard-text.js +18 -0
  317. package/dist/core/command-manifests/registry.d.ts +1 -3
  318. package/dist/core/command-plugins/bundle.d.ts +29 -0
  319. package/dist/core/command-plugins/bundle.js +198 -0
  320. package/dist/core/command-plugins/discovery.d.ts +0 -8
  321. package/dist/core/command-plugins/discovery.js +2 -39
  322. package/dist/core/command-plugins/transport/http-fetch.d.ts +4 -30
  323. package/dist/core/command-plugins/transport/http-fetch.js +17 -95
  324. package/dist/core/command.d.ts +1 -13
  325. package/dist/core/command.js +1 -16
  326. package/dist/core/config.d.ts +4 -0
  327. package/dist/core/config.js +28 -3
  328. package/dist/core/document-lines.d.ts +4 -0
  329. package/dist/core/document-lines.js +6 -0
  330. package/dist/core/feed/feed.d.ts +2 -0
  331. package/dist/core/feed/feed.js +11 -7
  332. package/dist/core/human/__tests__/inbox-cancel-worker.d.ts +1 -0
  333. package/dist/core/human/__tests__/inbox-cancel-worker.js +7 -0
  334. package/dist/core/human/__tests__/inbox-claim-worker.d.ts +1 -0
  335. package/dist/core/human/__tests__/inbox-claim-worker.js +17 -0
  336. package/dist/core/human/__tests__/inbox-core.test.d.ts +1 -0
  337. package/dist/core/human/__tests__/inbox-core.test.js +144 -0
  338. package/dist/core/human/__tests__/inbox-stale-claim-worker.d.ts +1 -0
  339. package/dist/core/human/__tests__/inbox-stale-claim-worker.js +8 -0
  340. package/dist/core/human/__tests__/visible-paths.test.d.ts +1 -0
  341. package/dist/{clients/attach → core/human}/__tests__/visible-paths.test.js +9 -0
  342. package/dist/core/human/claim.d.ts +23 -0
  343. package/dist/core/human/claim.js +67 -0
  344. package/dist/core/human/convention.d.ts +30 -0
  345. package/dist/core/human/convention.js +202 -0
  346. package/dist/core/human/deck-factories.d.ts +8 -0
  347. package/dist/core/human/deck-factories.js +15 -0
  348. package/dist/core/human/deck-schema.d.ts +70 -0
  349. package/dist/core/human/deck-schema.js +92 -0
  350. package/dist/core/human/root.d.ts +7 -0
  351. package/dist/core/human/root.js +37 -0
  352. package/dist/core/human/scan.d.ts +3 -0
  353. package/dist/core/human/scan.js +76 -0
  354. package/dist/core/human/summary.d.ts +8 -0
  355. package/dist/core/human/summary.js +44 -0
  356. package/dist/core/human/tickets.d.ts +49 -0
  357. package/dist/core/human/tickets.js +190 -0
  358. package/dist/core/human/types.d.ts +136 -0
  359. package/dist/core/human/types.js +5 -0
  360. package/dist/{clients/attach → core/human}/visible-paths.d.ts +1 -1
  361. package/dist/{clients/attach → core/human}/visible-paths.js +3 -2
  362. package/dist/core/inspector/chrome.d.ts +6 -0
  363. package/dist/core/inspector/chrome.js +14 -0
  364. package/dist/core/inspector/contract.d.ts +105 -0
  365. package/dist/core/inspector/contract.js +1 -0
  366. package/dist/core/inspector/core.d.ts +4 -5
  367. package/dist/core/inspector/core.js +3 -5
  368. package/dist/core/inspector/host.d.ts +46 -0
  369. package/dist/core/{tui → inspector}/host.js +42 -208
  370. package/dist/core/inspector/text.d.ts +2 -2
  371. package/dist/core/inspector/transport.d.ts +6 -0
  372. package/dist/core/inspector/transport.js +36 -0
  373. package/dist/core/inspector/tui.d.ts +2 -2
  374. package/dist/core/inspector/tui.js +15 -15
  375. package/dist/core/keybindings/__tests__/inbox-affordance.test.js +11 -11
  376. package/dist/core/keybindings/__tests__/resolve.test.js +10 -19
  377. package/dist/core/keybindings/attach-control.d.ts +9 -3
  378. package/dist/core/keybindings/attach-control.js +3 -1
  379. package/dist/core/keybindings/catalog.d.ts +6 -5
  380. package/dist/core/keybindings/catalog.js +61 -133
  381. package/dist/core/keybindings/inbox.d.ts +5 -6
  382. package/dist/core/keybindings/inbox.js +9 -10
  383. package/dist/core/keybindings/index.d.ts +3 -3
  384. package/dist/core/keybindings/index.js +3 -3
  385. package/dist/core/keybindings/persistence.d.ts +5 -1
  386. package/dist/core/keybindings/persistence.js +24 -6
  387. package/dist/core/keybindings/resolve.d.ts +6 -0
  388. package/dist/core/keybindings/resolve.js +10 -3
  389. package/dist/core/memory/inline-ref-grammar.js +2 -3
  390. package/dist/core/memory-resolver.d.ts +27 -29
  391. package/dist/core/memory-resolver.js +45 -39
  392. package/dist/core/model-routes.d.ts +33 -0
  393. package/dist/core/model-routes.js +42 -3
  394. package/dist/core/preview-registry.js +17 -55
  395. package/dist/core/profiles/select.js +3 -3
  396. package/dist/core/{view/remote-canvas-target.d.ts → remote-canvas-target.d.ts} +2 -2
  397. package/dist/core/{view/remote-canvas-target.js → remote-canvas-target.js} +4 -4
  398. package/dist/core/review/__tests__/capture-origin.test.d.ts +1 -0
  399. package/dist/core/review/__tests__/capture-origin.test.js +139 -0
  400. package/dist/core/review/__tests__/comments.test.d.ts +1 -0
  401. package/dist/core/review/__tests__/comments.test.js +98 -0
  402. package/dist/core/review/__tests__/project.test.d.ts +1 -0
  403. package/dist/core/review/__tests__/project.test.js +71 -0
  404. package/dist/core/review/__tests__/remap.test.d.ts +1 -0
  405. package/dist/core/review/__tests__/remap.test.js +159 -0
  406. package/dist/core/review/__tests__/stage-identity.test.d.ts +1 -0
  407. package/dist/core/review/__tests__/stage-identity.test.js +140 -0
  408. package/dist/core/review/birth.d.ts +7 -0
  409. package/dist/core/review/birth.js +23 -0
  410. package/dist/core/review/comments.d.ts +69 -0
  411. package/dist/core/review/comments.js +295 -0
  412. package/dist/core/review/companion.d.ts +35 -0
  413. package/dist/core/review/companion.js +205 -0
  414. package/dist/core/review/document.d.ts +27 -0
  415. package/dist/core/review/document.js +138 -0
  416. package/dist/core/review/project.d.ts +13 -0
  417. package/dist/core/review/project.js +58 -0
  418. package/dist/core/review/realize.d.ts +19 -0
  419. package/dist/core/review/realize.js +217 -0
  420. package/dist/core/review/remap.d.ts +24 -0
  421. package/dist/core/review/remap.js +156 -0
  422. package/dist/core/review/signal.d.ts +5 -0
  423. package/dist/core/review/signal.js +31 -0
  424. package/dist/core/review/stage.d.ts +26 -0
  425. package/dist/core/review/stage.js +184 -0
  426. package/dist/core/review/store.d.ts +46 -0
  427. package/dist/core/review/store.js +163 -0
  428. package/dist/core/review/ticket-filter.d.ts +17 -0
  429. package/dist/core/review/ticket-filter.js +32 -0
  430. package/dist/core/review/types.d.ts +130 -0
  431. package/dist/core/review/types.js +23 -0
  432. package/dist/core/runtime/__tests__/session-visibility.test.d.ts +1 -0
  433. package/dist/core/runtime/__tests__/session-visibility.test.js +119 -0
  434. package/dist/core/runtime/bearings.d.ts +5 -17
  435. package/dist/core/runtime/bearings.js +88 -71
  436. package/dist/core/runtime/broker-protocol.d.ts +31 -8
  437. package/dist/core/runtime/broker.d.ts +15 -1
  438. package/dist/core/runtime/broker.js +573 -141
  439. package/dist/core/runtime/canvas-extensions.d.ts +4 -5
  440. package/dist/core/runtime/canvas-extensions.js +5 -5
  441. package/dist/core/runtime/front-door.js +4 -4
  442. package/dist/core/runtime/headless-pi.d.ts +24 -0
  443. package/dist/core/runtime/headless-pi.js +152 -0
  444. package/dist/core/runtime/kickoff.d.ts +1 -5
  445. package/dist/core/runtime/kickoff.js +1 -5
  446. package/dist/core/runtime/model-registry.d.ts +3 -0
  447. package/dist/core/runtime/model-registry.js +13 -0
  448. package/dist/core/runtime/naming-persist.d.ts +4 -0
  449. package/dist/core/runtime/naming-persist.js +27 -1
  450. package/dist/core/runtime/naming.d.ts +17 -12
  451. package/dist/core/runtime/naming.js +91 -140
  452. package/dist/core/runtime/node-read.js +19 -10
  453. package/dist/core/runtime/nodes.d.ts +9 -14
  454. package/dist/core/runtime/nodes.js +3 -53
  455. package/dist/core/runtime/package-health.d.ts +6 -21
  456. package/dist/core/runtime/package-health.js +12 -123
  457. package/dist/core/runtime/placement-tmux.d.ts +2 -1
  458. package/dist/core/runtime/placement-tmux.js +6 -4
  459. package/dist/core/runtime/placement.d.ts +1 -0
  460. package/dist/core/runtime/placement.js +4 -8
  461. package/dist/core/runtime/promote.js +3 -0
  462. package/dist/core/runtime/recap.d.ts +2 -7
  463. package/dist/core/runtime/recap.js +35 -69
  464. package/dist/core/runtime/revive.js +34 -77
  465. package/dist/core/runtime/session-cycles.d.ts +4 -0
  466. package/dist/core/runtime/session-cycles.js +14 -1
  467. package/dist/core/runtime/session-visibility.d.ts +37 -0
  468. package/dist/core/runtime/session-visibility.js +83 -0
  469. package/dist/core/runtime/spawn.js +10 -22
  470. package/dist/core/runtime/stop-guard.d.ts +1 -1
  471. package/dist/core/runtime/stop-guard.js +18 -13
  472. package/dist/core/runtime/surface-bg.js +1 -1
  473. package/dist/core/runtime/tmux-chrome.d.ts +1 -1
  474. package/dist/core/runtime/tmux-chrome.js +1 -1
  475. package/dist/core/runtime/tmux.d.ts +35 -7
  476. package/dist/core/runtime/tmux.js +439 -62
  477. package/dist/core/runtime/tool-group-summary.d.ts +19 -0
  478. package/dist/core/runtime/tool-group-summary.js +88 -0
  479. package/dist/core/scope.d.ts +2 -7
  480. package/dist/core/scope.js +9 -35
  481. package/dist/core/substrate/schema.d.ts +2 -2
  482. package/dist/core/termrender/code-doc.d.ts +12 -0
  483. package/dist/core/termrender/code-doc.js +92 -0
  484. package/dist/core/termrender/display.d.ts +12 -0
  485. package/dist/core/termrender/display.js +19 -0
  486. package/dist/core/termrender/termrender.d.ts +73 -0
  487. package/dist/core/termrender/termrender.js +795 -0
  488. package/dist/core/termrender/version.d.ts +1 -0
  489. package/dist/core/termrender/version.js +1 -0
  490. package/dist/core/tui/terminal.js +1 -2
  491. package/dist/core/user-settings.d.ts +71 -3
  492. package/dist/core/user-settings.js +83 -1
  493. package/dist/daemon/api/__tests__/inbox.test.js +44 -133
  494. package/dist/daemon/api/handlers/human.d.ts +0 -10
  495. package/dist/daemon/api/handlers/human.js +104 -702
  496. package/dist/daemon/api/handlers/inbox.js +113 -142
  497. package/dist/daemon/api/handlers/review-comments.d.ts +2 -0
  498. package/dist/daemon/api/handlers/review-comments.js +500 -0
  499. package/dist/daemon/api/handlers/reviews.d.ts +2 -0
  500. package/dist/daemon/api/handlers/reviews.js +287 -0
  501. package/dist/daemon/api/map.d.ts +22 -7
  502. package/dist/daemon/api/map.js +159 -11
  503. package/dist/daemon/api/server.js +4 -0
  504. package/dist/daemon/cron-run.js +6 -9
  505. package/dist/daemon/crtrd.js +17 -33
  506. package/dist/daemon/fleet.d.ts +1 -8
  507. package/dist/daemon/fleet.js +4 -30
  508. package/dist/daemon/human/finish.d.ts +14 -0
  509. package/dist/daemon/human/finish.js +115 -0
  510. package/dist/daemon/human/sweep.d.ts +6 -0
  511. package/dist/daemon/human/sweep.js +49 -0
  512. package/dist/daemon/messaging/node-message.d.ts +18 -0
  513. package/dist/daemon/messaging/node-message.js +70 -0
  514. package/dist/daemon/review/comment-notify.d.ts +26 -0
  515. package/dist/daemon/review/comment-notify.js +107 -0
  516. package/dist/daemon/review/deliver.d.ts +7 -0
  517. package/dist/daemon/review/deliver.js +56 -0
  518. package/dist/daemon/review/finish.d.ts +22 -0
  519. package/dist/daemon/review/finish.js +254 -0
  520. package/dist/daemon/review/sweep.d.ts +11 -0
  521. package/dist/daemon/review/sweep.js +120 -0
  522. package/dist/index.d.ts +2 -0
  523. package/dist/index.js +2 -2
  524. package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +42 -64
  525. package/dist/pi-extensions/__tests__/canvas-recap.test.d.ts +1 -0
  526. package/dist/pi-extensions/__tests__/canvas-recap.test.js +159 -0
  527. package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +16 -38
  528. package/dist/pi-extensions/__tests__/canvas-structured-output.test.d.ts +1 -0
  529. package/dist/pi-extensions/__tests__/canvas-structured-output.test.js +63 -0
  530. package/dist/pi-extensions/canvas-context-intro.d.ts +8 -11
  531. package/dist/pi-extensions/canvas-context-intro.js +50 -104
  532. package/dist/pi-extensions/canvas-recap.d.ts +15 -2
  533. package/dist/pi-extensions/canvas-recap.js +192 -69
  534. package/dist/pi-extensions/canvas-review-boundary.d.ts +59 -0
  535. package/dist/pi-extensions/canvas-review-boundary.js +81 -0
  536. package/dist/pi-extensions/canvas-stophook.d.ts +3 -3
  537. package/dist/pi-extensions/canvas-stophook.js +78 -128
  538. package/dist/pi-extensions/canvas-structured-output.js +52 -8
  539. package/dist/shared/generated-context.d.ts +29 -4
  540. package/dist/shared/generated-context.js +122 -7
  541. package/dist/shared/tool-groups.d.ts +23 -0
  542. package/dist/shared/tool-groups.js +60 -0
  543. package/dist/shared/working-activity.d.ts +8 -0
  544. package/dist/shared/working-activity.js +26 -0
  545. package/dist/types.d.ts +36 -2
  546. package/dist/types.js +51 -0
  547. package/dist/web-client/assets/index-CCPaLeW7.css +2 -0
  548. package/dist/web-client/assets/index-kyOWsnZK.js +86 -0
  549. package/dist/web-client/index.html +2 -2
  550. package/dist/web-client/sw.js +1 -1
  551. package/docs/compat/hearth-crtr-v4.md +2 -2
  552. package/docs/compat/hearth-crtr-v5.md +4 -2
  553. package/docs/public-api.md +3 -3
  554. package/package.json +21 -14
  555. package/runtime.lock.json +4661 -1453
  556. package/scripts/postinstall.mjs +15 -2
  557. package/dist/builtin-pi-packages/pi-mode-switch/README.md +0 -36
  558. package/dist/builtin-pi-packages/pi-mode-switch/bin/mode +0 -36
  559. package/dist/builtin-pi-packages/pi-mode-switch/extensions/index.ts +0 -449
  560. package/dist/builtin-pi-packages/pi-mode-switch/package.json +0 -14
  561. package/dist/builtin-pi-packages/pi-mode-switch/tsconfig.json +0 -9
  562. package/dist/builtin-views/_lib/states.mjs +0 -161
  563. package/dist/builtin-views/canvas/core.mjs +0 -657
  564. package/dist/builtin-views/canvas/text.mjs +0 -58
  565. package/dist/builtin-views/canvas/tui.mjs +0 -168
  566. package/dist/builtin-views/canvas/web.jsx +0 -121
  567. package/dist/builtin-views/chat/core.mjs +0 -684
  568. package/dist/builtin-views/chat/text.mjs +0 -101
  569. package/dist/builtin-views/chat/tui.mjs +0 -360
  570. package/dist/builtin-views/chat/web.jsx +0 -362
  571. package/dist/builtin-views/git-pr/core.mjs +0 -673
  572. package/dist/builtin-views/git-pr/text.mjs +0 -84
  573. package/dist/builtin-views/git-pr/tui.mjs +0 -301
  574. package/dist/builtin-views/git-pr/web.jsx +0 -216
  575. package/dist/builtin-views/inbox/_lib/render.mjs +0 -175
  576. package/dist/builtin-views/inbox/core.mjs +0 -1273
  577. package/dist/builtin-views/inbox/text.mjs +0 -73
  578. package/dist/builtin-views/inbox/tui.mjs +0 -314
  579. package/dist/builtin-views/inbox/web.jsx +0 -188
  580. package/dist/builtin-views/linkedin/core.mjs +0 -906
  581. package/dist/builtin-views/linkedin/text.mjs +0 -69
  582. package/dist/builtin-views/linkedin/tui.mjs +0 -413
  583. package/dist/builtin-views/linkedin/web.jsx +0 -206
  584. package/dist/builtin-views/prompt-review/core.mjs +0 -735
  585. package/dist/builtin-views/prompt-review/text.mjs +0 -15
  586. package/dist/builtin-views/prompt-review/tui.mjs +0 -196
  587. package/dist/builtin-views/prompt-review/web.jsx +0 -484
  588. package/dist/builtin-views/workspace-sidebar/__tests__/core.test.js +0 -50
  589. package/dist/builtin-views/workspace-sidebar/__tests__/core.test.ts +0 -53
  590. package/dist/builtin-views/workspace-sidebar/core.mjs +0 -670
  591. package/dist/builtin-views/workspace-sidebar/text.mjs +0 -53
  592. package/dist/builtin-views/workspace-sidebar/tui.mjs +0 -141
  593. package/dist/builtin-views/workspace-sidebar/web.jsx +0 -109
  594. package/dist/clients/attach/session/mode.d.ts +0 -25
  595. package/dist/clients/attach/session/mode.js +0 -97
  596. package/dist/commands/sys/promptstudio.d.ts +0 -2
  597. package/dist/commands/sys/promptstudio.js +0 -65
  598. package/dist/commands/view-cycle.d.ts +0 -2
  599. package/dist/commands/view-cycle.js +0 -130
  600. package/dist/commands/view-list.d.ts +0 -2
  601. package/dist/commands/view-list.js +0 -66
  602. package/dist/commands/view-new.d.ts +0 -2
  603. package/dist/commands/view-new.js +0 -74
  604. package/dist/commands/view-pick.d.ts +0 -6
  605. package/dist/commands/view-pick.js +0 -129
  606. package/dist/commands/view-run.d.ts +0 -2
  607. package/dist/commands/view-run.js +0 -214
  608. package/dist/commands/view.d.ts +0 -2
  609. package/dist/commands/view.js +0 -31
  610. package/dist/commands/workspace.d.ts +0 -2
  611. package/dist/commands/workspace.js +0 -165
  612. package/dist/core/__tests__/chat-view-reconnect.test.js +0 -105
  613. package/dist/core/__tests__/full/consult-startup-failure.test.js +0 -124
  614. package/dist/core/canvas/__tests__/human-work-outbox.test.js +0 -123
  615. package/dist/core/canvas/human-work-outbox.d.ts +0 -73
  616. package/dist/core/canvas/human-work-outbox.js +0 -261
  617. package/dist/core/command-plugins/store.d.ts +0 -16
  618. package/dist/core/command-plugins/store.js +0 -64
  619. package/dist/core/keybindings/__tests__/bespoke-consumers.test.js +0 -40
  620. package/dist/core/runtime/fault-recovery-nudge.d.ts +0 -3
  621. package/dist/core/runtime/fault-recovery-nudge.js +0 -3
  622. package/dist/core/tui/__tests__/host-keybindings.test.js +0 -113
  623. package/dist/core/tui/host.d.ts +0 -66
  624. package/dist/core/view/__tests__/transport-cache.test.js +0 -62
  625. package/dist/core/view/bridge.d.ts +0 -10
  626. package/dist/core/view/bridge.js +0 -31
  627. package/dist/core/view/chrome.d.ts +0 -9
  628. package/dist/core/view/chrome.js +0 -22
  629. package/dist/core/view/contract.d.ts +0 -205
  630. package/dist/core/view/contract.js +0 -23
  631. package/dist/core/view/loader.d.ts +0 -31
  632. package/dist/core/view/loader.js +0 -188
  633. package/dist/core/view/stream-local.d.ts +0 -3
  634. package/dist/core/view/stream-local.js +0 -231
  635. package/dist/core/view/transport-cache.d.ts +0 -8
  636. package/dist/core/view/transport-cache.js +0 -38
  637. package/dist/core/view/transport-local.d.ts +0 -7
  638. package/dist/core/view/transport-local.js +0 -83
  639. package/dist/core/view/transport-remote.d.ts +0 -2
  640. package/dist/core/view/transport.d.ts +0 -10
  641. package/dist/core/view/transport.js +0 -15
  642. package/dist/pi-extensions/naming-tool.d.ts +0 -24
  643. package/dist/pi-extensions/naming-tool.js +0 -67
  644. package/dist/prompts/view.d.ts +0 -7
  645. package/dist/prompts/view.js +0 -172
  646. package/dist/web/ViewChrome.d.ts +0 -7
  647. package/dist/web/ViewChrome.js +0 -28
  648. package/dist/web/ViewPane.d.ts +0 -39
  649. package/dist/web/ViewPane.js +0 -48
  650. package/dist/web/index.d.ts +0 -8
  651. package/dist/web/index.js +0 -22
  652. package/dist/web/runtime.d.ts +0 -39
  653. package/dist/web/runtime.js +0 -232
  654. package/dist/web/states.d.ts +0 -24
  655. package/dist/web/states.js +0 -24
  656. package/dist/web/transport-http.d.ts +0 -5
  657. package/dist/web/transport-http.js +0 -34
  658. package/dist/web/transport-stream.d.ts +0 -3
  659. package/dist/web/transport-stream.js +0 -204
  660. package/dist/web-client/assets/index-U_NZ66VE.js +0 -79
  661. package/dist/web-client/assets/index-aaeu4adv.css +0 -2
  662. /package/dist/{builtin-views/workspace-sidebar/__tests__/core.test.d.ts → clients/attach/__tests__/file-review-focus.test.d.ts} +0 -0
  663. /package/dist/clients/attach/__tests__/{visible-paths.test.d.ts → group-activity.test.d.ts} +0 -0
  664. /package/dist/{core/__tests__/chat-view-reconnect.test.d.ts → clients/attach/__tests__/input-controller-extension-command.test.d.ts} +0 -0
  665. /package/dist/{core/__tests__/full/consult-startup-failure.test.d.ts → clients/attach/__tests__/session-identity-refresh.test.d.ts} +0 -0
  666. /package/dist/{core/canvas/__tests__/human-work-outbox.test.d.ts → clients/inbox/__tests__/inbox-controller.test.d.ts} +0 -0
  667. /package/dist/{core/keybindings/__tests__/bespoke-consumers.test.d.ts → clients/inbox/__tests__/mount-panel.test.d.ts} +0 -0
  668. /package/dist/{core/tui/__tests__/host-keybindings.test.d.ts → clients/inbox/review/__tests__/editor-roundtrip.test.d.ts} +0 -0
  669. /package/dist/{core/view/__tests__/transport-cache.test.d.ts → clients/inbox/review/__tests__/remap.test.d.ts} +0 -0
  670. /package/dist/{core/view/__tests__/transport-remote.test.d.ts → clients/inbox/review/__tests__/review-core.test.d.ts} +0 -0
@@ -0,0 +1,128 @@
1
+ import { InboxController } from './controller.js';
2
+ import { scanInbox } from '../../core/human/scan.js';
3
+ import { cliClient } from '../../commands/api-client.js';
4
+ import { filterVisibleReviewTickets } from './review-visibility.js';
5
+ import { decodeInboxKey } from './tui/keys.js';
6
+ import { clipLine, visibleWidth } from './tui/ansi.js';
7
+ class InboxComponent {
8
+ controller;
9
+ focused = false;
10
+ rows = 0;
11
+ width = -1;
12
+ height = -1;
13
+ handle;
14
+ constructor(controller) {
15
+ this.controller = controller;
16
+ }
17
+ setRows(rows) {
18
+ this.rows = rows;
19
+ }
20
+ render(width) {
21
+ const rows = this.rows;
22
+ if (width !== this.width || rows !== this.height) {
23
+ this.width = width;
24
+ this.height = rows;
25
+ this.controller.resize(width, rows);
26
+ }
27
+ return padFrame(this.controller.render(), width, rows);
28
+ }
29
+ handleInput(data) {
30
+ const { input, key } = decodeInboxKey(data);
31
+ this.controller.handleKey(input, key);
32
+ }
33
+ invalidate() {
34
+ this.handle?.invalidate();
35
+ }
36
+ setHandle(handle) {
37
+ this.handle = handle;
38
+ }
39
+ }
40
+ function padFrame(lines, cols, rows) {
41
+ const frame = lines.slice(0, rows);
42
+ while (frame.length < rows)
43
+ frame.push('');
44
+ return frame.map((line) => {
45
+ const clipped = clipLine(line, cols);
46
+ return clipped + ' '.repeat(Math.max(0, cols - visibleWidth(clipped)));
47
+ });
48
+ }
49
+ export function createInboxSurface(opts) {
50
+ let session;
51
+ const close = () => {
52
+ const current = session;
53
+ if (current === undefined || current.closed)
54
+ return;
55
+ current.closed = true;
56
+ session = undefined;
57
+ current.controller?.close();
58
+ current.handle?.close();
59
+ current.controller = undefined;
60
+ current.handle = undefined;
61
+ };
62
+ const mount = (current) => {
63
+ if (current.closed || session !== current)
64
+ return;
65
+ const localScan = opts.scan ?? scanInbox;
66
+ const nextController = new InboxController({
67
+ host: opts.host,
68
+ tui: opts.tui,
69
+ canvasSource: opts.canvasSource,
70
+ onDirty: () => current.handle?.invalidate(),
71
+ onClosed: close,
72
+ scan: () => filterVisibleReviewTickets(localScan(), current.visibleIds),
73
+ onInboxActivity: () => refresh(current),
74
+ });
75
+ const component = new InboxComponent(nextController);
76
+ current.controller = nextController;
77
+ try {
78
+ const handle = opts.host.mount(component);
79
+ current.handle = handle;
80
+ component.setHandle(handle);
81
+ handle.onClose(() => {
82
+ if (current.handle === handle)
83
+ current.handle = undefined;
84
+ nextController.close();
85
+ });
86
+ nextController.start();
87
+ }
88
+ catch (error) {
89
+ close();
90
+ throw error;
91
+ }
92
+ };
93
+ const refresh = (current, initial = false) => {
94
+ const generation = ++current.refreshGeneration;
95
+ void cliClient().listHumanInbox().then(({ tickets }) => {
96
+ if (current.closed || session !== current || generation !== current.refreshGeneration)
97
+ return;
98
+ current.visibleIds = new Set(tickets.map((ticket) => ticket.ticket_id));
99
+ if (current.controller === undefined)
100
+ mount(current);
101
+ else
102
+ current.controller.invalidate();
103
+ }, (error) => {
104
+ if (!initial || current.closed || session !== current || generation !== current.refreshGeneration)
105
+ return;
106
+ close();
107
+ opts.host.notice(`Could not load inbox visibility: ${error instanceof Error ? error.message : String(error)}`);
108
+ });
109
+ };
110
+ const toggle = () => {
111
+ if (session !== undefined) {
112
+ close();
113
+ return;
114
+ }
115
+ if (opts.host.capabilities.remote) {
116
+ opts.host.notice('The inbox is unavailable in a remote attach.');
117
+ return;
118
+ }
119
+ const current = { closed: false, refreshGeneration: 0, visibleIds: new Set() };
120
+ session = current;
121
+ refresh(current, true);
122
+ };
123
+ return {
124
+ toggle,
125
+ close,
126
+ isOpen: () => session !== undefined,
127
+ };
128
+ }
@@ -0,0 +1,66 @@
1
+ export declare const ESC = "\u001B[";
2
+ export declare const RESET = "\u001B[0m";
3
+ export declare const BOLD = "\u001B[1m";
4
+ export declare const DIM = "\u001B[2m";
5
+ export declare const ITALIC = "\u001B[3m";
6
+ export declare const RED = "\u001B[31m";
7
+ export declare const GREEN = "\u001B[32m";
8
+ export declare const YELLOW = "\u001B[33m";
9
+ export declare const CYAN = "\u001B[36m";
10
+ export declare const GRAY = "\u001B[90m";
11
+ export declare const REVERSE = "\u001B[7m";
12
+ export declare function sanitize(text: string): string;
13
+ export declare function singleLine(text: string): string;
14
+ export declare function hline(width: number, char?: string): string;
15
+ export declare function padRight(text: string, width: number): string;
16
+ /** Char-based width truncation with a trailing ellipsis. The canonical deck
17
+ * renderer variant. */
18
+ export declare function truncate(text: string, maxWidth: number): string;
19
+ /** Word-aware truncation that also flattens newlines and strips decorative
20
+ * emoji — tuned for dense inbox rows (ported from sisyphus format.ts). Kept
21
+ * distinct from `truncate` because those two surfaces want different behavior. */
22
+ export declare function truncateRow(text: string, max: number): string;
23
+ /** Word-wrap on whitespace; splits on `\n` into separate paragraphs. */
24
+ export declare function wrap(text: string, maxWidth: number): string[];
25
+ /** Hard character wrap that ignores word boundaries; splits on `\n`. Used for
26
+ * free-form input buffers where every character (including runs without
27
+ * spaces) must stay on screen. */
28
+ export declare function hardWrap(text: string, maxWidth: number): string[];
29
+ /**
30
+ * Pad each non-empty line with leading spaces to horizontally center the
31
+ * `contentWidth`-wide block within `cols`. Wide terminals get breathing room;
32
+ * narrow panes skip centering. Empty lines stay empty so frame diffing keeps
33
+ * them as cheap no-ops.
34
+ */
35
+ export declare function centerHorizontal(lines: string[], cols: number, contentWidth: number): string[];
36
+ /** Visible width of a line in display cells (string-width ignores ANSI). */
37
+ export declare function visibleWidth(line: string): number;
38
+ /**
39
+ * The one display-cell containment primitive: the visible cells
40
+ * `[start, start + width)` of `line`, with escape sequences preserved.
41
+ *
42
+ * Every line rendered into a rectangle must fit within its assigned width, so
43
+ * each logical line occupies one physical row. Overflow wraps into the next
44
+ * row and violates the frame contract. Styling seen before
45
+ * the window is replayed at its head so a slice keeps the colors it had in
46
+ * place, and a double-width glyph straddling either edge becomes spaces so
47
+ * the slice occupies exactly the cells it claims.
48
+ */
49
+ export declare function sliceCells(line: string, start: number, width: number): string;
50
+ /**
51
+ * ANSI-aware clip: truncate a line's visible width to `maxWidth`. Thin
52
+ * wrapper over `sliceCells` so containment has a single implementation.
53
+ */
54
+ export declare function clipLine(line: string, maxWidth: number): string;
55
+ /**
56
+ * Horizontal window onto a row that may be wider than its rectangle (a
57
+ * Mermaid diagram rendered at the pane's full width). A row that fits is
58
+ * returned untouched — panning only ever moves content that overflows, so
59
+ * prose stays put while a diagram slides. Hidden content on either side is
60
+ * marked with a dim ‹/› in the edge cell, so the row always states whether
61
+ * more of the diagram exists left or right, and the marker disappears once
62
+ * that edge is reached (nothing is unreachable).
63
+ */
64
+ export declare function panLine(line: string, offset: number, width: number): string;
65
+ /** Cells of `line` that fall outside a `width`-wide rectangle. */
66
+ export declare function rowOverflow(line: string, width: number): number;
@@ -0,0 +1,317 @@
1
+ import stringWidth from 'string-width';
2
+ // ── ANSI escape constants ─────────────────────────────────────────────────────
3
+ // The single home for these — both the deck renderer (render.ts) and the inbox
4
+ // picker (inbox/tui.ts) import from here rather than keeping their own copies.
5
+ export const ESC = '\x1b[';
6
+ export const RESET = `${ESC}0m`;
7
+ export const BOLD = `${ESC}1m`;
8
+ export const DIM = `${ESC}2m`;
9
+ export const ITALIC = `${ESC}3m`;
10
+ export const RED = `${ESC}31m`;
11
+ export const GREEN = `${ESC}32m`;
12
+ export const YELLOW = `${ESC}33m`;
13
+ export const CYAN = `${ESC}36m`;
14
+ export const GRAY = `${ESC}90m`;
15
+ export const REVERSE = `${ESC}7m`;
16
+ // ── Text helpers ──────────────────────────────────────────────────────────────
17
+ const CONTROL_CHARS_RE = /\x1b\[[0-9;?]*[a-zA-Z]|\x1b[@-_]|[\x00-\x08\x0B\x0E-\x1F\x7F-\x9F]/g;
18
+ export function sanitize(text) {
19
+ if (typeof text !== 'string')
20
+ return '';
21
+ return text.replace(CONTROL_CHARS_RE, '');
22
+ }
23
+ export function singleLine(text) {
24
+ return sanitize(text).replace(/\s+/g, ' ').trim();
25
+ }
26
+ export function hline(width, char = '─') {
27
+ if (width < 1)
28
+ return '';
29
+ return char.repeat(width);
30
+ }
31
+ export function padRight(text, width) {
32
+ const w = stringWidth(text);
33
+ if (w >= width)
34
+ return text;
35
+ return text + ' '.repeat(width - w);
36
+ }
37
+ /** Char-based width truncation with a trailing ellipsis. The canonical deck
38
+ * renderer variant. */
39
+ export function truncate(text, maxWidth) {
40
+ if (maxWidth < 1)
41
+ return '';
42
+ if (stringWidth(text) <= maxWidth)
43
+ return text;
44
+ const chars = [...text];
45
+ let w = 0;
46
+ let out = '';
47
+ for (const ch of chars) {
48
+ const cw = stringWidth(ch);
49
+ if (w + cw + 1 > maxWidth)
50
+ break;
51
+ out += ch;
52
+ w += cw;
53
+ }
54
+ return out + '…';
55
+ }
56
+ /** Word-aware truncation that also flattens newlines and strips decorative
57
+ * emoji — tuned for dense inbox rows (ported from sisyphus format.ts). Kept
58
+ * distinct from `truncate` because those two surfaces want different behavior. */
59
+ export function truncateRow(text, max) {
60
+ const clean = text.replace(/\n/g, ' ').replace(/✅/g, '✓').replace(/❌/g, '✗').replace(/\p{Emoji_Presentation}/gu, '');
61
+ if (max < 4)
62
+ return clean.slice(0, max);
63
+ const w = stringWidth(clean);
64
+ if (w <= max)
65
+ return clean;
66
+ let result = clean;
67
+ while (stringWidth(result) > max - 1 && result.length > 0) {
68
+ const cut = result.lastIndexOf(' ', result.length - 2);
69
+ if (cut > max * 0.4) {
70
+ result = result.slice(0, cut);
71
+ }
72
+ else {
73
+ result = result.slice(0, result.length - 1);
74
+ }
75
+ }
76
+ return result + '…';
77
+ }
78
+ function sliceByWidth(s, maxWidth) {
79
+ let w = 0;
80
+ let out = '';
81
+ for (const ch of s) {
82
+ const cw = stringWidth(ch);
83
+ if (w + cw > maxWidth)
84
+ break;
85
+ out += ch;
86
+ w += cw;
87
+ }
88
+ if (out === '' && s.length > 0)
89
+ out = [...s][0];
90
+ return out;
91
+ }
92
+ /** Word-wrap on whitespace; splits on `\n` into separate paragraphs. */
93
+ export function wrap(text, maxWidth) {
94
+ if (maxWidth < 1)
95
+ return [text];
96
+ const out = [];
97
+ const paragraphs = text.split('\n');
98
+ for (let p = 0; p < paragraphs.length; p++) {
99
+ const para = paragraphs[p];
100
+ if (para === '') {
101
+ out.push('');
102
+ continue;
103
+ }
104
+ const words = para.split(/[ \t]+/).filter(Boolean);
105
+ let current = '';
106
+ for (let word of words) {
107
+ while (stringWidth(word) > maxWidth) {
108
+ if (current) {
109
+ out.push(current);
110
+ current = '';
111
+ }
112
+ const piece = sliceByWidth(word, maxWidth);
113
+ out.push(piece);
114
+ word = word.slice(piece.length);
115
+ }
116
+ const candidate = current ? `${current} ${word}` : word;
117
+ if (stringWidth(candidate) <= maxWidth) {
118
+ current = candidate;
119
+ }
120
+ else {
121
+ if (current)
122
+ out.push(current);
123
+ current = word;
124
+ }
125
+ }
126
+ if (current)
127
+ out.push(current);
128
+ }
129
+ return out.length > 0 ? out : [''];
130
+ }
131
+ /** Hard character wrap that ignores word boundaries; splits on `\n`. Used for
132
+ * free-form input buffers where every character (including runs without
133
+ * spaces) must stay on screen. */
134
+ export function hardWrap(text, maxWidth) {
135
+ if (maxWidth < 1)
136
+ return [text];
137
+ const segments = text.split('\n');
138
+ const out = [];
139
+ for (const seg of segments) {
140
+ if (seg.length === 0) {
141
+ out.push('');
142
+ continue;
143
+ }
144
+ let current = '';
145
+ let currentW = 0;
146
+ for (const ch of [...seg]) {
147
+ const cw = stringWidth(ch);
148
+ if (currentW + cw > maxWidth) {
149
+ out.push(current);
150
+ current = ch;
151
+ currentW = cw;
152
+ }
153
+ else {
154
+ current += ch;
155
+ currentW += cw;
156
+ }
157
+ }
158
+ out.push(current);
159
+ }
160
+ return out;
161
+ }
162
+ /**
163
+ * Pad each non-empty line with leading spaces to horizontally center the
164
+ * `contentWidth`-wide block within `cols`. Wide terminals get breathing room;
165
+ * narrow panes skip centering. Empty lines stay empty so frame diffing keeps
166
+ * them as cheap no-ops.
167
+ */
168
+ export function centerHorizontal(lines, cols, contentWidth) {
169
+ const extraPad = Math.max(0, Math.floor((cols - contentWidth) / 2));
170
+ if (extraPad === 0)
171
+ return lines;
172
+ const pad = ' '.repeat(extraPad);
173
+ return lines.map((line) => (line === '' ? '' : pad + line));
174
+ }
175
+ /** Visible width of a line in display cells (string-width ignores ANSI). */
176
+ export function visibleWidth(line) {
177
+ return stringWidth(line);
178
+ }
179
+ const ANSI_TOKEN = /\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)|\x1b_[^\x07\x1b]*(?:\x07|\x1b\\)|\x1b\[[0-9;?]*[a-zA-Z]|\x1b[@-^]/g;
180
+ const OSC8_TOKEN = /\x1b\]8;[^;\x07\x1b]*;([^\x07\x1b]*)(\x07|\x1b\\)/g;
181
+ const GRAPHEMES = new Intl.Segmenter(undefined, { granularity: 'grapheme' });
182
+ /** ANSI escapes are tokens of their own; all printable text is segmented into
183
+ * extended grapheme clusters before widths or slice boundaries are calculated.
184
+ * `string-width` assigns display width to the complete cluster (not its
185
+ * constituent code points), which keeps ZWJ emoji, flags, skin tones and
186
+ * combining sequences indivisible while panning. */
187
+ function displayTokens(line) {
188
+ const tokens = [];
189
+ let at = 0;
190
+ ANSI_TOKEN.lastIndex = 0;
191
+ for (let match = ANSI_TOKEN.exec(line); match !== null; match = ANSI_TOKEN.exec(line)) {
192
+ for (const segment of GRAPHEMES.segment(line.slice(at, match.index))) {
193
+ tokens.push({ ansi: false, text: segment.segment, width: stringWidth(segment.segment) });
194
+ }
195
+ tokens.push({ ansi: true, text: match[0] });
196
+ at = match.index + match[0].length;
197
+ }
198
+ for (const segment of GRAPHEMES.segment(line.slice(at))) {
199
+ tokens.push({ ansi: false, text: segment.segment, width: stringWidth(segment.segment) });
200
+ }
201
+ return tokens;
202
+ }
203
+ /**
204
+ * The one display-cell containment primitive: the visible cells
205
+ * `[start, start + width)` of `line`, with escape sequences preserved.
206
+ *
207
+ * Every line rendered into a rectangle must fit within its assigned width, so
208
+ * each logical line occupies one physical row. Overflow wraps into the next
209
+ * row and violates the frame contract. Styling seen before
210
+ * the window is replayed at its head so a slice keeps the colors it had in
211
+ * place, and a double-width glyph straddling either edge becomes spaces so
212
+ * the slice occupies exactly the cells it claims.
213
+ */
214
+ export function sliceCells(line, start, width) {
215
+ if (width < 1)
216
+ return '';
217
+ const from = Math.max(0, start);
218
+ const end = from + width;
219
+ let carried = ''; // styling established before the window
220
+ let out = '';
221
+ let emitted = false; // any escape inside the window
222
+ let cell = 0;
223
+ for (const token of displayTokens(line)) {
224
+ if (token.ansi) {
225
+ if (cell < from)
226
+ carried += token.text;
227
+ else {
228
+ out += token.text;
229
+ emitted = true;
230
+ }
231
+ continue;
232
+ }
233
+ if (cell >= end)
234
+ break;
235
+ const cw = token.width;
236
+ // A standalone combining mark has no cells but is still a complete
237
+ // grapheme cluster; retain it whenever its zero-width position is inside
238
+ // the window rather than dropping it through the usual boundary check.
239
+ if (cw === 0) {
240
+ if (cell >= from)
241
+ out += token.text;
242
+ continue;
243
+ }
244
+ if (cell + cw <= from) {
245
+ cell += cw;
246
+ continue;
247
+ }
248
+ if (cell < from) { // whole grapheme straddles the left edge
249
+ out += ' '.repeat(cell + cw - from);
250
+ cell += cw;
251
+ continue;
252
+ }
253
+ if (cell + cw > end) { // whole grapheme straddles the right edge
254
+ out += ' '.repeat(end - cell);
255
+ cell = end;
256
+ break;
257
+ }
258
+ out += token.text;
259
+ cell += cw;
260
+ }
261
+ if (out === '')
262
+ return '';
263
+ if (carried !== '') {
264
+ out = carried + out;
265
+ emitted = true;
266
+ }
267
+ const hyperlinkClose = closeActiveOsc8(out);
268
+ return emitted ? out + hyperlinkClose + RESET : out;
269
+ }
270
+ /** Close an OSC-8 hyperlink that starts inside a clipped row so it cannot
271
+ * remain active through padding or the next terminal row. */
272
+ function closeActiveOsc8(line) {
273
+ let close = '';
274
+ OSC8_TOKEN.lastIndex = 0;
275
+ for (let match = OSC8_TOKEN.exec(line); match !== null; match = OSC8_TOKEN.exec(line)) {
276
+ close = match[1] === '' ? '' : `\x1b]8;;${match[2]}`;
277
+ }
278
+ return close;
279
+ }
280
+ /**
281
+ * ANSI-aware clip: truncate a line's visible width to `maxWidth`. Thin
282
+ * wrapper over `sliceCells` so containment has a single implementation.
283
+ */
284
+ export function clipLine(line, maxWidth) {
285
+ if (maxWidth < 1)
286
+ return '';
287
+ if (stringWidth(line) <= maxWidth)
288
+ return line; // string-width ignores ANSI
289
+ return sliceCells(line, 0, maxWidth);
290
+ }
291
+ /**
292
+ * Horizontal window onto a row that may be wider than its rectangle (a
293
+ * Mermaid diagram rendered at the pane's full width). A row that fits is
294
+ * returned untouched — panning only ever moves content that overflows, so
295
+ * prose stays put while a diagram slides. Hidden content on either side is
296
+ * marked with a dim ‹/› in the edge cell, so the row always states whether
297
+ * more of the diagram exists left or right, and the marker disappears once
298
+ * that edge is reached (nothing is unreachable).
299
+ */
300
+ export function panLine(line, offset, width) {
301
+ if (width < 1)
302
+ return '';
303
+ const w = stringWidth(line);
304
+ if (w <= width)
305
+ return line;
306
+ const max = w - width;
307
+ const off = Math.max(0, Math.min(offset, max));
308
+ const left = off > 0;
309
+ const right = off < max;
310
+ const innerWidth = width - (left ? 1 : 0) - (right ? 1 : 0);
311
+ const body = innerWidth > 0 ? sliceCells(line, off + (left ? 1 : 0), innerWidth) : '';
312
+ return `${left ? `${DIM}‹${RESET}` : ''}${body}${right ? `${DIM}›${RESET}` : ''}`;
313
+ }
314
+ /** Cells of `line` that fall outside a `width`-wide rectangle. */
315
+ export function rowOverflow(line, width) {
316
+ return Math.max(0, stringWidth(line) - width);
317
+ }
@@ -0,0 +1,2 @@
1
+ /** Write text to the system clipboard without throwing. */
2
+ export declare function writeClipboardText(text: string): boolean;
@@ -0,0 +1,26 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ const SPAWN_TIMEOUT_MS = 3000;
3
+ function writers() {
4
+ if (process.platform === 'darwin')
5
+ return [['pbcopy', []]];
6
+ const wayland = Boolean(process.env.WAYLAND_DISPLAY)
7
+ || process.env.XDG_SESSION_TYPE === 'wayland';
8
+ const xclip = ['xclip', ['-selection', 'clipboard']];
9
+ const wlcopy = ['wl-copy', []];
10
+ return wayland ? [wlcopy, xclip] : [xclip, wlcopy];
11
+ }
12
+ /** Write text to the system clipboard without throwing. */
13
+ export function writeClipboardText(text) {
14
+ for (const [command, args] of writers()) {
15
+ const result = spawnSync(command, args, {
16
+ input: text,
17
+ timeout: SPAWN_TIMEOUT_MS,
18
+ encoding: 'utf-8',
19
+ });
20
+ if (result.error)
21
+ continue;
22
+ if (result.status === 0)
23
+ return true;
24
+ }
25
+ return false;
26
+ }
@@ -0,0 +1,7 @@
1
+ import type { TuiState } from './types.js';
2
+ import type { Interaction } from '../../../core/human/types.js';
3
+ import type { Key } from './keys.js';
4
+ export type RenderFn = () => void;
5
+ export type ExitFn = () => void;
6
+ export declare function assignShortcuts(interactions: Interaction[]): void;
7
+ export declare function handleKeypress(input: string, key: Key, state: TuiState, render: RenderFn, exit: ExitFn): void;