@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
@@ -0,0 +1,41 @@
1
+ import type { CustomEditor } from '@earendil-works/pi-coding-agent';
2
+ import type { Component, KeybindingsManager, TUI } from '@earendil-works/pi-tui';
3
+ import type { BrokerDataFrame, BrokerSnapshot, ClientToBroker, RpcExtensionUIRequest, RpcExtensionUIResponse } from '../../../core/runtime/broker-protocol.js';
4
+ import type { ReadOpRequest } from '../../../core/broker-client/index.js';
5
+ import { type Picker, type PickerControls } from '../overlays/pickers.js';
6
+ export interface InputOverlayHooks {
7
+ send: (frame: ClientToBroker) => void;
8
+ notify: (message: string) => void;
9
+ onDialogResponse: (response: RpcExtensionUIResponse) => void;
10
+ onRequest?: (frame: ReadOpRequest) => Promise<BrokerDataFrame>;
11
+ onMountPicker?: (component: Component) => void;
12
+ onUnmountPicker?: () => void;
13
+ state: () => BrokerSnapshot['state'] | undefined;
14
+ }
15
+ /** Owns transient dialog and picker lifetime. Editor submission remains with
16
+ * InputController; this collaborator owns mount, replacement, dismissal, and
17
+ * focus restoration for every transient input surface. */
18
+ export declare class InputOverlayOwner {
19
+ private readonly tui;
20
+ private readonly editor;
21
+ private readonly keybindings;
22
+ private readonly hooks;
23
+ private dialog;
24
+ private dialogId;
25
+ private picker;
26
+ private openSeq;
27
+ constructor(tui: TUI, editor: CustomEditor, keybindings: KeybindingsManager, hooks: InputOverlayHooks);
28
+ attachDialog(request: RpcExtensionUIRequest): void;
29
+ dismissDialog(id: string): void;
30
+ openModelPicker(): Promise<void>;
31
+ openSessionPicker(): Promise<void>;
32
+ openTreePicker(): Promise<void>;
33
+ openForkPicker(): Promise<void>;
34
+ openSettingsPicker(): Promise<void>;
35
+ openScopedModelsPicker(): Promise<void>;
36
+ openMcpPicker(serverName?: string): void;
37
+ openFileReviewPicker(candidates: string[], cwd: string, onChoose: (file: string) => void): void;
38
+ openAuthPicker(prepare: () => Promise<(controls: PickerControls) => Picker>): Promise<void>;
39
+ private openPicker;
40
+ private showPicker;
41
+ }
@@ -0,0 +1,199 @@
1
+ import { isBlockingDialog, renderDialog } from '../overlays/dialogs.js';
2
+ import { buildForkPicker, buildModelPicker, buildScopedModelsPicker, buildSessionPicker, buildSettingsPicker, buildTreePicker, } from '../overlays/pickers.js';
3
+ import { buildMcpPicker, readMcpServers, startMcpServerAction, MCP_EMPTY_STATE_HINT } from '../overlays/mcp.js';
4
+ import { buildFileReviewPicker } from '../overlays/file-review.js';
5
+ const PICKER_OVERLAY_OPTIONS = { anchor: 'center', width: '80%', maxHeight: '85%' };
6
+ /** Owns transient dialog and picker lifetime. Editor submission remains with
7
+ * InputController; this collaborator owns mount, replacement, dismissal, and
8
+ * focus restoration for every transient input surface. */
9
+ export class InputOverlayOwner {
10
+ tui;
11
+ editor;
12
+ keybindings;
13
+ hooks;
14
+ dialog;
15
+ dialogId;
16
+ picker;
17
+ openSeq = 0;
18
+ constructor(tui, editor, keybindings, hooks) {
19
+ this.tui = tui;
20
+ this.editor = editor;
21
+ this.keybindings = keybindings;
22
+ this.hooks = hooks;
23
+ }
24
+ attachDialog(request) {
25
+ if (request.method === 'notify') {
26
+ const prefix = request.notifyType === 'error' ? 'Error: ' : request.notifyType === 'warning' ? 'Warning: ' : '';
27
+ this.hooks.notify(`${prefix}${request.message}`);
28
+ this.tui.requestRender();
29
+ return;
30
+ }
31
+ if (!isBlockingDialog(request))
32
+ return;
33
+ this.dialog?.dismiss();
34
+ this.dialogId = request.id;
35
+ this.dialog = renderDialog(this.tui, request, (response) => {
36
+ this.dialog = undefined;
37
+ this.dialogId = undefined;
38
+ this.hooks.onDialogResponse(response);
39
+ }, this.keybindings);
40
+ this.tui.requestRender();
41
+ }
42
+ dismissDialog(id) {
43
+ if (this.dialogId !== id)
44
+ return;
45
+ this.dialog?.dismiss();
46
+ this.dialog = undefined;
47
+ this.dialogId = undefined;
48
+ this.tui.requestRender();
49
+ }
50
+ openModelPicker() {
51
+ return this.openPicker({ type: 'list_models' }, 'list_models', 'model', (data, close) => buildModelPicker(this.tui, data, this.hooks.send, close));
52
+ }
53
+ openSessionPicker() {
54
+ const request = this.hooks.onRequest;
55
+ if (request === undefined) {
56
+ this.hooks.notify("The session picker isn't available in this viewer");
57
+ return Promise.resolve();
58
+ }
59
+ this.openSeq++;
60
+ this.showPicker((controls) => buildSessionPicker(this.tui, this.hooks.state()?.sessionFile, request, this.keybindings, this.hooks.send, controls.close));
61
+ return Promise.resolve();
62
+ }
63
+ openTreePicker() {
64
+ return this.openPicker({ type: 'get_tree' }, 'get_tree', 'tree', (data, close) => buildTreePicker(this.tui, data, this.hooks.send, close));
65
+ }
66
+ openForkPicker() {
67
+ return this.openPicker({ type: 'get_tree' }, 'get_tree', 'fork', (data, close) => buildForkPicker(data, this.hooks.send, close));
68
+ }
69
+ openSettingsPicker() {
70
+ return this.openPicker({ type: 'get_settings' }, 'get_settings', 'settings', (data, close) => buildSettingsPicker(data, this.hooks.send, close, this.hooks.notify));
71
+ }
72
+ openScopedModelsPicker() {
73
+ return this.openPicker({ type: 'list_scoped_models' }, 'list_scoped_models', 'scoped-models', (data, close) => buildScopedModelsPicker(data, close, this.hooks.notify));
74
+ }
75
+ openMcpPicker(serverName) {
76
+ const rows = readMcpServers();
77
+ if (rows.length === 0) {
78
+ this.hooks.notify(MCP_EMPTY_STATE_HINT);
79
+ return;
80
+ }
81
+ if (serverName !== undefined) {
82
+ const row = rows.find((candidate) => candidate.name === serverName);
83
+ if (row === undefined) {
84
+ this.hooks.notify(`No MCP server named ${JSON.stringify(serverName)} — usage: /mcp [server]`);
85
+ return;
86
+ }
87
+ startMcpServerAction(row, this.hooks.send, this.hooks.notify);
88
+ return;
89
+ }
90
+ this.showPicker((controls) => buildMcpPicker(rows, this.hooks.send, controls.close, this.hooks.notify));
91
+ }
92
+ openFileReviewPicker(candidates, cwd, onChoose) {
93
+ this.showPicker((controls) => buildFileReviewPicker(candidates, cwd, (file) => {
94
+ controls.close();
95
+ onChoose(file);
96
+ }, controls.close, this.hooks.notify));
97
+ }
98
+ async openAuthPicker(prepare) {
99
+ const seq = ++this.openSeq;
100
+ let build;
101
+ try {
102
+ build = await prepare();
103
+ }
104
+ catch (error) {
105
+ this.hooks.notify(`Could not open the auth picker: ${error instanceof Error ? error.message : String(error)}`);
106
+ return;
107
+ }
108
+ if (seq !== this.openSeq)
109
+ return;
110
+ this.showPicker(build);
111
+ }
112
+ async openPicker(frame, kind, label, build) {
113
+ const request = this.hooks.onRequest;
114
+ if (request === undefined) {
115
+ this.hooks.notify(`The ${label} picker isn't available in this viewer`);
116
+ return;
117
+ }
118
+ const seq = ++this.openSeq;
119
+ let reply;
120
+ try {
121
+ reply = await request(frame);
122
+ }
123
+ catch (error) {
124
+ this.hooks.notify(`Could not open the ${label} picker: ${error instanceof Error ? error.message : String(error)}`);
125
+ return;
126
+ }
127
+ if (seq !== this.openSeq)
128
+ return;
129
+ if (reply.kind !== kind) {
130
+ this.hooks.notify(`Unexpected reply building the ${label} picker`);
131
+ return;
132
+ }
133
+ this.showPicker((controls) => build(reply, controls.close));
134
+ }
135
+ showPicker(build) {
136
+ this.picker?.dismiss();
137
+ const inline = this.hooks.onMountPicker !== undefined && this.hooks.onUnmountPicker !== undefined;
138
+ let handle;
139
+ let current;
140
+ let done = false;
141
+ const disposeCurrent = () => {
142
+ const disposable = current?.component;
143
+ try {
144
+ disposable?.dispose?.();
145
+ }
146
+ catch { /* ignore teardown errors */ }
147
+ };
148
+ const mount = (picker) => {
149
+ if (inline)
150
+ this.hooks.onMountPicker(picker.component);
151
+ else
152
+ handle = this.tui.showOverlay(picker.component, PICKER_OVERLAY_OPTIONS);
153
+ this.tui.setFocus(picker.focus);
154
+ };
155
+ const unmount = () => {
156
+ if (inline)
157
+ this.hooks.onUnmountPicker?.();
158
+ else
159
+ handle?.hide();
160
+ };
161
+ const replace = (component, focus) => {
162
+ if (done)
163
+ return;
164
+ disposeCurrent();
165
+ unmount();
166
+ current = { component, focus };
167
+ mount(current);
168
+ this.tui.requestRender();
169
+ };
170
+ const close = () => {
171
+ if (done)
172
+ return;
173
+ done = true;
174
+ disposeCurrent();
175
+ unmount();
176
+ this.picker = undefined;
177
+ this.tui.setFocus(this.editor);
178
+ this.tui.requestRender();
179
+ };
180
+ try {
181
+ current = build({ close, replace });
182
+ }
183
+ catch (error) {
184
+ this.hooks.notify(`Could not open picker: ${error instanceof Error ? error.message : String(error)}`);
185
+ return;
186
+ }
187
+ mount(current);
188
+ this.picker = {
189
+ dismiss: () => {
190
+ if (done)
191
+ return;
192
+ done = true;
193
+ disposeCurrent();
194
+ unmount();
195
+ },
196
+ };
197
+ this.tui.requestRender();
198
+ }
199
+ }
@@ -1,13 +1,9 @@
1
- import type { TUI } from '@earendil-works/pi-tui';
2
- import type { CanvasSource } from '../../../core/canvas/source.js';
3
1
  import type { SurfaceHost } from '../../surfaces/host.js';
