@elabs-ai/components-ai 4.1.0 → 5.0.0

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 (527) hide show
  1. package/README.md +3 -3
  2. package/dist/{_audio-player-media-chrome-T3XVXWRZ.js → _audio-player-media-chrome.js} +1 -1
  3. package/dist/_code-block-theme.js +12 -0
  4. package/dist/_code-block-theme.js.map +1 -0
  5. package/dist/{_flow-boundary-SHNWLQG5.js → _flow-boundary.js} +1 -1
  6. package/dist/_flow-boundary.js.map +1 -0
  7. package/dist/_flow-lazy.js +8 -0
  8. package/dist/_flow-lazy.js.map +1 -0
  9. package/dist/_lazy-boundary-conformance.js +2 -0
  10. package/dist/_lazy-boundary-conformance.js.map +1 -0
  11. package/dist/_lazy-cjk.js +13 -0
  12. package/dist/_lazy-cjk.js.map +1 -0
  13. package/dist/_lazy-engine-boundary.js +9 -0
  14. package/dist/_lazy-engine-boundary.js.map +1 -0
  15. package/dist/_lazy-math.js +13 -0
  16. package/dist/_lazy-math.js.map +1 -0
  17. package/dist/_lazy-mermaid.js +12 -0
  18. package/dist/_lazy-mermaid.js.map +1 -0
  19. package/dist/_mermaid-error-panel.js +9 -0
  20. package/dist/_mermaid-error-panel.js.map +1 -0
  21. package/dist/{_persona-rive-JEG44YHX.js → _persona-rive.js} +19 -24
  22. package/dist/_persona-rive.js.map +1 -0
  23. package/dist/_streamdown-i18n.js +21 -0
  24. package/dist/_streamdown-i18n.js.map +1 -0
  25. package/dist/_streamdown-safety.js +10 -0
  26. package/dist/_streamdown-safety.js.map +1 -0
  27. package/dist/_theme-scope-store.js +13 -0
  28. package/dist/_theme-scope-store.js.map +1 -0
  29. package/dist/a2ui/a2ui-surface.js +17 -0
  30. package/dist/a2ui/a2ui-surface.js.map +1 -0
  31. package/dist/a2ui/core/catalog.generated.js +10 -0
  32. package/dist/a2ui/core/catalog.generated.js.map +1 -0
  33. package/dist/a2ui/core/complete-json.js +10 -0
  34. package/dist/a2ui/core/complete-json.js.map +1 -0
  35. package/dist/a2ui/core/index.js +37 -0
  36. package/dist/a2ui/core/index.js.map +1 -0
  37. package/dist/a2ui/core/schema.js +11 -0
  38. package/dist/a2ui/core/schema.js.map +1 -0
  39. package/dist/a2ui/core/spec.js +10 -0
  40. package/dist/a2ui/core/spec.js.map +1 -0
  41. package/dist/a2ui/core/validate.js +16 -0
  42. package/dist/a2ui/core/validate.js.map +1 -0
  43. package/dist/a2ui/index.js +54 -0
  44. package/dist/a2ui/index.js.map +1 -0
  45. package/dist/a2ui/ui-catalog.js +18 -0
  46. package/dist/a2ui/ui-catalog.js.map +1 -0
  47. package/dist/agent-event.js +10 -0
  48. package/dist/agent-event.js.map +1 -0
  49. package/dist/agent-timeline.js +11 -0
  50. package/dist/agent-timeline.js.map +1 -0
  51. package/dist/agent.js +25 -0
  52. package/dist/agent.js.map +1 -0
  53. package/dist/artifact.js +23 -0
  54. package/dist/artifact.js.map +1 -0
  55. package/dist/asset-preview.js +22 -0
  56. package/dist/asset-preview.js.map +1 -0
  57. package/dist/attachments.js +33 -0
  58. package/dist/attachments.js.map +1 -0
  59. package/dist/audio-player.js +30 -0
  60. package/dist/audio-player.js.map +1 -0
  61. package/dist/audio-visualizer.js +9 -0
  62. package/dist/audio-visualizer.js.map +1 -0
  63. package/dist/canvas.js +10 -0
  64. package/dist/canvas.js.map +1 -0
  65. package/dist/chain-of-thought.js +22 -0
  66. package/dist/chain-of-thought.js.map +1 -0
  67. package/dist/chat-greeting.js +8 -0
  68. package/dist/chat-greeting.js.map +1 -0
  69. package/dist/chat-shell.js +9 -0
  70. package/dist/chat-shell.js.map +1 -0
  71. package/dist/checkpoint.js +13 -0
  72. package/dist/checkpoint.js.map +1 -0
  73. package/dist/chunk-2XOIG5TG.js +72 -0
  74. package/dist/chunk-2XOIG5TG.js.map +1 -0
  75. package/dist/chunk-34CQ2VHM.js +172 -0
  76. package/dist/chunk-34CQ2VHM.js.map +1 -0
  77. package/dist/chunk-3TDHPXZZ.js +60 -0
  78. package/dist/chunk-3TDHPXZZ.js.map +1 -0
  79. package/dist/chunk-3XNPMDZY.js +478 -0
  80. package/dist/chunk-3XNPMDZY.js.map +1 -0
  81. package/dist/chunk-3YPT3V7L.js +56 -0
  82. package/dist/chunk-3YPT3V7L.js.map +1 -0
  83. package/dist/chunk-475UEU2Q.js +87 -0
  84. package/dist/chunk-475UEU2Q.js.map +1 -0
  85. package/dist/chunk-4CBTII2I.js +95 -0
  86. package/dist/chunk-4CBTII2I.js.map +1 -0
  87. package/dist/chunk-4XRNIZMG.js +22 -0
  88. package/dist/chunk-4XRNIZMG.js.map +1 -0
  89. package/dist/chunk-5NNWUKK5.js +2 -0
  90. package/dist/chunk-5NNWUKK5.js.map +1 -0
  91. package/dist/chunk-5UOMU27Z.js +164 -0
  92. package/dist/chunk-5UOMU27Z.js.map +1 -0
  93. package/dist/chunk-5VGYZ62I.js +264 -0
  94. package/dist/chunk-5VGYZ62I.js.map +1 -0
  95. package/dist/chunk-6IQPH2OS.js +21 -0
  96. package/dist/chunk-6IQPH2OS.js.map +1 -0
  97. package/dist/chunk-6PB2MXCI.js +482 -0
  98. package/dist/chunk-6PB2MXCI.js.map +1 -0
  99. package/dist/chunk-7FD5CZEU.js +215 -0
  100. package/dist/chunk-7FD5CZEU.js.map +1 -0
  101. package/dist/chunk-7RL6KZDF.js +266 -0
  102. package/dist/chunk-7RL6KZDF.js.map +1 -0
  103. package/dist/chunk-ADOYAGGK.js +482 -0
  104. package/dist/chunk-ADOYAGGK.js.map +1 -0
  105. package/dist/chunk-AXMNJMMH.js +984 -0
  106. package/dist/chunk-AXMNJMMH.js.map +1 -0
  107. package/dist/chunk-BA3AEMOU.js +21 -0
  108. package/dist/chunk-BA3AEMOU.js.map +1 -0
  109. package/dist/chunk-BBHFOYML.js +336 -0
  110. package/dist/chunk-BBHFOYML.js.map +1 -0
  111. package/dist/chunk-BHUVISIY.js +221 -0
  112. package/dist/chunk-BHUVISIY.js.map +1 -0
  113. package/dist/chunk-BM2LWERA.js +100 -0
  114. package/dist/chunk-BM2LWERA.js.map +1 -0
  115. package/dist/chunk-CMOYXNPJ.js +211 -0
  116. package/dist/chunk-CMOYXNPJ.js.map +1 -0
  117. package/dist/chunk-CZP3RHC4.js +74 -0
  118. package/dist/chunk-CZP3RHC4.js.map +1 -0
  119. package/dist/chunk-DDG5JHQT.js +112 -0
  120. package/dist/chunk-DDG5JHQT.js.map +1 -0
  121. package/dist/chunk-DJODXO7I.js +38 -0
  122. package/dist/chunk-DJODXO7I.js.map +1 -0
  123. package/dist/chunk-DWJDJLPU.js +192 -0
  124. package/dist/chunk-DWJDJLPU.js.map +1 -0
  125. package/dist/chunk-DZW6LM22.js +45 -0
  126. package/dist/chunk-DZW6LM22.js.map +1 -0
  127. package/dist/chunk-ELGCZLZF.js +305 -0
  128. package/dist/chunk-ELGCZLZF.js.map +1 -0
  129. package/dist/chunk-EV3U6ZZB.js +209 -0
  130. package/dist/chunk-EV3U6ZZB.js.map +1 -0
  131. package/dist/chunk-EY7LVUKQ.js +87 -0
  132. package/dist/chunk-EY7LVUKQ.js.map +1 -0
  133. package/dist/chunk-F4C74F7M.js +230 -0
  134. package/dist/chunk-F4C74F7M.js.map +1 -0
  135. package/dist/chunk-FERYDFZA.js +108 -0
  136. package/dist/chunk-FERYDFZA.js.map +1 -0
  137. package/dist/chunk-FUIYG2DS.js +166 -0
  138. package/dist/chunk-FUIYG2DS.js.map +1 -0
  139. package/dist/chunk-GKYZT3LA.js +136 -0
  140. package/dist/chunk-GKYZT3LA.js.map +1 -0
  141. package/dist/chunk-H42LRUQ4.js +102 -0
  142. package/dist/chunk-H42LRUQ4.js.map +1 -0
  143. package/dist/chunk-HVXM2G5F.js +222 -0
  144. package/dist/chunk-HVXM2G5F.js.map +1 -0
  145. package/dist/chunk-I4RDAGVY.js +53 -0
  146. package/dist/chunk-I4RDAGVY.js.map +1 -0
  147. package/dist/chunk-IQJG4IDX.js +208 -0
  148. package/dist/chunk-IQJG4IDX.js.map +1 -0
  149. package/dist/chunk-IX2PXG4Y.js +144 -0
  150. package/dist/chunk-IX2PXG4Y.js.map +1 -0
  151. package/dist/chunk-IXICSOOP.js +287 -0
  152. package/dist/chunk-IXICSOOP.js.map +1 -0
  153. package/dist/chunk-JY5HSN4D.js +84 -0
  154. package/dist/chunk-JY5HSN4D.js.map +1 -0
  155. package/dist/chunk-LMNSBOBG.js +19 -0
  156. package/dist/chunk-LMNSBOBG.js.map +1 -0
  157. package/dist/chunk-MBI7D6IL.js +42 -0
  158. package/dist/chunk-MBI7D6IL.js.map +1 -0
  159. package/dist/chunk-MLFMYCPH.js +192 -0
  160. package/dist/chunk-MLFMYCPH.js.map +1 -0
  161. package/dist/chunk-MOK66734.js +33 -0
  162. package/dist/chunk-MOK66734.js.map +1 -0
  163. package/dist/chunk-MXTAWPYM.js +196 -0
  164. package/dist/chunk-MXTAWPYM.js.map +1 -0
  165. package/dist/chunk-NCL2UZKI.js +96 -0
  166. package/dist/chunk-NCL2UZKI.js.map +1 -0
  167. package/dist/chunk-NET4YLRY.js +107 -0
  168. package/dist/chunk-NET4YLRY.js.map +1 -0
  169. package/dist/chunk-NIG67CFM.js +329 -0
  170. package/dist/chunk-NIG67CFM.js.map +1 -0
  171. package/dist/chunk-NMVNNO3L.js +10 -0
  172. package/dist/chunk-NMVNNO3L.js.map +1 -0
  173. package/dist/chunk-NP7VID4K.js +2 -0
  174. package/dist/chunk-NP7VID4K.js.map +1 -0
  175. package/dist/chunk-NPUCMAG2.js +382 -0
  176. package/dist/chunk-NPUCMAG2.js.map +1 -0
  177. package/dist/chunk-NSCLRHES.js +102 -0
  178. package/dist/chunk-NSCLRHES.js.map +1 -0
  179. package/dist/chunk-OEUXHVFW.js +86 -0
  180. package/dist/chunk-OEUXHVFW.js.map +1 -0
  181. package/dist/chunk-ONBHFIMZ.js +137 -0
  182. package/dist/chunk-ONBHFIMZ.js.map +1 -0
  183. package/dist/chunk-OPH2HHL2.js +228 -0
  184. package/dist/chunk-OPH2HHL2.js.map +1 -0
  185. package/dist/chunk-OQERHIQP.js +287 -0
  186. package/dist/chunk-OQERHIQP.js.map +1 -0
  187. package/dist/chunk-P6YJAZFG.js +103 -0
  188. package/dist/chunk-P6YJAZFG.js.map +1 -0
  189. package/dist/chunk-PG7ERDOD.js +65 -0
  190. package/dist/chunk-PG7ERDOD.js.map +1 -0
  191. package/dist/chunk-PIB5JBMA.js +90 -0
  192. package/dist/chunk-PIB5JBMA.js.map +1 -0
  193. package/dist/chunk-PQ5BPIWQ.js +22 -0
  194. package/dist/chunk-PQ5BPIWQ.js.map +1 -0
  195. package/dist/chunk-PQBF6ZIQ.js +55 -0
  196. package/dist/chunk-PQBF6ZIQ.js.map +1 -0
  197. package/dist/chunk-PTWCTSZL.js +173 -0
  198. package/dist/chunk-PTWCTSZL.js.map +1 -0
  199. package/dist/chunk-QJUNPVOS.js +101 -0
  200. package/dist/chunk-QJUNPVOS.js.map +1 -0
  201. package/dist/chunk-QUDZOTRV.js +43 -0
  202. package/dist/chunk-QUDZOTRV.js.map +1 -0
  203. package/dist/chunk-RB7G65JC.js +213 -0
  204. package/dist/chunk-RB7G65JC.js.map +1 -0
  205. package/dist/chunk-RPHAOR7P.js +45 -0
  206. package/dist/chunk-RPHAOR7P.js.map +1 -0
  207. package/dist/chunk-RTCSH2AN.js +331 -0
  208. package/dist/chunk-RTCSH2AN.js.map +1 -0
  209. package/dist/chunk-S3ISPW3A.js +28 -0
  210. package/dist/chunk-S3ISPW3A.js.map +1 -0
  211. package/dist/chunk-SEVN656N.js +36 -0
  212. package/dist/chunk-SEVN656N.js.map +1 -0
  213. package/dist/chunk-SKVG672B.js +64 -0
  214. package/dist/chunk-SKVG672B.js.map +1 -0
  215. package/dist/chunk-SPQIU7GA.js +236 -0
  216. package/dist/chunk-SPQIU7GA.js.map +1 -0
  217. package/dist/chunk-SSGJ6MEM.js +1076 -0
  218. package/dist/chunk-SSGJ6MEM.js.map +1 -0
  219. package/dist/chunk-SSKZ2AED.js +118 -0
  220. package/dist/chunk-SSKZ2AED.js.map +1 -0
  221. package/dist/chunk-T56JFGXI.js +561 -0
  222. package/dist/chunk-T56JFGXI.js.map +1 -0
  223. package/dist/chunk-TCB6O74A.js +137 -0
  224. package/dist/chunk-TCB6O74A.js.map +1 -0
  225. package/dist/chunk-TTEYPO6X.js +57 -0
  226. package/dist/chunk-TTEYPO6X.js.map +1 -0
  227. package/dist/chunk-TWPHAJNM.js +462 -0
  228. package/dist/chunk-TWPHAJNM.js.map +1 -0
  229. package/dist/chunk-TXJJLP4O.js +336 -0
  230. package/dist/chunk-TXJJLP4O.js.map +1 -0
  231. package/dist/chunk-TZ6TB7VM.js +245 -0
  232. package/dist/chunk-TZ6TB7VM.js.map +1 -0
  233. package/dist/chunk-UBLKJJ7K.js +278 -0
  234. package/dist/chunk-UBLKJJ7K.js.map +1 -0
  235. package/dist/chunk-UCJ6IUFS.js +52 -0
  236. package/dist/chunk-UCJ6IUFS.js.map +1 -0
  237. package/dist/chunk-UCKFJ3QF.js +197 -0
  238. package/dist/chunk-UCKFJ3QF.js.map +1 -0
  239. package/dist/chunk-UPXSLILN.js +20 -0
  240. package/dist/chunk-UPXSLILN.js.map +1 -0
  241. package/dist/chunk-V4DORGWJ.js +92 -0
  242. package/dist/chunk-V4DORGWJ.js.map +1 -0
  243. package/dist/chunk-V6E5DYZD.js +80 -0
  244. package/dist/chunk-V6E5DYZD.js.map +1 -0
  245. package/dist/chunk-VLLYKF3P.js +96 -0
  246. package/dist/chunk-VLLYKF3P.js.map +1 -0
  247. package/dist/chunk-VLNBTOH6.js +43 -0
  248. package/dist/chunk-VLNBTOH6.js.map +1 -0
  249. package/dist/chunk-WMDSMSPL.js +303 -0
  250. package/dist/chunk-WMDSMSPL.js.map +1 -0
  251. package/dist/chunk-WU5BLGTF.js +149 -0
  252. package/dist/chunk-WU5BLGTF.js.map +1 -0
  253. package/dist/chunk-WYTZVSGK.js +245 -0
  254. package/dist/chunk-WYTZVSGK.js.map +1 -0
  255. package/dist/chunk-X47QMM6K.js +187 -0
  256. package/dist/chunk-X47QMM6K.js.map +1 -0
  257. package/dist/chunk-XNBKO32Y.js +174 -0
  258. package/dist/chunk-XNBKO32Y.js.map +1 -0
  259. package/dist/chunk-YHUSW7D2.js +40 -0
  260. package/dist/chunk-YHUSW7D2.js.map +1 -0
  261. package/dist/chunk-YSKD7UXX.js +126 -0
  262. package/dist/chunk-YSKD7UXX.js.map +1 -0
  263. package/dist/chunk-YYRDGWOU.js +72 -0
  264. package/dist/chunk-YYRDGWOU.js.map +1 -0
  265. package/dist/chunk-ZIGZMWM7.js +19 -0
  266. package/dist/chunk-ZIGZMWM7.js.map +1 -0
  267. package/dist/chunk-ZKRTUKNP.js +40 -0
  268. package/dist/chunk-ZKRTUKNP.js.map +1 -0
  269. package/dist/code-block.js +38 -0
  270. package/dist/code-block.js.map +1 -0
  271. package/dist/commit.js +51 -0
  272. package/dist/commit.js.map +1 -0
  273. package/dist/composer.js +15 -0
  274. package/dist/composer.js.map +1 -0
  275. package/dist/confirmation.js +53 -0
  276. package/dist/confirmation.js.map +1 -0
  277. package/dist/connection.js +8 -0
  278. package/dist/connection.js.map +1 -0
  279. package/dist/context-panel.js +25 -0
  280. package/dist/context-panel.js.map +1 -0
  281. package/dist/controls.js +10 -0
  282. package/dist/controls.js.map +1 -0
  283. package/dist/conversation.js +19 -0
  284. package/dist/conversation.js.map +1 -0
  285. package/dist/diff-view.js +15 -0
  286. package/dist/diff-view.js.map +1 -0
  287. package/dist/edge.js +10 -0
  288. package/dist/edge.js.map +1 -0
  289. package/dist/environment-variables.js +29 -0
  290. package/dist/environment-variables.js.map +1 -0
  291. package/dist/file-tree.js +23 -0
  292. package/dist/file-tree.js.map +1 -0
  293. package/dist/gallery.js +9 -0
  294. package/dist/gallery.js.map +1 -0
  295. package/dist/grouped-parts.js +21 -0
  296. package/dist/grouped-parts.js.map +1 -0
  297. package/dist/image.js +9 -0
  298. package/dist/image.js.map +1 -0
  299. package/dist/index.d.ts +403 -108
  300. package/dist/index.js +671 -13205
  301. package/dist/index.js.map +1 -1
  302. package/dist/inline-citation.js +39 -0
  303. package/dist/inline-citation.js.map +1 -0
  304. package/dist/jsx-preview.js +17 -0
  305. package/dist/jsx-preview.js.map +1 -0
  306. package/dist/markdown-view.js +17 -0
  307. package/dist/markdown-view.js.map +1 -0
  308. package/dist/message-compare.js +12 -0
  309. package/dist/message-compare.js.map +1 -0
  310. package/dist/message-edit.js +19 -0
  311. package/dist/message-edit.js.map +1 -0
  312. package/dist/message-feedback.js +11 -0
  313. package/dist/message-feedback.js.map +1 -0
  314. package/dist/message-form-spec.js +38 -0
  315. package/dist/message-form-spec.js.map +1 -0
  316. package/dist/message-form.js +26 -0
  317. package/dist/message-form.js.map +1 -0
  318. package/dist/message-table-spec.js +26 -0
  319. package/dist/message-table-spec.js.map +1 -0
  320. package/dist/message-table.js +12 -0
  321. package/dist/message-table.js.map +1 -0
  322. package/dist/message.js +51 -0
  323. package/dist/message.js.map +1 -0
  324. package/dist/mic-selector.js +27 -0
  325. package/dist/mic-selector.js.map +1 -0
  326. package/dist/model-provider-logo.js +13 -0
  327. package/dist/model-provider-logo.js.map +1 -0
  328. package/dist/motion-config.js +9 -0
  329. package/dist/motion-config.js.map +1 -0
  330. package/dist/node.js +22 -0
  331. package/dist/node.js.map +1 -0
  332. package/dist/open-in-chat.js +31 -0
  333. package/dist/open-in-chat.js.map +1 -0
  334. package/dist/package-info.js +25 -0
  335. package/dist/package-info.js.map +1 -0
  336. package/dist/panel.js +10 -0
  337. package/dist/panel.js.map +1 -0
  338. package/dist/part-groups.js +18 -0
  339. package/dist/part-groups.js.map +1 -0
  340. package/dist/permission-mode-select.js +9 -0
  341. package/dist/permission-mode-select.js.map +1 -0
  342. package/dist/persona-sources.js +8 -0
  343. package/dist/persona-sources.js.map +1 -0
  344. package/dist/persona.js +14 -0
  345. package/dist/persona.js.map +1 -0
  346. package/dist/plan.js +32 -0
  347. package/dist/plan.js.map +1 -0
  348. package/dist/prompt-input-effort.js +9 -0
  349. package/dist/prompt-input-effort.js.map +1 -0
  350. package/dist/prompt-input-mode.js +10 -0
  351. package/dist/prompt-input-mode.js.map +1 -0
  352. package/dist/prompt-input-slash.js +12 -0
  353. package/dist/prompt-input-slash.js.map +1 -0
  354. package/dist/prompt-input.js +89 -0
  355. package/dist/prompt-input.js.map +1 -0
  356. package/dist/queue.js +37 -0
  357. package/dist/queue.js.map +1 -0
  358. package/dist/reasoning.js +23 -0
  359. package/dist/reasoning.js.map +1 -0
  360. package/dist/sandbox.js +28 -0
  361. package/dist/sandbox.js.map +1 -0
  362. package/dist/schema-display.js +33 -0
  363. package/dist/schema-display.js.map +1 -0
  364. package/dist/selection-toolbar.js +11 -0
  365. package/dist/selection-toolbar.js.map +1 -0
  366. package/dist/session-header.js +9 -0
  367. package/dist/session-header.js.map +1 -0
  368. package/dist/session-status-bar.js +9 -0
  369. package/dist/session-status-bar.js.map +1 -0
  370. package/dist/shimmer.js +9 -0
  371. package/dist/shimmer.js.map +1 -0
  372. package/dist/snippet.js +17 -0
  373. package/dist/snippet.js.map +1 -0
  374. package/dist/sources.js +17 -0
  375. package/dist/sources.js.map +1 -0
  376. package/dist/speech-input.js +9 -0
  377. package/dist/speech-input.js.map +1 -0
  378. package/dist/stack-trace.js +27 -0
  379. package/dist/stack-trace.js.map +1 -0
  380. package/dist/suggestion.js +16 -0
  381. package/dist/suggestion.js.map +1 -0
  382. package/dist/task.js +18 -0
  383. package/dist/task.js.map +1 -0
  384. package/dist/test-results.js +43 -0
  385. package/dist/test-results.js.map +1 -0
  386. package/dist/token-usage.js +27 -0
  387. package/dist/token-usage.js.map +1 -0
  388. package/dist/tool-result-card.js +9 -0
  389. package/dist/tool-result-card.js.map +1 -0
  390. package/dist/tool.js +27 -0
  391. package/dist/tool.js.map +1 -0
  392. package/dist/toolbar.js +10 -0
  393. package/dist/toolbar.js.map +1 -0
  394. package/dist/transcription.js +11 -0
  395. package/dist/transcription.js.map +1 -0
  396. package/dist/turn-status.js +9 -0
  397. package/dist/turn-status.js.map +1 -0
  398. package/dist/use-audio-level.js +9 -0
  399. package/dist/use-audio-level.js.map +1 -0
  400. package/dist/voice-selector.js +47 -0
  401. package/dist/voice-selector.js.map +1 -0
  402. package/dist/web-preview.js +19 -0
  403. package/dist/web-preview.js.map +1 -0
  404. package/package.json +12 -10
  405. package/schemas/a2ui-surface.v1.schema.json +5425 -0
  406. package/src/__contract__/audio-visualizer.contract.test.tsx +49 -0
  407. package/src/__contract__/chat-shell.contract.test.tsx +49 -0
  408. package/src/__contract__/grouped-parts.contract.test.tsx +49 -0
  409. package/src/__contract__/image.contract.test.tsx +49 -0
  410. package/src/__contract__/markdown-view.contract.test.tsx +49 -0
  411. package/src/__contract__/message-feedback.contract.test.tsx +49 -0
  412. package/src/__contract__/message-form.contract.test.tsx +49 -0
  413. package/src/__contract__/message-table.contract.test.tsx +49 -0
  414. package/src/__contract__/model-provider-logo.contract.test.tsx +49 -0
  415. package/src/__contract__/persona.contract.test.tsx +49 -0
  416. package/src/__contract__/prompt-input-effort.contract.test.tsx +49 -0
  417. package/src/__contract__/prompt-input-mode.contract.test.tsx +49 -0
  418. package/src/_chat-shell-rail.tsx +4 -2
  419. package/src/_flow-boundary.tsx +2 -2
  420. package/src/_lazy-cjk.test.ts +43 -0
  421. package/src/_lazy-cjk.ts +73 -0
  422. package/src/_lazy-math.test.ts +63 -0
  423. package/src/_lazy-math.ts +90 -0
  424. package/src/_persona-rive.tsx +27 -41
  425. package/src/_streamdown-i18n.ts +73 -21
  426. package/src/_streamdown-safety.ts +2 -2
  427. package/src/_theme-scope-store.test.ts +83 -0
  428. package/src/_theme-scope-store.ts +103 -0
  429. package/src/a2ui/a2ui-surface.stories.tsx +662 -0
  430. package/src/a2ui/a2ui-surface.test.tsx +201 -0
  431. package/src/a2ui/a2ui-surface.tsx +354 -0
  432. package/src/a2ui/catalog.source.json +772 -0
  433. package/src/a2ui/core/a2ui-core.test.ts +178 -0
  434. package/src/a2ui/core/catalog.generated.ts +1006 -0
  435. package/src/a2ui/core/complete-json.ts +81 -0
  436. package/src/a2ui/core/index.ts +10 -0
  437. package/src/a2ui/core/schema.ts +111 -0
  438. package/src/a2ui/core/spec.ts +148 -0
  439. package/src/a2ui/core/validate.ts +266 -0
  440. package/src/a2ui/index.ts +7 -0
  441. package/src/a2ui/ui-catalog.tsx +225 -0
  442. package/src/a2ui/wave1-chart-spec.test.ts +87 -0
  443. package/src/a2ui/wave2-chart-spec.test.ts +108 -0
  444. package/src/agent-event.tsx +1 -1
  445. package/src/agent.tsx +18 -13
  446. package/src/agentic-workspace.stories.tsx +6 -45
  447. package/src/artifact.tsx +2 -2
  448. package/src/asset-preview.test.tsx +40 -0
  449. package/src/asset-preview.tsx +83 -12
  450. package/src/attachments.tsx +7 -4
  451. package/src/chat-shell.test.tsx +40 -10
  452. package/src/chat-shell.tsx +90 -44
  453. package/src/chat.stories.tsx +47 -42
  454. package/src/code-block.test.tsx +100 -1
  455. package/src/code-block.tsx +166 -103
  456. package/src/commit.tsx +30 -41
  457. package/src/composer.stories.tsx +4 -5
  458. package/src/composer.test.tsx +45 -0
  459. package/src/composer.tsx +104 -21
  460. package/src/confirmation.tsx +1 -1
  461. package/src/context-panel.stories.tsx +1 -1
  462. package/src/context-panel.tsx +2 -2
  463. package/src/conversation.stories.tsx +24 -0
  464. package/src/conversation.test.tsx +69 -0
  465. package/src/conversation.tsx +47 -8
  466. package/src/diff-view.stories.tsx +79 -0
  467. package/src/diff-view.test.tsx +52 -2
  468. package/src/diff-view.tsx +92 -36
  469. package/src/environment-variables.tsx +20 -37
  470. package/src/file-tree.test.tsx +21 -0
  471. package/src/file-tree.tsx +33 -16
  472. package/src/gallery.stories.tsx +42 -0
  473. package/src/gallery.tsx +2 -2
  474. package/src/grouped-parts.stories.tsx +23 -0
  475. package/src/grouped-parts.tsx +1 -1
  476. package/src/index.ts +1 -0
  477. package/src/inline-citation.tsx +5 -5
  478. package/src/jsx-preview.tsx +151 -43
  479. package/src/markdown-view.test.tsx +7 -3
  480. package/src/markdown-view.tsx +8 -1
  481. package/src/message-compare.stories.tsx +40 -0
  482. package/src/message-compare.tsx +2 -1
  483. package/src/message-form.stories.tsx +36 -3
  484. package/src/message-form.test.tsx +8 -2
  485. package/src/message-form.tsx +16 -8
  486. package/src/message-table.stories.tsx +26 -2
  487. package/src/message-table.test.tsx +7 -0
  488. package/src/message-table.tsx +9 -5
  489. package/src/message.test.tsx +73 -3
  490. package/src/message.tsx +36 -12
  491. package/src/model-provider-logo.test.tsx +57 -3
  492. package/src/model-provider-logo.tsx +45 -11
  493. package/src/open-in-chat.tsx +50 -29
  494. package/src/package-info.tsx +23 -20
  495. package/src/prompt-input-slash.stories.tsx +1 -1
  496. package/src/prompt-input.test.tsx +67 -1
  497. package/src/prompt-input.tsx +42 -4
  498. package/src/queue.tsx +4 -4
  499. package/src/reasoning.stories.tsx +27 -0
  500. package/src/reasoning.tsx +17 -6
  501. package/src/sandbox.tsx +3 -3
  502. package/src/schema-display.test.tsx +56 -0
  503. package/src/schema-display.tsx +68 -37
  504. package/src/session-header.stories.tsx +35 -1
  505. package/src/session-header.tsx +1 -1
  506. package/src/snippet.test.tsx +6 -2
  507. package/src/snippet.tsx +14 -34
  508. package/src/sources.stories.tsx +30 -0
  509. package/src/sources.tsx +4 -1
  510. package/src/speech-input.test.tsx +109 -0
  511. package/src/speech-input.tsx +31 -3
  512. package/src/stack-trace.tsx +20 -36
  513. package/src/streamdown-i18n.test.tsx +23 -0
  514. package/src/templates-ai-assistant.stories.tsx +151 -87
  515. package/src/test-results.tsx +47 -27
  516. package/src/token-usage.tsx +6 -6
  517. package/src/tool.stories.tsx +39 -0
  518. package/src/tool.test.tsx +65 -0
  519. package/src/tool.tsx +61 -25
  520. package/src/toolbar.tsx +0 -10
  521. package/src/transcription.tsx +1 -1
  522. package/src/voice-selector.tsx +5 -5
  523. package/src/web-preview.test.tsx +51 -1
  524. package/src/web-preview.tsx +39 -8
  525. package/dist/_flow-boundary-SHNWLQG5.js.map +0 -1
  526. package/dist/_persona-rive-JEG44YHX.js.map +0 -1
  527. /package/dist/{_audio-player-media-chrome-T3XVXWRZ.js.map → _audio-player-media-chrome.js.map} +0 -0
