@elabs-ai/components-ai 4.2.0 → 5.1.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 (462) hide show
  1. package/README.md +1 -1
  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-BA3AEMOU.js +21 -0
  106. package/dist/chunk-BA3AEMOU.js.map +1 -0
  107. package/dist/chunk-BBHFOYML.js +336 -0
  108. package/dist/chunk-BBHFOYML.js.map +1 -0
  109. package/dist/chunk-BHUVISIY.js +221 -0
  110. package/dist/chunk-BHUVISIY.js.map +1 -0
  111. package/dist/chunk-BM2LWERA.js +100 -0
  112. package/dist/chunk-BM2LWERA.js.map +1 -0
  113. package/dist/chunk-CMOYXNPJ.js +211 -0
  114. package/dist/chunk-CMOYXNPJ.js.map +1 -0
  115. package/dist/chunk-CZP3RHC4.js +74 -0
  116. package/dist/chunk-CZP3RHC4.js.map +1 -0
  117. package/dist/chunk-DDG5JHQT.js +112 -0
  118. package/dist/chunk-DDG5JHQT.js.map +1 -0
  119. package/dist/chunk-DJODXO7I.js +38 -0
  120. package/dist/chunk-DJODXO7I.js.map +1 -0
  121. package/dist/chunk-DWJDJLPU.js +192 -0
  122. package/dist/chunk-DWJDJLPU.js.map +1 -0
  123. package/dist/chunk-DZW6LM22.js +45 -0
  124. package/dist/chunk-DZW6LM22.js.map +1 -0
  125. package/dist/chunk-ELGCZLZF.js +305 -0
  126. package/dist/chunk-ELGCZLZF.js.map +1 -0
  127. package/dist/chunk-EV3U6ZZB.js +209 -0
  128. package/dist/chunk-EV3U6ZZB.js.map +1 -0
  129. package/dist/chunk-EY7LVUKQ.js +87 -0
  130. package/dist/chunk-EY7LVUKQ.js.map +1 -0
  131. package/dist/chunk-F4C74F7M.js +230 -0
  132. package/dist/chunk-F4C74F7M.js.map +1 -0
  133. package/dist/chunk-FERYDFZA.js +108 -0
  134. package/dist/chunk-FERYDFZA.js.map +1 -0
  135. package/dist/chunk-FUIYG2DS.js +166 -0
  136. package/dist/chunk-FUIYG2DS.js.map +1 -0
  137. package/dist/chunk-GA7M34KU.js +236 -0
  138. package/dist/chunk-GA7M34KU.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-L4SU3QJV.js +174 -0
  156. package/dist/chunk-L4SU3QJV.js.map +1 -0
  157. package/dist/chunk-LMNSBOBG.js +19 -0
  158. package/dist/chunk-LMNSBOBG.js.map +1 -0
  159. package/dist/chunk-MBI7D6IL.js +42 -0
  160. package/dist/chunk-MBI7D6IL.js.map +1 -0
  161. package/dist/chunk-MLFMYCPH.js +192 -0
  162. package/dist/chunk-MLFMYCPH.js.map +1 -0
  163. package/dist/chunk-MOK66734.js +33 -0
  164. package/dist/chunk-MOK66734.js.map +1 -0
  165. package/dist/chunk-MXTAWPYM.js +196 -0
  166. package/dist/chunk-MXTAWPYM.js.map +1 -0
  167. package/dist/chunk-NCL2UZKI.js +96 -0
  168. package/dist/chunk-NCL2UZKI.js.map +1 -0
  169. package/dist/chunk-NET4YLRY.js +107 -0
  170. package/dist/chunk-NET4YLRY.js.map +1 -0
  171. package/dist/chunk-NIG67CFM.js +329 -0
  172. package/dist/chunk-NIG67CFM.js.map +1 -0
  173. package/dist/chunk-NMVNNO3L.js +10 -0
  174. package/dist/chunk-NMVNNO3L.js.map +1 -0
  175. package/dist/chunk-NP7VID4K.js +2 -0
  176. package/dist/chunk-NP7VID4K.js.map +1 -0
  177. package/dist/chunk-NPUCMAG2.js +382 -0
  178. package/dist/chunk-NPUCMAG2.js.map +1 -0
  179. package/dist/chunk-NSCLRHES.js +102 -0
  180. package/dist/chunk-NSCLRHES.js.map +1 -0
  181. package/dist/chunk-OEUXHVFW.js +86 -0
  182. package/dist/chunk-OEUXHVFW.js.map +1 -0
  183. package/dist/chunk-ONBHFIMZ.js +137 -0
  184. package/dist/chunk-ONBHFIMZ.js.map +1 -0
  185. package/dist/chunk-OPH2HHL2.js +228 -0
  186. package/dist/chunk-OPH2HHL2.js.map +1 -0
  187. package/dist/chunk-OQERHIQP.js +287 -0
  188. package/dist/chunk-OQERHIQP.js.map +1 -0
  189. package/dist/chunk-P6YJAZFG.js +103 -0
  190. package/dist/chunk-P6YJAZFG.js.map +1 -0
  191. package/dist/chunk-PG7ERDOD.js +65 -0
  192. package/dist/chunk-PG7ERDOD.js.map +1 -0
  193. package/dist/chunk-PIB5JBMA.js +90 -0
  194. package/dist/chunk-PIB5JBMA.js.map +1 -0
  195. package/dist/chunk-PQ5BPIWQ.js +22 -0
  196. package/dist/chunk-PQ5BPIWQ.js.map +1 -0
  197. package/dist/chunk-PQBF6ZIQ.js +55 -0
  198. package/dist/chunk-PQBF6ZIQ.js.map +1 -0
  199. package/dist/chunk-PTWCTSZL.js +173 -0
  200. package/dist/chunk-PTWCTSZL.js.map +1 -0
  201. package/dist/chunk-QJUNPVOS.js +101 -0
  202. package/dist/chunk-QJUNPVOS.js.map +1 -0
  203. package/dist/chunk-QOBSEGCG.js +996 -0
  204. package/dist/chunk-QOBSEGCG.js.map +1 -0
  205. package/dist/chunk-QUDZOTRV.js +43 -0
  206. package/dist/chunk-QUDZOTRV.js.map +1 -0
  207. package/dist/chunk-RB7G65JC.js +213 -0
  208. package/dist/chunk-RB7G65JC.js.map +1 -0
  209. package/dist/chunk-RPHAOR7P.js +45 -0
  210. package/dist/chunk-RPHAOR7P.js.map +1 -0
  211. package/dist/chunk-RTCSH2AN.js +331 -0
  212. package/dist/chunk-RTCSH2AN.js.map +1 -0
  213. package/dist/chunk-S3ISPW3A.js +28 -0
  214. package/dist/chunk-S3ISPW3A.js.map +1 -0
  215. package/dist/chunk-SEVN656N.js +36 -0
  216. package/dist/chunk-SEVN656N.js.map +1 -0
  217. package/dist/chunk-SKVG672B.js +64 -0
  218. package/dist/chunk-SKVG672B.js.map +1 -0
  219. package/dist/chunk-SSGJ6MEM.js +1076 -0
  220. package/dist/chunk-SSGJ6MEM.js.map +1 -0
  221. package/dist/chunk-SSKZ2AED.js +118 -0
  222. package/dist/chunk-SSKZ2AED.js.map +1 -0
  223. package/dist/chunk-T56JFGXI.js +561 -0
  224. package/dist/chunk-T56JFGXI.js.map +1 -0
  225. package/dist/chunk-TCB6O74A.js +137 -0
  226. package/dist/chunk-TCB6O74A.js.map +1 -0
  227. package/dist/chunk-TTEYPO6X.js +57 -0
  228. package/dist/chunk-TTEYPO6X.js.map +1 -0
  229. package/dist/chunk-TWPHAJNM.js +462 -0
  230. package/dist/chunk-TWPHAJNM.js.map +1 -0
  231. package/dist/chunk-TXJJLP4O.js +336 -0
  232. package/dist/chunk-TXJJLP4O.js.map +1 -0
  233. package/dist/chunk-TZ6TB7VM.js +245 -0
  234. package/dist/chunk-TZ6TB7VM.js.map +1 -0
  235. package/dist/chunk-UBLKJJ7K.js +278 -0
  236. package/dist/chunk-UBLKJJ7K.js.map +1 -0
  237. package/dist/chunk-UCJ6IUFS.js +52 -0
  238. package/dist/chunk-UCJ6IUFS.js.map +1 -0
  239. package/dist/chunk-UCKFJ3QF.js +197 -0
  240. package/dist/chunk-UCKFJ3QF.js.map +1 -0
  241. package/dist/chunk-UPXSLILN.js +20 -0
  242. package/dist/chunk-UPXSLILN.js.map +1 -0
  243. package/dist/chunk-V4DORGWJ.js +92 -0
  244. package/dist/chunk-V4DORGWJ.js.map +1 -0
  245. package/dist/chunk-V6E5DYZD.js +80 -0
  246. package/dist/chunk-V6E5DYZD.js.map +1 -0
  247. package/dist/chunk-VLLYKF3P.js +96 -0
  248. package/dist/chunk-VLLYKF3P.js.map +1 -0
  249. package/dist/chunk-VLNBTOH6.js +43 -0
  250. package/dist/chunk-VLNBTOH6.js.map +1 -0
  251. package/dist/chunk-WMDSMSPL.js +303 -0
  252. package/dist/chunk-WMDSMSPL.js.map +1 -0
  253. package/dist/chunk-WU5BLGTF.js +149 -0
  254. package/dist/chunk-WU5BLGTF.js.map +1 -0
  255. package/dist/chunk-WYTZVSGK.js +245 -0
  256. package/dist/chunk-WYTZVSGK.js.map +1 -0
  257. package/dist/chunk-X47QMM6K.js +187 -0
  258. package/dist/chunk-X47QMM6K.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 +366 -98
  300. package/dist/index.js +672 -13577
  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 +11 -9
  405. package/schemas/a2ui-surface.v1.schema.json +5434 -0
  406. package/src/_chat-shell-rail.tsx +3 -1
  407. package/src/_flow-boundary.tsx +2 -2
  408. package/src/_persona-rive.tsx +27 -41
  409. package/src/a2ui/a2ui-surface.stories.tsx +662 -0
  410. package/src/a2ui/a2ui-surface.test.tsx +201 -0
  411. package/src/a2ui/a2ui-surface.tsx +354 -0
  412. package/src/a2ui/catalog.source.json +772 -0
  413. package/src/a2ui/core/a2ui-core.test.ts +178 -0
  414. package/src/a2ui/core/catalog.generated.ts +1019 -0
  415. package/src/a2ui/core/complete-json.ts +81 -0
  416. package/src/a2ui/core/index.ts +10 -0
  417. package/src/a2ui/core/schema.ts +111 -0
  418. package/src/a2ui/core/spec.ts +148 -0
  419. package/src/a2ui/core/validate.ts +266 -0
  420. package/src/a2ui/index.ts +7 -0
  421. package/src/a2ui/ui-catalog.tsx +225 -0
  422. package/src/a2ui/wave1-chart-spec.test.ts +87 -0
  423. package/src/a2ui/wave2-chart-spec.test.ts +108 -0
  424. package/src/agentic-workspace.stories.tsx +6 -45
  425. package/src/chat-shell.test.tsx +40 -10
  426. package/src/chat-shell.tsx +90 -44
  427. package/src/chat.stories.tsx +47 -42
  428. package/src/composer.stories.tsx +4 -5
  429. package/src/composer.test.tsx +45 -0
  430. package/src/composer.tsx +104 -21
  431. package/src/context-panel.stories.tsx +1 -1
  432. package/src/context-panel.tsx +1 -1
  433. package/src/conversation.stories.tsx +1 -0
  434. package/src/conversation.test.tsx +16 -0
  435. package/src/conversation.tsx +16 -2
  436. package/src/diff-view.stories.tsx +79 -0
  437. package/src/diff-view.tsx +3 -2
  438. package/src/file-tree.tsx +24 -17
  439. package/src/gallery.stories.tsx +42 -0
  440. package/src/gallery.tsx +2 -2
  441. package/src/grouped-parts.stories.tsx +23 -0
  442. package/src/grouped-parts.tsx +1 -1
  443. package/src/index.ts +1 -0
  444. package/src/message-compare.stories.tsx +40 -0
  445. package/src/message-compare.tsx +2 -1
  446. package/src/message-form.tsx +1 -1
  447. package/src/message-table.stories.tsx +24 -0
  448. package/src/message-table.tsx +1 -1
  449. package/src/package-info.tsx +12 -9
  450. package/src/reasoning.stories.tsx +27 -0
  451. package/src/reasoning.tsx +1 -1
  452. package/src/session-header.stories.tsx +35 -1
  453. package/src/session-header.tsx +1 -1
  454. package/src/sources.stories.tsx +30 -0
  455. package/src/sources.tsx +4 -1
  456. package/src/templates-ai-assistant.stories.tsx +151 -87
  457. package/src/tool.stories.tsx +39 -0
  458. package/src/tool.tsx +3 -3
  459. package/src/toolbar.tsx +0 -10
  460. package/dist/_flow-boundary-SHNWLQG5.js.map +0 -1
  461. package/dist/_persona-rive-JEG44YHX.js.map +0 -1
  462. /package/dist/{_audio-player-media-chrome-T3XVXWRZ.js.map → _audio-player-media-chrome.js.map} +0 -0
