@north-light/api 0.3.580 → 0.3.587

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 (1671) hide show
  1. package/dist/api/client.d.ts +9 -2
  2. package/dist/api/client.js +22 -0
  3. package/dist/api/contract.d.ts +1 -1
  4. package/dist/api/contract.js +1 -1
  5. package/dist/api/dto/bash-jobs.d.ts +17 -0
  6. package/dist/api/dto/bash-jobs.js +2 -0
  7. package/dist/api/dto/execution-start.d.ts +14 -0
  8. package/dist/api/dto/health.d.ts +22 -0
  9. package/dist/api/dto/imports.d.ts +142 -0
  10. package/dist/api/dto/imports.js +2 -0
  11. package/dist/api/error-codes.d.ts +5 -0
  12. package/dist/api/error-codes.js +2 -0
  13. package/dist/api/errors.js +2 -1
  14. package/dist/api/index.d.ts +1 -0
  15. package/dist/api/index.js +1 -0
  16. package/dist/api/routes.d.ts +3 -0
  17. package/dist/api/routes.js +3 -0
  18. package/dist/build-root.d.ts +66 -0
  19. package/dist/build-root.js +401 -0
  20. package/dist/clients/attach/ansi-cells.d.ts +44 -0
  21. package/dist/clients/attach/ansi-cells.js +137 -0
  22. package/dist/clients/attach/chrome/bash-jobs.d.ts +16 -0
  23. package/dist/clients/attach/chrome/bash-jobs.js +34 -0
  24. package/dist/clients/attach/chrome/canvas-panels.d.ts +43 -0
  25. package/dist/clients/attach/chrome/canvas-panels.js +227 -0
  26. package/dist/clients/attach/chrome/completion-bell.d.ts +10 -0
  27. package/dist/clients/attach/chrome/completion-bell.js +89 -0
  28. package/dist/clients/attach/chrome/cron-wait.d.ts +3 -0
  29. package/dist/clients/attach/chrome/cron-wait.js +34 -0
  30. package/dist/clients/attach/chrome/git-info.d.ts +20 -0
  31. package/dist/clients/attach/chrome/git-info.js +44 -0
  32. package/dist/clients/attach/chrome/header.d.ts +10 -0
  33. package/dist/clients/attach/chrome/header.js +30 -0
  34. package/dist/clients/attach/chrome/inbox-strip.d.ts +36 -0
  35. package/dist/clients/attach/chrome/inbox-strip.js +219 -0
  36. package/dist/clients/attach/chrome/key-hint.d.ts +9 -0
  37. package/dist/clients/attach/chrome/key-hint.js +16 -0
  38. package/dist/clients/attach/chrome/object-wait.d.ts +4 -0
  39. package/dist/clients/attach/chrome/object-wait.js +24 -0
  40. package/dist/clients/attach/chrome/recap.d.ts +7 -0
  41. package/dist/clients/attach/chrome/recap.js +19 -0
  42. package/dist/clients/attach/chrome/review-wait.d.ts +6 -0
  43. package/dist/clients/attach/chrome/review-wait.js +22 -0
  44. package/dist/clients/attach/chrome/roster.d.ts +39 -0
  45. package/dist/clients/attach/chrome/roster.js +294 -0
  46. package/dist/clients/attach/chrome/status-line.d.ts +38 -0
  47. package/dist/clients/attach/chrome/status-line.js +127 -0
  48. package/dist/clients/attach/chrome/ticket-panel.d.ts +29 -0
  49. package/dist/clients/attach/chrome/ticket-panel.js +280 -0
  50. package/dist/clients/attach/chrome/widgets.d.ts +9 -0
  51. package/dist/clients/attach/chrome/widgets.js +51 -0
  52. package/dist/clients/attach/command.d.ts +3 -0
  53. package/dist/clients/attach/command.js +107 -0
  54. package/dist/clients/attach/config.d.ts +95 -0
  55. package/dist/clients/attach/config.js +275 -0
  56. package/dist/clients/attach/input/capabilities.d.ts +30 -0
  57. package/dist/clients/attach/input/capabilities.js +112 -0
  58. package/dist/clients/attach/input/clipboard-image.d.ts +55 -0
  59. package/dist/clients/attach/input/clipboard-image.js +237 -0
  60. package/dist/clients/attach/input/completion-frecency.d.ts +45 -0
  61. package/dist/clients/attach/input/completion-frecency.js +141 -0
  62. package/dist/clients/attach/input/controller.d.ts +92 -0
  63. package/dist/clients/attach/input/controller.js +383 -0
  64. package/dist/clients/attach/input/overlay-owner.d.ts +41 -0
  65. package/dist/clients/attach/input/overlay-owner.js +199 -0
  66. package/dist/clients/attach/input/ref-autocomplete.d.ts +77 -0
  67. package/dist/clients/attach/input/ref-autocomplete.js +176 -0
  68. package/dist/clients/attach/input/titled-editor.d.ts +225 -0
  69. package/dist/clients/attach/input/titled-editor.js +859 -0
  70. package/dist/clients/attach/overlays/auth.d.ts +13 -0
  71. package/dist/clients/attach/overlays/auth.js +247 -0
  72. package/dist/clients/attach/overlays/dialogs.d.ts +27 -0
  73. package/dist/clients/attach/overlays/dialogs.js +102 -0
  74. package/dist/clients/attach/overlays/file-review.d.ts +10 -0
  75. package/dist/clients/attach/overlays/file-review.js +146 -0
  76. package/dist/clients/attach/overlays/graph.d.ts +83 -0
  77. package/dist/clients/attach/overlays/graph.js +725 -0
  78. package/dist/clients/attach/overlays/help.d.ts +33 -0
  79. package/dist/clients/attach/overlays/help.js +214 -0
  80. package/dist/clients/attach/overlays/mcp.d.ts +32 -0
  81. package/dist/clients/attach/overlays/mcp.js +302 -0
  82. package/dist/clients/attach/overlays/pickers.d.ts +56 -0
  83. package/dist/clients/attach/overlays/pickers.js +163 -0
  84. package/dist/clients/attach/render/activity-slot.d.ts +4 -0
  85. package/dist/clients/attach/render/activity-slot.js +13 -0
  86. package/dist/clients/attach/render/assistant-message.d.ts +13 -0
  87. package/dist/clients/attach/render/assistant-message.js +56 -0
  88. package/dist/clients/attach/render/card-presentation.d.ts +36 -0
  89. package/dist/clients/attach/render/card-presentation.js +222 -0
  90. package/dist/clients/attach/render/chat-view.d.ts +409 -0
  91. package/dist/clients/attach/render/chat-view.js +2108 -0
  92. package/dist/clients/attach/render/condensed-history.d.ts +21 -0
  93. package/dist/clients/attach/render/condensed-history.js +60 -0
  94. package/dist/clients/attach/render/context-message.d.ts +22 -0
  95. package/dist/clients/attach/render/context-message.js +63 -0
  96. package/dist/clients/attach/render/crtr-output.d.ts +52 -0
  97. package/dist/clients/attach/render/crtr-output.js +721 -0
  98. package/dist/clients/attach/render/diagram.d.ts +4 -0
  99. package/dist/clients/attach/render/diagram.js +111 -0
  100. package/dist/clients/attach/render/doc-links.d.ts +36 -0
  101. package/dist/clients/attach/render/doc-links.js +78 -0
  102. package/dist/clients/attach/render/edit-diff.d.ts +12 -0
  103. package/dist/clients/attach/render/edit-diff.js +304 -0
  104. package/dist/clients/attach/render/glyph-codepoints.d.ts +3 -0
  105. package/dist/clients/attach/render/glyph-codepoints.js +42 -0
  106. package/dist/clients/attach/render/group-activity.d.ts +84 -0
  107. package/dist/clients/attach/render/group-activity.js +276 -0
  108. package/dist/clients/attach/render/group-recap.d.ts +13 -0
  109. package/dist/clients/attach/render/group-recap.js +146 -0
  110. package/dist/clients/attach/render/markdown-source.d.ts +21 -0
  111. package/dist/clients/attach/render/markdown-source.js +279 -0
  112. package/dist/clients/attach/render/measured-container.d.ts +96 -0
  113. package/dist/clients/attach/render/measured-container.js +322 -0
  114. package/dist/clients/attach/render/page-block.d.ts +39 -0
  115. package/dist/clients/attach/render/page-block.js +187 -0
  116. package/dist/clients/attach/render/scroll-animation.d.ts +8 -0
  117. package/dist/clients/attach/render/scroll-animation.js +80 -0
  118. package/dist/clients/attach/render/tool-calls.d.ts +53 -0
  119. package/dist/clients/attach/render/tool-calls.js +350 -0
  120. package/dist/clients/attach/render/transcript-copy.d.ts +9 -0
  121. package/dist/clients/attach/render/transcript-copy.js +81 -0
  122. package/dist/clients/attach/render/transcript-search.d.ts +28 -0
  123. package/dist/clients/attach/render/transcript-search.js +152 -0
  124. package/dist/clients/attach/render/viewport.d.ts +38 -0
  125. package/dist/clients/attach/render/viewport.js +184 -0
  126. package/dist/clients/attach/session/banner.d.ts +13 -0
  127. package/dist/clients/attach/session/banner.js +33 -0
  128. package/dist/clients/attach/session/bindings.d.ts +20 -0
  129. package/dist/clients/attach/session/bindings.js +71 -0
  130. package/dist/clients/attach/session/chrome-refresh.d.ts +49 -0
  131. package/dist/clients/attach/session/chrome-refresh.js +154 -0
  132. package/dist/clients/attach/session/connection.d.ts +54 -0
  133. package/dist/clients/attach/session/connection.js +204 -0
  134. package/dist/clients/attach/session/context.d.ts +59 -0
  135. package/dist/clients/attach/session/context.js +16 -0
  136. package/dist/clients/attach/session/document-links.d.ts +12 -0
  137. package/dist/clients/attach/session/document-links.js +43 -0
  138. package/dist/clients/attach/session/editor-frame.d.ts +47 -0
  139. package/dist/clients/attach/session/editor-frame.js +142 -0
  140. package/dist/clients/attach/session/editor-inventory.d.ts +63 -0
  141. package/dist/clients/attach/session/editor-inventory.js +156 -0
  142. package/dist/clients/attach/session/file-links.d.ts +22 -0
  143. package/dist/clients/attach/session/file-links.js +73 -0
  144. package/dist/clients/attach/session/focus-events.d.ts +4 -0
  145. package/dist/clients/attach/session/focus-events.js +12 -0
  146. package/dist/clients/attach/session/frame.d.ts +46 -0
  147. package/dist/clients/attach/session/frame.js +214 -0
  148. package/dist/clients/attach/session/frames.d.ts +51 -0
  149. package/dist/clients/attach/session/frames.js +203 -0
  150. package/dist/clients/attach/session/identity.d.ts +16 -0
  151. package/dist/clients/attach/session/identity.js +26 -0
  152. package/dist/clients/attach/session/input-wiring.d.ts +53 -0
  153. package/dist/clients/attach/session/input-wiring.js +146 -0
  154. package/dist/clients/attach/session/invariant.d.ts +9 -0
  155. package/dist/clients/attach/session/invariant.js +15 -0
  156. package/dist/clients/attach/session/keys.d.ts +46 -0
  157. package/dist/clients/attach/session/keys.js +77 -0
  158. package/dist/clients/attach/session/layout.d.ts +22 -0
  159. package/dist/clients/attach/session/layout.js +59 -0
  160. package/dist/clients/attach/session/mouse.d.ts +27 -0
  161. package/dist/clients/attach/session/mouse.js +78 -0
  162. package/dist/clients/attach/session/pane-focus.d.ts +8 -0
  163. package/dist/clients/attach/session/pane-focus.js +42 -0
  164. package/dist/clients/attach/session/pane-tag.d.ts +44 -0
  165. package/dist/clients/attach/session/pane-tag.js +112 -0
  166. package/dist/clients/attach/session/pi-assets.d.ts +1 -0
  167. package/dist/clients/attach/session/pi-assets.js +24 -0
  168. package/dist/clients/attach/session/pi-oauth-flows.d.ts +1 -0
  169. package/dist/clients/attach/session/pi-oauth-flows.js +21 -0
  170. package/dist/clients/attach/session/profile-files.d.ts +17 -0
  171. package/dist/clients/attach/session/profile-files.js +207 -0
  172. package/dist/clients/attach/session/readonly-popup.d.ts +15 -0
  173. package/dist/clients/attach/session/readonly-popup.js +25 -0
  174. package/dist/clients/attach/session/reconnect.d.ts +46 -0
  175. package/dist/clients/attach/session/reconnect.js +195 -0
  176. package/dist/clients/attach/session/selection.d.ts +28 -0
  177. package/dist/clients/attach/session/selection.js +108 -0
  178. package/dist/clients/attach/session/state-sync.d.ts +38 -0
  179. package/dist/clients/attach/session/state-sync.js +67 -0
  180. package/dist/clients/attach/session/surface-frame.d.ts +20 -0
  181. package/dist/clients/attach/session/surface-frame.js +73 -0
  182. package/dist/clients/attach/session/surface-host.d.ts +65 -0
  183. package/dist/clients/attach/session/surface-host.js +256 -0
  184. package/dist/clients/attach/session/teardown.d.ts +30 -0
  185. package/dist/clients/attach/session/teardown.js +94 -0
  186. package/dist/clients/attach/session/transcript-search.d.ts +20 -0
  187. package/dist/clients/attach/session/transcript-search.js +151 -0
  188. package/dist/clients/attach/session/whip-achievements.d.ts +4 -0
  189. package/dist/clients/attach/session/whip-achievements.js +145 -0
  190. package/dist/clients/attach/session/whip.d.ts +20 -0
  191. package/dist/clients/attach/session/whip.js +362 -0
  192. package/dist/clients/attach/slash/dispatch.d.ts +120 -0
  193. package/dist/clients/attach/slash/dispatch.js +748 -0
  194. package/dist/clients/attach/slash/prompt-preview.d.ts +30 -0
  195. package/dist/clients/attach/slash/prompt-preview.js +121 -0
  196. package/dist/clients/attach/viewer.d.ts +8 -0
  197. package/dist/clients/attach/viewer.js +873 -0
  198. package/dist/clients/conversation/projection.d.ts +79 -0
  199. package/dist/clients/conversation/projection.js +324 -0
  200. package/dist/clients/conversation/submit.d.ts +38 -0
  201. package/dist/clients/conversation/submit.js +51 -0
  202. package/dist/clients/dashboard/app.d.ts +7 -0
  203. package/dist/clients/dashboard/app.js +438 -0
  204. package/dist/clients/dashboard/model.d.ts +39 -0
  205. package/dist/clients/dashboard/model.js +77 -0
  206. package/dist/clients/dashboard/render.d.ts +29 -0
  207. package/dist/clients/dashboard/render.js +148 -0
  208. package/dist/clients/inbox/controller.d.ts +174 -0
  209. package/dist/clients/inbox/controller.js +816 -0
  210. package/dist/clients/inbox/dto-adapt.d.ts +28 -0
  211. package/dist/clients/inbox/dto-adapt.js +93 -0
  212. package/dist/clients/inbox/layout.d.ts +8 -0
  213. package/dist/clients/inbox/layout.js +9 -0
  214. package/dist/clients/inbox/page-adapter.d.ts +33 -0
  215. package/dist/clients/inbox/page-adapter.js +55 -0
  216. package/dist/clients/inbox/resolve.d.ts +16 -0
  217. package/dist/clients/inbox/resolve.js +35 -0
  218. package/dist/clients/inbox/review/anchors.d.ts +41 -0
  219. package/dist/clients/inbox/review/anchors.js +89 -0
  220. package/dist/clients/inbox/review/comments-client.d.ts +74 -0
  221. package/dist/clients/inbox/review/comments-client.js +103 -0
  222. package/dist/clients/inbox/review/companion-pane.d.ts +47 -0
  223. package/dist/clients/inbox/review/companion-pane.js +109 -0
  224. package/dist/clients/inbox/review/document-surface.d.ts +212 -0
  225. package/dist/clients/inbox/review/document-surface.js +1268 -0
  226. package/dist/clients/inbox/review/frame.d.ts +57 -0
  227. package/dist/clients/inbox/review/frame.js +309 -0
  228. package/dist/clients/inbox/review/keys.d.ts +69 -0
  229. package/dist/clients/inbox/review/keys.js +133 -0
  230. package/dist/clients/inbox/review/launch.d.ts +16 -0
  231. package/dist/clients/inbox/review/launch.js +170 -0
  232. package/dist/clients/inbox/review/live-source.d.ts +24 -0
  233. package/dist/clients/inbox/review/live-source.js +160 -0
  234. package/dist/clients/inbox/review/nvim.d.ts +15 -0
  235. package/dist/clients/inbox/review/nvim.js +43 -0
  236. package/dist/clients/inbox/review/remap.d.ts +51 -0
  237. package/dist/clients/inbox/review/remap.js +157 -0
  238. package/dist/clients/inbox/review/review-client.d.ts +43 -0
  239. package/dist/clients/inbox/review/review-client.js +123 -0
  240. package/dist/clients/inbox/review/roundtrip.d.ts +5 -0
  241. package/dist/clients/inbox/review/roundtrip.js +41 -0
  242. package/dist/clients/inbox/review/state.d.ts +153 -0
  243. package/dist/clients/inbox/review/state.js +315 -0
  244. package/dist/clients/inbox/review-adapter.d.ts +17 -0
  245. package/dist/clients/inbox/review-adapter.js +43 -0
  246. package/dist/clients/inbox/surface.d.ts +25 -0
  247. package/dist/clients/inbox/surface.js +190 -0
  248. package/dist/clients/inbox/tui/ansi.d.ts +68 -0
  249. package/dist/clients/inbox/tui/ansi.js +321 -0
  250. package/dist/clients/inbox/tui/input.d.ts +5 -0
  251. package/dist/clients/inbox/tui/input.js +392 -0
  252. package/dist/clients/inbox/tui/keys.d.ts +28 -0
  253. package/dist/clients/inbox/tui/keys.js +104 -0
  254. package/dist/clients/inbox/tui/page-body.d.ts +10 -0
  255. package/dist/clients/inbox/tui/page-body.js +69 -0
  256. package/dist/clients/inbox/tui/panel.d.ts +4 -0
  257. package/dist/clients/inbox/tui/panel.js +84 -0
  258. package/dist/clients/inbox/tui/render.d.ts +23 -0
  259. package/dist/clients/inbox/tui/render.js +378 -0
  260. package/dist/clients/inbox/tui/slots.d.ts +33 -0
  261. package/dist/clients/inbox/tui/slots.js +134 -0
  262. package/dist/clients/inbox/tui/types.d.ts +73 -0
  263. package/dist/clients/inbox/tui/types.js +1 -0
  264. package/dist/clients/inbox/tui.d.ts +17 -0
  265. package/dist/clients/inbox/tui.js +92 -0
  266. package/dist/clients/surfaces/host.d.ts +74 -0
  267. package/dist/clients/surfaces/host.js +1 -0
  268. package/dist/commands/api-client.d.ts +113 -0
  269. package/dist/commands/api-client.js +427 -0
  270. package/dist/commands/attention.d.ts +2 -0
  271. package/dist/commands/attention.js +215 -0
  272. package/dist/commands/canvas/edges.d.ts +2 -0
  273. package/dist/commands/canvas/edges.js +41 -0
  274. package/dist/commands/canvas/list.d.ts +4 -0
  275. package/dist/commands/canvas/list.js +79 -0
  276. package/dist/commands/canvas/read.d.ts +14 -0
  277. package/dist/commands/canvas/read.js +95 -0
  278. package/dist/commands/canvas/search.d.ts +2 -0
  279. package/dist/commands/canvas/search.js +49 -0
  280. package/dist/commands/canvas/share.d.ts +2 -0
  281. package/dist/commands/canvas/share.js +80 -0
  282. package/dist/commands/canvas/unwatch.d.ts +2 -0
  283. package/dist/commands/canvas/unwatch.js +42 -0
  284. package/dist/commands/canvas/watch.d.ts +3 -0
  285. package/dist/commands/canvas/watch.js +63 -0
  286. package/dist/commands/canvas-analytics/chart.d.ts +52 -0
  287. package/dist/commands/canvas-analytics/chart.js +124 -0
  288. package/dist/commands/canvas-analytics/drilldown.d.ts +34 -0
  289. package/dist/commands/canvas-analytics/drilldown.js +96 -0
  290. package/dist/commands/canvas-analytics/format.d.ts +29 -0
  291. package/dist/commands/canvas-analytics/format.js +106 -0
  292. package/dist/commands/canvas-analytics/graph-detail.d.ts +2 -0
  293. package/dist/commands/canvas-analytics/graph-detail.js +307 -0
  294. package/dist/commands/canvas-analytics/graphs.d.ts +9 -0
  295. package/dist/commands/canvas-analytics/graphs.js +365 -0
  296. package/dist/commands/canvas-analytics/memory.d.ts +2 -0
  297. package/dist/commands/canvas-analytics/memory.js +211 -0
  298. package/dist/commands/canvas-analytics/overview.d.ts +2 -0
  299. package/dist/commands/canvas-analytics/overview.js +189 -0
  300. package/dist/commands/canvas-analytics/shell.d.ts +60 -0
  301. package/dist/commands/canvas-analytics/shell.js +416 -0
  302. package/dist/commands/canvas-analytics/time.d.ts +2 -0
  303. package/dist/commands/canvas-analytics/time.js +228 -0
  304. package/dist/commands/canvas-analytics/usage.d.ts +2 -0
  305. package/dist/commands/canvas-analytics/usage.js +305 -0
  306. package/dist/commands/canvas-analytics/view.d.ts +85 -0
  307. package/dist/commands/canvas-analytics/view.js +102 -0
  308. package/dist/commands/canvas-analytics.d.ts +2 -0
  309. package/dist/commands/canvas-analytics.js +28 -0
  310. package/dist/commands/canvas-browse.d.ts +2 -0
  311. package/dist/commands/canvas-browse.js +71 -0
  312. package/dist/commands/canvas-config.d.ts +2 -0
  313. package/dist/commands/canvas-config.js +192 -0
  314. package/dist/commands/canvas-history/grep.d.ts +1 -0
  315. package/dist/commands/canvas-history/grep.js +85 -0
  316. package/dist/commands/canvas-history/read.d.ts +1 -0
  317. package/dist/commands/canvas-history/read.js +48 -0
  318. package/dist/commands/canvas-history/search.d.ts +1 -0
  319. package/dist/commands/canvas-history/search.js +99 -0
  320. package/dist/commands/canvas-history/shared.d.ts +34 -0
  321. package/dist/commands/canvas-history/shared.js +135 -0
  322. package/dist/commands/canvas-history/stats.d.ts +1 -0
  323. package/dist/commands/canvas-history/stats.js +68 -0
  324. package/dist/commands/canvas-history.d.ts +2 -0
  325. package/dist/commands/canvas-history.js +29 -0
  326. package/dist/commands/canvas-issue.d.ts +2 -0
  327. package/dist/commands/canvas-issue.js +148 -0
  328. package/dist/commands/canvas-prune.d.ts +2 -0
  329. package/dist/commands/canvas-prune.js +111 -0
  330. package/dist/commands/canvas-roster.d.ts +2 -0
  331. package/dist/commands/canvas-roster.js +69 -0
  332. package/dist/commands/canvas-snapshot.d.ts +2 -0
  333. package/dist/commands/canvas-snapshot.js +34 -0
  334. package/dist/commands/canvas-use.d.ts +1 -0
  335. package/dist/commands/canvas-use.js +61 -0
  336. package/dist/commands/canvas.d.ts +3 -0
  337. package/dist/commands/canvas.js +57 -0
  338. package/dist/commands/chord.d.ts +2 -0
  339. package/dist/commands/chord.js +241 -0
  340. package/dist/commands/cron.d.ts +2 -0
  341. package/dist/commands/cron.js +541 -0
  342. package/dist/commands/custom-object/ack.d.ts +2 -0
  343. package/dist/commands/custom-object/ack.js +30 -0
  344. package/dist/commands/custom-object/publish.d.ts +2 -0
  345. package/dist/commands/custom-object/publish.js +39 -0
  346. package/dist/commands/custom-object/receive.d.ts +2 -0
  347. package/dist/commands/custom-object/receive.js +69 -0
  348. package/dist/commands/custom-object/register.d.ts +2 -0
  349. package/dist/commands/custom-object/register.js +69 -0
  350. package/dist/commands/custom-object/shared.d.ts +5 -0
  351. package/dist/commands/custom-object/shared.js +14 -0
  352. package/dist/commands/custom-object/unregister.d.ts +2 -0
  353. package/dist/commands/custom-object/unregister.js +26 -0
  354. package/dist/commands/custom-object.d.ts +2 -0
  355. package/dist/commands/custom-object.js +21 -0
  356. package/dist/commands/dashboard.d.ts +2 -0
  357. package/dist/commands/dashboard.js +86 -0
  358. package/dist/commands/doc/delete.d.ts +2 -0
  359. package/dist/commands/doc/delete.js +30 -0
  360. package/dist/commands/doc/edit.d.ts +2 -0
  361. package/dist/commands/doc/edit.js +82 -0
  362. package/dist/commands/doc/history.d.ts +2 -0
  363. package/dist/commands/doc/history.js +38 -0
  364. package/dist/commands/doc/lint.d.ts +2 -0
  365. package/dist/commands/doc/lint.js +36 -0
  366. package/dist/commands/doc/list.d.ts +2 -0
  367. package/dist/commands/doc/list.js +19 -0
  368. package/dist/commands/doc/move.d.ts +2 -0
  369. package/dist/commands/doc/move.js +37 -0
  370. package/dist/commands/doc/read.d.ts +2 -0
  371. package/dist/commands/doc/read.js +19 -0
  372. package/dist/commands/doc/replace-blocks.d.ts +6 -0
  373. package/dist/commands/doc/replace-blocks.js +40 -0
  374. package/dist/commands/doc/shared.d.ts +25 -0
  375. package/dist/commands/doc/shared.js +160 -0
  376. package/dist/commands/doc/write.d.ts +2 -0
  377. package/dist/commands/doc/write.js +52 -0
  378. package/dist/commands/doc.d.ts +2 -0
  379. package/dist/commands/doc.js +27 -0
  380. package/dist/commands/human/components.d.ts +4 -0
  381. package/dist/commands/human/components.js +78 -0
  382. package/dist/commands/human/feedback.d.ts +2 -0
  383. package/dist/commands/human/feedback.js +112 -0
  384. package/dist/commands/human/prompts.d.ts +21 -0
  385. package/dist/commands/human/prompts.js +326 -0
  386. package/dist/commands/human/queue.d.ts +3 -0
  387. package/dist/commands/human/queue.js +191 -0
  388. package/dist/commands/human/request.d.ts +2 -0
  389. package/dist/commands/human/request.js +266 -0
  390. package/dist/commands/human/review.d.ts +2 -0
  391. package/dist/commands/human/review.js +288 -0
  392. package/dist/commands/human/shared.d.ts +16 -0
  393. package/dist/commands/human/shared.js +67 -0
  394. package/dist/commands/human.d.ts +2 -0
  395. package/dist/commands/human.js +63 -0
  396. package/dist/commands/node/bash.d.ts +1 -0
  397. package/dist/commands/node/bash.js +390 -0
  398. package/dist/commands/node/create.d.ts +6 -0
  399. package/dist/commands/node/create.js +363 -0
  400. package/dist/commands/node/inspect.d.ts +2 -0
  401. package/dist/commands/node/inspect.js +288 -0
  402. package/dist/commands/node/lifecycle.d.ts +4 -0
  403. package/dist/commands/node/lifecycle.js +577 -0
  404. package/dist/commands/node/message.d.ts +1 -0
  405. package/dist/commands/node/message.js +170 -0
  406. package/dist/commands/node/outcome.d.ts +2 -0
  407. package/dist/commands/node/outcome.js +133 -0
  408. package/dist/commands/node/pyramid.d.ts +2 -0
  409. package/dist/commands/node/pyramid.js +79 -0
  410. package/dist/commands/node/subscription.d.ts +1 -0
  411. package/dist/commands/node/subscription.js +78 -0
  412. package/dist/commands/node/wait.d.ts +1 -0
  413. package/dist/commands/node/wait.js +165 -0
  414. package/dist/commands/node-context.d.ts +2 -0
  415. package/dist/commands/node-context.js +145 -0
  416. package/dist/commands/node-lifecycle-revive.d.ts +12 -0
  417. package/dist/commands/node-lifecycle-revive.js +217 -0
  418. package/dist/commands/node-snapshot.d.ts +2 -0
  419. package/dist/commands/node-snapshot.js +37 -0
  420. package/dist/commands/node-transcript.d.ts +2 -0
  421. package/dist/commands/node-transcript.js +59 -0
  422. package/dist/commands/node-worktree.d.ts +2 -0
  423. package/dist/commands/node-worktree.js +138 -0
  424. package/dist/commands/node.d.ts +2 -0
  425. package/dist/commands/node.js +29 -0
  426. package/dist/commands/person-settings.d.ts +1 -0
  427. package/dist/commands/person-settings.js +23 -0
  428. package/dist/commands/pkg/browse/actions.d.ts +7 -0
  429. package/dist/commands/pkg/browse/actions.js +198 -0
  430. package/dist/commands/pkg/browse/catalog.d.ts +9 -0
  431. package/dist/commands/pkg/browse/catalog.js +461 -0
  432. package/dist/commands/pkg/browse/command-view.d.ts +3 -0
  433. package/dist/commands/pkg/browse/command-view.js +217 -0
  434. package/dist/commands/pkg/browse/detail-panel.d.ts +66 -0
  435. package/dist/commands/pkg/browse/detail-panel.js +402 -0
  436. package/dist/commands/pkg/browse/doc-view.d.ts +3 -0
  437. package/dist/commands/pkg/browse/doc-view.js +84 -0
  438. package/dist/commands/pkg/browse/list-panel.d.ts +28 -0
  439. package/dist/commands/pkg/browse/list-panel.js +168 -0
  440. package/dist/commands/pkg/browse/model.d.ts +223 -0
  441. package/dist/commands/pkg/browse/model.js +36 -0
  442. package/dist/commands/pkg/browse/shell.d.ts +93 -0
  443. package/dist/commands/pkg/browse/shell.js +640 -0
  444. package/dist/commands/pkg/browse.d.ts +2 -0
  445. package/dist/commands/pkg/browse.js +27 -0
  446. package/dist/commands/pkg/market-inspect.d.ts +2 -0
  447. package/dist/commands/pkg/market-inspect.js +141 -0
  448. package/dist/commands/pkg/market-manage.d.ts +16 -0
  449. package/dist/commands/pkg/market-manage.js +327 -0
  450. package/dist/commands/pkg/market.d.ts +1 -0
  451. package/dist/commands/pkg/market.js +14 -0
  452. package/dist/commands/pkg/plugin-env.d.ts +3 -0
  453. package/dist/commands/pkg/plugin-env.js +65 -0
  454. package/dist/commands/pkg/plugin-inspect.d.ts +2 -0
  455. package/dist/commands/pkg/plugin-inspect.js +168 -0
  456. package/dist/commands/pkg/plugin-manage.d.ts +98 -0
  457. package/dist/commands/pkg/plugin-manage.js +1024 -0
  458. package/dist/commands/pkg/plugin.d.ts +1 -0
  459. package/dist/commands/pkg/plugin.js +14 -0
  460. package/dist/commands/pkg/shared.d.ts +13 -0
  461. package/dist/commands/pkg/shared.js +62 -0
  462. package/dist/commands/pkg.d.ts +2 -0
  463. package/dist/commands/pkg.js +21 -0
  464. package/dist/commands/profile/daemon-profiles.d.ts +13 -0
  465. package/dist/commands/profile/daemon-profiles.js +38 -0
  466. package/dist/commands/profile/default.d.ts +2 -0
  467. package/dist/commands/profile/default.js +183 -0
  468. package/dist/commands/profile/delete.d.ts +1 -0
  469. package/dist/commands/profile/delete.js +66 -0
  470. package/dist/commands/profile/env.d.ts +8 -0
  471. package/dist/commands/profile/env.js +188 -0
  472. package/dist/commands/profile/kind.d.ts +1 -0
  473. package/dist/commands/profile/kind.js +27 -0
  474. package/dist/commands/profile/list.d.ts +1 -0
  475. package/dist/commands/profile/list.js +45 -0
  476. package/dist/commands/profile/meta.d.ts +4 -0
  477. package/dist/commands/profile/meta.js +65 -0
  478. package/dist/commands/profile/new.d.ts +1 -0
  479. package/dist/commands/profile/new.js +95 -0
  480. package/dist/commands/profile/pause.d.ts +2 -0
  481. package/dist/commands/profile/pause.js +59 -0
  482. package/dist/commands/profile/project.d.ts +2 -0
  483. package/dist/commands/profile/project.js +134 -0
  484. package/dist/commands/profile/rename.d.ts +1 -0
  485. package/dist/commands/profile/rename.js +41 -0
  486. package/dist/commands/profile/show.d.ts +1 -0
  487. package/dist/commands/profile/show.js +55 -0
  488. package/dist/commands/profile.d.ts +2 -0
  489. package/dist/commands/profile.js +35 -0
  490. package/dist/commands/push.d.ts +2 -0
  491. package/dist/commands/push.js +263 -0
  492. package/dist/commands/revive.d.ts +2 -0
  493. package/dist/commands/revive.js +183 -0
  494. package/dist/commands/surface/node/cycle.d.ts +1 -0
  495. package/dist/commands/surface/node/cycle.js +83 -0
  496. package/dist/commands/surface/node/focus.d.ts +1 -0
  497. package/dist/commands/surface/node/focus.js +60 -0
  498. package/dist/commands/surface/node/id.d.ts +1 -0
  499. package/dist/commands/surface/node/id.js +38 -0
  500. package/dist/commands/surface/node/pin.d.ts +1 -0
  501. package/dist/commands/surface/node/pin.js +42 -0
  502. package/dist/commands/surface/node/placement.d.ts +30 -0
  503. package/dist/commands/surface/node/placement.js +49 -0
  504. package/dist/commands/surface-dashboard.d.ts +2 -0
  505. package/dist/commands/surface-dashboard.js +138 -0
  506. package/dist/commands/surface-edit.d.ts +2 -0
  507. package/dist/commands/surface-edit.js +157 -0
  508. package/dist/commands/surface-inbox.d.ts +2 -0
  509. package/dist/commands/surface-inbox.js +98 -0
  510. package/dist/commands/surface-inspect.d.ts +2 -0
  511. package/dist/commands/surface-inspect.js +41 -0
  512. package/dist/commands/surface-node.d.ts +2 -0
  513. package/dist/commands/surface-node.js +19 -0
  514. package/dist/commands/surface-reload.d.ts +7 -0
  515. package/dist/commands/surface-reload.js +129 -0
  516. package/dist/commands/surface-tmux-spread.d.ts +2 -0
  517. package/dist/commands/surface-tmux-spread.js +214 -0
  518. package/dist/commands/surface.d.ts +2 -0
  519. package/dist/commands/surface.js +29 -0
  520. package/dist/commands/sys/branch.d.ts +2 -0
  521. package/dist/commands/sys/branch.js +19 -0
  522. package/dist/commands/sys/config.d.ts +1 -0
  523. package/dist/commands/sys/config.js +353 -0
  524. package/dist/commands/sys/connect.d.ts +1 -0
  525. package/dist/commands/sys/connect.js +185 -0
  526. package/dist/commands/sys/context/admin/actions.d.ts +23 -0
  527. package/dist/commands/sys/context/admin/actions.js +89 -0
  528. package/dist/commands/sys/context/admin/detail-panel.d.ts +73 -0
  529. package/dist/commands/sys/context/admin/detail-panel.js +233 -0
  530. package/dist/commands/sys/context/admin/docs-panel.d.ts +63 -0
  531. package/dist/commands/sys/context/admin/docs-panel.js +185 -0
  532. package/dist/commands/sys/context/admin/list-view.d.ts +62 -0
  533. package/dist/commands/sys/context/admin/list-view.js +170 -0
  534. package/dist/commands/sys/context/admin/model.d.ts +123 -0
  535. package/dist/commands/sys/context/admin/model.js +179 -0
  536. package/dist/commands/sys/context/admin/rail-panel.d.ts +84 -0
  537. package/dist/commands/sys/context/admin/rail-panel.js +229 -0
  538. package/dist/commands/sys/context/admin/read-view.d.ts +27 -0
  539. package/dist/commands/sys/context/admin/read-view.js +172 -0
  540. package/dist/commands/sys/context/admin/shell.d.ts +125 -0
  541. package/dist/commands/sys/context/admin/shell.js +870 -0
  542. package/dist/commands/sys/context/admin.d.ts +1 -0
  543. package/dist/commands/sys/context/admin.js +148 -0
  544. package/dist/commands/sys/context/doc.d.ts +1 -0
  545. package/dist/commands/sys/context/doc.js +126 -0
  546. package/dist/commands/sys/context/expose.d.ts +1 -0
  547. package/dist/commands/sys/context/expose.js +66 -0
  548. package/dist/commands/sys/context/prompt-review.d.ts +1 -0
  549. package/dist/commands/sys/context/prompt-review.js +244 -0
  550. package/dist/commands/sys/context/resolve.d.ts +115 -0
  551. package/dist/commands/sys/context/resolve.js +326 -0
  552. package/dist/commands/sys/context/sysprompt.d.ts +1 -0
  553. package/dist/commands/sys/context/sysprompt.js +95 -0
  554. package/dist/commands/sys/context.d.ts +2 -0
  555. package/dist/commands/sys/context.js +21 -0
  556. package/dist/commands/sys/daemon.d.ts +4 -0
  557. package/dist/commands/sys/daemon.js +334 -0
  558. package/dist/commands/sys/db.d.ts +1 -0
  559. package/dist/commands/sys/db.js +69 -0
  560. package/dist/commands/sys/desktop.d.ts +5 -0
  561. package/dist/commands/sys/desktop.js +201 -0
  562. package/dist/commands/sys/doctor.d.ts +36 -0
  563. package/dist/commands/sys/doctor.js +633 -0
  564. package/dist/commands/sys/env.d.ts +1 -0
  565. package/dist/commands/sys/env.js +39 -0
  566. package/dist/commands/sys/feedback.d.ts +1 -0
  567. package/dist/commands/sys/feedback.js +228 -0
  568. package/dist/commands/sys/import/move.d.ts +55 -0
  569. package/dist/commands/sys/import/move.js +391 -0
  570. package/dist/commands/sys/import/resume.d.ts +1 -0
  571. package/dist/commands/sys/import/resume.js +23 -0
  572. package/dist/commands/sys/import/start.d.ts +4 -0
  573. package/dist/commands/sys/import/start.js +92 -0
  574. package/dist/commands/sys/join.d.ts +3 -0
  575. package/dist/commands/sys/join.js +85 -0
  576. package/dist/commands/sys/limits.d.ts +1 -0
  577. package/dist/commands/sys/limits.js +133 -0
  578. package/dist/commands/sys/logs.d.ts +1 -0
  579. package/dist/commands/sys/logs.js +129 -0
  580. package/dist/commands/sys/machine/rotate.d.ts +1 -0
  581. package/dist/commands/sys/machine/rotate.js +49 -0
  582. package/dist/commands/sys/migrate.d.ts +1 -0
  583. package/dist/commands/sys/migrate.js +79 -0
  584. package/dist/commands/sys/panels/broker-limits-panel.d.ts +17 -0
  585. package/dist/commands/sys/panels/broker-limits-panel.js +110 -0
  586. package/dist/commands/sys/panels/dependencies-panel.d.ts +14 -0
  587. package/dist/commands/sys/panels/dependencies-panel.js +80 -0
  588. package/dist/commands/sys/panels/keybindings-panel.d.ts +56 -0
  589. package/dist/commands/sys/panels/keybindings-panel.js +703 -0
  590. package/dist/commands/sys/panels/models-panel.d.ts +106 -0
  591. package/dist/commands/sys/panels/models-panel.js +1160 -0
  592. package/dist/commands/sys/panels/plugin-env-panel.d.ts +19 -0
  593. package/dist/commands/sys/panels/plugin-env-panel.js +70 -0
  594. package/dist/commands/sys/panels/plugins-panel.d.ts +16 -0
  595. package/dist/commands/sys/panels/plugins-panel.js +87 -0
  596. package/dist/commands/sys/panels/prefs-panel.d.ts +22 -0
  597. package/dist/commands/sys/panels/prefs-panel.js +97 -0
  598. package/dist/commands/sys/panels/profiles-panel.d.ts +70 -0
  599. package/dist/commands/sys/panels/profiles-panel.js +655 -0
  600. package/dist/commands/sys/panels/provider-panel.d.ts +74 -0
  601. package/dist/commands/sys/panels/provider-panel.js +534 -0
  602. package/dist/commands/sys/panels/terminal-panel.d.ts +19 -0
  603. package/dist/commands/sys/panels/terminal-panel.js +67 -0
  604. package/dist/commands/sys/provider-login.d.ts +8 -0
  605. package/dist/commands/sys/provider-login.js +99 -0
  606. package/dist/commands/sys/retry-delivery.d.ts +1 -0
  607. package/dist/commands/sys/retry-delivery.js +33 -0
  608. package/dist/commands/sys/settings-shell.d.ts +54 -0
  609. package/dist/commands/sys/settings-shell.js +400 -0
  610. package/dist/commands/sys/settings.d.ts +2 -0
  611. package/dist/commands/sys/settings.js +46 -0
  612. package/dist/commands/sys/setup-core.d.ts +121 -0
  613. package/dist/commands/sys/setup-core.js +890 -0
  614. package/dist/commands/sys/setup-settings-runner.d.ts +13 -0
  615. package/dist/commands/sys/setup-settings-runner.js +15 -0
  616. package/dist/commands/sys/setup-wizard.d.ts +52 -0
  617. package/dist/commands/sys/setup-wizard.js +351 -0
  618. package/dist/commands/sys/setup.d.ts +6 -0
  619. package/dist/commands/sys/setup.js +41 -0
  620. package/dist/commands/sys/shared.d.ts +51 -0
  621. package/dist/commands/sys/shared.js +81 -0
  622. package/dist/commands/sys/signin.d.ts +7 -0
  623. package/dist/commands/sys/signin.js +149 -0
  624. package/dist/commands/sys/spaces.d.ts +1 -0
  625. package/dist/commands/sys/spaces.js +22 -0
  626. package/dist/commands/sys/spend.d.ts +1 -0
  627. package/dist/commands/sys/spend.js +144 -0
  628. package/dist/commands/sys/support/prepare.d.ts +13 -0
  629. package/dist/commands/sys/support/prepare.js +239 -0
  630. package/dist/commands/sys/support/submit.d.ts +19 -0
  631. package/dist/commands/sys/support/submit.js +524 -0
  632. package/dist/commands/sys/support.d.ts +2 -0
  633. package/dist/commands/sys/support.js +18 -0
  634. package/dist/commands/sys/sync-deps.d.ts +16 -0
  635. package/dist/commands/sys/sync-deps.js +445 -0
  636. package/dist/commands/sys/sync-project-guidance.d.ts +1 -0
  637. package/dist/commands/sys/sync-project-guidance.js +319 -0
  638. package/dist/commands/sys/sync-shared.d.ts +44 -0
  639. package/dist/commands/sys/sync-shared.js +139 -0
  640. package/dist/commands/sys/sync-skills.d.ts +1 -0
  641. package/dist/commands/sys/sync-skills.js +297 -0
  642. package/dist/commands/sys/sync.d.ts +2 -0
  643. package/dist/commands/sys/sync.js +17 -0
  644. package/dist/commands/sys/terminal-option.d.ts +112 -0
  645. package/dist/commands/sys/terminal-option.js +542 -0
  646. package/dist/commands/sys/tutorial/branch.d.ts +1 -0
  647. package/dist/commands/sys/tutorial/branch.js +15 -0
  648. package/dist/commands/sys/tutorial/lessons.d.ts +5 -0
  649. package/dist/commands/sys/tutorial/lessons.js +107 -0
  650. package/dist/commands/sys/tutorial/scenario.d.ts +1 -0
  651. package/dist/commands/sys/tutorial/scenario.js +431 -0
  652. package/dist/commands/sys/tutorial/tracks.d.ts +1 -0
  653. package/dist/commands/sys/tutorial/tracks.js +96 -0
  654. package/dist/commands/sys/update.d.ts +2 -0
  655. package/dist/commands/sys/update.js +157 -0
  656. package/dist/commands/sys/worktrees.d.ts +2 -0
  657. package/dist/commands/sys/worktrees.js +53 -0
  658. package/dist/commands/sys.d.ts +2 -0
  659. package/dist/commands/sys.js +31 -0
  660. package/dist/core/activity-signal.d.ts +7 -0
  661. package/dist/core/activity-signal.js +38 -0
  662. package/dist/core/async-array.d.ts +7 -0
  663. package/dist/core/async-array.js +48 -0
  664. package/dist/core/auth-file.d.ts +35 -0
  665. package/dist/core/auth-file.js +161 -0
  666. package/dist/core/auth-interaction.d.ts +19 -0
  667. package/dist/core/auth-interaction.js +94 -0
  668. package/dist/core/bash-guard.d.ts +6 -0
  669. package/dist/core/bash-guard.js +527 -0
  670. package/dist/core/bash-job-supervisor.d.ts +5 -0
  671. package/dist/core/bash-job-supervisor.js +144 -0
  672. package/dist/core/bash-jobs.d.ts +168 -0
  673. package/dist/core/bash-jobs.js +455 -0
  674. package/dist/core/blobs/directory.d.ts +11 -0
  675. package/dist/core/blobs/directory.js +216 -0
  676. package/dist/core/blobs/fault.d.ts +3 -0
  677. package/dist/core/blobs/fault.js +6 -0
  678. package/dist/core/blobs/index.d.ts +21 -0
  679. package/dist/core/blobs/index.js +30 -0
  680. package/dist/core/blobs/r2.d.ts +13 -0
  681. package/dist/core/blobs/r2.js +104 -0
  682. package/dist/core/broker-client/client.d.ts +89 -0
  683. package/dist/core/broker-client/client.js +184 -0
  684. package/dist/core/broker-client/index.d.ts +2 -0
  685. package/dist/core/broker-client/index.js +14 -0
  686. package/dist/core/broker-client/transport-relay.d.ts +47 -0
  687. package/dist/core/broker-client/transport-relay.js +165 -0
  688. package/dist/core/broker-client/transport-socket.d.ts +35 -0
  689. package/dist/core/broker-client/transport-socket.js +187 -0
  690. package/dist/core/broker-client/transport.d.ts +46 -0
  691. package/dist/core/broker-client/transport.js +40 -0
  692. package/dist/core/canvas/app-run.d.ts +3 -0
  693. package/dist/core/canvas/app-run.js +4 -0
  694. package/dist/core/canvas/attention.d.ts +18 -0
  695. package/dist/core/canvas/attention.js +47 -0
  696. package/dist/core/canvas/browse/app.d.ts +29 -0
  697. package/dist/core/canvas/browse/app.js +1050 -0
  698. package/dist/core/canvas/browse/model.d.ts +176 -0
  699. package/dist/core/canvas/browse/model.js +477 -0
  700. package/dist/core/canvas/browse/pins.d.ts +4 -0
  701. package/dist/core/canvas/browse/pins.js +29 -0
  702. package/dist/core/canvas/browse/render.d.ts +103 -0
  703. package/dist/core/canvas/browse/render.js +1058 -0
  704. package/dist/core/canvas/canvas.d.ts +409 -0
  705. package/dist/core/canvas/canvas.js +1206 -0
  706. package/dist/core/canvas/crons.d.ts +322 -0
  707. package/dist/core/canvas/crons.js +541 -0
  708. package/dist/core/canvas/daemon-actions.d.ts +42 -0
  709. package/dist/core/canvas/daemon-actions.js +98 -0
  710. package/dist/core/canvas/db.d.ts +60 -0
  711. package/dist/core/canvas/db.js +426 -0
  712. package/dist/core/canvas/deliveries.d.ts +125 -0
  713. package/dist/core/canvas/deliveries.js +393 -0
  714. package/dist/core/canvas/delivery-contract.d.ts +37 -0
  715. package/dist/core/canvas/delivery-contract.js +30 -0
  716. package/dist/core/canvas/executions.d.ts +125 -0
  717. package/dist/core/canvas/executions.js +279 -0
  718. package/dist/core/canvas/extensions.d.ts +9 -0
  719. package/dist/core/canvas/extensions.js +90 -0
  720. package/dist/core/canvas/focuses.d.ts +26 -0
  721. package/dist/core/canvas/focuses.js +82 -0
  722. package/dist/core/canvas/history.d.ts +104 -0
  723. package/dist/core/canvas/history.js +480 -0
  724. package/dist/core/canvas/index.d.ts +14 -0
  725. package/dist/core/canvas/index.js +16 -0
  726. package/dist/core/canvas/install-id.d.ts +9 -0
  727. package/dist/core/canvas/install-id.js +64 -0
  728. package/dist/core/canvas/labels.d.ts +30 -0
  729. package/dist/core/canvas/labels.js +43 -0
  730. package/dist/core/canvas/legacy-person.d.ts +4 -0
  731. package/dist/core/canvas/legacy-person.js +4 -0
  732. package/dist/core/canvas/memory-reads.d.ts +24 -0
  733. package/dist/core/canvas/memory-reads.js +36 -0
  734. package/dist/core/canvas/meta-file.d.ts +20 -0
  735. package/dist/core/canvas/meta-file.js +89 -0
  736. package/dist/core/canvas/nav-render.d.ts +136 -0
  737. package/dist/core/canvas/nav-render.js +224 -0
  738. package/dist/core/canvas/node-agent-paths.d.ts +8 -0
  739. package/dist/core/canvas/node-agent-paths.js +30 -0
  740. package/dist/core/canvas/node-order.d.ts +24 -0
  741. package/dist/core/canvas/node-order.js +37 -0
  742. package/dist/core/canvas/node-recap.d.ts +23 -0
  743. package/dist/core/canvas/node-recap.js +62 -0
  744. package/dist/core/canvas/node-tokens.d.ts +19 -0
  745. package/dist/core/canvas/node-tokens.js +53 -0
  746. package/dist/core/canvas/outcome-actions.d.ts +23 -0
  747. package/dist/core/canvas/outcome-actions.js +71 -0
  748. package/dist/core/canvas/person.d.ts +32 -0
  749. package/dist/core/canvas/person.js +244 -0
  750. package/dist/core/canvas/pid.d.ts +6 -0
  751. package/dist/core/canvas/pid.js +20 -10
  752. package/dist/core/canvas/reconciler-leases.d.ts +12 -0
  753. package/dist/core/canvas/reconciler-leases.js +40 -0
  754. package/dist/core/canvas/recovery.d.ts +127 -0
  755. package/dist/core/canvas/recovery.js +713 -0
  756. package/dist/core/canvas/remote-canvas-source.d.ts +71 -0
  757. package/dist/core/canvas/remote-canvas-source.js +290 -0
  758. package/dist/core/canvas/remote-transport.d.ts +7 -0
  759. package/dist/core/canvas/remote-transport.js +57 -0
  760. package/dist/core/canvas/render-source.d.ts +193 -0
  761. package/dist/core/canvas/render-source.js +518 -0
  762. package/dist/core/canvas/schema-chain.d.ts +33 -0
  763. package/dist/core/canvas/schema-chain.js +110 -0
  764. package/dist/core/canvas/schema-version.d.ts +30 -0
  765. package/dist/core/canvas/schema-version.js +58 -0
  766. package/dist/core/canvas/sessions.d.ts +54 -0
  767. package/dist/core/canvas/sessions.js +128 -0
  768. package/dist/core/canvas/source.d.ts +52 -0
  769. package/dist/core/canvas/source.js +57 -0
  770. package/dist/core/canvas/status-glyph.d.ts +52 -0
  771. package/dist/core/canvas/status-glyph.js +132 -0
  772. package/dist/core/canvas/structured-requests.d.ts +69 -0
  773. package/dist/core/canvas/structured-requests.js +176 -0
  774. package/dist/core/canvas/telemetry.d.ts +14 -0
  775. package/dist/core/canvas/telemetry.js +35 -0
  776. package/dist/core/canvas/tree.d.ts +33 -0
  777. package/dist/core/canvas/tree.js +128 -0
  778. package/dist/core/canvas/types.d.ts +461 -0
  779. package/dist/core/canvas/types.js +6 -0
  780. package/dist/core/canvas/waits.d.ts +39 -0
  781. package/dist/core/canvas/waits.js +104 -0
  782. package/dist/core/canvas/worktrees.d.ts +41 -0
  783. package/dist/core/canvas/worktrees.js +97 -0
  784. package/dist/core/clipboard-text.d.ts +11 -0
  785. package/dist/core/clipboard-text.js +57 -0
  786. package/dist/core/command-hooks/artifact.d.ts +16 -0
  787. package/dist/core/command-hooks/artifact.js +145 -0
  788. package/dist/core/command-hooks/catalog.d.ts +14 -0
  789. package/dist/core/command-hooks/catalog.js +38 -0
  790. package/dist/core/command-hooks/compose.d.ts +15 -0
  791. package/dist/core/command-hooks/compose.js +101 -0
  792. package/dist/core/command-hooks/discovery.d.ts +133 -0
  793. package/dist/core/command-hooks/discovery.js +246 -0
  794. package/dist/core/command-hooks/help.d.ts +5 -0
  795. package/dist/core/command-hooks/help.js +18 -0
  796. package/dist/core/command-hooks/lifecycle-catalog.d.ts +21 -0
  797. package/dist/core/command-hooks/lifecycle-catalog.js +9 -0
  798. package/dist/core/command-hooks/lifecycle-create.d.ts +4 -0
  799. package/dist/core/command-hooks/lifecycle-create.js +51 -0
  800. package/dist/core/command-hooks/report.d.ts +32 -0
  801. package/dist/core/command-hooks/report.js +28 -0
  802. package/dist/core/command-hooks/schema.d.ts +42 -0
  803. package/dist/core/command-hooks/schema.js +157 -0
  804. package/dist/core/command-hooks/transport/exec-invoke.d.ts +24 -0
  805. package/dist/core/command-hooks/transport/exec-invoke.js +315 -0
  806. package/dist/core/command-hooks/transport/exec-lifecycle.d.ts +23 -0
  807. package/dist/core/command-hooks/transport/exec-lifecycle.js +248 -0
  808. package/dist/core/command-hooks/transport/plan.d.ts +3 -0
  809. package/dist/core/command-hooks/transport/plan.js +30 -0
  810. package/dist/core/command-manifests/registry.d.ts +68 -0
  811. package/dist/core/command-manifests/registry.js +118 -0
  812. package/dist/core/command-plugins/caller-header.d.ts +10 -0
  813. package/dist/core/command-plugins/caller-header.js +15 -0
  814. package/dist/core/command-plugins/compose.d.ts +11 -0
  815. package/dist/core/command-plugins/compose.js +241 -0
  816. package/dist/core/command-plugins/discovery.d.ts +49 -0
  817. package/dist/core/command-plugins/discovery.js +240 -0
  818. package/dist/core/command-plugins/extensions.d.ts +20 -0
  819. package/dist/core/command-plugins/extensions.js +166 -0
  820. package/dist/core/command-plugins/help-addenda.d.ts +25 -0
  821. package/dist/core/command-plugins/help-addenda.js +55 -0
  822. package/dist/core/command-plugins/presence.d.ts +4 -0
  823. package/dist/core/command-plugins/presence.js +36 -0
  824. package/dist/core/command-plugins/transport/exec-invoke.d.ts +42 -0
  825. package/dist/core/command-plugins/transport/exec-invoke.js +138 -0
  826. package/dist/core/command-plugins/transport/http-fetch.d.ts +41 -0
  827. package/dist/core/command-plugins/transport/http-fetch.js +68 -0
  828. package/dist/core/command-plugins/transport/http-invoke.d.ts +22 -0
  829. package/dist/core/command-plugins/transport/http-invoke.js +333 -0
  830. package/dist/core/command-plugins/transport/http-plan.d.ts +75 -0
  831. package/dist/core/command-plugins/transport/http-plan.js +349 -0
  832. package/dist/core/command-plugins/transport/sign.d.ts +55 -0
  833. package/dist/core/command-plugins/transport/sign.js +115 -0
  834. package/dist/core/command.d.ts +238 -0
  835. package/dist/core/command.js +848 -0
  836. package/dist/core/conversation-store/row-store.d.ts +14 -0
  837. package/dist/core/conversation-store/row-store.js +337 -0
  838. package/dist/core/directory/issuer.d.ts +8 -0
  839. package/dist/core/directory/issuer.js +15 -0
  840. package/dist/core/directory/join.d.ts +57 -0
  841. package/dist/core/directory/join.js +218 -0
  842. package/dist/core/directory/person-credential.d.ts +61 -0
  843. package/dist/core/directory/person-credential.js +220 -0
  844. package/dist/core/directory/reach.d.ts +3 -0
  845. package/dist/core/directory/reach.js +19 -0
  846. package/dist/core/document-lines.d.ts +4 -0
  847. package/dist/core/document-lines.js +6 -0
  848. package/dist/core/editor-resolver.d.ts +28 -0
  849. package/dist/core/editor-resolver.js +77 -0
  850. package/dist/core/environments.d.ts +21 -0
  851. package/dist/core/environments.js +56 -0
  852. package/dist/core/events/outbound.d.ts +21 -0
  853. package/dist/core/events/outbound.js +92 -0
  854. package/dist/core/events/read.d.ts +40 -0
  855. package/dist/core/events/read.js +625 -0
  856. package/dist/core/fault-classifier.d.ts +36 -0
  857. package/dist/core/fault-classifier.js +101 -0
  858. package/dist/core/feed/feed.d.ts +63 -0
  859. package/dist/core/feed/feed.js +190 -0
  860. package/dist/core/feed/inbox.d.ts +34 -0
  861. package/dist/core/feed/inbox.js +93 -0
  862. package/dist/core/feed/messages.d.ts +88 -0
  863. package/dist/core/feed/messages.js +206 -0
  864. package/dist/core/feed/reports.d.ts +10 -0
  865. package/dist/core/feed/reports.js +58 -0
  866. package/dist/core/frontmatter.d.ts +8 -0
  867. package/dist/core/frontmatter.js +35 -0
  868. package/dist/core/grants/cover.d.ts +14 -0
  869. package/dist/core/grants/cover.js +66 -0
  870. package/dist/core/grants/local.d.ts +4 -0
  871. package/dist/core/grants/local.js +26 -0
  872. package/dist/core/grants/mirror.d.ts +155 -0
  873. package/dist/core/grants/mirror.js +379 -0
  874. package/dist/core/grants/on-sync.d.ts +26 -0
  875. package/dist/core/grants/on-sync.js +161 -0
  876. package/dist/core/grants/sandboxes.d.ts +7 -0
  877. package/dist/core/grants/sandboxes.js +24 -0
  878. package/dist/core/grants/sync.d.ts +46 -0
  879. package/dist/core/grants/sync.js +195 -0
  880. package/dist/core/grants/terminal.d.ts +10 -0
  881. package/dist/core/grants/terminal.js +25 -0
  882. package/dist/core/graph/access.d.ts +13 -0
  883. package/dist/core/graph/access.js +37 -0
  884. package/dist/core/graph/bodies.d.ts +22 -0
  885. package/dist/core/graph/bodies.js +68 -0
  886. package/dist/core/graph/custom.d.ts +98 -0
  887. package/dist/core/graph/custom.js +298 -0
  888. package/dist/core/graph/deletion.d.ts +16 -0
  889. package/dist/core/graph/deletion.js +104 -0
  890. package/dist/core/graph/documents.d.ts +181 -0
  891. package/dist/core/graph/documents.js +653 -0
  892. package/dist/core/graph/edges.d.ts +41 -0
  893. package/dist/core/graph/edges.js +83 -0
  894. package/dist/core/graph/events.d.ts +49 -0
  895. package/dist/core/graph/events.js +315 -0
  896. package/dist/core/graph/exposures.d.ts +53 -0
  897. package/dist/core/graph/exposures.js +152 -0
  898. package/dist/core/graph/jobs.d.ts +107 -0
  899. package/dist/core/graph/jobs.js +184 -0
  900. package/dist/core/graph/kinds/action.d.ts +3 -0
  901. package/dist/core/graph/kinds/action.js +20 -0
  902. package/dist/core/graph/kinds/custom.d.ts +8 -0
  903. package/dist/core/graph/kinds/custom.js +25 -0
  904. package/dist/core/graph/kinds/document.d.ts +20 -0
  905. package/dist/core/graph/kinds/document.js +133 -0
  906. package/dist/core/graph/kinds/dto.d.ts +5 -0
  907. package/dist/core/graph/kinds/dto.js +11 -0
  908. package/dist/core/graph/kinds/environment.d.ts +2 -0
  909. package/dist/core/graph/kinds/environment.js +21 -0
  910. package/dist/core/graph/kinds/job.d.ts +2 -0
  911. package/dist/core/graph/kinds/job.js +24 -0
  912. package/dist/core/graph/kinds/kind.d.ts +67 -0
  913. package/dist/core/graph/kinds/kind.js +15 -0
  914. package/dist/core/graph/kinds/live-read.d.ts +5 -0
  915. package/dist/core/graph/kinds/live-read.js +11 -0
  916. package/dist/core/graph/kinds/node.d.ts +12 -0
  917. package/dist/core/graph/kinds/node.js +87 -0
  918. package/dist/core/graph/kinds/owner.d.ts +2 -0
  919. package/dist/core/graph/kinds/owner.js +26 -0
  920. package/dist/core/graph/kinds/registry.d.ts +10 -0
  921. package/dist/core/graph/kinds/registry.js +58 -0
  922. package/dist/core/graph/kinds/render.d.ts +9 -0
  923. package/dist/core/graph/kinds/render.js +17 -0
  924. package/dist/core/graph/names.d.ts +57 -0
  925. package/dist/core/graph/names.js +183 -0
  926. package/dist/core/graph/objects.d.ts +88 -0
  927. package/dist/core/graph/objects.js +273 -0
  928. package/dist/core/graph/package-docs.d.ts +41 -0
  929. package/dist/core/graph/package-docs.js +198 -0
  930. package/dist/core/graph/package-files.d.ts +20 -0
  931. package/dist/core/graph/package-files.js +146 -0
  932. package/dist/core/graph/package-kinds.d.ts +22 -0
  933. package/dist/core/graph/package-kinds.js +49 -0
  934. package/dist/core/graph/package-reconcile.d.ts +17 -0
  935. package/dist/core/graph/package-reconcile.js +31 -0
  936. package/dist/core/graph/reader.d.ts +45 -0
  937. package/dist/core/graph/reader.js +218 -0
  938. package/dist/core/graph/receiver-url.d.ts +11 -0
  939. package/dist/core/graph/receiver-url.js +83 -0
  940. package/dist/core/graph/receivers.d.ts +28 -0
  941. package/dist/core/graph/receivers.js +66 -0
  942. package/dist/core/graph/repo-sync/exchange.d.ts +36 -0
  943. package/dist/core/graph/repo-sync/exchange.js +422 -0
  944. package/dist/core/graph/repo-sync/identity.d.ts +32 -0
  945. package/dist/core/graph/repo-sync/identity.js +147 -0
  946. package/dist/core/graph/repo-sync/index.d.ts +4 -0
  947. package/dist/core/graph/repo-sync/index.js +2 -0
  948. package/dist/core/graph/repo-sync/mirror.d.ts +30 -0
  949. package/dist/core/graph/repo-sync/mirror.js +170 -0
  950. package/dist/core/graph/repo-sync/ref-format.d.ts +80 -0
  951. package/dist/core/graph/repo-sync/ref-format.js +215 -0
  952. package/dist/core/graph/repo-sync/repos.d.ts +21 -0
  953. package/dist/core/graph/repo-sync/repos.js +57 -0
  954. package/dist/core/graph/repo-sync/sync.d.ts +40 -0
  955. package/dist/core/graph/repo-sync/sync.js +322 -0
  956. package/dist/core/graph/rules.d.ts +27 -0
  957. package/dist/core/graph/rules.js +134 -0
  958. package/dist/core/graph/types.d.ts +131 -0
  959. package/dist/core/graph/types.js +10 -0
  960. package/dist/core/graph/watches.d.ts +66 -0
  961. package/dist/core/graph/watches.js +177 -0
  962. package/dist/core/human/action-binding.d.ts +23 -0
  963. package/dist/core/human/action-binding.js +41 -0
  964. package/dist/core/human/answer-text.d.ts +5 -0
  965. package/dist/core/human/answer-text.js +100 -0
  966. package/dist/core/human/answer.d.ts +53 -0
  967. package/dist/core/human/answer.js +119 -0
  968. package/dist/core/human/claim.d.ts +23 -0
  969. package/dist/core/human/claim.js +67 -0
  970. package/dist/core/human/completion.d.ts +38 -0
  971. package/dist/core/human/completion.js +27 -0
  972. package/dist/core/human/component-docs.d.ts +18 -0
  973. package/dist/core/human/component-docs.js +442 -0
  974. package/dist/core/human/convention.d.ts +31 -0
  975. package/dist/core/human/convention.js +82 -0
  976. package/dist/core/human/feedback-companion.d.ts +19 -0
  977. package/dist/core/human/feedback-companion.js +92 -0
  978. package/dist/core/human/feedback.d.ts +62 -0
  979. package/dist/core/human/feedback.js +88 -0
  980. package/dist/core/human/page-authoring.d.ts +30 -0
  981. package/dist/core/human/page-authoring.js +19 -0
  982. package/dist/core/human/page-errors.d.ts +8 -0
  983. package/dist/core/human/page-errors.js +14 -0
  984. package/dist/core/human/page-eval.d.ts +25 -0
  985. package/dist/core/human/page-eval.js +125 -0
  986. package/dist/core/human/page-html-markdown.d.ts +8 -0
  987. package/dist/core/human/page-html-markdown.js +260 -0
  988. package/dist/core/human/page-markdown.d.ts +3 -0
  989. package/dist/core/human/page-markdown.js +295 -0
  990. package/dist/core/human/page-schema.d.ts +291 -0
  991. package/dist/core/human/page-schema.js +381 -0
  992. package/dist/core/human/page.d.ts +21 -0
  993. package/dist/core/human/page.js +251 -0
  994. package/dist/core/human/request-files.d.ts +14 -0
  995. package/dist/core/human/request-files.js +54 -0
  996. package/dist/core/human/requests.d.ts +156 -0
  997. package/dist/core/human/requests.js +619 -0
  998. package/dist/core/human/root.d.ts +4 -0
  999. package/dist/core/human/root.js +11 -0
  1000. package/dist/core/human/summary.d.ts +3 -0
  1001. package/dist/core/human/summary.js +5 -0
  1002. package/dist/core/human/tickets.d.ts +68 -0
  1003. package/dist/core/human/tickets.js +175 -0
  1004. package/dist/core/human/types.d.ts +118 -0
  1005. package/dist/core/human/types.js +1 -0
  1006. package/dist/core/human/visible-paths.d.ts +16 -0
  1007. package/dist/core/human/visible-paths.js +74 -0
  1008. package/dist/core/human-actions.d.ts +25 -0
  1009. package/dist/core/human-actions.js +101 -0
  1010. package/dist/core/import/bundle/blob-keys.d.ts +10 -0
  1011. package/dist/core/import/bundle/blob-keys.js +23 -0
  1012. package/dist/core/import/bundle/layout.d.ts +90 -0
  1013. package/dist/core/import/bundle/layout.js +117 -0
  1014. package/dist/core/import/export/archive.d.ts +11 -0
  1015. package/dist/core/import/export/archive.js +22 -0
  1016. package/dist/core/import/export/cloud.d.ts +23 -0
  1017. package/dist/core/import/export/cloud.js +47 -0
  1018. package/dist/core/import/export/dump.d.ts +34 -0
  1019. package/dist/core/import/export/dump.js +235 -0
  1020. package/dist/core/import/export/files.d.ts +22 -0
  1021. package/dist/core/import/export/files.js +107 -0
  1022. package/dist/core/import/export/inline.d.ts +3 -0
  1023. package/dist/core/import/export/inline.js +15 -0
  1024. package/dist/core/import/export/source.d.ts +2 -0
  1025. package/dist/core/import/export/source.js +5 -0
  1026. package/dist/core/import/export/stores.d.ts +9 -0
  1027. package/dist/core/import/export/stores.js +69 -0
  1028. package/dist/core/inspector/chrome.d.ts +6 -0
  1029. package/dist/core/inspector/chrome.js +14 -0
  1030. package/dist/core/inspector/contract.d.ts +105 -0
  1031. package/dist/core/inspector/contract.js +1 -0
  1032. package/dist/core/inspector/core.d.ts +39 -0
  1033. package/dist/core/inspector/core.js +296 -0
  1034. package/dist/core/inspector/host.d.ts +46 -0
  1035. package/dist/core/inspector/host.js +538 -0
  1036. package/dist/core/inspector/model.d.ts +88 -0
  1037. package/dist/core/inspector/model.js +225 -0
  1038. package/dist/core/inspector/text.d.ts +5 -0
  1039. package/dist/core/inspector/text.js +45 -0
  1040. package/dist/core/inspector/transport.d.ts +6 -0
  1041. package/dist/core/inspector/transport.js +36 -0
  1042. package/dist/core/inspector/tui.d.ts +3 -0
  1043. package/dist/core/inspector/tui.js +295 -0
  1044. package/dist/core/io.js +7 -0
  1045. package/dist/core/keybindings/background-bash.d.ts +13 -0
  1046. package/dist/core/keybindings/background-bash.js +33 -0
  1047. package/dist/core/keybindings/catalog.d.ts +1 -1
  1048. package/dist/core/keybindings/inbox.d.ts +18 -0
  1049. package/dist/core/keybindings/inbox.js +25 -0
  1050. package/dist/core/keybindings/index.d.ts +8 -0
  1051. package/dist/core/keybindings/index.js +7 -0
  1052. package/dist/core/keybindings/match.d.ts +44 -0
  1053. package/dist/core/keybindings/match.js +146 -0
  1054. package/dist/core/keybindings/persistence.d.ts +18 -0
  1055. package/dist/core/keybindings/persistence.js +49 -0
  1056. package/dist/core/keybindings/resolve.d.ts +28 -0
  1057. package/dist/core/keybindings/resolve.js +348 -0
  1058. package/dist/core/layout-migrate/index.d.ts +38 -0
  1059. package/dist/core/layout-migrate/index.js +523 -0
  1060. package/dist/core/layout-migrate/paths.d.ts +30 -0
  1061. package/dist/core/layout-migrate/paths.js +118 -0
  1062. package/dist/core/layout-migrate/stored-paths.d.ts +9 -0
  1063. package/dist/core/layout-migrate/stored-paths.js +424 -0
  1064. package/dist/core/layout-migrate/stores.d.ts +30 -0
  1065. package/dist/core/layout-migrate/stores.js +543 -0
  1066. package/dist/core/ledger/account.d.ts +12 -0
  1067. package/dist/core/ledger/account.js +13 -0
  1068. package/dist/core/ledger/charges.d.ts +16 -0
  1069. package/dist/core/ledger/charges.js +43 -0
  1070. package/dist/core/ledger/check.d.ts +48 -0
  1071. package/dist/core/ledger/check.js +38 -0
  1072. package/dist/core/ledger/chunks.d.ts +8 -0
  1073. package/dist/core/ledger/chunks.js +43 -0
  1074. package/dist/core/ledger/index.d.ts +9 -0
  1075. package/dist/core/ledger/index.js +10 -0
  1076. package/dist/core/ledger/infra-allowance.d.ts +7 -0
  1077. package/dist/core/ledger/infra-allowance.js +31 -0
  1078. package/dist/core/ledger/limits.d.ts +10 -0
  1079. package/dist/core/ledger/limits.js +35 -0
  1080. package/dist/core/ledger/months.d.ts +6 -0
  1081. package/dist/core/ledger/months.js +19 -0
  1082. package/dist/core/ledger/payer.d.ts +34 -0
  1083. package/dist/core/ledger/payer.js +14 -0
  1084. package/dist/core/ledger/read.d.ts +57 -0
  1085. package/dist/core/ledger/read.js +194 -0
  1086. package/dist/core/ledger/totals.d.ts +10 -0
  1087. package/dist/core/ledger/totals.js +34 -0
  1088. package/dist/core/ledger/types.d.ts +75 -0
  1089. package/dist/core/ledger/types.js +2 -0
  1090. package/dist/core/llm/app-rungs.d.ts +16 -0
  1091. package/dist/core/llm/app-rungs.js +59 -0
  1092. package/dist/core/llm/body-limits.d.ts +7 -0
  1093. package/dist/core/llm/body-limits.js +7 -0
  1094. package/dist/core/llm/refusal.d.ts +14 -0
  1095. package/dist/core/llm/refusal.js +22 -0
  1096. package/dist/core/locked-file.d.ts +27 -0
  1097. package/dist/core/locked-file.js +121 -0
  1098. package/dist/core/log.d.ts +2 -0
  1099. package/dist/core/log.js +5 -3
  1100. package/dist/core/manifest-stale.d.ts +18 -0
  1101. package/dist/core/manifest-stale.js +39 -0
  1102. package/dist/core/model-auth/api-credential-store.d.ts +10 -0
  1103. package/dist/core/model-auth/api-credential-store.js +40 -0
  1104. package/dist/core/model-auth/daemon-login.d.ts +13 -0
  1105. package/dist/core/model-auth/daemon-login.js +156 -0
  1106. package/dist/core/model-auth/readiness.d.ts +12 -0
  1107. package/dist/core/model-auth/readiness.js +48 -0
  1108. package/dist/core/model-routes-pool.d.ts +14 -0
  1109. package/dist/core/model-routes-pool.js +50 -0
  1110. package/dist/core/model-routes.d.ts +98 -0
  1111. package/dist/core/model-routes.js +190 -0
  1112. package/dist/core/northlight/previews.d.ts +22 -0
  1113. package/dist/core/northlight/previews.js +87 -0
  1114. package/dist/core/nvim-launch.d.ts +7 -0
  1115. package/dist/core/nvim-launch.js +45 -0
  1116. package/dist/core/output.d.ts +35 -0
  1117. package/dist/core/output.js +99 -0
  1118. package/dist/core/pagination.d.ts +35 -0
  1119. package/dist/core/pagination.js +88 -0
  1120. package/dist/core/peer/client.d.ts +61 -0
  1121. package/dist/core/peer/client.js +167 -0
  1122. package/dist/core/peer/directory.d.ts +71 -0
  1123. package/dist/core/peer/directory.js +167 -0
  1124. package/dist/core/peer/envelope.d.ts +46 -0
  1125. package/dist/core/peer/envelope.js +98 -0
  1126. package/dist/core/peer/names.d.ts +5 -0
  1127. package/dist/core/peer/names.js +8 -0
  1128. package/dist/core/peer/outbox-store.d.ts +76 -0
  1129. package/dist/core/peer/outbox-store.js +84 -0
  1130. package/dist/core/peer/receiver.d.ts +8 -0
  1131. package/dist/core/peer/receiver.js +54 -0
  1132. package/dist/core/peer/stubs.d.ts +90 -0
  1133. package/dist/core/peer/stubs.js +208 -0
  1134. package/dist/core/peer/token.d.ts +13 -0
  1135. package/dist/core/peer/token.js +29 -0
  1136. package/dist/core/peer/version.d.ts +16 -0
  1137. package/dist/core/peer/version.js +23 -0
  1138. package/dist/core/permissions/builtin.d.ts +8 -0
  1139. package/dist/core/permissions/builtin.js +27 -0
  1140. package/dist/core/permissions/ceiling.d.ts +57 -0
  1141. package/dist/core/permissions/ceiling.js +319 -0
  1142. package/dist/core/permissions/compile.d.ts +14 -0
  1143. package/dist/core/permissions/compile.js +175 -0
  1144. package/dist/core/permissions/errors.d.ts +7 -0
  1145. package/dist/core/permissions/errors.js +13 -0
  1146. package/dist/core/permissions/evaluator.d.ts +33 -0
  1147. package/dist/core/permissions/evaluator.js +96 -0
  1148. package/dist/core/permissions/facts.d.ts +56 -0
  1149. package/dist/core/permissions/facts.js +102 -0
  1150. package/dist/core/permissions/schema-parser.d.ts +29 -0
  1151. package/dist/core/permissions/schema-parser.js +151 -0
  1152. package/dist/core/permissions/schemas.d.ts +21 -0
  1153. package/dist/core/permissions/schemas.js +83 -0
  1154. package/dist/core/permissions/sql.d.ts +16 -0
  1155. package/dist/core/permissions/sql.js +31 -0
  1156. package/dist/core/plugin-app.d.ts +31 -0
  1157. package/dist/core/plugin-app.js +58 -0
  1158. package/dist/core/plugin-quarantine.d.ts +16 -0
  1159. package/dist/core/plugin-quarantine.js +70 -0
  1160. package/dist/core/pool-credential-store.d.ts +31 -0
  1161. package/dist/core/pool-credential-store.js +116 -0
  1162. package/dist/core/predicate.d.ts +65 -0
  1163. package/dist/core/predicate.js +191 -0
  1164. package/dist/core/preview-registry.d.ts +59 -0
  1165. package/dist/core/preview-registry.js +403 -0
  1166. package/dist/core/profiles/default-binding.d.ts +15 -0
  1167. package/dist/core/profiles/default-binding.js +29 -0
  1168. package/dist/core/profiles/deletion-reservation.d.ts +12 -0
  1169. package/dist/core/profiles/deletion-reservation.js +42 -0
  1170. package/dist/core/profiles/select.d.ts +46 -0
  1171. package/dist/core/profiles/select.js +738 -0
  1172. package/dist/core/provider-credential.d.ts +6 -0
  1173. package/dist/core/provider-credential.js +17 -0
  1174. package/dist/core/provider-error-recognition.d.ts +30 -0
  1175. package/dist/core/provider-error-recognition.js +82 -0
  1176. package/dist/core/provider-failure.d.ts +42 -0
  1177. package/dist/core/provider-failure.js +145 -0
  1178. package/dist/core/provider-management.d.ts +11 -0
  1179. package/dist/core/provider-management.js +9 -0
  1180. package/dist/core/providers/approval.d.ts +23 -0
  1181. package/dist/core/providers/approval.js +146 -0
  1182. package/dist/core/providers/audit.d.ts +30 -0
  1183. package/dist/core/providers/audit.js +52 -0
  1184. package/dist/core/providers/bundles.d.ts +66 -0
  1185. package/dist/core/providers/bundles.js +638 -0
  1186. package/dist/core/providers/call.d.ts +51 -0
  1187. package/dist/core/providers/call.js +480 -0
  1188. package/dist/core/providers/description.d.ts +34 -0
  1189. package/dist/core/providers/description.js +1 -0
  1190. package/dist/core/providers/device-libs.d.ts +71 -0
  1191. package/dist/core/providers/device-libs.js +202 -0
  1192. package/dist/core/providers/device.d.ts +42 -0
  1193. package/dist/core/providers/device.js +95 -0
  1194. package/dist/core/providers/errors.d.ts +99 -0
  1195. package/dist/core/providers/errors.js +136 -0
  1196. package/dist/core/providers/files.d.ts +90 -0
  1197. package/dist/core/providers/files.js +389 -0
  1198. package/dist/core/providers/inflight.d.ts +13 -0
  1199. package/dist/core/providers/inflight.js +14 -0
  1200. package/dist/core/providers/mint.d.ts +29 -0
  1201. package/dist/core/providers/mint.js +219 -0
  1202. package/dist/core/providers/receipts.d.ts +26 -0
  1203. package/dist/core/providers/receipts.js +61 -0
  1204. package/dist/core/providers/request.d.ts +27 -0
  1205. package/dist/core/providers/request.js +173 -0
  1206. package/dist/core/providers/roots.d.ts +23 -0
  1207. package/dist/core/providers/roots.js +118 -0
  1208. package/dist/core/providers/token-cache.d.ts +54 -0
  1209. package/dist/core/providers/token-cache.js +203 -0
  1210. package/dist/core/remote-canvas-target.d.ts +4 -0
  1211. package/dist/core/remote-canvas-target.js +30 -0
  1212. package/dist/core/review/comments.d.ts +69 -0
  1213. package/dist/core/review/comments.js +296 -0
  1214. package/dist/core/review/companion.d.ts +33 -0
  1215. package/dist/core/review/companion.js +208 -0
  1216. package/dist/core/review/signal.d.ts +5 -0
  1217. package/dist/core/review/signal.js +12 -0
  1218. package/dist/core/review/store.d.ts +44 -0
  1219. package/dist/core/review/store.js +178 -0
  1220. package/dist/core/review/types.d.ts +139 -0
  1221. package/dist/core/review/types.js +23 -0
  1222. package/dist/core/runs/activity.d.ts +11 -0
  1223. package/dist/core/runs/activity.js +57 -0
  1224. package/dist/core/runs/events.d.ts +41 -0
  1225. package/dist/core/runs/events.js +179 -0
  1226. package/dist/core/runs/operations.d.ts +85 -0
  1227. package/dist/core/runs/operations.js +741 -0
  1228. package/dist/core/runs/questions.d.ts +80 -0
  1229. package/dist/core/runs/questions.js +151 -0
  1230. package/dist/core/runtime/banner.d.ts +15 -0
  1231. package/dist/core/runtime/banner.js +53 -0
  1232. package/dist/core/runtime/bearings-render.d.ts +62 -0
  1233. package/dist/core/runtime/bearings-render.js +272 -0
  1234. package/dist/core/runtime/bearings.d.ts +56 -0
  1235. package/dist/core/runtime/bearings.js +199 -0
  1236. package/dist/core/runtime/bin-contributions.d.ts +44 -0
  1237. package/dist/core/runtime/bin-contributions.js +186 -0
  1238. package/dist/core/runtime/blaxel-environment.d.ts +2 -0
  1239. package/dist/core/runtime/blaxel-environment.js +8 -0
  1240. package/dist/core/runtime/broker/bash-job-launch.d.ts +12 -0
  1241. package/dist/core/runtime/broker/bash-job-launch.js +50 -0
  1242. package/dist/core/runtime/broker/model-adapter.d.ts +27 -0
  1243. package/dist/core/runtime/broker/model-adapter.js +413 -0
  1244. package/dist/core/runtime/broker/read-ops.d.ts +27 -0
  1245. package/dist/core/runtime/broker/read-ops.js +172 -0
  1246. package/dist/core/runtime/broker/turn-cause.d.ts +7 -0
  1247. package/dist/core/runtime/broker/turn-cause.js +30 -0
  1248. package/dist/core/runtime/broker-protocol.d.ts +727 -0
  1249. package/dist/core/runtime/broker-protocol.js +152 -0
  1250. package/dist/core/runtime/broker-request.d.ts +37 -0
  1251. package/dist/core/runtime/broker-request.js +86 -0
  1252. package/dist/core/runtime/broker-sdk.d.ts +36 -0
  1253. package/dist/core/runtime/broker-sdk.js +130 -0
  1254. package/dist/core/runtime/canvas-extensions.d.ts +34 -0
  1255. package/dist/core/runtime/canvas-extensions.js +100 -0
  1256. package/dist/core/runtime/close.d.ts +49 -0
  1257. package/dist/core/runtime/close.js +266 -0
  1258. package/dist/core/runtime/command-expansion.d.ts +19 -0
  1259. package/dist/core/runtime/command-expansion.js +104 -0
  1260. package/dist/core/runtime/command-surface.d.ts +38 -0
  1261. package/dist/core/runtime/command-surface.js +117 -0
  1262. package/dist/core/runtime/crtr-theme.d.ts +12 -0
  1263. package/dist/core/runtime/crtr-theme.js +146 -0
  1264. package/dist/core/runtime/deliver-live.d.ts +38 -0
  1265. package/dist/core/runtime/deliver-live.js +87 -0
  1266. package/dist/core/runtime/fault-recovery.d.ts +23 -0
  1267. package/dist/core/runtime/fault-recovery.js +83 -0
  1268. package/dist/core/runtime/fault.d.ts +6 -0
  1269. package/dist/core/runtime/fault.js +17 -0
  1270. package/dist/core/runtime/fleet.d.ts +106 -0
  1271. package/dist/core/runtime/fleet.js +75 -0
  1272. package/dist/core/runtime/focus-viewer.d.ts +45 -0
  1273. package/dist/core/runtime/focus-viewer.js +151 -0
  1274. package/dist/core/runtime/front-door-env.d.ts +5 -0
  1275. package/dist/core/runtime/front-door-env.js +16 -0
  1276. package/dist/core/runtime/headless-pi.d.ts +37 -0
  1277. package/dist/core/runtime/headless-pi.js +173 -0
  1278. package/dist/core/runtime/host.d.ts +74 -0
  1279. package/dist/core/runtime/host.js +695 -0
  1280. package/dist/core/runtime/interactive-deliver.d.ts +22 -0
  1281. package/dist/core/runtime/interactive-deliver.js +51 -0
  1282. package/dist/core/runtime/invocation.d.ts +15 -0
  1283. package/dist/core/runtime/invocation.js +10 -0
  1284. package/dist/core/runtime/kickoff.d.ts +37 -0
  1285. package/dist/core/runtime/kickoff.js +263 -0
  1286. package/dist/core/runtime/launch-prompt.d.ts +8 -0
  1287. package/dist/core/runtime/launch-prompt.js +13 -0
  1288. package/dist/core/runtime/launch-target.d.ts +43 -0
  1289. package/dist/core/runtime/launch-target.js +83 -0
  1290. package/dist/core/runtime/launch.d.ts +206 -0
  1291. package/dist/core/runtime/launch.js +498 -0
  1292. package/dist/core/runtime/ledger.d.ts +10 -0
  1293. package/dist/core/runtime/ledger.js +55 -0
  1294. package/dist/core/runtime/lifecycle.d.ts +47 -0
  1295. package/dist/core/runtime/lifecycle.js +283 -0
  1296. package/dist/core/runtime/managed-provider-cooling.d.ts +24 -0
  1297. package/dist/core/runtime/managed-provider-cooling.js +62 -0
  1298. package/dist/core/runtime/memory-admission.d.ts +38 -0
  1299. package/dist/core/runtime/memory-admission.js +68 -0
  1300. package/dist/core/runtime/model-registry.d.ts +3 -0
  1301. package/dist/core/runtime/model-registry.js +13 -0
  1302. package/dist/core/runtime/model-selection.d.ts +54 -0
  1303. package/dist/core/runtime/model-selection.js +135 -0
  1304. package/dist/core/runtime/model-swap.d.ts +26 -0
  1305. package/dist/core/runtime/model-swap.js +75 -0
  1306. package/dist/core/runtime/naming.d.ts +69 -0
  1307. package/dist/core/runtime/naming.js +298 -0
  1308. package/dist/core/runtime/nerd-font.d.ts +46 -0
  1309. package/dist/core/runtime/nerd-font.js +162 -0
  1310. package/dist/core/runtime/nodes.d.ts +140 -0
  1311. package/dist/core/runtime/nodes.js +506 -0
  1312. package/dist/core/runtime/outcome-document.d.ts +58 -0
  1313. package/dist/core/runtime/outcome-document.js +86 -0
  1314. package/dist/core/runtime/output-result.d.ts +15 -0
  1315. package/dist/core/runtime/output-result.js +32 -0
  1316. package/dist/core/runtime/output-schema-refs.d.ts +3 -0
  1317. package/dist/core/runtime/output-schema-refs.js +100 -0
  1318. package/dist/core/runtime/package-health.d.ts +34 -0
  1319. package/dist/core/runtime/package-health.js +100 -0
  1320. package/dist/core/runtime/persona.d.ts +21 -0
  1321. package/dist/core/runtime/persona.js +54 -0
  1322. package/dist/core/runtime/pi-cli.d.ts +8 -0
  1323. package/dist/core/runtime/pi-cli.js +65 -0
  1324. package/dist/core/runtime/pi-vendored.d.ts +28 -0
  1325. package/dist/core/runtime/pi-vendored.js +63 -0
  1326. package/dist/core/runtime/placement-tmux.d.ts +32 -0
  1327. package/dist/core/runtime/placement-tmux.js +81 -0
  1328. package/dist/core/runtime/placement.d.ts +116 -0
  1329. package/dist/core/runtime/placement.js +418 -0
  1330. package/dist/core/runtime/progress-bar.d.ts +13 -0
  1331. package/dist/core/runtime/progress-bar.js +50 -0
  1332. package/dist/core/runtime/provider-credential-gate.d.ts +8 -0
  1333. package/dist/core/runtime/provider-credential-gate.js +33 -0
  1334. package/dist/core/runtime/recovery-hold.d.ts +21 -0
  1335. package/dist/core/runtime/recovery-hold.js +46 -0
  1336. package/dist/core/runtime/reopen.d.ts +49 -0
  1337. package/dist/core/runtime/reopen.js +160 -0
  1338. package/dist/core/runtime/revive.d.ts +114 -0
  1339. package/dist/core/runtime/revive.js +739 -0
  1340. package/dist/core/runtime/roadmap.d.ts +24 -0
  1341. package/dist/core/runtime/roadmap.js +86 -0
  1342. package/dist/core/runtime/runner/blaxel/client.d.ts +83 -0
  1343. package/dist/core/runtime/runner/blaxel/client.js +140 -0
  1344. package/dist/core/runtime/runner/blaxel/image-build.d.ts +74 -0
  1345. package/dist/core/runtime/runner/blaxel/image-build.js +209 -0
  1346. package/dist/core/runtime/runner/index.d.ts +9 -0
  1347. package/dist/core/runtime/runner/index.js +37 -0
  1348. package/dist/core/runtime/runner/machine/call.d.ts +8 -0
  1349. package/dist/core/runtime/runner/machine/call.js +67 -0
  1350. package/dist/core/runtime/runner/machine/environment.d.ts +1 -0
  1351. package/dist/core/runtime/runner/machine/environment.js +7 -0
  1352. package/dist/core/runtime/runner/machine/ops.d.ts +127 -0
  1353. package/dist/core/runtime/runner/machine/ops.js +41 -0
  1354. package/dist/core/runtime/runner/machine/runner.d.ts +12 -0
  1355. package/dist/core/runtime/runner/machine/runner.js +90 -0
  1356. package/dist/core/runtime/runner/process.d.ts +11 -0
  1357. package/dist/core/runtime/runner/process.js +70 -0
  1358. package/dist/core/runtime/runner/types.d.ts +101 -0
  1359. package/dist/core/runtime/runner/types.js +16 -0
  1360. package/dist/core/runtime/session-branch.d.ts +7 -0
  1361. package/dist/core/runtime/session-branch.js +16 -0
  1362. package/dist/core/runtime/session-cycles.d.ts +45 -0
  1363. package/dist/core/runtime/session-cycles.js +110 -0
  1364. package/dist/core/runtime/session-list-cache.d.ts +37 -0
  1365. package/dist/core/runtime/session-list-cache.js +302 -0
  1366. package/dist/core/runtime/session-visibility.d.ts +37 -0
  1367. package/dist/core/runtime/session-visibility.js +99 -0
  1368. package/dist/core/runtime/setup-marker.d.ts +8 -0
  1369. package/dist/core/runtime/setup-marker.js +46 -0
  1370. package/dist/core/runtime/situational-context.d.ts +16 -0
  1371. package/dist/core/runtime/situational-context.js +54 -0
  1372. package/dist/core/runtime/situational-live.d.ts +9 -0
  1373. package/dist/core/runtime/situational-live.js +41 -0
  1374. package/dist/core/runtime/spawn-env-rows.d.ts +5 -0
  1375. package/dist/core/runtime/spawn-env-rows.js +15 -0
  1376. package/dist/core/runtime/spawn-env.d.ts +40 -0
  1377. package/dist/core/runtime/spawn-env.js +260 -0
  1378. package/dist/core/runtime/spawn.d.ts +160 -0
  1379. package/dist/core/runtime/spawn.js +699 -0
  1380. package/dist/core/runtime/stamp/protocol.d.ts +90 -0
  1381. package/dist/core/runtime/stamp/protocol.js +113 -0
  1382. package/dist/core/runtime/start-check.d.ts +15 -0
  1383. package/dist/core/runtime/start-check.js +31 -0
  1384. package/dist/core/runtime/stop-guard.d.ts +31 -0
  1385. package/dist/core/runtime/stop-guard.js +150 -0
  1386. package/dist/core/runtime/structured-output.d.ts +36 -0
  1387. package/dist/core/runtime/structured-output.js +112 -0
  1388. package/dist/core/runtime/surface-bg.d.ts +13 -0
  1389. package/dist/core/runtime/surface-bg.js +85 -0
  1390. package/dist/core/runtime/tmux-bindings.d.ts +30 -0
  1391. package/dist/core/runtime/tmux-bindings.js +743 -0
  1392. package/dist/core/runtime/tmux-chrome.d.ts +2 -0
  1393. package/dist/core/runtime/tmux-chrome.js +5 -0
  1394. package/dist/core/runtime/tmux-driver.d.ts +328 -0
  1395. package/dist/core/runtime/tmux-driver.js +713 -0
  1396. package/dist/core/runtime/unsandboxed.d.ts +3 -0
  1397. package/dist/core/runtime/unsandboxed.js +16 -0
  1398. package/dist/core/runtime/view-socket.d.ts +61 -0
  1399. package/dist/core/runtime/view-socket.js +194 -0
  1400. package/dist/core/runtime/warm-pool.d.ts +79 -0
  1401. package/dist/core/runtime/warm-pool.js +473 -0
  1402. package/dist/core/scoped-state/db.d.ts +17 -0
  1403. package/dist/core/scoped-state/db.js +261 -0
  1404. package/dist/core/scoped-state/legacy-profiles.d.ts +11 -0
  1405. package/dist/core/scoped-state/legacy-profiles.js +61 -0
  1406. package/dist/core/scoped-state/migrate.d.ts +15 -0
  1407. package/dist/core/scoped-state/migrate.js +332 -0
  1408. package/dist/core/scoped-state/person-rows.d.ts +10 -0
  1409. package/dist/core/scoped-state/person-rows.js +173 -0
  1410. package/dist/core/scoped-state/schema.d.ts +10 -0
  1411. package/dist/core/scoped-state/schema.js +47 -0
  1412. package/dist/core/scopes.d.ts +20 -0
  1413. package/dist/core/scopes.js +48 -0
  1414. package/dist/core/secrets/env-rows.d.ts +18 -0
  1415. package/dist/core/secrets/env-rows.js +40 -0
  1416. package/dist/core/secrets/environment-owner.d.ts +8 -0
  1417. package/dist/core/secrets/environment-owner.js +31 -0
  1418. package/dist/core/secrets/environment-secrets.d.ts +14 -0
  1419. package/dist/core/secrets/environment-secrets.js +14 -0
  1420. package/dist/core/secrets/index.d.ts +2 -0
  1421. package/dist/core/secrets/index.js +2 -0
  1422. package/dist/core/secrets/key.d.ts +3 -0
  1423. package/dist/core/secrets/key.js +33 -0
  1424. package/dist/core/secrets/seal.d.ts +18 -0
  1425. package/dist/core/secrets/seal.js +43 -0
  1426. package/dist/core/secrets.d.ts +50 -0
  1427. package/dist/core/secrets.js +147 -0
  1428. package/dist/core/self-update.d.ts +27 -0
  1429. package/dist/core/self-update.js +77 -0
  1430. package/dist/core/session-model/session-state.d.ts +53 -0
  1431. package/dist/core/session-model/session-state.js +180 -0
  1432. package/dist/core/shell-segments.d.ts +42 -0
  1433. package/dist/core/shell-segments.js +169 -0
  1434. package/dist/core/spaces/cache-env.d.ts +2 -0
  1435. package/dist/core/spaces/cache-env.js +15 -0
  1436. package/dist/core/spaces/file-root.d.ts +23 -0
  1437. package/dist/core/spaces/file-root.js +68 -0
  1438. package/dist/core/spaces/mounts.d.ts +41 -0
  1439. package/dist/core/spaces/mounts.js +126 -0
  1440. package/dist/core/spaces/permissions.d.ts +19 -0
  1441. package/dist/core/spaces/permissions.js +77 -0
  1442. package/dist/core/spaces/process.d.ts +61 -0
  1443. package/dist/core/spaces/process.js +172 -0
  1444. package/dist/core/spaces/runtime-home.d.ts +5 -0
  1445. package/dist/core/spaces/runtime-home.js +8 -0
  1446. package/dist/core/spaces/space.d.ts +9 -0
  1447. package/dist/core/spaces/space.js +58 -0
  1448. package/dist/core/spaces/stop.d.ts +24 -0
  1449. package/dist/core/spaces/stop.js +138 -0
  1450. package/dist/core/spaces/users.d.ts +20 -0
  1451. package/dist/core/spaces/users.js +43 -0
  1452. package/dist/core/sqlite-statements.d.ts +4 -0
  1453. package/dist/core/sqlite-statements.js +17 -0
  1454. package/dist/core/statements.d.ts +17 -0
  1455. package/dist/core/statements.js +81 -0
  1456. package/dist/core/storage/attachments.d.ts +36 -0
  1457. package/dist/core/storage/attachments.js +135 -0
  1458. package/dist/core/storage/client.d.ts +109 -0
  1459. package/dist/core/storage/client.js +231 -0
  1460. package/dist/core/storage/download.d.ts +24 -0
  1461. package/dist/core/storage/download.js +184 -0
  1462. package/dist/core/storage/purge.d.ts +6 -0
  1463. package/dist/core/storage/purge.js +52 -0
  1464. package/dist/core/storage/tables.d.ts +67 -0
  1465. package/dist/core/storage/tables.js +109 -0
  1466. package/dist/core/subscription-state.d.ts +96 -0
  1467. package/dist/core/subscription-state.js +438 -0
  1468. package/dist/core/substrate/delivery/corpus.d.ts +26 -0
  1469. package/dist/core/substrate/delivery/corpus.js +138 -0
  1470. package/dist/core/substrate/delivery/deliver.d.ts +71 -0
  1471. package/dist/core/substrate/delivery/deliver.js +333 -0
  1472. package/dist/core/substrate/delivery/listings.d.ts +30 -0
  1473. package/dist/core/substrate/delivery/listings.js +75 -0
  1474. package/dist/core/substrate/delivery/match.d.ts +28 -0
  1475. package/dist/core/substrate/delivery/match.js +146 -0
  1476. package/dist/core/substrate/delivery/plan.d.ts +57 -0
  1477. package/dist/core/substrate/delivery/plan.js +126 -0
  1478. package/dist/core/substrate/delivery/render-boot.d.ts +20 -0
  1479. package/dist/core/substrate/delivery/render-boot.js +329 -0
  1480. package/dist/core/substrate/delivery/render-event.d.ts +47 -0
  1481. package/dist/core/substrate/delivery/render-event.js +160 -0
  1482. package/dist/core/substrate/delivery/sub-persona-menu.d.ts +2 -0
  1483. package/dist/core/substrate/delivery/sub-persona-menu.js +24 -0
  1484. package/dist/core/substrate/delivery/types.d.ts +30 -0
  1485. package/dist/core/substrate/delivery/types.js +1 -0
  1486. package/dist/core/substrate/gate-explain.d.ts +35 -0
  1487. package/dist/core/substrate/gate-explain.js +397 -0
  1488. package/dist/core/substrate/schema.d.ts +29 -0
  1489. package/dist/core/substrate/schema.js +81 -0
  1490. package/dist/core/substrate/subject-fields.d.ts +52 -0
  1491. package/dist/core/substrate/subject-fields.js +39 -0
  1492. package/dist/core/substrate/subject.d.ts +13 -0
  1493. package/dist/core/substrate/subject.js +60 -0
  1494. package/dist/core/termrender/code-doc.d.ts +12 -0
  1495. package/dist/core/termrender/code-doc.js +92 -0
  1496. package/dist/core/termrender/display.d.ts +16 -0
  1497. package/dist/core/termrender/display.js +56 -0
  1498. package/dist/core/termrender/termrender.d.ts +71 -0
  1499. package/dist/core/termrender/termrender.js +719 -0
  1500. package/dist/core/termrender/version.d.ts +1 -0
  1501. package/dist/core/termrender/version.js +1 -0
  1502. package/dist/core/timing.d.ts +11 -0
  1503. package/dist/core/timing.js +94 -0
  1504. package/dist/core/tui/draw.d.ts +103 -0
  1505. package/dist/core/tui/draw.js +378 -0
  1506. package/dist/core/tui/fuzzy.d.ts +9 -0
  1507. package/dist/core/tui/fuzzy.js +38 -0
  1508. package/dist/core/tui/markdown.d.ts +17 -0
  1509. package/dist/core/tui/markdown.js +407 -0
  1510. package/dist/core/tui/page-host.d.ts +31 -0
  1511. package/dist/core/tui/page-host.js +74 -0
  1512. package/dist/core/tui/panel.d.ts +45 -0
  1513. package/dist/core/tui/panel.js +142 -0
  1514. package/dist/core/tui/terminal.d.ts +23 -0
  1515. package/dist/core/tui/terminal.js +100 -0
  1516. package/dist/core/wake.d.ts +89 -0
  1517. package/dist/core/wake.js +296 -0
  1518. package/dist/core/worktree-containment.d.ts +14 -0
  1519. package/dist/core/worktree-containment.js +48 -0
  1520. package/dist/core/worktree-landing.d.ts +44 -0
  1521. package/dist/core/worktree-landing.js +56 -0
  1522. package/dist/core/worktree-mutation-async.d.ts +23 -0
  1523. package/dist/core/worktree-mutation-async.js +335 -0
  1524. package/dist/core/worktree-remove.d.ts +15 -0
  1525. package/dist/core/worktree-remove.js +84 -0
  1526. package/dist/core/worktree.d.ts +121 -0
  1527. package/dist/core/worktree.js +909 -0
  1528. package/dist/daemon/api/deferred-head.d.ts +14 -0
  1529. package/dist/daemon/api/deferred-head.js +117 -0
  1530. package/dist/daemon/api/environment-of.d.ts +18 -0
  1531. package/dist/daemon/api/environment-of.js +40 -0
  1532. package/dist/daemon/api/handlers/git-credential.d.ts +11 -0
  1533. package/dist/daemon/api/handlers/git-credential.js +64 -0
  1534. package/dist/daemon/api/handlers/providers.d.ts +83 -0
  1535. package/dist/daemon/api/handlers/providers.js +283 -0
  1536. package/dist/daemon/api/handlers/validate.d.ts +23 -0
  1537. package/dist/daemon/api/handlers/validate.js +58 -0
  1538. package/dist/daemon/api/map.d.ts +167 -0
  1539. package/dist/daemon/api/map.js +764 -0
  1540. package/dist/daemon/api/operations.d.ts +18 -0
  1541. package/dist/daemon/api/operations.js +306 -0
  1542. package/dist/daemon/api/principal.d.ts +65 -0
  1543. package/dist/daemon/api/principal.js +143 -0
  1544. package/dist/daemon/api/reader.d.ts +24 -0
  1545. package/dist/daemon/api/reader.js +123 -0
  1546. package/dist/daemon/api/router.d.ts +193 -0
  1547. package/dist/daemon/api/router.js +536 -0
  1548. package/dist/daemon/api/sync-notice.d.ts +17 -0
  1549. package/dist/daemon/api/sync-notice.js +46 -0
  1550. package/dist/daemon/api/viewer-presence.d.ts +20 -0
  1551. package/dist/daemon/api/viewer-presence.js +100 -0
  1552. package/dist/daemon/broker-signals/bus.d.ts +3 -2
  1553. package/dist/daemon/broker-signals/bus.js +3 -2
  1554. package/dist/daemon/companion-retire.d.ts +4 -0
  1555. package/dist/daemon/companion-retire.js +44 -0
  1556. package/dist/daemon/control.d.ts +40 -0
  1557. package/dist/daemon/control.js +22 -0
  1558. package/dist/daemon/cron/authority.d.ts +38 -0
  1559. package/dist/daemon/cron/authority.js +90 -0
  1560. package/dist/daemon/cron/live-runs.d.ts +54 -0
  1561. package/dist/daemon/cron/live-runs.js +66 -0
  1562. package/dist/daemon/cron/run-socket.d.ts +30 -0
  1563. package/dist/daemon/cron/run-socket.js +170 -0
  1564. package/dist/daemon/drain.d.ts +25 -0
  1565. package/dist/daemon/drain.js +76 -0
  1566. package/dist/daemon/human/finish.d.ts +24 -0
  1567. package/dist/daemon/human/finish.js +178 -0
  1568. package/dist/daemon/human/settle.d.ts +44 -0
  1569. package/dist/daemon/human/settle.js +103 -0
  1570. package/dist/daemon/machine-link/config.d.ts +45 -0
  1571. package/dist/daemon/machine-link/config.js +63 -0
  1572. package/dist/daemon/machine-link/credential.d.ts +7 -0
  1573. package/dist/daemon/machine-link/credential.js +24 -0
  1574. package/dist/daemon/machine-link/forward.d.ts +16 -0
  1575. package/dist/daemon/machine-link/forward.js +181 -0
  1576. package/dist/daemon/machine-link/frames.d.ts +49 -0
  1577. package/dist/daemon/machine-link/frames.js +25 -0
  1578. package/dist/daemon/machine-link/holder.d.ts +73 -0
  1579. package/dist/daemon/machine-link/holder.js +272 -0
  1580. package/dist/daemon/machine-link/move-notify.d.ts +4 -0
  1581. package/dist/daemon/machine-link/move-notify.js +15 -0
  1582. package/dist/daemon/manage.d.ts +19 -3
  1583. package/dist/daemon/manage.js +21 -6
  1584. package/dist/daemon/park-activity.d.ts +10 -0
  1585. package/dist/daemon/park-activity.js +33 -0
  1586. package/dist/daemon/park-pending.d.ts +25 -0
  1587. package/dist/daemon/park-pending.js +76 -0
  1588. package/dist/daemon/postgres/binary.d.ts +17 -0
  1589. package/dist/daemon/postgres/binary.js +193 -0
  1590. package/dist/daemon/postgres/cluster.d.ts +37 -0
  1591. package/dist/daemon/postgres/cluster.js +111 -0
  1592. package/dist/daemon/postgres/pins.d.ts +7 -0
  1593. package/dist/daemon/postgres/pins.js +16 -0
  1594. package/dist/daemon/postgres/supervisor.d.ts +95 -0
  1595. package/dist/daemon/postgres/supervisor.js +177 -0
  1596. package/dist/daemon/readiness.d.ts +11 -0
  1597. package/dist/daemon/readiness.js +37 -0
  1598. package/dist/daemon/reconcilers/broker-supervision.d.ts +112 -0
  1599. package/dist/daemon/reconcilers/broker-supervision.js +842 -0
  1600. package/dist/daemon/reconcilers/ledger-sandbox.d.ts +54 -0
  1601. package/dist/daemon/reconcilers/ledger-sandbox.js +249 -0
  1602. package/dist/daemon/reconcilers/live-obligation.d.ts +77 -0
  1603. package/dist/daemon/reconcilers/live-obligation.js +114 -0
  1604. package/dist/daemon/reconcilers/node-lifecycle/launch-failure.d.ts +1 -0
  1605. package/dist/daemon/reconcilers/node-lifecycle/launch-failure.js +8 -0
  1606. package/dist/daemon/reconcilers/node-lifecycle/node-person.d.ts +9 -0
  1607. package/dist/daemon/reconcilers/node-lifecycle/node-person.js +40 -0
  1608. package/dist/daemon/reconcilers/node-lifecycle/remote-wake.d.ts +32 -0
  1609. package/dist/daemon/reconcilers/node-lifecycle/remote-wake.js +124 -0
  1610. package/dist/daemon/reconcilers/recipe-image.d.ts +49 -0
  1611. package/dist/daemon/reconcilers/recipe-image.js +145 -0
  1612. package/dist/daemon/reconcilers/throttled-lane.d.ts +11 -0
  1613. package/dist/daemon/reconcilers/throttled-lane.js +63 -0
  1614. package/dist/daemon/runs/append-section.d.ts +9 -0
  1615. package/dist/daemon/runs/append-section.js +135 -0
  1616. package/dist/daemon/runs/observer.d.ts +17 -0
  1617. package/dist/daemon/runs/observer.js +441 -0
  1618. package/dist/daemon/runs/view-transport.d.ts +19 -0
  1619. package/dist/daemon/runs/view-transport.js +81 -0
  1620. package/dist/daemon/structured-requests/sidecar.d.ts +4 -0
  1621. package/dist/daemon/structured-requests/sidecar.js +5 -0
  1622. package/dist/hook-authoring.d.ts +130 -0
  1623. package/dist/hook-authoring.js +447 -0
  1624. package/dist/hook-process.d.ts +7 -0
  1625. package/dist/hook-process.js +34 -0
  1626. package/dist/launcher/client.d.ts +6 -0
  1627. package/dist/launcher/client.js +52 -0
  1628. package/dist/launcher/limits/policy.d.ts +141 -0
  1629. package/dist/launcher/limits/policy.js +142 -0
  1630. package/dist/launcher/limits/settings.d.ts +19 -0
  1631. package/dist/launcher/limits/settings.js +94 -0
  1632. package/dist/launcher/spec.d.ts +181 -0
  1633. package/dist/launcher/spec.js +10 -0
  1634. package/dist/migrations/004-canvas-documents/apply.d.ts +8 -0
  1635. package/dist/migrations/004-canvas-documents/apply.js +113 -0
  1636. package/dist/migrations/004-canvas-documents/fields.d.ts +24 -0
  1637. package/dist/migrations/004-canvas-documents/fields.js +52 -0
  1638. package/dist/migrations/004-canvas-documents/index.d.ts +16 -0
  1639. package/dist/migrations/004-canvas-documents/index.js +88 -0
  1640. package/dist/migrations/004-canvas-documents/legacy/discover.d.ts +16 -0
  1641. package/dist/migrations/004-canvas-documents/legacy/discover.js +251 -0
  1642. package/dist/migrations/004-canvas-documents/legacy/history.d.ts +5 -0
  1643. package/dist/migrations/004-canvas-documents/legacy/history.js +37 -0
  1644. package/dist/migrations/004-canvas-documents/legacy/nested.d.ts +7 -0
  1645. package/dist/migrations/004-canvas-documents/legacy/nested.js +37 -0
  1646. package/dist/migrations/004-canvas-documents/legacy/parse.d.ts +14 -0
  1647. package/dist/migrations/004-canvas-documents/legacy/parse.js +24 -0
  1648. package/dist/migrations/004-canvas-documents/legacy/types.d.ts +91 -0
  1649. package/dist/migrations/004-canvas-documents/legacy/types.js +3 -0
  1650. package/dist/migrations/004-canvas-documents/plan.d.ts +102 -0
  1651. package/dist/migrations/004-canvas-documents/plan.js +410 -0
  1652. package/dist/migrations/004-canvas-documents/pointers.d.ts +23 -0
  1653. package/dist/migrations/004-canvas-documents/pointers.js +95 -0
  1654. package/dist/migrations/activation.d.ts +17 -0
  1655. package/dist/migrations/activation.js +46 -0
  1656. package/dist/shared/crtr-version.d.ts +2 -0
  1657. package/dist/shared/crtr-version.js +18 -0
  1658. package/dist/shared/inbox-entry-body.js +6 -2
  1659. package/dist/shared/inline-ref-grammar.d.ts +53 -0
  1660. package/dist/shared/inline-ref-grammar.js +99 -0
  1661. package/dist/shared/shell-quote.d.ts +3 -0
  1662. package/dist/shared/shell-quote.js +5 -0
  1663. package/dist/shared/strip-cd-prefix.d.ts +1 -0
  1664. package/dist/shared/strip-cd-prefix.js +13 -0
  1665. package/dist/shared/tool-groups.d.ts +26 -0
  1666. package/dist/shared/tool-groups.js +64 -0
  1667. package/dist/shared/traceparent.d.ts +6 -0
  1668. package/dist/shared/traceparent.js +28 -0
  1669. package/dist/shared/turn-replies.d.ts +27 -0
  1670. package/dist/shared/turn-replies.js +71 -0
  1671. package/package.json +1 -1