4
2
  import type { Picker } from './pickers.js';
5
3
  import { extractFilePaths } from '#core/human/visible-paths';
6
4
  export declare function buildFileReviewPicker(candidates: readonly string[], cwd: string, onChoose: (file: string) => void, close: () => void, notify: (message: string) => void): Picker;
7
5
  export declare function launchFileReview(host: SurfaceHost, file: string, opts: {
8
6
  originNodeId: string;
9
- tui: TUI;
10
- canvasSource: CanvasSource;
11
7
  onNotice: (message: string) => void;
12
8
  }): Promise<void>;
13
9
  export { extractFilePaths };
@@ -2,8 +2,8 @@ import { homedir } from 'node:os';
2
2
  import { isAbsolute, join, relative, resolve } from 'node:path';
3
3
  import { Input, SelectList, getKeybindings, } from '@earendil-works/pi-tui';
4
4
  import { getSelectListTheme } from '@earendil-works/pi-coding-agent';
5
- import { openComposedReview } from '../../inbox/review/launch.js';
6
- import { createReviewClient } from '../../inbox/review/review-client.js';
5
+ import { openReviewSurface } from '../../inbox/review/launch.js';
6
+ import { createReviewClient, ReviewTerminalError, terminalRefusalNotice } from '../../inbox/review/review-client.js';
7
7
  import { checkReviewableFile, extractFilePaths } from '#core/human/visible-paths';
