@north-light/crouter 0.3.172 → 0.3.174

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 (673) hide show
  1. package/bin/runtime-selector.mjs +8 -1
  2. package/dist/api/__tests__/{client.test.js → serial/client.test.js} +2 -135
  3. package/dist/api/client.d.ts +12 -21
  4. package/dist/api/client.js +22 -31
  5. package/dist/api/dto/broker-ops.d.ts +158 -0
  6. package/dist/api/dto/broker-ops.js +6 -0
  7. package/dist/api/dto/crons.d.ts +6 -0
  8. package/dist/api/dto/human.d.ts +7 -1
  9. package/dist/api/dto/inbox.d.ts +1 -71
  10. package/dist/api/dto/inbox.js +1 -9
  11. package/dist/api/dto/nodes.d.ts +6 -7
  12. package/dist/api/dto/reviews.d.ts +1 -11
  13. package/dist/api/routes.d.ts +7 -4
  14. package/dist/api/routes.js +8 -5
  15. package/dist/build-root.js +3 -3
  16. package/dist/builtin-memory/04-base-worker.md +1 -4
  17. package/dist/builtin-memory/05-kinds/advisor/00-base.md +1 -5
  18. package/dist/builtin-memory/05-kinds/advisor/01-orchestrator.md +2 -7
  19. package/dist/builtin-memory/05-kinds/design/00-base.md +1 -6
  20. package/dist/builtin-memory/05-kinds/developer/00-base.md +1 -6
  21. package/dist/builtin-memory/05-kinds/explore/00-base.md +1 -4
  22. package/dist/builtin-memory/05-kinds/explore/01-orchestrator.md +1 -2
  23. package/dist/builtin-memory/05-kinds/general/00-base.md +1 -3
  24. package/dist/builtin-memory/05-kinds/plan/00-base.md +1 -6
  25. package/dist/builtin-memory/05-kinds/plan/reviewers/00-base.md +1 -2
  26. package/dist/builtin-memory/05-kinds/plan/reviewers/architecture-fit.md +1 -3
  27. package/dist/builtin-memory/05-kinds/plan/reviewers/code-smells.md +1 -3
  28. package/dist/builtin-memory/05-kinds/plan/reviewers/pattern-consistency.md +1 -3
  29. package/dist/builtin-memory/05-kinds/plan/reviewers/requirements-coverage.md +1 -3
  30. package/dist/builtin-memory/05-kinds/plan/reviewers/security.md +1 -4
  31. package/dist/builtin-memory/05-kinds/review/companion/00-base.md +2 -3
  32. package/dist/builtin-memory/05-kinds/spec/00-base.md +1 -2
  33. package/dist/builtin-memory/advisor/council.md +1 -6
  34. package/dist/builtin-memory/design.md +2 -7
  35. package/dist/builtin-memory/development.md +9 -14
  36. package/dist/builtin-memory/internal/marketplaces.md +2 -6
  37. package/dist/builtin-memory/internal/nodes-and-canvas.md +1 -1
  38. package/dist/builtin-memory/internal/plugins.md +2 -8
  39. package/dist/builtin-memory/internal/storage-tiers.md +1 -2
  40. package/dist/builtin-memory/testing.md +41 -0
  41. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/{provider-rotation.test.ts → serial/provider-rotation.test.ts} +106 -177
  42. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/claude-plugin-commands.ts +5 -15
  43. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/index.ts +1 -28
  44. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/memory-slash-commands.ts +43 -88
  45. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.js +55 -0
  46. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +60 -0
  47. package/dist/cli.js +2 -2
  48. package/dist/clients/attach/__tests__/attach-remote-readonly.test.js +37 -131
  49. package/dist/clients/attach/__tests__/chat-view-snapshot-ordering.test.js +71 -152
  50. package/dist/clients/attach/__tests__/context-message.test.js +16 -174
  51. package/dist/clients/attach/__tests__/crtr-output.test.js +36 -2069
  52. package/dist/clients/attach/__tests__/diagram.test.js +2 -2
  53. package/dist/clients/attach/__tests__/edit-diff.test.js +0 -4
  54. package/dist/clients/attach/__tests__/file-review-focus.test.js +2 -1
  55. package/dist/clients/attach/__tests__/group-activity.test.js +40 -229
  56. package/dist/clients/attach/__tests__/oauth-dialog-lifecycle.test.js +26 -76
  57. package/dist/clients/attach/__tests__/prompt-preview.test.js +4 -70
  58. package/dist/clients/attach/__tests__/ref-autocomplete.test.js +11 -125
  59. package/dist/clients/attach/__tests__/titled-editor-preview.test.js +14 -205
  60. package/dist/clients/attach/command.d.ts +2 -1
  61. package/dist/clients/attach/command.js +81 -76
  62. package/dist/clients/attach/input/capabilities.d.ts +27 -0
  63. package/dist/clients/attach/input/capabilities.js +96 -0
  64. package/dist/clients/attach/input/controller.d.ts +20 -182
  65. package/dist/clients/attach/input/controller.js +128 -537
  66. package/dist/clients/attach/input/overlay-owner.d.ts +41 -0
  67. package/dist/clients/attach/input/overlay-owner.js +199 -0
  68. package/dist/clients/attach/overlays/file-review.d.ts +0 -4
  69. package/dist/clients/attach/overlays/file-review.js +13 -5
  70. package/dist/clients/attach/overlays/graph.js +2 -10
  71. package/dist/clients/attach/render/chat-view.d.ts +4 -3
  72. package/dist/clients/attach/render/chat-view.js +39 -33
  73. package/dist/clients/attach/render/group-activity.d.ts +1 -0
  74. package/dist/clients/attach/render/group-activity.js +20 -13
  75. package/dist/clients/attach/render/group-recap.js +12 -3
  76. package/dist/clients/attach/session/connection.js +9 -15
  77. package/dist/clients/attach/session/editor-inventory.d.ts +6 -5
  78. package/dist/clients/attach/session/editor-inventory.js +7 -8
  79. package/dist/clients/attach/session/file-links.d.ts +13 -0
  80. package/dist/clients/attach/session/file-links.js +107 -0
  81. package/dist/clients/attach/session/frame.d.ts +3 -0
  82. package/dist/clients/attach/session/frame.js +10 -1
  83. package/dist/clients/attach/session/frames.js +2 -3
  84. package/dist/clients/attach/session/input-wiring.d.ts +4 -1
  85. package/dist/clients/attach/session/input-wiring.js +15 -14
  86. package/dist/clients/attach/session/mouse.d.ts +6 -1
  87. package/dist/clients/attach/session/mouse.js +8 -5
  88. package/dist/clients/attach/session/profile-files.js +18 -12
  89. package/dist/clients/attach/session/reconnect.js +1 -1
  90. package/dist/clients/attach/session/state-sync.js +1 -2
  91. package/dist/clients/attach/session/surface-host.d.ts +3 -2
  92. package/dist/clients/attach/session/surface-host.js +4 -4
  93. package/dist/clients/attach/slash/dispatch.d.ts +8 -31
  94. package/dist/clients/attach/slash/dispatch.js +34 -81
  95. package/dist/clients/attach/viewer.js +820 -860
  96. package/dist/clients/conversation/projection.d.ts +79 -0
  97. package/dist/clients/conversation/projection.js +341 -0
  98. package/dist/clients/inbox/__tests__/serial/inbox-controller.test.js +159 -0
  99. package/dist/clients/inbox/__tests__/serial/mount-panel.test.js +151 -0
  100. package/dist/clients/inbox/controller.d.ts +0 -4
  101. package/dist/clients/inbox/controller.js +0 -2
  102. package/dist/clients/inbox/review/__tests__/review-core.test.js +4 -293
  103. package/dist/clients/inbox/review/__tests__/teardown-notice.test.js +100 -0
  104. package/dist/clients/inbox/review/comments-client.d.ts +3 -2
  105. package/dist/clients/inbox/review/comments-client.js +12 -12
  106. package/dist/clients/inbox/review/companion-pane.d.ts +30 -0
  107. package/dist/clients/inbox/review/companion-pane.js +86 -0
  108. package/dist/clients/inbox/review/document-surface.d.ts +182 -0
  109. package/dist/clients/inbox/review/{document-region.js → document-surface.js} +252 -48
  110. package/dist/clients/inbox/review/frame.js +5 -4
  111. package/dist/clients/inbox/review/launch.d.ts +8 -8
  112. package/dist/clients/inbox/review/launch.js +52 -92
  113. package/dist/clients/inbox/review/nvim.d.ts +2 -0
  114. package/dist/clients/inbox/review/nvim.js +14 -12
  115. package/dist/clients/inbox/review/review-client.d.ts +12 -8
  116. package/dist/clients/inbox/review/review-client.js +46 -35
  117. package/dist/clients/inbox/review-adapter.d.ts +3 -10
  118. package/dist/clients/inbox/review-adapter.js +27 -19
  119. package/dist/clients/inbox/surface.d.ts +0 -4
  120. package/dist/clients/inbox/surface.js +0 -2
  121. package/dist/clients/surfaces/host.d.ts +11 -3
  122. package/dist/commands/__tests__/api-client-cold-start-diagnostic.test.js +7 -34
  123. package/dist/commands/__tests__/human.test.js +11 -322
  124. package/dist/commands/api-client.d.ts +5 -5
  125. package/dist/commands/api-client.js +6 -85
  126. package/dist/commands/canvas-browse.js +3 -29
  127. package/dist/commands/canvas-config.js +1 -1
  128. package/dist/commands/canvas-use.js +3 -3
  129. package/dist/commands/canvas.js +1 -1
  130. package/dist/commands/cron.js +5 -1
  131. package/dist/commands/human/queue.d.ts +0 -4
  132. package/dist/commands/human/queue.js +7 -40
  133. package/dist/commands/memory/list.d.ts +14 -0
  134. package/dist/commands/memory/list.js +35 -31
  135. package/dist/commands/memory/read.d.ts +7 -0
  136. package/dist/commands/memory/read.js +14 -8
  137. package/dist/commands/node/bash.d.ts +1 -0
  138. package/dist/commands/node/bash.js +198 -0
  139. package/dist/commands/node/create.d.ts +23 -0
  140. package/dist/commands/node/create.js +207 -0
  141. package/dist/commands/node/inspect.d.ts +2 -0
  142. package/dist/commands/node/inspect.js +302 -0
  143. package/dist/commands/node/lifecycle.d.ts +4 -0
  144. package/dist/commands/node/lifecycle.js +415 -0
  145. package/dist/commands/node/message.d.ts +1 -0
  146. package/dist/commands/node/message.js +164 -0
  147. package/dist/commands/node/pyramid.d.ts +2 -0
  148. package/dist/commands/node/pyramid.js +79 -0
  149. package/dist/commands/node/subscription.d.ts +1 -0
  150. package/dist/commands/node/subscription.js +82 -0
  151. package/dist/commands/node/wait.d.ts +1 -0
  152. package/dist/commands/node/wait.js +159 -0
  153. package/dist/commands/node-lifecycle-revive.js +10 -57
  154. package/dist/commands/node.d.ts +0 -42
  155. package/dist/commands/node.js +11 -2065
  156. package/dist/commands/search.js +1 -1
  157. package/dist/commands/surface/node/cycle.d.ts +1 -0
  158. package/dist/commands/surface/node/cycle.js +83 -0
  159. package/dist/commands/surface/node/focus.d.ts +1 -0
  160. package/dist/commands/surface/node/focus.js +67 -0
  161. package/dist/commands/surface/node/id.d.ts +1 -0
  162. package/dist/commands/surface/node/id.js +38 -0
  163. package/dist/commands/surface/node/pin.d.ts +1 -0
  164. package/dist/commands/surface/node/pin.js +42 -0
  165. package/dist/commands/surface/node/placement.d.ts +46 -0
  166. package/dist/commands/surface/node/placement.js +124 -0
  167. package/dist/commands/surface-node.js +4 -1
  168. package/dist/commands/surface-reload.js +1 -2
  169. package/dist/commands/surface-tmux-spread.js +1 -1
  170. package/dist/commands/surface.js +5 -20
  171. package/dist/commands/sys/__tests__/setup-core.test.js +18 -271
  172. package/dist/commands/sys/config.js +6 -6
  173. package/dist/commands/sys/logs.js +1 -1
  174. package/dist/commands/sys/panels/broker-limits-panel.d.ts +17 -0
  175. package/dist/commands/sys/panels/broker-limits-panel.js +104 -0
  176. package/dist/commands/sys/panels/dependencies-panel.d.ts +14 -0
  177. package/dist/commands/sys/panels/dependencies-panel.js +80 -0
  178. package/dist/commands/sys/panels/keybindings-panel.d.ts +56 -0
  179. package/dist/commands/sys/panels/keybindings-panel.js +703 -0
  180. package/dist/commands/sys/panels/keys-panel.d.ts +16 -0
  181. package/dist/commands/sys/panels/keys-panel.js +60 -0
  182. package/dist/commands/sys/panels/models-panel.d.ts +77 -0
  183. package/dist/commands/sys/panels/models-panel.js +647 -0
  184. package/dist/commands/sys/panels/panel.d.ts +45 -0
  185. package/dist/commands/sys/panels/panel.js +137 -0
  186. package/dist/commands/sys/panels/plugins-panel.d.ts +16 -0
  187. package/dist/commands/sys/panels/plugins-panel.js +80 -0
  188. package/dist/commands/sys/panels/prefs-panel.d.ts +21 -0
  189. package/dist/commands/sys/panels/prefs-panel.js +85 -0
  190. package/dist/commands/sys/panels/provider-panel.d.ts +62 -0
  191. package/dist/commands/sys/panels/provider-panel.js +538 -0
  192. package/dist/commands/sys/settings-shell.d.ts +55 -0
  193. package/dist/commands/sys/settings-shell.js +400 -0
  194. package/dist/commands/sys/settings.d.ts +2 -0
  195. package/dist/commands/sys/settings.js +31 -0
  196. package/dist/commands/sys/setup-core.d.ts +3 -33
  197. package/dist/commands/sys/setup-core.js +27 -78
  198. package/dist/commands/sys/setup-settings-runner.d.ts +24 -0
  199. package/dist/commands/sys/setup-settings-runner.js +63 -0
  200. package/dist/commands/sys/setup-wizard.d.ts +26 -125
  201. package/dist/commands/sys/setup-wizard.js +209 -2473
  202. package/dist/commands/sys/setup.js +5 -7
  203. package/dist/commands/sys.js +3 -2
  204. package/dist/core/__tests__/broker-extension-canvas-db-boundary.test.js +50 -0
  205. package/dist/core/__tests__/broker-launch-candidates.test.js +20 -9
  206. package/dist/core/__tests__/broker-preflight.test.js +1 -1
  207. package/dist/core/__tests__/canvas-inbox-watcher-hold.test.js +108 -27
  208. package/dist/core/__tests__/canvas-inbox-watcher.test.js +14 -0
  209. package/dist/core/__tests__/canvas.test.js +2 -36
  210. package/dist/core/__tests__/close.test.js +14 -3
  211. package/dist/core/__tests__/context-intro.test.js +32 -143
  212. package/dist/core/__tests__/cron-broker-capacity.test.js +22 -3
  213. package/dist/core/__tests__/daemon-boot.test.js +2 -20
  214. package/dist/core/__tests__/daemon-wedge.test.js +1 -1
  215. package/dist/core/__tests__/dead-node-policy-table.test.js +1 -18
  216. package/dist/core/__tests__/fixtures/fake-engine.d.ts +1 -1
  217. package/dist/core/__tests__/fixtures/fake-engine.js +2 -2
  218. package/dist/core/__tests__/fixtures/fake-pi-host.js +2 -2
  219. package/dist/core/__tests__/focuses.test.js +4 -98
  220. package/dist/core/__tests__/helpers/broker-clients.d.ts +0 -3
  221. package/dist/core/__tests__/helpers/broker-clients.js +0 -14
  222. package/dist/core/__tests__/helpers/harness.d.ts +0 -8
  223. package/dist/core/__tests__/helpers/harness.js +7 -87
  224. package/dist/core/__tests__/helpers/viewer-panes.js +1 -1
  225. package/dist/core/__tests__/inline-memory-refs.test.js +5 -134
  226. package/dist/core/__tests__/kickoff.test.js +1 -1
  227. package/dist/core/__tests__/memory-resolver-precedence.test.js +29 -1
  228. package/dist/core/__tests__/migration.test.js +35 -48
  229. package/dist/core/__tests__/on-read-dedup-resume.test.js +22 -12
  230. package/dist/core/__tests__/passive-subscription.test.js +26 -49
  231. package/dist/core/__tests__/preview-registry-sync.test.js +1 -2
  232. package/dist/core/__tests__/prune.test.js +94 -1
  233. package/dist/core/__tests__/review-model-floor.test.js +0 -32
  234. package/dist/core/__tests__/seam/broker-attach-multiclient.test.js +255 -0
  235. package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.js +39 -7
  236. package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.js +30 -29
  237. package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.js +54 -5
  238. package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.js +134 -82
  239. package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.js +15 -4
  240. package/dist/core/__tests__/{full/idle-release-settlement.test.js → seam/dormancy-release.test.js} +69 -17
  241. package/dist/core/__tests__/{full/yield-message-transaction.test.js → seam/yield-refresh-transaction.test.js} +31 -9
  242. package/dist/core/__tests__/secrets.test.js +1 -7
  243. package/dist/core/__tests__/{broker-fork-seam.test.js → serial/broker-fork-seam.test.js} +58 -7
  244. package/dist/core/__tests__/{broker-sdk-wiring.test.js → serial/broker-sdk-wiring.test.js} +18 -162
  245. package/dist/core/__tests__/{broker-snapshot-history.test.js → serial/broker-snapshot-history.test.js} +9 -9
  246. package/dist/core/__tests__/{command-plugins.test.js → serial/command-plugins.test.js} +105 -15
  247. package/dist/core/__tests__/{deferred-no-wake.test.js → serial/deferred-no-wake.test.js} +23 -20
  248. package/dist/core/__tests__/{flagship-lifecycle.test.js → serial/flagship-lifecycle.test.js} +7 -7
  249. package/dist/core/__tests__/{host-teardown-process-group.test.js → serial/host-teardown-process-group.test.js} +6 -6
  250. package/dist/core/__tests__/{human-deliver-e2e.test.js → serial/human-deliver-e2e.test.js} +12 -12
  251. package/dist/core/__tests__/{live-mutation.test.js → serial/live-mutation.test.js} +5 -5
  252. package/dist/core/__tests__/{refresh-stall-recycle.test.js → serial/refresh-stall-recycle.test.js} +5 -14
  253. package/dist/core/__tests__/{revive.test.js → serial/revive.test.js} +15 -100
  254. package/dist/core/__tests__/{spawn-root.test.js → serial/spawn-root.test.js} +32 -15
  255. package/dist/core/__tests__/serial/subscription-delivery.test.js +126 -0
  256. package/dist/core/__tests__/serial/tmux-surface.test.js +256 -0
  257. package/dist/core/__tests__/{worktree.test.js → serial/worktree.test.js} +15 -15
  258. package/dist/core/__tests__/session-model.test.js +0 -18
  259. package/dist/core/__tests__/spawn-worktree-id-conflict.test.js +9 -0
  260. package/dist/core/__tests__/watchdog-abort-arms-retry.test.js +50 -0
  261. package/dist/core/broker-client/__tests__/transport-relay.test.js +15 -16
  262. package/dist/core/broker-client/__tests__/transport-socket.test.js +28 -0
  263. package/dist/core/broker-client/client.d.ts +2 -2
  264. package/dist/core/broker-client/client.js +4 -7
  265. package/dist/core/broker-client/transport-relay.d.ts +13 -19
  266. package/dist/core/broker-client/transport-relay.js +19 -34
  267. package/dist/core/broker-client/transport-socket.d.ts +2 -2
  268. package/dist/core/broker-client/transport-socket.js +9 -2
  269. package/dist/core/broker-client/transport.d.ts +7 -3
  270. package/dist/core/broker-client/transport.js +4 -4
  271. package/dist/core/canvas/__tests__/attention.test.js +1 -18
  272. package/dist/core/canvas/__tests__/remote-canvas-source.test.js +7 -64
  273. package/dist/core/canvas/__tests__/remote-transport.test.js +2 -3
  274. package/dist/core/canvas/__tests__/render-remote.test.js +7 -52
  275. package/dist/core/canvas/browse/app.d.ts +2 -17
  276. package/dist/core/canvas/browse/app.js +16 -88
  277. package/dist/core/canvas/browse/model.d.ts +0 -4
  278. package/dist/core/canvas/browse/model.js +1 -12
  279. package/dist/core/canvas/browse/render.js +6 -3
  280. package/dist/core/canvas/crons.d.ts +8 -5
  281. package/dist/core/canvas/crons.js +7 -6
  282. package/dist/core/canvas/extensions.d.ts +7 -3
  283. package/dist/core/canvas/extensions.js +16 -4
  284. package/dist/core/canvas/nav-model.d.ts +0 -4
  285. package/dist/core/canvas/nav-model.js +2 -14
  286. package/dist/core/canvas/node-order.d.ts +3 -0
  287. package/dist/core/canvas/node-order.js +12 -0
  288. package/dist/core/canvas/remote-canvas-source.d.ts +3 -6
  289. package/dist/core/canvas/remote-canvas-source.js +8 -15
  290. package/dist/core/command.js +11 -4
  291. package/dist/core/config.js +3 -1
  292. package/dist/core/events/envelope.js +1 -1
  293. package/dist/core/events/read.js +7 -21
  294. package/dist/core/events/source.d.ts +0 -2
  295. package/dist/core/events/source.js +0 -16
  296. package/dist/core/events/types.d.ts +1 -1
  297. package/dist/core/fault-classifier.d.ts +1 -1
  298. package/dist/core/feed/passive.d.ts +0 -11
  299. package/dist/core/feed/passive.js +1 -62
  300. package/dist/core/human/__tests__/{inbox-core.test.js → serial/inbox-core.test.js} +6 -6
  301. package/dist/core/keybindings/__tests__/resolve.test.js +1 -96
  302. package/dist/core/keybindings/background-bash.js +3 -4
  303. package/dist/core/keybindings/catalog.js +1 -1
  304. package/dist/core/memory/inline-ref-grammar.js +3 -3
  305. package/dist/core/memory-resolver.d.ts +11 -25
  306. package/dist/core/memory-resolver.js +51 -33
  307. package/dist/core/model-routes.d.ts +15 -0
  308. package/dist/core/model-routes.js +12 -0
  309. package/dist/core/pool-credential-store.js +1 -1
  310. package/dist/core/preview-registry.js +8 -9
  311. package/dist/core/profiles/__tests__/root-profile.test.js +4 -14
  312. package/dist/core/review/realize.d.ts +0 -13
  313. package/dist/core/review/realize.js +0 -40
  314. package/dist/core/review/types.d.ts +1 -1
  315. package/dist/core/runtime/__tests__/engine-route.test.js +2 -2
  316. package/dist/core/runtime/bearings.js +1 -11
  317. package/dist/core/runtime/broker/client-registry.d.ts +33 -0
  318. package/dist/core/runtime/broker/client-registry.js +164 -0
  319. package/dist/core/runtime/broker/daemon-ops.d.ts +19 -0
  320. package/dist/core/runtime/broker/daemon-ops.js +49 -0
  321. package/dist/core/runtime/broker/event-projection.d.ts +42 -0
  322. package/dist/core/runtime/broker/event-projection.js +178 -0
  323. package/dist/core/runtime/broker/fault-retry.d.ts +39 -0
  324. package/dist/core/runtime/broker/fault-retry.js +277 -0
  325. package/dist/core/runtime/broker/frame-dispatch.d.ts +238 -0
  326. package/dist/core/runtime/broker/frame-dispatch.js +1537 -0
  327. package/dist/core/runtime/broker/inbox.d.ts +22 -0
  328. package/dist/core/runtime/broker/inbox.js +167 -0
  329. package/dist/core/runtime/broker/passive.d.ts +16 -0
  330. package/dist/core/runtime/broker/passive.js +44 -0
  331. package/dist/core/runtime/broker/read-ops.d.ts +23 -0
  332. package/dist/core/runtime/broker/read-ops.js +150 -0
  333. package/dist/core/runtime/broker/rebind.d.ts +74 -0
  334. package/dist/core/runtime/broker/rebind.js +211 -0
  335. package/dist/core/runtime/broker/tool-groups.d.ts +39 -0
  336. package/dist/core/runtime/broker/tool-groups.js +244 -0
  337. package/dist/core/runtime/broker-extension-render.d.ts +11 -0
  338. package/dist/core/runtime/broker-extension-render.js +181 -0
  339. package/dist/core/runtime/broker-persona-guidance.d.ts +13 -0
  340. package/dist/core/runtime/broker-persona-guidance.js +58 -0
  341. package/dist/core/runtime/broker-protocol.d.ts +1 -1
  342. package/dist/core/runtime/broker-protocol.js +1 -1
  343. package/dist/core/runtime/broker.d.ts +5 -196
  344. package/dist/core/runtime/broker.js +276 -3059
  345. package/dist/core/runtime/canvas-extensions.js +11 -2
  346. package/dist/core/runtime/fault.js +1 -1
  347. package/dist/core/runtime/model-selection.d.ts +9 -0
  348. package/dist/core/runtime/model-selection.js +12 -0
  349. package/dist/core/runtime/model-swap.d.ts +3 -3
  350. package/dist/core/runtime/model-swap.js +33 -25
  351. package/dist/core/runtime/placement-tmux.d.ts +3 -14
  352. package/dist/core/runtime/placement-tmux.js +11 -80
  353. package/dist/core/runtime/placement.d.ts +4 -2
  354. package/dist/core/runtime/placement.js +7 -12
  355. package/dist/core/runtime/promote.d.ts +14 -1
  356. package/dist/core/runtime/promote.js +1 -1
  357. package/dist/core/runtime/reset.d.ts +1 -1
  358. package/dist/core/runtime/roadmap.js +1 -1
  359. package/dist/core/runtime/spawn.d.ts +8 -0
  360. package/dist/core/runtime/spawn.js +36 -6
  361. package/dist/core/runtime/stop-guard.d.ts +4 -3
  362. package/dist/core/runtime/stop-guard.js +36 -18
  363. package/dist/core/runtime/stop-signals.d.ts +4 -1
  364. package/dist/core/runtime/stream-watchdog.js +4 -5
  365. package/dist/core/runtime/structured-output.d.ts +15 -2
  366. package/dist/core/runtime/structured-output.js +35 -12
  367. package/dist/core/runtime/tmux-bindings.d.ts +25 -0
  368. package/dist/core/runtime/tmux-bindings.js +682 -0
  369. package/dist/core/runtime/tmux-chrome.d.ts +2 -1
  370. package/dist/core/runtime/tmux-chrome.js +3 -2
  371. package/dist/core/runtime/{tmux.d.ts → tmux-driver.d.ts} +18 -26
  372. package/dist/core/runtime/tmux-driver.js +598 -0
  373. package/dist/core/runtime/view-socket.d.ts +14 -0
  374. package/dist/core/runtime/view-socket.js +83 -0
  375. package/dist/core/session-model/session-state.d.ts +1 -2
  376. package/dist/core/session-model/session-state.js +5 -8
  377. package/dist/core/spawn.d.ts +1 -1
  378. package/dist/core/spawn.js +2 -2
  379. package/dist/core/substrate/gate.d.ts +1 -1
  380. package/dist/core/substrate/on-read-pure.d.ts +7 -0
  381. package/dist/core/substrate/on-read-pure.js +272 -0
  382. package/dist/core/termrender/termrender.js +32 -2
  383. package/dist/core/user-settings.d.ts +23 -1
  384. package/dist/core/user-settings.js +18 -1
  385. package/dist/daemon/api/__tests__/node-model-validation.test.js +134 -0
  386. package/dist/daemon/api/__tests__/review-terminal-conflict.test.js +98 -0
  387. package/dist/daemon/api/__tests__/{full → seam}/api-server.test.js +6 -48
  388. package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.js +17 -44
  389. package/dist/daemon/api/__tests__/{full/push-parity.test.js → seam/leaf-api-parity.test.js} +61 -42
  390. package/dist/daemon/api/bridge.js +40 -81
  391. package/dist/daemon/api/handlers/broker-ops.d.ts +2 -0
  392. package/dist/daemon/api/handlers/broker-ops.js +383 -0
  393. package/dist/daemon/api/handlers/crons.js +9 -4
  394. package/dist/daemon/api/handlers/files.js +6 -7
  395. package/dist/daemon/api/handlers/inbox.js +2 -340
  396. package/dist/daemon/api/handlers/nodes.d.ts +10 -1
  397. package/dist/daemon/api/handlers/nodes.js +74 -39
  398. package/dist/daemon/api/handlers/review-comments.js +5 -1
  399. package/dist/daemon/api/handlers/reviews.js +0 -19
  400. package/dist/daemon/api/map.js +25 -4
  401. package/dist/daemon/api/router.js +2 -3
  402. package/dist/daemon/api/server.js +5 -7
  403. package/dist/daemon/cron-run.d.ts +4 -0
  404. package/dist/daemon/cron-run.js +30 -13
  405. package/dist/daemon/crtrd.d.ts +3 -58
  406. package/dist/daemon/crtrd.js +28 -1244
  407. package/dist/daemon/manage.js +0 -1
  408. package/dist/daemon/reconcilers/broker-supervision.d.ts +50 -0
  409. package/dist/daemon/reconcilers/broker-supervision.js +549 -0
  410. package/dist/daemon/reconcilers/cron-lane.d.ts +10 -0
  411. package/dist/daemon/reconcilers/cron-lane.js +32 -0
  412. package/dist/daemon/reconcilers/dormant-inbox.d.ts +18 -0
  413. package/dist/daemon/reconcilers/dormant-inbox.js +143 -0
  414. package/dist/daemon/reconcilers/storage-maintenance.d.ts +22 -0
  415. package/dist/daemon/reconcilers/storage-maintenance.js +213 -0
  416. package/dist/daemon/review/finish.js +2 -5
  417. package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +34 -53
  418. package/dist/pi-extensions/__tests__/canvas-recap.test.js +16 -113
  419. package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +72 -99
  420. package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.js +29 -12
  421. package/dist/pi-extensions/broker-local.d.ts +20 -0
  422. package/dist/pi-extensions/broker-local.js +89 -0
  423. package/dist/pi-extensions/canvas-context-intro.d.ts +3 -3
  424. package/dist/pi-extensions/canvas-context-intro.js +22 -11
  425. package/dist/pi-extensions/canvas-doc-substrate.js +17 -34
  426. package/dist/pi-extensions/canvas-goal-capture.js +7 -12
  427. package/dist/pi-extensions/canvas-inbox-watcher.js +124 -139
  428. package/dist/pi-extensions/canvas-passive-context.d.ts +3 -3
  429. package/dist/pi-extensions/canvas-passive-context.js +22 -18
  430. package/dist/pi-extensions/canvas-recap.d.ts +2 -2
  431. package/dist/pi-extensions/canvas-recap.js +48 -21
  432. package/dist/pi-extensions/canvas-review-boundary.js +10 -4
  433. package/dist/pi-extensions/canvas-stophook.d.ts +0 -5
  434. package/dist/pi-extensions/canvas-stophook.js +149 -431
  435. package/dist/pi-extensions/canvas-structured-output.js +52 -30
  436. package/dist/pi-extensions/envelope-merge.d.ts +13 -0
  437. package/dist/pi-extensions/envelope-merge.js +29 -0
  438. package/dist/shared/working-activity.d.ts +3 -2
  439. package/dist/shared/working-activity.js +3 -2
  440. package/dist/types.d.ts +6 -5
  441. package/dist/types.js +2 -2
  442. package/docs/compat/hearth-crtr-v1.md +4 -12
  443. package/docs/compat/hearth-crtr-v2.md +3 -11
  444. package/docs/compat/hearth-crtr-v3.md +4 -12
  445. package/docs/compat/hearth-crtr-v4.md +3 -11
  446. package/docs/compat/hearth-crtr-v5.md +3 -11
  447. package/docs/public-api.md +3 -7
  448. package/package.json +7 -49
  449. package/runtime.lock.json +2766 -14533
  450. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/claude-plugin-commands.test.ts +0 -49
  451. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/memory-slash-commands.test.ts +0 -194
  452. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/statusline.test.ts +0 -68
  453. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/test.ts +0 -119
  454. package/dist/clients/attach/__tests__/attach-chrome-remote.test.js +0 -439
  455. package/dist/clients/attach/__tests__/attach-keybindings.test.js +0 -170
  456. package/dist/clients/attach/__tests__/crtr-output-coverage.test.js +0 -57
  457. package/dist/clients/attach/__tests__/editor-frame-title.test.js +0 -19
  458. package/dist/clients/attach/__tests__/input-controller-extension-command.test.js +0 -32
  459. package/dist/clients/attach/__tests__/markdown-headings.test.js +0 -35
  460. package/dist/clients/attach/__tests__/session-identity-refresh.test.js +0 -32
  461. package/dist/clients/conversation/conversation.d.ts +0 -65
  462. package/dist/clients/conversation/conversation.js +0 -318
  463. package/dist/clients/conversation/frames.d.ts +0 -30
  464. package/dist/clients/conversation/frames.js +0 -52
  465. package/dist/clients/conversation/region.d.ts +0 -51
  466. package/dist/clients/conversation/region.js +0 -265
  467. package/dist/clients/inbox/__tests__/inbox-controller.test.js +0 -247
  468. package/dist/clients/inbox/__tests__/mount-panel.test.js +0 -776
  469. package/dist/clients/inbox/review/__tests__/remap.test.js +0 -196
  470. package/dist/clients/inbox/review/columns.d.ts +0 -22
  471. package/dist/clients/inbox/review/columns.js +0 -40
  472. package/dist/clients/inbox/review/composition.d.ts +0 -60
  473. package/dist/clients/inbox/review/composition.js +0 -278
  474. package/dist/clients/inbox/review/document-region.d.ts +0 -120
  475. package/dist/clients/surfaces/region.d.ts +0 -16
  476. package/dist/clients/web/__tests__/push-engine.test.js +0 -158
  477. package/dist/clients/web/__tests__/push-registry.test.d.ts +0 -1
  478. package/dist/clients/web/__tests__/push-registry.test.js +0 -177
  479. package/dist/clients/web/dev-server.d.ts +0 -7
  480. package/dist/clients/web/dev-server.js +0 -46
  481. package/dist/clients/web/events.d.ts +0 -19
  482. package/dist/clients/web/events.js +0 -163
  483. package/dist/clients/web/push-engine.d.ts +0 -44
  484. package/dist/clients/web/push-engine.js +0 -125
  485. package/dist/clients/web/push-registry.d.ts +0 -85
  486. package/dist/clients/web/push-registry.js +0 -373
  487. package/dist/clients/web/server.d.ts +0 -19
  488. package/dist/clients/web/server.js +0 -661
  489. package/dist/clients/web/web-client/shared/protocol.d.ts +0 -214
  490. package/dist/clients/web/web-client/shared/protocol.js +0 -8
  491. package/dist/clients/web/web-cmd.d.ts +0 -2
  492. package/dist/clients/web/web-cmd.js +0 -141
  493. package/dist/commands/__tests__/api-canvas-source.test.d.ts +0 -1
  494. package/dist/commands/__tests__/api-canvas-source.test.js +0 -37
  495. package/dist/commands/__tests__/canvas-config.test.d.ts +0 -1
  496. package/dist/commands/__tests__/canvas-config.test.js +0 -107
  497. package/dist/commands/__tests__/node-no-kickoff-flag.test.d.ts +0 -1
  498. package/dist/commands/__tests__/node-no-kickoff-flag.test.js +0 -73
  499. package/dist/commands/__tests__/node-worktree-flag.test.d.ts +0 -1
  500. package/dist/commands/__tests__/node-worktree-flag.test.js +0 -49
  501. package/dist/commands/__tests__/search-contents.test.d.ts +0 -1
  502. package/dist/commands/__tests__/search-contents.test.js +0 -52
  503. package/dist/commands/memory/__tests__/lint.test.d.ts +0 -1
  504. package/dist/commands/memory/__tests__/lint.test.js +0 -15
  505. package/dist/commands/sys/__tests__/config-broker-thresholds.test.d.ts +0 -1
  506. package/dist/commands/sys/__tests__/config-broker-thresholds.test.js +0 -95
  507. package/dist/commands/sys/__tests__/config-keybindings.test.d.ts +0 -1
  508. package/dist/commands/sys/__tests__/config-keybindings.test.js +0 -55
  509. package/dist/commands/sys/__tests__/helpers/setup-runtime.d.ts +0 -5
  510. package/dist/commands/sys/__tests__/helpers/setup-runtime.js +0 -19
  511. package/dist/commands/sys/__tests__/setup-front-door.test.d.ts +0 -1
  512. package/dist/commands/sys/__tests__/setup-front-door.test.js +0 -102
  513. package/dist/commands/sys/__tests__/setup-models.test.d.ts +0 -1
  514. package/dist/commands/sys/__tests__/setup-models.test.js +0 -205
  515. package/dist/commands/sys/__tests__/setup-providers-viewport.test.d.ts +0 -1
  516. package/dist/commands/sys/__tests__/setup-providers-viewport.test.js +0 -155
  517. package/dist/commands/sys/__tests__/sync-deps.test.d.ts +0 -1
  518. package/dist/commands/sys/__tests__/sync-deps.test.js +0 -179
  519. package/dist/commands/sys/__tests__/sync-import.test.d.ts +0 -1
  520. package/dist/commands/sys/__tests__/sync-import.test.js +0 -315
  521. package/dist/core/__tests__/base-worker-prompt.test.d.ts +0 -1
  522. package/dist/core/__tests__/base-worker-prompt.test.js +0 -57
  523. package/dist/core/__tests__/command-plugins-surfaces.test.d.ts +0 -1
  524. package/dist/core/__tests__/command-plugins-surfaces.test.js +0 -359
  525. package/dist/core/__tests__/connection-reconnect-resume.test.d.ts +0 -1
  526. package/dist/core/__tests__/connection-reconnect-resume.test.js +0 -36
  527. package/dist/core/__tests__/finalization-migration.test.d.ts +0 -1
  528. package/dist/core/__tests__/finalization-migration.test.js +0 -38
  529. package/dist/core/__tests__/fixtures/extra-extension.d.ts +0 -1
  530. package/dist/core/__tests__/fixtures/extra-extension.js +0 -3
  531. package/dist/core/__tests__/fixtures/spawn-proof-target.test.d.ts +0 -1
  532. package/dist/core/__tests__/fixtures/spawn-proof-target.test.js +0 -15
  533. package/dist/core/__tests__/fork.test.d.ts +0 -1
  534. package/dist/core/__tests__/fork.test.js +0 -108
  535. package/dist/core/__tests__/full/broker-attach-limits.test.d.ts +0 -1
  536. package/dist/core/__tests__/full/broker-attach-limits.test.js +0 -147
  537. package/dist/core/__tests__/full/broker-deliver-ack.test.d.ts +0 -1
  538. package/dist/core/__tests__/full/broker-deliver-ack.test.js +0 -73
  539. package/dist/core/__tests__/full/broker-dialogs.test.d.ts +0 -1
  540. package/dist/core/__tests__/full/broker-dialogs.test.js +0 -180
  541. package/dist/core/__tests__/full/broker-display-snapshot.test.d.ts +0 -1
  542. package/dist/core/__tests__/full/broker-display-snapshot.test.js +0 -75
  543. package/dist/core/__tests__/full/broker-dormant-wake.test.d.ts +0 -1
  544. package/dist/core/__tests__/full/broker-dormant-wake.test.js +0 -130
  545. package/dist/core/__tests__/full/broker-model-changed-broadcast.test.d.ts +0 -1
  546. package/dist/core/__tests__/full/broker-model-changed-broadcast.test.js +0 -57
  547. package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.d.ts +0 -1
  548. package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.js +0 -80
  549. package/dist/core/__tests__/full/cascade-close.test.d.ts +0 -1
  550. package/dist/core/__tests__/full/cascade-close.test.js +0 -240
  551. package/dist/core/__tests__/full/detach-focus.test.d.ts +0 -1
  552. package/dist/core/__tests__/full/detach-focus.test.js +0 -126
  553. package/dist/core/__tests__/full/idle-release-settlement.test.d.ts +0 -1
  554. package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.d.ts +0 -1
  555. package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.js +0 -107
  556. package/dist/core/__tests__/full/park-clock-release.test.d.ts +0 -1
  557. package/dist/core/__tests__/full/park-clock-release.test.js +0 -56
  558. package/dist/core/__tests__/full/yield-message-transaction.test.d.ts +0 -1
  559. package/dist/core/__tests__/memory-index-render.test.d.ts +0 -1
  560. package/dist/core/__tests__/memory-index-render.test.js +0 -60
  561. package/dist/core/__tests__/model-routes.test.d.ts +0 -1
  562. package/dist/core/__tests__/model-routes.test.js +0 -41
  563. package/dist/core/__tests__/on-read-identity.test.d.ts +0 -1
  564. package/dist/core/__tests__/on-read-identity.test.js +0 -61
  565. package/dist/core/__tests__/phase4-review-migration.test.d.ts +0 -1
  566. package/dist/core/__tests__/phase4-review-migration.test.js +0 -100
  567. package/dist/core/__tests__/prune-to-limit.test.d.ts +0 -1
  568. package/dist/core/__tests__/prune-to-limit.test.js +0 -126
  569. package/dist/core/__tests__/reset.test.d.ts +0 -1
  570. package/dist/core/__tests__/reset.test.js +0 -69
  571. package/dist/core/__tests__/spawn-no-kickoff.test.d.ts +0 -1
  572. package/dist/core/__tests__/spawn-no-kickoff.test.js +0 -115
  573. package/dist/core/__tests__/steer-note.test.d.ts +0 -1
  574. package/dist/core/__tests__/steer-note.test.js +0 -41
  575. package/dist/core/__tests__/subcommand-tier.test.d.ts +0 -1
  576. package/dist/core/__tests__/subcommand-tier.test.js +0 -99
  577. package/dist/core/__tests__/subscription-delivery.test.js +0 -211
  578. package/dist/core/__tests__/test-runner-cheap-sharding.test.d.ts +0 -1
  579. package/dist/core/__tests__/test-runner-cheap-sharding.test.js +0 -97
  580. package/dist/core/__tests__/tmux-surface.test.js +0 -484
  581. package/dist/core/__tests__/wake-bearings.test.d.ts +0 -1
  582. package/dist/core/__tests__/wake-bearings.test.js +0 -102
  583. package/dist/core/canvas/__tests__/remote-event-stream.test.d.ts +0 -1
  584. package/dist/core/canvas/__tests__/remote-event-stream.test.js +0 -146
  585. package/dist/core/canvas/__tests__/source-resolve.test.d.ts +0 -1
  586. package/dist/core/canvas/__tests__/source-resolve.test.js +0 -77
  587. package/dist/core/canvas/browse/__tests__/model.test.d.ts +0 -1
  588. package/dist/core/canvas/browse/__tests__/model.test.js +0 -290
  589. package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.d.ts +0 -1
  590. package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.js +0 -134
  591. package/dist/core/canvas/browse/__tests__/render.test.d.ts +0 -1
  592. package/dist/core/canvas/browse/__tests__/render.test.js +0 -111
  593. package/dist/core/canvas/browse/rebuild-coalescer.d.ts +0 -7
  594. package/dist/core/canvas/browse/rebuild-coalescer.js +0 -61
  595. package/dist/core/canvas/remote-event-stream.d.ts +0 -24
  596. package/dist/core/canvas/remote-event-stream.js +0 -94
  597. package/dist/core/feed/__tests__/coalesce-human.test.d.ts +0 -1
  598. package/dist/core/feed/__tests__/coalesce-human.test.js +0 -36
  599. package/dist/core/feed/__tests__/empty-node-guard.test.d.ts +0 -1
  600. package/dist/core/feed/__tests__/empty-node-guard.test.js +0 -45
  601. package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.d.ts +0 -1
  602. package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.js +0 -84
  603. package/dist/core/human/__tests__/visible-paths.test.d.ts +0 -1
  604. package/dist/core/human/__tests__/visible-paths.test.js +0 -28
  605. package/dist/core/keybindings/__tests__/inbox-affordance.test.d.ts +0 -1
  606. package/dist/core/keybindings/__tests__/inbox-affordance.test.js +0 -38
  607. package/dist/core/review/__tests__/project.test.d.ts +0 -1
  608. package/dist/core/review/__tests__/project.test.js +0 -71
  609. package/dist/core/runtime/__tests__/command-expansion.test.d.ts +0 -1
  610. package/dist/core/runtime/__tests__/command-expansion.test.js +0 -25
  611. package/dist/core/runtime/__tests__/session-visibility.test.d.ts +0 -1
  612. package/dist/core/runtime/__tests__/session-visibility.test.js +0 -119
  613. package/dist/core/runtime/__tests__/spawn-at-given-id.test.d.ts +0 -1
  614. package/dist/core/runtime/__tests__/spawn-at-given-id.test.js +0 -34
  615. package/dist/core/runtime/tmux.js +0 -1314
  616. package/dist/daemon/api/__tests__/full/push-parity.test.d.ts +0 -1
  617. package/dist/daemon/api/__tests__/full/worktree-parity.test.d.ts +0 -1
  618. package/dist/daemon/api/__tests__/full/worktree-parity.test.js +0 -160
  619. package/dist/daemon/api/__tests__/inbox.test.d.ts +0 -1
  620. package/dist/daemon/api/__tests__/inbox.test.js +0 -489
  621. package/dist/web-client/apple-touch-icon.png +0 -0
  622. package/dist/web-client/assets/fragment-mono-latin-400-normal-BYwT3kSJ.woff +0 -0
  623. package/dist/web-client/assets/fragment-mono-latin-400-normal-yxdJ5AmL.woff2 +0 -0
  624. package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-BbKYyvR9.woff2 +0 -0
  625. package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-CT4YFKeK.woff +0 -0
  626. package/dist/web-client/assets/index-CCPaLeW7.css +0 -2
  627. package/dist/web-client/assets/index-kyOWsnZK.js +0 -86
  628. package/dist/web-client/assets/martian-mono-cyrillic-wght-normal-B84CD5C_.woff2 +0 -0
  629. package/dist/web-client/assets/martian-mono-latin-ext-wght-normal-DlL6xMw5.woff2 +0 -0
  630. package/dist/web-client/assets/martian-mono-latin-wght-normal-5W32yIyr.woff2 +0 -0
  631. package/dist/web-client/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -2
  632. package/dist/web-client/icon-192.png +0 -0
  633. package/dist/web-client/icon-512.png +0 -0
  634. package/dist/web-client/icon-maskable-512.png +0 -0
  635. package/dist/web-client/index.html +0 -17
  636. package/dist/web-client/manifest.webmanifest +0 -1
  637. package/dist/web-client/sw.js +0 -1
  638. /package/dist/api/__tests__/{client.test.d.ts → serial/client.test.d.ts} +0 -0
  639. /package/dist/clients/inbox/__tests__/{inbox-controller.test.d.ts → serial/inbox-controller.test.d.ts} +0 -0
  640. /package/dist/clients/inbox/__tests__/{mount-panel.test.d.ts → serial/mount-panel.test.d.ts} +0 -0
  641. /package/dist/clients/{attach/__tests__/attach-chrome-remote.test.d.ts → inbox/review/__tests__/teardown-notice.test.d.ts} +0 -0
  642. /package/dist/{clients/attach/__tests__/attach-keybindings.test.d.ts → core/__tests__/broker-extension-canvas-db-boundary.test.d.ts} +0 -0
  643. /package/dist/{clients/attach/__tests__/crtr-output-coverage.test.d.ts → core/__tests__/seam/broker-attach-multiclient.test.d.ts} +0 -0
  644. /package/dist/core/__tests__/{full → seam}/broker-attach-stream.test.d.ts +0 -0
  645. /package/dist/core/__tests__/{full → seam}/broker-crash-teardown.test.d.ts +0 -0
  646. /package/dist/core/__tests__/{full → seam}/broker-pane-resolution.test.d.ts +0 -0
  647. /package/dist/core/__tests__/{full → seam}/broker-provider-retry.test.d.ts +0 -0
  648. /package/dist/core/__tests__/{full → seam}/broker-whip-interrupt.test.d.ts +0 -0
  649. /package/dist/{clients/attach/__tests__/editor-frame-title.test.d.ts → core/__tests__/seam/dormancy-release.test.d.ts} +0 -0
  650. /package/dist/{clients/attach/__tests__/input-controller-extension-command.test.d.ts → core/__tests__/seam/yield-refresh-transaction.test.d.ts} +0 -0
  651. /package/dist/core/__tests__/{broker-fork-seam.test.d.ts → serial/broker-fork-seam.test.d.ts} +0 -0
  652. /package/dist/core/__tests__/{broker-sdk-wiring.test.d.ts → serial/broker-sdk-wiring.test.d.ts} +0 -0
  653. /package/dist/core/__tests__/{broker-snapshot-history.test.d.ts → serial/broker-snapshot-history.test.d.ts} +0 -0
  654. /package/dist/core/__tests__/{command-plugins.test.d.ts → serial/command-plugins.test.d.ts} +0 -0
  655. /package/dist/core/__tests__/{deferred-no-wake.test.d.ts → serial/deferred-no-wake.test.d.ts} +0 -0
  656. /package/dist/core/__tests__/{flagship-lifecycle.test.d.ts → serial/flagship-lifecycle.test.d.ts} +0 -0
  657. /package/dist/core/__tests__/{host-teardown-process-group.test.d.ts → serial/host-teardown-process-group.test.d.ts} +0 -0
  658. /package/dist/core/__tests__/{human-deliver-e2e.test.d.ts → serial/human-deliver-e2e.test.d.ts} +0 -0
  659. /package/dist/core/__tests__/{live-mutation.test.d.ts → serial/live-mutation.test.d.ts} +0 -0
  660. /package/dist/core/__tests__/{refresh-stall-recycle.test.d.ts → serial/refresh-stall-recycle.test.d.ts} +0 -0
  661. /package/dist/core/__tests__/{revive.test.d.ts → serial/revive.test.d.ts} +0 -0
  662. /package/dist/core/__tests__/{spawn-root.test.d.ts → serial/spawn-root.test.d.ts} +0 -0
  663. /package/dist/core/__tests__/{subscription-delivery.test.d.ts → serial/subscription-delivery.test.d.ts} +0 -0
  664. /package/dist/core/__tests__/{tmux-surface.test.d.ts → serial/tmux-surface.test.d.ts} +0 -0
  665. /package/dist/core/__tests__/{worktree.test.d.ts → serial/worktree.test.d.ts} +0 -0
  666. /package/dist/{clients/attach/__tests__/markdown-headings.test.d.ts → core/__tests__/watchdog-abort-arms-retry.test.d.ts} +0 -0
  667. /package/dist/{clients/attach/__tests__/session-identity-refresh.test.d.ts → core/broker-client/__tests__/transport-socket.test.d.ts} +0 -0
  668. /package/dist/core/human/__tests__/{inbox-core.test.d.ts → serial/inbox-core.test.d.ts} +0 -0
  669. /package/dist/{clients/inbox/review/__tests__/remap.test.d.ts → daemon/api/__tests__/node-model-validation.test.d.ts} +0 -0
  670. /package/dist/{clients/surfaces/region.js → daemon/api/__tests__/review-terminal-conflict.test.d.ts} +0 -0
  671. /package/dist/daemon/api/__tests__/{full → seam}/api-server.test.d.ts +0 -0
  672. /package/dist/daemon/api/__tests__/{full → seam}/b10-attach-modelauth.test.d.ts +0 -0
  673. /package/dist/{clients/web/__tests__/push-engine.test.d.ts → daemon/api/__tests__/seam/leaf-api-parity.test.d.ts} +0 -0
