@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,653 @@
1
+ import { panItemReview, verticalCursor } from './render.js';
2
+ const RESERVED = new Set(['c', 'r', 'n', 'p', 'q', 'j', 'k', 'u', 'd', ' ']);
3
+ export function assignShortcuts(interactions) {
4
+ for (const it of interactions) {
5
+ const used = new Set(it.options.map((o) => o.shortcut).filter((s) => s !== undefined));
6
+ for (const opt of it.options) {
7
+ if (opt.shortcut !== undefined)
8
+ continue;
9
+ const letters = [...opt.label.toLowerCase()].filter((c) => /[a-z]/.test(c));
10
+ let chosen;
11
+ for (const letter of letters) {
12
+ if (!used.has(letter) && !RESERVED.has(letter)) {
13
+ chosen = letter;
14
+ break;
15
+ }
16
+ }
17
+ if (chosen === undefined) {
18
+ for (let d = 1; d <= 9; d++) {
19
+ const s = String(d);
20
+ if (!used.has(s)) {
21
+ chosen = s;
22
+ break;
23
+ }
24
+ }
25
+ }
26
+ if (chosen !== undefined) {
27
+ opt.shortcut = chosen;
28
+ used.add(chosen);
29
+ }
30
+ }
31
+ }
32
+ }
33
+ export function handleKeypress(input, key, state, render, exit) {
34
+ if (key.ctrl && input === 'c') {
35
+ exit();
36
+ return;
37
+ }
38
+ // Clear any transient hint from the previous keypress. Handlers below may set
39
+ // a fresh one (e.g. an empty multi-select Enter), so it survives exactly one
40
+ // render cycle.
41
+ state.hint = undefined;
42
+ if (state.inputMode) {
43
+ handleInputMode(input, key, state, render);
44
+ checkAutoExit(state, exit);
45
+ return;
46
+ }
47
+ switch (state.phase) {
48
+ case 'overview':
49
+ handleOverview(input, key, state, render, exit);
50
+ break;
51
+ case 'item-review':
52
+ handleItemReview(input, key, state, render);
53
+ checkAutoExit(state, exit);
54
+ break;
55
+ case 'final':
56
+ handleFinal(input, key, state, render, exit);
57
+ break;
58
+ }
59
+ }
60
+ function checkAutoExit(state, exit) {
61
+ if (state.phase !== 'final')
62
+ return;
63
+ if (state.responses.size < state.interactions.length)
64
+ return;
65
+ // Multi-select commits route THROUGH the Summary/confirm screen instead of
66
+ // auto-exiting on the first Enter: the commit advances the deck to `final`,
67
+ // but the human must press Enter again (handleFinal) to actually submit.
68
+ // The interaction that pushed us into `final` is still at currentIndex — the
69
+ // advance helpers leave it there when they fall through to `final` — so a
70
+ // multi-select there means "just confirmed a set, await deliberate submit".
71
+ // Single-select keeps its submit-on-pick fast path (auto-exit below).
72
+ const justCommitted = state.interactions[state.currentIndex];
73
+ if (justCommitted?.multiSelect === true)
74
+ return;
75
+ exit();
76
+ }
77
+ // ── Overview ─────────────────────────────────────────────────────────────────
78
+ function handleOverview(input, key, state, render, exit) {
79
+ if (input === 'j' || key.downArrow) {
80
+ state.currentIndex = Math.min(state.currentIndex + 1, state.interactions.length - 1);
81
+ render();
82
+ return;
83
+ }
84
+ if (input === 'k' || key.upArrow) {
85
+ state.currentIndex = Math.max(state.currentIndex - 1, 0);
86
+ render();
87
+ return;
88
+ }
89
+ if (key.return || input === ' ') {
90
+ state.phase = 'item-review';
91
+ state.selectedAction = 0;
92
+ state.bodyMode = 'question';
93
+ state.scrollOffset = state.bodyScrollOffsets.question;
94
+ render();
95
+ return;
96
+ }
97
+ if (input === 'q') {
98
+ if (state.responses.size >= state.interactions.length) {
99
+ exit();
100
+ }
101
+ else {
102
+ state.phase = 'final';
103
+ render();
104
+ }
105
+ return;
106
+ }
107
+ // Quick-answer: option shortcut for the focused interaction. Lets users
108
+ // answer from the overview list without pressing Enter first.
109
+ const interaction = state.interactions[state.currentIndex];
110
+ if (interaction !== undefined) {
111
+ const matched = interaction.options.find((o) => o.shortcut === input);
112
+ if (matched !== undefined) {
113
+ if (interaction.multiSelect) {
114
+ toggleMulti(state, interaction, matched.id);
115
+ }
116
+ else {
117
+ submitOption(state, interaction, matched.id, undefined);
118
+ }
119
+ // Don't auto-advance the cursor — users may want to re-answer the same
120
+ // question. The response icon flips ✓ and they can j/k away when ready.
121
+ render();
122
+ }
123
+ }
124
+ }
125
+ // ── Item Review ──────────────────────────────────────────────────────────────
126
+ function handleItemReview(input, key, state, render) {
127
+ const interaction = state.interactions[state.currentIndex];
128
+ if (input === 'n') {
129
+ advanceItem(state, 1);
130
+ render();
131
+ return;
132
+ }
133
+ if (input === 'p') {
134
+ advanceItem(state, -1);
135
+ render();
136
+ return;
137
+ }
138
+ // q / Esc step back to the deck overview (one level up from a card).
139
+ if (input === 'q' || key.escape) {
140
+ state.bodyScrollOffsets[state.bodyMode] = state.scrollOffset;
141
+ state.phase = 'overview';
142
+ render();
143
+ return;
144
+ }
145
+ // Space toggles the focused option for multi-select.
146
+ if (input === ' ' && interaction.multiSelect
147
+ && state.selectedAction < interaction.options.length) {
148
+ toggleMulti(state, interaction, interaction.options[state.selectedAction].id);
149
+ render();
150
+ return;
151
+ }
152
+ // Body scroll: u/d, PageUp/PageDown, or Ctrl+D / Ctrl+U (half-page), Ctrl+E / Ctrl+Y (line).
153
+ // Plain u/d exists because tmux configs commonly bind C-d/C-u for pane scroll
154
+ // and intercept them before they reach the app. Render clamps state.scrollOffset,
155
+ // so over-scroll past the bottom is harmless.
156
+ if (input === 'd' || key.pageDown || (key.ctrl && (input === 'd' || input === 'e'))) {
157
+ state.scrollOffset = (state.scrollOffset ?? 0) + (input === 'e' ? 1 : 10);
158
+ render();
159
+ return;
160
+ }
161
+ if (input === 'u' || key.pageUp || (key.ctrl && (input === 'u' || input === 'y'))) {
162
+ state.scrollOffset = Math.max(0, (state.scrollOffset ?? 0) - (input === 'y' ? 1 : 10));
163
+ render();
164
+ return;
165
+ }
166
+ // Body pan: contextual, so h/l only claim the key while the visible body
167
+ // actually overflows its rectangle (a wide diagram) AND no option owns that
168
+ // shortcut. Otherwise they fall through to the option/action handling below.
169
+ if ((input === 'h' || input === 'l' || key.leftArrow || key.rightArrow)
170
+ && (state.hscrollMax ?? 0) > 0
171
+ && !interaction.options.some((o) => o.shortcut === input)) {
172
+ panItemReview(state, input === 'h' || key.leftArrow ? -1 : 1);
173
+ render();
174
+ return;
175
+ }
176
+ if (input === 'j' || key.downArrow) {
177
+ const max = actionCount(interaction) - 1;
178
+ state.selectedAction = Math.min(state.selectedAction + 1, max);
179
+ render();
180
+ return;
181
+ }
182
+ if (input === 'k' || key.upArrow) {
183
+ state.selectedAction = Math.max(state.selectedAction - 1, 0);
184
+ render();
185
+ return;
186
+ }
187
+ handleInteractionAction(input, key, state, interaction, render);
188
+ }
189
+ function handleInteractionAction(input, key, state, interaction, render) {
190
+ const opts = interaction.options;
191
+ // Match by shortcut. Multi-select toggles (stay put); single-select submits.
192
+ const matched = opts.find((o) => o.shortcut === input);
193
+ if (matched !== undefined) {
194
+ if (interaction.multiSelect) {
195
+ toggleMulti(state, interaction, matched.id);
196
+ render();
197
+ return;
198
+ }
199
+ submitOption(state, interaction, matched.id, undefined);
200
+ advanceToNextUnanswered(state);
201
+ render();
202
+ return;
203
+ }
204
+ // Comment mode: allowFreetext + options exist.
205
+ //
206
+ // Single-select: pre-attach the focused option (the comment qualifies that
207
+ // pick). Multi-select: also pre-attach the focused option — the comment is
208
+ // saved under `optionComments[id]` (per-option note) and submitting
209
+ // auto-checks the option. From the [c] freetext row in multi-select,
210
+ // start with no attachment so the comment becomes the overall freetext.
211
+ if (input === 'c' && interaction.allowFreetext && opts.length > 0) {
212
+ const onOption = state.selectedAction < opts.length;
213
+ if (onOption) {
214
+ const optId = opts[state.selectedAction].id;
215
+ let prefill = '';
216
+ if (interaction.multiSelect) {
217
+ const existing = state.responses.get(interaction.id);
218
+ const prior = existing?.optionComments?.[optId];
219
+ if (typeof prior === 'string')
220
+ prefill = prior;
221
+ }
222
+ state.inputMode = { kind: 'comment', buffer: prefill, cursor: [...prefill].length, selectedOptionId: optId };
223
+ }
224
+ else {
225
+ // On the [c] row in multi-select: pre-fill from existing overall freetext.
226
+ let prefill = '';
227
+ if (interaction.multiSelect) {
228
+ const existing = state.responses.get(interaction.id);
229
+ if (existing !== undefined && typeof existing.freetext === 'string') {
230
+ prefill = existing.freetext;
231
+ }
232
+ }
233
+ state.inputMode = { kind: 'comment', buffer: prefill, cursor: [...prefill].length };
234
+ }
235
+ render();
236
+ return;
237
+ }
238
+ // Freetext-only: 'r' or enter opens input mode
239
+ if (interaction.allowFreetext && opts.length === 0) {
240
+ if (input === 'r' || key.return) {
241
+ const existing = state.responses.get(interaction.id);
242
+ const prefill = existing !== undefined && existing.freetext !== undefined ? existing.freetext : '';
243
+ state.inputMode = { kind: 'freetext', buffer: prefill, cursor: [...prefill].length };
244
+ render();
245
+ return;
246
+ }
247
+ }
248
+ // Enter on selected option row. Multi-select confirms the accumulated set
249
+ // and advances; single-select picks that one option.
250
+ if (key.return && state.selectedAction < opts.length) {
251
+ if (interaction.multiSelect) {
252
+ const checked = state.responses.get(interaction.id)?.selectedOptionIds ?? [];
253
+ if (checked.length === 0) {
254
+ // Accidental Enter with nothing toggled is a no-op: don't finalize or
255
+ // advance. A deliberate empty finish is still reachable via `q` →
256
+ // overview → finish (partial); freetext-only via the [c] row.
257
+ state.hint = 'Select at least one option (space to toggle), or q to skip';
258
+ render();
259
+ return;
260
+ }
261
+ commitMulti(state, interaction);
262
+ advanceToNextUnanswered(state);
263
+ render();
264
+ return;
265
+ }
266
+ const o = opts[state.selectedAction];
267
+ submitOption(state, interaction, o.id, undefined);
268
+ advanceToNextUnanswered(state);
269
+ render();
270
+ return;
271
+ }
272
+ // Enter on the [c] row (allowFreetext + options exist)
273
+ if (key.return && state.selectedAction === opts.length
274
+ && interaction.allowFreetext && opts.length > 0) {
275
+ state.inputMode = { kind: 'comment', buffer: '', cursor: 0 };
276
+ render();
277
+ return;
278
+ }
279
+ }
280
+ // ── Input Mode ───────────────────────────────────────────────────────────────
281
+ function handleInputMode(input, key, state, render) {
282
+ const mode = state.inputMode;
283
+ if (key.escape) {
284
+ state.inputMode = null;
285
+ render();
286
+ return;
287
+ }
288
+ // Tab cycles attached option in comment mode: (none) → opt1 → opt2 → ... → (none)
289
+ if (key.tab && mode.kind === 'comment') {
290
+ const interaction = state.interactions[state.currentIndex];
291
+ const opts = interaction.options;
292
+ if (opts.length > 0) {
293
+ const cur = mode.selectedOptionId;
294
+ const curIdx = cur === undefined ? -1 : opts.findIndex((o) => o.id === cur);
295
+ const nextIdx = curIdx + 1; // -1 → 0, last → length (which we map to none)
296
+ if (nextIdx >= opts.length) {
297
+ delete mode.selectedOptionId;
298
+ }
299
+ else {
300
+ mode.selectedOptionId = opts[nextIdx].id;
301
+ }
302
+ render();
303
+ }
304
+ return;
305
+ }
306
+ if (key.pageDown) {
307
+ state.scrollOffset = (state.scrollOffset ?? 0) + 10;
308
+ render();
309
+ return;
310
+ }
311
+ if (key.pageUp) {
312
+ state.scrollOffset = Math.max(0, (state.scrollOffset ?? 0) - 10);
313
+ render();
314
+ return;
315
+ }
316
+ if (key.downArrow) {
317
+ mode.cursor = verticalCursor(mode.buffer, mode.cursor, 1, inputWrapWidth(state));
318
+ render();
319
+ return;
320
+ }
321
+ if (key.upArrow) {
322
+ mode.cursor = verticalCursor(mode.buffer, mode.cursor, -1, inputWrapWidth(state));
323
+ render();
324
+ return;
325
+ }
326
+ if (key.return) {
327
+ const interaction = state.interactions[state.currentIndex];
328
+ const perOption = interaction.multiSelect === true
329
+ && mode.kind === 'comment'
330
+ && mode.selectedOptionId !== undefined;
331
+ if (perOption) {
332
+ // Per-option comment: save under optionComments[id], auto-check the
333
+ // option (idempotent), stay on this interaction so the human can comment
334
+ // on another option.
335
+ setOptionComment(state, interaction, mode.selectedOptionId, mode.buffer);
336
+ state.inputMode = null;
337
+ render();
338
+ return;
339
+ }
340
+ if (interaction.multiSelect) {
341
+ commitMulti(state, interaction, mode.buffer);
342
+ }
343
+ else {
344
+ const attached = mode.kind === 'comment' ? mode.selectedOptionId : undefined;
345
+ submitOption(state, interaction, attached, mode.buffer);
346
+ }
347
+ state.inputMode = null;
348
+ advanceToNextUnanswered(state);
349
+ render();
350
+ return;
351
+ }
352
+ // Newline-insert chord (ctrl+j / alt+enter) — distinct from key.return
353
+ // (submit), handled above.
354
+ if (key.newline) {
355
+ insertAtCursor(mode, '\n');
356
+ render();
357
+ return;
358
+ }
359
+ // ── Cursor motion ──────────────────────────────────────────────────────
360
+ if (key.leftArrow) {
361
+ mode.cursor = Math.max(0, mode.cursor - 1);
362
+ render();
363
+ return;
364
+ }
365
+ if (key.rightArrow) {
366
+ mode.cursor = Math.min([...mode.buffer].length, mode.cursor + 1);
367
+ render();
368
+ return;
369
+ }
370
+ if (key.wordLeft) {
371
+ mode.cursor = wordLeftIndex(mode.buffer, mode.cursor);
372
+ render();
373
+ return;
374
+ }
375
+ if (key.wordRight) {
376
+ mode.cursor = wordRightIndex(mode.buffer, mode.cursor);
377
+ render();
378
+ return;
379
+ }
380
+ if (key.home || (key.ctrl && input === 'a')) {
381
+ mode.cursor = lineStart(mode.buffer, mode.cursor);
382
+ render();
383
+ return;
384
+ }
385
+ if (key.end || (key.ctrl && input === 'e')) {
386
+ mode.cursor = lineEnd(mode.buffer, mode.cursor);
387
+ render();
388
+ return;
389
+ }
390
+ // ── Edits ───────────────────────────────────────────────────────────────
391
+ if (key.backspace && key.meta) {
392
+ deleteWordAtCursor(mode);
393
+ render();
394
+ return;
395
+ }
396
+ // Ctrl-U: delete from line start to cursor (readline "unix-line-discard").
397
+ // iTerm2 maps Cmd+Backspace to a bare 0x15, which arrives here as ctrl+'u'.
398
+ if (key.ctrl && input === 'u') {
399
+ deleteToLineStart(mode);
400
+ render();
401
+ return;
402
+ }
403
+ if (key.del) {
404
+ deleteAtCursor(mode);
405
+ render();
406
+ return;
407
+ }
408
+ if (key.backspace) {
409
+ backspaceAtCursor(mode);
410
+ render();
411
+ return;
412
+ }
413
+ // Typed input / paste. Bracketed-paste markers and other control chars are
414
+ // stripped, but \n (0x0A) is preserved so pasted newlines land as real
415
+ // newlines in the buffer instead of vanishing (CRLF is normalized to LF).
416
+ const cleaned = input
417
+ .replace(/\x1b\[20[01]~/g, '')
418
+ .replace(/\x1b\[[0-9;?]*[a-zA-Z]/g, '')
419
+ .replace(/\r\n?/g, '\n')
420
+ .replace(/[\x00-\x09\x0B-\x1F\x7F]/g, '');
421
+ if (cleaned.length > 0) {
422
+ insertAtCursor(mode, cleaned);
423
+ render();
424
+ }
425
+ }
426
+ function insertAtCursor(mode, text) {
427
+ const chars = [...mode.buffer];
428
+ const insert = [...text];
429
+ chars.splice(mode.cursor, 0, ...insert);
430
+ mode.buffer = chars.join('');
431
+ mode.cursor += insert.length;
432
+ }
433
+ function backspaceAtCursor(mode) {
434
+ if (mode.cursor <= 0)
435
+ return;
436
+ const chars = [...mode.buffer];
437
+ chars.splice(mode.cursor - 1, 1);
438
+ mode.buffer = chars.join('');
439
+ mode.cursor -= 1;
440
+ }
441
+ function deleteAtCursor(mode) {
442
+ const chars = [...mode.buffer];
443
+ if (mode.cursor >= chars.length)
444
+ return;
445
+ chars.splice(mode.cursor, 1);
446
+ mode.buffer = chars.join('');
447
+ }
448
+ function deleteWordAtCursor(mode) {
449
+ const start = wordLeftIndex(mode.buffer, mode.cursor);
450
+ const chars = [...mode.buffer];
451
+ chars.splice(start, mode.cursor - start);
452
+ mode.buffer = chars.join('');
453
+ mode.cursor = start;
454
+ }
455
+ function deleteToLineStart(mode) {
456
+ const start = lineStart(mode.buffer, mode.cursor);
457
+ const chars = [...mode.buffer];
458
+ chars.splice(start, mode.cursor - start);
459
+ mode.buffer = chars.join('');
460
+ mode.cursor = start;
461
+ }
462
+ /** Skip whitespace backward from `cursor`, then skip the non-whitespace word
463
+ * before it — lands on the word's start (readline alt-b / ctrl+left). */
464
+ function wordLeftIndex(buffer, cursor) {
465
+ const chars = [...buffer];
466
+ let i = Math.min(cursor, chars.length);
467
+ while (i > 0 && /\s/.test(chars[i - 1]))
468
+ i--;
469
+ while (i > 0 && !/\s/.test(chars[i - 1]))
470
+ i--;
471
+ return i;
472
+ }
473
+ /** Skip whitespace forward from `cursor`, then skip the non-whitespace word
474
+ * after it — lands just past the word's end (readline alt-f / ctrl+right). */
475
+ function wordRightIndex(buffer, cursor) {
476
+ const chars = [...buffer];
477
+ let i = Math.min(cursor, chars.length);
478
+ while (i < chars.length && /\s/.test(chars[i]))
479
+ i++;
480
+ while (i < chars.length && !/\s/.test(chars[i]))
481
+ i++;
482
+ return i;
483
+ }
484
+ /** Index just after the previous `\n` (or 0), i.e. the start of the current
485
+ * visual line — the multiline analog of ctrl+a/home. */
486
+ function lineStart(buffer, cursor) {
487
+ const chars = [...buffer];
488
+ let i = Math.min(cursor, chars.length);
489
+ while (i > 0 && chars[i - 1] !== '\n')
490
+ i--;
491
+ return i;
492
+ }
493
+ /** Index at the next `\n` (or end of buffer) — the multiline analog of
494
+ * ctrl+e/end. */
495
+ function lineEnd(buffer, cursor) {
496
+ const chars = [...buffer];
497
+ let i = Math.min(cursor, chars.length);
498
+ while (i < chars.length && chars[i] !== '\n')
499
+ i++;
500
+ return i;
501
+ }
502
+ /** Width the input buffer is wrapped to on screen — kept in step with the
503
+ * `renderInputBuffer(..., maxW - 1)` call in the item-review layout, so up/down
504
+ * step by the rows the human sees rather than by logical lines. */
505
+ function inputWrapWidth(state) {
506
+ return Math.max(10, Math.min(state.wrapWidth - 4, 120) - 1);
507
+ }
508
+ // ── Final ────────────────────────────────────────────────────────────────────
509
+ function handleFinal(input, key, state, render, exit) {
510
+ if (key.return) {
511
+ exit();
512
+ }
513
+ else if (key.escape) {
514
+ state.phase = 'overview';
515
+ render();
516
+ }
517
+ else if (input === 'p') {
518
+ state.phase = 'item-review';
519
+ state.currentIndex = state.interactions.length - 1;
520
+ render();
521
+ }
522
+ }
523
+ // ── Helpers ──────────────────────────────────────────────────────────────────
524
+ function advanceItem(state, direction) {
525
+ const next = state.currentIndex + direction;
526
+ if (next < 0)
527
+ return;
528
+ if (next >= state.interactions.length) {
529
+ state.phase = 'final';
530
+ return;
531
+ }
532
+ state.currentIndex = next;
533
+ state.selectedAction = 0;
534
+ state.bodyMode = 'question';
535
+ state.scrollOffset = 0;
536
+ state.bodyScrollOffsets = { question: 0 };
537
+ state.hscrollOffset = 0;
538
+ }
539
+ /**
540
+ * Move to the next interaction WITHOUT a response, falling through to the
541
+ * final phase if every following interaction is already answered (whether
542
+ * user-answered or `preAnswered`-seeded). Used by all post-submit advance
543
+ * sites so the human flies through pre-approved items by hitting Enter; raw
544
+ * `n`/`p` still step one at a time via `advanceItem`.
545
+ */
546
+ function advanceToNextUnanswered(state) {
547
+ let next = state.currentIndex + 1;
548
+ while (next < state.interactions.length && state.responses.has(state.interactions[next].id)) {
549
+ next++;
550
+ }
551
+ if (next >= state.interactions.length) {
552
+ state.phase = 'final';
553
+ return;
554
+ }
555
+ state.currentIndex = next;
556
+ state.selectedAction = 0;
557
+ state.bodyMode = 'question';
558
+ state.scrollOffset = 0;
559
+ state.bodyScrollOffsets = { question: 0 };
560
+ state.hscrollOffset = 0;
561
+ }
562
+ function actionCount(interaction) {
563
+ return interaction.options.length + (interaction.allowFreetext && interaction.options.length > 0 ? 1 : 0);
564
+ }
565
+ function submitOption(state, interaction, selectedOptionId, freetext) {
566
+ const response = { id: interaction.id };
567
+ if (selectedOptionId !== undefined)
568
+ response.selectedOptionId = selectedOptionId;
569
+ if (freetext !== undefined)
570
+ response.freetext = freetext;
571
+ state.responses.set(interaction.id, response);
572
+ // Explicit user submission overrides any preAnswered seed — flip the icon
573
+ // from "previously answered" to user-answered.
574
+ state.preAnsweredIds.delete(interaction.id);
575
+ state.persist?.();
576
+ }
577
+ // ── Multi-select ─────────────────────────────────────────────────────────────
578
+ // Toggle/commit write progressively into state.responses (mirrors single-select
579
+ // submitOption immediacy); Enter just confirms the accumulated set + advances.
580
+ function toggleMulti(state, interaction, optionId) {
581
+ const existing = state.responses.get(interaction.id);
582
+ const priorIds = existing !== undefined && existing.selectedOptionIds !== undefined
583
+ ? existing.selectedOptionIds
584
+ : [];
585
+ const set = new Set(priorIds);
586
+ if (set.has(optionId))
587
+ set.delete(optionId);
588
+ else
589
+ set.add(optionId);
590
+ const response = { id: interaction.id, selectedOptionIds: [...set] };
591
+ if (existing !== undefined && existing.freetext !== undefined)
592
+ response.freetext = existing.freetext;
593
+ if (existing !== undefined && existing.optionComments !== undefined) {
594
+ response.optionComments = { ...existing.optionComments };
595
+ }
596
+ state.responses.set(interaction.id, response);
597
+ // User edited the checked set — no longer a passive carry-over.
598
+ state.preAnsweredIds.delete(interaction.id);
599
+ state.persist?.();
600
+ }
601
+ /** Ensure a (possibly empty) response exists so the interaction counts as
602
+ * answered, optionally setting/replacing freetext. */
603
+ function commitMulti(state, interaction, freetext) {
604
+ const existing = state.responses.get(interaction.id);
605
+ const priorIds = existing !== undefined && existing.selectedOptionIds !== undefined
606
+ ? existing.selectedOptionIds
607
+ : [];
608
+ const response = {
609
+ id: interaction.id,
610
+ selectedOptionIds: [...priorIds],
611
+ };
612
+ let ft;
613
+ if (freetext !== undefined)
614
+ ft = freetext;
615
+ else if (existing !== undefined)
616
+ ft = existing.freetext;
617
+ if (ft !== undefined)
618
+ response.freetext = ft;
619
+ if (existing !== undefined && existing.optionComments !== undefined) {
620
+ response.optionComments = { ...existing.optionComments };
621
+ }
622
+ state.responses.set(interaction.id, response);
623
+ // Explicit confirm overrides any preAnswered seed.
624
+ state.preAnsweredIds.delete(interaction.id);
625
+ state.persist?.();
626
+ }
627
+ /**
628
+ * Multi-select per-option comment: write `comment` to optionComments[optionId]
629
+ * and auto-check the option. Empty comment still records the entry (the user
630
+ * committed deliberately via Enter; Esc cancels without write).
631
+ */
632
+ function setOptionComment(state, interaction, optionId, comment) {
633
+ const existing = state.responses.get(interaction.id);
634
+ const priorIds = existing !== undefined && existing.selectedOptionIds !== undefined
635
+ ? existing.selectedOptionIds
636
+ : [];
637
+ const set = new Set(priorIds);
638
+ set.add(optionId);
639
+ const priorComments = existing !== undefined && existing.optionComments !== undefined
640
+ ? existing.optionComments
641
+ : {};
642
+ const nextComments = { ...priorComments, [optionId]: comment };
643
+ const response = {
644
+ id: interaction.id,
645
+ selectedOptionIds: [...set],
646
+ optionComments: nextComments,
647
+ };
648
+ if (existing !== undefined && existing.freetext !== undefined)
649
+ response.freetext = existing.freetext;
650
+ state.responses.set(interaction.id, response);
651
+ state.preAnsweredIds.delete(interaction.id);
652
+ state.persist?.();
653
+ }
@@ -0,0 +1,28 @@
1
+ export interface Key {
2
+ upArrow: boolean;
3
+ downArrow: boolean;
4
+ leftArrow: boolean;
5
+ rightArrow: boolean;
6
+ /** Word-wise cursor motion (ctrl/alt + arrow, or readline alt-b / alt-f). */
7
+ wordLeft: boolean;
8
+ wordRight: boolean;
9
+ home: boolean;
10
+ end: boolean;
11
+ pageUp: boolean;
12
+ pageDown: boolean;
13
+ /** Forward delete (the Del key / \x1b[3~). */
14
+ del: boolean;
15
+ return: boolean;
16
+ /** Newline-insert chord (ctrl+j / alt+enter) — distinct from return=submit. */
17
+ newline: boolean;
18
+ escape: boolean;
19
+ ctrl: boolean;
20
+ meta: boolean;
21
+ tab: boolean;
22
+ backspace: boolean;
23
+ }
24
+ export type KeypressHandler = (input: string, key: Key) => void;
25
+ export declare function decodeInboxKey(data: string): {
26
+ input: string;
27
+ key: Key;
28
+ };