8
8
  const MAX_VISIBLE_ROWS = 12;
9
9
  function labelForPath(file, cwd) {
@@ -109,12 +109,20 @@ export function buildFileReviewPicker(candidates, cwd, onChoose, close, notify)
109
109
  return { component: picker, focus: picker };
110
110
  }
111
111
  export async function launchFileReview(host, file, opts) {
112
+ // The refusal precedes the record creation: a remote viewer can reach neither
113
+ // the reviewed file nor the companion's pane.
114
+ if (host.capabilities.remote) {
115
+ opts.onNotice('The review is unavailable in a remote attach — the file and companion live on the host.');
116
+ return;
117
+ }
118
+ let review;
112
119
  try {
113
- const review = await createReviewClient().createInline({ originNodeId: opts.originNodeId, file });
114
- await openComposedReview(host, { reviewId: review.reviewId, tui: opts.tui, canvasSource: opts.canvasSource });
120
+ review = await createReviewClient().createInline({ originNodeId: opts.originNodeId, file });
115
121
  }
116
122
  catch (err) {
117
- opts.onNotice(err instanceof Error ? err.message : String(err));
123
+ opts.onNotice(err instanceof ReviewTerminalError ? terminalRefusalNotice(err) : err instanceof Error ? err.message : String(err));
124
+ return;
118
125
  }
126
+ await openReviewSurface(host, { review });
119
127
  }
