@north-light/crouter 0.3.170 → 0.3.172

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (670) hide show
  1. package/dist/api/client.d.ts +37 -11
  2. package/dist/api/client.js +84 -15
  3. package/dist/api/dto/human.d.ts +53 -39
  4. package/dist/api/dto/human.js +2 -3
  5. package/dist/api/dto/inbox.d.ts +0 -1
  6. package/dist/api/dto/nodes.d.ts +12 -0
  7. package/dist/api/dto/review-comments.d.ts +137 -0
  8. package/dist/api/dto/review-comments.js +5 -0
  9. package/dist/api/dto/reviews.d.ts +109 -0
  10. package/dist/api/dto/reviews.js +5 -0
  11. package/dist/api/index.d.ts +2 -0
  12. package/dist/api/index.js +2 -0
  13. package/dist/api/routes.d.ts +17 -4
  14. package/dist/api/routes.js +21 -5
  15. package/dist/build-root.d.ts +1 -16
  16. package/dist/build-root.js +1 -25
  17. package/dist/builtin-memory/00-runtime-base.md +7 -5
  18. package/dist/builtin-memory/04-base-worker.md +1 -1
  19. package/dist/builtin-memory/04-orchestration-kernel.md +7 -7
  20. package/dist/builtin-memory/05-kinds/design/00-base.md +1 -1
  21. package/dist/builtin-memory/05-kinds/design/01-orchestrator.md +1 -1
  22. package/dist/builtin-memory/05-kinds/developer/00-base.md +1 -1
  23. package/dist/builtin-memory/05-kinds/explore/00-base.md +1 -1
  24. package/dist/builtin-memory/05-kinds/plan/00-base.md +1 -1
  25. package/dist/builtin-memory/05-kinds/plan/01-orchestrator.md +1 -1
  26. package/dist/builtin-memory/05-kinds/review/00-base.md +1 -1
  27. package/dist/builtin-memory/05-kinds/review/companion/00-base.md +20 -0
  28. package/dist/builtin-memory/05-kinds/spec/00-base.md +3 -7
  29. package/dist/builtin-memory/05-kinds/spec/01-orchestrator.md +3 -3
  30. package/dist/builtin-memory/05-kinds/spec/requirements.md +3 -3
  31. package/dist/builtin-memory/design.md +2 -2
  32. package/dist/builtin-memory/insights/capture.md +50 -0
  33. package/dist/builtin-memory/insights/init.md +45 -0
  34. package/dist/builtin-memory/insights/listen.md +9 -0
  35. package/dist/builtin-memory/internal/agent-shaping.md +2 -2
  36. package/dist/builtin-memory/internal/nodes-and-canvas.md +1 -1
  37. package/dist/builtin-memory/internal/plugins.md +12 -11
  38. package/dist/builtin-memory/internal/storage-tiers.md +2 -2
  39. package/dist/builtin-memory/{planning.md → plan/roadmap.md} +3 -3
  40. package/dist/builtin-memory/plan.md +19 -0
  41. package/dist/builtin-memory/spec/guide.md +38 -0
  42. package/dist/builtin-memory/spec/requirements.md +31 -0
  43. package/dist/builtin-memory/spec/roadmap.md +35 -0
  44. package/dist/builtin-memory/spec.md +10 -86
  45. package/dist/builtin-pi-packages/pi-crtr-extensions/README.md +3 -4
  46. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/provider-rotation.test.ts +49 -5
  47. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.d.ts +56 -0
  48. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.js +920 -0
  49. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +221 -156
  50. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/statusline.ts +4 -5
  51. package/dist/cli.js +2 -6
  52. package/dist/clients/attach/__tests__/attach-chrome-remote.test.js +7 -35
  53. package/dist/clients/attach/__tests__/attach-keybindings.test.js +32 -16
  54. package/dist/clients/attach/__tests__/context-message.test.js +142 -6
  55. package/dist/clients/attach/__tests__/crtr-output.test.js +29 -45
  56. package/dist/clients/attach/__tests__/diagram.test.js +1 -1
  57. package/dist/clients/attach/__tests__/file-review-focus.test.js +48 -0
  58. package/dist/clients/attach/__tests__/group-activity.test.js +266 -0
  59. package/dist/clients/attach/__tests__/input-controller-extension-command.test.js +32 -0
  60. package/dist/clients/attach/__tests__/session-identity-refresh.test.js +32 -0
  61. package/dist/clients/attach/__tests__/titled-editor-preview.test.js +1 -2
  62. package/dist/clients/attach/chrome/header.d.ts +10 -0
  63. package/dist/clients/attach/chrome/header.js +30 -0
  64. package/dist/clients/attach/chrome/recap.d.ts +7 -0
  65. package/dist/clients/attach/chrome/recap.js +19 -0
  66. package/dist/clients/attach/chrome/status-line.d.ts +3 -0
  67. package/dist/clients/attach/chrome/status-line.js +5 -0
  68. package/dist/clients/attach/chrome/widgets.js +11 -21
  69. package/dist/clients/attach/command.js +11 -7
  70. package/dist/clients/attach/config.d.ts +4 -0
  71. package/dist/clients/attach/config.js +3 -0
  72. package/dist/clients/attach/input/controller.d.ts +19 -0
  73. package/dist/clients/attach/input/controller.js +62 -28
  74. package/dist/clients/attach/input/titled-editor.d.ts +0 -4
  75. package/dist/clients/attach/input/titled-editor.js +2 -10
  76. package/dist/clients/attach/overlays/file-review.d.ts +9 -5
  77. package/dist/clients/attach/overlays/file-review.js +9 -70
  78. package/dist/clients/attach/overlays/help.d.ts +33 -0
  79. package/dist/clients/attach/overlays/help.js +204 -0
  80. package/dist/clients/attach/render/activity-slot.d.ts +4 -0
  81. package/dist/clients/attach/render/activity-slot.js +13 -0
  82. package/dist/clients/attach/render/chat-view.d.ts +117 -12
  83. package/dist/clients/attach/render/chat-view.js +604 -135
  84. package/dist/clients/attach/render/context-message.d.ts +2 -1
  85. package/dist/clients/attach/render/context-message.js +17 -13
  86. package/dist/clients/attach/render/crtr-output.js +1 -3
  87. package/dist/clients/attach/render/diagram.js +2 -2
  88. package/dist/clients/attach/render/edit-diff.d.ts +4 -1
  89. package/dist/clients/attach/render/edit-diff.js +7 -11
  90. package/dist/clients/attach/render/group-activity.d.ts +32 -0
  91. package/dist/clients/attach/render/group-activity.js +206 -0
  92. package/dist/clients/attach/render/group-recap.d.ts +10 -0
  93. package/dist/clients/attach/render/group-recap.js +93 -0
  94. package/dist/clients/attach/render/html-markdown.d.ts +17 -0
  95. package/dist/clients/attach/render/html-markdown.js +228 -0
  96. package/dist/clients/attach/render/measured-container.d.ts +96 -0
  97. package/dist/clients/attach/render/measured-container.js +322 -0
  98. package/dist/clients/attach/render/scroll-animation.d.ts +8 -0
  99. package/dist/clients/attach/render/scroll-animation.js +80 -0
  100. package/dist/clients/attach/render/tool-calls.js +6 -6
  101. package/dist/clients/attach/render/transcript-copy.d.ts +9 -0
  102. package/dist/clients/attach/render/transcript-copy.js +81 -0
  103. package/dist/clients/attach/render/viewport.d.ts +29 -0
  104. package/dist/clients/attach/render/viewport.js +159 -0
  105. package/dist/clients/attach/session/bindings.d.ts +10 -7
  106. package/dist/clients/attach/session/bindings.js +23 -8
  107. package/dist/clients/attach/session/connection.js +4 -5
  108. package/dist/clients/attach/session/context.d.ts +6 -4
  109. package/dist/clients/attach/session/frame.d.ts +34 -0
  110. package/dist/clients/attach/session/frame.js +176 -0
  111. package/dist/clients/attach/session/frames.d.ts +4 -1
  112. package/dist/clients/attach/session/frames.js +14 -1
  113. package/dist/clients/attach/session/identity.js +4 -3
  114. package/dist/clients/attach/session/input-wiring.d.ts +14 -4
  115. package/dist/clients/attach/session/input-wiring.js +15 -13
  116. package/dist/clients/attach/session/invariant.d.ts +9 -0
  117. package/dist/clients/attach/session/invariant.js +15 -0
  118. package/dist/clients/attach/session/keys.d.ts +10 -2
  119. package/dist/clients/attach/session/keys.js +13 -5
  120. package/dist/clients/attach/session/layout.d.ts +10 -8
  121. package/dist/clients/attach/session/layout.js +33 -34
  122. package/dist/clients/attach/session/mouse.d.ts +18 -0
  123. package/dist/clients/attach/session/mouse.js +64 -0
  124. package/dist/clients/attach/session/pane-tag.d.ts +3 -0
  125. package/dist/clients/attach/session/pane-tag.js +51 -8
  126. package/dist/clients/attach/session/reconnect.d.ts +3 -0
  127. package/dist/clients/attach/session/reconnect.js +42 -5
  128. package/dist/clients/attach/session/surface-frame.d.ts +20 -0
  129. package/dist/clients/attach/session/surface-frame.js +73 -0
  130. package/dist/clients/attach/session/surface-host.d.ts +64 -0
  131. package/dist/clients/attach/session/surface-host.js +255 -0
  132. package/dist/clients/attach/session/whip.d.ts +17 -0
  133. package/dist/clients/attach/session/whip.js +334 -0
  134. package/dist/clients/attach/slash/dispatch.d.ts +13 -1
  135. package/dist/clients/attach/slash/dispatch.js +51 -29
  136. package/dist/clients/attach/viewer.js +907 -819
  137. package/dist/clients/conversation/conversation.d.ts +65 -0
  138. package/dist/clients/conversation/conversation.js +318 -0
  139. package/dist/clients/conversation/frames.d.ts +30 -0
  140. package/dist/clients/conversation/frames.js +52 -0
  141. package/dist/clients/conversation/region.d.ts +51 -0
  142. package/dist/clients/conversation/region.js +265 -0
  143. package/dist/clients/conversation/submit.d.ts +38 -0
  144. package/dist/clients/conversation/submit.js +51 -0
  145. package/dist/clients/inbox/__tests__/inbox-controller.test.js +247 -0
  146. package/dist/clients/inbox/__tests__/mount-panel.test.js +776 -0
  147. package/dist/clients/inbox/controller.d.ts +79 -0
  148. package/dist/clients/inbox/controller.js +448 -0
  149. package/dist/clients/inbox/deck-adapter.d.ts +29 -0
  150. package/dist/clients/inbox/deck-adapter.js +62 -0
  151. package/dist/clients/inbox/layout.d.ts +8 -0
  152. package/dist/clients/inbox/layout.js +9 -0
  153. package/dist/clients/inbox/resolve.d.ts +10 -0
  154. package/dist/clients/inbox/resolve.js +34 -0
  155. package/dist/clients/inbox/review/__tests__/editor-roundtrip.test.js +29 -0
  156. package/dist/clients/inbox/review/__tests__/remap.test.js +196 -0
  157. package/dist/clients/inbox/review/__tests__/review-core.test.js +341 -0
  158. package/dist/clients/inbox/review/anchors.d.ts +41 -0
  159. package/dist/clients/inbox/review/anchors.js +89 -0
  160. package/dist/clients/inbox/review/columns.d.ts +22 -0
  161. package/dist/clients/inbox/review/columns.js +40 -0
  162. package/dist/clients/inbox/review/comments-client.d.ts +66 -0
  163. package/dist/clients/inbox/review/comments-client.js +98 -0
  164. package/dist/clients/inbox/review/composition.d.ts +60 -0
  165. package/dist/clients/inbox/review/composition.js +278 -0
  166. package/dist/clients/inbox/review/document-region.d.ts +120 -0
  167. package/dist/clients/inbox/review/document-region.js +902 -0
  168. package/dist/clients/inbox/review/frame.d.ts +45 -0
  169. package/dist/clients/inbox/review/frame.js +215 -0
  170. package/dist/clients/inbox/review/keys.d.ts +67 -0
  171. package/dist/clients/inbox/review/keys.js +130 -0
  172. package/dist/clients/inbox/review/launch.d.ts +10 -0
  173. package/dist/clients/inbox/review/launch.js +129 -0
  174. package/dist/clients/inbox/review/live-source.d.ts +24 -0
  175. package/dist/clients/inbox/review/live-source.js +160 -0
  176. package/dist/clients/inbox/review/nvim.d.ts +13 -0
  177. package/dist/clients/inbox/review/nvim.js +42 -0
  178. package/dist/clients/inbox/review/remap.d.ts +51 -0
  179. package/dist/clients/inbox/review/remap.js +157 -0
  180. package/dist/clients/inbox/review/review-client.d.ts +30 -0
  181. package/dist/clients/inbox/review/review-client.js +107 -0
  182. package/dist/clients/inbox/review/roundtrip.d.ts +5 -0
  183. package/dist/clients/inbox/review/roundtrip.js +36 -0
  184. package/dist/clients/inbox/review/state.d.ts +143 -0
  185. package/dist/clients/inbox/review/state.js +282 -0
  186. package/dist/clients/inbox/review-adapter.d.ts +29 -0
  187. package/dist/clients/inbox/review-adapter.js +92 -0
  188. package/dist/clients/inbox/review-visibility.d.ts +5 -0
  189. package/dist/clients/inbox/review-visibility.js +19 -0
  190. package/dist/clients/inbox/surface.d.ts +19 -0
  191. package/dist/clients/inbox/surface.js +128 -0
  192. package/dist/clients/inbox/tui/ansi.d.ts +66 -0
  193. package/dist/clients/inbox/tui/ansi.js +317 -0
  194. package/dist/clients/inbox/tui/clipboard.d.ts +2 -0
  195. package/dist/clients/inbox/tui/clipboard.js +26 -0
  196. package/dist/clients/inbox/tui/input.d.ts +7 -0
  197. package/dist/clients/inbox/tui/input.js +653 -0
  198. package/dist/clients/inbox/tui/keys.d.ts +28 -0
  199. package/dist/clients/inbox/tui/keys.js +111 -0
  200. package/dist/clients/inbox/tui/panel.d.ts +2 -0
  201. package/dist/clients/inbox/tui/panel.js +217 -0
  202. package/dist/clients/inbox/tui/render.d.ts +37 -0
  203. package/dist/clients/inbox/tui/render.js +476 -0
  204. package/dist/clients/inbox/tui/types.d.ts +57 -0
  205. package/dist/clients/inbox/tui/types.js +1 -0
  206. package/dist/clients/inbox/tui.d.ts +6 -0
  207. package/dist/clients/inbox/tui.js +74 -0
  208. package/dist/clients/surfaces/host.d.ts +66 -0
  209. package/dist/clients/surfaces/host.js +1 -0
  210. package/dist/clients/surfaces/region.d.ts +16 -0
  211. package/dist/clients/surfaces/region.js +1 -0
  212. package/dist/clients/web/__tests__/push-engine.test.js +14 -158
  213. package/dist/clients/web/dev-server.d.ts +3 -3
  214. package/dist/clients/web/dev-server.js +9 -23
  215. package/dist/clients/web/events.js +4 -6
  216. package/dist/clients/web/push-engine.d.ts +2 -66
  217. package/dist/clients/web/push-engine.js +30 -161
  218. package/dist/clients/web/push-registry.d.ts +0 -4
  219. package/dist/clients/web/push-registry.js +2 -7
  220. package/dist/clients/web/server.js +3 -35
  221. package/dist/clients/web/web-client/shared/protocol.d.ts +0 -108
  222. package/dist/clients/web/web-cmd.js +2 -2
  223. package/dist/commands/__tests__/human.test.js +27 -15
  224. package/dist/commands/api-client.js +3 -3
  225. package/dist/commands/canvas-browse.js +1 -1
  226. package/dist/commands/canvas-issue.js +1 -1
  227. package/dist/commands/canvas-use.js +1 -1
  228. package/dist/commands/human/doc.d.ts +2 -0
  229. package/dist/commands/human/doc.js +98 -0
  230. package/dist/commands/human/inbox.d.ts +2 -0
  231. package/dist/commands/human/inbox.js +101 -0
  232. package/dist/commands/human/prompts.d.ts +2 -3
  233. package/dist/commands/human/prompts.js +27 -180
  234. package/dist/commands/human/queue.d.ts +1 -5
  235. package/dist/commands/human/queue.js +54 -216
  236. package/dist/commands/human/review.d.ts +2 -0
  237. package/dist/commands/human/review.js +298 -0
  238. package/dist/commands/human/shared.d.ts +2 -69
  239. package/dist/commands/human/shared.js +1 -181
  240. package/dist/commands/human.js +15 -20
  241. package/dist/commands/memory/__tests__/lint.test.d.ts +1 -0
  242. package/dist/commands/memory/__tests__/lint.test.js +15 -0
  243. package/dist/commands/memory/delete.js +2 -2
  244. package/dist/commands/memory/lint.d.ts +1 -0
  245. package/dist/commands/memory/lint.js +21 -3
  246. package/dist/commands/memory/read.js +4 -4
  247. package/dist/commands/node.js +8 -7
  248. package/dist/commands/pkg/plugin-manage.js +143 -68
  249. package/dist/commands/surface-inspect.js +2 -2
  250. package/dist/commands/surface.js +6 -12
  251. package/dist/commands/sys/__tests__/setup-core.test.js +9 -5
  252. package/dist/commands/sys/__tests__/setup-front-door.test.js +7 -42
  253. package/dist/commands/sys/config.js +29 -3
  254. package/dist/commands/sys/feedback.js +1 -1
  255. package/dist/commands/sys/setup-core.d.ts +12 -11
  256. package/dist/commands/sys/setup-core.js +55 -46
  257. package/dist/commands/sys/setup-wizard.d.ts +4 -1
  258. package/dist/commands/sys/setup-wizard.js +50 -9
  259. package/dist/commands/sys/sync-deps.js +1 -1
  260. package/dist/commands/sys.js +4 -6
  261. package/dist/core/__tests__/broker-sdk-wiring.test.js +6 -1
  262. package/dist/core/__tests__/broker-snapshot-history.test.js +9 -1
  263. package/dist/core/__tests__/dead-node-policy-table.test.js +3 -4
  264. package/dist/core/__tests__/fixtures/fake-engine.d.ts +8 -5
  265. package/dist/core/__tests__/fixtures/fake-engine.js +28 -2
  266. package/dist/core/__tests__/full/broker-provider-retry.test.js +87 -2
  267. package/dist/core/__tests__/full/broker-whip-interrupt.test.d.ts +1 -0
  268. package/dist/core/__tests__/full/broker-whip-interrupt.test.js +39 -0
  269. package/dist/core/__tests__/full/detach-focus.test.js +1 -1
  270. package/dist/core/__tests__/human-deliver-e2e.test.js +64 -64
  271. package/dist/core/__tests__/human-deliver.test.js +71 -345
  272. package/dist/core/__tests__/inline-memory-refs.test.js +2 -12
  273. package/dist/core/__tests__/memory-resolver-precedence.test.js +12 -15
  274. package/dist/core/__tests__/migration.test.js +10 -0
  275. package/dist/core/__tests__/model-pin-durability.test.js +14 -0
  276. package/dist/core/__tests__/phase4-review-migration.test.d.ts +1 -0
  277. package/dist/core/__tests__/phase4-review-migration.test.js +100 -0
  278. package/dist/core/__tests__/phase4-review-store.test.d.ts +1 -0
  279. package/dist/core/__tests__/phase4-review-store.test.js +143 -0
  280. package/dist/core/__tests__/remote-canvas-target.test.js +2 -2
  281. package/dist/core/__tests__/revive.test.js +22 -53
  282. package/dist/core/__tests__/session-cycles.test.js +48 -18
  283. package/dist/core/__tests__/spawn-no-kickoff.test.js +8 -12
  284. package/dist/core/__tests__/stop-guard.test.js +16 -1
  285. package/dist/core/__tests__/tmux-surface.test.js +21 -25
  286. package/dist/core/asset-root.d.ts +7 -0
  287. package/dist/core/asset-root.js +18 -0
  288. package/dist/core/broker-client/client.d.ts +0 -7
  289. package/dist/core/broker-client/client.js +4 -10
  290. package/dist/core/broker-client/transport-relay.d.ts +3 -4
  291. package/dist/core/broker-client/transport-relay.js +3 -4
  292. package/dist/core/canvas/__tests__/attention.test.js +1 -1
  293. package/dist/core/canvas/__tests__/remote-canvas-source.test.js +1 -1
  294. package/dist/core/canvas/__tests__/remote-transport.test.d.ts +1 -0
  295. package/dist/core/{view/__tests__/transport-remote.test.js → canvas/__tests__/remote-transport.test.js} +2 -2
  296. package/dist/core/canvas/__tests__/render-remote.test.js +1 -1
  297. package/dist/core/canvas/attention.js +4 -4
  298. package/dist/core/canvas/canvas.d.ts +6 -11
  299. package/dist/core/canvas/canvas.js +11 -33
  300. package/dist/core/canvas/db.js +207 -38
  301. package/dist/core/canvas/extensions.d.ts +1 -1
  302. package/dist/core/canvas/extensions.js +8 -1
  303. package/dist/core/canvas/index.d.ts +0 -1
  304. package/dist/core/canvas/index.js +0 -1
  305. package/dist/core/canvas/nav-model.d.ts +1 -1
  306. package/dist/core/canvas/nav-model.js +1 -1
  307. package/dist/core/canvas/paths.d.ts +5 -0
  308. package/dist/core/canvas/paths.js +16 -0
  309. package/dist/core/canvas/remote-canvas-source.js +2 -2
  310. package/dist/core/canvas/remote-transport.d.ts +7 -0
  311. package/dist/core/{view/transport-remote.js → canvas/remote-transport.js} +3 -4
  312. package/dist/core/canvas/source.js +1 -1
  313. package/dist/core/canvas/status-glyph.js +4 -12
  314. package/dist/core/canvas/types.d.ts +10 -35
  315. package/dist/core/clipboard-text.d.ts +8 -0
  316. package/dist/core/clipboard-text.js +18 -0
  317. package/dist/core/command-manifests/registry.d.ts +1 -3
  318. package/dist/core/command-plugins/bundle.d.ts +29 -0
  319. package/dist/core/command-plugins/bundle.js +198 -0
  320. package/dist/core/command-plugins/discovery.d.ts +0 -8
  321. package/dist/core/command-plugins/discovery.js +2 -39
  322. package/dist/core/command-plugins/transport/http-fetch.d.ts +4 -30
  323. package/dist/core/command-plugins/transport/http-fetch.js +17 -95
  324. package/dist/core/command.d.ts +1 -13
  325. package/dist/core/command.js +1 -16
  326. package/dist/core/config.d.ts +4 -0
  327. package/dist/core/config.js +28 -3
  328. package/dist/core/document-lines.d.ts +4 -0
  329. package/dist/core/document-lines.js +6 -0
  330. package/dist/core/feed/feed.d.ts +2 -0
  331. package/dist/core/feed/feed.js +11 -7
  332. package/dist/core/human/__tests__/inbox-cancel-worker.d.ts +1 -0
  333. package/dist/core/human/__tests__/inbox-cancel-worker.js +7 -0
  334. package/dist/core/human/__tests__/inbox-claim-worker.d.ts +1 -0
  335. package/dist/core/human/__tests__/inbox-claim-worker.js +17 -0
  336. package/dist/core/human/__tests__/inbox-core.test.d.ts +1 -0
  337. package/dist/core/human/__tests__/inbox-core.test.js +144 -0
  338. package/dist/core/human/__tests__/inbox-stale-claim-worker.d.ts +1 -0
  339. package/dist/core/human/__tests__/inbox-stale-claim-worker.js +8 -0
  340. package/dist/core/human/__tests__/visible-paths.test.d.ts +1 -0
  341. package/dist/{clients/attach → core/human}/__tests__/visible-paths.test.js +9 -0
  342. package/dist/core/human/claim.d.ts +23 -0
  343. package/dist/core/human/claim.js +67 -0
  344. package/dist/core/human/convention.d.ts +30 -0
  345. package/dist/core/human/convention.js +202 -0
  346. package/dist/core/human/deck-factories.d.ts +8 -0
  347. package/dist/core/human/deck-factories.js +15 -0
  348. package/dist/core/human/deck-schema.d.ts +70 -0
  349. package/dist/core/human/deck-schema.js +92 -0
  350. package/dist/core/human/root.d.ts +7 -0
  351. package/dist/core/human/root.js +37 -0
  352. package/dist/core/human/scan.d.ts +3 -0
  353. package/dist/core/human/scan.js +76 -0
  354. package/dist/core/human/summary.d.ts +8 -0
  355. package/dist/core/human/summary.js +44 -0
  356. package/dist/core/human/tickets.d.ts +49 -0
  357. package/dist/core/human/tickets.js +190 -0
  358. package/dist/core/human/types.d.ts +136 -0
  359. package/dist/core/human/types.js +5 -0
  360. package/dist/{clients/attach → core/human}/visible-paths.d.ts +1 -1
  361. package/dist/{clients/attach → core/human}/visible-paths.js +3 -2
  362. package/dist/core/inspector/chrome.d.ts +6 -0
  363. package/dist/core/inspector/chrome.js +14 -0
  364. package/dist/core/inspector/contract.d.ts +105 -0
  365. package/dist/core/inspector/contract.js +1 -0
  366. package/dist/core/inspector/core.d.ts +4 -5
  367. package/dist/core/inspector/core.js +3 -5
  368. package/dist/core/inspector/host.d.ts +46 -0
  369. package/dist/core/{tui → inspector}/host.js +42 -208
  370. package/dist/core/inspector/text.d.ts +2 -2
  371. package/dist/core/inspector/transport.d.ts +6 -0
  372. package/dist/core/inspector/transport.js +36 -0
  373. package/dist/core/inspector/tui.d.ts +2 -2
  374. package/dist/core/inspector/tui.js +15 -15
  375. package/dist/core/keybindings/__tests__/inbox-affordance.test.js +11 -11
  376. package/dist/core/keybindings/__tests__/resolve.test.js +10 -19
  377. package/dist/core/keybindings/attach-control.d.ts +9 -3
  378. package/dist/core/keybindings/attach-control.js +3 -1
  379. package/dist/core/keybindings/catalog.d.ts +6 -5
  380. package/dist/core/keybindings/catalog.js +61 -133
  381. package/dist/core/keybindings/inbox.d.ts +5 -6
  382. package/dist/core/keybindings/inbox.js +9 -10
  383. package/dist/core/keybindings/index.d.ts +3 -3
  384. package/dist/core/keybindings/index.js +3 -3
  385. package/dist/core/keybindings/persistence.d.ts +5 -1
  386. package/dist/core/keybindings/persistence.js +24 -6
  387. package/dist/core/keybindings/resolve.d.ts +6 -0
  388. package/dist/core/keybindings/resolve.js +10 -3
  389. package/dist/core/memory/inline-ref-grammar.js +2 -3
  390. package/dist/core/memory-resolver.d.ts +27 -29
  391. package/dist/core/memory-resolver.js +45 -39
  392. package/dist/core/model-routes.d.ts +33 -0
  393. package/dist/core/model-routes.js +42 -3
  394. package/dist/core/preview-registry.js +17 -55
  395. package/dist/core/profiles/select.js +3 -3
  396. package/dist/core/{view/remote-canvas-target.d.ts → remote-canvas-target.d.ts} +2 -2
  397. package/dist/core/{view/remote-canvas-target.js → remote-canvas-target.js} +4 -4
  398. package/dist/core/review/__tests__/capture-origin.test.d.ts +1 -0
  399. package/dist/core/review/__tests__/capture-origin.test.js +139 -0
  400. package/dist/core/review/__tests__/comments.test.d.ts +1 -0
  401. package/dist/core/review/__tests__/comments.test.js +98 -0
  402. package/dist/core/review/__tests__/project.test.d.ts +1 -0
  403. package/dist/core/review/__tests__/project.test.js +71 -0
  404. package/dist/core/review/__tests__/remap.test.d.ts +1 -0
  405. package/dist/core/review/__tests__/remap.test.js +159 -0
  406. package/dist/core/review/__tests__/stage-identity.test.d.ts +1 -0
  407. package/dist/core/review/__tests__/stage-identity.test.js +140 -0
  408. package/dist/core/review/birth.d.ts +7 -0
  409. package/dist/core/review/birth.js +23 -0
  410. package/dist/core/review/comments.d.ts +69 -0
  411. package/dist/core/review/comments.js +295 -0
  412. package/dist/core/review/companion.d.ts +35 -0
  413. package/dist/core/review/companion.js +205 -0
  414. package/dist/core/review/document.d.ts +27 -0
  415. package/dist/core/review/document.js +138 -0
  416. package/dist/core/review/project.d.ts +13 -0
  417. package/dist/core/review/project.js +58 -0
  418. package/dist/core/review/realize.d.ts +19 -0
  419. package/dist/core/review/realize.js +217 -0
  420. package/dist/core/review/remap.d.ts +24 -0
  421. package/dist/core/review/remap.js +156 -0
  422. package/dist/core/review/signal.d.ts +5 -0
  423. package/dist/core/review/signal.js +31 -0
  424. package/dist/core/review/stage.d.ts +26 -0
  425. package/dist/core/review/stage.js +184 -0
  426. package/dist/core/review/store.d.ts +46 -0
  427. package/dist/core/review/store.js +163 -0
  428. package/dist/core/review/ticket-filter.d.ts +17 -0
  429. package/dist/core/review/ticket-filter.js +32 -0
  430. package/dist/core/review/types.d.ts +130 -0
  431. package/dist/core/review/types.js +23 -0
  432. package/dist/core/runtime/__tests__/session-visibility.test.d.ts +1 -0
  433. package/dist/core/runtime/__tests__/session-visibility.test.js +119 -0
  434. package/dist/core/runtime/bearings.d.ts +5 -17
  435. package/dist/core/runtime/bearings.js +88 -71
  436. package/dist/core/runtime/broker-protocol.d.ts +31 -8
  437. package/dist/core/runtime/broker.d.ts +15 -1
  438. package/dist/core/runtime/broker.js +573 -141
  439. package/dist/core/runtime/canvas-extensions.d.ts +4 -5
  440. package/dist/core/runtime/canvas-extensions.js +5 -5
  441. package/dist/core/runtime/front-door.js +4 -4
  442. package/dist/core/runtime/headless-pi.d.ts +24 -0
  443. package/dist/core/runtime/headless-pi.js +152 -0
  444. package/dist/core/runtime/kickoff.d.ts +1 -5
  445. package/dist/core/runtime/kickoff.js +1 -5
  446. package/dist/core/runtime/model-registry.d.ts +3 -0
  447. package/dist/core/runtime/model-registry.js +13 -0
  448. package/dist/core/runtime/naming-persist.d.ts +4 -0
  449. package/dist/core/runtime/naming-persist.js +27 -1
  450. package/dist/core/runtime/naming.d.ts +17 -12
  451. package/dist/core/runtime/naming.js +91 -140
  452. package/dist/core/runtime/node-read.js +19 -10
  453. package/dist/core/runtime/nodes.d.ts +9 -14
  454. package/dist/core/runtime/nodes.js +3 -53
  455. package/dist/core/runtime/package-health.d.ts +6 -21
  456. package/dist/core/runtime/package-health.js +12 -123
  457. package/dist/core/runtime/placement-tmux.d.ts +2 -1
  458. package/dist/core/runtime/placement-tmux.js +6 -4
  459. package/dist/core/runtime/placement.d.ts +1 -0
  460. package/dist/core/runtime/placement.js +4 -8
  461. package/dist/core/runtime/promote.js +3 -0
  462. package/dist/core/runtime/recap.d.ts +2 -7
  463. package/dist/core/runtime/recap.js +35 -69
  464. package/dist/core/runtime/revive.js +34 -77
  465. package/dist/core/runtime/session-cycles.d.ts +4 -0
  466. package/dist/core/runtime/session-cycles.js +14 -1
  467. package/dist/core/runtime/session-visibility.d.ts +37 -0
  468. package/dist/core/runtime/session-visibility.js +83 -0
  469. package/dist/core/runtime/spawn.js +10 -22
  470. package/dist/core/runtime/stop-guard.d.ts +1 -1
  471. package/dist/core/runtime/stop-guard.js +18 -13
  472. package/dist/core/runtime/surface-bg.js +1 -1
  473. package/dist/core/runtime/tmux-chrome.d.ts +1 -1
  474. package/dist/core/runtime/tmux-chrome.js +1 -1
  475. package/dist/core/runtime/tmux.d.ts +35 -7
  476. package/dist/core/runtime/tmux.js +439 -62
  477. package/dist/core/runtime/tool-group-summary.d.ts +19 -0
  478. package/dist/core/runtime/tool-group-summary.js +88 -0
  479. package/dist/core/scope.d.ts +2 -7
  480. package/dist/core/scope.js +9 -35
  481. package/dist/core/substrate/schema.d.ts +2 -2
  482. package/dist/core/termrender/code-doc.d.ts +12 -0
  483. package/dist/core/termrender/code-doc.js +92 -0
  484. package/dist/core/termrender/display.d.ts +12 -0
  485. package/dist/core/termrender/display.js +19 -0
  486. package/dist/core/termrender/termrender.d.ts +73 -0
  487. package/dist/core/termrender/termrender.js +795 -0
  488. package/dist/core/termrender/version.d.ts +1 -0
  489. package/dist/core/termrender/version.js +1 -0
  490. package/dist/core/tui/terminal.js +1 -2
  491. package/dist/core/user-settings.d.ts +71 -3
  492. package/dist/core/user-settings.js +83 -1
  493. package/dist/daemon/api/__tests__/inbox.test.js +44 -133
  494. package/dist/daemon/api/handlers/human.d.ts +0 -10
  495. package/dist/daemon/api/handlers/human.js +104 -702
  496. package/dist/daemon/api/handlers/inbox.js +113 -142
  497. package/dist/daemon/api/handlers/review-comments.d.ts +2 -0
  498. package/dist/daemon/api/handlers/review-comments.js +500 -0
  499. package/dist/daemon/api/handlers/reviews.d.ts +2 -0
  500. package/dist/daemon/api/handlers/reviews.js +287 -0
  501. package/dist/daemon/api/map.d.ts +22 -7
  502. package/dist/daemon/api/map.js +159 -11
  503. package/dist/daemon/api/server.js +4 -0
  504. package/dist/daemon/cron-run.js +6 -9
  505. package/dist/daemon/crtrd.js +17 -33
  506. package/dist/daemon/fleet.d.ts +1 -8
  507. package/dist/daemon/fleet.js +4 -30
  508. package/dist/daemon/human/finish.d.ts +14 -0
  509. package/dist/daemon/human/finish.js +115 -0
  510. package/dist/daemon/human/sweep.d.ts +6 -0
  511. package/dist/daemon/human/sweep.js +49 -0
  512. package/dist/daemon/messaging/node-message.d.ts +18 -0
  513. package/dist/daemon/messaging/node-message.js +70 -0
  514. package/dist/daemon/review/comment-notify.d.ts +26 -0
  515. package/dist/daemon/review/comment-notify.js +107 -0
  516. package/dist/daemon/review/deliver.d.ts +7 -0
  517. package/dist/daemon/review/deliver.js +56 -0
  518. package/dist/daemon/review/finish.d.ts +22 -0
  519. package/dist/daemon/review/finish.js +254 -0
  520. package/dist/daemon/review/sweep.d.ts +11 -0
  521. package/dist/daemon/review/sweep.js +120 -0
  522. package/dist/index.d.ts +2 -0
  523. package/dist/index.js +2 -2
  524. package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +42 -64
  525. package/dist/pi-extensions/__tests__/canvas-recap.test.d.ts +1 -0
  526. package/dist/pi-extensions/__tests__/canvas-recap.test.js +159 -0
  527. package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +16 -38
  528. package/dist/pi-extensions/__tests__/canvas-structured-output.test.d.ts +1 -0
  529. package/dist/pi-extensions/__tests__/canvas-structured-output.test.js +63 -0
  530. package/dist/pi-extensions/canvas-context-intro.d.ts +8 -11
  531. package/dist/pi-extensions/canvas-context-intro.js +50 -104
  532. package/dist/pi-extensions/canvas-recap.d.ts +15 -2
  533. package/dist/pi-extensions/canvas-recap.js +192 -69
  534. package/dist/pi-extensions/canvas-review-boundary.d.ts +59 -0
  535. package/dist/pi-extensions/canvas-review-boundary.js +81 -0
  536. package/dist/pi-extensions/canvas-stophook.d.ts +3 -3
  537. package/dist/pi-extensions/canvas-stophook.js +78 -128
  538. package/dist/pi-extensions/canvas-structured-output.js +52 -8
  539. package/dist/shared/generated-context.d.ts +29 -4
  540. package/dist/shared/generated-context.js +122 -7
  541. package/dist/shared/tool-groups.d.ts +23 -0
  542. package/dist/shared/tool-groups.js +60 -0
  543. package/dist/shared/working-activity.d.ts +8 -0
  544. package/dist/shared/working-activity.js +26 -0
  545. package/dist/types.d.ts +36 -2
  546. package/dist/types.js +51 -0
  547. package/dist/web-client/assets/index-CCPaLeW7.css +2 -0
  548. package/dist/web-client/assets/index-kyOWsnZK.js +86 -0
  549. package/dist/web-client/index.html +2 -2
  550. package/dist/web-client/sw.js +1 -1
  551. package/docs/compat/hearth-crtr-v4.md +2 -2
  552. package/docs/compat/hearth-crtr-v5.md +4 -2
  553. package/docs/public-api.md +3 -3
  554. package/package.json +21 -14
  555. package/runtime.lock.json +4661 -1453
  556. package/scripts/postinstall.mjs +15 -2
  557. package/dist/builtin-pi-packages/pi-mode-switch/README.md +0 -36
  558. package/dist/builtin-pi-packages/pi-mode-switch/bin/mode +0 -36
  559. package/dist/builtin-pi-packages/pi-mode-switch/extensions/index.ts +0 -449
  560. package/dist/builtin-pi-packages/pi-mode-switch/package.json +0 -14
  561. package/dist/builtin-pi-packages/pi-mode-switch/tsconfig.json +0 -9
  562. package/dist/builtin-views/_lib/states.mjs +0 -161
  563. package/dist/builtin-views/canvas/core.mjs +0 -657
  564. package/dist/builtin-views/canvas/text.mjs +0 -58
  565. package/dist/builtin-views/canvas/tui.mjs +0 -168
  566. package/dist/builtin-views/canvas/web.jsx +0 -121
  567. package/dist/builtin-views/chat/core.mjs +0 -684
  568. package/dist/builtin-views/chat/text.mjs +0 -101
  569. package/dist/builtin-views/chat/tui.mjs +0 -360
  570. package/dist/builtin-views/chat/web.jsx +0 -362
  571. package/dist/builtin-views/git-pr/core.mjs +0 -673
  572. package/dist/builtin-views/git-pr/text.mjs +0 -84
  573. package/dist/builtin-views/git-pr/tui.mjs +0 -301
  574. package/dist/builtin-views/git-pr/web.jsx +0 -216
  575. package/dist/builtin-views/inbox/_lib/render.mjs +0 -175
  576. package/dist/builtin-views/inbox/core.mjs +0 -1273
  577. package/dist/builtin-views/inbox/text.mjs +0 -73
  578. package/dist/builtin-views/inbox/tui.mjs +0 -314
  579. package/dist/builtin-views/inbox/web.jsx +0 -188
  580. package/dist/builtin-views/linkedin/core.mjs +0 -906
  581. package/dist/builtin-views/linkedin/text.mjs +0 -69
  582. package/dist/builtin-views/linkedin/tui.mjs +0 -413
  583. package/dist/builtin-views/linkedin/web.jsx +0 -206
  584. package/dist/builtin-views/prompt-review/core.mjs +0 -735
  585. package/dist/builtin-views/prompt-review/text.mjs +0 -15
  586. package/dist/builtin-views/prompt-review/tui.mjs +0 -196
  587. package/dist/builtin-views/prompt-review/web.jsx +0 -484
  588. package/dist/builtin-views/workspace-sidebar/__tests__/core.test.js +0 -50
  589. package/dist/builtin-views/workspace-sidebar/__tests__/core.test.ts +0 -53
  590. package/dist/builtin-views/workspace-sidebar/core.mjs +0 -670
  591. package/dist/builtin-views/workspace-sidebar/text.mjs +0 -53
  592. package/dist/builtin-views/workspace-sidebar/tui.mjs +0 -141
  593. package/dist/builtin-views/workspace-sidebar/web.jsx +0 -109
  594. package/dist/clients/attach/session/mode.d.ts +0 -25
  595. package/dist/clients/attach/session/mode.js +0 -97
  596. package/dist/commands/sys/promptstudio.d.ts +0 -2
  597. package/dist/commands/sys/promptstudio.js +0 -65
  598. package/dist/commands/view-cycle.d.ts +0 -2
  599. package/dist/commands/view-cycle.js +0 -130
  600. package/dist/commands/view-list.d.ts +0 -2
  601. package/dist/commands/view-list.js +0 -66
  602. package/dist/commands/view-new.d.ts +0 -2
  603. package/dist/commands/view-new.js +0 -74
  604. package/dist/commands/view-pick.d.ts +0 -6
  605. package/dist/commands/view-pick.js +0 -129
  606. package/dist/commands/view-run.d.ts +0 -2
  607. package/dist/commands/view-run.js +0 -214
  608. package/dist/commands/view.d.ts +0 -2
  609. package/dist/commands/view.js +0 -31
  610. package/dist/commands/workspace.d.ts +0 -2
  611. package/dist/commands/workspace.js +0 -165
  612. package/dist/core/__tests__/chat-view-reconnect.test.js +0 -105
  613. package/dist/core/__tests__/full/consult-startup-failure.test.js +0 -124
  614. package/dist/core/canvas/__tests__/human-work-outbox.test.js +0 -123
  615. package/dist/core/canvas/human-work-outbox.d.ts +0 -73
  616. package/dist/core/canvas/human-work-outbox.js +0 -261
  617. package/dist/core/command-plugins/store.d.ts +0 -16
  618. package/dist/core/command-plugins/store.js +0 -64
  619. package/dist/core/keybindings/__tests__/bespoke-consumers.test.js +0 -40
  620. package/dist/core/runtime/fault-recovery-nudge.d.ts +0 -3
  621. package/dist/core/runtime/fault-recovery-nudge.js +0 -3
  622. package/dist/core/tui/__tests__/host-keybindings.test.js +0 -113
  623. package/dist/core/tui/host.d.ts +0 -66
  624. package/dist/core/view/__tests__/transport-cache.test.js +0 -62
  625. package/dist/core/view/bridge.d.ts +0 -10
  626. package/dist/core/view/bridge.js +0 -31
  627. package/dist/core/view/chrome.d.ts +0 -9
  628. package/dist/core/view/chrome.js +0 -22
  629. package/dist/core/view/contract.d.ts +0 -205
  630. package/dist/core/view/contract.js +0 -23
  631. package/dist/core/view/loader.d.ts +0 -31
  632. package/dist/core/view/loader.js +0 -188
  633. package/dist/core/view/stream-local.d.ts +0 -3
  634. package/dist/core/view/stream-local.js +0 -231
  635. package/dist/core/view/transport-cache.d.ts +0 -8
  636. package/dist/core/view/transport-cache.js +0 -38
  637. package/dist/core/view/transport-local.d.ts +0 -7
  638. package/dist/core/view/transport-local.js +0 -83
  639. package/dist/core/view/transport-remote.d.ts +0 -2
  640. package/dist/core/view/transport.d.ts +0 -10
  641. package/dist/core/view/transport.js +0 -15
  642. package/dist/pi-extensions/naming-tool.d.ts +0 -24
  643. package/dist/pi-extensions/naming-tool.js +0 -67
  644. package/dist/prompts/view.d.ts +0 -7
  645. package/dist/prompts/view.js +0 -172
  646. package/dist/web/ViewChrome.d.ts +0 -7
  647. package/dist/web/ViewChrome.js +0 -28
  648. package/dist/web/ViewPane.d.ts +0 -39
  649. package/dist/web/ViewPane.js +0 -48
  650. package/dist/web/index.d.ts +0 -8
  651. package/dist/web/index.js +0 -22
  652. package/dist/web/runtime.d.ts +0 -39
  653. package/dist/web/runtime.js +0 -232
  654. package/dist/web/states.d.ts +0 -24
  655. package/dist/web/states.js +0 -24
  656. package/dist/web/transport-http.d.ts +0 -5
  657. package/dist/web/transport-http.js +0 -34
  658. package/dist/web/transport-stream.d.ts +0 -3
  659. package/dist/web/transport-stream.js +0 -204
  660. package/dist/web-client/assets/index-U_NZ66VE.js +0 -79
  661. package/dist/web-client/assets/index-aaeu4adv.css +0 -2
  662. /package/dist/{builtin-views/workspace-sidebar/__tests__/core.test.d.ts → clients/attach/__tests__/file-review-focus.test.d.ts} +0 -0
  663. /package/dist/clients/attach/__tests__/{visible-paths.test.d.ts → group-activity.test.d.ts} +0 -0
  664. /package/dist/{core/__tests__/chat-view-reconnect.test.d.ts → clients/attach/__tests__/input-controller-extension-command.test.d.ts} +0 -0
  665. /package/dist/{core/__tests__/full/consult-startup-failure.test.d.ts → clients/attach/__tests__/session-identity-refresh.test.d.ts} +0 -0
  666. /package/dist/{core/canvas/__tests__/human-work-outbox.test.d.ts → clients/inbox/__tests__/inbox-controller.test.d.ts} +0 -0
  667. /package/dist/{core/keybindings/__tests__/bespoke-consumers.test.d.ts → clients/inbox/__tests__/mount-panel.test.d.ts} +0 -0
  668. /package/dist/{core/tui/__tests__/host-keybindings.test.d.ts → clients/inbox/review/__tests__/editor-roundtrip.test.d.ts} +0 -0
  669. /package/dist/{core/view/__tests__/transport-cache.test.d.ts → clients/inbox/review/__tests__/remap.test.d.ts} +0 -0
  670. /package/dist/{core/view/__tests__/transport-remote.test.d.ts → clients/inbox/review/__tests__/review-core.test.d.ts} +0 -0