@@ -0,0 +1,40 @@
1
+ "use client";
2
+
3
+ // src/persona-sources.ts
4
+ var PERSONA_SOURCES = {
5
+ command: {
6
+ dynamicColor: true,
7
+ hasModel: true,
8
+ source: "https://ejiidnob33g9ap1r.public.blob.vercel-storage.com/command-2.0.riv"
9
+ },
10
+ glint: {
11
+ dynamicColor: true,
12
+ hasModel: true,
13
+ source: "https://ejiidnob33g9ap1r.public.blob.vercel-storage.com/glint-2.0.riv"
14
+ },
15
+ halo: {
16
+ dynamicColor: true,
17
+ hasModel: true,
18
+ source: "https://ejiidnob33g9ap1r.public.blob.vercel-storage.com/halo-2.0.riv"
19
+ },
20
+ mana: {
21
+ dynamicColor: false,
22
+ hasModel: true,
23
+ source: "https://ejiidnob33g9ap1r.public.blob.vercel-storage.com/mana-2.0.riv"
24
+ },
25
+ obsidian: {
26
+ dynamicColor: true,
27
+ hasModel: true,
28
+ source: "https://ejiidnob33g9ap1r.public.blob.vercel-storage.com/obsidian-2.0.riv"
29
+ },
30
+ opal: {
31
+ dynamicColor: false,
32
+ hasModel: false,
33
+ source: "https://ejiidnob33g9ap1r.public.blob.vercel-storage.com/orb-1.2.riv"
34
+ }
35
+ };
36
+
37
+ export {
38
+ PERSONA_SOURCES
39
+ };
40
+ //# sourceMappingURL=chunk-YHUSW7D2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/persona-sources.ts"],"sourcesContent":["/**\n * Persona artwork sources — a plain data module shared by `persona.tsx` (the\n * public shell) and `_persona-rive.tsx` (the lazily-loaded Rive half), so\n * neither has to import the other.\n */\n\nexport type PersonaState = \"idle\" | \"listening\" | \"thinking\" | \"speaking\" | \"asleep\";\n\nexport interface PersonaSource {\n /** The artwork exposes a colour view-model that follows the light/dark theme. */\n dynamicColor: boolean;\n /** The artwork has a Rive view-model (vs. a plain state machine). */\n hasModel: boolean;\n /** Absolute URL of the `.riv` artwork. */\n source: string;\n}\n\n/**\n * Where the shipped `.riv` artwork is fetched from.\n *\n * ⚠️ These are REMOTE origins fetched at runtime by the Rive runtime — a\n * deployment with a restrictive `connect-src` blocks them, and the component\n * falls back to a token-driven orb. Self-host the six files and pass\n * `<Persona src={…}>` to point at your own copies. See `docs/CSP-AND-NETWORK.md`.\n */\nexport const PERSONA_SOURCES = {\n command: {\n dynamicColor: true,\n hasModel: true,\n source: \"https://ejiidnob33g9ap1r.public.blob.vercel-storage.com/command-2.0.riv\",\n },\n glint: {\n dynamicColor: true,\n hasModel: true,\n source: \"https://ejiidnob33g9ap1r.public.blob.vercel-storage.com/glint-2.0.riv\",\n },\n halo: {\n dynamicColor: true,\n hasModel: true,\n source: \"https://ejiidnob33g9ap1r.public.blob.vercel-storage.com/halo-2.0.riv\",\n },\n mana: {\n dynamicColor: false,\n hasModel: true,\n source: \"https://ejiidnob33g9ap1r.public.blob.vercel-storage.com/mana-2.0.riv\",\n },\n obsidian: {\n dynamicColor: true,\n hasModel: true,\n source: \"https://ejiidnob33g9ap1r.public.blob.vercel-storage.com/obsidian-2.0.riv\",\n },\n opal: {\n dynamicColor: false,\n hasModel: false,\n source: \"https://ejiidnob33g9ap1r.public.blob.vercel-storage.com/orb-1.2.riv\",\n },\n} as const satisfies Record<string, PersonaSource>;\n\nexport type PersonaVariant = keyof typeof PERSONA_SOURCES;\n"],"mappings":";;;AAyBO,IAAM,kBAAkB;AAAA,EAC7B,SAAS;AAAA,IACP,cAAc;AAAA,IACd,UAAU;AAAA,IACV,QAAQ;AAAA,EACV;AAAA,EACA,OAAO;AAAA,IACL,cAAc;AAAA,IACd,UAAU;AAAA,IACV,QAAQ;AAAA,EACV;AAAA,EACA,MAAM;AAAA,IACJ,cAAc;AAAA,IACd,UAAU;AAAA,IACV,QAAQ;AAAA,EACV;AAAA,EACA,MAAM;AAAA,IACJ,cAAc;AAAA,IACd,UAAU;AAAA,IACV,QAAQ;AAAA,EACV;AAAA,EACA,UAAU;AAAA,IACR,cAAc;AAAA,IACd,UAAU;AAAA,IACV,QAAQ;AAAA,EACV;AAAA,EACA,MAAM;AAAA,IACJ,cAAc;AAAA,IACd,UAAU;AAAA,IACV,QAAQ;AAAA,EACV;AACF;","names":[]}
@@ -0,0 +1,126 @@
1
+ "use client";
2
+
3
+ // src/part-groups.ts
4
+ var RUNNING_STATES = /* @__PURE__ */ new Set([
5
+ "input-streaming",
6
+ "input-available",
7
+ "approval-requested",
8
+ "approval-responded",
9
+ "calling",
10
+ "streaming",
11
+ "in-progress"
12
+ ]);
13
+ var ERROR_STATES = /* @__PURE__ */ new Set(["output-error", "error", "failed"]);
14
+ var COMPLETE_STATES = /* @__PURE__ */ new Set(["output-available", "output-denied", "done", "complete"]);
15
+ function defaultPartStatus(part) {
16
+ if (part.isStreaming === true) return "running";
17
+ const state = typeof part.state === "string" ? part.state : void 0;
18
+ if (state) {
19
+ if (ERROR_STATES.has(state)) return "error";
20
+ if (RUNNING_STATES.has(state)) return "running";
21
+ if (COMPLETE_STATES.has(state)) return "complete";
22
+ }
23
+ if (part.errorText || part.error) return "error";
24
+ return "complete";
25
+ }
26
+ function rollupStatus(statuses) {
27
+ if (statuses.some((s) => s === "running")) return "running";
28
+ if (statuses.some((s) => s === "error")) return "error";
29
+ if (statuses.some((s) => s === "pending")) return "pending";
30
+ return "complete";
31
+ }
32
+ function leafKey(part, index) {
33
+ const id = typeof part.id === "string" && part.id || typeof part.toolCallId === "string" && part.toolCallId || null;
34
+ return id ?? `${part.type}#${index}`;
35
+ }
36
+ function buildLevel(entries, statusOf) {
37
+ const out = [];
38
+ let i = 0;
39
+ while (i < entries.length) {
40
+ const entry = entries[i];
41
+ if (entry.path.length === 0) {
42
+ out.push({
43
+ kind: "leaf",
44
+ key: leafKey(entry.part, entry.index),
45
+ index: entry.index,
46
+ part: entry.part
47
+ });
48
+ i += 1;
49
+ continue;
50
+ }
51
+ const key0 = entry.path[0];
52
+ const run = [];
53
+ let j = i;
54
+ while (j < entries.length && entries[j].path.length > 0 && entries[j].path[0] === key0) {
55
+ run.push(entries[j]);
56
+ j += 1;
57
+ }
58
+ const childEntries = run.map((r) => ({
59
+ part: r.part,
60
+ index: r.index,
61
+ path: r.path.slice(1)
62
+ }));
63
+ const children = buildLevel(childEntries, statusOf);
64
+ const indices = run.map((r) => r.index);
65
+ const status = rollupStatus(run.map((r) => statusOf(r.part)));
66
+ out.push({
67
+ kind: "group",
68
+ // First member index keeps the group key stable across append-only streams.
69
+ key: `${key0}@${run[0].index}`,
70
+ group: { type: key0, status, indices },
71
+ children
72
+ });
73
+ i = j;
74
+ }
75
+ return out;
76
+ }
77
+ function buildPartGroups(parts, groupBy, getStatus) {
78
+ const statusOf = (part) => getStatus?.(part) ?? defaultPartStatus(part);
79
+ const entries = parts.map((part, index) => {
80
+ let path = [];
81
+ try {
82
+ path = groupBy(part, { index, parts }) ?? [];
83
+ } catch {
84
+ path = [];
85
+ }
86
+ return { part, index, path };
87
+ });
88
+ return buildLevel(entries, statusOf);
89
+ }
90
+ function partsFingerprint(parts, getStatus) {
91
+ return parts.map((part, index) => {
92
+ const status = getStatus?.(part) ?? defaultPartStatus(part);
93
+ return `${leafKey(part, index)}:${part.type}:${status}`;
94
+ }).join("|");
95
+ }
96
+ var DEFAULT_INLINE = [/^reasoning$/, /^tool-/, "dynamic-tool", "step-start"];
97
+ var DEFAULT_STANDALONE = [/approval/i, /human/i, "confirmation"];
98
+ function matchesAny(type, patterns) {
99
+ return patterns.some((p) => typeof p === "string" ? p === type : p.test(type));
100
+ }
101
+ function groupPartByType(options = {}) {
102
+ const groupKey = options.groupKey ?? "group-work";
103
+ const inline = options.inline ?? DEFAULT_INLINE;
104
+ const standalone = options.standalone ?? DEFAULT_STANDALONE;
105
+ return (part) => {
106
+ const explicit = options.classify?.(part);
107
+ if (explicit === "standalone") return [];
108
+ if (explicit === "inline") return [groupKey];
109
+ if (matchesAny(part.type, standalone)) return [];
110
+ if (matchesAny(part.type, inline)) return [groupKey];
111
+ return [];
112
+ };
113
+ }
114
+ function isGroupNode(part) {
115
+ return part.type.startsWith("group-");
116
+ }
117
+
118
+ export {
119
+ defaultPartStatus,
120
+ rollupStatus,
121
+ buildPartGroups,
122
+ partsFingerprint,
123
+ groupPartByType,
124
+ isGroupNode
125
+ };
126
+ //# sourceMappingURL=chunk-YSKD7UXX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/part-groups.ts"],"sourcesContent":["/**\n * part-groups.ts — Pure, framework-free part-grouping engine.\n *\n * Derives collapsible reasoning/tool traces from an ordered list of message\n * parts. This is a CLIENT-SIDE VIEW TRANSFORM — never a model output format.\n * Adapted from assistant-ui's grouping design onto this library's idiom.\n *\n * `groupBy(part, context)` maps each part to a group-key path (`group-…`);\n * ADJACENT parts sharing a key path coalesce into synthetic group nodes\n * (`{ type: \"group-…\", status, indices }`); multi-element paths nest. The\n * `group-` namespace is reserved so a group key can never collide with a real\n * part `type`.\n */\n\n/** A reserved group-key. The `group-` prefix can't collide with real part types. */\nexport type GroupKey = `group-${string}`;\n\n/** Rolled-up status of a group (any member running → the group is running). */\nexport type GroupStatus = \"pending\" | \"running\" | \"complete\" | \"error\";\n\n/** The minimum a groupable part must expose. */\nexport interface GroupablePart {\n type: string;\n [key: string]: unknown;\n}\n\n/** Context passed to `groupBy` for each part. */\nexport interface GroupByContext<T extends GroupablePart> {\n index: number;\n parts: readonly T[];\n}\n\n/** Maps a part to its group-key path (`[]` = not grouped, a top-level leaf). */\nexport type GroupBy<T extends GroupablePart> = (\n part: T,\n context: GroupByContext<T>,\n) => readonly GroupKey[];\n\n/** Extract a part's status; return `undefined` to fall back to the default. */\nexport type GetPartStatus<T extends GroupablePart> = (part: T) => GroupStatus | undefined;\n\n/** The synthetic node produced for a coalesced group. */\nexport interface PartGroupNode {\n type: GroupKey;\n status: GroupStatus;\n /** Original indices of every leaf part under this group (recursive). */\n indices: number[];\n}\n\n/** One node in the grouped tree — a leaf part or a synthetic group. */\nexport type GroupedNode<T extends GroupablePart> =\n | { kind: \"leaf\"; key: string; index: number; part: T }\n | { kind: \"group\"; key: string; group: PartGroupNode; children: GroupedNode<T>[] };\n\n// ---------------------------------------------------------------------------\n// Default status extraction\n// ---------------------------------------------------------------------------\n\nconst RUNNING_STATES = new Set([\n \"input-streaming\",\n \"input-available\",\n \"approval-requested\",\n \"approval-responded\",\n \"calling\",\n \"streaming\",\n \"in-progress\",\n]);\nconst ERROR_STATES = new Set([\"output-error\", \"error\", \"failed\"]);\nconst COMPLETE_STATES = new Set([\"output-available\", \"output-denied\", \"done\", \"complete\"]);\n\n/**\n * Best-effort status from common AI-SDK part shapes (tool `state`, reasoning\n * `state`, `isStreaming`). Overridable via `getStatus`.\n */\nexport function defaultPartStatus(part: GroupablePart): GroupStatus {\n if (part.isStreaming === true) return \"running\";\n const state = typeof part.state === \"string\" ? part.state : undefined;\n if (state) {\n if (ERROR_STATES.has(state)) return \"error\";\n if (RUNNING_STATES.has(state)) return \"running\";\n if (COMPLETE_STATES.has(state)) return \"complete\";\n }\n if (part.errorText || part.error) return \"error\";\n return \"complete\";\n}\n\n/** Roll several member statuses up into one group status. */\nexport function rollupStatus(statuses: readonly GroupStatus[]): GroupStatus {\n if (statuses.some((s) => s === \"running\")) return \"running\";\n if (statuses.some((s) => s === \"error\")) return \"error\";\n if (statuses.some((s) => s === \"pending\")) return \"pending\";\n return \"complete\";\n}\n\n// ---------------------------------------------------------------------------\n// Stable identity keys\n// ---------------------------------------------------------------------------\n\n/** Stable leaf key so streaming rows don't remount (prefers a part id). */\nfunction leafKey(part: GroupablePart, index: number): string {\n const id =\n (typeof part.id === \"string\" && part.id) ||\n (typeof part.toolCallId === \"string\" && part.toolCallId) ||\n null;\n return id ?? `${part.type}#${index}`;\n}\n\n// ---------------------------------------------------------------------------\n// Tree building\n// ---------------------------------------------------------------------------\n\ninterface Entry<T extends GroupablePart> {\n part: T;\n index: number;\n path: readonly GroupKey[];\n}\n\nfunction buildLevel<T extends GroupablePart>(\n entries: Entry<T>[],\n statusOf: (part: T) => GroupStatus,\n): GroupedNode<T>[] {\n const out: GroupedNode<T>[] = [];\n let i = 0;\n while (i < entries.length) {\n const entry = entries[i]!;\n if (entry.path.length === 0) {\n out.push({\n kind: \"leaf\",\n key: leafKey(entry.part, entry.index),\n index: entry.index,\n part: entry.part,\n });\n i += 1;\n continue;\n }\n\n // Coalesce the adjacent run of entries sharing this level's key.\n const key0 = entry.path[0]!;\n const run: Entry<T>[] = [];\n let j = i;\n while (j < entries.length && entries[j]!.path.length > 0 && entries[j]!.path[0] === key0) {\n run.push(entries[j]!);\n j += 1;\n }\n\n // Recurse with each member's path shifted one level down (nesting).\n const childEntries: Entry<T>[] = run.map((r) => ({\n part: r.part,\n index: r.index,\n path: r.path.slice(1),\n }));\n const children = buildLevel(childEntries, statusOf);\n const indices = run.map((r) => r.index);\n const status = rollupStatus(run.map((r) => statusOf(r.part)));\n\n out.push({\n kind: \"group\",\n // First member index keeps the group key stable across append-only streams.\n key: `${key0}@${run[0]!.index}`,\n group: { type: key0, status, indices },\n children,\n });\n i = j;\n }\n return out;\n}\n\n/**\n * Build the grouped tree from an ordered part list. Pure + deterministic —\n * never throws. Adjacent parts with a shared group-key path coalesce; multi-key\n * paths nest; ungrouped parts (path `[]`) stay as top-level leaves.\n */\nexport function buildPartGroups<T extends GroupablePart>(\n parts: readonly T[],\n groupBy: GroupBy<T>,\n getStatus?: GetPartStatus<T>,\n): GroupedNode<T>[] {\n const statusOf = (part: T): GroupStatus => getStatus?.(part) ?? defaultPartStatus(part);\n const entries: Entry<T>[] = parts.map((part, index) => {\n let path: readonly GroupKey[] = [];\n try {\n path = groupBy(part, { index, parts }) ?? [];\n } catch {\n path = []; // a throwing groupBy must not break the transcript\n }\n return { part, index, path };\n });\n return buildLevel(entries, statusOf);\n}\n\n/**\n * A cheap fingerprint of the parts' identity + type + status. Feed it to a\n * `useMemo` so the grouped tree only rebuilds when something structural\n * changed — streaming token updates that don't change status won't churn it.\n */\nexport function partsFingerprint<T extends GroupablePart>(\n parts: readonly T[],\n getStatus?: GetPartStatus<T>,\n): string {\n return parts\n .map((part, index) => {\n const status = getStatus?.(part) ?? defaultPartStatus(part);\n return `${leafKey(part, index)}:${part.type}:${status}`;\n })\n .join(\"|\");\n}\n\n// ---------------------------------------------------------------------------\n// groupPartByType — the default grouping strategy + classification hint\n// ---------------------------------------------------------------------------\n\n/** Whether a part folds into a trace (`inline`) or always stands alone. */\nexport type PartDisplay = \"inline\" | \"standalone\";\n\nexport interface GroupPartByTypeOptions<T extends GroupablePart> {\n /** Group key for the collapsible trace. @default \"group-work\" */\n groupKey?: GroupKey;\n /** Part types folded into the trace. @default reasoning + tool-* + dynamic-tool + step-start */\n inline?: (string | RegExp)[];\n /** Part types forced standalone (never folded). @default approval / human / confirmation */\n standalone?: (string | RegExp)[];\n /** Explicit per-part classification; overrides the type lists. */\n classify?: (part: T) => PartDisplay | undefined;\n}\n\nconst DEFAULT_INLINE: (string | RegExp)[] = [/^reasoning$/, /^tool-/, \"dynamic-tool\", \"step-start\"];\nconst DEFAULT_STANDALONE: (string | RegExp)[] = [/approval/i, /human/i, \"confirmation\"];\n\nfunction matchesAny(type: string, patterns: (string | RegExp)[]): boolean {\n return patterns.some((p) => (typeof p === \"string\" ? p === type : p.test(type)));\n}\n\n/**\n * Build a `groupBy` that folds reasoning/tool parts into ONE collapsible trace\n * while forcing human/approval-style parts to stand alone — an interaction card\n * must never fold into a thinking accordion. The classification maps to the\n * `display: \"inline\" | \"standalone\"` hint.\n */\nexport function groupPartByType<T extends GroupablePart>(\n options: GroupPartByTypeOptions<T> = {},\n): GroupBy<T> {\n const groupKey = options.groupKey ?? \"group-work\";\n const inline = options.inline ?? DEFAULT_INLINE;\n const standalone = options.standalone ?? DEFAULT_STANDALONE;\n return (part) => {\n const explicit = options.classify?.(part);\n if (explicit === \"standalone\") return [];\n if (explicit === \"inline\") return [groupKey];\n if (matchesAny(part.type, standalone)) return []; // forced standalone\n if (matchesAny(part.type, inline)) return [groupKey];\n return []; // ungrouped (text, sources, files, …) stays top-level\n };\n}\n\n/** Type guard: is this render subject a synthetic group node? */\nexport function isGroupNode(part: { type: string }): part is PartGroupNode {\n return part.type.startsWith(\"group-\");\n}\n"],"mappings":";;;AA0DA,IAAM,iBAAiB,oBAAI,IAAI;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,eAAe,oBAAI,IAAI,CAAC,gBAAgB,SAAS,QAAQ,CAAC;AAChE,IAAM,kBAAkB,oBAAI,IAAI,CAAC,oBAAoB,iBAAiB,QAAQ,UAAU,CAAC;AAMlF,SAAS,kBAAkB,MAAkC;AAClE,MAAI,KAAK,gBAAgB,KAAM,QAAO;AACtC,QAAM,QAAQ,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;AAC5D,MAAI,OAAO;AACT,QAAI,aAAa,IAAI,KAAK,EAAG,QAAO;AACpC,QAAI,eAAe,IAAI,KAAK,EAAG,QAAO;AACtC,QAAI,gBAAgB,IAAI,KAAK,EAAG,QAAO;AAAA,EACzC;AACA,MAAI,KAAK,aAAa,KAAK,MAAO,QAAO;AACzC,SAAO;AACT;AAGO,SAAS,aAAa,UAA+C;AAC1E,MAAI,SAAS,KAAK,CAAC,MAAM,MAAM,SAAS,EAAG,QAAO;AAClD,MAAI,SAAS,KAAK,CAAC,MAAM,MAAM,OAAO,EAAG,QAAO;AAChD,MAAI,SAAS,KAAK,CAAC,MAAM,MAAM,SAAS,EAAG,QAAO;AAClD,SAAO;AACT;AAOA,SAAS,QAAQ,MAAqB,OAAuB;AAC3D,QAAM,KACH,OAAO,KAAK,OAAO,YAAY,KAAK,MACpC,OAAO,KAAK,eAAe,YAAY,KAAK,cAC7C;AACF,SAAO,MAAM,GAAG,KAAK,IAAI,IAAI,KAAK;AACpC;AAYA,SAAS,WACP,SACA,UACkB;AAClB,QAAM,MAAwB,CAAC;AAC/B,MAAI,IAAI;AACR,SAAO,IAAI,QAAQ,QAAQ;AACzB,UAAM,QAAQ,QAAQ,CAAC;AACvB,QAAI,MAAM,KAAK,WAAW,GAAG;AAC3B,UAAI,KAAK;AAAA,QACP,MAAM;AAAA,QACN,KAAK,QAAQ,MAAM,MAAM,MAAM,KAAK;AAAA,QACpC,OAAO,MAAM;AAAA,QACb,MAAM,MAAM;AAAA,MACd,CAAC;AACD,WAAK;AACL;AAAA,IACF;AAGA,UAAM,OAAO,MAAM,KAAK,CAAC;AACzB,UAAM,MAAkB,CAAC;AACzB,QAAI,IAAI;AACR,WAAO,IAAI,QAAQ,UAAU,QAAQ,CAAC,EAAG,KAAK,SAAS,KAAK,QAAQ,CAAC,EAAG,KAAK,CAAC,MAAM,MAAM;AACxF,UAAI,KAAK,QAAQ,CAAC,CAAE;AACpB,WAAK;AAAA,IACP;AAGA,UAAM,eAA2B,IAAI,IAAI,CAAC,OAAO;AAAA,MAC/C,MAAM,EAAE;AAAA,MACR,OAAO,EAAE;AAAA,MACT,MAAM,EAAE,KAAK,MAAM,CAAC;AAAA,IACtB,EAAE;AACF,UAAM,WAAW,WAAW,cAAc,QAAQ;AAClD,UAAM,UAAU,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK;AACtC,UAAM,SAAS,aAAa,IAAI,IAAI,CAAC,MAAM,SAAS,EAAE,IAAI,CAAC,CAAC;AAE5D,QAAI,KAAK;AAAA,MACP,MAAM;AAAA;AAAA,MAEN,KAAK,GAAG,IAAI,IAAI,IAAI,CAAC,EAAG,KAAK;AAAA,MAC7B,OAAO,EAAE,MAAM,MAAM,QAAQ,QAAQ;AAAA,MACrC;AAAA,IACF,CAAC;AACD,QAAI;AAAA,EACN;AACA,SAAO;AACT;AAOO,SAAS,gBACd,OACA,SACA,WACkB;AAClB,QAAM,WAAW,CAAC,SAAyB,YAAY,IAAI,KAAK,kBAAkB,IAAI;AACtF,QAAM,UAAsB,MAAM,IAAI,CAAC,MAAM,UAAU;AACrD,QAAI,OAA4B,CAAC;AACjC,QAAI;AACF,aAAO,QAAQ,MAAM,EAAE,OAAO,MAAM,CAAC,KAAK,CAAC;AAAA,IAC7C,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AACA,WAAO,EAAE,MAAM,OAAO,KAAK;AAAA,EAC7B,CAAC;AACD,SAAO,WAAW,SAAS,QAAQ;AACrC;AAOO,SAAS,iBACd,OACA,WACQ;AACR,SAAO,MACJ,IAAI,CAAC,MAAM,UAAU;AACpB,UAAM,SAAS,YAAY,IAAI,KAAK,kBAAkB,IAAI;AAC1D,WAAO,GAAG,QAAQ,MAAM,KAAK,CAAC,IAAI,KAAK,IAAI,IAAI,MAAM;AAAA,EACvD,CAAC,EACA,KAAK,GAAG;AACb;AAoBA,IAAM,iBAAsC,CAAC,eAAe,UAAU,gBAAgB,YAAY;AAClG,IAAM,qBAA0C,CAAC,aAAa,UAAU,cAAc;AAEtF,SAAS,WAAW,MAAc,UAAwC;AACxE,SAAO,SAAS,KAAK,CAAC,MAAO,OAAO,MAAM,WAAW,MAAM,OAAO,EAAE,KAAK,IAAI,CAAE;AACjF;AAQO,SAAS,gBACd,UAAqC,CAAC,GAC1B;AACZ,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,SAAS,QAAQ,UAAU;AACjC,QAAM,aAAa,QAAQ,cAAc;AACzC,SAAO,CAAC,SAAS;AACf,UAAM,WAAW,QAAQ,WAAW,IAAI;AACxC,QAAI,aAAa,aAAc,QAAO,CAAC;AACvC,QAAI,aAAa,SAAU,QAAO,CAAC,QAAQ;AAC3C,QAAI,WAAW,KAAK,MAAM,UAAU,EAAG,QAAO,CAAC;AAC/C,QAAI,WAAW,KAAK,MAAM,MAAM,EAAG,QAAO,CAAC,QAAQ;AACnD,WAAO,CAAC;AAAA,EACV;AACF;AAGO,SAAS,YAAY,MAA+C;AACzE,SAAO,KAAK,KAAK,WAAW,QAAQ;AACtC;","names":[]}
@@ -0,0 +1,72 @@
1
+ "use client";
2
+
3
+ // src/sources.tsx
4
+ import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@elabs-ai/components-ui";
5
+ import { cn } from "@elabs-ai/components-ui/lib/cn";
6
+ import { BookIcon, ChevronDownIcon } from "lucide-react";
7
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
8
+ var Sources = ({ className, ...props }) => /* @__PURE__ */ jsx(Collapsible, { className: cn("not-prose mb-4 text-success-text text-meta", className), ...props });
9
+ var SourcesTrigger = ({ className, count, children, ...props }) => /* @__PURE__ */ jsx(
10
+ CollapsibleTrigger,
11
+ {
12
+ className: cn("group flex items-center gap-2 focus-ring", className),
13
+ ...props,
14
+ children: children ?? /* @__PURE__ */ jsxs(Fragment, { children: [
15
+ /* @__PURE__ */ jsxs("p", { className: "font-medium", children: [
16
+ "Used ",
17
+ count,
18
+ " sources"
19
+ ] }),
20
+ /* @__PURE__ */ jsx(ChevronDownIcon, { className: "h-4 w-4 transition-transform group-data-[state=open]:rotate-180" })
21
+ ] })
22
+ }
23
+ );
24
+ var SourcesContent = ({ className, ...props }) => /* @__PURE__ */ jsx(
25
+ CollapsibleContent,
26
+ {
27
+ className: cn(
28
+ "mt-3 flex w-fit flex-col gap-2",
29
+ "data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-top-2 data-[state=open]:slide-in-from-top-2 outline-none data-[state=closed]:animate-out data-[state=open]:animate-in",
30
+ className
31
+ ),
32
+ ...props
33
+ }
34
+ );
35
+ var Source = ({ href, title, children, className, ...props }) => /* @__PURE__ */ jsx(
36
+ "a",
37
+ {
38
+ className: cn("flex items-center gap-2", className),
39
+ href,
40
+ rel: "noopener noreferrer",
41
+ target: "_blank",
42
+ ...props,
43
+ children: children ?? /* @__PURE__ */ jsxs(Fragment, { children: [
44
+ /* @__PURE__ */ jsx(BookIcon, { className: "h-4 w-4" }),
45
+ /* @__PURE__ */ jsx("span", { className: "block text-caption font-medium", children: title })
46
+ ] })
47
+ }
48
+ );
49
+ var SourceList = ({ sources, children, ...props }) => /* @__PURE__ */ jsxs(Sources, { ...props, children: [
50
+ /* @__PURE__ */ jsxs(SourcesTrigger, { count: sources.length, children: [
51
+ /* @__PURE__ */ jsxs("p", { className: "font-medium", children: [
52
+ "Grounded in ",
53
+ sources.length,
54
+ " ",
55
+ sources.length === 1 ? "source" : "sources"
56
+ ] }),
57
+ /* @__PURE__ */ jsx(ChevronDownIcon, { className: "h-4 w-4 transition-transform group-data-[state=open]:rotate-180" })
58
+ ] }),
59
+ /* @__PURE__ */ jsxs(SourcesContent, { children: [
60
+ sources.map((source) => /* @__PURE__ */ jsx(Source, { href: source.href, title: source.title }, source.href)),
61
+ children
62
+ ] })
63
+ ] });
64
+
65
+ export {
66
+ Sources,
67
+ SourcesTrigger,
68
+ SourcesContent,
69
+ Source,
70
+ SourceList
71
+ };
72
+ //# sourceMappingURL=chunk-YYRDGWOU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/sources.tsx"],"sourcesContent":["\"use client\";\n\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { BookIcon, ChevronDownIcon } from \"lucide-react\";\nimport type { ComponentProps, ReactNode } from \"react\";\n\nexport type SourcesProps = ComponentProps<\"div\">;\n\nexport const Sources = ({ className, ...props }: SourcesProps) => (\n <Collapsible className={cn(\"not-prose mb-4 text-success-text text-meta\", className)} {...props} />\n);\n\nexport type SourcesTriggerProps = ComponentProps<typeof CollapsibleTrigger> & {\n count: number;\n};\n\nexport const SourcesTrigger = ({ className, count, children, ...props }: SourcesTriggerProps) => (\n <CollapsibleTrigger\n className={cn(\"group flex items-center gap-2 focus-ring\", className)}\n {...props}\n >\n {children ?? (\n <>\n <p className=\"font-medium\">Used {count} sources</p>\n <ChevronDownIcon className=\"h-4 w-4 transition-transform group-data-[state=open]:rotate-180\" />\n </>\n )}\n </CollapsibleTrigger>\n);\n\nexport type SourcesContentProps = ComponentProps<typeof CollapsibleContent>;\n\nexport const SourcesContent = ({ className, ...props }: SourcesContentProps) => (\n <CollapsibleContent\n className={cn(\n \"mt-3 flex w-fit flex-col gap-2\",\n \"data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-top-2 data-[state=open]:slide-in-from-top-2 outline-none data-[state=closed]:animate-out data-[state=open]:animate-in\",\n className,\n )}\n {...props}\n />\n);\n\nexport type SourceProps = ComponentProps<\"a\">;\n\nexport const Source = ({ href, title, children, className, ...props }: SourceProps) => (\n <a\n className={cn(\"flex items-center gap-2\", className)}\n href={href}\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n {...props}\n >\n {children ?? (\n <>\n <BookIcon className=\"h-4 w-4\" />\n <span className=\"block text-caption font-medium\">{title}</span>\n </>\n )}\n </a>\n);\n\nexport interface SourceListItem {\n href: string;\n title?: string;\n}\n\nexport type SourceListProps = Omit<ComponentProps<typeof Sources>, \"children\"> & {\n /** The grounding sources, rendered as the named list. */\n sources: SourceListItem[];\n /** Extra rows appended after the named list (escape hatch). */\n children?: ReactNode;\n};\n\n/**\n * SourceList — the per-answer grounding footer (research 11 §B.4): a green\n * \"Grounded in N sources\" header + the named source list. Sugar over the fixed\n * `Sources`/`Source` primitives, reused by the context panel (research 09).\n */\nexport const SourceList = ({ sources, children, ...props }: SourceListProps) => (\n <Sources {...props}>\n <SourcesTrigger count={sources.length}>\n <p className=\"font-medium\">\n Grounded in {sources.length} {sources.length === 1 ? \"source\" : \"sources\"}\n </p>\n <ChevronDownIcon className=\"h-4 w-4 transition-transform group-data-[state=open]:rotate-180\" />\n </SourcesTrigger>\n <SourcesContent>\n {sources.map((source) => (\n <Source href={source.href} key={source.href} title={source.title} />\n ))}\n {children}\n </SourcesContent>\n </Sources>\n);\n"],"mappings":";;;AAEA,SAAS,aAAa,oBAAoB,0BAA0B;AACpE,SAAS,UAAU;AACnB,SAAS,UAAU,uBAAuB;AAMxC,SAaI,UAbJ,KAcM,YAdN;AADK,IAAM,UAAU,CAAC,EAAE,WAAW,GAAG,MAAM,MAC5C,oBAAC,eAAY,WAAW,GAAG,8CAA8C,SAAS,GAAI,GAAG,OAAO;AAO3F,IAAM,iBAAiB,CAAC,EAAE,WAAW,OAAO,UAAU,GAAG,MAAM,MACpE;AAAA,EAAC;AAAA;AAAA,IACC,WAAW,GAAG,4CAA4C,SAAS;AAAA,IAClE,GAAG;AAAA,IAEH,sBACC,iCACE;AAAA,2BAAC,OAAE,WAAU,eAAc;AAAA;AAAA,QAAM;AAAA,QAAM;AAAA,SAAQ;AAAA,MAC/C,oBAAC,mBAAgB,WAAU,mEAAkE;AAAA,OAC/F;AAAA;AAEJ;AAKK,IAAM,iBAAiB,CAAC,EAAE,WAAW,GAAG,MAAM,MACnD;AAAA,EAAC;AAAA;AAAA,IACC,WAAW;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN;AAKK,IAAM,SAAS,CAAC,EAAE,MAAM,OAAO,UAAU,WAAW,GAAG,MAAM,MAClE;AAAA,EAAC;AAAA;AAAA,IACC,WAAW,GAAG,2BAA2B,SAAS;AAAA,IAClD;AAAA,IACA,KAAI;AAAA,IACJ,QAAO;AAAA,IACN,GAAG;AAAA,IAEH,sBACC,iCACE;AAAA,0BAAC,YAAS,WAAU,WAAU;AAAA,MAC9B,oBAAC,UAAK,WAAU,kCAAkC,iBAAM;AAAA,OAC1D;AAAA;AAEJ;AAoBK,IAAM,aAAa,CAAC,EAAE,SAAS,UAAU,GAAG,MAAM,MACvD,qBAAC,WAAS,GAAG,OACX;AAAA,uBAAC,kBAAe,OAAO,QAAQ,QAC7B;AAAA,yBAAC,OAAE,WAAU,eAAc;AAAA;AAAA,MACZ,QAAQ;AAAA,MAAO;AAAA,MAAE,QAAQ,WAAW,IAAI,WAAW;AAAA,OAClE;AAAA,IACA,oBAAC,mBAAgB,WAAU,mEAAkE;AAAA,KAC/F;AAAA,EACA,qBAAC,kBACE;AAAA,YAAQ,IAAI,CAAC,WACZ,oBAAC,UAAO,MAAM,OAAO,MAAwB,OAAO,OAAO,SAA3B,OAAO,IAA2B,CACnE;AAAA,IACA;AAAA,KACH;AAAA,GACF;","names":[]}
@@ -0,0 +1,19 @@
1
+ "use client";
2
+ import {
3
+ lazyFlowPart
4
+ } from "./chunk-NMVNNO3L.js";
5
+
6
+ // src/controls.tsx
7
+ import { Suspense } from "react";
8
+ import { jsx } from "react/jsx-runtime";
9
+ var ControlsImpl = lazyFlowPart((m) => m.Controls);
10
+ var Controls = (props) => (
11
+ // An overlay inside an already-loaded `<Canvas>`, so there is no box to
12
+ // reserve — the engine chunk it needs is the one the canvas already fetched.
13
+ /* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(ControlsImpl, { ...props }) })
14
+ );
15
+
16
+ export {
17
+ Controls
18
+ };
19
+ //# sourceMappingURL=chunk-ZIGZMWM7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/controls.tsx"],"sourcesContent":["\"use client\";\n\nimport type { Controls as ControlsPrimitive } from \"@xyflow/react\";\nimport type { ComponentProps } from \"react\";\nimport { Suspense } from \"react\";\n\nimport { lazyFlowPart } from \"./_flow-lazy\";\n\nexport type ControlsProps = ComponentProps<typeof ControlsPrimitive>;\n\n/** React Flow lives behind a dynamic import — see `_flow-lazy.ts` and ADR 0019. */\nconst ControlsImpl = lazyFlowPart<ControlsProps>((m) => m.Controls);\n\nexport const Controls = (props: ControlsProps) => (\n // An overlay inside an already-loaded `<Canvas>`, so there is no box to\n // reserve — the engine chunk it needs is the one the canvas already fetched.\n <Suspense fallback={null}>\n <ControlsImpl {...props} />\n </Suspense>\n);\n"],"mappings":";;;;;;AAIA,SAAS,gBAAgB;AAarB;AANJ,IAAM,eAAe,aAA4B,CAAC,MAAM,EAAE,QAAQ;AAE3D,IAAM,WAAW,CAAC;AAAA;AAAA;AAAA,EAGvB,oBAAC,YAAS,UAAU,MAClB,8BAAC,gBAAc,GAAG,OAAO,GAC3B;AAAA;","names":[]}
@@ -0,0 +1,40 @@
1
+ "use client";
2
+
3
+ // src/tool-result-card.tsx
4
+ import { StatusBadge } from "@elabs-ai/components-ui";
5
+ import { cn } from "@elabs-ai/components-ui/lib/cn";
6
+ import { forwardRef } from "react";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
+ var ToolResultCard = forwardRef(
9
+ function ToolResultCard2({ title, summary, status, actions, details, className, children, ...props }, ref) {
10
+ const hasHeader = title != null || summary != null || status != null || actions != null;
11
+ return /* @__PURE__ */ jsxs(
12
+ "div",
13
+ {
14
+ ref,
15
+ className: cn(
16
+ "not-prose w-full space-y-3 rounded-lg bg-surface-elevated p-4 shadow-sm",
17
+ className
18
+ ),
19
+ ...props,
20
+ children: [
21
+ hasHeader ? /* @__PURE__ */ jsxs("div", { className: "space-y-0.5", children: [
22
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-3", children: [
23
+ title ? /* @__PURE__ */ jsx("h3", { className: "min-w-0 truncate text-subtitle", children: title }) : null,
24
+ actions ? /* @__PURE__ */ jsx("div", { className: "flex shrink-0 items-center gap-1", children: actions }) : null,
25
+ status ? /* @__PURE__ */ jsx(StatusBadge, { className: "shrink-0", size: "sm", status }) : null
26
+ ] }),
27
+ summary ? /* @__PURE__ */ jsx("p", { className: "text-meta text-muted-foreground", children: summary }) : null
28
+ ] }) : null,
29
+ children,
30
+ details
31
+ ]
32
+ }
33
+ );
34
+ }
35
+ );
36
+
37
+ export {
38
+ ToolResultCard
39
+ };
40
+ //# sourceMappingURL=chunk-ZKRTUKNP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tool-result-card.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * ToolResultCard — an artifact the agent PRODUCED, presented as the headline\n * (#192, research 10 §B.4).\n *\n * The elevation channel of the surface-separation system (research 08 §H):\n * raised fill + shadow, NO border (elevation is the separation gesture — a\n * border here would be the redundant-border anti-pattern). A separate\n * component from `Tool` by design: `Tool` owns the rail/inspect idiom (a step\n * that ran, JSON behind disclosure); `ToolResultCard` hosts the produced\n * chart/table/file as `children` — so an agent picks the channel by NAME,\n * not by a behavioural mode flag.\n *\n * Presentational and dependency-light: it does NOT import `@elabs-ai/components-charts` or\n * `@elabs-ai/components-data` (one-way dep graph) — the consumer passes the artifact (an\n * `<AutoChart>`, `<DataTable>`, file preview, …) as children, and maps an\n * AI-SDK tool state to `status` via `statusFromToolState` (tool.tsx).\n *\n * **The card owns artifact-scoped chrome in its header row** — `title |\n * actions | status`, matching `ArtifactActions`, `DialogSection.actions` and\n * `SectionHeader.actions` elsewhere in the system. `actions` is scoped to the\n * artifact AS A WHOLE (expand it, download it, open it somewhere else); the\n * payload's own controls — a chart's flip-to-table, a table's sort — stay in\n * the payload's own frame, in the body. A card that hoisted them would present\n * one row of buttons that act on two different things.\n */\nimport { StatusBadge, type Status } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { forwardRef, type HTMLAttributes, type ReactNode } from \"react\";\n\nexport interface ToolResultCardProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** Headline of the produced artifact (`text-subtitle`). */\n title?: ReactNode;\n /** The business summary line under the title (`text-meta`), not JSON. */\n summary?: ReactNode;\n /** Canonical execution status (closed enum); renders a `StatusBadge`. */\n status?: Status;\n /**\n * Controls scoped to the whole artifact — expand, download, open. Rendered in\n * the header row between the title and the status.\n *\n * A `ReactNode` slot, not a `role=\"toolbar\"`: that role promises roving-tabindex\n * traversal, which this row does not implement. Keep the payload's own controls\n * out of here (see the note at the top of this file).\n */\n actions?: ReactNode;\n /**\n * The technical view, kept behind disclosure — pass a default-collapsed\n * `<ToolDetails>` holding `ToolInput`/`ToolOutput` (research 10 §B.5).\n */\n details?: ReactNode;\n}\n\n/** The produced artifact IS the headline; pass it as `children`. */\nexport const ToolResultCard = forwardRef<HTMLDivElement, ToolResultCardProps>(\n function ToolResultCard(\n { title, summary, status, actions, details, className, children, ...props },\n ref,\n ) {\n const hasHeader = title != null || summary != null || status != null || actions != null;\n return (\n <div\n ref={ref}\n className={cn(\n \"not-prose w-full space-y-3 rounded-lg bg-surface-elevated p-4 shadow-sm\",\n className,\n )}\n {...props}\n >\n {hasHeader ? (\n <div className=\"space-y-0.5\">\n <div className=\"flex items-center justify-between gap-3\">\n {title ? <h3 className=\"min-w-0 truncate text-subtitle\">{title}</h3> : null}\n {actions ? <div className=\"flex shrink-0 items-center gap-1\">{actions}</div> : null}\n {status ? <StatusBadge className=\"shrink-0\" size=\"sm\" status={status} /> : null}\n </div>\n {summary ? <p className=\"text-meta text-muted-foreground\">{summary}</p> : null}\n </div>\n ) : null}\n {children}\n {details}\n </div>\n );\n },\n);\n"],"mappings":";;;AA2BA,SAAS,mBAAgC;AACzC,SAAS,UAAU;AACnB,SAAS,kBAAuD;AA2CpD,SACW,KADX;AAjBL,IAAM,iBAAiB;AAAA,EAC5B,SAASA,gBACP,EAAE,OAAO,SAAS,QAAQ,SAAS,SAAS,WAAW,UAAU,GAAG,MAAM,GAC1E,KACA;AACA,UAAM,YAAY,SAAS,QAAQ,WAAW,QAAQ,UAAU,QAAQ,WAAW;AACnF,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QACC,GAAG;AAAA,QAEH;AAAA,sBACC,qBAAC,SAAI,WAAU,eACb;AAAA,iCAAC,SAAI,WAAU,2CACZ;AAAA,sBAAQ,oBAAC,QAAG,WAAU,kCAAkC,iBAAM,IAAQ;AAAA,cACtE,UAAU,oBAAC,SAAI,WAAU,oCAAoC,mBAAQ,IAAS;AAAA,cAC9E,SAAS,oBAAC,eAAY,WAAU,YAAW,MAAK,MAAK,QAAgB,IAAK;AAAA,eAC7E;AAAA,YACC,UAAU,oBAAC,OAAE,WAAU,mCAAmC,mBAAQ,IAAO;AAAA,aAC5E,IACE;AAAA,UACH;AAAA,UACA;AAAA;AAAA;AAAA,IACH;AAAA,EAEJ;AACF;","names":["ToolResultCard"]}
@@ -0,0 +1,38 @@
1
+ "use client";
2
+ "use client";
3
+ import {
4
+ CodeBlock,
5
+ CodeBlockActions,
6
+ CodeBlockContainer,
7
+ CodeBlockContent,
8
+ CodeBlockCopyButton,
9
+ CodeBlockFilename,
10
+ CodeBlockHeader,
11
+ CodeBlockLanguageSelector,
12
+ CodeBlockLanguageSelectorContent,
13
+ CodeBlockLanguageSelectorItem,
14
+ CodeBlockLanguageSelectorTrigger,
15
+ CodeBlockLanguageSelectorValue,
16
+ CodeBlockTitle,
17
+ highlightCode
18
+ } from "./chunk-TWPHAJNM.js";
19
+ import "./chunk-3YPT3V7L.js";
20
+ import "./chunk-3TDHPXZZ.js";
21
+ import "./chunk-SSKZ2AED.js";
22
+ export {
23
+ CodeBlock,
24
+ CodeBlockActions,
25
+ CodeBlockContainer,
26
+ CodeBlockContent,
27
+ CodeBlockCopyButton,
28
+ CodeBlockFilename,
29
+ CodeBlockHeader,
30
+ CodeBlockLanguageSelector,
31
+ CodeBlockLanguageSelectorContent,
32
+ CodeBlockLanguageSelectorItem,
33
+ CodeBlockLanguageSelectorTrigger,
34
+ CodeBlockLanguageSelectorValue,
35
+ CodeBlockTitle,
36
+ highlightCode
37
+ };
38
+ //# sourceMappingURL=code-block.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/dist/commit.js ADDED
@@ -0,0 +1,51 @@
1
+ "use client";
2
+ "use client";
3
+ import {
4
+ Commit,
5
+ CommitActions,
6
+ CommitAuthor,
7
+ CommitAuthorAvatar,
8
+ CommitContent,
9
+ CommitCopyButton,
10
+ CommitFile,
11
+ CommitFileAdditions,
12
+ CommitFileChanges,
13
+ CommitFileDeletions,
14
+ CommitFileIcon,
15
+ CommitFileInfo,
16
+ CommitFilePath,
17
+ CommitFileStatus,
18
+ CommitFiles,
19
+ CommitHash,
20
+ CommitHeader,
21
+ CommitInfo,
22
+ CommitMessage,
23
+ CommitMetadata,
24
+ CommitSeparator,
25
+ CommitTimestamp
26
+ } from "./chunk-UCKFJ3QF.js";
27
+ export {
28
+ Commit,
29
+ CommitActions,
30
+ CommitAuthor,
31
+ CommitAuthorAvatar,
32
+ CommitContent,
33
+ CommitCopyButton,
34
+ CommitFile,
35
+ CommitFileAdditions,
36
+ CommitFileChanges,
37
+ CommitFileDeletions,
38
+ CommitFileIcon,
39
+ CommitFileInfo,
40
+ CommitFilePath,
41
+ CommitFileStatus,
42
+ CommitFiles,
43
+ CommitHash,
44
+ CommitHeader,
45
+ CommitInfo,
46
+ CommitMessage,
47
+ CommitMetadata,
48
+ CommitSeparator,
49
+ CommitTimestamp
50
+ };
51
+ //# sourceMappingURL=commit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,15 @@
1
+ "use client";
2
+ "use client";
3
+ import {
4
+ Composer
5
+ } from "./chunk-MXTAWPYM.js";
6
+ import "./chunk-475UEU2Q.js";
7
+ import "./chunk-P6YJAZFG.js";
8
+ import "./chunk-H42LRUQ4.js";
9
+ import "./chunk-WMDSMSPL.js";
10
+ import "./chunk-SSGJ6MEM.js";
11
+ import "./chunk-3YPT3V7L.js";
12
+ export {
13
+ Composer
14
+ };
15
+ //# sourceMappingURL=composer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,53 @@
1
+ "use client";
2
+ "use client";
3
+ import {
4
+ ApprovalCard,
5
+ ApprovalCardAccepted,
6
+ ApprovalCardAction,
7
+ ApprovalCardActions,
8
+ ApprovalCardApprove,
9
+ ApprovalCardDeny,
10
+ ApprovalCardDescription,
11
+ ApprovalCardOptions,
12
+ ApprovalCardReason,
13
+ ApprovalCardRejected,
14
+ ApprovalCardRequest,
15
+ ApprovalCardTarget,
16
+ ApprovalCardTitle,
17
+ Confirmation,
18
+ ConfirmationAccepted,
19
+ ConfirmationAction,
20
+ ConfirmationActions,
21
+ ConfirmationApprove,
22
+ ConfirmationDeny,
23
+ ConfirmationDescription,
24
+ ConfirmationRejected,
25
+ ConfirmationRequest,
26
+ ConfirmationTitle
27
+ } from "./chunk-ELGCZLZF.js";
28
+ export {
29
+ ApprovalCard,
30
+ ApprovalCardAccepted,
31
+ ApprovalCardAction,
32
+ ApprovalCardActions,
33
+ ApprovalCardApprove,
34
+ ApprovalCardDeny,
35
+ ApprovalCardDescription,
36
+ ApprovalCardOptions,
37
+ ApprovalCardReason,
38
+ ApprovalCardRejected,
39
+ ApprovalCardRequest,
40
+ ApprovalCardTarget,
41
+ ApprovalCardTitle,
42
+ Confirmation,
43
+ ConfirmationAccepted,
44
+ ConfirmationAction,
45
+ ConfirmationActions,
46
+ ConfirmationApprove,
47
+ ConfirmationDeny,
48
+ ConfirmationDescription,
49
+ ConfirmationRejected,
50
+ ConfirmationRequest,
51
+ ConfirmationTitle
52
+ };
53
+ //# sourceMappingURL=confirmation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,8 @@
1
+ "use client";
2
+ import {
3
+ Connection
4
+ } from "./chunk-MOK66734.js";
5
+ export {
6
+ Connection
7
+ };
8
+ //# sourceMappingURL=connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,25 @@
1
+ "use client";
2
+ "use client";
3
+ import {
4
+ ContextPanel,
5
+ ContextPanelBody,
6
+ ContextPanelDetail,
7
+ ContextPanelHeader,
8
+ ContextPanelProvider,
9
+ ContextPanelSection,
10
+ ContextPanelTrigger,
11
+ useAssetPreviewRenderer,
12
+ useContextPanel
13
+ } from "./chunk-NPUCMAG2.js";
14
+ export {
15
+ ContextPanel,
16
+ ContextPanelBody,
17
+ ContextPanelDetail,
18
+ ContextPanelHeader,
19
+ ContextPanelProvider,
20
+ ContextPanelSection,
21
+ ContextPanelTrigger,
22
+ useAssetPreviewRenderer,
23
+ useContextPanel
24
+ };
25
+ //# sourceMappingURL=context-panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,10 @@
1
+ "use client";
2
+ "use client";
3
+ import {
4
+ Controls
5
+ } from "./chunk-ZIGZMWM7.js";
6
+ import "./chunk-NMVNNO3L.js";
7
+ export {
8
+ Controls
9
+ };
10
+ //# sourceMappingURL=controls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,19 @@
1
+ "use client";
2
+ "use client";
3
+ import {
4
+ Conversation,
5
+ ConversationContent,
6
+ ConversationDownload,
7
+ ConversationEmptyState,
8
+ ConversationScrollButton,
9
+ messagesToMarkdown
10
+ } from "./chunk-IX2PXG4Y.js";
11
+ export {
12
+ Conversation,
13
+ ConversationContent,
14
+ ConversationDownload,
15
+ ConversationEmptyState,
16
+ ConversationScrollButton,
17
+ messagesToMarkdown
18
+ };
19
+ //# sourceMappingURL=conversation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,15 @@
1
+ "use client";
2
+ "use client";
3
+ import {
4
+ DiffView,
5
+ diffRowVariants
6
+ } from "./chunk-6PB2MXCI.js";
7
+ import "./chunk-TWPHAJNM.js";
8
+ import "./chunk-3YPT3V7L.js";
9
+ import "./chunk-3TDHPXZZ.js";
10
+ import "./chunk-SSKZ2AED.js";
11
+ export {
12
+ DiffView,
13
+ diffRowVariants
14
+ };
15
+ //# sourceMappingURL=diff-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/dist/edge.js ADDED
@@ -0,0 +1,10 @@
1
+ "use client";
2
+ "use client";
3
+ import {
4
+ Edge
5
+ } from "./chunk-6IQPH2OS.js";
6
+ import "./chunk-NMVNNO3L.js";
7
+ export {
8
+ Edge
9
+ };
10
+ //# sourceMappingURL=edge.js.map