@@ -0,0 +1,108 @@
1
+ "use client";
2
+ import {
3
+ getStatusBadge
4
+ } from "./chunk-PTWCTSZL.js";
5
+
6
+ // src/sandbox.tsx
7
+ import {
8
+ Collapsible,
9
+ CollapsibleContent,
10
+ CollapsibleTrigger,
11
+ Skeleton,
12
+ Tabs,
13
+ TabsContent,
14
+ TabsList,
15
+ TabsTrigger,
16
+ useLocale
17
+ } from "@elabs-ai/components-ui";
18
+ import { cn } from "@elabs-ai/components-ui/lib/cn";
19
+ import { ChevronDownIcon, Code } from "lucide-react";
20
+ import { createContext, use, useMemo } from "react";
21
+ import { jsx, jsxs } from "react/jsx-runtime";
22
+ var SandboxContext = createContext({ loading: false });
23
+ var Sandbox = ({ className, loading = false, children, ...props }) => {
24
+ const contextValue = useMemo(() => ({ loading }), [loading]);
25
+ return /* @__PURE__ */ jsx(SandboxContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx(
26
+ Collapsible,
27
+ {
28
+ className: cn("not-prose group mb-4 w-full overflow-hidden rounded-md border", className),
29
+ defaultOpen: true,
30
+ ...props,
31
+ children
32
+ }
33
+ ) });
34
+ };
35
+ var SandboxHeader = ({ className, title, state, ...props }) => /* @__PURE__ */ jsxs(
36
+ CollapsibleTrigger,
37
+ {
38
+ className: cn("flex w-full items-center justify-between gap-4 p-3", className),
39
+ ...props,
40
+ children: [
41
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
42
+ /* @__PURE__ */ jsx(Code, { className: "size-4 text-muted-foreground" }),
43
+ /* @__PURE__ */ jsx("span", { className: "font-medium text-body", children: title }),
44
+ getStatusBadge(state)
45
+ ] }),
46
+ /* @__PURE__ */ jsx(ChevronDownIcon, { className: "size-4 text-muted-foreground transition-transform group-data-[state=open]:rotate-180" })
47
+ ]
48
+ }
49
+ );
50
+ var SandboxContent = ({ className, children, ...props }) => {
51
+ const { loading } = use(SandboxContext);
52
+ const { t } = useLocale();
53
+ return /* @__PURE__ */ jsx(
54
+ CollapsibleContent,
55
+ {
56
+ className: cn(
57
+ "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",
58
+ className
59
+ ),
60
+ ...props,
61
+ children: loading ? /* @__PURE__ */ jsxs("div", { className: "space-y-2 p-3", role: "status", "aria-live": "polite", children: [
62
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: t("loading") }),
63
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-1/3" }),
64
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-full" }),
65
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-full" }),
66
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-2/3" })
67
+ ] }) : children
68
+ }
69
+ );
70
+ };
71
+ var SandboxTabs = ({ className, ...props }) => /* @__PURE__ */ jsx(Tabs, { className: cn("w-full gap-0", className), ...props });
72
+ var SandboxTabsBar = ({ className, ...props }) => /* @__PURE__ */ jsx(
73
+ "div",
74
+ {
75
+ className: cn("flex w-full items-center border-border border-t border-b", className),
76
+ ...props
77
+ }
78
+ );
79
+ var SandboxTabsList = ({ className, ...props }) => /* @__PURE__ */ jsx(
80
+ TabsList,
81
+ {
82
+ className: cn("h-auto rounded-none border-0 bg-transparent p-0", className),
83
+ ...props
84
+ }
85
+ );
86
+ var SandboxTabsTrigger = ({ className, ...props }) => /* @__PURE__ */ jsx(
87
+ TabsTrigger,
88
+ {
89
+ className: cn(
90
+ "rounded-none border-0 border-transparent border-b-2 px-4 py-2 font-medium text-muted-foreground text-body transition-colors data-[state=active]:border-primary data-[state=active]:bg-transparent data-[state=active]:text-foreground data-[state=active]:shadow-none",
91
+ className
92
+ ),
93
+ ...props
94
+ }
95
+ );
96
+ var SandboxTabContent = ({ className, ...props }) => /* @__PURE__ */ jsx(TabsContent, { className: cn("mt-0 text-body", className), ...props });
97
+
98
+ export {
99
+ Sandbox,
100
+ SandboxHeader,
101
+ SandboxContent,
102
+ SandboxTabs,
103
+ SandboxTabsBar,
104
+ SandboxTabsList,
105
+ SandboxTabsTrigger,
106
+ SandboxTabContent
107
+ };
108
+ //# sourceMappingURL=chunk-FERYDFZA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/sandbox.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n Skeleton,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n useLocale,\n} from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport type { ToolUIPart } from \"ai\";\nimport { ChevronDownIcon, Code } from \"lucide-react\";\nimport type { ComponentProps } from \"react\";\nimport { createContext, use, useMemo } from \"react\";\n\nimport { getStatusBadge } from \"./tool\";\n\n/**\n * Shared loading state (composition-patterns — lifted into the provider),\n * mirroring Artifact: Sandbox is the only place that knows whether the run\n * body has arrived; SandboxContent reads the interface and renders a\n * skeleton, while SandboxHeader (an ordinary child of Sandbox) keeps\n * rendering as passed.\n */\nconst SandboxContext = createContext<{ loading: boolean }>({ loading: false });\n\nexport type SandboxProps = ComponentProps<typeof Collapsible> & {\n /**\n * The run output has not arrived yet (loading-states.md loading signal).\n * SandboxContent renders a layout-shaped skeleton instead of its children;\n * SandboxHeader keeps rendering as passed.\n * @default false\n */\n loading?: boolean;\n};\n\n/** @deprecated Renamed to `SandboxProps`. */\nexport type SandboxRootProps = SandboxProps;\n\nexport const Sandbox = ({ className, loading = false, children, ...props }: SandboxProps) => {\n const contextValue = useMemo(() => ({ loading }), [loading]);\n\n return (\n <SandboxContext.Provider value={contextValue}>\n <Collapsible\n className={cn(\"not-prose group mb-4 w-full overflow-hidden rounded-md border\", className)}\n defaultOpen\n {...props}\n >\n {children}\n </Collapsible>\n </SandboxContext.Provider>\n );\n};\n\nexport interface SandboxHeaderProps {\n title?: string;\n state: ToolUIPart[\"state\"];\n className?: string;\n}\n\nexport const SandboxHeader = ({ className, title, state, ...props }: SandboxHeaderProps) => (\n <CollapsibleTrigger\n className={cn(\"flex w-full items-center justify-between gap-4 p-3\", className)}\n {...props}\n >\n <div className=\"flex items-center gap-2\">\n <Code className=\"size-4 text-muted-foreground\" />\n <span className=\"font-medium text-body\">{title}</span>\n {getStatusBadge(state)}\n </div>\n <ChevronDownIcon className=\"size-4 text-muted-foreground transition-transform group-data-[state=open]:rotate-180\" />\n </CollapsibleTrigger>\n);\n\nexport type SandboxContentProps = ComponentProps<typeof CollapsibleContent>;\n\nexport const SandboxContent = ({ className, children, ...props }: SandboxContentProps) => {\n const { loading } = use(SandboxContext);\n const { t } = useLocale();\n\n return (\n <CollapsibleContent\n className={cn(\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 {loading ? (\n <div className=\"space-y-2 p-3\" role=\"status\" aria-live=\"polite\">\n <span className=\"sr-only\">{t(\"loading\")}</span>\n <Skeleton className=\"h-4 w-1/3\" />\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-2/3\" />\n </div>\n ) : (\n children\n )}\n </CollapsibleContent>\n );\n};\n\nexport type SandboxTabsProps = ComponentProps<typeof Tabs>;\n\nexport const SandboxTabs = ({ className, ...props }: SandboxTabsProps) => (\n <Tabs className={cn(\"w-full gap-0\", className)} {...props} />\n);\n\nexport type SandboxTabsBarProps = ComponentProps<\"div\">;\n\nexport const SandboxTabsBar = ({ className, ...props }: SandboxTabsBarProps) => (\n <div\n className={cn(\"flex w-full items-center border-border border-t border-b\", className)}\n {...props}\n />\n);\n\nexport type SandboxTabsListProps = ComponentProps<typeof TabsList>;\n\nexport const SandboxTabsList = ({ className, ...props }: SandboxTabsListProps) => (\n <TabsList\n className={cn(\"h-auto rounded-none border-0 bg-transparent p-0\", className)}\n {...props}\n />\n);\n\nexport type SandboxTabsTriggerProps = ComponentProps<typeof TabsTrigger>;\n\nexport const SandboxTabsTrigger = ({ className, ...props }: SandboxTabsTriggerProps) => (\n <TabsTrigger\n className={cn(\n \"rounded-none border-0 border-transparent border-b-2 px-4 py-2 font-medium text-muted-foreground text-body transition-colors data-[state=active]:border-primary data-[state=active]:bg-transparent data-[state=active]:text-foreground data-[state=active]:shadow-none\",\n className,\n )}\n {...props}\n />\n);\n\nexport type SandboxTabContentProps = ComponentProps<typeof TabsContent>;\n\nexport const SandboxTabContent = ({ className, ...props }: SandboxTabContentProps) => (\n <TabsContent className={cn(\"mt-0 text-body\", className)} {...props} />\n);\n"],"mappings":";;;;;;AAEA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,UAAU;AAEnB,SAAS,iBAAiB,YAAY;AAEtC,SAAS,eAAe,KAAK,eAAe;AA+BtC,cAsBF,YAtBE;AApBN,IAAM,iBAAiB,cAAoC,EAAE,SAAS,MAAM,CAAC;AAetE,IAAM,UAAU,CAAC,EAAE,WAAW,UAAU,OAAO,UAAU,GAAG,MAAM,MAAoB;AAC3F,QAAM,eAAe,QAAQ,OAAO,EAAE,QAAQ,IAAI,CAAC,OAAO,CAAC;AAE3D,SACE,oBAAC,eAAe,UAAf,EAAwB,OAAO,cAC9B;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,iEAAiE,SAAS;AAAA,MACxF,aAAW;AAAA,MACV,GAAG;AAAA,MAEH;AAAA;AAAA,EACH,GACF;AAEJ;AAQO,IAAM,gBAAgB,CAAC,EAAE,WAAW,OAAO,OAAO,GAAG,MAAM,MAChE;AAAA,EAAC;AAAA;AAAA,IACC,WAAW,GAAG,sDAAsD,SAAS;AAAA,IAC5E,GAAG;AAAA,IAEJ;AAAA,2BAAC,SAAI,WAAU,2BACb;AAAA,4BAAC,QAAK,WAAU,gCAA+B;AAAA,QAC/C,oBAAC,UAAK,WAAU,yBAAyB,iBAAM;AAAA,QAC9C,eAAe,KAAK;AAAA,SACvB;AAAA,MACA,oBAAC,mBAAgB,WAAU,wFAAuF;AAAA;AAAA;AACpH;AAKK,IAAM,iBAAiB,CAAC,EAAE,WAAW,UAAU,GAAG,MAAM,MAA2B;AACxF,QAAM,EAAE,QAAQ,IAAI,IAAI,cAAc;AACtC,QAAM,EAAE,EAAE,IAAI,UAAU;AAExB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH,oBACC,qBAAC,SAAI,WAAU,iBAAgB,MAAK,UAAS,aAAU,UACrD;AAAA,4BAAC,UAAK,WAAU,WAAW,YAAE,SAAS,GAAE;AAAA,QACxC,oBAAC,YAAS,WAAU,aAAY;AAAA,QAChC,oBAAC,YAAS,WAAU,cAAa;AAAA,QACjC,oBAAC,YAAS,WAAU,cAAa;AAAA,QACjC,oBAAC,YAAS,WAAU,aAAY;AAAA,SAClC,IAEA;AAAA;AAAA,EAEJ;AAEJ;AAIO,IAAM,cAAc,CAAC,EAAE,WAAW,GAAG,MAAM,MAChD,oBAAC,QAAK,WAAW,GAAG,gBAAgB,SAAS,GAAI,GAAG,OAAO;AAKtD,IAAM,iBAAiB,CAAC,EAAE,WAAW,GAAG,MAAM,MACnD;AAAA,EAAC;AAAA;AAAA,IACC,WAAW,GAAG,4DAA4D,SAAS;AAAA,IAClF,GAAG;AAAA;AACN;AAKK,IAAM,kBAAkB,CAAC,EAAE,WAAW,GAAG,MAAM,MACpD;AAAA,EAAC;AAAA;AAAA,IACC,WAAW,GAAG,mDAAmD,SAAS;AAAA,IACzE,GAAG;AAAA;AACN;AAKK,IAAM,qBAAqB,CAAC,EAAE,WAAW,GAAG,MAAM,MACvD;AAAA,EAAC;AAAA;AAAA,IACC,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN;AAKK,IAAM,oBAAoB,CAAC,EAAE,WAAW,GAAG,MAAM,MACtD,oBAAC,eAAY,WAAW,GAAG,kBAAkB,SAAS,GAAI,GAAG,OAAO;","names":[]}
@@ -0,0 +1,166 @@
1
+ "use client";
2
+ import {
3
+ Shimmer
4
+ } from "./chunk-3YPT3V7L.js";
5
+
6
+ // src/plan.tsx
7
+ import { Button } from "@elabs-ai/components-ui";
8
+ import {
9
+ Card,
10
+ CardAction,
11
+ CardContent,
12
+ CardDescription,
13
+ CardFooter,
14
+ CardHeader,
15
+ CardTitle
16
+ } from "@elabs-ai/components-ui";
17
+ import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@elabs-ai/components-ui";
18
+ import { StatusBadge } from "@elabs-ai/components-ui";
19
+ import { useLocale } from "@elabs-ai/components-ui";
20
+ import { cn } from "@elabs-ai/components-ui/lib/cn";
21
+ import { CheckCircle2, ChevronsUpDownIcon, Clock, PencilLine } from "lucide-react";
22
+ import { createContext, useContext, useId, useMemo } from "react";
23
+ import { jsx, jsxs } from "react/jsx-runtime";
24
+ var PlanContext = createContext(null);
25
+ var usePlan = () => {
26
+ const context = useContext(PlanContext);
27
+ if (!context) {
28
+ throw new Error("Plan components must be used within Plan");
29
+ }
30
+ return context;
31
+ };
32
+ var Plan = ({
33
+ className,
34
+ isStreaming = false,
35
+ status,
36
+ role,
37
+ children,
38
+ ...props
39
+ }) => {
40
+ const titleId = useId();
41
+ const hasStatus = status !== void 0;
42
+ const resolvedIsStreaming = hasStatus ? status === "streaming" : isStreaming;
43
+ const isPending = status === "awaiting";
44
+ const isSettled = status === "approved" || status === "changes-requested";
45
+ const resolvedRole = hasStatus ? isPending ? "group" : isSettled ? "alert" : void 0 : void 0;
46
+ const railClass = !hasStatus ? void 0 : status === "approved" ? "border-s-4 border-s-success" : status === "changes-requested" ? "border-s-4 border-s-warning" : isPending ? "border-s-4 border-s-border-strong" : void 0;
47
+ const contextValue = useMemo(
48
+ () => ({
49
+ isStreaming: resolvedIsStreaming,
50
+ status: hasStatus ? status : void 0,
51
+ titleId: hasStatus ? titleId : void 0
52
+ }),
53
+ [resolvedIsStreaming, hasStatus, status, titleId]
54
+ );
55
+ return /* @__PURE__ */ jsx(PlanContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx(Collapsible, { asChild: true, "data-slot": "plan", ...props, children: /* @__PURE__ */ jsx(
56
+ Card,
57
+ {
58
+ role: role ?? resolvedRole,
59
+ "aria-labelledby": isPending ? titleId : void 0,
60
+ className: cn("shadow-none", railClass, className),
61
+ children
62
+ }
63
+ ) }) });
64
+ };
65
+ var PlanHeader = ({ className, ...props }) => /* @__PURE__ */ jsx(
66
+ CardHeader,
67
+ {
68
+ className: cn("flex items-start justify-between", className),
69
+ "data-slot": "plan-header",
70
+ ...props
71
+ }
72
+ );
73
+ var PlanTitle = ({ id, children, ...props }) => {
74
+ const { isStreaming, titleId } = usePlan();
75
+ return /* @__PURE__ */ jsx(CardTitle, { id: id ?? titleId, "data-slot": "plan-title", ...props, children: isStreaming ? /* @__PURE__ */ jsx(Shimmer, { children }) : children });
76
+ };
77
+ var PlanDescription = ({ className, children, ...props }) => {
78
+ const { isStreaming } = usePlan();
79
+ return /* @__PURE__ */ jsx(
80
+ CardDescription,
81
+ {
82
+ className: cn("text-balance", className),
83
+ "data-slot": "plan-description",
84
+ ...props,
85
+ children: isStreaming ? /* @__PURE__ */ jsx(Shimmer, { children }) : children
86
+ }
87
+ );
88
+ };
89
+ var PlanAction = (props) => /* @__PURE__ */ jsx(CardAction, { "data-slot": "plan-action", ...props });
90
+ var PlanContent = ({ className, ...props }) => /* @__PURE__ */ jsx(CollapsibleContent, { asChild: true, children: /* @__PURE__ */ jsx(
91
+ CardContent,
92
+ {
93
+ className: cn(
94
+ "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=open]:slide-in-from-top-2 data-[state=closed]:slide-out-to-top-2 data-[state=closed]:fade-out-0 data-[state=open]:[--tw-ease:var(--ease-entrance)] data-[state=closed]:[--tw-ease:var(--ease-exit)] outline-none",
95
+ className
96
+ ),
97
+ "data-slot": "plan-content",
98
+ ...props
99
+ }
100
+ ) });
101
+ var PlanFooter = (props) => /* @__PURE__ */ jsx(CardFooter, { "data-slot": "plan-footer", ...props });
102
+ var PlanTrigger = ({ className, ...props }) => {
103
+ const { t } = useLocale();
104
+ return /* @__PURE__ */ jsx(CollapsibleTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
105
+ Button,
106
+ {
107
+ className: cn("size-8", className),
108
+ "data-slot": "plan-trigger",
109
+ size: "icon",
110
+ variant: "ghost",
111
+ ...props,
112
+ children: [
113
+ /* @__PURE__ */ jsx(ChevronsUpDownIcon, { className: "size-4" }),
114
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: t("ai.plan.togglePlan") })
115
+ ]
116
+ }
117
+ ) });
118
+ };
119
+ var PLAN_STATUS_CONTENT = {
120
+ awaiting: { label: "Waiting on plan approval", tone: "warning", icon: Clock },
121
+ approved: { label: "Approved", tone: "success", icon: CheckCircle2 },
122
+ "changes-requested": { label: "Changes requested", tone: "warning", icon: PencilLine }
123
+ };
124
+ var PlanStatusLine = ({ className, children, ...props }) => {
125
+ const { status } = usePlan();
126
+ if (!status || status === "streaming") {
127
+ return null;
128
+ }
129
+ const { label, tone, icon } = PLAN_STATUS_CONTENT[status];
130
+ return /* @__PURE__ */ jsx(
131
+ StatusBadge,
132
+ {
133
+ "data-slot": "plan-status-line",
134
+ className: cn("self-start", className),
135
+ status: { label, tone, icon },
136
+ ...props,
137
+ children
138
+ }
139
+ );
140
+ };
141
+ var PlanDecisionAction = ({ className, ...props }) => {
142
+ const { status } = usePlan();
143
+ if (status !== "awaiting") {
144
+ return null;
145
+ }
146
+ return /* @__PURE__ */ jsx(Button, { className: cn("h-8 px-3 text-body", className), type: "button", ...props });
147
+ };
148
+ var PlanApprove = (props) => /* @__PURE__ */ jsx(PlanDecisionAction, { "data-slot": "plan-approve", variant: "default", ...props });
149
+ var PlanRequestChanges = (props) => /* @__PURE__ */ jsx(PlanDecisionAction, { "data-slot": "plan-request-changes", variant: "outline", ...props });
150
+ var PlanComment = (props) => /* @__PURE__ */ jsx(PlanDecisionAction, { "data-slot": "plan-comment", variant: "ghost", ...props });
151
+
152
+ export {
153
+ Plan,
154
+ PlanHeader,
155
+ PlanTitle,
156
+ PlanDescription,
157
+ PlanAction,
158
+ PlanContent,
159
+ PlanFooter,
160
+ PlanTrigger,
161
+ PlanStatusLine,
162
+ PlanApprove,
163
+ PlanRequestChanges,
164
+ PlanComment
165
+ };
166
+ //# sourceMappingURL=chunk-FUIYG2DS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/plan.tsx"],"sourcesContent":["\"use client\";\n\nimport { Button } from \"@elabs-ai/components-ui\";\nimport {\n Card,\n CardAction,\n CardContent,\n CardDescription,\n CardFooter,\n CardHeader,\n CardTitle,\n} from \"@elabs-ai/components-ui\";\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"@elabs-ai/components-ui\";\nimport { StatusBadge, type StatusTone } from \"@elabs-ai/components-ui\";\nimport { useLocale } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { CheckCircle2, ChevronsUpDownIcon, Clock, PencilLine, type LucideIcon } from \"lucide-react\";\nimport type { ComponentProps, ReactNode } from \"react\";\nimport { createContext, useContext, useId, useMemo } from \"react\";\n\nimport { Shimmer } from \"./shimmer\";\n\n/**\n * The plan's decision status (#108). Additive: a `Plan` rendered with no\n * `status` behaves exactly as before (no ARIA region, no rail, no status\n * line) — every prop below this point is opt-in.\n */\nexport type PlanStatus = \"streaming\" | \"awaiting\" | \"approved\" | \"changes-requested\";\n\ninterface PlanContextValue {\n isStreaming: boolean;\n /** `undefined` when the plan is rendered via the legacy `isStreaming`-only API. */\n status?: PlanStatus;\n /** Wired to `PlanTitle` so the awaiting region can be labelled by it. */\n titleId?: string;\n}\n\nconst PlanContext = createContext<PlanContextValue | null>(null);\n\nconst usePlan = () => {\n const context = useContext(PlanContext);\n if (!context) {\n throw new Error(\"Plan components must be used within Plan\");\n }\n return context;\n};\n\nexport type PlanProps = ComponentProps<typeof Collapsible> & {\n isStreaming?: boolean;\n /**\n * The plan's decision status. Omit it to keep today's display-only\n * behaviour. When both `status` and `isStreaming` are given, `status`\n * wins (a `status=\"approved\"` plan never shimmers, even if `isStreaming`\n * is still `true`).\n */\n status?: PlanStatus;\n};\n\nexport const Plan = ({\n className,\n isStreaming = false,\n status,\n role,\n children,\n ...props\n}: PlanProps) => {\n const titleId = useId();\n const hasStatus = status !== undefined;\n const resolvedIsStreaming = hasStatus ? status === \"streaming\" : isStreaming;\n\n // A pending decision containing focusable controls is a labelled region,\n // NOT an assertive live region; a settled outcome is `role=\"alert\"` — the\n // same convention `Confirmation` already proves (packages/ai/src/confirmation.tsx:100-101).\n const isPending = status === \"awaiting\";\n const isSettled = status === \"approved\" || status === \"changes-requested\";\n const resolvedRole = hasStatus\n ? isPending\n ? \"group\"\n : isSettled\n ? \"alert\"\n : undefined\n : undefined;\n\n // Quiet structural rail per outcome — the outcome itself is always ALSO\n // carried in text + glyph via `PlanStatusLine` (WCAG 1.4.1), the rail is a\n // redundant, hue-independent cue on top of it.\n const railClass = !hasStatus\n ? undefined\n : status === \"approved\"\n ? \"border-s-4 border-s-success\"\n : status === \"changes-requested\"\n ? \"border-s-4 border-s-warning\"\n : isPending\n ? \"border-s-4 border-s-border-strong\"\n : undefined;\n\n const contextValue = useMemo<PlanContextValue>(\n () => ({\n isStreaming: resolvedIsStreaming,\n status: hasStatus ? status : undefined,\n titleId: hasStatus ? titleId : undefined,\n }),\n [resolvedIsStreaming, hasStatus, status, titleId],\n );\n\n return (\n <PlanContext.Provider value={contextValue}>\n <Collapsible asChild data-slot=\"plan\" {...props}>\n <Card\n role={role ?? resolvedRole}\n aria-labelledby={isPending ? titleId : undefined}\n className={cn(\"shadow-none\", railClass, className)}\n >\n {children}\n </Card>\n </Collapsible>\n </PlanContext.Provider>\n );\n};\n\nexport type PlanHeaderProps = ComponentProps<typeof CardHeader>;\n\nexport const PlanHeader = ({ className, ...props }: PlanHeaderProps) => (\n <CardHeader\n className={cn(\"flex items-start justify-between\", className)}\n data-slot=\"plan-header\"\n {...props}\n />\n);\n\nexport type PlanTitleProps = Omit<ComponentProps<typeof CardTitle>, \"children\"> & {\n children: string;\n};\n\nexport const PlanTitle = ({ id, children, ...props }: PlanTitleProps) => {\n const { isStreaming, titleId } = usePlan();\n\n return (\n <CardTitle id={id ?? titleId} data-slot=\"plan-title\" {...props}>\n {isStreaming ? <Shimmer>{children}</Shimmer> : children}\n </CardTitle>\n );\n};\n\nexport type PlanDescriptionProps = Omit<ComponentProps<typeof CardDescription>, \"children\"> & {\n children: string;\n};\n\nexport const PlanDescription = ({ className, children, ...props }: PlanDescriptionProps) => {\n const { isStreaming } = usePlan();\n\n return (\n <CardDescription\n className={cn(\"text-balance\", className)}\n data-slot=\"plan-description\"\n {...props}\n >\n {isStreaming ? <Shimmer>{children}</Shimmer> : children}\n </CardDescription>\n );\n};\n\nexport type PlanActionProps = ComponentProps<typeof CardAction>;\n\n/** The header's layout slot (e.g. a menu trigger) — unrelated to the decision actions below. */\nexport const PlanAction = (props: PlanActionProps) => (\n <CardAction data-slot=\"plan-action\" {...props} />\n);\n\nexport type PlanContentProps = ComponentProps<typeof CardContent>;\n\nexport const PlanContent = ({ className, ...props }: PlanContentProps) => (\n <CollapsibleContent asChild>\n <CardContent\n className={cn(\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=open]:slide-in-from-top-2 data-[state=closed]:slide-out-to-top-2 data-[state=closed]:fade-out-0 data-[state=open]:[--tw-ease:var(--ease-entrance)] data-[state=closed]:[--tw-ease:var(--ease-exit)] outline-none\",\n className,\n )}\n data-slot=\"plan-content\"\n {...props}\n />\n </CollapsibleContent>\n);\n\nexport type PlanFooterProps = ComponentProps<\"div\">;\n\nexport const PlanFooter = (props: PlanFooterProps) => (\n <CardFooter data-slot=\"plan-footer\" {...props} />\n);\n\nexport type PlanTriggerProps = ComponentProps<typeof CollapsibleTrigger>;\n\nexport const PlanTrigger = ({ className, ...props }: PlanTriggerProps) => {\n const { t } = useLocale();\n return (\n <CollapsibleTrigger asChild>\n <Button\n className={cn(\"size-8\", className)}\n data-slot=\"plan-trigger\"\n size=\"icon\"\n variant=\"ghost\"\n {...props}\n >\n <ChevronsUpDownIcon className=\"size-4\" />\n <span className=\"sr-only\">{t(\"ai.plan.togglePlan\")}</span>\n </Button>\n </CollapsibleTrigger>\n );\n};\n\ntype PlanOutcomeStatus = Exclude<PlanStatus, \"streaming\">;\n\n/**\n * Default label/tone/glyph per non-streaming status (#108). Every entry is a\n * CALM tone (the `StatusBadge` out-of-vocabulary escape hatch, #363) — the\n * decision is carried in text + glyph, never by rail colour alone (WCAG 1.4.1).\n */\nconst PLAN_STATUS_CONTENT: Record<\n PlanOutcomeStatus,\n { label: string; tone: StatusTone; icon: LucideIcon }\n> = {\n awaiting: { label: \"Waiting on plan approval\", tone: \"warning\", icon: Clock },\n approved: { label: \"Approved\", tone: \"success\", icon: CheckCircle2 },\n \"changes-requested\": { label: \"Changes requested\", tone: \"warning\", icon: PencilLine },\n};\n\nexport type PlanStatusLineProps = Omit<ComponentProps<typeof StatusBadge>, \"status\"> & {\n children?: ReactNode;\n};\n\n/**\n * The decision status line (#108) — text + glyph, never rail colour alone.\n * Renders nothing while `status` is unset or `\"streaming\"` (nothing has been\n * decided yet); shows the outcome once the plan is awaiting a decision or\n * settled.\n */\nexport const PlanStatusLine = ({ className, children, ...props }: PlanStatusLineProps) => {\n const { status } = usePlan();\n\n if (!status || status === \"streaming\") {\n return null;\n }\n\n const { label, tone, icon } = PLAN_STATUS_CONTENT[status];\n\n return (\n <StatusBadge\n data-slot=\"plan-status-line\"\n className={cn(\"self-start\", className)}\n status={{ label, tone, icon }}\n {...props}\n >\n {children}\n </StatusBadge>\n );\n};\n\nexport type PlanDecisionActionProps = ComponentProps<typeof Button>;\n\n/**\n * Shared decision-button primitive. Renders only while `status === \"awaiting\"`\n * — mirrors the gating `ConfirmationActions` uses (packages/ai/src/confirmation.tsx)\n * — so a settled or still-streaming plan never shows stale controls.\n */\nconst PlanDecisionAction = ({ className, ...props }: PlanDecisionActionProps) => {\n const { status } = usePlan();\n\n if (status !== \"awaiting\") {\n return null;\n }\n\n return <Button className={cn(\"h-8 px-3 text-body\", className)} type=\"button\" {...props} />;\n};\n\nexport type PlanApproveProps = PlanDecisionActionProps;\n\n/**\n * The proceed action — presets the filled primary variant so the primary path\n * can't drift to a quieter variant (same reasoning as `ConfirmationApprove`).\n */\nexport const PlanApprove = (props: PlanApproveProps) => (\n <PlanDecisionAction data-slot=\"plan-approve\" variant=\"default\" {...props} />\n);\n\nexport type PlanRequestChangesProps = PlanDecisionActionProps;\n\n/** Sends the plan back for revision — a quieter, non-primary action. */\nexport const PlanRequestChanges = (props: PlanRequestChangesProps) => (\n <PlanDecisionAction data-slot=\"plan-request-changes\" variant=\"outline\" {...props} />\n);\n\nexport type PlanCommentProps = PlanDecisionActionProps;\n\n/** Leaves feedback without settling the decision — the quietest action. */\nexport const PlanComment = (props: PlanCommentProps) => (\n <PlanDecisionAction data-slot=\"plan-comment\" variant=\"ghost\" {...props} />\n);\n"],"mappings":"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","names":[]}
@@ -0,0 +1,236 @@
1
+ "use client";
2
+ import {
3
+ parseSurfaceJson
4
+ } from "./chunk-SKVG672B.js";
5
+ import {
6
+ invalidNodePaths,
7
+ isA2uiElement,
8
+ validateA2uiSurface
9
+ } from "./chunk-7FD5CZEU.js";
10
+ import {
11
+ catalogSchema,
12
+ uiCatalog
13
+ } from "./chunk-L4SU3QJV.js";
14
+
15
+ // src/a2ui/a2ui-surface.tsx
16
+ import { Skeleton, useLocale } from "@elabs-ai/components-ui";
17
+ import { cn } from "@elabs-ai/components-ui/lib/cn";
18
+ import { AlertCircle } from "lucide-react";
19
+ import { createElement, forwardRef, memo, useEffect, useMemo, useRef, useState } from "react";
20
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
21
+ var GAP = {
22
+ none: "gap-0",
23
+ xs: "gap-1",
24
+ sm: "gap-2",
25
+ md: "gap-4",
26
+ lg: "gap-6"
27
+ };
28
+ var ALIGN = {
29
+ start: "items-start",
30
+ center: "items-center",
31
+ end: "items-end",
32
+ stretch: "items-stretch"
33
+ };
34
+ var JUSTIFY = {
35
+ start: "justify-start",
36
+ center: "justify-center",
37
+ end: "justify-end",
38
+ between: "justify-between"
39
+ };
40
+ var COLUMNS = {
41
+ 1: "grid-cols-1",
42
+ 2: "grid-cols-1 sm:grid-cols-2",
43
+ 3: "grid-cols-1 sm:grid-cols-2 lg:grid-cols-3",
44
+ 4: "grid-cols-1 sm:grid-cols-2 lg:grid-cols-4"
45
+ };
46
+ function builtinClass(type, props) {
47
+ const gap = GAP[String(props.gap ?? "md")] ?? GAP.md;
48
+ if (type === "Grid") {
49
+ return cn("grid", COLUMNS[Number(props.columns ?? 2)] ?? COLUMNS[2], gap);
50
+ }
51
+ return cn(
52
+ "flex min-w-0",
53
+ props.direction === "row" ? "flex-row" : "flex-col",
54
+ props.wrap ? "flex-wrap" : "",
55
+ ALIGN[String(props.align ?? "stretch")],
56
+ JUSTIFY[String(props.justify ?? "start")],
57
+ gap
58
+ );
59
+ }
60
+ var isEvent = (v) => typeof v === "object" && v !== null && "nativeEvent" in v && "target" in v;
61
+ function eventValue(args) {
62
+ const first = args[0];
63
+ if (isEvent(first)) {
64
+ const target = first.target;
65
+ if (target && typeof target.type === "string" && target.type === "checkbox")
66
+ return target.checked;
67
+ return target && "value" in target ? target.value : void 0;
68
+ }
69
+ return first;
70
+ }
71
+ function renderPropValue(value, path, ctx) {
72
+ if (Array.isArray(value) && value.some(isA2uiElement)) {
73
+ return value.map((item, i) => renderNode(item, `${path}[${i}]`, ctx));
74
+ }
75
+ if (isA2uiElement(value)) return renderNode(value, path, ctx);
76
+ return value;
77
+ }
78
+ function renderNode(node, path, ctx) {
79
+ if (typeof node === "string" || typeof node === "number") return node;
80
+ if (ctx.invalid.has(path)) return null;
81
+ const entry = ctx.catalog[node.type];
82
+ if (!entry) return null;
83
+ const props = {};
84
+ for (const [name, value] of Object.entries(node.props ?? {})) {
85
+ const schema = entry.schema.props[name];
86
+ props[name] = schema?.type === "node" ? renderPropValue(value, `${path}.props.${name}`, ctx) : value;
87
+ }
88
+ for (const [event, action] of Object.entries(node.on ?? {})) {
89
+ const handlerName = entry.schema.events[event];
90
+ if (!handlerName) continue;
91
+ props[handlerName] = (...args) => {
92
+ const value = event === "click" ? void 0 : eventValue(args);
93
+ ctx.onAction?.(action, { event, value, node, path });
94
+ };
95
+ }
96
+ const children = entry.schema.children ? (node.children ?? []).map((child, i) => renderNode(child, `${path}.children[${i}]`, ctx)) : void 0;
97
+ const key = path;
98
+ const dataAttrs = {
99
+ "data-a2ui-type": node.type,
100
+ ...node.id ? { "data-a2ui-id": node.id } : {}
101
+ };
102
+ if (entry.schema.builtin) {
103
+ return createElement(
104
+ "div",
105
+ { key, className: builtinClass(node.type, props), ...dataAttrs },
106
+ ...children ?? []
107
+ );
108
+ }
109
+ return createElement(
110
+ entry.component,
111
+ { key, ...props, ...dataAttrs },
112
+ ...children ?? []
113
+ );
114
+ }
115
+ var SurfaceTree = memo(function SurfaceTree2({
116
+ spec,
117
+ catalog,
118
+ invalid,
119
+ onAction
120
+ }) {
121
+ return /* @__PURE__ */ jsx(Fragment, { children: renderNode(spec.root, "root", { catalog, invalid, onAction }) });
122
+ });
123
+ var A2uiSurface = forwardRef(function A2uiSurface2({
124
+ surface,
125
+ catalog = uiCatalog,
126
+ onAction,
127
+ isStreaming = false,
128
+ loading = false,
129
+ onError,
130
+ skeleton,
131
+ className,
132
+ ...props
133
+ }, ref) {
134
+ const { t } = useLocale();
135
+ const schema = useMemo(() => catalogSchema(catalog), [catalog]);
136
+ const parsed = useMemo(() => {
137
+ if (loading || surface == null) return { value: null, incomplete: false };
138
+ if (typeof surface !== "string") return { value: surface, incomplete: false };
139
+ const complete = parseSurfaceJson(surface, false);
140
+ if (complete !== null) return { value: complete, incomplete: false };
141
+ const partial = parseSurfaceJson(surface, true);
142
+ return { value: partial, incomplete: surface.trim() !== "" };
143
+ }, [surface, loading]);
144
+ const validation = useMemo(
145
+ () => parsed.value === null ? null : validateA2uiSurface(parsed.value, schema),
146
+ [parsed.value, schema]
147
+ );
148
+ const pending = loading || isStreaming || parsed.incomplete;
149
+ const empty = surface == null || typeof surface === "string" && surface.trim() === "";
150
+ const invalid = useMemo(
151
+ () => validation && !validation.ok && pending ? invalidNodePaths(validation.errors) : /* @__PURE__ */ new Set(),
152
+ [validation, pending]
153
+ );
154
+ const drawable = validation?.spec && (validation.ok || pending && !invalid.has("root")) ? validation.spec : null;
155
+ const lastGoodRef = useRef(null);
156
+ if (drawable) lastGoodRef.current = drawable;
157
+ const shown = drawable ?? (pending ? lastGoodRef.current : null);
158
+ const [hasRendered, setHasRendered] = useState(false);
159
+ useEffect(() => {
160
+ if (shown && !hasRendered) setHasRendered(true);
161
+ }, [shown, hasRendered]);
162
+ const status = loading ? "pending" : empty ? hasRendered ? "ready" : "idle" : pending ? "pending" : validation && !validation.ok ? "error" : "ready";
163
+ const reportedRef = useRef(null);
164
+ useEffect(() => {
165
+ if (status !== "error" || !validation || validation.ok) return;
166
+ const key = JSON.stringify(validation.errors);
167
+ if (reportedRef.current === key) return;
168
+ reportedRef.current = key;
169
+ onError?.(validation.errors);
170
+ }, [status, validation, onError]);
171
+ const showSkeleton = status === "pending" && !shown;
172
+ const title = shown?.title;
173
+ return /* @__PURE__ */ jsxs(
174
+ "div",
175
+ {
176
+ ref,
177
+ "data-slot": "a2ui-surface",
178
+ "data-status": status,
179
+ className: cn("relative min-w-0", className),
180
+ ...title ? { role: "group", "aria-label": title } : {},
181
+ ...props,
182
+ children: [
183
+ showSkeleton ? /* @__PURE__ */ jsxs(
184
+ "div",
185
+ {
186
+ "data-slot": "a2ui-surface-skeleton",
187
+ role: "status",
188
+ "aria-live": "polite",
189
+ className: "space-y-2",
190
+ children: [
191
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: t("ai.a2ui.loading") }),
192
+ skeleton ?? /* @__PURE__ */ jsxs(Fragment, { children: [
193
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-6 w-1/3" }),
194
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-3 gap-2", children: [
195
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-16" }),
196
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-16" }),
197
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-16" })
198
+ ] }),
199
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-24 w-full" })
200
+ ] })
201
+ ]
202
+ }
203
+ ) : null,
204
+ shown ? /* @__PURE__ */ jsx(SurfaceTree, { spec: shown, catalog, invalid, onAction }) : null,
205
+ status === "error" && validation && !validation.ok ? /* @__PURE__ */ jsxs(
206
+ "div",
207
+ {
208
+ "data-slot": "a2ui-surface-error",
209
+ role: "alert",
210
+ className: "flex gap-2 rounded-md bg-destructive/10 p-3 text-body text-destructive-text",
211
+ children: [
212
+ /* @__PURE__ */ jsx(AlertCircle, { className: "mt-0.5 size-4 shrink-0", "aria-hidden": "true" }),
213
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 space-y-1", children: [
214
+ /* @__PURE__ */ jsx("p", { className: "font-medium", children: t("ai.a2ui.invalid") }),
215
+ /* @__PURE__ */ jsxs("ul", { className: "space-y-0.5 text-caption", children: [
216
+ validation.errors.slice(0, 8).map((e) => /* @__PURE__ */ jsxs("li", { className: "break-words", children: [
217
+ /* @__PURE__ */ jsx("code", { className: "text-code", children: e.path || "root" }),
218
+ " \u2014 ",
219
+ e.message
220
+ ] }, `${e.path}:${e.code}`)),
221
+ validation.errors.length > 8 ? /* @__PURE__ */ jsx("li", { children: t("ai.a2ui.moreErrors", { count: validation.errors.length - 8 }) }) : null
222
+ ] })
223
+ ] })
224
+ ]
225
+ }
226
+ ) : null
227
+ ]
228
+ }
229
+ );
230
+ });
231
+ A2uiSurface.displayName = "A2uiSurface";
232
+
233
+ export {
234
+ A2uiSurface
235
+ };
236
+ //# sourceMappingURL=chunk-GA7M34KU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/a2ui/a2ui-surface.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * A2uiSurface — render an agent-DESIGNED screen from data (D2's safe generative\n * path). The agent emits an `A2uiSurfaceSpec` (JSON: a tree of catalog nodes);\n * this component validates it against the catalog and draws it with the real\n * components — never `eval`, never arbitrary tags, never agent styling.\n *\n * Readiness follows the house model (loading-states): `loading` → skeleton;\n * `isStreaming` (or a string surface that is still incomplete JSON) → build up,\n * pruning only the nodes that do not validate YET and suppressing errors; a\n * settled surface that fails validation → `role=\"alert\"` with every problem and\n * `onError`. Interaction is data too: a node's `on.<event>` names a host action\n * that arrives at `onAction` — the app decides what \"approve\" means (D5).\n */\nimport { Skeleton, useLocale } from \"@elabs-ai/components-ui\";\nimport { cn } from \"@elabs-ai/components-ui/lib/cn\";\nimport { AlertCircle } from \"lucide-react\";\nimport type { ComponentProps, ReactNode, SyntheticEvent } from \"react\";\nimport { createElement, forwardRef, memo, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport { completeJson, parseSurfaceJson } from \"./core/complete-json\";\nimport type {\n A2uiAction,\n A2uiElement,\n A2uiError,\n A2uiNode,\n A2uiPropValue,\n A2uiSurfaceSpec,\n} from \"./core/spec\";\nimport { invalidNodePaths, isA2uiElement, validateA2uiSurface } from \"./core/validate\";\nimport { catalogSchema, uiCatalog, type A2uiCatalog } from \"./ui-catalog\";\n\nexport type A2uiSurfaceStatus = \"idle\" | \"pending\" | \"ready\" | \"error\";\n\n/** What `onAction` receives besides the action the agent named. */\nexport interface A2uiActionContext {\n /** The catalog event that fired (`click`, `change`, …). */\n event: string;\n /** The control's value for `change` events (text, checked, selected value…). */\n value?: unknown;\n /** The node that carried the binding, and its path in the spec. */\n node: A2uiElement;\n path: string;\n}\n\nexport type A2uiActionHandler = (action: A2uiAction, context: A2uiActionContext) => void;\n\nexport type A2uiSurfaceProps = Omit<ComponentProps<\"div\">, \"children\" | \"onError\"> & {\n /** The agent's surface: a parsed spec, or its JSON text (may be a streaming prefix). */\n surface: A2uiSurfaceSpec | string | null | undefined;\n /** Which types render, and how. Defaults to the shipped `uiCatalog`. */\n catalog?: A2uiCatalog;\n /** Receives every `on.<event>` binding the user triggers. */\n onAction?: A2uiActionHandler;\n /** Content is arriving incrementally — build up, suppress transient errors. */\n isStreaming?: boolean;\n /** No surface yet (fetch-then-show) — forces the skeleton. */\n loading?: boolean;\n /** Fires once per settled, invalid surface with the validation errors. */\n onError?: (errors: A2uiError[]) => void;\n /** Replace the default skeleton (shown before the first paint while pending). */\n skeleton?: ReactNode;\n};\n\n// ---------------------------------------------------------------------------\n// Builtins — the two layout nodes the surface draws itself, on tokens only.\n// ---------------------------------------------------------------------------\nconst GAP: Record<string, string> = {\n none: \"gap-0\",\n xs: \"gap-1\",\n sm: \"gap-2\",\n md: \"gap-4\",\n lg: \"gap-6\",\n};\nconst ALIGN: Record<string, string> = {\n start: \"items-start\",\n center: \"items-center\",\n end: \"items-end\",\n stretch: \"items-stretch\",\n};\nconst JUSTIFY: Record<string, string> = {\n start: \"justify-start\",\n center: \"justify-center\",\n end: \"justify-end\",\n between: \"justify-between\",\n};\nconst COLUMNS: Record<number, string> = {\n 1: \"grid-cols-1\",\n 2: \"grid-cols-1 sm:grid-cols-2\",\n 3: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-3\",\n 4: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-4\",\n};\n\nfunction builtinClass(type: string, props: Record<string, unknown>): string {\n const gap = GAP[String(props.gap ?? \"md\")] ?? GAP.md;\n if (type === \"Grid\") {\n return cn(\"grid\", COLUMNS[Number(props.columns ?? 2)] ?? COLUMNS[2], gap);\n }\n return cn(\n \"flex min-w-0\",\n props.direction === \"row\" ? \"flex-row\" : \"flex-col\",\n props.wrap ? \"flex-wrap\" : \"\",\n ALIGN[String(props.align ?? \"stretch\")],\n JUSTIFY[String(props.justify ?? \"start\")],\n gap,\n );\n}\n\n// ---------------------------------------------------------------------------\n// Tree rendering\n// ---------------------------------------------------------------------------\ninterface RenderCtx {\n catalog: A2uiCatalog;\n invalid: Set<string>;\n onAction?: A2uiActionHandler;\n}\n\nconst isEvent = (v: unknown): v is SyntheticEvent =>\n typeof v === \"object\" && v !== null && \"nativeEvent\" in v && \"target\" in v;\n\n/** The value a `change`-style handler carries: the control's value, or the handler's first arg. */\nfunction eventValue(args: unknown[]): unknown {\n const first = args[0];\n if (isEvent(first)) {\n const target = first.target as HTMLInputElement | null;\n if (target && typeof target.type === \"string\" && target.type === \"checkbox\")\n return target.checked;\n return target && \"value\" in target ? target.value : undefined;\n }\n return first;\n}\n\nfunction renderPropValue(value: A2uiPropValue, path: string, ctx: RenderCtx): unknown {\n if (Array.isArray(value) && value.some(isA2uiElement)) {\n return value.map((item, i) => renderNode(item as A2uiNode, `${path}[${i}]`, ctx));\n }\n if (isA2uiElement(value)) return renderNode(value, path, ctx);\n return value;\n}\n\nfunction renderNode(node: A2uiNode, path: string, ctx: RenderCtx): ReactNode {\n if (typeof node === \"string\" || typeof node === \"number\") return node;\n if (ctx.invalid.has(path)) return null;\n const entry = ctx.catalog[node.type];\n if (!entry) return null;\n const props: Record<string, unknown> = {};\n for (const [name, value] of Object.entries(node.props ?? {})) {\n const schema = entry.schema.props[name];\n props[name] =\n schema?.type === \"node\" ? renderPropValue(value, `${path}.props.${name}`, ctx) : value;\n }\n for (const [event, action] of Object.entries(node.on ?? {})) {\n const handlerName = entry.schema.events[event];\n if (!handlerName) continue;\n props[handlerName] = (...args: unknown[]) => {\n // A control's value travels only with `change`-style events; a click\n // carries no value (a button's `target.value` is an empty string).\n const value = event === \"click\" ? undefined : eventValue(args);\n ctx.onAction?.(action, { event, value, node, path });\n };\n }\n const children = entry.schema.children\n ? (node.children ?? []).map((child, i) => renderNode(child, `${path}.children[${i}]`, ctx))\n : undefined;\n const key = path;\n const dataAttrs = {\n \"data-a2ui-type\": node.type,\n ...(node.id ? { \"data-a2ui-id\": node.id } : {}),\n };\n if (entry.schema.builtin) {\n return createElement(\n \"div\",\n { key, className: builtinClass(node.type, props), ...dataAttrs },\n ...(children ?? []),\n );\n }\n return createElement(\n entry.component as never,\n { key, ...props, ...dataAttrs },\n ...(children ?? []),\n );\n}\n\n/** A memoised subtree so a streaming parent re-render does not redraw settled siblings. */\nconst SurfaceTree = memo(function SurfaceTree({\n spec,\n catalog,\n invalid,\n onAction,\n}: {\n spec: A2uiSurfaceSpec;\n catalog: A2uiCatalog;\n invalid: Set<string>;\n onAction?: A2uiActionHandler;\n}) {\n return <>{renderNode(spec.root, \"root\", { catalog, invalid, onAction })}</>;\n});\n\n// ---------------------------------------------------------------------------\n// The surface\n// ---------------------------------------------------------------------------\nexport const A2uiSurface = forwardRef<HTMLDivElement, A2uiSurfaceProps>(function A2uiSurface(\n {\n surface,\n catalog = uiCatalog,\n onAction,\n isStreaming = false,\n loading = false,\n onError,\n skeleton,\n className,\n ...props\n },\n ref,\n) {\n const { t } = useLocale();\n const schema = useMemo(() => catalogSchema(catalog), [catalog]);\n\n // Parse (completing a streaming prefix), then validate. A string that is not\n // yet valid JSON even after completion is \"incomplete\", not invalid.\n const parsed = useMemo(() => {\n if (loading || surface == null) return { value: null, incomplete: false };\n if (typeof surface !== \"string\") return { value: surface, incomplete: false };\n const complete = parseSurfaceJson(surface, false);\n if (complete !== null) return { value: complete, incomplete: false };\n const partial = parseSurfaceJson(surface, true);\n return { value: partial, incomplete: surface.trim() !== \"\" };\n }, [surface, loading]);\n\n const validation = useMemo(\n () => (parsed.value === null ? null : validateA2uiSurface(parsed.value, schema)),\n [parsed.value, schema],\n );\n\n const pending = loading || isStreaming || parsed.incomplete;\n const empty = surface == null || (typeof surface === \"string\" && surface.trim() === \"\");\n\n // While pending, prune the failing subtrees and draw the rest; a settled\n // surface is all-or-nothing.\n const invalid = useMemo(\n () =>\n validation && !validation.ok && pending\n ? invalidNodePaths(validation.errors)\n : new Set<string>(),\n [validation, pending],\n );\n const drawable =\n validation?.spec && (validation.ok || (pending && !invalid.has(\"root\")))\n ? validation.spec\n : null;\n\n // The last tree that painted, so an unparsable streaming chunk (mid-token) or\n // a momentarily root-invalid prefix keeps the previous frame on screen.\n const lastGoodRef = useRef<A2uiSurfaceSpec | null>(null);\n if (drawable) lastGoodRef.current = drawable;\n const shown = drawable ?? (pending ? lastGoodRef.current : null);\n const [hasRendered, setHasRendered] = useState(false);\n useEffect(() => {\n if (shown && !hasRendered) setHasRendered(true);\n }, [shown, hasRendered]);\n\n const status: A2uiSurfaceStatus = loading\n ? \"pending\"\n : empty\n ? hasRendered\n ? \"ready\"\n : \"idle\"\n : pending\n ? \"pending\"\n : validation && !validation.ok\n ? \"error\"\n : \"ready\";\n\n // Terminal errors only — once per settled, invalid surface.\n // Keyed by the error LIST, not the input's identity, so a parent re-render\n // that passes an equal object literal does not report the same failure twice.\n const reportedRef = useRef<string | null>(null);\n useEffect(() => {\n if (status !== \"error\" || !validation || validation.ok) return;\n const key = JSON.stringify(validation.errors);\n if (reportedRef.current === key) return;\n reportedRef.current = key;\n onError?.(validation.errors);\n }, [status, validation, onError]);\n\n const showSkeleton = status === \"pending\" && !shown;\n const title = shown?.title;\n\n return (\n <div\n ref={ref}\n data-slot=\"a2ui-surface\"\n data-status={status}\n className={cn(\"relative min-w-0\", className)}\n {...(title ? { role: \"group\", \"aria-label\": title } : {})}\n {...props}\n >\n {showSkeleton ? (\n <div\n data-slot=\"a2ui-surface-skeleton\"\n role=\"status\"\n aria-live=\"polite\"\n className=\"space-y-2\"\n >\n <span className=\"sr-only\">{t(\"ai.a2ui.loading\")}</span>\n {skeleton ?? (\n <>\n <Skeleton className=\"h-6 w-1/3\" />\n <div className=\"grid grid-cols-3 gap-2\">\n <Skeleton className=\"h-16\" />\n <Skeleton className=\"h-16\" />\n <Skeleton className=\"h-16\" />\n </div>\n <Skeleton className=\"h-24 w-full\" />\n </>\n )}\n </div>\n ) : null}\n {shown ? (\n <SurfaceTree spec={shown} catalog={catalog} invalid={invalid} onAction={onAction} />\n ) : null}\n {status === \"error\" && validation && !validation.ok ? (\n <div\n data-slot=\"a2ui-surface-error\"\n role=\"alert\"\n // The status wash is the one separation gesture (surface-separation);\n // `-text` is the AA ink rung on a wash (status-rung).\n className=\"flex gap-2 rounded-md bg-destructive/10 p-3 text-body text-destructive-text\"\n >\n <AlertCircle className=\"mt-0.5 size-4 shrink-0\" aria-hidden=\"true\" />\n <div className=\"min-w-0 space-y-1\">\n <p className=\"font-medium\">{t(\"ai.a2ui.invalid\")}</p>\n <ul className=\"space-y-0.5 text-caption\">\n {validation.errors.slice(0, 8).map((e) => (\n <li key={`${e.path}:${e.code}`} className=\"break-words\">\n <code className=\"text-code\">{e.path || \"root\"}</code> — {e.message}\n </li>\n ))}\n {validation.errors.length > 8 ? (\n <li>{t(\"ai.a2ui.moreErrors\", { count: validation.errors.length - 8 })}</li>\n ) : null}\n </ul>\n </div>\n </div>\n ) : null}\n </div>\n );\n});\n\nA2uiSurface.displayName = \"A2uiSurface\";\n\n/** Re-exported so a host can pre-complete a streaming prefix itself (e.g. for a raw-JSON view). */\nexport { completeJson };\n"],"mappings":"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","names":["SurfaceTree","A2uiSurface"]}