@@ -1,684 +0,0 @@
1
- // @ts-check
2
- /**
3
- * Chat view — the portable CORE for the crtr `chat` builtin view.
4
- *
5
- * Import-free, dual-target, plain JS only. The core owns the state shape, the
6
- * stream declaration, the broker frame fold, and the drive intents; presenters
7
- * only read state and dispatch intents.
8
- *
9
- * @module chat/core
10
- */
11
-
12
- /** @typedef {'controller'|'observer'} ChatRole */
13
- /** @typedef {'idle'|'connecting'|'open'|'closed'|'no-broker'|'no-node'|'invalid'|'error'} ChatConn */
14
- /** @typedef {'info'|'action'|'error'} NoticeLevel */
15
-
16
- /** @typedef {Object} ChatTranscript
17
- * @property {any[]} messages
18
- * @property {number|null} streamingIndex
19
- * @property {string[]} executingToolIds
20
- * @property {string|null} activity
21
- * @property {string|null} lastAssistantText
22
- */
23
-
24
- /** @typedef {Object} ChatSession
25
- * @property {string|null} sessionId
26
- * @property {string|null} sessionFile
27
- * @property {string|null} model
28
- * @property {boolean} isStreaming
29
- * @property {string} thinkingLevel
30
- * @property {string} steeringMode
31
- * @property {string} followUpMode
32
- * @property {string|null} sessionName
33
- * @property {boolean} autoCompactionEnabled
34
- * @property {number} pendingMessageCount
35
- */
36
-
37
- /** @typedef {Object} ChatNotice
38
- * @property {string} id
39
- * @property {NoticeLevel} level
40
- * @property {string} text
41
- * @property {number} at
42
- */
43
-
44
- /** @typedef {Object} ChatState
45
- * @property {string|null} target
46
- * @property {ChatRole} desiredRole
47
- * @property {any|null} channel
48
- * @property {ChatConn} conn
49
- * @property {ChatRole} role
50
- * @property {ChatSession|null} session
51
- * @property {ChatTranscript} transcript
52
- * @property {string} draft
53
- * @property {ChatNotice[]} notices
54
- * @property {any|null} pendingDialog
55
- * @property {string[]} queued
56
- * @property {number|undefined} contextTokens
57
- */
58
-
59
- /** @typedef {Object} ChatCloseReason
60
- * @property {string=} reason
61
- * @property {string=} message
62
- * @property {string=} kind
63
- */
64
-
65
- function uid() {
66
- const c = globalThis.crypto;
67
- if (c && typeof c.randomUUID === 'function') return c.randomUUID();
68
- return `n-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;
69
- }
70
-
71
- /** @param {unknown} value @returns {value is Record<string, unknown>} */
72
- function isRecord(value) {
73
- return typeof value === 'object' && value !== null;
74
- }
75
-
76
- /** @param {unknown} value @returns {string} */
77
- function asText(value) {
78
- return typeof value === 'string' ? value : '';
79
- }
80
-
81
- /** @param {unknown} value @returns {string|null} */
82
- function asMaybeText(value) {
83
- return typeof value === 'string' && value !== '' ? value : null;
84
- }
85
-
86
- /** @param {unknown} value @returns {string|null} */
87
- function messageRole(value) {
88
- return isRecord(value) && typeof value.role === 'string' ? value.role : null;
89
- }
90
-
91
- /** @param {unknown} content @returns {string} */
92
- function textFromContent(content) {
93
- if (typeof content === 'string') return content;
94
- if (!Array.isArray(content)) return '';
95
- return content
96
- .filter((block) => isRecord(block) && block.type === 'text')
97
- .map((block) => asText(block.text))
98
- .join('');
99
- }
100
-
101
- /** @param {unknown} message @returns {string} */
102
- export function messageText(message) {
103
- if (!isRecord(message)) return '';
104
- const fromContent = textFromContent(message.content);
105
- if (fromContent) return fromContent;
106
- return asText(message.text);
107
- }
108
-
109
- /** @param {any[]} messages @returns {string|null} */
110
- export function lastAssistantText(messages) {
111
- for (let i = messages.length - 1; i >= 0; i--) {
112
- const message = messages[i];
113
- if (messageRole(message) !== 'assistant') continue;
114
- const text = messageText(message).trim();
115
- if (text) return text;
116
- }
117
- return null;
118
- }
119
-
120
- /** @returns {ChatTranscript} */
121
- export function initialTranscript() {
122
- return {
123
- messages: [],
124
- streamingIndex: null,
125
- executingToolIds: [],
126
- activity: null,
127
- lastAssistantText: null,
128
- };
129
- }
130
-
131
- /** @param {any} snapshot @returns {ChatTranscript} */
132
- export function applySnapshot(snapshot) {
133
- const messages = Array.isArray(snapshot?.messages) ? snapshot.messages.slice() : [];
134
- return {
135
- messages,
136
- streamingIndex: null,
137
- executingToolIds: [],
138
- activity: snapshot?.state?.isStreaming === true ? 'Working…' : null,
139
- lastAssistantText: lastAssistantText(messages),
140
- };
141
- }
142
-
143
- /** @param {ChatTranscript} transcript @param {unknown} event @returns {ChatTranscript} */
144
- export function reduceAgentEvent(transcript, event) {
145
- switch (event?.type) {
146
- case 'agent_start':
147
- return transcript.activity === 'Working…' ? transcript : { ...transcript, activity: 'Working…' };
148
-
149
- case 'agent_end':
150
- return {
151
- ...transcript,
152
- streamingIndex: null,
153
- activity: null,
154
- executingToolIds: transcript.executingToolIds.length ? [] : transcript.executingToolIds,
155
- };
156
-
157
- case 'message_start': {
158
- const messages = transcript.messages.concat(event.message);
159
- const streamingIndex = messageRole(event.message) === 'assistant' ? messages.length - 1 : transcript.streamingIndex;
160
- return {
161
- ...transcript,
162
- messages,
163
- streamingIndex,
164
- lastAssistantText: lastAssistantText(messages),
165
- };
166
- }
167
-
168
- case 'message_update': {
169
- let idx = transcript.streamingIndex;
170
- if (idx === null) {
171
- const last = transcript.messages.length - 1;
172
- if (last >= 0 && messageRole(transcript.messages[last]) === 'assistant') idx = last;
173
- }
174
- if (idx === null) return transcript;
175
- const messages = transcript.messages.slice();
176
- messages[idx] = event.message;
177
- return {
178
- ...transcript,
179
- messages,
180
- streamingIndex: idx,
181
- lastAssistantText: lastAssistantText(messages),
182
- };
183
- }
184
-
185
- case 'message_end': {
186
- let idx = transcript.streamingIndex;
187
- if (idx === null) {
188
- const last = transcript.messages.length - 1;
189
- if (last >= 0 && messageRole(transcript.messages[last]) === 'assistant') idx = last;
190
- }
191
- if (idx === null) return transcript;
192
- const messages = transcript.messages.slice();
193
- messages[idx] = event.message;
194
- return {
195
- ...transcript,
196
- messages,
197
- streamingIndex: null,
198
- lastAssistantText: lastAssistantText(messages),
199
- };
200
- }
201
-
202
- case 'tool_execution_start': {
203
- if (transcript.executingToolIds.includes(event.toolCallId)) return transcript;
204
- return { ...transcript, executingToolIds: transcript.executingToolIds.concat(event.toolCallId) };
205
- }
206
-
207
- case 'tool_execution_end': {
208
- if (!transcript.executingToolIds.includes(event.toolCallId)) return transcript;
209
- return {
210
- ...transcript,
211
- executingToolIds: transcript.executingToolIds.filter((id) => id !== event.toolCallId),
212
- };
213
- }
214
-
215
- case 'compaction_start':
216
- return transcript.activity === 'Compacting context…' ? transcript : { ...transcript, activity: 'Compacting context…' };
217
-
218
- case 'compaction_end':
219
- return { ...transcript, activity: transcript.activity === 'Working…' ? 'Working…' : null };
220
-
221
- case 'auto_retry_start': {
222
- const attempt = typeof event.attempt === 'number' ? event.attempt : 0;
223
- const maxAttempts = typeof event.maxAttempts === 'number' ? event.maxAttempts : 0;
224
- const delaySeconds = typeof event.delayMs === 'number' ? Math.ceil(event.delayMs / 1000) : 0;
225
- return {
226
- ...transcript,
227
- activity: `Retrying (${attempt}/${maxAttempts}) in ${delaySeconds}s…`,
228
- };
229
- }
230
-
231
- case 'auto_retry_end':
232
- return { ...transcript, activity: transcript.activity === 'Working…' ? 'Working…' : null };
233
-
234
- default:
235
- return transcript;
236
- }
237
- }
238
-
239
- /** @param {ChatTranscript} transcript @param {string} command @param {boolean|undefined} excludeFromContext @returns {ChatTranscript} */
240
- export function applyBashStart(transcript, command, excludeFromContext) {
241
- const message = {
242
- role: 'bashExecution',
243
- command,
244
- output: '',
245
- exitCode: undefined,
246
- cancelled: false,
247
- truncated: false,
248
- excludeFromContext,
249
- timestamp: Date.now(),
250
- };
251
- return { ...transcript, messages: transcript.messages.concat(message) };
252
- }
253
-
254
- /** @param {ChatTranscript} transcript @param {string} chunk @returns {ChatTranscript} */
255
- export function applyBashOutput(transcript, chunk) {
256
- for (let i = transcript.messages.length - 1; i >= 0; i--) {
257
- const message = transcript.messages[i];
258
- if (messageRole(message) !== 'bashExecution') continue;
259
- const messages = transcript.messages.slice();
260
- const current = isRecord(messages[i]) ? messages[i] : {};
261
- messages[i] = { ...current, output: `${asText(current.output)}${chunk}` };
262
- return { ...transcript, messages };
263
- }
264
- return transcript;
265
- }
266
-
267
- /** @param {ChatTranscript} transcript @param {{exitCode:number|undefined,cancelled:boolean,truncated:boolean,fullOutputPath?:string}} result @returns {ChatTranscript} */
268
- export function applyBashEnd(transcript, result) {
269
- for (let i = transcript.messages.length - 1; i >= 0; i--) {
270
- const message = transcript.messages[i];
271
- if (messageRole(message) !== 'bashExecution') continue;
272
- const messages = transcript.messages.slice();
273
- const current = isRecord(messages[i]) ? messages[i] : {};
274
- messages[i] = {
275
- ...current,
276
- exitCode: result.exitCode,
277
- cancelled: result.cancelled,
278
- truncated: result.truncated,
279
- fullOutputPath: result.fullOutputPath,
280
- };
281
- return { ...transcript, messages };
282
- }
283
- return transcript;
284
- }
285
-
286
- /** @param {unknown} state @returns {ChatSession} */
287
- export function normalizeSessionState(state) {
288
- const s = isRecord(state) ? state : {};
289
- return {
290
- sessionId: asMaybeText(s.sessionId),
291
- sessionFile: asMaybeText(s.sessionFile),
292
- model: asMaybeText(s.model),
293
- isStreaming: s.isStreaming === true,
294
- thinkingLevel: asText(s.thinkingLevel) || 'off',
295
- steeringMode: asText(s.steeringMode) || 'all',
296
- followUpMode: asText(s.followUpMode) || 'all',
297
- sessionName: asMaybeText(s.sessionName),
298
- autoCompactionEnabled: s.autoCompactionEnabled === true,
299
- pendingMessageCount: typeof s.pendingMessageCount === 'number' ? s.pendingMessageCount : 0,
300
- };
301
- }
302
-
303
- /** @param {ChatState} state @param {Partial<ChatSession>} patch @returns {ChatState} */
304
- export function patchSession(state, patch) {
305
- const base = state.session ?? normalizeSessionState(null);
306
- let changed = false;
307
- /** @type {ChatSession} */
308
- const nextSession = { ...base };
309
- for (const [key, value] of Object.entries(patch)) {
310
- if (value === undefined) continue;
311
- // @ts-ignore - key is constrained by ChatSession at call sites.
312
- nextSession[key] = value;
313
- changed = true;
314
- }
315
- return changed ? { ...state, session: nextSession } : state;
316
- }
317
-
318
- /** @param {ChatState} state @param {NoticeLevel} level @param {string} text @returns {ChatState} */
319
- export function addNotice(state, level, text) {
320
- return {
321
- ...state,
322
- notices: state.notices.concat({ id: uid(), level, text, at: Date.now() }),
323
- };
324
- }
325
-
326
- /** @param {unknown} reason @returns {string} */
327
- function closeReasonText(reason) {
328
- if (typeof reason === 'string') return reason;
329
- if (!isRecord(reason)) return '';
330
- if (typeof reason.reason === 'string') return reason.reason;
331
- if (typeof reason.message === 'string') return reason.message;
332
- if (typeof reason.kind === 'string') return reason.kind;
333
- return '';
334
- }
335
-
336
- /** @param {unknown} reason @returns {'no-broker'|'no-node'|'invalid'|'closed'} */
337
- export function classifyClose(reason) {
338
- const text = closeReasonText(reason).toLowerCase();
339
- if (text.includes('no running broker')) return 'no-broker';
340
- if (text.includes('does not exist') || text.includes('no node')) return 'no-node';
341
- if (text.includes('invalid') || text.includes('rejected')) return 'invalid';
342
- return 'closed';
343
- }
344
-
345
- /** @param {any} message @returns {number|undefined} */
346
- function assistantContextTokens(message) {
347
- if (!isRecord(message) || message.role !== 'assistant') return undefined;
348
- const usage = isRecord(message.usage) ? message.usage : null;
349
- if (!usage) return undefined;
350
- const input = typeof usage.input === 'number' ? usage.input : null;
351
- const cacheRead = typeof usage.cacheRead === 'number' ? usage.cacheRead : null;
352
- const cacheWrite = typeof usage.cacheWrite === 'number' ? usage.cacheWrite : null;
353
- if (input === null || cacheRead === null || cacheWrite === null) return undefined;
354
- return input + cacheRead + cacheWrite;
355
- }
356
-
357
- /** @param {ChatState} state @param {string} text @param {NoticeLevel} level @returns {ChatState} */
358
- function notice(state, text, level = 'info') {
359
- return addNotice(state, level, text);
360
- }
361
-
362
- /** @type {any} */
363
- const core = {
364
- manifest: {
365
- id: 'chat',
366
- title: 'Chat',
367
- description: 'Portable chat-as-a-view core',
368
- },
369
-
370
- /** @param {Readonly<Record<string, string>>} opts @returns {ChatState} */
371
- init(opts) {
372
- const target = typeof opts.target === 'string' && opts.target.trim() !== '' ? opts.target : null;
373
- return {
374
- target,
375
- desiredRole: opts.role === 'observer' ? 'observer' : 'controller',
376
- channel: null,
377
- conn: 'idle',
378
- role: 'observer',
379
- session: null,
380
- transcript: initialTranscript(),
381
- draft: '',
382
- notices: [],
383
- pendingDialog: null,
384
- queued: [],
385
- contextTokens: undefined,
386
- };
387
- },
388
-
389
- streams: {
390
- chat: {
391
- id: 'chat',
392
- request: ({ target, role }) => ({ kind: 'stream', target, role }),
393
- onOpen: 'streamOpen',
394
- onFrame: 'streamFrame',
395
- onClose: 'streamClose',
396
- },
397
- },
398
-
399
- intents: {
400
- /** @param {any} ctx */
401
- refresh(ctx) {
402
- const state = ctx.state;
403
- if (state.channel != null) return;
404
- if (state.target == null) {
405
- ctx.set((prev) => ({ ...prev, conn: 'error' }));
406
- ctx.set((prev) => notice(prev, 'missing target — run crtr view run chat --target <node-id>', 'action'));
407
- ctx.signal.setBanner('missing target — run crtr view run chat --target <node-id>', 'action');
408
- ctx.signal.setStatus(null);
409
- return;
410
- }
411
- ctx.signal.setStatus('connecting…');
412
- try {
413
- const channel = ctx.connect(core.streams.chat, { target: state.target, role: state.desiredRole });
414
- ctx.set((prev) => ({
415
- ...prev,
416
- channel,
417
- conn: 'connecting',
418
- }));
419
- } catch (err) {
420
- const message = err instanceof Error ? err.message : String(err);
421
- ctx.set((prev) => ({ ...prev, conn: 'error' }));
422
- ctx.set((prev) => notice(prev, `stream connect failed — ${message}`, 'error'));
423
- ctx.signal.setBanner(`stream connect failed — ${message}`, 'error');
424
- ctx.signal.setStatus(null);
425
- }
426
- },
427
-
428
- /** @param {any} ctx @param {any} channel */
429
- streamOpen(ctx, channel) {
430
- if (!isRecord(channel)) return;
431
- ctx.set((prev) => ({
432
- ...prev,
433
- channel: prev.channel ?? channel,
434
- conn: 'connecting',
435
- }));
436
- ctx.signal.setStatus('connected — waiting for welcome');
437
- },
438
-
439
- /** @param {any} ctx @param {unknown} payload */
440
- streamClose(ctx, payload) {
441
- // Fence: ignore stale closes from a channel that has already been replaced.
442
- // Both hosts now include channelId in the close payload; if it doesn't match
443
- // the current channel the close arrived from an old handle and must not
444
- // clear the replacement.
445
- const channelId = isRecord(payload) && typeof payload.channelId === 'string' ? payload.channelId : undefined;
446
- if (channelId !== undefined && ctx.state.channel != null && ctx.state.channel.id !== channelId) return;
447
- const kind = classifyClose(payload);
448
- if (kind === 'closed' && ctx.state.channel == null && ctx.state.conn === 'connecting') return;
449
- const banner =
450
- kind === 'no-broker'
451
- ? 'node is asleep / focus or revive it first'
452
- : kind === 'no-node'
453
- ? 'node not found / check the target'
454
- : kind === 'invalid'
455
- ? 'invalid target / check the target'
456
- : 'stream closed / reconnect';
457
- ctx.set((prev) => ({
458
- ...prev,
459
- channel: null,
460
- conn: kind,
461
- }));
462
- ctx.set((prev) => notice(prev, banner, 'action'));
463
- ctx.signal.setBanner(banner, 'action');
464
- ctx.signal.setStatus(null);
465
- },
466
-
467
- /** @param {any} ctx */
468
- reconnect(ctx) {
469
- const channel = ctx.state.channel;
470
- ctx.set((prev) => ({
471
- ...prev,
472
- channel: null,
473
- conn: 'connecting',
474
- }));
475
- if (channel && typeof channel.close === 'function') {
476
- try {
477
- channel.close();
478
- } catch {
479
- /* best-effort close */
480
- }
481
- }
482
- void ctx.dispatch('refresh');
483
- },
484
-
485
- /** @param {any} ctx @param {unknown} frame */
486
- streamFrame(ctx, frame) {
487
- if (!isRecord(frame)) return;
488
- switch (frame.type) {
489
- case 'welcome': {
490
- const snapshot = frame.snapshot;
491
- const transcript = applySnapshot(snapshot);
492
- const session = normalizeSessionState(snapshot?.state);
493
- const stats = snapshot?.stats;
494
- const contextTokens =
495
- typeof stats?.contextUsage?.tokens === 'number'
496
- ? stats.contextUsage.tokens
497
- : typeof stats?.tokens?.total === 'number'
498
- ? stats.tokens.total
499
- : undefined;
500
- ctx.set((prev) => ({
501
- ...prev,
502
- conn: 'open',
503
- role: frame.role ?? prev.desiredRole,
504
- session,
505
- transcript,
506
- pendingDialog: frame.pending_dialog ?? null,
507
- contextTokens,
508
- }));
509
- ctx.signal.clearBanner();
510
- ctx.signal.setStatus(null);
511
- ctx.signal.setSubtitle(session.sessionName ?? ctx.state.target);
512
- return;
513
- }
514
-
515
- case 'model_changed': {
516
- ctx.set((prev) => patchSession(prev, { model: asMaybeText(frame.model) }));
517
- return;
518
- }
519
-
520
- case 'error': {
521
- if (frame.code === 'read_only') {
522
- const text = 'read-only — sending is disabled';
523
- ctx.set((prev) => notice(prev, text, 'action'));
524
- ctx.signal.setBanner(text, 'action');
525
- return;
526
- }
527
- const text = frame.message || frame.code || 'stream error';
528
- ctx.set((prev) => notice(prev, text, 'error'));
529
- ctx.signal.setBanner(text, 'error');
530
- return;
531
- }
532
-
533
- case 'ack': {
534
- if (frame.ok) return;
535
- const text = frame.detail ? `${frame.for} failed — ${frame.detail}` : `${frame.for} failed`;
536
- ctx.set((prev) => notice(prev, text, 'error'));
537
- ctx.signal.setBanner(text, 'error');
538
- return;
539
- }
540
-
541
- // pi's uniform extension-UI envelope, discriminated by `method`: the
542
- // three display methods are chrome notices, everything else is a dialog
543
- // this read-mostly view cannot answer.
544
- case 'extension_ui_request': {
545
- if (frame.method === 'setStatus') {
546
- const text =
547
- frame.statusText === undefined ? `${frame.statusKey} cleared` : `${frame.statusKey}: ${frame.statusText}`;
548
- ctx.set((prev) => notice(prev, text, 'info'));
549
- return;
550
- }
551
- if (frame.method === 'setWidget') {
552
- const text =
553
- frame.widgetLines === undefined
554
- ? `${frame.widgetKey} cleared`
555
- : `${frame.widgetKey}: ${frame.widgetLines.join(' | ')}`;
556
- ctx.set((prev) => notice(prev, text, 'info'));
557
- return;
558
- }
559
- if (frame.method === 'setTitle') {
560
- ctx.set((prev) => notice(prev, `title: ${frame.title}`, 'info'));
561
- return;
562
- }
563
- const text = 'cannot answer dialogs yet';
564
- ctx.set((prev) => ({ ...prev, pendingDialog: frame }));
565
- ctx.set((prev) => notice(prev, text, 'action'));
566
- ctx.signal.setBanner(text, 'action');
567
- return;
568
- }
569
-
570
- case 'bash_start': {
571
- ctx.set((prev) => ({ ...prev, transcript: applyBashStart(prev.transcript, frame.command, frame.excludeFromContext) }));
572
- return;
573
- }
574
-
575
- case 'bash_output': {
576
- ctx.set((prev) => ({ ...prev, transcript: applyBashOutput(prev.transcript, frame.chunk) }));
577
- return;
578
- }
579
-
580
- case 'bash_end': {
581
- ctx.set((prev) => ({ ...prev, transcript: applyBashEnd(prev.transcript, frame) }));
582
- return;
583
- }
584
-
585
- default: {
586
- ctx.set((prev) => {
587
- const transcript = reduceAgentEvent(prev.transcript, frame);
588
- let next = { ...prev, transcript };
589
- if (frame.type === 'agent_start') {
590
- next = patchSession(next, { isStreaming: true });
591
- } else if (frame.type === 'agent_end') {
592
- next = patchSession(next, { isStreaming: false });
593
- } else if (frame.type === 'session_info_changed') {
594
- next = patchSession(next, { sessionName: asMaybeText(frame.name) });
595
- } else if (frame.type === 'thinking_level_changed') {
596
- next = patchSession(next, { thinkingLevel: asText(frame.level) || next.session?.thinkingLevel || 'off' });
597
- } else if (frame.type === 'queue_update') {
598
- const queued = [
599
- ...(Array.isArray(frame.steering) ? frame.steering : []),
600
- ...(Array.isArray(frame.followUp) ? frame.followUp : []),
601
- ].map((value) => String(value));
602
- next = {
603
- ...next,
604
- queued,
605
- };
606
- next = patchSession(next, { pendingMessageCount: queued.length });
607
- }
608
- const assistantTokens = frame.type === 'message_end' ? assistantContextTokens(frame.message) : undefined;
609
- if (assistantTokens !== undefined) {
610
- next = { ...next, contextTokens: assistantTokens };
611
- }
612
- return next;
613
- });
614
- }
615
- }
616
- },
617
-
618
- /** @param {any} ctx @param {string} draft */
619
- setDraft(ctx, draft) {
620
- ctx.set((prev) => ({ ...prev, draft }));
621
- },
622
-
623
- /** @param {any} ctx */
624
- submitDraft(ctx) {
625
- const text = ctx.state.draft.trim();
626
- if (!text) return;
627
- const channel = ctx.state.channel;
628
- if (!channel || ctx.state.conn !== 'open') {
629
- const noticeText = 'not connected — reconnect';
630
- ctx.set((prev) => notice(prev, noticeText, 'error'));
631
- ctx.signal.setBanner(noticeText, 'error');
632
- return;
633
- }
634
- if (ctx.state.role !== 'controller') {
635
- const text = 'read-only — sending is disabled';
636
- ctx.set((prev) => notice(prev, text, 'action'));
637
- ctx.signal.setBanner(text, 'action');
638
- return;
639
- }
640
- const frame = ctx.state.session?.isStreaming === true ? { type: 'steer', text } : { type: 'prompt', text };
641
- channel.send(frame);
642
- ctx.set((prev) => ({ ...prev, draft: '' }));
643
- },
644
-
645
- /** @param {any} ctx */
646
- abort(ctx) {
647
- if (ctx.state.role !== 'controller') {
648
- const text = 'read-only — sending is disabled';
649
- ctx.set((prev) => notice(prev, text, 'action'));
650
- ctx.signal.setBanner(text, 'action');
651
- return;
652
- }
653
- if (!ctx.state.channel || ctx.state.conn !== 'open') {
654
- const text = 'not connected — reconnect';
655
- ctx.set((prev) => notice(prev, text, 'error'));
656
- ctx.signal.setBanner(text, 'error');
657
- return;
658
- }
659
- ctx.state.channel.send({ type: 'abort' });
660
- },
661
-
662
- /** @param {any} ctx @param {string|undefined} id */
663
- clearNotice(ctx, id) {
664
- ctx.set((prev) => {
665
- if (id === undefined || id === null || id === '') return { ...prev, notices: [] };
666
- return { ...prev, notices: prev.notices.filter((notice) => notice.id !== id) };
667
- });
668
- },
669
-
670
- /** @param {any} ctx */
671
- quit(ctx) {
672
- if (ctx.state.channel) {
673
- try {
674
- ctx.state.channel.close();
675
- } catch {
676
- /* best-effort */
677
- }
678
- }
679
- ctx.signal.quit();
680
- },
681
- },
682
- };
683
-
684
- export default core;