@@ -0,0 +1,2108 @@
1
+ // render/chat-view.ts — the render half of `crtr surface attach`.
2
+ //
3
+ // A direct port of pi's `InteractiveMode.handleEvent()`
4
+ // (interactive-mode.js:2169-2462) + its rebuild path
5
+ // (`addMessageToChat`/`renderSessionContext`, :2483-2648) that DRIVES pi's own
6
+ // exported TUI components rather than reimplementing them. The viewer never
7
+ // spawns pi and never opens the session — it only consumes the relayed
8
+ // `AgentSessionEvent` stream + the `welcome` snapshot over `view.sock`.
9
+ //
10
+ // Ownership boundary: ChatView owns the chat scroll `Container` it is handed.
11
+ // Its activity state (working spinner, compaction/retry indicators) is signaled
12
+ // to the viewer-owned fixed slot when one is supplied. It does NOT own the
13
+ // editor, the footer, or the terminal title — those are chrome laid out by the
14
+ // attach command. Events that only affect that chrome
15
+ // (queue_update / session_info_changed / thinking_level_changed) are forwarded
16
+ // to the optional `onFooterEvent` sink instead of rendered here.
17
+ //
18
+ // Custom-tool rendering: extensions run in the broker, so the viewer generally
19
+ // has no extension `ToolDefinition`. The viewer supplies native renderers only
20
+ // for crouter-owned message/tool types it understands; other extension
21
+ // `renderCall`/`renderResult` hooks degrade to the default ToolExecutionComponent
22
+ // path while builtin tools, diffs, and partial-result streaming keep working.
23
+ import { Container, Loader, Spacer, Text } from '@earendil-works/pi-tui';
24
+ import { AssistantMessageComponent, BashExecutionComponent, BranchSummaryMessageComponent, CompactionSummaryMessageComponent, CustomMessageComponent, parseSkillBlock, SkillInvocationMessageComponent, ToolExecutionComponent, UserMessageComponent, } from '@earendil-works/pi-coding-agent';
25
+ import { attachMarkdownTheme } from '../config.js';
26
+ import { ContextMessageComponent } from './context-message.js';
27
+ import { presentationFor } from './card-presentation.js';
28
+ import { detectInlinePageResult, PageBlockComponent } from './page-block.js';
29
+ import { CRTR_OUTPUT_CUSTOM_TYPE, CrtrOutputMessageComponent, createCrtrBashToolDefinition, } from './crtr-output.js';
30
+ import { CRTR_CYCLE_DIVIDER_CUSTOM_TYPE, endedByAbort } from '../../../core/runtime/session-cycles.js';
31
+ import { isHumanWordsEntry, parseCard } from '../../../shared/generated-context.js';
32
+ import { assistantVisibleText, isGroupBoundaryKind, isTrueUserMessage, } from '../../../shared/tool-groups.js';
33
+ import { messageKey, normalizeTurnReplyRecord, START_TURN_KEY, turnReplyText, } from '../../../shared/turn-replies.js';
34
+ import { isCycleDivider } from './condensed-history.js';
35
+ import { transformDiagramFences } from './diagram.js';
36
+ import { styleAttachAgentMarkdown, styleAttachMarkdownSource, styleAttachMessageMarkdown, styleAttachSummaryMarkdown, } from './markdown-source.js';
37
+ import { createCrtrEditToolDefinition } from './edit-diff.js';
38
+ import { GroupActivityRecorder } from './group-activity.js';
39
+ import { GroupRecapComponent } from './group-recap.js';
40
+ import { FoldedToolCallController, bashCallBackgroundHintLines, createCrtrPlainBashToolDefinition, createCrtrReadToolDefinition, createCrtrWriteToolDefinition, } from './tool-calls.js';
41
+ import { ringCompletionBell } from '../chrome/completion-bell.js';
42
+ import { extractFilePaths } from '../../../core/human/visible-paths.js';
43
+ import { extractDocRefs } from './doc-links.js';
44
+ import { keepWhenCondensed, liveRegionStart } from './condensed-history.js';
45
+ import { ViewerAssistantMessageComponent } from './assistant-message.js';
46
+ import { CompositeViewportSource, MeasuredContainer, } from './measured-container.js';
47
+ import { readConfig, updateRawConfigAtomically } from '../../../core/config.js';
48
+ import { DEFAULT_CONDENSED_HISTORY, DEFAULT_LIVE_CYCLES } from '../../../types.js';
49
+ 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';
50
+ /** Theme-derived chrome colors (spinner / dim / error) are supplied by the
51
+ * attach command via `ChatViewOptions.palette` (built from the live theme in
52
+ * config.ts). pi does not re-export the raw `theme` instance, so standalone
53
+ * ChatViews receive the same semantic ANSI fallback palette. The message components
54
+ * use the attach Markdown theme, which preserves the user's pi theme while making
55
+ * fenced code visually distinct. */
56
+ const defaultDimStyle = (s) => `\x1b[2m${s}\x1b[22m`;
57
+ /** How many catch-up messages `applySnapshot` builds between event-loop yields.
58
+ * Keeps large non-streaming snapshots from monopolizing the main thread so
59
+ * queued keystrokes are serviced during construction. */
60
+ const SNAPSHOT_YIELD_EVERY = 50;
61
+ /** The user's `live_cycles` setting — how many trailing refresh-yield cycles the
62
+ * transcript renders at full fidelity. Read per ChatView (i.e. per attach), so
63
+ * `crtr sys config set live_cycles --value N` takes effect on the next attach
64
+ * without a daemon restart. A missing/unreadable config falls back to the
65
+ * shipped default. */
66
+ function readLiveCycles() {
67
+ try {
68
+ return readConfig('user').live_cycles;
69
+ }
70
+ catch {
71
+ return DEFAULT_LIVE_CYCLES;
72
+ }
73
+ }
74
+ /** The user's `condensed_history` setting — which messages of an already-condensed
75
+ * cycle still render (the cycle dividers always do). Read per attach, like
76
+ * `live_cycles`. */
77
+ function readCondensedHistory() {
78
+ try {
79
+ return readConfig('user').condensed_history;
80
+ }
81
+ catch {
82
+ return DEFAULT_CONDENSED_HISTORY;
83
+ }
84
+ }
85
+ /** The user's `fold_finished_tools` setting — the persisted starting state of the
86
+ * fold view setting. Toggling it in a viewer writes it back (`persistFoldFinishedTools`),
87
+ * so the choice carries into later chats and later viewers. */
88
+ function readFoldFinishedTools() {
89
+ try {
90
+ return readConfig('user').fold_finished_tools;
91
+ }
92
+ catch {
93
+ return false;
94
+ }
95
+ }
96
+ /** Whether this attach should start folded tool groups on their broker-generated
97
+ * summaries. The setting is deliberately attach-local: the broker remains the
98
+ * single summary producer and every viewer independently chooses its display. */
99
+ function readSummarizeToolCalls() {
100
+ try {
101
+ return readConfig('user').summarize_tool_calls;
102
+ }
103
+ catch {
104
+ return false;
105
+ }
106
+ }
107
+ /** Whether folded tool recaps list their actual activity or use compact counts.
108
+ * The detailed form is the default; each attach reads its own presentation choice. */
109
+ function readDetailedToolRecaps() {
110
+ try {
111
+ return readConfig('user').detailed_tool_recaps;
112
+ }
113
+ catch {
114
+ return true;
115
+ }
116
+ }
117
+ /** The `consolidate_replies` experiment: fold each turn behind one reply. Read
118
+ * per attach. */
119
+ function readConsolidateReplies() {
120
+ try {
121
+ return readConfig('user').consolidate_replies;
122
+ }
123
+ catch {
124
+ return false;
125
+ }
126
+ }
127
+ /** Persist the fold view setting to user config. Best-effort: a viewer must never
128
+ * die because the config file is unwritable — the in-viewer toggle still applies. */
129
+ async function persistFoldFinishedTools(value) {
130
+ try {
131
+ await updateRawConfigAtomically('user', (latest) => ({ ...latest, fold_finished_tools: value }));
132
+ }
133
+ catch {
134
+ // ignored — the fold still applies to this viewer.
135
+ }
136
+ }
137
+ /** A component supports the Ctrl+O global tool-output toggle. Mirrors pi's
138
+ * `isExpandable` duck-type (interactive-mode.js): any rendered child carrying a
139
+ * `setExpanded(boolean)` method — tool executions, custom/compaction/branch/skill
140
+ * message components — participates; everything else (the status container, plain
141
+ * text, assistant/user bubbles) is skipped. */
142
+ function isExpandable(obj) {
143
+ return (typeof obj === 'object' &&
144
+ obj !== null &&
145
+ 'setExpanded' in obj &&
146
+ typeof obj.setExpanded === 'function');
147
+ }
148
+ /** Every SGR escape, for measuring a line's visible content. */
149
+ const ANSI_RE = /\x1b\[[0-9;]*m/g;
150
+ /** Same match, with the SGR parameter list captured for rewriting. */
151
+ const SGR_PARAMS_RE = /\x1b\[([0-9;]*)m/g;
152
+ /** Drop every background-color SGR parameter from a line, keeping foreground and
153
+ * text styles. The minimized fold is a dense index of what ran, so the tool's
154
+ * pending/success/error background band (pi paints it across the full pane width)
155
+ * reads as noise there — one call per line, unhighlighted. `0` (full reset) is
156
+ * kept: it clears the background too, and nothing follows it to re-set one. */
157
+ function stripBackground(line) {
158
+ return line.replace(SGR_PARAMS_RE, (_whole, params) => {
159
+ const parts = params.split(';');
160
+ const kept = [];
161
+ for (let i = 0; i < parts.length; i++) {
162
+ const code = Number(parts[i] === '' ? 0 : parts[i]);
163
+ // Extended colors (`38` foreground, `48` background, `58` underline):
164
+ // consume the full sequence atomically so an RGB channel in the 40-47 or
165
+ // 100-107 range is not mistaken for a standalone background code.
166
+ if (code === 38 || code === 48 || code === 58) {
167
+ const mode = Number(parts[i + 1]);
168
+ const end = i + (mode === 5 ? 2 : mode === 2 ? 4 : 1);
169
+ if (code !== 48)
170
+ kept.push(...parts.slice(i, end + 1));
171
+ i = end;
172
+ continue;
173
+ }
174
+ // Standard (40-47) and bright (100-107) backgrounds. `49` (reset to the
175
+ // default background) is KEPT — it is the thing we want, and dropping it
176
+ // would let a neighbouring row's background bleed into this line.
177
+ if ((code >= 40 && code <= 47) || (code >= 100 && code <= 107))
178
+ continue;
179
+ kept.push(String(code));
180
+ }
181
+ return kept.length > 0 ? `\x1b[${kept.join(';')}m` : '';
182
+ });
183
+ }
184
+ /** Sender sections of an inbox card body; `parseCard` already read their entries.
185
+ * Whatever remains is other content riding the same digest. */
186
+ const INBOX_SENDER_SECTIONS = /<from\b[^>]*>[\s\S]*?<\/from>/g;
187
+ /** A tool component that can fold itself down to its CALL. pi's `ToolExecutionComponent`
188
+ * only knows expanded/collapsed, so each crtr-owned definition receives a local fold
189
+ * controller and captures the compact call component it renders. Folded render paints
190
+ * that captured call directly, dropping result and Box chrome while letting a wrapped
191
+ * path keep its natural rows. Tools without a crtr definition remain in full. */
192
+ /** A one-line separator that appears only while its adjacent tool group is
193
+ * folded. It stays in the transcript so toggling folded tools reflows the same
194
+ * message/tool boundary without rebuilding the chat. */
195
+ class FoldedToolSeparator extends Spacer {
196
+ folded = false;
197
+ separatesToolGroup = false;
198
+ setFolded(folded) {
199
+ this.folded = folded;
200
+ this.refresh();
201
+ }
202
+ setSeparatesToolGroup(separatesToolGroup) {
203
+ this.separatesToolGroup = separatesToolGroup;
204
+ this.refresh();
205
+ }
206
+ refresh() {
207
+ this.setLines(this.folded && this.separatesToolGroup ? 1 : 0);
208
+ }
209
+ }
210
+ /** The dim row under a consolidated reply that stands for the folded working. */
211
+ class WorkingRow extends Container {
212
+ label = new Text('', 1, 0);
213
+ constructor() {
214
+ super();
215
+ this.addChild(new Spacer(1));
216
+ this.addChild(this.label);
217
+ }
218
+ setLabel(label) {
219
+ this.label.setText(label);
220
+ }
221
+ }
222
+ function plural(count, singular, pluralForm) {
223
+ return `${count} ${count === 1 ? singular : pluralForm}`;
224
+ }
225
+ class MinimizableToolComponent extends ToolExecutionComponent {
226
+ /** Bound by ChatView at append time; pi's base component does not expose it. */
227
+ activityCallId;
228
+ minimized = false;
229
+ expandedState = false;
230
+ foldController;
231
+ resultObserver;
232
+ /** A foldable definition owns its folded call component; it may also observe
233
+ * results before the imported shell renders them. */
234
+ setToolView(foldController, resultObserver) {
235
+ this.foldController = foldController;
236
+ this.resultObserver = resultObserver;
237
+ }
238
+ updateResult(...args) {
239
+ this.resultObserver?.(args[0], args[1] ?? false);
240
+ // The clock stays in the model's persisted result and copyable transcript,
241
+ // but need not consume a visible row in the human's tool card.
242
+ const result = args[0];
243
+ const content = result.content;
244
+ if (Array.isArray(content) && /^elapsed \d+(?:h \d+)?m \d+s(?:\n|$)/.test(content.at(-1)?.text ?? '')) {
245
+ super.updateResult({ ...result, content: content.slice(0, -1) }, args[1]);
246
+ }
247
+ else {
248
+ super.updateResult(...args);
249
+ }
250
+ }
251
+ setExpanded(expanded) {
252
+ this.expandedState = expanded;
253
+ super.setExpanded(expanded);
254
+ }
255
+ /** Flip the local fold state, then use the imported component's public
256
+ * expansion setter to rebuild its call renderer at the current setting. */
257
+ setMinimized(minimized) {
258
+ if (!this.foldController || this.minimized === minimized)
259
+ return;
260
+ this.minimized = minimized;
261
+ this.foldController.setFolded(minimized);
262
+ super.setExpanded(this.expandedState);
263
+ }
264
+ render(width) {
265
+ // The backgrounding row is appended HERE, by the component that owns the
266
+ // whole tool block, so it renders after the block's highlighted band ends
267
+ // instead of inside it. It is empty unless this is a bash call still running
268
+ // past the threshold.
269
+ if (!this.minimized) {
270
+ return [...super.render(width), ...bashCallBackgroundHintLines(this.foldController?.callComponent(), width)];
271
+ }
272
+ const call = this.foldController?.callComponent();
273
+ if (!call)
274
+ return super.render(width);
275
+ // trimEnd drops right-hand padding, which only existed to carry the
276
+ // background band these lines no longer paint.
277
+ return call.render(width)
278
+ .filter((line) => line.replace(ANSI_RE, '').trim().length > 0)
279
+ .map((line) => stripBackground(line).trimEnd());
280
+ }
281
+ }
282
+ const defaultErrorStyle = (s) => `\x1b[31m${s}\x1b[39m`;
283
+ const defaultAttachPalette = {
284
+ accent: (s) => `\x1b[33m${s}\x1b[39m`,
285
+ active: (s) => `\x1b[36m${s}\x1b[39m`,
286
+ info: (s) => `\x1b[34m${s}\x1b[39m`,
287
+ muted: defaultDimStyle,
288
+ faint: defaultDimStyle,
289
+ border: (s) => s,
290
+ surface: (s) => s,
291
+ bold: (s) => `\x1b[1m${s}\x1b[22m`,
292
+ error: defaultErrorStyle,
293
+ warning: (s) => `\x1b[33m${s}\x1b[39m`,
294
+ diffAdded: (s) => `\x1b[32m${s}\x1b[39m`,
295
+ diffRemoved: (s) => `\x1b[91m${s}\x1b[39m`,
296
+ bashMode: (s) => `\x1b[32m${s}\x1b[39m`,
297
+ bashModeAlt: (s) => `\x1b[92m${s}\x1b[39m`,
298
+ };
299
+ export class ChatView {
300
+ tui;
301
+ /** The chat scroll area handed in by the attach command. */
302
+ container;
303
+ /** Settled history is cached independently from the live status area so picker
304
+ * navigation does not re-render a long conversation on every key repeat. */
305
+ historyContainer = new MeasuredContainer();
306
+ /** Standalone ChatViews render activity inline; the attach viewer supplies
307
+ * `onActivityChange`, so its transcript excludes this container. */
308
+ statusContainer = new MeasuredContainer();
309
+ /** Optional banner, above history and status in the viewport's flat source. */
310
+ bannerContainer;
311
+ transcript;
312
+ /** Where `append()` puts a component. Normally `historyContainer`; retargeted to
313
+ * a nested container while condensed history is being built, so the same
314
+ * message-rendering path serves both regions. */
315
+ appendTarget = this.historyContainer;
316
+ /** Inline page blocks placed in this transcript, by page id — one block per
317
+ * page, so a `--replace` revision refreshes the block already on screen. */
318
+ pageBlocks = new Map();
319
+ /** The person's inbox answers in the live region, each with its leading
320
+ * spacer. Summary mode hides them with the settled pages they answer. */
321
+ inboxAnswers = new Set();
322
+ inlinePageBlocks;
323
+ pageOpenHint;
324
+ backgroundBashHint;
325
+ /** Trailing cycles kept at full fidelity (config `live_cycles`). */
326
+ liveCycles;
327
+ /** Messages kept from a condensed cycle (config `condensed_history`). */
328
+ condensedHistory;
329
+ cwd;
330
+ showImages;
331
+ imageWidthCells;
332
+ hideThinking;
333
+ hiddenThinkingLabel;
334
+ /** Ctrl+O: pi's two-state tool-output expansion. */
335
+ toolOutputExpanded;
336
+ /** The view setting (Alt+C → z → f): fold every SETTLED tool call to its single
337
+ * call line. Independent of `toolOutputExpanded` — it survives an expand/collapse
338
+ * and only ever applies to tool calls that are done. */
339
+ foldSettledTools = readFoldFinishedTools();
340
+ /** Summary mode only changes Ctrl+O when both persistent settings are on. */
341
+ summarizeToolCalls = readSummarizeToolCalls();
342
+ detailedToolRecaps = readDetailedToolRecaps();
343
+ showGroupSummaries = this.summarizeToolCalls && this.foldSettledTools;
344
+ /** Groups exist only while building/rendering the full-fidelity live region. */
345
+ groups = [];
346
+ openGroup;
347
+ /** Consolidated replies (`consolidate_replies`), read once per attach. */
348
+ consolidateReplies = readConsolidateReplies();
349
+ /** `/show-working`: expand every turn's working. Viewer-local, not persisted. */
350
+ showWorking = false;
351
+ turnReplies = new Map();
352
+ turns = [];
353
+ openReplyTurn;
354
+ /** The turn the live region opens in when it begins mid-turn (the condensed
355
+ * region held its person's message), else the pre-message `start` turn. */
356
+ carriedTurn = { key: START_TURN_KEY, prose: [] };
357
+ /** >0 while appending components that never join a turn (the person's
358
+ * message, turn chrome, errors, condensed history). */
359
+ outsideTurns = 0;
360
+ /** Components the turn fold currently hides. */
361
+ turnHidden = new Set();
362
+ groupSummaries = new Map();
363
+ /** Node id → display name for every node spawned in this transcript, so a
364
+ * later group's finish notice can name the child rather than its id. */
365
+ nodeRoster = new Map();
366
+ streamingWasGroupMember = false;
367
+ onFooterEvent;
368
+ /** Viewer hook that places activity in its fixed slot, when available. */
369
+ onActivityChange;
370
+ /** Theme-derived colorizers for the activity/status area. */
371
+ spinnerStyle;
372
+ dimStyle;
373
+ errorStyle;
374
+ /** Palette shared with recap rows that render outside pi tool callbacks. */
375
+ recapPalette;
376
+ /** Bold accent for the expanded crtr-context label. */
377
+ labelStyle = (s) => `\x1b[1m${s}\x1b[22m`;
378
+ /** Viewer-local Markdown projection, handed to pi's message components so
379
+ * THEY apply it at render time with the exact content width. The viewer keeps
380
+ * no projected copy: the components hold canonical source, and each
381
+ * transformer reads live viewer state on every call. Diagrams apply only to
382
+ * assistant-authored Markdown. */
383
+ markdownTransformers = [
384
+ (markdown, { messageType, availableWidth }) => (messageType === 'assistant' ? transformDiagramFences(markdown, availableWidth) : markdown),
385
+ (markdown, { messageType }) => (messageType === 'user' ? styleAttachMarkdownSource(markdown) : styleAttachAgentMarkdown(markdown)),
386
+ ];
387
+ /** The assistant message component currently being streamed (between
388
+ * message_start and message_end for an assistant turn). */
389
+ streamingComponent;
390
+ /** The separator immediately after the live assistant component. It becomes
391
+ * visible when that response has visible prose or thinking and folded tools. */
392
+ streamingToolSeparator;
393
+ /** Content classes for each separator, so Ctrl+T can add/remove thinking gaps
394
+ * without rebuilding the transcript. */
395
+ foldedToolSeparatorContents = new Map();
396
+ /** Tool-call id → its execution component, for the duration of the call. */
397
+ pendingTools = new Map();
398
+ /** The `!` bash component currently streaming (between bash_start and bash_end). */
399
+ bashComponent;
400
+ /** The single active activity loader (working/compaction/retry), if any. */
401
+ activityLoader;
402
+ /** The shared broker transcript state; this renderer projects it into pi TUI
403
+ * components while retaining terminal-only folding and virtualization. */
404
+ projection = initialConvState();
405
+ /** Broker-selected normal label for this turn; compaction/retry temporarily
406
+ * replace it and restore it when the run remains active. */
407
+ workingActivity = this.projection.workingActivity;
408
+ runActive = false;
409
+ // -- Single-writer snapshot ordering -------------------------------------
410
+ // A non-streaming catch-up yields to the event loop mid-build (so queued stdin
411
+ // drains), which opens a window where later broker frames could otherwise
412
+ // mutate a half-rebuilt transcript. These three fields make the ChatView a
413
+ // single ordered writer: applySnapshot is the only thing that mutates the
414
+ // view while a build is in flight, live frames are deferred and replayed in
415
+ // wire order once it finishes, and a newer welcome always supersedes an older
416
+ // build. See applySnapshot / deferIfBuilding.
417
+ /** True while applySnapshot is mid-build; live broker frames defer instead of
418
+ * mutating the partially-rebuilt view. */
419
+ applyingSnapshot = false;
420
+ /** Bumped on every applySnapshot. A build suspended at a yield compares this
421
+ * after resuming and abandons itself when a newer welcome has bumped it, so
422
+ * the newest welcome wins and stale state never overwrites the live view. */
423
+ snapshotGeneration = 0;
424
+ /** Live frames captured during an in-flight build (bound closures that re-run
425
+ * the original entry point), replayed in order when the build completes and
426
+ * dropped when a newer welcome supersedes the build. */
427
+ deferredFrames = [];
428
+ /** Text of the most recent assistant message, kept current from the welcome
429
+ * snapshot AND the live event stream so `/copy` (getLastAssistantText) works
430
+ * whether the message arrived before or after attach. */
431
+ lastAssistantText;
432
+ /** Existing file paths found anywhere in the rendered transcript, newest first. */
433
+ transcriptFilePaths = [];
434
+ /** `[[ref]]` document references from the transcript, newest first. */
435
+ transcriptDocRefs = [];
436
+ /** Canonical copyable transcript blocks, in their rendered visual order. */
437
+ copyBlockRecords = [];
438
+ copyIndex = new Map();
439
+ /** Registrations made while building condensed history are collapsed onto its
440
+ * outer container once that container becomes a top-level viewport block. */
441
+ condensedCopyBlocks = new WeakMap();
442
+ constructor(tui, container, opts = {}) {
443
+ this.tui = tui;
444
+ this.container = container;
445
+ this.cwd = opts.cwd ?? process.cwd();
446
+ this.showImages = opts.showImages ?? true;
447
+ this.imageWidthCells = opts.imageWidthCells ?? 60;
448
+ this.hideThinking = opts.hideThinking ?? false;
449
+ this.hiddenThinkingLabel = opts.hiddenThinkingLabel ?? 'Thinking...';
450
+ this.toolOutputExpanded = opts.toolOutputExpanded ?? false;
451
+ this.liveCycles = opts.liveCycles ?? readLiveCycles();
452
+ this.condensedHistory = opts.condensedHistory ?? readCondensedHistory();
453
+ this.onFooterEvent = opts.onFooterEvent;
454
+ this.onActivityChange = opts.onActivityChange;
455
+ this.inlinePageBlocks = opts.inlinePageBlocks ?? false;
456
+ this.pageOpenHint = opts.pageOpenHint ?? (() => 'crtr human list');
457
+ this.backgroundBashHint = opts.backgroundBashHint ?? (() => null);
458
+ this.recapPalette = opts.palette ?? defaultAttachPalette;
459
+ this.spinnerStyle = this.recapPalette.active;
460
+ this.dimStyle = this.recapPalette.muted;
461
+ this.errorStyle = this.recapPalette.error;
462
+ // Banner sits above history and OUTSIDE it, so resetChat() (which clears only
463
+ // historyContainer) never wipes it — it persists across every welcome snapshot.
464
+ if (opts.banner && opts.banner.length > 0) {
465
+ const banner = new MeasuredContainer();
466
+ banner.addChild(new Spacer(1));
467
+ for (const line of opts.banner)
468
+ banner.addChild(new Text(line, 1, 0));
469
+ banner.addChild(new Spacer(1));
470
+ this.bannerContainer = banner;
471
+ this.container.addChild(banner);
472
+ }
473
+ this.container.addChild(this.historyContainer);
474
+ if (!this.onActivityChange)
475
+ this.container.addChild(this.statusContainer);
476
+ this.transcript = new CompositeViewportSource([
477
+ ...(this.bannerContainer ? [this.bannerContainer] : []),
478
+ this.historyContainer,
479
+ ...(this.onActivityChange ? [] : [this.statusContainer]),
480
+ ]);
481
+ }
482
+ /** The transcript as one flat ordered block list for the viewport. */
483
+ transcriptSource() {
484
+ return this.transcript;
485
+ }
486
+ // Catch-up: render the welcome snapshot, then live events resume.
487
+ /** Render the full message history from a `welcome` snapshot. Ports pi's
488
+ * `renderSessionContext` (interactive-mode.js:2553): assistant messages spawn
489
+ * tool-execution components matched to their toolResult messages; everything
490
+ * else routes through `addMessageToChat`. The TUI's differential renderer +
491
+ * reflow-on-resize is automatic — no scrollback reconstruction needed. */
492
+ async applySnapshot(snapshot) {
493
+ // Open a new build generation. Any older build still suspended at a yield
494
+ // abandons itself when it resumes (generation check below), and live frames
495
+ // that were deferred against the transcript we are about to discard are
496
+ // dropped — a newer welcome always wins.
497
+ const generation = ++this.snapshotGeneration;
498
+ this.applyingSnapshot = true;
499
+ this.deferredFrames.length = 0;
500
+ this.resetChat();
501
+ this.projection = projectSnapshot(snapshot, this.projection);
502
+ this.workingActivity = this.projection.workingActivity;
503
+ this.runActive = this.projection.isStreaming;
504
+ this.seedToolGroupSummaries(this.projection.toolGroupSummaryDetails);
505
+ this.turnReplies.clear();
506
+ if (this.consolidateReplies) {
507
+ for (const [key, reply] of Object.entries(normalizeTurnReplyRecord(snapshot.turnReplies)))
508
+ this.turnReplies.set(key, reply);
509
+ }
510
+ const renderedPendingTools = new Map();
511
+ const messages = this.projection.messages;
512
+ const lastIndex = messages.length - 1;
513
+ // Cycles older than the trailing `live_cycles` are condensed into one nested
514
+ // container before the live region is built. It retains only configured prose
515
+ // and cycle seams, avoiding old tool components while still reflowing on pane
516
+ // resize. `liveStart` is 0 until the node has yielded past the configured
517
+ // window, so a fresh node renders at full fidelity.
518
+ const liveStart = liveRegionStart(messages, this.liveCycles);
519
+ if (liveStart > 0) {
520
+ const condensed = await this.buildCondensedBlock(messages.slice(0, liveStart), generation);
521
+ if (generation !== this.snapshotGeneration)
522
+ return;
523
+ if (condensed)
524
+ this.appendCondensedBlock(condensed);
525
+ }
526
+ for (let i = liveStart; i < messages.length; i++) {
527
+ // Yield to the event loop every SNAPSHOT_YIELD_EVERY messages so queued
528
+ // stdin drains (keystrokes are handled instead of bursting after a long
529
+ // catch-up) while a big transcript constructs. Skipped for a STREAMING
530
+ // snapshot: its in-flight tail + pending tools must be bound before any
531
+ // relayed message_update/message_end lands, so it builds synchronously
532
+ // (no await → no broker frame can interleave and freeze the live bubble).
533
+ if (!this.projection.isStreaming &&
534
+ i > liveStart &&
535
+ (i - liveStart) % SNAPSHOT_YIELD_EVERY === 0) {
536
+ await new Promise((resolve) => setImmediate(resolve));
537
+ // A newer welcome arrived while we were suspended — abandon this stale
538
+ // build without touching the view (or the gate) it no longer owns.
539
+ if (generation !== this.snapshotGeneration)
540
+ return;
541
+ }
542
+ const message = messages[i];
543
+ if (message.role === 'assistant') {
544
+ // Keep the `/copy` source current from the catch-up transcript too, not
545
+ // only the live stream (you usually attach AFTER the last reply landed).
546
+ const text = assistantVisibleText(message);
547
+ if (text.trim()) {
548
+ this.lastAssistantText = text;
549
+ this.pushTranscriptText(text);
550
+ }
551
+ // If the snapshot caught an IN-FLIGHT assistant turn (state.isStreaming
552
+ // and this is the trailing, non-terminal assistant message), bind it as
553
+ // the live streaming component so the relayed message_update/message_end
554
+ // frames that follow `welcome` land on it. Otherwise the in-flight
555
+ // message would freeze at its snapshot value until the next turn — the
556
+ // common case, since you typically attach to a node that is working.
557
+ const isStreamingTail = i === lastIndex &&
558
+ this.projection.isStreaming &&
559
+ message.stopReason !== 'aborted' &&
560
+ message.stopReason !== 'error';
561
+ const hasProse = assistantVisibleText(message).trim() !== '';
562
+ const toolCalls = this.assistantToolCalls(message);
563
+ const endedWithFailure = message.stopReason === 'aborted' || message.stopReason === 'error';
564
+ const terminalErrorMessage = endedByAbort(message) ? 'Interrupted' : (message.errorMessage ?? 'Error');
565
+ // A terminal assistant failure remains visible as its own boundary. Settle
566
+ // any interrupted calls so the completed span before it can still recap.
567
+ if (endedWithFailure) {
568
+ for (const component of renderedPendingTools.values()) {
569
+ const result = { content: [{ type: 'text', text: terminalErrorMessage }], isError: true };
570
+ component.updateResult(result);
571
+ this.registerCopyBlock(component, 'tool', terminalErrorMessage);
572
+ this.settleGroupTool(component, result, true);
573
+ }
574
+ renderedPendingTools.clear();
575
+ }
576
+ if (hasProse || endedWithFailure)
577
+ this.closeOpenGroup();
578
+ let separator;
579
+ if (isStreamingTail) {
580
+ this.streamingComponent = new ViewerAssistantMessageComponent(undefined, this.hideThinking, attachMarkdownTheme(), this.hiddenThinkingLabel, this.markdownTransformers);
581
+ this.appendAssistantPart(this.streamingComponent, !hasProse);
582
+ this.registerCopyBlock(this.streamingComponent, 'assistant', '');
583
+ this.streamingWasGroupMember = !hasProse;
584
+ this.streamingComponent.updateContent(message);
585
+ this.registerCopyBlock(this.streamingComponent, 'assistant', assistantVisibleText(message));
586
+ separator = this.streamingToolSeparator = this.appendAssistantSeparator(!hasProse);
587
+ }
588
+ else {
589
+ separator = this.appendAssistantMessage(message, !hasProse && !endedWithFailure);
590
+ }
591
+ if (separator)
592
+ this.setAssistantSeparatorContent(separator, message);
593
+ for (const content of toolCalls) {
594
+ this.pushTranscriptValue(content.arguments);
595
+ const component = this.appendToolComponent(content.name, content.id, content.arguments);
596
+ // (isStreamingTail is never aborted/error, so its tools fall through to
597
+ // renderedPendingTools → pendingTools, where live tool events find them.)
598
+ if (message.stopReason === 'aborted' || message.stopReason === 'error') {
599
+ component.updateResult({ content: [{ type: 'text', text: terminalErrorMessage }], isError: true });
600
+ this.registerCopyBlock(component, 'tool', terminalErrorMessage);
601
+ this.settleGroupTool(component, { content: [{ type: 'text', text: terminalErrorMessage }], isError: true }, true);
602
+ }
603
+ else {
604
+ renderedPendingTools.set(content.id, component);
605
+ }
606
+ }
607
+ if (endedWithFailure)
608
+ this.closeOpenGroup();
609
+ if (!isStreamingTail && !endedWithFailure)
610
+ this.recordTurnProse(message, false);
611
+ }
612
+ else if (message.role === 'toolResult') {
613
+ this.pushTranscriptText(this.userMessageText(message));
614
+ const component = renderedPendingTools.get(message.toolCallId);
615
+ if (component) {
616
+ component.updateResult(message);
617
+ this.registerCopyBlock(component, 'tool', this.toolResultText(message));
618
+ this.historyContainer.markDirty(component);
619
+ this.settleGroupTool(component, message, message.isError === true);
620
+ renderedPendingTools.delete(message.toolCallId);
621
+ this.maybeAppendPageBlock(message);
622
+ }
623
+ }
624
+ else {
625
+ this.addMessageToChat(message);
626
+ }
627
+ }
628
+ for (const [id, component] of renderedPendingTools) {
629
+ this.pendingTools.set(id, component);
630
+ }
631
+ for (const turn of this.turns)
632
+ this.refreshTurn(turn);
633
+ // A rebuild constructs fresh components, which are born unfolded; re-apply the
634
+ // setting so a reconnect/welcome does not silently unfold the transcript.
635
+ this.applyToolDisplay();
636
+ // If we attached mid-turn, the `agent_start` that spins up the working loader
637
+ // already fired before we connected — restore it from the snapshot's streaming
638
+ // state so an actively-working node shows the spinner right away.
639
+ if (this.projection.isStreaming)
640
+ this.setActivity(this.makeLoader(this.workingActivity));
641
+ this.tui.requestRender();
642
+ // Build complete and still current (a mismatch would have returned above):
643
+ // open the gate and replay, in wire order, any live frames that arrived
644
+ // during construction so they land on the finished transcript.
645
+ this.applyingSnapshot = false;
646
+ this.replayDeferredFrames();
647
+ }
648
+ /**
649
+ * Build the condensed form of the already-finished cycles as a nested component
650
+ * container, or return undefined when nothing survives condensation.
651
+ *
652
+ * Reuses `addMessageToChat` by retargeting `append()` at the nested container, so
653
+ * condensed history uses the same renderer as live history with tool traffic
654
+ * filtered out. The outer history cache keeps stable-width frames cheap, while
655
+ * preserving the components lets pane-width changes reflow their content. The
656
+ * build yields on the live cadence and abandons itself when a newer welcome
657
+ * supersedes this generation.
658
+ */
659
+ async buildCondensedBlock(messages, generation) {
660
+ const condensed = new Container();
661
+ const previousTarget = this.appendTarget;
662
+ const copyBlocks = [];
663
+ this.appendTarget = condensed;
664
+ this.condensedCopyBlocks.set(condensed, copyBlocks);
665
+ try {
666
+ if (this.consolidateReplies) {
667
+ if (!(await this.buildCondensedTurns(messages, generation)))
668
+ return undefined;
669
+ return condensed.children.length > 0 ? { component: condensed, copyBlocks } : undefined;
670
+ }
671
+ let built = 0;
672
+ for (const message of messages) {
673
+ if (!keepWhenCondensed(message, this.condensedHistory))
674
+ continue;
675
+ if (built > 0 && built % SNAPSHOT_YIELD_EVERY === 0) {
676
+ await new Promise((resolve) => setImmediate(resolve));
677
+ if (generation !== this.snapshotGeneration)
678
+ return undefined;
679
+ }
680
+ built++;
681
+ // Condensed prose still feeds the @-path picker; `lastAssistantText` (the
682
+ // `/copy` source) deliberately does not — the live region always holds the
683
+ // newest reply.
684
+ this.pushTranscriptText(this.userMessageText(message));
685
+ this.addMessageToChat(message);
686
+ }
687
+ }
688
+ finally {
689
+ this.appendTarget = previousTarget;
690
+ this.condensedCopyBlocks.delete(condensed);
691
+ }
692
+ return condensed.children.length > 0 ? { component: condensed, copyBlocks } : undefined;
693
+ }
694
+ /** Consolidated replies in condensed history: each finished turn renders as
695
+ * the person's message, its reply, then any cycle dividers it spanned. A turn
696
+ * still open at the end continues into the live region, so it is carried there
697
+ * instead of rendered. Returns false when a newer welcome superseded the build. */
698
+ async buildCondensedTurns(messages, generation) {
699
+ const turns = [{ key: START_TURN_KEY, prose: [], dividers: [] }];
700
+ for (const message of messages) {
701
+ const turn = turns.at(-1);
702
+ if (isTrueUserMessage(message)) {
703
+ turns.push({ key: messageKey(message) ?? `local-${turns.length}`, user: message, prose: [], dividers: [] });
704
+ }
705
+ else if (isCycleDivider(message)) {
706
+ turn.dividers.push(message);
707
+ }
708
+ else if (message.role === 'assistant' && message.stopReason !== 'aborted' && message.stopReason !== 'error') {
709
+ const text = assistantVisibleText(message).trim();
710
+ const key = messageKey(message);
711
+ if (text !== '' && key !== undefined)
712
+ turn.prose.push({ key, text });
713
+ }
714
+ }
715
+ const last = turns.pop();
716
+ let built = 0;
717
+ const render = async (turn, withReply) => {
718
+ if (built > 0 && built % SNAPSHOT_YIELD_EVERY === 0) {
719
+ await new Promise((resolve) => setImmediate(resolve));
720
+ if (generation !== this.snapshotGeneration)
721
+ return false;
722
+ }
723
+ built++;
724
+ if (turn.user !== undefined) {
725
+ this.pushTranscriptText(this.userMessageText(turn.user));
726
+ this.addMessageToChat(turn.user);
727
+ }
728
+ const text = withReply ? turnReplyText(turn.prose, this.turnReplies.get(turn.key)) : '';
729
+ if (text !== '') {
730
+ const component = new ViewerAssistantMessageComponent(undefined, this.hideThinking, attachMarkdownTheme(), this.hiddenThinkingLabel, this.markdownTransformers);
731
+ component.updateContent(this.replyMessage(text));
732
+ this.append(component);
733
+ this.registerCopyBlock(component, 'assistant', text);
734
+ }
735
+ for (const divider of turn.dividers)
736
+ this.addMessageToChat(divider);
737
+ return true;
738
+ };
739
+ for (const turn of turns)
740
+ if (!(await render(turn, true)))
741
+ return false;
742
+ // The open turn: its person's message (and any dividers so far) stay here,
743
+ // its reply joins the live region where its working continues.
744
+ if (!(await render(last, false)))
745
+ return false;
746
+ this.carriedTurn = { key: last.key, prose: last.prose };
747
+ return true;
748
+ }
749
+ /** Defer a live broker frame when a snapshot build is in flight. Returns true
750
+ * (and enqueues the replay closure) while building so the caller returns
751
+ * without mutating the half-rebuilt view; false when the caller may proceed.
752
+ * This is the single-writer gate every live-frame entry point passes through. */
753
+ deferIfBuilding(replay) {
754
+ if (!this.applyingSnapshot)
755
+ return false;
756
+ this.deferredFrames.push(replay);
757
+ return true;
758
+ }
759
+ /** Replay deferred live frames in wire order. The gate is already open, so each
760
+ * closure re-enters its entry point and dispatches immediately. */
761
+ replayDeferredFrames() {
762
+ const frames = this.deferredFrames.splice(0);
763
+ for (const replay of frames)
764
+ replay();
765
+ }
766
+ /** Apply the broker's random choice for a newly received user message. */
767
+ setWorkingActivity(activity) {
768
+ if (this.deferIfBuilding(() => this.setWorkingActivity(activity)))
769
+ return;
770
+ const wasShowingWorkingActivity = this.projection.activity === this.workingActivity;
771
+ this.projection = projectWorkingActivity(this.projection, activity);
772
+ this.workingActivity = this.projection.workingActivity;
773
+ if (this.runActive && wasShowingWorkingActivity)
774
+ this.setActivity(this.makeLoader(this.workingActivity));
775
+ }
776
+ /** Clear live turn state after the broker reports completion or the viewer observes dormancy. */
777
+ settleRun() {
778
+ this.runActive = false;
779
+ for (const component of this.pendingTools.values())
780
+ this.settleGroupTool(component);
781
+ if (this.streamingComponent) {
782
+ this.historyContainer.removeChild(this.streamingComponent);
783
+ for (const turn of this.turns)
784
+ turn.members.delete(this.streamingComponent);
785
+ this.turnHidden.delete(this.streamingComponent);
786
+ this.unregisterCopyBlock(this.streamingComponent);
787
+ this.streamingComponent = undefined;
788
+ }
789
+ this.streamingToolSeparator = undefined;
790
+ this.pendingTools.clear();
791
+ if (this.openReplyTurn)
792
+ this.refreshWorkingRow(this.openReplyTurn);
793
+ this.applyToolDisplay();
794
+ this.setActivity(undefined);
795
+ this.settleBashComponent();
796
+ }
797
+ /** Stop any spinning activity loader. A one-shot `crtr surface attach` process lets its
798
+ * timers die with the process, but if T7 reuses a ChatView across reconnects in
799
+ * one process it should call this on detach to avoid a leaked interval. */
800
+ dispose() {
801
+ this.settleRun();
802
+ }
803
+ // Global display toggles (Ctrl+O / Ctrl+T), driven by the input controller.
804
+ // Pure client-side render state — no broker round-trip — ported from pi's
805
+ // `setToolsExpanded` / `toggleThinkingBlockVisibility`.
806
+ /** Ctrl+O prefers summaries when the user enabled both folding and summary
807
+ * generation. */
808
+ toggleToolsExpanded() {
809
+ let result;
810
+ if (this.summarizeToolCalls && this.foldSettledTools) {
811
+ this.showGroupSummaries = !this.showGroupSummaries;
812
+ this.toolOutputExpanded = !this.showGroupSummaries;
813
+ result = { kind: 'summaries', shown: this.showGroupSummaries };
814
+ }
815
+ else {
816
+ this.toolOutputExpanded = !this.toolOutputExpanded;
817
+ result = { kind: 'output', expanded: this.toolOutputExpanded };
818
+ }
819
+ this.applyToolDisplay();
820
+ return result;
821
+ }
822
+ /** The `fold finished tool calls` view setting (`/fold-tools`, Alt+C → z → f).
823
+ * Returns the new state so the caller can surface a notice. */
824
+ toggleFoldSettledTools() {
825
+ this.foldSettledTools = !this.foldSettledTools;
826
+ void persistFoldFinishedTools(this.foldSettledTools);
827
+ // Turning folding back on restores the configured default (summaries),
828
+ // rather than preserving a stale Ctrl+O choice from an unfolded view.
829
+ if (this.summarizeToolCalls && this.foldSettledTools)
830
+ this.showGroupSummaries = true;
831
+ this.applyToolDisplay();
832
+ return this.foldSettledTools;
833
+ }
834
+ /** Push both display settings onto every rendered component. A tool call still in
835
+ * flight is never hidden or minimized. Only a settled group with a broker-known
836
+ * summary collapses; incomplete/failed generation leaves its folded call lines. */
837
+ applyToolDisplay() {
838
+ const inFlight = new Set(this.pendingTools.values());
839
+ for (const group of this.groups)
840
+ for (const tool of group.inFlight)
841
+ inFlight.add(tool);
842
+ for (const child of this.historyContainer.children) {
843
+ if (child instanceof MinimizableToolComponent)
844
+ child.setMinimized(this.foldSettledTools && !inFlight.has(child));
845
+ if (isExpandable(child))
846
+ child.setExpanded(this.toolOutputExpanded);
847
+ }
848
+ // The turn fold composes with group folding: a group sets its members'
849
+ // combined state itself; every other folded member is set here, and a
850
+ // member the fold released is shown again.
851
+ const turnFolded = this.turnFoldedComponents(inFlight);
852
+ const groupOwned = new Set();
853
+ for (const group of this.groups) {
854
+ this.applyGroupDisplay(group, turnFolded);
855
+ groupOwned.add(group.recap);
856
+ for (const member of group.members)
857
+ groupOwned.add(member);
858
+ }
859
+ for (const component of this.turnHidden) {
860
+ if (!turnFolded.has(component) && !groupOwned.has(component))
861
+ this.historyContainer.setHidden(component, false);
862
+ }
863
+ for (const component of turnFolded) {
864
+ if (!groupOwned.has(component) && !this.historyContainer.hiddenChildren.has(component))
865
+ this.historyContainer.setHidden(component, true);
866
+ }
867
+ this.turnHidden = turnFolded;
868
+ this.applyInboxExchangeDisplay();
869
+ this.updateFoldedToolSeparators(inFlight);
870
+ this.historyContainer.markDirty();
871
+ this.tui.requestRender();
872
+ }
873
+ /** Summary mode hides the back-and-forth with the person: every settled
874
+ * inline page and every answer they gave from their inbox. A page still
875
+ * awaiting an answer stays on screen. */
876
+ hidesInboxExchange() {
877
+ return this.showGroupSummaries && this.foldSettledTools;
878
+ }
879
+ applyInboxExchangeDisplay() {
880
+ const hide = this.hidesInboxExchange();
881
+ for (const component of this.inboxAnswers)
882
+ this.historyContainer.setHidden(component, hide);
883
+ for (const block of this.pageBlocks.values())
884
+ this.historyContainer.setHidden(block, hide && block.settled);
885
+ }
886
+ /** `/show-working` (Alt+C → z → w): expand or fold the working behind every
887
+ * consolidated reply. Returns the new state, or null when the
888
+ * `consolidate_replies` experiment is off for this attach. */
889
+ toggleShowWorking() {
890
+ if (!this.consolidateReplies)
891
+ return null;
892
+ this.showWorking = !this.showWorking;
893
+ for (const turn of this.turns)
894
+ this.refreshWorkingRow(turn);
895
+ this.applyToolDisplay();
896
+ return this.showWorking;
897
+ }
898
+ /** A broker rewrite landed for one turn. Stored first: it may precede the
899
+ * turn's events, and snapshot rebuilds defer it through the writer gate. */
900
+ applyTurnReply(key, reply) {
901
+ if (this.deferIfBuilding(() => this.applyTurnReply(key, reply)))
902
+ return;
903
+ if (!this.consolidateReplies)
904
+ return;
905
+ this.turnReplies.set(key, reply);
906
+ for (const turn of this.turns)
907
+ if (turn.key === key)
908
+ this.refreshTurn(turn);
909
+ this.tui.requestRender();
910
+ }
911
+ /** Every turn member the fold hides right now. The live turn keeps what is
912
+ * still in motion — the streaming message and in-flight tools — visible
913
+ * below its working row. */
914
+ turnFoldedComponents(inFlight) {
915
+ const folded = new Set();
916
+ if (!this.consolidateReplies || this.showWorking)
917
+ return folded;
918
+ for (const turn of this.turns) {
919
+ const live = turn === this.openReplyTurn;
920
+ for (const member of turn.members) {
921
+ if (live && (member === this.streamingComponent
922
+ || member === this.streamingToolSeparator
923
+ || member === this.bashComponent
924
+ || inFlight.has(member)))
925
+ continue;
926
+ folded.add(member);
927
+ }
928
+ }
929
+ return folded;
930
+ }
931
+ beginTurn(key, prose = []) {
932
+ const reply = new ViewerAssistantMessageComponent(undefined, this.hideThinking, attachMarkdownTheme(), this.hiddenThinkingLabel, this.markdownTransformers);
933
+ const working = new WorkingRow();
934
+ this.outsideTurns++;
935
+ try {
936
+ // The fold row sits between the person's message and the reply: what
937
+ // was asked, what was done, then the answer.
938
+ this.append(working);
939
+ this.append(reply);
940
+ }
941
+ finally {
942
+ this.outsideTurns--;
943
+ }
944
+ this.registerCopyBlock(reply, 'assistant', '');
945
+ const turn = { key, reply, working, members: new Set(), prose };
946
+ this.turns.push(turn);
947
+ this.openReplyTurn = turn;
948
+ this.refreshTurn(turn);
949
+ return turn;
950
+ }
951
+ /** Whether an append in progress lands in the live region of a consolidating view. */
952
+ consolidatingHere() {
953
+ return this.consolidateReplies && this.appendTarget === this.historyContainer;
954
+ }
955
+ currentTurn() {
956
+ return this.openReplyTurn ?? this.beginTurn(this.carriedTurn.key, [...this.carriedTurn.prose]);
957
+ }
958
+ /** A settled assistant message with prose becomes part of its turn's reply. */
959
+ recordTurnProse(message, refresh) {
960
+ if (!this.consolidatingHere() || message.role !== 'assistant')
961
+ return;
962
+ if (message.stopReason === 'aborted' || message.stopReason === 'error')
963
+ return;
964
+ const text = assistantVisibleText(message).trim();
965
+ const key = messageKey(message);
966
+ if (text === '' || key === undefined)
967
+ return;
968
+ const turn = this.currentTurn();
969
+ if (turn.prose.some((item) => item.key === key))
970
+ return;
971
+ turn.prose.push({ key, text });
972
+ if (refresh)
973
+ this.refreshTurn(turn);
974
+ }
975
+ /** Re-render one turn's reply from its prose and the broker's latest rewrite. */
976
+ refreshTurn(turn) {
977
+ const text = turnReplyText(turn.prose, this.turnReplies.get(turn.key));
978
+ turn.reply.updateContent(this.replyMessage(text));
979
+ this.historyContainer.setHidden(turn.reply, text === '');
980
+ this.historyContainer.markDirty(turn.reply);
981
+ this.registerCopyBlock(turn.reply, 'assistant', text);
982
+ if (text !== '' && turn === this.turns.at(-1))
983
+ this.lastAssistantText = text;
984
+ this.refreshWorkingRow(turn);
985
+ }
986
+ refreshWorkingRow(turn) {
987
+ let tools = 0;
988
+ let cards = 0;
989
+ for (const member of turn.members) {
990
+ if (member instanceof MinimizableToolComponent)
991
+ tools++;
992
+ else if (member instanceof ContextMessageComponent || member instanceof CustomMessageComponent || member instanceof CrtrOutputMessageComponent)
993
+ cards++;
994
+ }
995
+ const messages = turn.prose.length;
996
+ // A lone prose message with nothing else IS the reply; there is no working.
997
+ const hasWorking = tools > 0 || cards > 0 || messages > 1;
998
+ const parts = [
999
+ messages > 0 ? plural(messages, 'message', 'messages') : undefined,
1000
+ tools > 0 ? plural(tools, 'tool call', 'tool calls') : undefined,
1001
+ cards > 0 ? plural(cards, 'card', 'cards') : undefined,
1002
+ ].filter((part) => part !== undefined);
1003
+ // "working" only while the agent is running in this turn; a settled turn
1004
+ // just names what the fold holds.
1005
+ const live = this.runActive && turn === this.openReplyTurn;
1006
+ turn.working.setLabel(this.dimStyle(`${this.showWorking ? '▾' : '▸'} ${live ? 'working — ' : ''}${parts.join(' · ')}`));
1007
+ this.historyContainer.setHidden(turn.working, !hasWorking);
1008
+ this.historyContainer.markDirty(turn.working);
1009
+ }
1010
+ replyMessage(text) {
1011
+ return { role: 'assistant', content: text === '' ? [] : [{ type: 'text', text }], stopReason: 'stop' };
1012
+ }
1013
+ /** Ctrl+T / app.thinking.toggle — flip thinking-block visibility and apply it to
1014
+ * every assistant message (the in-flight streaming bubble is itself a child of
1015
+ * the container, so the loop covers it too). Returns the new HIDDEN state. */
1016
+ toggleThinking() {
1017
+ this.hideThinking = !this.hideThinking;
1018
+ for (const child of this.historyContainer.children) {
1019
+ if (child instanceof AssistantMessageComponent)
1020
+ child.setHideThinkingBlock(this.hideThinking);
1021
+ }
1022
+ for (const [separator, content] of this.foldedToolSeparatorContents) {
1023
+ separator.setSeparatesToolGroup(content.hasText || (!this.hideThinking && content.hasThinking));
1024
+ }
1025
+ this.historyContainer.markDirty();
1026
+ this.tui.requestRender();
1027
+ return this.hideThinking;
1028
+ }
1029
+ // Live stream: the 15-of-17-case handleEvent port (turn_start/turn_end no-op,
1030
+ // exactly as interactive pi falls through default for those two).
1031
+ handleEvent(event) {
1032
+ // Order behind an in-flight catch-up: a live turn that starts while a large
1033
+ // welcome is still building is replayed after it, never interleaved into it.
1034
+ if (this.deferIfBuilding(() => this.handleEvent(event)))
1035
+ return;
1036
+ this.projection = projectEvent(this.projection, event);
1037
+ switch (event.type) {
1038
+ case 'agent_start': {
1039
+ this.runActive = this.projection.isStreaming;
1040
+ for (const component of this.pendingTools.values())
1041
+ this.settleGroupTool(component);
1042
+ this.pendingTools.clear();
1043
+ if (this.openReplyTurn)
1044
+ this.refreshWorkingRow(this.openReplyTurn);
1045
+ this.setActivity(this.makeLoader(this.workingActivity));
1046
+ break;
1047
+ }
1048
+ case 'agent_end': {
1049
+ this.settleRun();
1050
+ // The node you're watching just finished its turn and handed control
1051
+ // back — ring the completion bell (the Claude-Code Stop-hook ding).
1052
+ // Best-effort/detached; gated on the `completion_bell` config setting.
1053
+ // Only ever reached inside a live viewer pane, so a headless/background
1054
+ // node (no ChatView) is always silent.
1055
+ ringCompletionBell();
1056
+ break;
1057
+ }
1058
+ // The whole run has truly settled (after any recovery/continuations). This
1059
+ // is the broker's canonical turn-over signal and is always relayed, so use
1060
+ // it as a safety net to clear a lingering activity loader: a missed or
1061
+ // abnormal `agent_end` would otherwise leave a dormant, between-wakes node
1062
+ // showing a frozen `Working…` spinner. No bell here — `agent_end` already
1063
+ // rang it on the normal path; this only cleans up display state.
1064
+ case 'agent_settled': {
1065
+ this.settleRun();
1066
+ break;
1067
+ }
1068
+ case 'message_start': {
1069
+ if (event.message.role === 'custom' || event.message.role === 'user') {
1070
+ this.addMessageToChat(event.message);
1071
+ // A card that joined a folded turn hides at once.
1072
+ if (this.consolidateReplies) {
1073
+ if (this.openReplyTurn)
1074
+ this.refreshWorkingRow(this.openReplyTurn);
1075
+ this.applyToolDisplay();
1076
+ }
1077
+ }
1078
+ else if (event.message.role === 'assistant') {
1079
+ const hasProse = assistantVisibleText(event.message).trim() !== '';
1080
+ if (hasProse)
1081
+ this.closeOpenGroup();
1082
+ this.streamingComponent = new ViewerAssistantMessageComponent(undefined, this.hideThinking, attachMarkdownTheme(), this.hiddenThinkingLabel, this.markdownTransformers);
1083
+ this.streamingWasGroupMember = !hasProse;
1084
+ this.appendAssistantPart(this.streamingComponent, !hasProse);
1085
+ this.registerCopyBlock(this.streamingComponent, 'assistant', '');
1086
+ this.streamingComponent.updateContent(event.message);
1087
+ this.registerCopyBlock(this.streamingComponent, 'assistant', assistantVisibleText(event.message));
1088
+ this.streamingToolSeparator = this.appendAssistantSeparator(!hasProse);
1089
+ this.setAssistantSeparatorContent(this.streamingToolSeparator, event.message);
1090
+ }
1091
+ break;
1092
+ }
1093
+ case 'message_update': {
1094
+ if (this.streamingComponent && event.message.role === 'assistant') {
1095
+ this.promoteStreamingAssistantToBoundary(event.message);
1096
+ // Incomplete Mermaid fences and HTML pairs stay literal until their
1097
+ // closing marker arrives; the transformers upgrade them on the render
1098
+ // that follows, with no separate mid-stream path.
1099
+ this.streamingComponent.updateContent(event.message);
1100
+ this.registerCopyBlock(this.streamingComponent, 'assistant', assistantVisibleText(event.message));
1101
+ this.historyContainer.markDirty(this.streamingComponent);
1102
+ const toolCalls = this.assistantToolCalls(event.message);
1103
+ if (this.streamingToolSeparator)
1104
+ this.setAssistantSeparatorContent(this.streamingToolSeparator, event.message);
1105
+ for (const content of toolCalls) {
1106
+ this.pushTranscriptValue(content.arguments);
1107
+ const existing = this.pendingTools.get(content.id);
1108
+ if (existing) {
1109
+ existing.updateArgs(content.arguments);
1110
+ this.noteGroupTool(existing, content.name, content.arguments);
1111
+ this.historyContainer.markDirty(existing);
1112
+ }
1113
+ else {
1114
+ const component = this.appendToolComponent(content.name, content.id, content.arguments);
1115
+ this.pendingTools.set(content.id, component);
1116
+ }
1117
+ }
1118
+ }
1119
+ break;
1120
+ }
1121
+ case 'message_end': {
1122
+ if (event.message.role !== 'assistant')
1123
+ break;
1124
+ const endedWithFailure = event.message.stopReason === 'aborted' || event.message.stopReason === 'error';
1125
+ // A terminal failure is always its own visible boundary, including an
1126
+ // empty abort created by yield or a daemon restart.
1127
+ this.promoteStreamingAssistantToBoundary(event.message, endedWithFailure);
1128
+ // Stash the completed reply's text for `/copy` (skip aborted/error turns,
1129
+ // whose text is partial or absent).
1130
+ if (this.streamingComponent)
1131
+ this.registerCopyBlock(this.streamingComponent, 'assistant', assistantVisibleText(event.message));
1132
+ if (event.message.stopReason !== 'aborted' && event.message.stopReason !== 'error') {
1133
+ const text = assistantVisibleText(event.message);
1134
+ if (text.trim()) {
1135
+ this.lastAssistantText = text;
1136
+ this.pushTranscriptText(text);
1137
+ }
1138
+ }
1139
+ if (this.streamingComponent) {
1140
+ const stopReason = event.message.stopReason;
1141
+ let errorMessage = event.message.errorMessage;
1142
+ // An aborted turn may be a user interrupt or a lifecycle interruption
1143
+ // (a refresh-yield aborts its own turn). Providers spell it several
1144
+ // ways — including `stopReason: 'error'` carrying a bare AbortError,
1145
+ // which would otherwise render as a red `Error: This operation was
1146
+ // aborted` for a perfectly healthy yield — so override it outright
1147
+ // with one plain, human label.
1148
+ if (endedByAbort(event.message)) {
1149
+ errorMessage = 'Interrupted';
1150
+ // Surface the abort on the assistant bubble itself, mirroring pi
1151
+ // (interactive-mode.js:2280 sets streamingMessage.errorMessage before
1152
+ // updateContent) so the rendered message shows the annotation. The
1153
+ // stopReason moves with it: pi's component reserves its red
1154
+ // `Error: …` line for stopReason 'error', and an abort is not one.
1155
+ event.message.errorMessage = errorMessage;
1156
+ event.message.stopReason = 'aborted';
1157
+ }
1158
+ this.streamingComponent.updateContent(event.message);
1159
+ if (stopReason === 'aborted' || stopReason === 'error') {
1160
+ const text = errorMessage ?? 'Error';
1161
+ for (const component of this.pendingTools.values()) {
1162
+ component.updateResult({ content: [{ type: 'text', text }], isError: true });
1163
+ this.registerCopyBlock(component, 'tool', text);
1164
+ this.settleGroupTool(component, { content: [{ type: 'text', text }], isError: true }, true);
1165
+ this.historyContainer.markDirty(component);
1166
+ }
1167
+ this.pendingTools.clear();
1168
+ }
1169
+ else {
1170
+ // Finalize renderer caches now that every tool argument is complete.
1171
+ for (const component of this.pendingTools.values()) {
1172
+ component.setArgsComplete();
1173
+ this.historyContainer.markDirty(component);
1174
+ }
1175
+ }
1176
+ this.historyContainer.markDirty(this.streamingComponent);
1177
+ this.streamingComponent = undefined;
1178
+ this.streamingToolSeparator = undefined;
1179
+ }
1180
+ if (endedWithFailure) {
1181
+ this.closeOpenGroup();
1182
+ // A summary normally follows this terminal frame, but re-evaluate now
1183
+ // too so an early recap immediately folds the tools before this seam.
1184
+ this.applyToolDisplay();
1185
+ }
1186
+ if (this.consolidateReplies) {
1187
+ // The finished message's prose moves into the reply; its live copy folds.
1188
+ this.recordTurnProse(event.message, true);
1189
+ if (this.openReplyTurn)
1190
+ this.refreshWorkingRow(this.openReplyTurn);
1191
+ this.applyToolDisplay();
1192
+ }
1193
+ break;
1194
+ }
1195
+ case 'tool_execution_start': {
1196
+ this.pushTranscriptValue(event.args);
1197
+ let component = this.pendingTools.get(event.toolCallId);
1198
+ if (!component) {
1199
+ component = this.appendToolComponent(event.toolName, event.toolCallId, event.args);
1200
+ this.pendingTools.set(event.toolCallId, component);
1201
+ }
1202
+ else {
1203
+ this.noteGroupTool(component, event.toolName, event.args);
1204
+ }
1205
+ component.markExecutionStarted();
1206
+ this.historyContainer.markDirty(component);
1207
+ break;
1208
+ }
1209
+ case 'tool_execution_update': {
1210
+ const result = this.projection.partialToolResults.get(event.toolCallId) ?? event.partialResult;
1211
+ this.pushTranscriptValue(result);
1212
+ const component = this.pendingTools.get(event.toolCallId);
1213
+ if (component) {
1214
+ component.updateResult(result, true);
1215
+ this.registerCopyBlock(component, 'tool', this.toolResultText(result));
1216
+ this.historyContainer.markDirty(component);
1217
+ }
1218
+ break;
1219
+ }
1220
+ case 'tool_execution_end': {
1221
+ const result = this.projection.partialToolResults.get(event.toolCallId) ?? event.result;
1222
+ this.pushTranscriptValue(result);
1223
+ const component = this.pendingTools.get(event.toolCallId);
1224
+ if (component) {
1225
+ component.updateResult(result);
1226
+ this.registerCopyBlock(component, 'tool', this.toolResultText(result));
1227
+ this.pendingTools.delete(event.toolCallId);
1228
+ this.settleGroupTool(component, result, event.isError);
1229
+ this.applyToolDisplay();
1230
+ this.historyContainer.markDirty(component);
1231
+ this.maybeAppendPageBlock(result);
1232
+ }
1233
+ break;
1234
+ }
1235
+ case 'compaction_start': {
1236
+ const label = event.reason === 'manual' ? 'Compacting context...' : 'Auto-compacting...';
1237
+ this.setActivity(this.makeLoader(label));
1238
+ break;
1239
+ }
1240
+ case 'compaction_end': {
1241
+ this.setActivity(this.runActive ? this.makeLoader(this.workingActivity) : undefined);
1242
+ if (event.aborted) {
1243
+ this.showStatus(event.reason === 'manual' ? 'Compaction cancelled' : 'Auto-compaction cancelled');
1244
+ }
1245
+ else if (event.result) {
1246
+ // 0.78.1 divergence from the §3.2 sketch: `compaction_end` carries only
1247
+ // the CompactionResult (summary + tokensBefore), NOT the post-compaction
1248
+ // message list — so the viewer cannot clear+rebuild the transcript the
1249
+ // way in-process pi does (it rebuilds from its own SessionManager). We
1250
+ // append the compaction summary marker instead and KEEP the
1251
+ // pre-compaction scrollback for the rest of this attach session; a fresh
1252
+ // re-attach gets the already-compacted history via `welcome`. (Reported
1253
+ // in T5's final.)
1254
+ this.addMessageToChat({
1255
+ role: 'compactionSummary',
1256
+ summary: event.result.summary,
1257
+ tokensBefore: event.result.tokensBefore,
1258
+ timestamp: Date.now(),
1259
+ });
1260
+ }
1261
+ else if (event.errorMessage) {
1262
+ this.showError(event.errorMessage);
1263
+ }
1264
+ break;
1265
+ }
1266
+ case 'auto_retry_start': {
1267
+ const seconds = Math.ceil(event.delayMs / 1000);
1268
+ this.setActivity(this.makeLoader(`Retrying (${event.attempt}/${event.maxAttempts}) in ${seconds}s...`));
1269
+ break;
1270
+ }
1271
+ case 'auto_retry_end': {
1272
+ this.setActivity(this.runActive ? this.makeLoader(this.workingActivity) : undefined);
1273
+ if (!event.success) {
1274
+ this.showError(`Retry failed after ${event.attempt} attempts: ${event.finalError ?? 'Unknown error'}`);
1275
+ }
1276
+ break;
1277
+ }
1278
+ // Footer/header-only — ChatView owns no footer; forward to the sink.
1279
+ case 'queue_update':
1280
+ case 'session_info_changed':
1281
+ case 'thinking_level_changed':
1282
+ this.onFooterEvent?.(event);
1283
+ break;
1284
+ // turn_start / turn_end — interactive pi ignores these (falls through
1285
+ // default); the viewer does too.
1286
+ default:
1287
+ break;
1288
+ }
1289
+ // No unconditional markDirty here: appends/removes invalidate through
1290
+ // MeasuredContainer, and branches that mutate a child in place explicitly
1291
+ // mark it dirty. Activity-only events leave settled history cached while the
1292
+ // independent status loader animates.
1293
+ this.tui.requestRender();
1294
+ }
1295
+ // `!` bash live stream (broker bash_start/bash_output/bash_end frames). Mirrors
1296
+ // pi interactive mode's `!` handling: create the component on start, stream
1297
+ // chunks into it, mark complete on end. The persisted `bashExecution` message
1298
+ // also rides the next snapshot, so this only drives the LIVE view.
1299
+ bashStart(command, excludeFromContext) {
1300
+ if (this.deferIfBuilding(() => this.bashStart(command, excludeFromContext)))
1301
+ return;
1302
+ this.projection = projectBashStart(this.projection, command, excludeFromContext);
1303
+ this.closeOpenGroup();
1304
+ this.settleBashComponent();
1305
+ let component;
1306
+ component = new BashExecutionComponent(command, this.componentTui(() => component), excludeFromContext);
1307
+ this.bashComponent = component;
1308
+ this.append(component);
1309
+ this.tui.requestRender();
1310
+ }
1311
+ bashOutput(chunk) {
1312
+ if (this.deferIfBuilding(() => this.bashOutput(chunk)))
1313
+ return;
1314
+ this.projection = projectBashOutput(this.projection, chunk);
1315
+ this.pushTranscriptText(chunk);
1316
+ if (this.bashComponent) {
1317
+ this.bashComponent.appendOutput(chunk);
1318
+ this.historyContainer.markDirty(this.bashComponent);
1319
+ }
1320
+ this.tui.requestRender();
1321
+ }
1322
+ bashEnd(result) {
1323
+ if (this.deferIfBuilding(() => this.bashEnd(result)))
1324
+ return;
1325
+ this.projection = projectBashEnd(this.projection, result);
1326
+ this.settleBashComponent(result);
1327
+ this.tui.requestRender();
1328
+ }
1329
+ // Rebuild path (ports addMessageToChat, interactive-mode.js:2483).
1330
+ addMessageToChat(message) {
1331
+ // Crouter-generated context retains its runtime role (user vs custom) so
1332
+ // delivery to the model is unchanged, but every attached view presents it
1333
+ // through one compact disclosure contract. The producer's envelope is what
1334
+ // classifies, so an ordinary user prompt cannot acquire this treatment and
1335
+ // saved transcripts gain it too.
1336
+ const card = parseCard(message);
1337
+ if (card !== null &&
1338
+ (message.role !== 'custom' || message.display === true)) {
1339
+ this.pushTranscriptText(card.body);
1340
+ // A person's inbox answer is the person speaking: their words leave the
1341
+ // card and render as their own message. A digest carrying nothing else
1342
+ // gets no card at all — but a passive backlog folded into the same body
1343
+ // is content, so the residue check keeps it from vanishing with the card.
1344
+ const answers = card.senders
1345
+ .flatMap((sender) => sender.entries)
1346
+ .filter(isHumanWordsEntry)
1347
+ .map((entry) => entry.body.trim())
1348
+ .filter((text) => text !== '');
1349
+ const onlyHumanWords = answers.length > 0
1350
+ && card.body.replace(INBOX_SENDER_SECTIONS, '').trim() === ''
1351
+ && card.senders.every((sender) => sender.entries.every(isHumanWordsEntry));
1352
+ if (!onlyHumanWords) {
1353
+ const presentation = presentationFor(card.kind);
1354
+ const component = new ContextMessageComponent(card, presentation, this.toolOutputExpanded, this.dimStyle, (s) => this.spinnerStyle(this.labelStyle(s)));
1355
+ // A boundary card is a visible seam, not a group member: the preceding
1356
+ // span keeps its own recap and the next tool call begins a
1357
+ // broker-aligned fresh group.
1358
+ if (isGroupBoundaryKind(card.kind)) {
1359
+ this.closeOpenGroup();
1360
+ this.append(component);
1361
+ }
1362
+ else {
1363
+ // A folded group hides its members, so whatever the card should leave
1364
+ // behind — a child's final, a recovery — reaches the recap here.
1365
+ this.appendGroupMember(component)?.activity.noteCard(card, presentation);
1366
+ }
1367
+ }
1368
+ for (const answer of answers)
1369
+ this.appendHumanAnswer(answer);
1370
+ return;
1371
+ }
1372
+ switch (message.role) {
1373
+ case 'bashExecution': {
1374
+ this.closeOpenGroup();
1375
+ this.pushTranscriptText(message.output ?? '');
1376
+ const component = new BashExecutionComponent(message.command, this.tui, message.excludeFromContext);
1377
+ if (message.output)
1378
+ component.appendOutput(message.output);
1379
+ component.setComplete(message.exitCode, message.cancelled,
1380
+ // pi's interactive mode passes a minimal `{truncated:true}` marker here
1381
+ // (interactive-mode.js:2489) where the typed param is the full
1382
+ // TruncationResult; the snapshot message only carries the boolean, so we
1383
+ // mirror pi and cast.
1384
+ message.truncated ? { truncated: true } : undefined, message.fullOutputPath);
1385
+ this.append(component);
1386
+ break;
1387
+ }
1388
+ case 'custom': {
1389
+ if (message.display) {
1390
+ this.pushTranscriptText(this.userMessageText(message));
1391
+ if (message.customType === CRTR_OUTPUT_CUSTOM_TYPE) {
1392
+ this.appendGroupMember(new CrtrOutputMessageComponent(this.userMessageText(message), this.toolOutputExpanded, this.crtrOutputTheme()));
1393
+ break;
1394
+ }
1395
+ // A refresh-yield cycle boundary (session-cycles.ts, synthetic — never
1396
+ // persisted): render as a dim rule rather than the generic custom-
1397
+ // message card, so scrolling through a multi-cycle node's full history
1398
+ // reads as one conversation with clear seams between cycles.
1399
+ if (message.customType === CRTR_CYCLE_DIVIDER_CUSTOM_TYPE) {
1400
+ this.closeOpenGroup();
1401
+ this.append(new Spacer(1));
1402
+ this.append(new Text(this.dimStyle(`── ${this.userMessageText(message)} ──`), 1, 0));
1403
+ this.append(new Spacer(1));
1404
+ break;
1405
+ }
1406
+ const component = new CustomMessageComponent(styleAttachMessageMarkdown(message), undefined, attachMarkdownTheme());
1407
+ component.setExpanded(this.toolOutputExpanded);
1408
+ this.appendGroupMember(component);
1409
+ }
1410
+ break;
1411
+ }
1412
+ case 'compactionSummary': {
1413
+ this.closeOpenGroup();
1414
+ this.append(new Spacer(1));
1415
+ const component = new CompactionSummaryMessageComponent(styleAttachSummaryMarkdown(message), attachMarkdownTheme());
1416
+ component.setExpanded(this.toolOutputExpanded);
1417
+ this.append(component);
1418
+ break;
1419
+ }
1420
+ case 'branchSummary': {
1421
+ this.closeOpenGroup();
1422
+ this.append(new Spacer(1));
1423
+ const component = new BranchSummaryMessageComponent(styleAttachSummaryMarkdown(message), attachMarkdownTheme());
1424
+ component.setExpanded(this.toolOutputExpanded);
1425
+ this.append(component);
1426
+ this.registerCopyBlock(component, 'assistant', message.summary);
1427
+ break;
1428
+ }
1429
+ case 'user': {
1430
+ if (isTrueUserMessage(message))
1431
+ this.closeOpenGroup();
1432
+ // Consolidated replies: the person's message stands outside every turn
1433
+ // and opens the next one, whose reply sits directly beneath it.
1434
+ if (isTrueUserMessage(message) && this.consolidatingHere()) {
1435
+ // A turn carried over from condensed history ends here; give it its reply.
1436
+ if (!this.openReplyTurn && this.carriedTurn.prose.length > 0)
1437
+ this.currentTurn();
1438
+ this.outsideTurns++;
1439
+ try {
1440
+ this.appendUserMessage(message);
1441
+ }
1442
+ finally {
1443
+ this.outsideTurns--;
1444
+ }
1445
+ this.beginTurn(messageKey(message) ?? `local-${this.turns.length}`);
1446
+ break;
1447
+ }
1448
+ this.appendUserMessage(message);
1449
+ break;
1450
+ }
1451
+ case 'assistant': {
1452
+ const hasProse = assistantVisibleText(message).trim() !== '';
1453
+ if (hasProse)
1454
+ this.closeOpenGroup();
1455
+ this.appendAssistantMessage(message, !hasProse);
1456
+ break;
1457
+ }
1458
+ // toolResult is rendered inline with its tool call (handled in applySnapshot).
1459
+ default:
1460
+ break;
1461
+ }
1462
+ }
1463
+ appendUserMessage(message) {
1464
+ const textContent = this.userMessageText(message);
1465
+ if (!textContent)
1466
+ return;
1467
+ this.pushTranscriptText(textContent);
1468
+ if (this.chatChildCount() > 0)
1469
+ this.appendUserPart(new Spacer(1), !isTrueUserMessage(message));
1470
+ const skillBlock = parseSkillBlock(textContent);
1471
+ if (skillBlock) {
1472
+ // SkillInvocationMessageComponent has no transformer seam, so its body
1473
+ // is still styled before construction.
1474
+ const component = new SkillInvocationMessageComponent({ ...skillBlock, content: styleAttachMarkdownSource(skillBlock.content) }, attachMarkdownTheme());
1475
+ component.setExpanded(this.toolOutputExpanded);
1476
+ this.appendUserPart(component, !isTrueUserMessage(message));
1477
+ this.registerCopyBlock(component, 'user', textContent);
1478
+ if (skillBlock.userMessage) {
1479
+ const userMessage = new UserMessageComponent(skillBlock.userMessage, attachMarkdownTheme(), undefined, this.markdownTransformers);
1480
+ this.appendUserPart(userMessage, !isTrueUserMessage(message));
1481
+ this.registerCopyBlock(userMessage, 'user', skillBlock.userMessage);
1482
+ }
1483
+ }
1484
+ else {
1485
+ const component = new UserMessageComponent(textContent, attachMarkdownTheme(), undefined, this.markdownTransformers);
1486
+ this.appendUserPart(component, !isTrueUserMessage(message));
1487
+ this.registerCopyBlock(component, 'user', textContent);
1488
+ }
1489
+ }
1490
+ // Helpers
1491
+ /** Render an assistant reply plus its initially-hidden boundary separator.
1492
+ * A turn that ended on its own abort is rendered as the interrupt it is,
1493
+ * matching the live seam above, so re-reading the transcript later never
1494
+ * turns a healthy interrupt into a red `Error:` line. */
1495
+ appendAssistantMessage(message, groupMember = false) {
1496
+ const component = new ViewerAssistantMessageComponent(undefined, this.hideThinking, attachMarkdownTheme(), this.hiddenThinkingLabel, this.markdownTransformers);
1497
+ const rendered = endedByAbort(message)
1498
+ ? { ...message, stopReason: 'aborted', errorMessage: 'Interrupted' }
1499
+ : message;
1500
+ component.updateContent(rendered);
1501
+ this.appendAssistantPart(component, groupMember);
1502
+ this.registerCopyBlock(component, 'assistant', assistantVisibleText(message));
1503
+ const separator = this.appendAssistantSeparator(groupMember);
1504
+ this.setAssistantSeparatorContent(separator, message);
1505
+ return separator;
1506
+ }
1507
+ /** Add a separator in transcript order now; it renders only after a following
1508
+ * tool settles in the folded view. */
1509
+ appendAssistantSeparator(groupMember = false) {
1510
+ const separator = new FoldedToolSeparator();
1511
+ if (groupMember)
1512
+ this.appendGroupMember(separator);
1513
+ else
1514
+ this.append(separator);
1515
+ return separator;
1516
+ }
1517
+ appendAssistantPart(component, groupMember) {
1518
+ if (groupMember)
1519
+ this.appendGroupMember(component);
1520
+ else
1521
+ this.append(component);
1522
+ }
1523
+ appendUserPart(component, groupMember) {
1524
+ if (groupMember)
1525
+ this.appendGroupMember(component);
1526
+ else
1527
+ this.append(component);
1528
+ }
1529
+ /** An answer the person typed in their inbox renders exactly like a message
1530
+ * they typed here, and closes the run around it the same way. */
1531
+ appendHumanAnswer(text) {
1532
+ this.outsideTurns++;
1533
+ try {
1534
+ this.appendHumanAnswerParts(text);
1535
+ }
1536
+ finally {
1537
+ this.outsideTurns--;
1538
+ }
1539
+ }
1540
+ appendHumanAnswerParts(text) {
1541
+ this.closeOpenGroup();
1542
+ const live = this.appendTarget === this.historyContainer;
1543
+ if (this.chatChildCount() > 0) {
1544
+ const spacer = new Spacer(1);
1545
+ this.append(spacer);
1546
+ if (live)
1547
+ this.trackInboxAnswer(spacer);
1548
+ }
1549
+ const component = new UserMessageComponent(text, attachMarkdownTheme(), undefined, this.markdownTransformers);
1550
+ this.append(component);
1551
+ if (live)
1552
+ this.trackInboxAnswer(component);
1553
+ this.registerCopyBlock(component, 'user', text);
1554
+ }
1555
+ trackInboxAnswer(component) {
1556
+ this.inboxAnswers.add(component);
1557
+ if (this.hidesInboxExchange())
1558
+ this.historyContainer.setHidden(component, true);
1559
+ }
1560
+ /** Only the full-fidelity trailing region gets summary groups. Condensed
1561
+ * history intentionally drops tool traffic, so grouping there would create
1562
+ * phantom summary rows and cross the live/condensed boundary. */
1563
+ isLiveGroupRegion() {
1564
+ return this.appendTarget === this.historyContainer;
1565
+ }
1566
+ ensureGroup() {
1567
+ if (!this.isLiveGroupRegion())
1568
+ return undefined;
1569
+ if (this.openGroup)
1570
+ return this.openGroup;
1571
+ const recap = new GroupRecapComponent();
1572
+ const group = {
1573
+ members: [],
1574
+ recap,
1575
+ activity: new GroupActivityRecorder(this.cwd, this.nodeRoster),
1576
+ toolCount: 0,
1577
+ inFlight: new Set(),
1578
+ };
1579
+ this.append(recap);
1580
+ // The recap is a direct history child for cache identity, but zero-row and
1581
+ // hidden until a settled broker summary makes this group collapsible.
1582
+ this.historyContainer.setHidden(recap, true);
1583
+ this.groups.push(group);
1584
+ this.openGroup = group;
1585
+ return group;
1586
+ }
1587
+ closeOpenGroup() {
1588
+ this.openGroup = undefined;
1589
+ }
1590
+ appendGroupMember(component) {
1591
+ const group = this.ensureGroup();
1592
+ this.append(component);
1593
+ if (group)
1594
+ group.members.push(component);
1595
+ return group;
1596
+ }
1597
+ removeGroupMember(component) {
1598
+ for (const group of this.groups) {
1599
+ const index = group.members.indexOf(component);
1600
+ if (index !== -1)
1601
+ group.members.splice(index, 1);
1602
+ }
1603
+ this.historyContainer.setHidden(component, false);
1604
+ }
1605
+ /** Add one tool as a group member, moving the assistant's boundary separator
1606
+ * behind the new summary row without changing the separator's identity. */
1607
+ appendToolComponent(name, id, args) {
1608
+ const trailingSeparator = this.isLiveGroupRegion() &&
1609
+ !this.openGroup &&
1610
+ this.historyContainer.children.at(-1) instanceof FoldedToolSeparator
1611
+ ? this.historyContainer.children.at(-1)
1612
+ : undefined;
1613
+ if (trailingSeparator)
1614
+ this.historyContainer.removeChild(trailingSeparator);
1615
+ const group = this.ensureGroup();
1616
+ if (trailingSeparator) {
1617
+ this.append(trailingSeparator);
1618
+ group?.members.push(trailingSeparator);
1619
+ }
1620
+ const component = this.makeToolComponent(name, id, args);
1621
+ component.activityCallId = id;
1622
+ this.appendGroupMember(component);
1623
+ this.registerCopyBlock(component, 'tool', '');
1624
+ if (group) {
1625
+ group.key ??= id;
1626
+ group.toolCount++;
1627
+ group.inFlight.add(component);
1628
+ group.activity.noteCall(id, name, args);
1629
+ }
1630
+ return component;
1631
+ }
1632
+ noteGroupTool(component, name, args) {
1633
+ if (!component.activityCallId)
1634
+ return;
1635
+ for (const group of this.groups) {
1636
+ if (group.members.includes(component))
1637
+ group.activity.noteCall(component.activityCallId, name, args);
1638
+ }
1639
+ }
1640
+ settleGroupTool(component, result, isError = false) {
1641
+ for (const group of this.groups) {
1642
+ group.inFlight.delete(component);
1643
+ if (!component.activityCallId || !group.members.includes(component))
1644
+ continue;
1645
+ if (result === undefined)
1646
+ group.activity.resolveWithoutResult(component.activityCallId);
1647
+ else
1648
+ group.activity.settle(component.activityCallId, result, isError);
1649
+ }
1650
+ }
1651
+ /** An assistant starts as a non-boundary while its text is empty. Visible prose
1652
+ * or a terminal failure turns it into a boundary without recreating either
1653
+ * pi-owned component (their direct-child cache identities remain intact). */
1654
+ promoteStreamingAssistantToBoundary(message, force = false) {
1655
+ if (!this.streamingWasGroupMember || (!force && assistantVisibleText(message).trim() === ''))
1656
+ return;
1657
+ if (this.streamingComponent)
1658
+ this.removeGroupMember(this.streamingComponent);
1659
+ if (this.streamingToolSeparator)
1660
+ this.removeGroupMember(this.streamingToolSeparator);
1661
+ this.streamingWasGroupMember = false;
1662
+ this.closeOpenGroup();
1663
+ }
1664
+ seedToolGroupSummaries(summaries) {
1665
+ this.groupSummaries.clear();
1666
+ for (const [key, summary] of Object.entries(summaries))
1667
+ this.groupSummaries.set(key, summary);
1668
+ }
1669
+ /** Broker frames can arrive before or after their group's events, and snapshot
1670
+ * rebuilding defers them through the single-writer gate, so this stores first
1671
+ * and applies to every currently-rendered matching group. */
1672
+ applyToolGroupSummary(key, summary) {
1673
+ if (this.deferIfBuilding(() => this.applyToolGroupSummary(key, summary)))
1674
+ return;
1675
+ this.projection = projectToolGroupSummary(this.projection, key, summary);
1676
+ const projected = this.projection.toolGroupSummaryDetails[key];
1677
+ if (projected === undefined)
1678
+ return;
1679
+ this.groupSummaries.set(key, projected);
1680
+ this.applyToolDisplay();
1681
+ }
1682
+ applyGroupDisplay(group, turnFolded) {
1683
+ const summary = group.key === undefined ? undefined : this.groupSummaries.get(group.key);
1684
+ const collapsed = this.foldSettledTools &&
1685
+ this.showGroupSummaries &&
1686
+ group.toolCount > 0 &&
1687
+ group.inFlight.size === 0 &&
1688
+ summary !== undefined;
1689
+ group.recap.setRecap(collapsed ? summary : undefined, group.toolCount, group.activity.activity(), this.detailedToolRecaps, this.recapPalette);
1690
+ this.historyContainer.setHidden(group.recap, !collapsed || turnFolded.has(group.recap));
1691
+ for (const member of group.members)
1692
+ this.historyContainer.setHidden(member, collapsed || turnFolded.has(member));
1693
+ }
1694
+ /** Make each separator visible only if its immediately-following tool call is
1695
+ * actually folded; in-flight calls remain flush with their live output. */
1696
+ updateFoldedToolSeparators(inFlight = new Set(this.pendingTools.values())) {
1697
+ const children = this.historyContainer.children;
1698
+ for (let i = 0; i < children.length; i++) {
1699
+ const separator = children[i];
1700
+ if (!(separator instanceof FoldedToolSeparator))
1701
+ continue;
1702
+ const followingTool = children[i + 1];
1703
+ separator.setFolded(this.foldSettledTools &&
1704
+ !this.historyContainer.hiddenChildren.has(separator) &&
1705
+ followingTool instanceof MinimizableToolComponent &&
1706
+ !this.historyContainer.hiddenChildren.has(followingTool) &&
1707
+ !inFlight.has(followingTool));
1708
+ this.historyContainer.markDirty(separator);
1709
+ }
1710
+ }
1711
+ /** Track whether an assistant response contains prose or thinking, then make
1712
+ * its separator eligible only for content the current Ctrl+T setting shows. */
1713
+ setAssistantSeparatorContent(separator, message) {
1714
+ const content = message.content;
1715
+ const parts = Array.isArray(content) ? content : [];
1716
+ const hasText = parts.some((part) => typeof part === 'object' &&
1717
+ part !== null &&
1718
+ part.type === 'text' &&
1719
+ typeof part.text === 'string' &&
1720
+ part.text.trim() !== '');
1721
+ const hasThinking = parts.some((part) => typeof part === 'object' &&
1722
+ part !== null &&
1723
+ part.type === 'thinking' &&
1724
+ typeof part.thinking === 'string' &&
1725
+ part.thinking.trim() !== '');
1726
+ this.foldedToolSeparatorContents.set(separator, { hasText, hasThinking });
1727
+ separator.setSeparatesToolGroup(hasText || (!this.hideThinking && hasThinking));
1728
+ }
1729
+ /** Tool component with native viewer renderers for crouter-owned tool output. */
1730
+ makeToolComponent(name, id, args) {
1731
+ const fold = new FoldedToolCallController();
1732
+ let resultObserver;
1733
+ let toolDefinition;
1734
+ if (name === 'bash') {
1735
+ const crtr = createCrtrBashToolDefinition(args, fold);
1736
+ if (crtr === undefined) {
1737
+ toolDefinition = createCrtrPlainBashToolDefinition(this.cwd, fold, this.backgroundBashHint);
1738
+ }
1739
+ else {
1740
+ toolDefinition = crtr.definition;
1741
+ }
1742
+ }
1743
+ else if (name === 'edit') {
1744
+ const edit = createCrtrEditToolDefinition(this.cwd, fold);
1745
+ toolDefinition = edit.definition;
1746
+ resultObserver = edit.observeResult;
1747
+ }
1748
+ else if (name === 'read') {
1749
+ toolDefinition = createCrtrReadToolDefinition(this.cwd, fold);
1750
+ }
1751
+ else if (name === 'write') {
1752
+ toolDefinition = createCrtrWriteToolDefinition(this.cwd, fold);
1753
+ }
1754
+ let component;
1755
+ component = new MinimizableToolComponent(name, id, args, { showImages: this.showImages, imageWidthCells: this.imageWidthCells }, toolDefinition, this.componentTui(() => component), this.cwd);
1756
+ component.setToolView(toolDefinition === undefined ? undefined : fold, resultObserver);
1757
+ component.setExpanded(this.toolOutputExpanded);
1758
+ return component;
1759
+ }
1760
+ /** Append conversation content above the independent live status area — or into
1761
+ * the nested container while condensed history is under construction. */
1762
+ append(child) {
1763
+ if (this.outsideTurns === 0 && this.consolidatingHere()) {
1764
+ const turn = this.currentTurn();
1765
+ this.appendTarget.addChild(child);
1766
+ turn.members.add(child);
1767
+ return;
1768
+ }
1769
+ this.appendTarget.addChild(child);
1770
+ }
1771
+ /** Number of rendered conversation components in the container currently being
1772
+ * appended to (live history or the nested condensed region). */
1773
+ chatChildCount() {
1774
+ return this.appendTarget.children.length;
1775
+ }
1776
+ /** Clear all chat content. */
1777
+ resetChat() {
1778
+ this.setActivity(undefined);
1779
+ this.settleBashComponent();
1780
+ this.streamingComponent = undefined;
1781
+ this.streamingToolSeparator = undefined;
1782
+ this.streamingWasGroupMember = false;
1783
+ this.foldedToolSeparatorContents.clear();
1784
+ this.groups.length = 0;
1785
+ this.openGroup = undefined;
1786
+ this.turns.length = 0;
1787
+ this.openReplyTurn = undefined;
1788
+ this.carriedTurn = { key: START_TURN_KEY, prose: [] };
1789
+ this.turnHidden = new Set();
1790
+ this.groupSummaries.clear();
1791
+ this.nodeRoster.clear();
1792
+ this.pendingTools.clear();
1793
+ this.lastAssistantText = undefined;
1794
+ this.copyBlockRecords.length = 0;
1795
+ this.copyIndex.clear();
1796
+ this.transcriptFilePaths.length = 0;
1797
+ this.transcriptDocRefs.length = 0;
1798
+ this.pageBlocks.clear();
1799
+ this.inboxAnswers.clear();
1800
+ this.historyContainer.clear();
1801
+ }
1802
+ /** Place the transcript block for an inline page a `human send` just raised.
1803
+ * The block is a plain history child, NOT a tool-group member: collapsing the
1804
+ * tool group folds the command away and leaves the page itself on screen, the
1805
+ * way assistant prose stays. Condensed history is skipped deliberately — old
1806
+ * cycles keep only prose and cycle seams. */
1807
+ maybeAppendPageBlock(result) {
1808
+ if (!this.inlinePageBlocks || this.appendTarget !== this.historyContainer)
1809
+ return;
1810
+ const page = detectInlinePageResult(result);
1811
+ if (page === undefined || this.pageBlocks.has(page.pageId))
1812
+ return;
1813
+ const block = new PageBlockComponent(page.pageId, this.pageOpenHint);
1814
+ this.pageBlocks.set(page.pageId, block);
1815
+ // A page asks the person something; it never folds into the working.
1816
+ this.outsideTurns++;
1817
+ try {
1818
+ this.append(block);
1819
+ }
1820
+ finally {
1821
+ this.outsideTurns--;
1822
+ }
1823
+ // The block is placed empty and fills itself from the daemon: reading a
1824
+ // request is a round trip, and the transcript must not block on one.
1825
+ void this.loadPageBlock(block);
1826
+ }
1827
+ async loadPageBlock(block) {
1828
+ if (!(await block.refresh()))
1829
+ return;
1830
+ this.historyContainer.setHidden(block, this.hidesInboxExchange() && block.settled);
1831
+ this.historyContainer.markDirty(block);
1832
+ this.tui.requestRender();
1833
+ }
1834
+ /** Re-measure the tool calls still in flight. A silent long-running command
1835
+ * emits no tool-execution update, so nothing else would evict its cached
1836
+ * lines and its backgrounding hint would never appear. Driven by the
1837
+ * viewer's existing low-rate chrome poll, and cheap because it touches only
1838
+ * in-flight tools — usually one, never the transcript. */
1839
+ refreshInFlightTools() {
1840
+ if (this.pendingTools.size === 0)
1841
+ return;
1842
+ for (const component of this.pendingTools.values())
1843
+ this.historyContainer.markDirty(component);
1844
+ this.tui.requestRender();
1845
+ }
1846
+ /** Re-read every placed page through the daemon. Driven by the viewer's
1847
+ * ticket-activity watcher, so an answer, a cancellation, or a `--replace`
1848
+ * revision lands on the block already anchored in the transcript. */
1849
+ async refreshPageBlocks() {
1850
+ const blocks = [...this.pageBlocks.values()];
1851
+ const changed = await Promise.all(blocks.map(async (block) => {
1852
+ const moved = await block.refresh();
1853
+ if (moved) {
1854
+ this.historyContainer.setHidden(block, this.hidesInboxExchange() && block.settled);
1855
+ this.historyContainer.markDirty(block);
1856
+ }
1857
+ return moved;
1858
+ }));
1859
+ if (changed.some(Boolean))
1860
+ this.tui.requestRender();
1861
+ }
1862
+ makeLoader(message) {
1863
+ // Loader updates itself on an interval. Its TUI callback has to evict the
1864
+ // status block's cached frame before requesting the next render.
1865
+ let loader;
1866
+ const statusTui = {
1867
+ requestRender: (force) => {
1868
+ if (loader && !this.onActivityChange)
1869
+ this.statusContainer.markDirty(loader);
1870
+ this.tui.requestRender(force);
1871
+ },
1872
+ terminal: this.tui.terminal,
1873
+ };
1874
+ loader = new Loader(statusTui, this.spinnerStyle, this.dimStyle, message);
1875
+ return loader;
1876
+ }
1877
+ /** Let a self-updating history child invalidate only its own cached lines. */
1878
+ componentTui(component) {
1879
+ return {
1880
+ requestRender: (force) => {
1881
+ this.historyContainer.markDirty(component());
1882
+ this.tui.requestRender(force);
1883
+ },
1884
+ terminal: this.tui.terminal,
1885
+ };
1886
+ }
1887
+ /** Complete and release the live bash component before ChatView gives up ownership. */
1888
+ settleBashComponent(result) {
1889
+ if (!this.bashComponent)
1890
+ return;
1891
+ const component = this.bashComponent;
1892
+ component.setComplete(result?.exitCode, result?.cancelled ?? true, result?.truncated ? { truncated: true } : undefined, result?.fullOutputPath);
1893
+ this.historyContainer.markDirty(component);
1894
+ this.bashComponent = undefined;
1895
+ }
1896
+ /** Swap the single active activity indicator (working/compaction/retry). */
1897
+ setActivity(loader) {
1898
+ this.activityLoader?.stop();
1899
+ this.activityLoader = loader;
1900
+ if (this.onActivityChange) {
1901
+ this.onActivityChange(loader);
1902
+ return;
1903
+ }
1904
+ this.statusContainer.clear();
1905
+ if (loader)
1906
+ this.statusContainer.addChild(loader);
1907
+ }
1908
+ showStatus(message) {
1909
+ this.closeOpenGroup();
1910
+ this.append(new Spacer(1));
1911
+ this.append(new Text(this.dimStyle(message), 1, 0));
1912
+ }
1913
+ /** Append an error to the transcript. pi's own error events land here, and so
1914
+ * do the broker's `error` frames: their text is the engine's own and is
1915
+ * routinely multi-line (pi's login help is three lines), which the one-row
1916
+ * status notice cannot show. */
1917
+ showError(message) {
1918
+ if (this.deferIfBuilding(() => this.showError(message)))
1919
+ return;
1920
+ this.closeOpenGroup();
1921
+ // An error stays in view even when consolidated replies fold the turn.
1922
+ this.outsideTurns++;
1923
+ try {
1924
+ this.append(new Spacer(1));
1925
+ this.append(new Text(this.errorStyle(message), 1, 0));
1926
+ }
1927
+ finally {
1928
+ this.outsideTurns--;
1929
+ }
1930
+ this.tui.requestRender();
1931
+ }
1932
+ crtrOutputTheme() {
1933
+ return {
1934
+ fg: (name, text) => {
1935
+ if (name === 'error')
1936
+ return this.errorStyle(text);
1937
+ if (name === 'warning' || name === 'accent' || name === 'toolTitle' || name === 'success')
1938
+ return this.spinnerStyle(text);
1939
+ if (name === 'muted')
1940
+ return this.dimStyle(text);
1941
+ return text;
1942
+ },
1943
+ bg: (_name, text) => text,
1944
+ bold: (text) => this.labelStyle(text),
1945
+ };
1946
+ }
1947
+ /** Extract the tool-call content items from an assistant message. */
1948
+ assistantToolCalls(message) {
1949
+ const content = message.content;
1950
+ if (!Array.isArray(content))
1951
+ return [];
1952
+ return content.filter((c) => typeof c === 'object' && c !== null && c.type === 'toolCall');
1953
+ }
1954
+ /** Existing file paths from the rendered transcript, newest first. */
1955
+ getTranscriptFilePathsNewestFirst() {
1956
+ return [...this.transcriptFilePaths];
1957
+ }
1958
+ /** `[[ref]]` document references from the transcript, newest first, deduped. */
1959
+ getTranscriptDocRefsNewestFirst() {
1960
+ return [...this.transcriptDocRefs];
1961
+ }
1962
+ /** Re-run every Markdown transform: a document link's rendered target changed. */
1963
+ refreshMarkdown() {
1964
+ this.historyContainer.invalidate();
1965
+ this.tui.requestRender();
1966
+ }
1967
+ /** The text of the most recent assistant message, for `/copy`. Undefined when
1968
+ * no assistant message has been seen (or it had no text content). */
1969
+ getLastAssistantText() {
1970
+ const t = this.lastAssistantText?.trim();
1971
+ return t ? t : undefined;
1972
+ }
1973
+ /** Copyable source text for a transcript block, if it has any. */
1974
+ blockText(block) {
1975
+ const index = this.copyIndex.get(block);
1976
+ return index === undefined ? undefined : this.copyBlockRecords[index]?.text;
1977
+ }
1978
+ /** The canonical ordered copy record, oldest → newest. */
1979
+ copyBlocks() {
1980
+ return this.copyBlockRecords;
1981
+ }
1982
+ /** Newest tool call's result text (`/copy-tool`). */
1983
+ getLastToolOutputText() {
1984
+ for (let i = this.copyBlockRecords.length - 1; i >= 0; i--) {
1985
+ const copyBlock = this.copyBlockRecords[i];
1986
+ if (copyBlock.kind !== 'tool')
1987
+ continue;
1988
+ return copyBlock.text.trim() === '' ? undefined : copyBlock.text;
1989
+ }
1990
+ return undefined;
1991
+ }
1992
+ /** Every copyable block's text, oldest → newest, joined by blank lines. */
1993
+ getTranscriptPlainText() {
1994
+ return this.copyBlockRecords
1995
+ .map((copyBlock) => copyBlock.text)
1996
+ .filter((text) => text.trim() !== '')
1997
+ .join('\n\n');
1998
+ }
1999
+ registerCopyBlock(block, kind, text) {
2000
+ const condensedCopyBlocks = this.condensedCopyBlocks.get(this.appendTarget);
2001
+ if (condensedCopyBlocks) {
2002
+ const index = condensedCopyBlocks.findIndex((copyBlock) => copyBlock.block === block);
2003
+ if (index === -1)
2004
+ condensedCopyBlocks.push({ block, kind, text });
2005
+ else
2006
+ condensedCopyBlocks[index].text = text;
2007
+ return;
2008
+ }
2009
+ const index = this.copyIndex.get(block);
2010
+ if (index === undefined) {
2011
+ this.copyIndex.set(block, this.copyBlockRecords.length);
2012
+ this.copyBlockRecords.push({ block, kind, text });
2013
+ }
2014
+ else {
2015
+ this.copyBlockRecords[index].text = text;
2016
+ }
2017
+ }
2018
+ unregisterCopyBlock(block) {
2019
+ const condensedCopyBlocks = this.condensedCopyBlocks.get(this.appendTarget);
2020
+ if (condensedCopyBlocks) {
2021
+ const index = condensedCopyBlocks.findIndex((copyBlock) => copyBlock.block === block);
2022
+ if (index !== -1)
2023
+ condensedCopyBlocks.splice(index, 1);
2024
+ return;
2025
+ }
2026
+ const index = this.copyIndex.get(block);
2027
+ if (index === undefined)
2028
+ return;
2029
+ this.copyBlockRecords.splice(index, 1);
2030
+ this.copyIndex.delete(block);
2031
+ for (let i = index; i < this.copyBlockRecords.length; i++) {
2032
+ this.copyIndex.set(this.copyBlockRecords[i].block, i);
2033
+ }
2034
+ }
2035
+ appendCondensedBlock({ component, copyBlocks }) {
2036
+ this.outsideTurns++;
2037
+ try {
2038
+ this.append(component);
2039
+ }
2040
+ finally {
2041
+ this.outsideTurns--;
2042
+ }
2043
+ this.registerCopyBlock(component, 'condensed', copyBlocks.map((copyBlock) => copyBlock.text).filter((text) => text.trim() !== '').join('\n\n'));
2044
+ }
2045
+ /** Flatten arbitrary tool result payloads into the visible text copy target. */
2046
+ toolResultText(result) {
2047
+ if (typeof result === 'string')
2048
+ return result;
2049
+ if (typeof result === 'object' && result !== null && 'content' in result) {
2050
+ const content = result.content;
2051
+ if (typeof content === 'string')
2052
+ return content;
2053
+ if (Array.isArray(content)) {
2054
+ return content
2055
+ .filter((part) => typeof part === 'object' &&
2056
+ part !== null &&
2057
+ part.type === 'text' &&
2058
+ typeof part.text === 'string')
2059
+ .map((part) => part.text)
2060
+ .join('');
2061
+ }
2062
+ }
2063
+ try {
2064
+ const text = JSON.stringify(result);
2065
+ return typeof text === 'string' ? text : '';
2066
+ }
2067
+ catch {
2068
+ return '';
2069
+ }
2070
+ }
2071
+ pushTranscriptText(text) {
2072
+ const trimmed = text.trim();
2073
+ if (trimmed === '')
2074
+ return;
2075
+ const refs = [...new Set(extractDocRefs(trimmed).reverse())];
2076
+ if (refs.length > 0) {
2077
+ const nextRefs = [...refs, ...this.transcriptDocRefs.filter((ref) => !refs.includes(ref))].slice(0, 50);
2078
+ this.transcriptDocRefs.splice(0, this.transcriptDocRefs.length, ...nextRefs);
2079
+ }
2080
+ const paths = extractFilePaths([trimmed], this.cwd);
2081
+ if (paths.length === 0)
2082
+ return;
2083
+ const next = [...paths, ...this.transcriptFilePaths.filter((path) => !paths.includes(path))].slice(0, 50);
2084
+ this.transcriptFilePaths.splice(0, this.transcriptFilePaths.length, ...next);
2085
+ }
2086
+ pushTranscriptValue(value) {
2087
+ try {
2088
+ const text = typeof value === 'string' ? value : JSON.stringify(value);
2089
+ if (typeof text === 'string')
2090
+ this.pushTranscriptText(text);
2091
+ }
2092
+ catch {
2093
+ // Tool payloads that cannot serialize are not transcript text.
2094
+ }
2095
+ }
2096
+ /** Concatenate the text blocks of a user message (string or content array). */
2097
+ userMessageText(message) {
2098
+ const content = message.content;
2099
+ if (typeof content === 'string')
2100
+ return content;
2101
+ if (!Array.isArray(content))
2102
+ return '';
2103
+ return content
2104
+ .filter((c) => typeof c === 'object' && c !== null && c.type === 'text')
2105
+ .map((c) => c.text)
2106
+ .join('');
2107
+ }
2108
+ }