120
128
  export { extractFilePaths };
@@ -40,6 +40,7 @@ import { readFault } from '../../../core/runtime/fault.js';
40
40
  import { faultSummary } from '../../../core/canvas/status-glyph.js';
41
41
  import { RemoteCanvasSource } from '../../../core/canvas/remote-canvas-source.js';
42
42
  import { cliClient } from '../../../commands/api-client.js';
43
+ import { statusRank } from '../../../core/canvas/node-order.js';
43
44
  import { beginFrameTelem, navLabel, nodeGlyph, tokensCell, cycleBadge, askBadge, activityCell, shortId, visibleWidth, fillBar, fillWidth, truncate, isAttached, VIEWPORT_FALLBACK_ROWS, DIM, RESET, BOLD, YELLOW, REVERSE, BG_ATTACHED, GREEN, } from '../../../core/canvas/nav-render.js';
44
45
  // A BOUNDED, centered modal (CTO ruling: not full-bleed). Width/height are capped
45
46
  // at ~72% of the terminal; the overlay clips our lines to maxHeight, and render()
@@ -267,16 +268,7 @@ export class GraphOverlay {
267
268
  }
268
269
  return cur;
269
270
  };
270
- const rank = async (id) => {
271
- switch ((await node(id))?.status) {
272
- case 'active': return 0;
273
- case 'idle': return 1;
274
- case 'done': return 2;
275
- case 'canceled': return 3;
276
- case 'dead': return 4;
277
- default: return 5;
278
- }
279
- };
271
+ const rank = async (id) => statusRank((await node(id))?.status);
280
272
  const sortedChildren = async (id) => {
281
273
  const cached = sortedChildIds.get(id);
282
274
  if (cached !== undefined)
@@ -130,6 +130,9 @@ export declare class ChatView {
130
130
  private bashComponent;
131
131
  /** The single active activity loader (working/compaction/retry), if any. */
132
132
  private activityLoader;
133
+ /** The shared broker transcript state; this renderer projects it into pi TUI
134
+ * components while retaining terminal-only folding and virtualization. */
135
+ private projection;
133
136
  /** Broker-selected normal label for this turn; compaction/retry temporarily
134
137
  * replace it and restore it when the run remains active. */
135
138
  private workingActivity;
@@ -149,8 +152,6 @@ export declare class ChatView {
149
152
  * snapshot AND the live event stream so `/copy` (getLastAssistantText) works
150
153
  * whether the message arrived before or after attach. */
151
154
  private lastAssistantText;
152
- /** Recent transcript text, oldest → newest, for the file-review path picker. */
153
- private readonly transcriptTexts;
154
155
  /** Existing file paths found anywhere in the rendered transcript, newest first. */
155
156
  private readonly transcriptFilePaths;
156
157
  /** Canonical copyable transcript blocks, in their rendered visual order. */
@@ -188,7 +189,7 @@ export declare class ChatView {
188
189
  /** Replay deferred live frames in wire order. The gate is already open, so each
189
190
  * closure re-enters its entry point and dispatches immediately. */
190
191
  private replayDeferredFrames;
191
- /** Accept the broker's per-turn random choice before its following agent_start. */
192
+ /** Apply the broker's random choice for a newly received user message. */
192
193
  setWorkingActivity(activity: string): void;
193
194
  /** Clear live turn state after the broker reports completion or the viewer observes dormancy. */
194
195
  settleRun(): void;
@@ -27,7 +27,7 @@ import { ContextMessageComponent } from './context-message.js';
27
27
  import { CRTR_OUTPUT_CUSTOM_TYPE, CrtrOutputMessageComponent, createCrtrBashToolDefinition, } from './crtr-output.js';
28
28
  import { CRTR_CYCLE_DIVIDER_CUSTOM_TYPE } from '../../../core/runtime/session-cycles.js';
29
29
  import { generatedContextExpandedBody, generatedContextPresentation, isRuntimeRestartContinuation, } from '../../../shared/generated-context.js';
30
- import { assistantVisibleText, isTrueUserMessage, normalizeToolGroupSummary, normalizeToolGroupSummaryRecord, } from '../../../shared/tool-groups.js';
30
+ import { assistantVisibleText, isTrueUserMessage, } from '../../../shared/tool-groups.js';
31
31
  import { transformMessageDiagrams } from './diagram.js';
32
32
  import { transformMessageHtml } from './html-markdown.js';
33
33
  import { styleAttachMarkdownHeadings, styleAttachMessageMarkdown, styleAttachSummaryMarkdown, } from './markdown-headings.js';
@@ -42,7 +42,7 @@ import { ViewerAssistantMessageComponent } from './assistant-message.js';
42
42
  import { CompositeViewportSource, MeasuredContainer, } from './measured-container.js';
43
43
  import { readConfig, updateRawConfigAtomically } from '../../../core/config.js';
44
44
  import { DEFAULT_CONDENSED_HISTORY, DEFAULT_LIVE_CYCLES } from '../../../types.js';
45
- import { DEFAULT_WORKING_ACTIVITY } from '../../../shared/working-activity.js';
45
+ import { applySnapshot as projectSnapshot, applyToolGroupSummary as projectToolGroupSummary, applyWorkingActivity as projectWorkingActivity, bashEnd as projectBashEnd, bashOutput as projectBashOutput, bashStart as projectBashStart, initialConvState, reduce as projectEvent, } from '../../conversation/projection.js';
46
46
  /** Theme-derived chrome colors (spinner / dim / error) are supplied by the
47
47
  * attach command via `ChatViewOptions.palette` (built from the live theme in
48
48
  * config.ts). pi does not re-export the raw `theme` instance, so standalone
@@ -324,9 +324,12 @@ export class ChatView {
324
324
  bashComponent;
325
325
  /** The single active activity loader (working/compaction/retry), if any. */
326
326
  activityLoader;
327
+ /** The shared broker transcript state; this renderer projects it into pi TUI
328
+ * components while retaining terminal-only folding and virtualization. */
329
+ projection = initialConvState();
327
330
  /** Broker-selected normal label for this turn; compaction/retry temporarily
328
331
  * replace it and restore it when the run remains active. */
329
- workingActivity = DEFAULT_WORKING_ACTIVITY;
332
+ workingActivity = this.projection.workingActivity;
330
333
  runActive = false;
331
334
  // -- Single-writer snapshot ordering -------------------------------------
332
335
  // A non-streaming catch-up yields to the event loop mid-build (so queued stdin
@@ -351,8 +354,6 @@ export class ChatView {
351
354
  * snapshot AND the live event stream so `/copy` (getLastAssistantText) works
352
355
  * whether the message arrived before or after attach. */
353
356
  lastAssistantText;
354
- /** Recent transcript text, oldest → newest, for the file-review path picker. */
355
- transcriptTexts = [];
356
357
  /** Existing file paths found anywhere in the rendered transcript, newest first. */
357
358
  transcriptFilePaths = [];
358
359
  /** Canonical copyable transcript blocks, in their rendered visual order. */
@@ -419,13 +420,12 @@ export class ChatView {
419
420
  this.applyingSnapshot = true;
420
421
  this.deferredFrames.length = 0;
421
422
  this.resetChat();
422
- this.workingActivity = typeof snapshot.workingActivity === 'string' && snapshot.workingActivity.trim() !== ''
423
- ? snapshot.workingActivity
424
- : DEFAULT_WORKING_ACTIVITY;
425
- this.runActive = snapshot.state.isStreaming;
426
- this.seedToolGroupSummaries(snapshot.toolGroupSummaries);
423
+ this.projection = projectSnapshot(snapshot, this.projection);
424
+ this.workingActivity = this.projection.workingActivity;
425
+ this.runActive = this.projection.isStreaming;
426
+ this.seedToolGroupSummaries(this.projection.toolGroupSummaryDetails);
427
427
  const renderedPendingTools = new Map();
428
- const messages = snapshot.messages;
428
+ const messages = this.projection.messages;
429
429
  const lastIndex = messages.length - 1;
430
430
  // Cycles older than the trailing `live_cycles` are condensed into one nested
431
431
  // container before the live region is built. It retains only configured prose
@@ -447,7 +447,7 @@ export class ChatView {
447
447
  // snapshot: its in-flight tail + pending tools must be bound before any
448
448
  // relayed message_update/message_end lands, so it builds synchronously
449
449
  // (no await → no broker frame can interleave and freeze the live bubble).
450
- if (!snapshot.state.isStreaming &&
450
+ if (!this.projection.isStreaming &&
451
451
  i > liveStart &&
452
452
  (i - liveStart) % SNAPSHOT_YIELD_EVERY === 0) {
453
453
  await new Promise((resolve) => setImmediate(resolve));
@@ -472,7 +472,7 @@ export class ChatView {
472
472
  // message would freeze at its snapshot value until the next turn — the
473
473
  // common case, since you typically attach to a node that is working.
474
474
  const isStreamingTail = i === lastIndex &&
475
- snapshot.state.isStreaming &&
475
+ this.projection.isStreaming &&
476
476
  message.stopReason !== 'aborted' &&
477
477
  message.stopReason !== 'error';
478
478
  const hasProse = assistantVisibleText(message).trim() !== '';
@@ -550,7 +550,7 @@ export class ChatView {
550
550
  // If we attached mid-turn, the `agent_start` that spins up the working loader
551
551
  // already fired before we connected — restore it from the snapshot's streaming
552
552
  // state so an actively-working node shows the spinner right away.
553
- if (snapshot.state.isStreaming)
553
+ if (this.projection.isStreaming)
554
554
  this.setActivity(this.makeLoader(this.workingActivity));
555
555
  this.tui.requestRender();
556
556
  // Build complete and still current (a mismatch would have returned above):
@@ -617,11 +617,15 @@ export class ChatView {
617
617
  for (const replay of frames)
618
618
  replay();
619
619
  }
620
- /** Accept the broker's per-turn random choice before its following agent_start. */
620
+ /** Apply the broker's random choice for a newly received user message. */
621
621
  setWorkingActivity(activity) {
622
622
  if (this.deferIfBuilding(() => this.setWorkingActivity(activity)))
623
623
  return;
624
- this.workingActivity = activity.trim() === '' ? DEFAULT_WORKING_ACTIVITY : activity;
624
+ const wasShowingWorkingActivity = this.projection.activity === this.workingActivity;
625
+ this.projection = projectWorkingActivity(this.projection, activity);
626
+ this.workingActivity = this.projection.workingActivity;
627
+ if (this.runActive && wasShowingWorkingActivity)
628
+ this.setActivity(this.makeLoader(this.workingActivity));
625
629
  }
626
630
  /** Clear live turn state after the broker reports completion or the viewer observes dormancy. */
627
631
  settleRun() {
@@ -727,9 +731,10 @@ export class ChatView {
727
731
  // welcome is still building is replayed after it, never interleaved into it.
728
732
  if (this.deferIfBuilding(() => this.handleEvent(event)))
729
733
  return;
734
+ this.projection = projectEvent(this.projection, event);
730
735
  switch (event.type) {
731
736
  case 'agent_start': {
732
- this.runActive = true;
737
+ this.runActive = this.projection.isStreaming;
733
738
  for (const component of this.pendingTools.values())
734
739
  this.settleGroupTool(component);
735
740
  this.pendingTools.clear();
@@ -880,23 +885,25 @@ export class ChatView {
880
885
  break;
881
886
  }
882
887
  case 'tool_execution_update': {
883
- this.pushTranscriptValue(event.partialResult);
888
+ const result = this.projection.partialToolResults.get(event.toolCallId) ?? event.partialResult;
889
+ this.pushTranscriptValue(result);
884
890
  const component = this.pendingTools.get(event.toolCallId);
885
891
  if (component) {
886
- component.updateResult({ ...event.partialResult, isError: false }, true);
887
- this.registerCopyBlock(component, 'tool', this.toolResultText(event.partialResult));
892
+ component.updateResult(result, true);
893
+ this.registerCopyBlock(component, 'tool', this.toolResultText(result));
888
894
  this.historyContainer.markDirty(component);
889
895
  }
890
896
  break;
891
897
  }
892
898
  case 'tool_execution_end': {
893
- this.pushTranscriptValue(event.result);
899
+ const result = this.projection.partialToolResults.get(event.toolCallId) ?? event.result;
900
+ this.pushTranscriptValue(result);
894
901
  const component = this.pendingTools.get(event.toolCallId);
895
902
  if (component) {
896
- component.updateResult({ ...event.result, isError: event.isError });
897
- this.registerCopyBlock(component, 'tool', this.toolResultText(event.result));
903
+ component.updateResult(result);
904
+ this.registerCopyBlock(component, 'tool', this.toolResultText(result));
898
905
  this.pendingTools.delete(event.toolCallId);
899
- this.settleGroupTool(component, event.result, event.isError);
906
+ this.settleGroupTool(component, result, event.isError);
900
907
  this.applyToolDisplay();
901
908
  this.historyContainer.markDirty(component);
902
909
  }
@@ -971,6 +978,7 @@ export class ChatView {
971
978
  bashStart(command, excludeFromContext) {
972
979
  if (this.deferIfBuilding(() => this.bashStart(command, excludeFromContext)))
973
980
  return;
981
+ this.projection = projectBashStart(this.projection, command, excludeFromContext);
974
982
  this.closeOpenGroup();
975
983
  this.settleBashComponent();
976
984
  let component;
@@ -982,6 +990,7 @@ export class ChatView {
982
990
  bashOutput(chunk) {
983
991
  if (this.deferIfBuilding(() => this.bashOutput(chunk)))
984
992
  return;
993
+ this.projection = projectBashOutput(this.projection, chunk);
985
994
  this.pushTranscriptText(chunk);
986
995
  if (this.bashComponent) {
987
996
  this.bashComponent.appendOutput(chunk);
@@ -992,6 +1001,7 @@ export class ChatView {
992
1001
  bashEnd(result) {
993
1002
  if (this.deferIfBuilding(() => this.bashEnd(result)))
994
1003
  return;
1004
+ this.projection = projectBashEnd(this.projection, result);
995
1005
  this.settleBashComponent(result);
996
1006
  this.tui.requestRender();
997
1007
  }
@@ -1269,9 +1279,8 @@ export class ChatView {
1269
1279
  }
1270
1280
  seedToolGroupSummaries(summaries) {
1271
1281
  this.groupSummaries.clear();
1272
- for (const [key, summary] of Object.entries(normalizeToolGroupSummaryRecord(summaries))) {
1282
+ for (const [key, summary] of Object.entries(summaries))
1273
1283
  this.groupSummaries.set(key, summary);
1274
- }
1275
1284
  }
1276
1285
  /** Broker frames can arrive before or after their group's events, and snapshot
1277
1286
  * rebuilding defers them through the single-writer gate, so this stores first
@@ -1279,10 +1288,11 @@ export class ChatView {
1279
1288
  applyToolGroupSummary(key, summary) {
1280
1289
  if (this.deferIfBuilding(() => this.applyToolGroupSummary(key, summary)))
1281
1290
  return;
1282
- const normalized = normalizeToolGroupSummary(summary);
1283
- if (key.trim() === '' || normalized === null)
1291
+ this.projection = projectToolGroupSummary(this.projection, key, summary);
1292
+ const projected = this.projection.toolGroupSummaryDetails[key];
1293
+ if (projected === undefined)
1284
1294
  return;
1285
- this.groupSummaries.set(key, normalized);
1295
+ this.groupSummaries.set(key, projected);
1286
1296
  this.applyToolDisplay();
1287
1297
  }
1288
1298
  applyGroupDisplay(group) {
@@ -1416,7 +1426,6 @@ export class ChatView {
1416
1426
  this.lastAssistantText = undefined;
1417
1427
  this.copyBlockRecords.length = 0;
1418
1428
  this.copyIndex.clear();
1419
- this.transcriptTexts.length = 0;
1420
1429
  this.transcriptFilePaths.length = 0;
1421
1430
  this.historyContainer.clear();
1422
1431
  }
@@ -1604,9 +1613,6 @@ export class ChatView {
1604
1613
  const trimmed = text.trim();
1605
1614
  if (trimmed === '')
1606
1615
  return;
1607
- this.transcriptTexts.push(trimmed.slice(0, 8 * 1024));
1608
- if (this.transcriptTexts.length > 200)
1609
- this.transcriptTexts.splice(0, this.transcriptTexts.length - 200);
1610
1616
  const paths = extractFilePaths([trimmed], this.cwd);
1611
1617
  if (paths.length === 0)
1612
1618
  return;
@@ -8,6 +8,7 @@ export type FileActivity = {
8
8
  countsIncomplete: boolean;
9
9
  };
10
10
  export type MemoryActivity = {
11
+ action: 'read' | 'write';
11
12
  name: string;
12
13
  path?: string;
13
14
  };
@@ -77,7 +77,7 @@ function shellTokens(segment) {
77
77
  }
78
78
  /** Deliberately match an executable token, not a result-shaped string or a
79
79
  * quoted command fragment. */
80
- function invokesMemoryRead(args) {
80
+ function invokesMemoryCommand(args, verb) {
81
81
  const command = object(args)?.command;
82
82
  if (typeof command !== 'string')
83
83
  return false;
@@ -86,20 +86,22 @@ function invokesMemoryRead(args) {
86
86
  while (/^[A-Za-z_][A-Za-z0-9_]*=\S+$/.test(tokens[0] ?? ''))
87
87
  tokens.shift();
88
88
  const executable = tokens[0]?.split('/').at(-1);
89
- return (executable === 'crtr' || executable === 'crouter') && tokens[1] === 'memory' && tokens[2] === 'read';
89
+ return (executable === 'crtr' || executable === 'crouter') && tokens[1] === 'memory' && tokens[2] === verb;
90
90
  });
91
91
  }
92
- /** A resolved read starts with the complete three-line identity emitted by
93
- * `memory read`; its source path follows as optional display metadata. Links and
94
- * discovery output intentionally do not satisfy this shape. */
95
- function resolvedMemories(result) {
92
+ /** A resolved read/write begins with the identity fields emitted by its leaf.
93
+ * The write receipt also requires `created`, so result-shaped read output can
94
+ * never be reported as a saved memory. */
95
+ function resolvedMemories(result, action) {
96
96
  const memories = [];
97
- const identity = /^- name:\s*([^\r\n]+)\r?\n- kind:\s*[^\r\n]+\r?\n- scope:\s*[^\r\n]+(?:\r?\n- path:\s*([^\r\n]+)|\r?\n\r?\n\*\*path:\*\*\s*([^\r\n]+))?/gm;
97
+ const identity = action === 'read'
98
+ ? /^- name:\s*([^\r\n]+)\r?\n- kind:\s*[^\r\n]+\r?\n- scope:\s*[^\r\n]+(?:\r?\n- path:\s*([^\r\n]+)|\r?\n\r?\n\*\*path:\*\*\s*([^\r\n]+))?/gm
99
+ : /^- name:\s*([^\r\n]+)\r?\n- kind:\s*[^\r\n]+\r?\n- scope:\s*[^\r\n]+\r?\n- created:\s*(?:true|false)(?:\r?\n- path:\s*([^\r\n]+)|\r?\n\r?\n\*\*path:\*\*\s*([^\r\n]+))?/gm;
98
100
  for (const match of resultText(result).matchAll(identity)) {
99
101
  const name = match[1]?.trim();
100
102
  const path = (match[2] ?? match[3])?.trim();
101
103
  if (name)
102
- memories.push(path ? { name, path } : { name });
104
+ memories.push(path ? { action, name, path } : { action, name });
103
105
  }
104
106
  return memories;
105
107
  }
@@ -168,11 +170,16 @@ export class GroupActivityRecorder {
168
170
  return Object.freeze({ files: Object.freeze(files), memories: Object.freeze(memories) });
169
171
  }
170
172
  extract(entry, result) {
171
- if (entry.name === 'bash' && invokesMemoryRead(entry.args)) {
172
- for (const memory of resolvedMemories(result)) {
173
- if (!this.memorySet.has(memory.name)) {
174
- this.memorySet.add(memory.name);
175
- this.memories.push(memory);
173
+ if (entry.name === 'bash') {
174
+ for (const action of ['read', 'write']) {
175
+ if (!invokesMemoryCommand(entry.args, action))
176
+ continue;
177
+ for (const memory of resolvedMemories(result, action)) {
178
+ const key = `${action}:${memory.path ?? memory.name}`;
179
+ if (!this.memorySet.has(key)) {
180
+ this.memorySet.add(key);
181
+ this.memories.push(memory);
182
+ }
176
183
  }
177
184
  }
178
185
  return;