@@ -1,51 +0,0 @@
1
- import type { TUI } from '@earendil-works/pi-tui';
2
- import type { CanvasSource } from '../../core/canvas/source.js';
3
- import type { SurfaceRegion } from '../surfaces/region.js';
4
- export interface CompanionRegionOptions {
5
- companionNodeId: string;
6
- tui: TUI;
7
- canvasSource: CanvasSource;
8
- reopenDormantCompanion(): Promise<void>;
9
- onRequestClose(): void;
10
- }
11
- /**
12
- * A companion conversation region for a composed review. Renders connection
13
- * state, editor, and transcript in a bounded viewport. The only repaint channel
14
- * is onDirty; geometry is always pushed.
15
- */
16
- export declare class CompanionRegion implements SurfaceRegion {
17
- private readonly editor;
18
- private readonly conversation;
19
- private cols;
20
- private rows;
21
- private focused;
22
- private isDirty;
23
- private renderCache;
24
- private unreadCount;
25
- private connectionState;
26
- private noticeText;
27
- private onDirtyCallback?;
28
- constructor(opts: CompanionRegionOptions);
29
- setViewport(cols: number, rows: number): void;
30
- render(): string[];
31
- handleInput(data: string): boolean;
32
- handleWheel(direction: 'up' | 'down', lines: number): boolean;
33
- setFocused(value: boolean): void;
34
- summary(): string;
35
- onDirty(fn: () => void): void;
36
- close(): void;
37
- /** Open the connection to the companion broker. */
38
- open(): Promise<void>;
39
- /** Submit text to the companion. */
40
- submit(text: string): void;
41
- private renderStateLine;
42
- private fitLine;
43
- private padLine;
44
- private stripMarkers;
45
- private onConnectionChange;
46
- private showNotice;
47
- private isHidden;
48
- /** One arriving message while the composition gives this region no rectangle. */
49
- private countUnread;
50
- private dirty;
51
- }
@@ -1,265 +0,0 @@
1
- // conversation/region.ts — the broker-backed companion region in a composed review.
2
- //
3
- // CompanionRegion implements SurfaceRegion to render a companion conversation
4
- // within a bounded rectangle. It owns a SurfaceConversation (broker connection),
5
- // an editor, and a transcript viewport. Geometry is pushed; repaint flows only
6
- // through onDirty.
7
- import { getSelectListTheme } from '@earendil-works/pi-coding-agent';
8
- import { CURSOR_MARKER } from '@earendil-works/pi-tui';
9
- import { attachPalette, createKeybindingsManager } from '../attach/config.js';
10
- import { TitledEditor } from '../attach/input/titled-editor.js';
11
- import { cropAroundCursor, MIN_TRANSCRIPT_ROWS } from '../attach/session/frame.js';
12
- import { clipLine, visibleWidth } from '../inbox/tui/ansi.js';
13
- import { SurfaceConversation } from './conversation.js';
14
- const EDITOR_MAX_FRACTION = 0.5;
15
- /**
16
- * A companion conversation region for a composed review. Renders connection
17
- * state, editor, and transcript in a bounded viewport. The only repaint channel
18
- * is onDirty; geometry is always pushed.
19
- */
20
- export class CompanionRegion {
21
- editor;
22
- conversation;
23
- cols = 0;
24
- rows = 0;
25
- focused = false;
26
- isDirty = true;
27
- renderCache = {};
28
- unreadCount = 0;
29
- connectionState = 'connecting';
30
- noticeText;
31
- onDirtyCallback;
32
- constructor(opts) {
33
- // Reuse the attach viewer's initialized theme and full keybinding
34
- // definitions. TitledEditor only needs invalidation plus the terminal handle,
35
- // so its own repaint requests return through this region's onDirty channel.
36
- const pal = attachPalette();
37
- const editorTheme = { borderColor: pal.border, selectList: getSelectListTheme() };
38
- const keybindings = createKeybindingsManager();
39
- const editorTui = {
40
- requestRender: () => this.dirty(),
41
- terminal: opts.tui.terminal,
42
- };
43
- this.editor = new TitledEditor(editorTui, editorTheme, keybindings, { paddingX: 1 });
44
- this.editor.title = opts.companionNodeId;
45
- this.editor.onSubmit = (text) => this.submit(text);
46
- // Conversation owns the broker connection and chat state
47
- this.conversation = new SurfaceConversation({
48
- nodeId: opts.companionNodeId,
49
- tui: opts.tui,
50
- canvasSource: opts.canvasSource,
51
- reopenDormantCompanion: opts.reopenDormantCompanion,
52
- onDirty: () => this.dirty(),
53
- onConnection: (state) => this.onConnectionChange(state),
54
- onMessage: () => this.countUnread(),
55
- notice: (text) => this.showNotice(text),
56
- });
57
- }
58
- setViewport(cols, rows) {
59
- const cols2 = Math.max(0, Math.floor(cols));
60
- const rows2 = Math.max(0, Math.floor(rows));
61
- if (this.cols === cols2 && this.rows === rows2)
62
- return;
63
- const wasHidden = this.isHidden();
64
- this.cols = cols2;
65
- this.rows = rows2;
66
- if (wasHidden && !this.isHidden())
67
- this.unreadCount = 0;
68
- this.isDirty = true;
69
- if (this.onDirtyCallback)
70
- this.onDirtyCallback();
71
- }
72
- render() {
73
- const { cols, rows } = this;
74
- // Return cached result if geometry hasn't changed
75
- if (this.renderCache.cols === cols && this.renderCache.rows === rows && !this.isDirty) {
76
- return this.renderCache.lines ?? [];
77
- }
78
- if (cols === 0 || rows === 0) {
79
- this.renderCache = { cols, rows, lines: [] };
80
- this.isDirty = false;
81
- return [];
82
- }
83
- const lines = [];
84
- // 1. State line at the top (1 row)
85
- lines.push(this.renderStateLine());
86
- // 2. Editor section
87
- const availableRows = rows - 1; // -1 for state line
88
- const editorMaxRows = Math.max(1, Math.floor(availableRows * EDITOR_MAX_FRACTION));
89
- const transcriptMinRows = MIN_TRANSCRIPT_ROWS;
90
- // Calculate actual editor allocation
91
- const editorRows = Math.max(1, Math.min(editorMaxRows, availableRows - transcriptMinRows));
92
- const transcriptRows = Math.max(0, availableRows - editorRows);
93
- // Render and crop editor
94
- const editorLines = this.editor.render(cols);
95
- const croppedEditor = cropAroundCursor(editorLines, editorRows);
96
- // Pad or clip to exact allocation
97
- while (croppedEditor.length < editorRows) {
98
- croppedEditor.push('');
99
- }
100
- if (croppedEditor.length > editorRows) {
101
- croppedEditor.length = editorRows;
102
- }
103
- lines.push(...croppedEditor);
104
- // 3. Transcript section
105
- if (transcriptRows > 0) {
106
- const transcriptLines = this.conversation.viewport.renderSlice(cols, transcriptRows);
107
- // Pad to exact allocation
108
- while (transcriptLines.length < transcriptRows) {
109
- transcriptLines.push('');
110
- }
111
- if (transcriptLines.length > transcriptRows) {
112
- transcriptLines.length = transcriptRows;
113
- }
114
- lines.push(...transcriptLines);
115
- }
116
- // Ensure we have exactly `rows` lines, each clipped to `cols` display cells
117
- while (lines.length < rows) {
118
- lines.push('');
119
- }
120
- if (lines.length > rows) {
121
- lines.length = rows;
122
- }
123
- // Fit each line to the exact column width without splitting ANSI or the
124
- // zero-width cursor marker. An unfocused region must emit no marker.
125
- const clipped = lines.map((line) => this.fitLine(line, cols));
126
- if (!this.focused) {
127
- for (let i = 0; i < clipped.length; i++) {
128
- clipped[i] = this.stripMarkers(clipped[i]);
129
- }
130
- }
131
- this.renderCache = { cols, rows, lines: clipped };
132
- this.isDirty = false;
133
- return clipped;
134
- }
135
- handleInput(data) {
136
- if (this.focused) {
137
- // TitledEditor's handleInput returns void, so we route all input to it
138
- // when focused and assume it was consumed
139
- this.editor.handleInput(data);
140
- this.dirty();
141
- return true;
142
- }
143
- return false;
144
- }
145
- handleWheel(direction, lines) {
146
- // Scroll the transcript: negative = toward older, positive = toward newer
147
- const scrollLines = direction === 'up' ? -lines : lines;
148
- this.conversation.viewport.scrollBy(scrollLines);
149
- this.dirty();
150
- return true;
151
- }
152
- setFocused(value) {
153
- if (this.focused === value && this.editor.focused === value)
154
- return;
155
- this.focused = value;
156
- this.editor.focused = value;
157
- if (value)
158
- this.unreadCount = 0;
159
- this.isDirty = true;
160
- if (this.onDirtyCallback)
161
- this.onDirtyCallback();
162
- }
163
- summary() {
164
- const parts = [];
165
- // A zero viewport is the composition's hidden-region signal in single mode.
166
- if (this.isHidden() && this.unreadCount > 0)
167
- parts.push(`${this.unreadCount}✉`);
168
- // Show connection state
169
- if (this.connectionState === 'connecting') {
170
- parts.push('connecting…');
171
- }
172
- else if (this.connectionState === 'reconnecting') {
173
- parts.push('reconnecting…');
174
- }
175
- else if (this.connectionState === 'dormant') {
176
- parts.push('dormant');
177
- }
178
- else if (this.connectionState === 'finished') {
179
- parts.push('finished');
180
- }
181
- else if (this.connectionState === 'gone') {
182
- parts.push('gone');
183
- }
184
- return parts.join(' · ');
185
- }
186
- onDirty(fn) {
187
- this.onDirtyCallback = fn;
188
- }
189
- close() {
190
- this.conversation.close();
191
- }
192
- /** Open the connection to the companion broker. */
193
- async open() {
194
- try {
195
- await this.conversation.open();
196
- }
197
- catch (error) {
198
- // Already handled by the conversation's notice callback
199
- }
200
- }
201
- /** Submit text to the companion. */
202
- submit(text) {
203
- this.editor.setText('');
204
- this.conversation.submit(text);
205
- }
206
- renderStateLine() {
207
- const parts = [];
208
- if (this.connectionState === 'connecting') {
209
- parts.push('connecting…');
210
- }
211
- else if (this.connectionState === 'reconnecting') {
212
- parts.push('reconnecting…');
213
- }
214
- else if (this.connectionState === 'dormant') {
215
- parts.push('dormant');
216
- }
217
- else if (this.connectionState === 'finished') {
218
- parts.push('finished');
219
- }
220
- else if (this.connectionState === 'gone') {
221
- parts.push('gone');
222
- }
223
- if (this.noticeText)
224
- parts.push(this.noticeText);
225
- return this.fitLine(parts.join(' · '), this.cols);
226
- }
227
- fitLine(line, cols) {
228
- const markerAt = line.indexOf(CURSOR_MARKER);
229
- const fitted = this.padLine(clipLine(line, cols), cols);
230
- if (markerAt === -1)
231
- return fitted;
232
- // The shared clipper preserves both ANSI and pi-tui APC sequences whole.
233
- // Keep the zero-width marker only when its cursor cell remains inside this
234
- // region's rectangle.
235
- return visibleWidth(line.slice(0, markerAt)) < cols ? fitted : this.stripMarkers(fitted);
236
- }
237
- padLine(line, cols) {
238
- return line + ' '.repeat(Math.max(0, cols - visibleWidth(this.stripMarkers(line))));
239
- }
240
- stripMarkers(line) {
241
- return line.split(CURSOR_MARKER).join('');
242
- }
243
- onConnectionChange(state) {
244
- this.connectionState = state;
245
- this.isDirty = true;
246
- if (this.onDirtyCallback)
247
- this.onDirtyCallback();
248
- }
249
- showNotice(text) {
250
- this.noticeText = text || undefined;
251
- }
252
- isHidden() {
253
- return this.cols === 0 || this.rows === 0;
254
- }
255
- /** One arriving message while the composition gives this region no rectangle. */
256
- countUnread() {
257
- if (this.isHidden())
258
- this.unreadCount++;
259
- }
260
- dirty() {
261
- this.isDirty = true;
262
- if (this.onDirtyCallback)
263
- this.onDirtyCallback();
264
- }
265
- }
@@ -1,247 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import { createServer } from 'node:http';
3
- import { existsSync, mkdtempSync, realpathSync, rmSync, writeFileSync } from 'node:fs';
4
- import { tmpdir } from 'node:os';
5
- import { join } from 'node:path';
6
- import { claimExists, claimTicket } from '#core/human/claim';
7
- import { atomicWriteJson, deckPath } from '#core/human/convention';
8
- import { ticketDir } from '#core/human/root';
9
- import { cancelTicket, completeDeck, submitDeck, submitReview, takeoverAndCompleteDeck } from '#core/human/tickets';
10
- import { inboxLayout } from '../layout.js';
11
- import { InboxController } from '../controller.js';
12
- import { buildInboxLines } from '../tui.js';
13
- const key = (part = {}) => ({ ctrl: false, meta: false, upArrow: false, downArrow: false, leftArrow: false, rightArrow: false, wordLeft: false, wordRight: false, home: false, end: false, pageUp: false, pageDown: false, del: false, return: false, newline: false, escape: false, tab: false, backspace: false, ...part });
14
- function fakeHost() {
15
- let closed = false;
16
- const cleanup = [];
17
- const handle = {
18
- close() {
19
- if (closed)
20
- return;
21
- closed = true;
22
- for (const fn of cleanup)
23
- void fn();
24
- cleanup.length = 0;
25
- },
26
- invalidate() { },
27
- onClose(fn) {
28
- if (!closed)
29
- cleanup.push(fn);
30
- },
31
- };
32
- return {
33
- host: {
34
- capabilities: { remote: false, canFocusNode: false },
35
- mount() { return handle; },
36
- notice() { },
37
- suspendForChild() { return () => { }; },
38
- focusNode: async () => false,
39
- pickReviewFile: async () => null,
40
- },
41
- };
42
- }
43
- const tui = {};
44
- const canvasSource = {};
45
- const makeController = (options) => {
46
- const harness = fakeHost();
47
- const controller = new InboxController({
48
- host: harness.host,
49
- tui,
50
- canvasSource,
51
- onDirty: () => { },
52
- onClosed: () => { },
53
- ...options,
54
- });
55
- return controller;
56
- };
57
- const item = (id) => ({ dir: `/tickets/${id}`, id, kind: 'deck', title: id, subtitle: `${id} requires your attention.`, interactionCount: 1, source: {}, blockedSince: '2025-01-01T00:00:00.000Z' });
58
- const tick = () => new Promise((resolve) => setImmediate(resolve));
59
- function select(controller, dir) {
60
- const count = controller.snapshot().items.length;
61
- const matches = () => {
62
- const selected = controller.snapshot().selectedDir;
63
- return selected !== undefined && realpathSync(selected) === realpathSync(dir);
64
- };
65
- for (let i = 0; i < count && !matches(); i++)
66
- controller.handleKey('j', key());
67
- assert.ok(matches(), `expected ${dir} to be selectable`);
68
- }
69
- async function waitFor(predicate, message) {
70
- const deadline = Date.now() + 1_000;
71
- while (!predicate()) {
72
- if (Date.now() >= deadline)
73
- throw new Error(message);
74
- await new Promise((resolve) => setTimeout(resolve, 10));
75
- }
76
- }
77
- assert.deepEqual(inboxLayout(120, 30), { mode: 'two-column', listWidth: 40, detailWidth: 79, height: 30 });
78
- assert.equal(inboxLayout(80, 24).mode, 'list');
79
- assert.equal(inboxLayout(80, 24, 'detail').mode, 'detail');
80
- assert.equal(inboxLayout(59, 18).mode, 'minimum');
81
- const crowded = Array.from({ length: 20 }, (_, index) => item(`ticket-${index}`));
82
- const visibleRows = buildInboxLines(crowded, 40, 10, 8).join('\n');
83
- assert.ok(visibleRows.includes('ticket-10'), 'list viewport keeps the selected ticket visible');
84
- assert.ok(visibleRows.includes('↑') && visibleRows.includes('↓'), 'list viewport signals tickets above and below');
85
- const claimedRows = buildInboxLines([{ ...item('claimed'), subtitle: 'Approve the deployment because production is blocked.', claim: { owner: 'silas', claimedAt: '2025-01-01T00:00:00.000Z', heartbeatAt: '2025-01-01T00:00:00.000Z' } }], 120, 0).join('\n');
86
- assert.ok(claimedRows.includes('claimed by silas · Approve the deployment because production is blocked.'), 'claimed rows compose claim status with the required subtitle');
87
- let rows = [item('b'), item('a')];
88
- const stable = makeController({ cols: 100, rows: 24, scan: () => rows });
89
- assert.ok(!stable.render().join('\n').includes('unknown source'), 'passive detail omits missing source labels instead of rendering a fallback');
90
- stable.handleKey('j', key());
91
- assert.equal(stable.snapshot().selectedDir, '/tickets/a');
92
- rows = [item('new'), ...rows];
93
- stable.rescan();
94
- assert.equal(stable.snapshot().selectedDir, '/tickets/a', 'prepend preserves selected ticket id');
95
- rows = [item('new'), item('b')];
96
- stable.rescan();
97
- assert.equal(stable.snapshot().selectedDir, '/tickets/b', 'removed selection chooses the prior index');
98
- let mode = 'success';
99
- async function startDaemon() {
100
- const server = createServer(async (req, res) => {
101
- if (!req.url?.endsWith('/resolve')) {
102
- res.statusCode = 404;
103
- res.end(JSON.stringify({ error: { code: 'not_found', message: 'not found' } }));
104
- return;
105
- }
106
- if (mode === 'unreachable') {
107
- res.statusCode = 503;
108
- res.end(JSON.stringify({ error: { code: 'daemon_unavailable', message: 'offline' } }));
109
- return;
110
- }
111
- const body = await new Promise((resolve) => {
112
- let text = '';
113
- req.on('data', (chunk) => { text += chunk; });
114
- req.on('end', () => resolve(text));
115
- });
116
- const nodeId = req.url.split('/').at(-2);
117
- if (mode === 'already_resolved') {
118
- res.statusCode = 409;
119
- res.end(JSON.stringify({ error: { code: 'ticket_already_resolved', message: 'ticket already resolved' } }));
120
- return;
121
- }
122
- const request = JSON.parse(body);
123
- if (request.responses === undefined)
124
- throw new Error('expected a deck resolution');
125
- takeoverAndCompleteDeck(ticketDir(nodeId), request.responses, { host: 'daemon', pid: 1 });
126
- if (mode === 'delivery_failed') {
127
- res.statusCode = 500;
128
- res.end(JSON.stringify({ error: { code: 'delivery_failed', message: 'final report delivery failed' } }));
129
- return;
130
- }
131
- res.end(JSON.stringify({ delivered: true, kind: 'deck' }));
132
- });
133
- await new Promise((resolve) => server.listen(join(process.env['CRTR_HOME'], 'crtrd.sock'), resolve));
134
- return server;
135
- }
136
- const temp = mkdtempSync(join(tmpdir(), 'crtr-inbox-controller-'));
137
- process.env['CRTR_HOME'] = temp;
138
- const server = await startDaemon();
139
- const deck = (id) => ({ title: id, source: { blockedSince: new Date().toISOString(), sessionName: 'Release planning', nodeId: 'node-private-123' }, interactions: [{ id: 'answer', title: 'Answer', subtitle: 'Answer requires your attention.', options: [{ id: 'yes', label: 'Yes', shortcut: 'y' }] }] });
140
- try {
141
- const first = submitDeck({ dir: ticketDir('first'), deck: deck('first') });
142
- const active = makeController({ cols: 100, rows: 24 });
143
- const initialInbox = active.render().join('\n');
144
- assert.ok(initialInbox.includes('Answer requires your attention.'), 'the selected ticket preview renders its required subtitle');
145
- assert.ok(initialInbox.includes('1 question'), 'the selected ticket preview renders its question count');
146
- assert.ok(!initialInbox.includes('Release planning') && !initialInbox.includes('node-private-123'), 'the selected ticket preview omits source metadata');
147
- active.activate();
148
- active.handleKey('y', key());
149
- await waitFor(() => existsSync(join(first.dir, 'response.json')), 'a deck resolution crosses the controller daemon seam');
150
- assert.equal(existsSync(join(first.dir, 'response.json')), true, 'a deck resolution crosses the controller daemon seam');
151
- await waitFor(() => active.snapshot().screen === 'list', 'a successful daemon resolution unmounts the ticket');
152
- assert.equal(active.snapshot().screen, 'list', 'a successful daemon resolution unmounts the ticket');
153
- active.close();
154
- const editing = submitDeck({ dir: ticketDir('editing'), deck: { title: 'Editing', interactions: [{ id: 'note', title: 'Notes', subtitle: 'Notes require your attention.', options: [], allowFreetext: true }] } });
155
- const editingController = makeController({ cols: 100, rows: 24 });
156
- select(editingController, editing.dir);
157
- editingController.activate();
158
- editingController.handleKey('r', key());
159
- for (const char of 'draft')
160
- editingController.handleKey(char, key());
161
- submitDeck({ dir: ticketDir('arrival'), deck: deck('arrival') });
162
- editingController.rescan();
163
- assert.equal(realpathSync(editingController.snapshot().selectedDir), realpathSync(editing.dir), 'arrival does not steal active selection');
164
- assert.equal(editingController.snapshot().inputBuffer, 'draft', 'arrival does not alter freetext input');
165
- cancelTicket(editing.dir, { reason: 'canceled while editing' });
166
- editingController.rescan();
167
- assert.equal(editingController.snapshot().screen, 'list', 'cancellation invalidation returns to list');
168
- assert.notEqual(editingController.snapshot().selectedDir, editing.dir, 'cancellation moves selection away from the resolved ticket');
169
- editingController.close();
170
- const reviewSourcePreview = join(temp, 'review-preview.ts');
171
- writeFileSync(reviewSourcePreview, 'export const reviewPreview = true;\n');
172
- const reviewPreview = submitReview({ dir: ticketDir('review-preview'), review: { file: reviewSourcePreview, title: 'Review source', subtitle: 'Review this source before approving the release.', source: {} } });
173
- const reviewPreviewController = makeController({ cols: 100, rows: 24 });
174
- select(reviewPreviewController, reviewPreview.dir);
175
- const renderedReviewPreview = reviewPreviewController.render().join('\n');
176
- assert.ok(renderedReviewPreview.includes('Review this source before approving the release.'), 'passive review detail renders its authored subtitle');
177
- assert.ok(renderedReviewPreview.includes('1 file to review'), 'passive review detail identifies the compact review payload');
178
- assert.ok(!renderedReviewPreview.includes('reviewPreview = true'), 'passive review detail omits the source document');
179
- reviewPreviewController.close();
180
- const already = submitDeck({ dir: ticketDir('already'), deck: deck('already') });
181
- const alreadyController = makeController({ cols: 100, rows: 24 });
182
- alreadyController.activate();
183
- cancelTicket(already.dir, { reason: 'resolved elsewhere' });
184
- mode = 'already_resolved';
185
- alreadyController.handleKey('y', key());
186
- await waitFor(() => alreadyController.snapshot().screen === 'list', 'already_resolved unmounts instead of offering a stale resubmit');
187
- assert.equal(alreadyController.snapshot().screen, 'list', 'already_resolved unmounts instead of offering a stale resubmit');
188
- assert.equal(claimExists(already.dir), true, 'already_resolved retains the daemon-taken claim');
189
- alreadyController.close();
190
- const delivery = submitDeck({ dir: ticketDir('delivery'), deck: deck('delivery') });
191
- mode = 'delivery_failed';
192
- const deliveryController = makeController({ cols: 100, rows: 24 });
193
- deliveryController.activate();
194
- deliveryController.handleKey('y', key());
195
- await waitFor(() => deliveryController.snapshot().screen === 'list', 'delivery_failed unmounts because the canonical answer is already recorded');
196
- assert.equal(deliveryController.snapshot().screen, 'list', 'delivery_failed unmounts because the canonical answer is already recorded');
197
- assert.equal(existsSync(join(delivery.dir, 'response.json')), true, 'delivery_failed still leaves the canonical response on disk');
198
- deliveryController.close();
199
- const retry = submitDeck({ dir: ticketDir('retry'), deck: deck('retry') });
200
- mode = 'unreachable';
201
- const retryController = makeController({ cols: 100, rows: 24 });
202
- retryController.activate();
203
- retryController.handleKey('y', key());
204
- await tick();
205
- assert.equal(retryController.snapshot().screen, 'detail', 'unreachable keeps the mounted answer available for retry');
206
- assert.equal(existsSync(join(retry.dir, 'response.json')), false, 'unreachable does not manufacture a local completion');
207
- retryController.close();
208
- // Notification acknowledgement remains explicit: opening or abandoning a
209
- // notification does not create a response, while its canonical completion
210
- // still rejects a missing acknowledgement.
211
- mode = 'success';
212
- const notification = submitDeck({ dir: ticketDir('notification'), deck: { title: 'Notice', interactions: [{ id: 'notice', title: 'Notice', subtitle: 'Read the complete notice.', kind: 'notify', body: 'Notification body that must be visible before acknowledgement.', options: [{ id: 'ok', label: 'OK' }] }] } });
213
- const notificationController = makeController({ cols: 100, rows: 24 });
214
- select(notificationController, notification.dir);
215
- const renderedNotificationPreview = notificationController.render().join('\n');
216
- assert.ok(renderedNotificationPreview.includes('Read the complete notice') && renderedNotificationPreview.includes('1 question'), 'passive deck preview renders only its subtitle and question count');
217
- assert.ok(!renderedNotificationPreview.includes('Notification body'), 'passive deck preview omits interaction bodies');
218
- assert.ok(renderedNotificationPreview.includes('Enter') && renderedNotificationPreview.includes('c comment'), 'preview keeps full-ticket controls visible');
219
- notificationController.activate();
220
- notificationController.handleKey('q', key());
221
- assert.equal(existsSync(join(notification.dir, 'response.json')), false, 'leaving a notification never acknowledges it');
222
- notificationController.close();
223
- const notificationClaim = claimTicket(notification.dir);
224
- assert.notEqual(notificationClaim, null);
225
- assert.throws(() => completeDeck(notification.dir, [], notificationClaim.token), /explicit acknowledgement/, 'canonical completion rejects a notification without acknowledgement');
226
- assert.throws(() => completeDeck(notification.dir, [{ id: 'notice' }], notificationClaim.token), /explicit acknowledgement/, 'an empty notification response is not acknowledgement');
227
- assert.equal(completeDeck(notification.dir, [{ id: 'notice', selectedOptionId: 'ok' }], notificationClaim.token).won, true, 'an explicit acknowledgement completes the notification');
228
- const replacement = submitDeck({ dir: ticketDir('replacement'), deck: { title: 'Replacement', interactions: [
229
- { id: 'keep', title: 'Keep', subtitle: 'Keep requires your attention.', options: [{ id: 'yes', label: 'Yes', shortcut: 'y' }] },
230
- { id: 'drop', title: 'Drop', subtitle: 'Drop requires your attention.', options: [{ id: 'no', label: 'No', shortcut: 'n' }] },
231
- ] } });
232
- const replacementController = makeController({ cols: 100, rows: 24 });
233
- select(replacementController, replacement.dir);
234
- replacementController.activate();
235
- replacementController.handleKey('y', key());
236
- atomicWriteJson(deckPath(replacement.dir), { title: 'Replacement', interactions: [{ id: 'keep', title: 'Keep', subtitle: 'Keep requires your attention.', options: [{ id: 'yes', label: 'Yes', shortcut: 'y' }] }] });
237
- replacementController.reloadSelectedDeck();
238
- assert.ok(replacementController.render().join('\n').includes('Current: Yes'), 'deck replacement keeps a surviving answer');
239
- replacementController.close();
240
- }
241
- finally {
242
- server.closeAllConnections();
243
- await new Promise((resolve) => server.close(() => resolve()));
244
- rmSync(temp, { recursive: true, force: true });
245
- delete process.env['CRTR_HOME'];
246
- }
247
- console.log('inbox controller tests passed');