@usetheo/ui 0.13.0 → 0.13.2

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 (1235) hide show
  1. package/CHANGELOG.md +541 -69
  2. package/DESIGN.md +18 -18
  3. package/NOTICE +2 -2
  4. package/README.md +54 -52
  5. package/dist/chunk-23YEYNDS.js +89 -0
  6. package/dist/chunk-23YEYNDS.js.map +1 -0
  7. package/dist/chunk-25KBUQEQ.js +95 -0
  8. package/dist/chunk-25KBUQEQ.js.map +1 -0
  9. package/dist/chunk-2NTEJRPA.js +212 -0
  10. package/dist/chunk-2NTEJRPA.js.map +1 -0
  11. package/dist/chunk-2NZYMQKT.js +56 -0
  12. package/dist/chunk-2NZYMQKT.js.map +1 -0
  13. package/dist/chunk-2OVFVPSZ.js +26 -0
  14. package/dist/chunk-2OVFVPSZ.js.map +1 -0
  15. package/dist/chunk-2UP7SECE.js +78 -0
  16. package/dist/chunk-2UP7SECE.js.map +1 -0
  17. package/dist/chunk-33ETHPT7.js +112 -0
  18. package/dist/chunk-33ETHPT7.js.map +1 -0
  19. package/dist/chunk-33IIDFSM.js +43 -0
  20. package/dist/chunk-33IIDFSM.js.map +1 -0
  21. package/dist/chunk-345HYADQ.js +88 -0
  22. package/dist/chunk-345HYADQ.js.map +1 -0
  23. package/dist/chunk-357XIC2N.js +98 -0
  24. package/dist/chunk-357XIC2N.js.map +1 -0
  25. package/dist/chunk-3YOPTHZH.js +31 -0
  26. package/dist/chunk-3YOPTHZH.js.map +1 -0
  27. package/dist/chunk-44ZNZZUS.js +111 -0
  28. package/dist/chunk-44ZNZZUS.js.map +1 -0
  29. package/dist/chunk-45FWKR23.js +62 -0
  30. package/dist/chunk-45FWKR23.js.map +1 -0
  31. package/dist/chunk-47IPOYLQ.js +116 -0
  32. package/dist/chunk-47IPOYLQ.js.map +1 -0
  33. package/dist/chunk-4EH6F54D.js +69 -0
  34. package/dist/chunk-4EH6F54D.js.map +1 -0
  35. package/dist/chunk-4EKF4EIE.js +140 -0
  36. package/dist/chunk-4EKF4EIE.js.map +1 -0
  37. package/dist/chunk-4XYFJIRC.js +65 -0
  38. package/dist/chunk-4XYFJIRC.js.map +1 -0
  39. package/dist/chunk-52J7SDYH.js +48 -0
  40. package/dist/chunk-52J7SDYH.js.map +1 -0
  41. package/dist/chunk-5YX76GH6.js +70 -0
  42. package/dist/chunk-5YX76GH6.js.map +1 -0
  43. package/dist/chunk-624AATQZ.js +77 -0
  44. package/dist/chunk-624AATQZ.js.map +1 -0
  45. package/dist/chunk-65YSFZAN.js +192 -0
  46. package/dist/chunk-65YSFZAN.js.map +1 -0
  47. package/dist/chunk-6IODJQWC.js +47 -0
  48. package/dist/chunk-6IODJQWC.js.map +1 -0
  49. package/dist/chunk-6ORS6XOE.js +57 -0
  50. package/dist/chunk-6ORS6XOE.js.map +1 -0
  51. package/dist/chunk-6V2LQEPT.js +165 -0
  52. package/dist/chunk-6V2LQEPT.js.map +1 -0
  53. package/dist/chunk-75IDWFYX.js +134 -0
  54. package/dist/chunk-75IDWFYX.js.map +1 -0
  55. package/dist/chunk-7BQXMG2A.js +93 -0
  56. package/dist/chunk-7BQXMG2A.js.map +1 -0
  57. package/dist/chunk-7RFWVNQA.js +47 -0
  58. package/dist/chunk-7RFWVNQA.js.map +1 -0
  59. package/dist/chunk-ABBXLAJW.js +74 -0
  60. package/dist/chunk-ABBXLAJW.js.map +1 -0
  61. package/dist/chunk-ACZNFEOZ.js +180 -0
  62. package/dist/chunk-ACZNFEOZ.js.map +1 -0
  63. package/dist/chunk-AJ2LNQUQ.js +108 -0
  64. package/dist/chunk-AJ2LNQUQ.js.map +1 -0
  65. package/dist/chunk-AX6P3SDS.js +89 -0
  66. package/dist/chunk-AX6P3SDS.js.map +1 -0
  67. package/dist/chunk-AXUAQM45.js +154 -0
  68. package/dist/chunk-AXUAQM45.js.map +1 -0
  69. package/dist/chunk-B2FL7KBJ.js +65 -0
  70. package/dist/chunk-B2FL7KBJ.js.map +1 -0
  71. package/dist/chunk-B42EOFRD.js +106 -0
  72. package/dist/chunk-B42EOFRD.js.map +1 -0
  73. package/dist/chunk-BE232OKN.js +42 -0
  74. package/dist/chunk-BE232OKN.js.map +1 -0
  75. package/dist/chunk-BSF4Y4UT.js +77 -0
  76. package/dist/chunk-BSF4Y4UT.js.map +1 -0
  77. package/dist/chunk-BYUWQ6OP.js +45 -0
  78. package/dist/chunk-BYUWQ6OP.js.map +1 -0
  79. package/dist/chunk-C5ULP2P5.js +140 -0
  80. package/dist/chunk-C5ULP2P5.js.map +1 -0
  81. package/dist/chunk-CCG7PXLX.js +24 -0
  82. package/dist/chunk-CCG7PXLX.js.map +1 -0
  83. package/dist/chunk-CFVSXYVT.js +59 -0
  84. package/dist/chunk-CFVSXYVT.js.map +1 -0
  85. package/dist/chunk-CGWIOIEO.js +27 -0
  86. package/dist/chunk-CGWIOIEO.js.map +1 -0
  87. package/dist/chunk-CVFSNA4K.js +716 -0
  88. package/dist/chunk-CVFSNA4K.js.map +1 -0
  89. package/dist/chunk-CX54TUTT.js +144 -0
  90. package/dist/chunk-CX54TUTT.js.map +1 -0
  91. package/dist/chunk-DJK6H3FD.js +200 -0
  92. package/dist/chunk-DJK6H3FD.js.map +1 -0
  93. package/dist/chunk-E26M7ATD.js +61 -0
  94. package/dist/chunk-E26M7ATD.js.map +1 -0
  95. package/dist/chunk-E63IRXZZ.js +78 -0
  96. package/dist/chunk-E63IRXZZ.js.map +1 -0
  97. package/dist/chunk-EOTSD2GL.js +83 -0
  98. package/dist/chunk-EOTSD2GL.js.map +1 -0
  99. package/dist/chunk-ESJUISWY.js +45 -0
  100. package/dist/chunk-ESJUISWY.js.map +1 -0
  101. package/dist/chunk-ET7A3TQZ.js +158 -0
  102. package/dist/chunk-ET7A3TQZ.js.map +1 -0
  103. package/dist/chunk-ETTL6XGU.js +139 -0
  104. package/dist/chunk-ETTL6XGU.js.map +1 -0
  105. package/dist/chunk-EWDN56AS.js +24 -0
  106. package/dist/chunk-EWDN56AS.js.map +1 -0
  107. package/dist/chunk-FELH4AAQ.js +90 -0
  108. package/dist/chunk-FELH4AAQ.js.map +1 -0
  109. package/dist/chunk-FJZKA2LV.js +165 -0
  110. package/dist/chunk-FJZKA2LV.js.map +1 -0
  111. package/dist/chunk-FM72LBCJ.js +102 -0
  112. package/dist/chunk-FM72LBCJ.js.map +1 -0
  113. package/dist/chunk-FNQASFTK.js +53 -0
  114. package/dist/chunk-FNQASFTK.js.map +1 -0
  115. package/dist/chunk-FOE3XXBJ.js +965 -0
  116. package/dist/chunk-FOE3XXBJ.js.map +1 -0
  117. package/dist/chunk-GC52HWIL.js +41 -0
  118. package/dist/chunk-GC52HWIL.js.map +1 -0
  119. package/dist/chunk-GCKFA7X7.js +83 -0
  120. package/dist/chunk-GCKFA7X7.js.map +1 -0
  121. package/dist/chunk-GDMCDW66.js +19 -0
  122. package/dist/chunk-GDMCDW66.js.map +1 -0
  123. package/dist/chunk-GLRUM43F.js +121 -0
  124. package/dist/chunk-GLRUM43F.js.map +1 -0
  125. package/dist/chunk-H3L7WZDZ.js +74 -0
  126. package/dist/chunk-H3L7WZDZ.js.map +1 -0
  127. package/dist/chunk-H55WXDME.js +45 -0
  128. package/dist/chunk-H55WXDME.js.map +1 -0
  129. package/dist/chunk-HB45JHMM.js +43 -0
  130. package/dist/chunk-HB45JHMM.js.map +1 -0
  131. package/dist/chunk-HETHTYEZ.js +80 -0
  132. package/dist/chunk-HETHTYEZ.js.map +1 -0
  133. package/dist/chunk-HHSKNB32.js +55 -0
  134. package/dist/chunk-HHSKNB32.js.map +1 -0
  135. package/dist/chunk-HILOUYES.js +151 -0
  136. package/dist/chunk-HILOUYES.js.map +1 -0
  137. package/dist/chunk-HKVOCYTN.js +113 -0
  138. package/dist/chunk-HKVOCYTN.js.map +1 -0
  139. package/dist/chunk-HNRFBJ25.js +129 -0
  140. package/dist/chunk-HNRFBJ25.js.map +1 -0
  141. package/dist/chunk-HTJVHFNW.js +178 -0
  142. package/dist/chunk-HTJVHFNW.js.map +1 -0
  143. package/dist/chunk-HZ7Z22VW.js +130 -0
  144. package/dist/chunk-HZ7Z22VW.js.map +1 -0
  145. package/dist/chunk-II5Q5RIO.js +236 -0
  146. package/dist/chunk-II5Q5RIO.js.map +1 -0
  147. package/dist/chunk-ITEIRMSH.js +121 -0
  148. package/dist/chunk-ITEIRMSH.js.map +1 -0
  149. package/dist/chunk-JIZKW3WC.js +74 -0
  150. package/dist/chunk-JIZKW3WC.js.map +1 -0
  151. package/dist/chunk-JP3SHERK.js +154 -0
  152. package/dist/chunk-JP3SHERK.js.map +1 -0
  153. package/dist/chunk-JR4H3FJ2.js +74 -0
  154. package/dist/chunk-JR4H3FJ2.js.map +1 -0
  155. package/dist/chunk-JRW53TVG.js +53 -0
  156. package/dist/chunk-JRW53TVG.js.map +1 -0
  157. package/dist/chunk-JS5T2CRO.js +86 -0
  158. package/dist/chunk-JS5T2CRO.js.map +1 -0
  159. package/dist/chunk-JXOCE27Z.js +82 -0
  160. package/dist/chunk-JXOCE27Z.js.map +1 -0
  161. package/dist/chunk-JYW5YNF7.js +188 -0
  162. package/dist/chunk-JYW5YNF7.js.map +1 -0
  163. package/dist/chunk-KHBXI6AV.js +149 -0
  164. package/dist/chunk-KHBXI6AV.js.map +1 -0
  165. package/dist/chunk-KXZH7BTX.js +92 -0
  166. package/dist/chunk-KXZH7BTX.js.map +1 -0
  167. package/dist/chunk-LB4PMLCX.js +57 -0
  168. package/dist/chunk-LB4PMLCX.js.map +1 -0
  169. package/dist/chunk-LMGE2QEO.js +117 -0
  170. package/dist/chunk-LMGE2QEO.js.map +1 -0
  171. package/dist/chunk-M74ZYBOK.js +93 -0
  172. package/dist/chunk-M74ZYBOK.js.map +1 -0
  173. package/dist/chunk-ML7WLNIK.js +11 -0
  174. package/dist/chunk-ML7WLNIK.js.map +1 -0
  175. package/dist/chunk-MLEPCMTF.js +147 -0
  176. package/dist/chunk-MLEPCMTF.js.map +1 -0
  177. package/dist/chunk-NSZEZTDO.js +98 -0
  178. package/dist/chunk-NSZEZTDO.js.map +1 -0
  179. package/dist/chunk-OMR6ZGME.js +63 -0
  180. package/dist/chunk-OMR6ZGME.js.map +1 -0
  181. package/dist/chunk-ORVYP73T.js +223 -0
  182. package/dist/chunk-ORVYP73T.js.map +1 -0
  183. package/dist/chunk-OZFUUO2Q.js +50 -0
  184. package/dist/chunk-OZFUUO2Q.js.map +1 -0
  185. package/dist/chunk-PJWYIOY4.js +3 -0
  186. package/dist/chunk-PJWYIOY4.js.map +1 -0
  187. package/dist/chunk-PXT47DRZ.js +59 -0
  188. package/dist/chunk-PXT47DRZ.js.map +1 -0
  189. package/dist/chunk-QBSJM4XI.js +83 -0
  190. package/dist/chunk-QBSJM4XI.js.map +1 -0
  191. package/dist/chunk-QBUTRD2M.js +58 -0
  192. package/dist/chunk-QBUTRD2M.js.map +1 -0
  193. package/dist/chunk-QCSMJTA6.js +68 -0
  194. package/dist/chunk-QCSMJTA6.js.map +1 -0
  195. package/dist/chunk-QNYOIVQ4.js +36 -0
  196. package/dist/chunk-QNYOIVQ4.js.map +1 -0
  197. package/dist/chunk-QPURZJJM.js +88 -0
  198. package/dist/chunk-QPURZJJM.js.map +1 -0
  199. package/dist/chunk-QTG266XU.js +69 -0
  200. package/dist/chunk-QTG266XU.js.map +1 -0
  201. package/dist/chunk-QV4BQRNH.js +29 -0
  202. package/dist/chunk-QV4BQRNH.js.map +1 -0
  203. package/dist/chunk-RJ6RAMKH.js +89 -0
  204. package/dist/chunk-RJ6RAMKH.js.map +1 -0
  205. package/dist/chunk-RJBCTMVW.js +59 -0
  206. package/dist/chunk-RJBCTMVW.js.map +1 -0
  207. package/dist/chunk-RMJYXHBX.js +113 -0
  208. package/dist/chunk-RMJYXHBX.js.map +1 -0
  209. package/dist/chunk-RQT5DWGG.js +34 -0
  210. package/dist/chunk-RQT5DWGG.js.map +1 -0
  211. package/dist/chunk-SPGNNN4R.js +115 -0
  212. package/dist/chunk-SPGNNN4R.js.map +1 -0
  213. package/dist/chunk-SQ66DCXY.js +35 -0
  214. package/dist/chunk-SQ66DCXY.js.map +1 -0
  215. package/dist/chunk-SXKGWHAM.js +179 -0
  216. package/dist/chunk-SXKGWHAM.js.map +1 -0
  217. package/dist/chunk-T2OKGV6M.js +13 -0
  218. package/dist/chunk-T2OKGV6M.js.map +1 -0
  219. package/dist/chunk-T4Z7HBZR.js +110 -0
  220. package/dist/chunk-T4Z7HBZR.js.map +1 -0
  221. package/dist/chunk-TW5I37AE.js +142 -0
  222. package/dist/chunk-TW5I37AE.js.map +1 -0
  223. package/dist/chunk-TY6NTWN5.js +29 -0
  224. package/dist/chunk-TY6NTWN5.js.map +1 -0
  225. package/dist/chunk-UJAWV6LM.js +136 -0
  226. package/dist/chunk-UJAWV6LM.js.map +1 -0
  227. package/dist/chunk-V2WCZBVE.js +122 -0
  228. package/dist/chunk-V2WCZBVE.js.map +1 -0
  229. package/dist/chunk-V4LRBYOD.js +55 -0
  230. package/dist/chunk-V4LRBYOD.js.map +1 -0
  231. package/dist/chunk-V6H2RUVP.js +77 -0
  232. package/dist/chunk-V6H2RUVP.js.map +1 -0
  233. package/dist/chunk-VFRFUU7A.js +35 -0
  234. package/dist/chunk-VFRFUU7A.js.map +1 -0
  235. package/dist/chunk-VHK2OUCW.js +38 -0
  236. package/dist/chunk-VHK2OUCW.js.map +1 -0
  237. package/dist/chunk-VLNFUEOR.js +86 -0
  238. package/dist/chunk-VLNFUEOR.js.map +1 -0
  239. package/dist/chunk-VU7XKD4G.js +66 -0
  240. package/dist/chunk-VU7XKD4G.js.map +1 -0
  241. package/dist/chunk-VZX4HLBM.js +84 -0
  242. package/dist/chunk-VZX4HLBM.js.map +1 -0
  243. package/dist/chunk-W24RR5OD.js +102 -0
  244. package/dist/chunk-W24RR5OD.js.map +1 -0
  245. package/dist/chunk-W47V2F3Q.js +115 -0
  246. package/dist/chunk-W47V2F3Q.js.map +1 -0
  247. package/dist/chunk-W743ORLA.js +91 -0
  248. package/dist/chunk-W743ORLA.js.map +1 -0
  249. package/dist/chunk-W7I3ZX66.js +76 -0
  250. package/dist/chunk-W7I3ZX66.js.map +1 -0
  251. package/dist/chunk-WD42UBGR.js +64 -0
  252. package/dist/chunk-WD42UBGR.js.map +1 -0
  253. package/dist/chunk-WQVEJJV7.js +108 -0
  254. package/dist/chunk-WQVEJJV7.js.map +1 -0
  255. package/dist/chunk-WX4Q4DTX.js +121 -0
  256. package/dist/chunk-WX4Q4DTX.js.map +1 -0
  257. package/dist/chunk-XC7SYZYR.js +86 -0
  258. package/dist/chunk-XC7SYZYR.js.map +1 -0
  259. package/dist/chunk-XSENM65D.js +128 -0
  260. package/dist/chunk-XSENM65D.js.map +1 -0
  261. package/dist/chunk-Y7JTBQUQ.js +152 -0
  262. package/dist/chunk-Y7JTBQUQ.js.map +1 -0
  263. package/dist/chunk-YD2QEVHO.js +68 -0
  264. package/dist/chunk-YD2QEVHO.js.map +1 -0
  265. package/dist/chunk-YDKRUSB5.js +35 -0
  266. package/dist/chunk-YDKRUSB5.js.map +1 -0
  267. package/dist/chunk-YNDHYMPI.js +46 -0
  268. package/dist/chunk-YNDHYMPI.js.map +1 -0
  269. package/dist/chunk-YO3WEMOH.js +130 -0
  270. package/dist/chunk-YO3WEMOH.js.map +1 -0
  271. package/dist/chunk-YVXMWUWD.js +118 -0
  272. package/dist/chunk-YVXMWUWD.js.map +1 -0
  273. package/dist/chunk-Z6HZMGO2.js +106 -0
  274. package/dist/chunk-Z6HZMGO2.js.map +1 -0
  275. package/dist/chunk-ZAP4RIUL.js +81 -0
  276. package/dist/chunk-ZAP4RIUL.js.map +1 -0
  277. package/dist/chunk-ZEDDWVBB.js +112 -0
  278. package/dist/chunk-ZEDDWVBB.js.map +1 -0
  279. package/dist/chunk-ZEFOXF2I.js +87 -0
  280. package/dist/chunk-ZEFOXF2I.js.map +1 -0
  281. package/dist/chunk-ZPURFK4C.js +203 -0
  282. package/dist/chunk-ZPURFK4C.js.map +1 -0
  283. package/dist/chunk-ZZZIOTLC.js +89 -0
  284. package/dist/chunk-ZZZIOTLC.js.map +1 -0
  285. package/dist/components/composites/account-menu/account-menu.d.ts +43 -0
  286. package/dist/components/composites/account-menu/index.d.ts +1 -0
  287. package/dist/components/composites/agent-composer/agent-composer.d.ts +41 -0
  288. package/dist/components/composites/agent-composer/index.d.ts +1 -0
  289. package/dist/components/composites/agent-editor/agent-editor.d.ts +31 -0
  290. package/dist/components/composites/agent-editor/index.d.ts +1 -0
  291. package/dist/components/composites/agent-stream/agent-stream.d.ts +72 -0
  292. package/dist/components/composites/agent-stream/index.d.ts +2 -0
  293. package/dist/components/composites/agent-stream/to-agent-stream-items.d.ts +32 -0
  294. package/dist/components/composites/agent-timeline/agent-timeline.d.ts +22 -0
  295. package/dist/components/composites/agent-timeline/index.d.ts +1 -0
  296. package/dist/components/composites/agent-tool-renderer/agent-tool-renderer.d.ts +60 -0
  297. package/dist/components/composites/agent-tool-renderer/index.d.ts +1 -0
  298. package/dist/components/composites/agent-tool-renderer/tool-call-part.d.ts +5 -0
  299. package/dist/components/composites/approval-card/approval-card.d.ts +35 -0
  300. package/dist/components/composites/approval-card/index.d.ts +1 -0
  301. package/dist/components/composites/chat-composer/chat-composer.d.ts +68 -0
  302. package/dist/components/composites/chat-composer/index.d.ts +1 -0
  303. package/dist/components/composites/chat-message/chat-message-actions.d.ts +22 -0
  304. package/dist/components/composites/chat-message/chat-message-branch.d.ts +17 -0
  305. package/dist/components/composites/chat-message/chat-message-response.d.ts +15 -0
  306. package/dist/components/composites/chat-message/chat-message-toolbar.d.ts +7 -0
  307. package/dist/components/composites/chat-message/chat-message.d.ts +94 -0
  308. package/dist/components/composites/chat-message/index.d.ts +23 -0
  309. package/dist/components/composites/chat-message/parts/data-part.d.ts +9 -0
  310. package/dist/components/composites/chat-message/parts/file-part.d.ts +5 -0
  311. package/dist/components/composites/chat-message/parts/reasoning-part.d.ts +7 -0
  312. package/dist/components/composites/chat-message/parts/source-part.d.ts +9 -0
  313. package/dist/components/composites/chat-message/parts/text-part.d.ts +11 -0
  314. package/dist/components/composites/choice-prompt/choice-prompt.d.ts +65 -0
  315. package/dist/components/composites/choice-prompt/index.d.ts +2 -0
  316. package/dist/components/composites/code-block/code-block.d.ts +29 -0
  317. package/dist/components/composites/code-block/index.d.ts +1 -0
  318. package/dist/components/composites/command-palette/command-palette.d.ts +41 -0
  319. package/dist/components/composites/command-palette/index.d.ts +1 -0
  320. package/dist/components/composites/confirm-dialog/confirm-dialog.d.ts +41 -0
  321. package/dist/components/composites/confirm-dialog/index.d.ts +1 -0
  322. package/dist/components/composites/confirm-prompt/confirm-prompt.d.ts +31 -0
  323. package/dist/components/composites/confirm-prompt/index.d.ts +1 -0
  324. package/dist/components/composites/cron-jobs-list/cron-jobs-list.d.ts +15 -0
  325. package/dist/components/composites/cron-jobs-list/index.d.ts +1 -0
  326. package/dist/components/composites/data-table/data-table.d.ts +63 -0
  327. package/dist/components/composites/data-table/index.d.ts +1 -0
  328. package/dist/components/composites/deployment-row/deployment-row.d.ts +28 -0
  329. package/dist/components/composites/deployment-row/index.d.ts +1 -0
  330. package/dist/components/composites/domain-config/domain-config.d.ts +34 -0
  331. package/dist/components/composites/domain-config/index.d.ts +1 -0
  332. package/dist/components/composites/env-var-editor/env-var-editor.d.ts +35 -0
  333. package/dist/components/composites/env-var-editor/index.d.ts +1 -0
  334. package/dist/components/composites/mcp-server-list/index.d.ts +1 -0
  335. package/dist/components/composites/mcp-server-list/mcp-server-list.d.ts +15 -0
  336. package/dist/components/composites/metric-card/index.d.ts +2 -0
  337. package/dist/components/composites/metric-card/metric-card.d.ts +46 -0
  338. package/dist/components/composites/multi-select-prompt/index.d.ts +1 -0
  339. package/dist/components/composites/multi-select-prompt/multi-select-prompt.d.ts +61 -0
  340. package/dist/components/composites/page-shell/index.d.ts +1 -0
  341. package/dist/components/composites/page-shell/page-shell.d.ts +68 -0
  342. package/dist/components/composites/permission-modal/index.d.ts +1 -0
  343. package/dist/components/composites/permission-modal/permission-modal.d.ts +48 -0
  344. package/dist/components/composites/preview-env-card/index.d.ts +1 -0
  345. package/dist/components/composites/preview-env-card/preview-env-card.d.ts +36 -0
  346. package/dist/components/composites/preview-panel/index.d.ts +1 -0
  347. package/dist/components/composites/preview-panel/preview-panel.d.ts +24 -0
  348. package/dist/components/composites/project-card/index.d.ts +1 -0
  349. package/dist/components/composites/project-card/project-card.d.ts +32 -0
  350. package/dist/components/composites/rollback-ui/index.d.ts +1 -0
  351. package/dist/components/composites/rollback-ui/rollback-ui.d.ts +32 -0
  352. package/dist/components/composites/rule-editor/index.d.ts +1 -0
  353. package/dist/components/composites/rule-editor/rule-editor.d.ts +18 -0
  354. package/dist/components/composites/skill-editor/index.d.ts +1 -0
  355. package/dist/components/composites/skill-editor/skill-editor.d.ts +19 -0
  356. package/dist/components/composites/skills-list/index.d.ts +1 -0
  357. package/dist/components/composites/skills-list/skills-list.d.ts +15 -0
  358. package/dist/components/composites/slide-deck/context.d.ts +23 -0
  359. package/dist/components/composites/slide-deck/controls.d.ts +8 -0
  360. package/dist/components/composites/slide-deck/fragments.d.ts +20 -0
  361. package/dist/components/composites/slide-deck/index.d.ts +21 -0
  362. package/dist/components/composites/slide-deck/notes.d.ts +14 -0
  363. package/dist/components/composites/slide-deck/presenter-view.d.ts +15 -0
  364. package/dist/components/composites/slide-deck/print-styles.d.ts +21 -0
  365. package/dist/components/composites/slide-deck/progress-bar.d.ts +8 -0
  366. package/dist/components/composites/slide-deck/schema.d.ts +31 -0
  367. package/dist/components/composites/slide-deck/slide-deck.d.ts +78 -0
  368. package/dist/components/composites/slide-deck/slide-number.d.ts +11 -0
  369. package/dist/components/composites/slide-deck/split-deck.d.ts +2 -0
  370. package/dist/components/composites/slide-deck/thumbnails.d.ts +19 -0
  371. package/dist/components/composites/slide-deck/use-deck-hash-routing.d.ts +23 -0
  372. package/dist/components/composites/slide-deck/use-deck-keyboard.d.ts +25 -0
  373. package/dist/components/composites/slide-deck/use-deck-state.d.ts +57 -0
  374. package/dist/components/composites/slide-deck/use-deck-swipe.d.ts +20 -0
  375. package/dist/components/composites/slide-deck/use-fullscreen.d.ts +18 -0
  376. package/dist/components/composites/stability-bundle-viewer/index.d.ts +1 -0
  377. package/dist/components/composites/stability-bundle-viewer/stability-bundle-viewer.d.ts +28 -0
  378. package/dist/components/composites/status-indicator/index.d.ts +2 -0
  379. package/dist/components/composites/status-indicator/status-indicator.d.ts +31 -0
  380. package/dist/components/composites/task-header/index.d.ts +1 -0
  381. package/dist/components/composites/task-header/task-header.d.ts +20 -0
  382. package/dist/components/composites/text-prompt/index.d.ts +1 -0
  383. package/dist/components/composites/text-prompt/text-prompt.d.ts +48 -0
  384. package/dist/components/composites/usage-meter/index.d.ts +1 -0
  385. package/dist/components/composites/usage-meter/usage-meter.d.ts +56 -0
  386. package/dist/components/primitives/action-bar/action-bar.d.ts +34 -0
  387. package/dist/components/primitives/action-bar/index.d.ts +1 -0
  388. package/dist/components/primitives/agent-error-card/agent-error-card.d.ts +47 -0
  389. package/dist/components/primitives/agent-error-card/index.d.ts +1 -0
  390. package/dist/components/primitives/agent-event/agent-event.d.ts +25 -0
  391. package/dist/components/primitives/agent-event/index.d.ts +1 -0
  392. package/dist/components/primitives/agent-handoff/agent-handoff.d.ts +24 -0
  393. package/dist/components/primitives/agent-handoff/index.d.ts +1 -0
  394. package/dist/components/primitives/agent-profile/agent-profile.d.ts +28 -0
  395. package/dist/components/primitives/agent-profile/index.d.ts +1 -0
  396. package/dist/components/primitives/agent-starting-state/agent-starting-state.d.ts +15 -0
  397. package/dist/components/primitives/agent-starting-state/index.d.ts +1 -0
  398. package/dist/components/primitives/agent-streaming/agent-streaming.d.ts +16 -0
  399. package/dist/components/primitives/agent-streaming/index.d.ts +1 -0
  400. package/dist/components/primitives/alert/alert.d.ts +31 -0
  401. package/dist/components/primitives/alert/index.d.ts +1 -0
  402. package/dist/components/primitives/artifact-preview/artifact-preview.d.ts +25 -0
  403. package/dist/components/primitives/artifact-preview/index.d.ts +1 -0
  404. package/dist/components/primitives/attachment-chip/attachment-chip.d.ts +14 -0
  405. package/dist/components/primitives/attachment-chip/index.d.ts +1 -0
  406. package/dist/components/primitives/audit-log-entry/audit-log-entry.d.ts +29 -0
  407. package/dist/components/primitives/audit-log-entry/index.d.ts +1 -0
  408. package/dist/components/primitives/auto-compact-notice/auto-compact-notice.d.ts +24 -0
  409. package/dist/components/primitives/auto-compact-notice/index.d.ts +1 -0
  410. package/dist/components/primitives/avatar/avatar.d.ts +26 -0
  411. package/dist/components/primitives/avatar/index.d.ts +1 -0
  412. package/dist/components/primitives/badge/badge.d.ts +33 -0
  413. package/dist/components/primitives/badge/index.d.ts +1 -0
  414. package/dist/components/primitives/branch-indicator/branch-indicator.d.ts +13 -0
  415. package/dist/components/primitives/branch-indicator/index.d.ts +1 -0
  416. package/dist/components/primitives/browser-controls/browser-controls.d.ts +19 -0
  417. package/dist/components/primitives/browser-controls/index.d.ts +1 -0
  418. package/dist/components/primitives/build-log-stream/build-log-stream.d.ts +51 -0
  419. package/dist/components/primitives/build-log-stream/index.d.ts +1 -0
  420. package/dist/components/primitives/button/button.d.ts +26 -0
  421. package/dist/components/primitives/button/index.d.ts +1 -0
  422. package/dist/components/primitives/capability-indicator/capability-indicator.d.ts +57 -0
  423. package/dist/components/primitives/capability-indicator/index.d.ts +1 -0
  424. package/dist/components/primitives/card/card.d.ts +40 -0
  425. package/dist/components/primitives/card/index.d.ts +1 -0
  426. package/dist/components/primitives/channel-card/channel-card.d.ts +28 -0
  427. package/dist/components/primitives/channel-card/index.d.ts +1 -0
  428. package/dist/components/primitives/chat-thread/chat-thread.d.ts +12 -0
  429. package/dist/components/primitives/chat-thread/index.d.ts +1 -0
  430. package/dist/components/primitives/checkbox/checkbox.d.ts +20 -0
  431. package/dist/components/primitives/checkbox/index.d.ts +1 -0
  432. package/dist/components/primitives/context-card/context-card.d.ts +18 -0
  433. package/dist/components/primitives/context-card/index.d.ts +1 -0
  434. package/dist/components/primitives/context-window-bar/context-window-bar.d.ts +27 -0
  435. package/dist/components/primitives/context-window-bar/index.d.ts +1 -0
  436. package/dist/components/primitives/copy-button/copy-button.d.ts +17 -0
  437. package/dist/components/primitives/copy-button/index.d.ts +1 -0
  438. package/dist/components/primitives/cost-meter/cost-meter.d.ts +23 -0
  439. package/dist/components/primitives/cost-meter/index.d.ts +1 -0
  440. package/dist/components/primitives/created-files-card/created-files-card.d.ts +30 -0
  441. package/dist/components/primitives/created-files-card/index.d.ts +1 -0
  442. package/dist/components/primitives/cron-job-card/cron-job-card.d.ts +30 -0
  443. package/dist/components/primitives/cron-job-card/index.d.ts +1 -0
  444. package/dist/components/primitives/danger-zone/danger-zone.d.ts +40 -0
  445. package/dist/components/primitives/danger-zone/index.d.ts +1 -0
  446. package/dist/components/primitives/dialog/dialog.d.ts +26 -0
  447. package/dist/components/primitives/dialog/index.d.ts +1 -0
  448. package/dist/components/primitives/diff-viewer/diff-viewer.d.ts +45 -0
  449. package/dist/components/primitives/diff-viewer/index.d.ts +1 -0
  450. package/dist/components/primitives/dropdown-menu/dropdown-menu.d.ts +68 -0
  451. package/dist/components/primitives/dropdown-menu/index.d.ts +1 -0
  452. package/dist/components/primitives/empty-state/empty-state.d.ts +22 -0
  453. package/dist/components/primitives/empty-state/index.d.ts +1 -0
  454. package/dist/components/primitives/export-chat-dialog/export-chat-dialog.d.ts +18 -0
  455. package/dist/components/primitives/export-chat-dialog/index.d.ts +1 -0
  456. package/dist/components/primitives/folder-context-card/folder-context-card.d.ts +40 -0
  457. package/dist/components/primitives/folder-context-card/index.d.ts +1 -0
  458. package/dist/components/primitives/folder-selector/folder-selector.d.ts +18 -0
  459. package/dist/components/primitives/folder-selector/index.d.ts +1 -0
  460. package/dist/components/primitives/form-field/form-field.d.ts +44 -0
  461. package/dist/components/primitives/form-field/index.d.ts +1 -0
  462. package/dist/components/primitives/gateway-status-indicator/gateway-status-indicator.d.ts +19 -0
  463. package/dist/components/primitives/gateway-status-indicator/index.d.ts +1 -0
  464. package/dist/components/primitives/hook-config/hook-config.d.ts +27 -0
  465. package/dist/components/primitives/hook-config/index.d.ts +1 -0
  466. package/dist/components/primitives/hook-event-log/hook-event-log.d.ts +27 -0
  467. package/dist/components/primitives/hook-event-log/index.d.ts +1 -0
  468. package/dist/components/primitives/input/index.d.ts +1 -0
  469. package/dist/components/primitives/input/input.d.ts +24 -0
  470. package/dist/components/primitives/intent-selector/index.d.ts +1 -0
  471. package/dist/components/primitives/intent-selector/intent-selector.d.ts +22 -0
  472. package/dist/components/primitives/label/index.d.ts +1 -0
  473. package/dist/components/primitives/label/label.d.ts +15 -0
  474. package/dist/components/primitives/lane-board/index.d.ts +1 -0
  475. package/dist/components/primitives/lane-board/lane-board.d.ts +26 -0
  476. package/dist/components/primitives/login-split/index.d.ts +1 -0
  477. package/dist/components/primitives/login-split/login-split.d.ts +24 -0
  478. package/dist/components/primitives/mcp-server-card/index.d.ts +1 -0
  479. package/dist/components/primitives/mcp-server-card/mcp-server-card.d.ts +32 -0
  480. package/dist/components/primitives/memory-editor/index.d.ts +1 -0
  481. package/dist/components/primitives/memory-editor/memory-editor.d.ts +29 -0
  482. package/dist/components/primitives/mention-menu/index.d.ts +1 -0
  483. package/dist/components/primitives/mention-menu/mention-menu.d.ts +44 -0
  484. package/dist/components/primitives/metrics-panel/index.d.ts +1 -0
  485. package/dist/components/primitives/metrics-panel/metrics-panel.d.ts +62 -0
  486. package/dist/components/primitives/model-card/index.d.ts +1 -0
  487. package/dist/components/primitives/model-card/model-card.d.ts +72 -0
  488. package/dist/components/primitives/model-selector/index.d.ts +1 -0
  489. package/dist/components/primitives/model-selector/model-selector.d.ts +21 -0
  490. package/dist/components/primitives/pagination/index.d.ts +1 -0
  491. package/dist/components/primitives/pagination/pagination.d.ts +44 -0
  492. package/dist/components/primitives/permission-matrix/index.d.ts +1 -0
  493. package/dist/components/primitives/permission-matrix/permission-matrix.d.ts +43 -0
  494. package/dist/components/primitives/pin-input/index.d.ts +1 -0
  495. package/dist/components/primitives/pin-input/pin-input.d.ts +41 -0
  496. package/dist/components/primitives/plan-badge/index.d.ts +1 -0
  497. package/dist/components/primitives/plan-badge/plan-badge.d.ts +35 -0
  498. package/dist/components/primitives/progress/index.d.ts +1 -0
  499. package/dist/components/primitives/progress/progress.d.ts +44 -0
  500. package/dist/components/primitives/progress-checklist/index.d.ts +1 -0
  501. package/dist/components/primitives/progress-checklist/progress-checklist.d.ts +18 -0
  502. package/dist/components/primitives/project-switcher/index.d.ts +1 -0
  503. package/dist/components/primitives/project-switcher/project-switcher.d.ts +32 -0
  504. package/dist/components/primitives/quick-action-chips/index.d.ts +1 -0
  505. package/dist/components/primitives/quick-action-chips/quick-action-chips.d.ts +22 -0
  506. package/dist/components/primitives/radio-group/index.d.ts +1 -0
  507. package/dist/components/primitives/radio-group/radio-group.d.ts +5 -0
  508. package/dist/components/primitives/recent-folders-list/index.d.ts +1 -0
  509. package/dist/components/primitives/recent-folders-list/recent-folders-list.d.ts +21 -0
  510. package/dist/components/primitives/rule-card/index.d.ts +1 -0
  511. package/dist/components/primitives/rule-card/rule-card.d.ts +15 -0
  512. package/dist/components/primitives/run-stats/index.d.ts +1 -0
  513. package/dist/components/primitives/run-stats/run-stats.d.ts +16 -0
  514. package/dist/components/primitives/run-status-pill/index.d.ts +1 -0
  515. package/dist/components/primitives/run-status-pill/run-status-pill.d.ts +13 -0
  516. package/dist/components/primitives/running-tasks-panel/index.d.ts +1 -0
  517. package/dist/components/primitives/running-tasks-panel/running-tasks-panel.d.ts +20 -0
  518. package/dist/components/primitives/scroll-area/index.d.ts +2 -0
  519. package/dist/components/primitives/scroll-area/scroll-area.d.ts +40 -0
  520. package/dist/components/primitives/scroll-area/use-stick-to-bottom.d.ts +20 -0
  521. package/dist/components/primitives/select/index.d.ts +1 -0
  522. package/dist/components/primitives/select/select.d.ts +50 -0
  523. package/dist/components/primitives/session-list-item/index.d.ts +1 -0
  524. package/dist/components/primitives/session-list-item/session-list-item.d.ts +35 -0
  525. package/dist/components/primitives/session-timeline/index.d.ts +1 -0
  526. package/dist/components/primitives/session-timeline/session-timeline.d.ts +32 -0
  527. package/dist/components/primitives/sheet/index.d.ts +1 -0
  528. package/dist/components/primitives/sheet/sheet.d.ts +57 -0
  529. package/dist/components/primitives/sidebar/index.d.ts +1 -0
  530. package/dist/components/primitives/sidebar/sidebar.d.ts +18 -0
  531. package/dist/components/primitives/skeleton/index.d.ts +1 -0
  532. package/dist/components/primitives/skeleton/skeleton.d.ts +21 -0
  533. package/dist/components/primitives/skill-card/index.d.ts +1 -0
  534. package/dist/components/primitives/skill-card/skill-card.d.ts +28 -0
  535. package/dist/components/primitives/slide/alerts.d.ts +31 -0
  536. package/dist/components/primitives/slide/frontmatter.d.ts +23 -0
  537. package/dist/components/primitives/slide/index.d.ts +16 -0
  538. package/dist/components/primitives/slide/json-schema.d.ts +9 -0
  539. package/dist/components/primitives/slide/marpit-bg.d.ts +36 -0
  540. package/dist/components/primitives/slide/parse.d.ts +59 -0
  541. package/dist/components/primitives/slide/plugin.d.ts +79 -0
  542. package/dist/components/primitives/slide/plugins/emoji/index.d.ts +8 -0
  543. package/dist/components/primitives/slide/plugins/emoji/map.d.ts +15 -0
  544. package/dist/components/primitives/slide/plugins/math/index.d.ts +6 -0
  545. package/dist/components/primitives/slide/plugins/mermaid/index.d.ts +48 -0
  546. package/dist/components/primitives/slide/plugins/shiki/index.d.ts +11 -0
  547. package/dist/components/primitives/slide/sanitize.d.ts +33 -0
  548. package/dist/components/primitives/slide/schema.d.ts +109 -0
  549. package/dist/components/primitives/slide/slide.d.ts +53 -0
  550. package/dist/components/primitives/slide/themes/index.d.ts +9 -0
  551. package/dist/components/primitives/slide/use-slide-fit.d.ts +21 -0
  552. package/dist/components/primitives/slide/validate.d.ts +33 -0
  553. package/dist/components/primitives/social-auth-row/index.d.ts +1 -0
  554. package/dist/components/primitives/social-auth-row/social-auth-row.d.ts +24 -0
  555. package/dist/components/primitives/stat-tile/index.d.ts +1 -0
  556. package/dist/components/primitives/stat-tile/stat-tile.d.ts +28 -0
  557. package/dist/components/primitives/status-dot/index.d.ts +1 -0
  558. package/dist/components/primitives/status-dot/status-dot.d.ts +31 -0
  559. package/dist/components/primitives/steps-rail/index.d.ts +1 -0
  560. package/dist/components/primitives/steps-rail/steps-rail.d.ts +24 -0
  561. package/dist/components/primitives/sub-agent-dispatch/index.d.ts +1 -0
  562. package/dist/components/primitives/sub-agent-dispatch/sub-agent-dispatch.d.ts +30 -0
  563. package/dist/components/primitives/switch/index.d.ts +1 -0
  564. package/dist/components/primitives/switch/switch.d.ts +20 -0
  565. package/dist/components/primitives/system-prompt-editor/index.d.ts +1 -0
  566. package/dist/components/primitives/system-prompt-editor/system-prompt-editor.d.ts +25 -0
  567. package/dist/components/primitives/table/index.d.ts +1 -0
  568. package/dist/components/primitives/table/table.d.ts +61 -0
  569. package/dist/components/primitives/tabs/index.d.ts +1 -0
  570. package/dist/components/primitives/tabs/tabs.d.ts +7 -0
  571. package/dist/components/primitives/task-plan/index.d.ts +1 -0
  572. package/dist/components/primitives/task-plan/task-plan.d.ts +36 -0
  573. package/dist/components/primitives/terminal-panel/index.d.ts +1 -0
  574. package/dist/components/primitives/terminal-panel/terminal-panel.d.ts +32 -0
  575. package/dist/components/primitives/textarea/index.d.ts +1 -0
  576. package/dist/components/primitives/textarea/textarea.d.ts +20 -0
  577. package/dist/components/primitives/thinking-level-selector/index.d.ts +1 -0
  578. package/dist/components/primitives/thinking-level-selector/thinking-level-selector.d.ts +24 -0
  579. package/dist/components/primitives/timestamp/index.d.ts +1 -0
  580. package/dist/components/primitives/timestamp/timestamp.d.ts +34 -0
  581. package/dist/components/primitives/toast/index.d.ts +2 -0
  582. package/dist/components/primitives/toast/toast.d.ts +34 -0
  583. package/dist/components/primitives/toast/toaster.d.ts +38 -0
  584. package/dist/components/primitives/token-usage-chart/index.d.ts +2 -0
  585. package/dist/components/primitives/token-usage-chart/token-usage-chart.d.ts +44 -0
  586. package/dist/components/primitives/token-usage-chart/usage-metrics.d.ts +23 -0
  587. package/dist/components/primitives/tool-call/index.d.ts +1 -0
  588. package/dist/components/primitives/tool-call/tool-call.d.ts +30 -0
  589. package/dist/components/primitives/tool-call-card/index.d.ts +1 -0
  590. package/dist/components/primitives/tool-call-card/tool-call-card.d.ts +30 -0
  591. package/dist/components/primitives/tool-result/index.d.ts +1 -0
  592. package/dist/components/primitives/tool-result/tool-result.d.ts +19 -0
  593. package/dist/components/primitives/tools-list/index.d.ts +1 -0
  594. package/dist/components/primitives/tools-list/tools-list.d.ts +32 -0
  595. package/dist/components/primitives/tooltip/index.d.ts +1 -0
  596. package/dist/components/primitives/tooltip/tooltip.d.ts +33 -0
  597. package/dist/components/primitives/topnav/index.d.ts +1 -0
  598. package/dist/components/primitives/topnav/topnav.d.ts +29 -0
  599. package/dist/components/primitives/update-banner/index.d.ts +1 -0
  600. package/dist/components/primitives/update-banner/update-banner.d.ts +16 -0
  601. package/dist/components/primitives/whiteboard/index.d.ts +2 -0
  602. package/dist/components/primitives/whiteboard/render/freedraw.d.ts +2 -0
  603. package/dist/components/primitives/whiteboard/render/line.d.ts +4 -0
  604. package/dist/components/primitives/whiteboard/render/rough-paths.d.ts +16 -0
  605. package/dist/components/primitives/whiteboard/render/scene.d.ts +3 -0
  606. package/dist/components/primitives/whiteboard/render/shape.d.ts +5 -0
  607. package/dist/components/primitives/whiteboard/render/style.d.ts +24 -0
  608. package/dist/components/primitives/whiteboard/render/text.d.ts +2 -0
  609. package/dist/components/primitives/whiteboard/schema.d.ts +596 -0
  610. package/dist/components/primitives/whiteboard/seed.d.ts +22 -0
  611. package/dist/components/primitives/whiteboard/validate.d.ts +26 -0
  612. package/dist/components/primitives/whiteboard/viewport/use-pointer-pan.d.ts +11 -0
  613. package/dist/components/primitives/whiteboard/viewport/use-viewport.d.ts +33 -0
  614. package/dist/components/primitives/whiteboard/whiteboard.d.ts +21 -0
  615. package/dist/components.css +1 -1
  616. package/dist/composites/account-menu/index.js +4 -4
  617. package/dist/composites/agent-composer/index.js +6 -5
  618. package/dist/composites/agent-editor/index.js +8 -7
  619. package/dist/composites/agent-stream/index.js +21 -9
  620. package/dist/composites/agent-timeline/index.js +3 -3
  621. package/dist/composites/agent-tool-renderer/index.js +17 -0
  622. package/dist/composites/agent-tool-renderer/index.js.map +1 -0
  623. package/dist/composites/approval-card/index.js +3 -3
  624. package/dist/composites/chat-composer/index.js +3 -3
  625. package/dist/composites/chat-message/index.js +18 -4
  626. package/dist/composites/choice-prompt/index.js +11 -0
  627. package/dist/composites/choice-prompt/index.js.map +1 -0
  628. package/dist/composites/code-block/index.js +3 -3
  629. package/dist/composites/command-palette/index.js +4 -3
  630. package/dist/composites/confirm-dialog/index.js +6 -5
  631. package/dist/composites/confirm-prompt/index.js +7 -0
  632. package/dist/composites/confirm-prompt/index.js.map +1 -0
  633. package/dist/composites/cron-jobs-list/index.js +3 -3
  634. package/dist/composites/data-table/index.js +8 -7
  635. package/dist/composites/deployment-row/index.js +3 -3
  636. package/dist/composites/domain-config/index.js +6 -5
  637. package/dist/composites/env-var-editor/index.js +7 -5
  638. package/dist/composites/mcp-server-list/index.js +4 -3
  639. package/dist/composites/metric-card/index.js +5 -0
  640. package/dist/composites/metric-card/index.js.map +1 -0
  641. package/dist/composites/multi-select-prompt/index.js +11 -0
  642. package/dist/composites/multi-select-prompt/index.js.map +1 -0
  643. package/dist/composites/page-shell/index.js +6 -5
  644. package/dist/composites/permission-modal/index.js +5 -4
  645. package/dist/composites/preview-env-card/index.js +4 -4
  646. package/dist/composites/preview-panel/index.js +3 -3
  647. package/dist/composites/project-card/index.js +4 -4
  648. package/dist/composites/rollback-ui/index.js +5 -4
  649. package/dist/composites/rule-editor/index.js +9 -8
  650. package/dist/composites/skill-editor/index.js +9 -8
  651. package/dist/composites/skills-list/index.js +4 -3
  652. package/dist/composites/stability-bundle-viewer/index.js +3 -2
  653. package/dist/composites/status-indicator/index.js +4 -0
  654. package/dist/composites/status-indicator/index.js.map +1 -0
  655. package/dist/composites/task-header/index.js +3 -3
  656. package/dist/composites/text-prompt/index.js +10 -0
  657. package/dist/composites/text-prompt/index.js.map +1 -0
  658. package/dist/composites/usage-meter/index.js +3 -3
  659. package/dist/fonts-cdn.css +4 -4
  660. package/dist/fonts.css +2 -2
  661. package/dist/index.d.ts +144 -4622
  662. package/dist/index.js +999 -739
  663. package/dist/index.js.map +1 -1
  664. package/dist/lib/cn.d.ts +6 -0
  665. package/dist/lib/env.d.ts +55 -0
  666. package/dist/lib/live-region-context.d.ts +2 -0
  667. package/dist/lib/markdown/code-block.d.ts +14 -0
  668. package/dist/lib/markdown/inline-code.d.ts +10 -0
  669. package/dist/lib/markdown/math.d.ts +12 -0
  670. package/dist/lib/markdown/mermaid.d.ts +6 -0
  671. package/dist/lib/markdown/parser.d.ts +47 -0
  672. package/dist/lib/markdown/streaming-preprocess.d.ts +39 -0
  673. package/dist/lib/prompt.d.ts +40 -0
  674. package/dist/lib/safe-href.d.ts +27 -0
  675. package/dist/lib/sdk-tools-adapters/index.d.ts +1 -0
  676. package/dist/lib/sdk-tools-adapters/index.js +3 -0
  677. package/dist/lib/sdk-tools-adapters/index.js.map +1 -0
  678. package/dist/lib/sdk-tools-adapters/sdk-tools-adapters.d.ts +60 -0
  679. package/dist/lib/types.d.ts +10 -0
  680. package/dist/preset-v3-legacy.d.ts +7 -10
  681. package/dist/preset-v3-legacy.js +23 -3
  682. package/dist/preset-v3-legacy.js.map +1 -1
  683. package/dist/preset.css +2 -2
  684. package/dist/primitives/action-bar/index.js +2 -2
  685. package/dist/primitives/agent-error-card/index.js +2 -2
  686. package/dist/primitives/agent-event/index.js +3 -2
  687. package/dist/primitives/agent-handoff/index.js +2 -2
  688. package/dist/primitives/agent-profile/index.js +2 -2
  689. package/dist/primitives/agent-starting-state/index.js +2 -2
  690. package/dist/primitives/agent-streaming/index.js +2 -2
  691. package/dist/primitives/alert/index.js +2 -2
  692. package/dist/primitives/artifact-preview/index.js +2 -2
  693. package/dist/primitives/attachment-chip/index.js +2 -2
  694. package/dist/primitives/audit-log-entry/index.js +2 -2
  695. package/dist/primitives/auto-compact-notice/index.js +2 -2
  696. package/dist/primitives/avatar/index.js +2 -2
  697. package/dist/primitives/badge/index.js +2 -2
  698. package/dist/primitives/branch-indicator/index.js +2 -2
  699. package/dist/primitives/browser-controls/index.js +2 -2
  700. package/dist/primitives/build-log-stream/index.js +4 -2
  701. package/dist/primitives/button/index.js +2 -2
  702. package/dist/primitives/capability-indicator/index.js +2 -2
  703. package/dist/primitives/card/index.js +3 -2
  704. package/dist/primitives/channel-card/index.js +2 -2
  705. package/dist/primitives/chat-thread/index.js +2 -2
  706. package/dist/primitives/checkbox/index.js +2 -2
  707. package/dist/primitives/context-card/index.js +2 -2
  708. package/dist/primitives/context-window-bar/index.js +2 -2
  709. package/dist/primitives/copy-button/index.js +3 -2
  710. package/dist/primitives/cost-meter/index.js +2 -2
  711. package/dist/primitives/created-files-card/index.js +2 -2
  712. package/dist/primitives/cron-job-card/index.js +2 -2
  713. package/dist/primitives/danger-zone/index.js +2 -2
  714. package/dist/primitives/dialog/index.js +2 -2
  715. package/dist/primitives/diff-viewer/index.js +2 -2
  716. package/dist/primitives/dropdown-menu/index.js +2 -2
  717. package/dist/primitives/empty-state/index.js +2 -2
  718. package/dist/primitives/export-chat-dialog/index.js +3 -2
  719. package/dist/primitives/folder-context-card/index.js +2 -2
  720. package/dist/primitives/folder-selector/index.js +2 -2
  721. package/dist/primitives/form-field/index.js +3 -2
  722. package/dist/primitives/gateway-status-indicator/index.js +2 -2
  723. package/dist/primitives/hook-config/index.js +3 -2
  724. package/dist/primitives/hook-event-log/index.js +2 -2
  725. package/dist/primitives/input/index.js +2 -2
  726. package/dist/primitives/intent-selector/index.js +2 -2
  727. package/dist/primitives/label/index.js +2 -2
  728. package/dist/primitives/lane-board/index.js +2 -2
  729. package/dist/primitives/login-split/index.js +2 -2
  730. package/dist/primitives/mcp-server-card/index.js +2 -2
  731. package/dist/primitives/memory-editor/index.js +2 -2
  732. package/dist/primitives/mention-menu/index.js +3 -2
  733. package/dist/primitives/metrics-panel/index.js +2 -2
  734. package/dist/primitives/model-card/index.js +2 -2
  735. package/dist/primitives/model-selector/index.js +2 -2
  736. package/dist/primitives/pagination/index.js +2 -2
  737. package/dist/primitives/permission-matrix/index.js +3 -2
  738. package/dist/primitives/pin-input/index.js +3 -2
  739. package/dist/primitives/plan-badge/index.js +2 -2
  740. package/dist/primitives/progress/index.js +2 -2
  741. package/dist/primitives/progress-checklist/index.js +2 -2
  742. package/dist/primitives/project-switcher/index.js +2 -2
  743. package/dist/primitives/quick-action-chips/index.js +2 -2
  744. package/dist/primitives/radio-group/index.js +2 -2
  745. package/dist/primitives/recent-folders-list/index.js +2 -2
  746. package/dist/primitives/rule-card/index.js +2 -2
  747. package/dist/primitives/run-stats/index.js +2 -2
  748. package/dist/primitives/run-status-pill/index.js +2 -2
  749. package/dist/primitives/running-tasks-panel/index.js +2 -2
  750. package/dist/primitives/scroll-area/index.js +3 -2
  751. package/dist/primitives/select/index.js +2 -2
  752. package/dist/primitives/session-list-item/index.js +2 -2
  753. package/dist/primitives/session-timeline/index.js +2 -2
  754. package/dist/primitives/sheet/index.js +2 -2
  755. package/dist/primitives/sidebar/index.js +2 -2
  756. package/dist/primitives/skeleton/index.js +2 -2
  757. package/dist/primitives/skill-card/index.js +2 -2
  758. package/dist/primitives/social-auth-row/index.js +2 -2
  759. package/dist/primitives/stat-tile/index.js +2 -2
  760. package/dist/primitives/status-dot/index.js +4 -2
  761. package/dist/primitives/steps-rail/index.js +2 -2
  762. package/dist/primitives/sub-agent-dispatch/index.js +2 -2
  763. package/dist/primitives/switch/index.js +2 -2
  764. package/dist/primitives/system-prompt-editor/index.js +3 -2
  765. package/dist/primitives/table/index.js +3 -2
  766. package/dist/primitives/tabs/index.js +2 -2
  767. package/dist/primitives/task-plan/index.js +2 -2
  768. package/dist/primitives/terminal-panel/index.js +2 -2
  769. package/dist/primitives/textarea/index.js +2 -2
  770. package/dist/primitives/thinking-level-selector/index.js +3 -2
  771. package/dist/primitives/timestamp/index.js +4 -2
  772. package/dist/primitives/toast/index.js +3 -2
  773. package/dist/primitives/token-usage-chart/index.js +2 -2
  774. package/dist/primitives/tool-call/index.js +3 -2
  775. package/dist/primitives/tool-call-card/index.js +3 -2
  776. package/dist/primitives/tool-result/index.js +2 -2
  777. package/dist/primitives/tools-list/index.js +2 -2
  778. package/dist/primitives/tooltip/index.js +2 -2
  779. package/dist/primitives/topnav/index.js +2 -2
  780. package/dist/primitives/update-banner/index.js +2 -2
  781. package/dist/screens/theo-code-shell.d.ts +9 -0
  782. package/dist/screens/theo-code-shell.data.d.ts +147 -0
  783. package/dist/slide/index.js +2 -1
  784. package/dist/slide/plugins/mermaid/index.js +1 -1
  785. package/dist/slide/plugins/mermaid/index.js.map +1 -1
  786. package/dist/slide/plugins/shiki/index.js.map +1 -1
  787. package/dist/slide/themes/violet-forge.css +1 -1
  788. package/dist/slide-deck/index.js +13 -2
  789. package/dist/slide-deck/index.js.map +1 -1
  790. package/dist/styles/tailwind-preset.d.ts +29 -0
  791. package/dist/styles.css +3 -3
  792. package/dist/test/a11y.d.ts +13 -0
  793. package/dist/test/setup.d.ts +1 -0
  794. package/dist/themes/anthropic-style.d.ts +11 -0
  795. package/dist/themes/aurora-terminal.d.ts +9 -0
  796. package/dist/themes/classic-paper.d.ts +17 -0
  797. package/dist/themes/color-value-pattern.d.ts +22 -0
  798. package/dist/themes/color.d.ts +62 -0
  799. package/dist/themes/define.d.ts +65 -0
  800. package/dist/themes/density.d.ts +17 -0
  801. package/dist/themes/dracula.d.ts +14 -0
  802. package/dist/themes/github-dark.d.ts +11 -0
  803. package/dist/themes/index.d.ts +26 -0
  804. package/dist/themes/linear-glass.d.ts +11 -0
  805. package/dist/themes/one-dark.d.ts +11 -0
  806. package/dist/themes/openai-style.d.ts +10 -0
  807. package/dist/themes/schema.d.ts +112 -0
  808. package/dist/themes/theme-provider.d.ts +82 -0
  809. package/dist/themes/theme-script.d.ts +48 -0
  810. package/dist/themes/theme-switcher.d.ts +17 -0
  811. package/dist/themes/types.d.ts +88 -0
  812. package/dist/themes/vercel-mono.d.ts +11 -0
  813. package/dist/themes/violet-forge.d.ts +12 -0
  814. package/dist/theo-ui-provider.d.ts +50 -0
  815. package/dist/tokens-v4.css +77 -41
  816. package/dist/tokens.css +159 -74
  817. package/dist/types/agent.d.ts +19 -0
  818. package/dist/types/chat.d.ts +173 -0
  819. package/dist/types/mode.d.ts +16 -0
  820. package/dist/types/permission.d.ts +8 -0
  821. package/dist/types/rule.d.ts +28 -0
  822. package/dist/types/task.d.ts +9 -0
  823. package/dist/vite-plugin.d.ts +7 -11
  824. package/dist/vite-plugin.js +4 -4
  825. package/dist/vite-plugin.js.map +1 -1
  826. package/dist/whiteboard/index.js +3 -0
  827. package/dist/whiteboard/index.js.map +1 -1
  828. package/llms.txt +39 -39
  829. package/package.json +236 -188
  830. package/registry/index.json +58 -4
  831. package/registry/r/account-menu.json +1 -1
  832. package/registry/r/action-bar.json +1 -1
  833. package/registry/r/agent-composer.json +1 -1
  834. package/registry/r/agent-editor.json +1 -1
  835. package/registry/r/agent-error-card.json +1 -1
  836. package/registry/r/agent-event.json +1 -1
  837. package/registry/r/agent-handoff.json +1 -1
  838. package/registry/r/agent-profile.json +1 -1
  839. package/registry/r/agent-starting-state.json +1 -1
  840. package/registry/r/agent-stream.json +1 -1
  841. package/registry/r/agent-streaming.json +1 -1
  842. package/registry/r/agent-timeline.json +1 -1
  843. package/registry/r/agent-tool-renderer.json +40 -0
  844. package/registry/r/alert.json +1 -1
  845. package/registry/r/approval-card.json +1 -1
  846. package/registry/r/artifact-preview.json +1 -1
  847. package/registry/r/attachment-chip.json +1 -1
  848. package/registry/r/audit-log-entry.json +1 -1
  849. package/registry/r/auto-compact-notice.json +1 -1
  850. package/registry/r/avatar.json +1 -1
  851. package/registry/r/badge.json +1 -1
  852. package/registry/r/browser-controls.json +1 -1
  853. package/registry/r/build-log-stream.json +2 -1
  854. package/registry/r/button.json +1 -1
  855. package/registry/r/capability-indicator.json +1 -1
  856. package/registry/r/card.json +1 -1
  857. package/registry/r/chat-composer.json +1 -1
  858. package/registry/r/chat-message.json +11 -16
  859. package/registry/r/chat-thread.json +1 -1
  860. package/registry/r/chat-types.json +1 -1
  861. package/registry/r/checkbox.json +1 -1
  862. package/registry/r/choice-prompt.json +25 -0
  863. package/registry/r/cn.json +1 -1
  864. package/registry/r/code-block.json +1 -1
  865. package/registry/r/command-palette.json +1 -1
  866. package/registry/r/confirm-dialog.json +1 -1
  867. package/registry/r/confirm-prompt.json +21 -0
  868. package/registry/r/context-card.json +1 -1
  869. package/registry/r/context-window-bar.json +1 -1
  870. package/registry/r/copy-button.json +1 -1
  871. package/registry/r/cost-meter.json +1 -1
  872. package/registry/r/created-files-card.json +1 -1
  873. package/registry/r/cron-job-card.json +1 -1
  874. package/registry/r/cron-jobs-list.json +1 -1
  875. package/registry/r/danger-zone.json +1 -1
  876. package/registry/r/data-table.json +1 -1
  877. package/registry/r/deployment-row.json +1 -1
  878. package/registry/r/dialog.json +1 -1
  879. package/registry/r/diff-viewer.json +1 -1
  880. package/registry/r/domain-config.json +1 -1
  881. package/registry/r/dropdown-menu.json +2 -2
  882. package/registry/r/empty-state.json +1 -1
  883. package/registry/r/env-var-editor.json +2 -1
  884. package/registry/r/env.json +15 -0
  885. package/registry/r/folder-context-card.json +1 -1
  886. package/registry/r/folder-selector.json +1 -1
  887. package/registry/r/form-field.json +1 -1
  888. package/registry/r/hook-config.json +1 -1
  889. package/registry/r/hook-event-log.json +1 -1
  890. package/registry/r/input.json +1 -1
  891. package/registry/r/intent-selector.json +1 -1
  892. package/registry/r/label.json +1 -1
  893. package/registry/r/lane-board.json +1 -1
  894. package/registry/r/login-split.json +1 -1
  895. package/registry/r/mcp-server-card.json +1 -1
  896. package/registry/r/mcp-server-list.json +1 -1
  897. package/registry/r/memory-editor.json +1 -1
  898. package/registry/r/mention-menu.json +1 -1
  899. package/registry/r/metric-card.json +23 -0
  900. package/registry/r/metrics-panel.json +1 -1
  901. package/registry/r/model-card.json +1 -1
  902. package/registry/r/model-selector.json +1 -1
  903. package/registry/r/multi-select-prompt.json +25 -0
  904. package/registry/r/page-shell.json +1 -1
  905. package/registry/r/pagination.json +1 -1
  906. package/registry/r/permission-matrix.json +1 -1
  907. package/registry/r/permission-modal.json +1 -1
  908. package/registry/r/pin-input.json +1 -1
  909. package/registry/r/plan-badge.json +1 -1
  910. package/registry/r/preview-env-card.json +1 -1
  911. package/registry/r/preview-panel.json +1 -1
  912. package/registry/r/progress-checklist.json +1 -1
  913. package/registry/r/progress.json +1 -1
  914. package/registry/r/project-card.json +1 -1
  915. package/registry/r/project-switcher.json +1 -1
  916. package/registry/r/prompt.json +15 -0
  917. package/registry/r/quick-action-chips.json +1 -1
  918. package/registry/r/radio-group.json +1 -1
  919. package/registry/r/recent-folders-list.json +1 -1
  920. package/registry/r/rollback-ui.json +1 -1
  921. package/registry/r/rule-card.json +1 -1
  922. package/registry/r/rule-editor.json +1 -1
  923. package/registry/r/run-stats.json +1 -1
  924. package/registry/r/running-tasks-panel.json +1 -1
  925. package/registry/r/safe-href.json +1 -1
  926. package/registry/r/scroll-area.json +1 -1
  927. package/registry/r/select.json +1 -1
  928. package/registry/r/session-list-item.json +1 -1
  929. package/registry/r/session-timeline.json +1 -1
  930. package/registry/r/sheet.json +1 -1
  931. package/registry/r/sidebar.json +1 -1
  932. package/registry/r/skeleton.json +1 -1
  933. package/registry/r/skill-card.json +1 -1
  934. package/registry/r/skill-editor.json +1 -1
  935. package/registry/r/skills-list.json +1 -1
  936. package/registry/r/slide-deck.json +8 -8
  937. package/registry/r/slide-plugin-mermaid.json +1 -1
  938. package/registry/r/slide-plugin-shiki.json +1 -1
  939. package/registry/r/slide.json +6 -6
  940. package/registry/r/social-auth-row.json +1 -1
  941. package/registry/r/stat-tile.json +1 -1
  942. package/registry/r/status-dot.json +2 -1
  943. package/registry/r/status-indicator.json +20 -0
  944. package/registry/r/steps-rail.json +1 -1
  945. package/registry/r/sub-agent-dispatch.json +1 -1
  946. package/registry/r/switch.json +1 -1
  947. package/registry/r/system-prompt-editor.json +1 -1
  948. package/registry/r/table.json +1 -1
  949. package/registry/r/tabs.json +1 -1
  950. package/registry/r/tailwind-preset.json +1 -1
  951. package/registry/r/task-header.json +1 -1
  952. package/registry/r/task-plan.json +1 -1
  953. package/registry/r/terminal-panel.json +1 -1
  954. package/registry/r/text-prompt.json +24 -0
  955. package/registry/r/textarea.json +1 -1
  956. package/registry/r/theme-provider.json +7 -6
  957. package/registry/r/theo-ui-provider.json +1 -1
  958. package/registry/r/timestamp.json +2 -1
  959. package/registry/r/toast.json +2 -2
  960. package/registry/r/token-usage-chart.json +1 -1
  961. package/registry/r/tokens.json +2 -2
  962. package/registry/r/tool-call-card.json +1 -1
  963. package/registry/r/tool-call.json +1 -1
  964. package/registry/r/tool-result.json +1 -1
  965. package/registry/r/tools-list.json +1 -1
  966. package/registry/r/tooltip.json +1 -1
  967. package/registry/r/topnav.json +1 -1
  968. package/registry/r/usage-meter.json +1 -1
  969. package/registry/r/whiteboard.json +3 -3
  970. package/dist/chunk-2UJROWAG.js +0 -106
  971. package/dist/chunk-2UJROWAG.js.map +0 -1
  972. package/dist/chunk-2XPWOUEH.js +0 -68
  973. package/dist/chunk-2XPWOUEH.js.map +0 -1
  974. package/dist/chunk-3GHLNCM3.js +0 -42
  975. package/dist/chunk-3GHLNCM3.js.map +0 -1
  976. package/dist/chunk-3HOXC25T.js +0 -48
  977. package/dist/chunk-3HOXC25T.js.map +0 -1
  978. package/dist/chunk-3QGO5SB3.js +0 -46
  979. package/dist/chunk-3QGO5SB3.js.map +0 -1
  980. package/dist/chunk-47QJVWW2.js +0 -85
  981. package/dist/chunk-47QJVWW2.js.map +0 -1
  982. package/dist/chunk-4L63UW3I.js +0 -35
  983. package/dist/chunk-4L63UW3I.js.map +0 -1
  984. package/dist/chunk-4UUSJJFZ.js +0 -25
  985. package/dist/chunk-4UUSJJFZ.js.map +0 -1
  986. package/dist/chunk-4ZBZBRG5.js +0 -127
  987. package/dist/chunk-4ZBZBRG5.js.map +0 -1
  988. package/dist/chunk-57NXT3OX.js +0 -92
  989. package/dist/chunk-57NXT3OX.js.map +0 -1
  990. package/dist/chunk-5FF5EUZP.js +0 -44
  991. package/dist/chunk-5FF5EUZP.js.map +0 -1
  992. package/dist/chunk-5UGQXB2P.js +0 -714
  993. package/dist/chunk-5UGQXB2P.js.map +0 -1
  994. package/dist/chunk-62FT22CI.js +0 -85
  995. package/dist/chunk-62FT22CI.js.map +0 -1
  996. package/dist/chunk-673R3GSK.js +0 -19
  997. package/dist/chunk-673R3GSK.js.map +0 -1
  998. package/dist/chunk-6VINZJBV.js +0 -128
  999. package/dist/chunk-6VINZJBV.js.map +0 -1
  1000. package/dist/chunk-6ZQKEY54.js +0 -149
  1001. package/dist/chunk-6ZQKEY54.js.map +0 -1
  1002. package/dist/chunk-74NZ5U3E.js +0 -145
  1003. package/dist/chunk-74NZ5U3E.js.map +0 -1
  1004. package/dist/chunk-755NWSNW.js +0 -36
  1005. package/dist/chunk-755NWSNW.js.map +0 -1
  1006. package/dist/chunk-7GLBWWMW.js +0 -70
  1007. package/dist/chunk-7GLBWWMW.js.map +0 -1
  1008. package/dist/chunk-7RXYW5VM.js +0 -88
  1009. package/dist/chunk-7RXYW5VM.js.map +0 -1
  1010. package/dist/chunk-AC4MGCXI.js +0 -92
  1011. package/dist/chunk-AC4MGCXI.js.map +0 -1
  1012. package/dist/chunk-AEVSVDT6.js +0 -67
  1013. package/dist/chunk-AEVSVDT6.js.map +0 -1
  1014. package/dist/chunk-AODIMN2N.js +0 -68
  1015. package/dist/chunk-AODIMN2N.js.map +0 -1
  1016. package/dist/chunk-ATHOPBCA.js +0 -61
  1017. package/dist/chunk-ATHOPBCA.js.map +0 -1
  1018. package/dist/chunk-AVPHVQZS.js +0 -73
  1019. package/dist/chunk-AVPHVQZS.js.map +0 -1
  1020. package/dist/chunk-AXKBNRZW.js +0 -173
  1021. package/dist/chunk-AXKBNRZW.js.map +0 -1
  1022. package/dist/chunk-B75MEYNR.js +0 -106
  1023. package/dist/chunk-B75MEYNR.js.map +0 -1
  1024. package/dist/chunk-BGKA6DI6.js +0 -34
  1025. package/dist/chunk-BGKA6DI6.js.map +0 -1
  1026. package/dist/chunk-BNQAJGEN.js +0 -88
  1027. package/dist/chunk-BNQAJGEN.js.map +0 -1
  1028. package/dist/chunk-BP2SETUC.js +0 -101
  1029. package/dist/chunk-BP2SETUC.js.map +0 -1
  1030. package/dist/chunk-BPUQWMBD.js +0 -79
  1031. package/dist/chunk-BPUQWMBD.js.map +0 -1
  1032. package/dist/chunk-BVDASR3Y.js +0 -74
  1033. package/dist/chunk-BVDASR3Y.js.map +0 -1
  1034. package/dist/chunk-BX7A5GUV.js +0 -78
  1035. package/dist/chunk-BX7A5GUV.js.map +0 -1
  1036. package/dist/chunk-CDA6RYOX.js +0 -115
  1037. package/dist/chunk-CDA6RYOX.js.map +0 -1
  1038. package/dist/chunk-CG7O3A42.js +0 -80
  1039. package/dist/chunk-CG7O3A42.js.map +0 -1
  1040. package/dist/chunk-CIYGNPKT.js +0 -76
  1041. package/dist/chunk-CIYGNPKT.js.map +0 -1
  1042. package/dist/chunk-CKXY4FTV.js +0 -59
  1043. package/dist/chunk-CKXY4FTV.js.map +0 -1
  1044. package/dist/chunk-CVOKZITR.js +0 -82
  1045. package/dist/chunk-CVOKZITR.js.map +0 -1
  1046. package/dist/chunk-CWFMFKDI.js +0 -82
  1047. package/dist/chunk-CWFMFKDI.js.map +0 -1
  1048. package/dist/chunk-CWVKSV7S.js +0 -124
  1049. package/dist/chunk-CWVKSV7S.js.map +0 -1
  1050. package/dist/chunk-CYOLRWOX.js +0 -63
  1051. package/dist/chunk-CYOLRWOX.js.map +0 -1
  1052. package/dist/chunk-D23LRJT6.js +0 -116
  1053. package/dist/chunk-D23LRJT6.js.map +0 -1
  1054. package/dist/chunk-DFADMEJK.js +0 -127
  1055. package/dist/chunk-DFADMEJK.js.map +0 -1
  1056. package/dist/chunk-DKQAHZG2.js +0 -83
  1057. package/dist/chunk-DKQAHZG2.js.map +0 -1
  1058. package/dist/chunk-DW247T3Q.js +0 -199
  1059. package/dist/chunk-DW247T3Q.js.map +0 -1
  1060. package/dist/chunk-E5A7HN6H.js +0 -32
  1061. package/dist/chunk-E5A7HN6H.js.map +0 -1
  1062. package/dist/chunk-EI63GTN7.js +0 -57
  1063. package/dist/chunk-EI63GTN7.js.map +0 -1
  1064. package/dist/chunk-EP25QJ4N.js +0 -146
  1065. package/dist/chunk-EP25QJ4N.js.map +0 -1
  1066. package/dist/chunk-ET44426Q.js +0 -80
  1067. package/dist/chunk-ET44426Q.js.map +0 -1
  1068. package/dist/chunk-ETEIDY34.js +0 -67
  1069. package/dist/chunk-ETEIDY34.js.map +0 -1
  1070. package/dist/chunk-EU55O4P7.js +0 -76
  1071. package/dist/chunk-EU55O4P7.js.map +0 -1
  1072. package/dist/chunk-F436537E.js +0 -104
  1073. package/dist/chunk-F436537E.js.map +0 -1
  1074. package/dist/chunk-FLBTGNQI.js +0 -86
  1075. package/dist/chunk-FLBTGNQI.js.map +0 -1
  1076. package/dist/chunk-FUT45NFW.js +0 -46
  1077. package/dist/chunk-FUT45NFW.js.map +0 -1
  1078. package/dist/chunk-G3LWNTVZ.js +0 -51
  1079. package/dist/chunk-G3LWNTVZ.js.map +0 -1
  1080. package/dist/chunk-GBJB5WLT.js +0 -58
  1081. package/dist/chunk-GBJB5WLT.js.map +0 -1
  1082. package/dist/chunk-GIEPEFRX.js +0 -110
  1083. package/dist/chunk-GIEPEFRX.js.map +0 -1
  1084. package/dist/chunk-GSO7MISR.js +0 -58
  1085. package/dist/chunk-GSO7MISR.js.map +0 -1
  1086. package/dist/chunk-GUQFYUIC.js +0 -61
  1087. package/dist/chunk-GUQFYUIC.js.map +0 -1
  1088. package/dist/chunk-GXBFGWQN.js +0 -81
  1089. package/dist/chunk-GXBFGWQN.js.map +0 -1
  1090. package/dist/chunk-H3VJMFJQ.js +0 -35
  1091. package/dist/chunk-H3VJMFJQ.js.map +0 -1
  1092. package/dist/chunk-HG4WEERE.js +0 -26
  1093. package/dist/chunk-HG4WEERE.js.map +0 -1
  1094. package/dist/chunk-HGPBGLNP.js +0 -51
  1095. package/dist/chunk-HGPBGLNP.js.map +0 -1
  1096. package/dist/chunk-HQFTW7SF.js +0 -141
  1097. package/dist/chunk-HQFTW7SF.js.map +0 -1
  1098. package/dist/chunk-I32I36LW.js +0 -113
  1099. package/dist/chunk-I32I36LW.js.map +0 -1
  1100. package/dist/chunk-I7WYM63C.js +0 -170
  1101. package/dist/chunk-I7WYM63C.js.map +0 -1
  1102. package/dist/chunk-JPTPIZ5V.js +0 -120
  1103. package/dist/chunk-JPTPIZ5V.js.map +0 -1
  1104. package/dist/chunk-JQXLPVWP.js +0 -74
  1105. package/dist/chunk-JQXLPVWP.js.map +0 -1
  1106. package/dist/chunk-K5ARID4S.js +0 -26
  1107. package/dist/chunk-K5ARID4S.js.map +0 -1
  1108. package/dist/chunk-K6RTLPIJ.js +0 -41
  1109. package/dist/chunk-K6RTLPIJ.js.map +0 -1
  1110. package/dist/chunk-K7PYLTMP.js +0 -221
  1111. package/dist/chunk-K7PYLTMP.js.map +0 -1
  1112. package/dist/chunk-KQNKKV2C.js +0 -56
  1113. package/dist/chunk-KQNKKV2C.js.map +0 -1
  1114. package/dist/chunk-KRN4NE4U.js +0 -155
  1115. package/dist/chunk-KRN4NE4U.js.map +0 -1
  1116. package/dist/chunk-L2BI762I.js +0 -82
  1117. package/dist/chunk-L2BI762I.js.map +0 -1
  1118. package/dist/chunk-LEEH63B2.js +0 -56
  1119. package/dist/chunk-LEEH63B2.js.map +0 -1
  1120. package/dist/chunk-LHRWVM3G.js +0 -42
  1121. package/dist/chunk-LHRWVM3G.js.map +0 -1
  1122. package/dist/chunk-LIGWMGXM.js +0 -117
  1123. package/dist/chunk-LIGWMGXM.js.map +0 -1
  1124. package/dist/chunk-LKYSX3QF.js +0 -104
  1125. package/dist/chunk-LKYSX3QF.js.map +0 -1
  1126. package/dist/chunk-MCIFB6VS.js +0 -54
  1127. package/dist/chunk-MCIFB6VS.js.map +0 -1
  1128. package/dist/chunk-MI5CXMZU.js +0 -171
  1129. package/dist/chunk-MI5CXMZU.js.map +0 -1
  1130. package/dist/chunk-MYEHGDC2.js +0 -152
  1131. package/dist/chunk-MYEHGDC2.js.map +0 -1
  1132. package/dist/chunk-NQZYY4LR.js +0 -84
  1133. package/dist/chunk-NQZYY4LR.js.map +0 -1
  1134. package/dist/chunk-O23LKHUR.js +0 -66
  1135. package/dist/chunk-O23LKHUR.js.map +0 -1
  1136. package/dist/chunk-PASI2U2R.js +0 -23
  1137. package/dist/chunk-PASI2U2R.js.map +0 -1
  1138. package/dist/chunk-PPH5NTHV.js +0 -34
  1139. package/dist/chunk-PPH5NTHV.js.map +0 -1
  1140. package/dist/chunk-PR6OZF6D.js +0 -28
  1141. package/dist/chunk-PR6OZF6D.js.map +0 -1
  1142. package/dist/chunk-PTHRL242.js +0 -186
  1143. package/dist/chunk-PTHRL242.js.map +0 -1
  1144. package/dist/chunk-PWXOXPFT.js +0 -142
  1145. package/dist/chunk-PWXOXPFT.js.map +0 -1
  1146. package/dist/chunk-QB6BNHO3.js +0 -112
  1147. package/dist/chunk-QB6BNHO3.js.map +0 -1
  1148. package/dist/chunk-QJGGTIUN.js +0 -110
  1149. package/dist/chunk-QJGGTIUN.js.map +0 -1
  1150. package/dist/chunk-QSOIJ6J3.js +0 -91
  1151. package/dist/chunk-QSOIJ6J3.js.map +0 -1
  1152. package/dist/chunk-R63ZKLQM.js +0 -45
  1153. package/dist/chunk-R63ZKLQM.js.map +0 -1
  1154. package/dist/chunk-RC5XME4T.js +0 -33
  1155. package/dist/chunk-RC5XME4T.js.map +0 -1
  1156. package/dist/chunk-RTYYJPPE.js +0 -77
  1157. package/dist/chunk-RTYYJPPE.js.map +0 -1
  1158. package/dist/chunk-RVOBP7PO.js +0 -116
  1159. package/dist/chunk-RVOBP7PO.js.map +0 -1
  1160. package/dist/chunk-SF6R5VMQ.js +0 -97
  1161. package/dist/chunk-SF6R5VMQ.js.map +0 -1
  1162. package/dist/chunk-SP4CP5HY.js +0 -57
  1163. package/dist/chunk-SP4CP5HY.js.map +0 -1
  1164. package/dist/chunk-SWJ4EUOI.js +0 -30
  1165. package/dist/chunk-SWJ4EUOI.js.map +0 -1
  1166. package/dist/chunk-TK24HQJJ.js +0 -128
  1167. package/dist/chunk-TK24HQJJ.js.map +0 -1
  1168. package/dist/chunk-UAYOOTRR.js +0 -77
  1169. package/dist/chunk-UAYOOTRR.js.map +0 -1
  1170. package/dist/chunk-UDTAMHXW.js +0 -55
  1171. package/dist/chunk-UDTAMHXW.js.map +0 -1
  1172. package/dist/chunk-UK27KR35.js +0 -73
  1173. package/dist/chunk-UK27KR35.js.map +0 -1
  1174. package/dist/chunk-UOMQPIB4.js +0 -48
  1175. package/dist/chunk-UOMQPIB4.js.map +0 -1
  1176. package/dist/chunk-UOXU7NDY.js +0 -120
  1177. package/dist/chunk-UOXU7NDY.js.map +0 -1
  1178. package/dist/chunk-V7OOTVK3.js +0 -106
  1179. package/dist/chunk-V7OOTVK3.js.map +0 -1
  1180. package/dist/chunk-VI5M7KJ2.js +0 -1022
  1181. package/dist/chunk-VI5M7KJ2.js.map +0 -1
  1182. package/dist/chunk-VMMATOPE.js +0 -64
  1183. package/dist/chunk-VMMATOPE.js.map +0 -1
  1184. package/dist/chunk-W2PVSIW3.js +0 -89
  1185. package/dist/chunk-W2PVSIW3.js.map +0 -1
  1186. package/dist/chunk-W3DUDZDU.js +0 -88
  1187. package/dist/chunk-W3DUDZDU.js.map +0 -1
  1188. package/dist/chunk-WKEUU2FU.js +0 -114
  1189. package/dist/chunk-WKEUU2FU.js.map +0 -1
  1190. package/dist/chunk-WKLW7RC6.js +0 -28
  1191. package/dist/chunk-WKLW7RC6.js.map +0 -1
  1192. package/dist/chunk-WSJGZNUH.js +0 -111
  1193. package/dist/chunk-WSJGZNUH.js.map +0 -1
  1194. package/dist/chunk-WVPDQMC2.js +0 -144
  1195. package/dist/chunk-WVPDQMC2.js.map +0 -1
  1196. package/dist/chunk-WWNH5ENT.js +0 -43
  1197. package/dist/chunk-WWNH5ENT.js.map +0 -1
  1198. package/dist/chunk-X5L62PXY.js +0 -112
  1199. package/dist/chunk-X5L62PXY.js.map +0 -1
  1200. package/dist/chunk-XGCV5E6W.js +0 -133
  1201. package/dist/chunk-XGCV5E6W.js.map +0 -1
  1202. package/dist/chunk-XRKIEL5M.js +0 -72
  1203. package/dist/chunk-XRKIEL5M.js.map +0 -1
  1204. package/dist/chunk-XUJYEADU.js +0 -80
  1205. package/dist/chunk-XUJYEADU.js.map +0 -1
  1206. package/dist/chunk-XVYNSIQC.js +0 -116
  1207. package/dist/chunk-XVYNSIQC.js.map +0 -1
  1208. package/dist/chunk-XWTISHXO.js +0 -54
  1209. package/dist/chunk-XWTISHXO.js.map +0 -1
  1210. package/dist/chunk-XZKEGEPT.js +0 -156
  1211. package/dist/chunk-XZKEGEPT.js.map +0 -1
  1212. package/dist/chunk-YOGHS4UU.js +0 -202
  1213. package/dist/chunk-YOGHS4UU.js.map +0 -1
  1214. package/dist/chunk-YRSKXEOD.js +0 -135
  1215. package/dist/chunk-YRSKXEOD.js.map +0 -1
  1216. package/dist/chunk-ZALLCR7X.js +0 -108
  1217. package/dist/chunk-ZALLCR7X.js.map +0 -1
  1218. package/dist/chunk-ZDAOHMCW.js +0 -46
  1219. package/dist/chunk-ZDAOHMCW.js.map +0 -1
  1220. package/dist/chunk-ZESICCKK.js +0 -37
  1221. package/dist/chunk-ZESICCKK.js.map +0 -1
  1222. package/dist/chunk-ZIKFOD6N.js +0 -87
  1223. package/dist/chunk-ZIKFOD6N.js.map +0 -1
  1224. package/dist/chunk-ZJRWCQEN.js +0 -76
  1225. package/dist/chunk-ZJRWCQEN.js.map +0 -1
  1226. package/dist/chunk-ZSRJCIWF.js +0 -24
  1227. package/dist/chunk-ZSRJCIWF.js.map +0 -1
  1228. package/dist/plugin-Atb0VKtr.d.ts +0 -172
  1229. package/dist/slide/index.d.ts +0 -212
  1230. package/dist/slide/plugins/emoji/index.d.ts +0 -29
  1231. package/dist/slide/plugins/math/index.d.ts +0 -13
  1232. package/dist/slide/plugins/mermaid/index.d.ts +0 -55
  1233. package/dist/slide/plugins/shiki/index.d.ts +0 -18
  1234. package/dist/slide-deck/index.d.ts +0 -377
  1235. package/dist/whiteboard/index.d.ts +0 -258
@@ -84,6 +84,12 @@
84
84
  "title": "AgentTimeline",
85
85
  "description": "Vertical list of agent events."
86
86
  },
87
+ {
88
+ "name": "agent-tool-renderer",
89
+ "type": "registry:ui",
90
+ "title": "AgentToolRenderer",
91
+ "description": "Overridable tool-renderer registry for agent chat surfaces — dispatches a UIMessage tool part to a rich renderer (diff, terminal, code, created-files, data-table) by classification kind, falling back to the generic ToolCallPart for anything unmapped."
92
+ },
87
93
  {
88
94
  "name": "agent-types",
89
95
  "type": "registry:lib",
@@ -198,6 +204,12 @@
198
204
  "title": "Checkbox",
199
205
  "description": "Built on Radix Checkbox — accessible binary control with focus ring and indeterminate state support."
200
206
  },
207
+ {
208
+ "name": "choice-prompt",
209
+ "type": "registry:block",
210
+ "title": "ChoicePrompt",
211
+ "description": "Single-select ask-the-user card with number-key shortcuts, an Other free-text option, and a side-by-side preview pane."
212
+ },
201
213
  {
202
214
  "name": "cn",
203
215
  "type": "registry:lib",
@@ -222,6 +234,12 @@
222
234
  "title": "ConfirmDialog",
223
235
  "description": "Controlled confirmation modal built on Dialog. Auto-focuses Cancel on open (deliberate — NOT the destructive button). Optional intent=destructive switches the confirm button to destructive variant. Optional confirmationPhrase enables typed-confirmation guard (case-sensitive, empty string = no phrase). Async onConfirm shows Loader2 spinner; resolve closes the dialog; reject keeps it open so consumers can surface their own error. Enter in the phrase input triggers confirm when matched."
224
236
  },
237
+ {
238
+ "name": "confirm-prompt",
239
+ "type": "registry:block",
240
+ "title": "ConfirmPrompt",
241
+ "description": "Binary yes/no ask-the-user card with an optional destructive variant exposed as an alertdialog."
242
+ },
225
243
  {
226
244
  "name": "context-card",
227
245
  "type": "registry:ui",
@@ -304,7 +322,7 @@
304
322
  "name": "dropdown-menu",
305
323
  "type": "registry:ui",
306
324
  "title": "DropdownMenu",
307
- "description": "Accessible dropdown menu primitive built on @radix-ui/react-dropdown-menu. Sub-components attached via Object.assign (Trigger, Content, Item, CheckboxItem, RadioItem, Label, Separator, Shortcut, Group, Sub, SubTrigger, SubContent, RadioGroup). Styled with @usetheo/ui design tokens. Consolidates the 5 prior direct-Radix usages under a single wrapper."
325
+ "description": "Accessible dropdown menu primitive built on @radix-ui/react-dropdown-menu. Sub-components attached via Object.assign (Trigger, Content, Item, CheckboxItem, RadioItem, Label, Separator, Shortcut, Group, Sub, SubTrigger, SubContent, RadioGroup). Styled with @theokit/ui design tokens. Consolidates the 5 prior direct-Radix usages under a single wrapper."
308
326
  },
309
327
  {
310
328
  "name": "empty-state",
@@ -318,6 +336,12 @@
318
336
  "title": "EnvVarEditor",
319
337
  "description": "Table-like editor for environment variables."
320
338
  },
339
+ {
340
+ "name": "env",
341
+ "type": "registry:lib",
342
+ "title": "Environment helpers",
343
+ "description": "Typed environment helpers (isDev / isProd) reading NODE_ENV through a single accessor that works in browser bundlers, Node/SSR, and unbundled browsers."
344
+ },
321
345
  {
322
346
  "name": "folder-context-card",
323
347
  "type": "registry:ui",
@@ -408,6 +432,12 @@
408
432
  "title": "MentionMenu",
409
433
  "description": "Keyboard-navigable popover for slash-command / @file / #memory"
410
434
  },
435
+ {
436
+ "name": "metric-card",
437
+ "type": "registry:ui",
438
+ "title": "MetricCard",
439
+ "description": "Dashboard metric tile composite — title + value + delta with trend semantics. Supports invertTrend for cost/churn metrics (EC-17)."
440
+ },
411
441
  {
412
442
  "name": "metrics-panel",
413
443
  "type": "registry:block",
@@ -432,6 +462,12 @@
432
462
  "title": "ModelSelector",
433
463
  "description": "Chip dropdown for picking the active LLM."
434
464
  },
465
+ {
466
+ "name": "multi-select-prompt",
467
+ "type": "registry:block",
468
+ "title": "MultiSelectPrompt",
469
+ "description": "Multi-select ask-the-user card with number-key toggles, an Other free-text option, and a side-by-side preview pane."
470
+ },
435
471
  {
436
472
  "name": "page-shell",
437
473
  "type": "registry:ui",
@@ -510,6 +546,12 @@
510
546
  "title": "ProjectSwitcher",
511
547
  "description": "Sidebar header for a code agent app."
512
548
  },
549
+ {
550
+ "name": "prompt",
551
+ "type": "registry:lib",
552
+ "title": "Prompt option helpers",
553
+ "description": "Shared option type + helpers (PromptOption, Other-value, number-key mapping) used by the prompt composites."
554
+ },
513
555
  {
514
556
  "name": "quick-action-chips",
515
557
  "type": "registry:ui",
@@ -634,7 +676,7 @@
634
676
  "name": "slide-deck",
635
677
  "type": "registry:block",
636
678
  "title": "SlideDeck",
637
- "description": "Composite engine that orchestrates N <Slide> primitives. Keyboard / touch / hash routing, thumbnails, presenter view, fullscreen, CSS transitions, Marpit-style fragments, PDF export. Subpath-isolated bundle in @usetheo/ui."
679
+ "description": "Composite engine that orchestrates N <Slide> primitives. Keyboard / touch / hash routing, thumbnails, presenter view, fullscreen, CSS transitions, Marpit-style fragments, PDF export. Subpath-isolated bundle in @theokit/ui."
638
680
  },
639
681
  {
640
682
  "name": "slide-plugin-emoji",
@@ -664,7 +706,7 @@
664
706
  "name": "slide",
665
707
  "type": "registry:ui",
666
708
  "title": "Slide",
667
- "description": "View-only primitive that renders Markdown + YAML frontmatter as a themed slide surface (Marp-inspired). Sanitized hast pipeline, two built-in themes, opt-in plugin system. Subpath-isolated bundle in @usetheo/ui."
709
+ "description": "View-only primitive that renders Markdown + YAML frontmatter as a themed slide surface (Marp-inspired). Sanitized hast pipeline, two built-in themes, opt-in plugin system. Subpath-isolated bundle in @theokit/ui."
668
710
  },
669
711
  {
670
712
  "name": "social-auth-row",
@@ -684,6 +726,12 @@
684
726
  "title": "StatusDot",
685
727
  "description": "Semantic status indicator (small colored circle + optional label). Five status kinds: live (success), building (warning, auto-pulses), failed (destructive), idle (muted), warning (warning, static). Three sizes (xs 6px / sm 8px default / md 10px). When neither label nor aria-label is provided, auto-applies aria-label=status and emits a dev warning."
686
728
  },
729
+ {
730
+ "name": "status-indicator",
731
+ "type": "registry:ui",
732
+ "title": "StatusIndicator",
733
+ "description": "Operational state indicator (online/offline/degraded/info) consuming status-* semantic tokens (ADR-0007)."
734
+ },
687
735
  {
688
736
  "name": "steps-rail",
689
737
  "type": "registry:ui",
@@ -750,6 +798,12 @@
750
798
  "title": "TerminalPanel",
751
799
  "description": "Minimal terminal output viewer."
752
800
  },
801
+ {
802
+ "name": "text-prompt",
803
+ "type": "registry:block",
804
+ "title": "TextPrompt",
805
+ "description": "Free-text ask-the-user card with single-line or multi-line input and an optional required gate."
806
+ },
753
807
  {
754
808
  "name": "textarea",
755
809
  "type": "registry:ui",
@@ -850,7 +904,7 @@
850
904
  "name": "whiteboard",
851
905
  "type": "registry:ui",
852
906
  "title": "Whiteboard",
853
- "description": "View-only primitive that renders a declarative JSON scene as SVG with a hand-drawn aesthetic. Pan + zoom built-in; no editor surface. Subpath-isolated bundle in @usetheo/ui."
907
+ "description": "View-only primitive that renders a declarative JSON scene as SVG with a hand-drawn aesthetic. Pan + zoom built-in; no editor surface. Subpath-isolated bundle in @theokit/ui."
854
908
  }
855
909
  ]
856
910
  }
@@ -18,7 +18,7 @@
18
18
  "path": "components/composites/account-menu/account-menu.tsx",
19
19
  "type": "registry:ui",
20
20
  "target": "components/ui/account-menu.tsx",
21
- "content": "import { ChevronsUpDown } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { ButtonHTMLAttributes, HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport { Avatar } from \"@/components/ui/avatar\";\nimport { PlanBadge, type PlanTier } from \"@/components/ui/plan-badge\";\n\n/**\n * AccountMenu — sidebar header for PaaS surfaces.\n *\n * Renders avatar + name + (optional) plan badge + (optional) secondary line.\n * Dual mode: with `onClick`, renders as a `<button>` with a `ChevronsUpDown`\n * trailing icon (account picker affordance); without, renders as a static\n * `<div>` (read-only display, not focusable).\n *\n * Composition:\n *\n * <Sidebar.Header className=\"p-0\">\n * <AccountMenu\n * name=\"paulohenriquevn\"\n * avatar=\"https://avatars.githubusercontent.com/u/12345\"\n * plan=\"hobby\"\n * onClick={openAccountSwitcher}\n * />\n * </Sidebar.Header>\n *\n * Avatar handling:\n * - URL (`http(s)://` or `/`) → `<Avatar.Image>` with `<Avatar.Fallback>` initials\n * - Short string (≤2 chars) → treated as initials directly\n * - Undefined → initials derived from the first character of `name`\n *\n * PaaS-shape sibling of `<ProjectSwitcher>` (workspace + branch + agent-status).\n * Same dual-mode (interactive vs static) pattern; different semantics.\n */\n\nexport interface AccountMenuProps\n extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"type\" | \"children\" | \"name\"> {\n /** Display name (username, email, org name). */\n name: ReactNode;\n /** Avatar URL or 1-2-char initials. If undefined, derives initials from `name`. */\n avatar?: string;\n /** Plan tier — renders inline `<PlanBadge size=\"sm\">`. Omit for none. */\n plan?: PlanTier;\n /** Optional secondary line below name (e.g. email). */\n secondary?: ReactNode;\n /** Make the row interactive (button) with a trailing chevron. */\n onClick?: () => void;\n}\n\nconst URL_RE = /^(?:https?:\\/\\/|\\/)/;\n\nfunction deriveInitials(name: ReactNode, avatar: string | undefined): string {\n if (avatar && !URL_RE.test(avatar) && avatar.length <= 2) {\n return avatar.toUpperCase();\n }\n if (typeof name === \"string\" && name.length > 0) {\n return name.charAt(0).toUpperCase();\n }\n return \"?\";\n}\n\nconst AccountMenu = forwardRef<HTMLElement, AccountMenuProps>(\n ({ className, name, avatar, plan, secondary, onClick, ...props }, ref) => {\n const interactive = typeof onClick === \"function\";\n const initials = deriveInitials(name, avatar);\n const isUrlAvatar = avatar !== undefined && URL_RE.test(avatar);\n const altText = typeof name === \"string\" ? name : \"account\";\n\n const content = (\n <>\n <Avatar size=\"sm\">\n {isUrlAvatar ? <Avatar.Image src={avatar} alt={altText} /> : null}\n <Avatar.Fallback delayMs={0}>{initials}</Avatar.Fallback>\n </Avatar>\n\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"truncate font-medium text-body-sm text-foreground\">{name}</span>\n {plan ? <PlanBadge plan={plan} size=\"sm\" /> : null}\n </div>\n {secondary ? (\n <span className=\"truncate text-label text-muted-foreground\">{secondary}</span>\n ) : null}\n </div>\n\n {interactive ? (\n <ChevronsUpDown className=\"size-3 shrink-0 text-muted-foreground\" aria-hidden=\"true\" />\n ) : null}\n </>\n );\n\n const baseClass = cn(\n \"flex w-full items-center gap-3 px-3 py-2\",\n interactive &&\n cn(\n \"rounded-md text-left transition-colors\",\n \"hover:bg-muted/40\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-card\",\n ),\n className,\n );\n\n if (interactive) {\n const { ...buttonProps } = props as ButtonHTMLAttributes<HTMLButtonElement>;\n return (\n <button\n ref={ref as React.Ref<HTMLButtonElement>}\n type=\"button\"\n className={baseClass}\n onClick={onClick}\n {...buttonProps}\n >\n {content}\n </button>\n );\n }\n\n return (\n <div\n ref={ref as React.Ref<HTMLDivElement>}\n className={baseClass}\n {...(props as HTMLAttributes<HTMLDivElement>)}\n >\n {content}\n </div>\n );\n },\n);\nAccountMenu.displayName = \"AccountMenu\";\n\nexport { AccountMenu };\n"
21
+ "content": "import { ChevronsUpDown } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { ButtonHTMLAttributes, HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport { Avatar } from \"@/components/ui/avatar\";\nimport { PlanBadge, type PlanTier } from \"@/components/ui/plan-badge\";\n\n/**\n * AccountMenu — sidebar header for PaaS surfaces.\n *\n * Renders avatar + name + (optional) plan badge + (optional) secondary line.\n * Dual mode: with `onClick`, renders as a `<button>` with a `ChevronsUpDown`\n * trailing icon (account picker affordance); without, renders as a static\n * `<div>` (read-only display, not focusable).\n *\n * Composition:\n *\n * <Sidebar.Header className=\"p-0\">\n * <AccountMenu\n * name=\"paulohenriquevn\"\n * avatar=\"https://avatars.githubusercontent.com/u/12345\"\n * plan=\"hobby\"\n * onClick={openAccountSwitcher}\n * />\n * </Sidebar.Header>\n *\n * Avatar handling:\n * - URL (`http(s)://` or `/`) → `<Avatar.Image>` with `<Avatar.Fallback>` initials\n * - Short string (≤2 chars) → treated as initials directly\n * - Undefined → initials derived from the first character of `name`\n *\n * PaaS-shape sibling of `<ProjectSwitcher>` (workspace + branch + agent-status).\n * Same dual-mode (interactive vs static) pattern; different semantics.\n */\n\nexport interface AccountMenuProps\n extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"type\" | \"children\" | \"name\"> {\n /** Display name (username, email, org name). */\n name: ReactNode;\n /** Avatar URL or 1-2-char initials. If undefined, derives initials from `name`. */\n avatar?: string;\n /** Plan tier — renders inline `<PlanBadge size=\"sm\">`. Omit for none. */\n plan?: PlanTier;\n /** Optional secondary line below name (e.g. email). */\n secondary?: ReactNode;\n /** Make the row interactive (button) with a trailing chevron. */\n onClick?: () => void;\n}\n\nconst URL_RE = /^(?:https?:\\/\\/|\\/)/;\n\nfunction deriveInitials(name: ReactNode, avatar: string | undefined): string {\n if (avatar && !URL_RE.test(avatar) && avatar.length <= 2) {\n return avatar.toUpperCase();\n }\n if (typeof name === \"string\" && name.length > 0) {\n return name.charAt(0).toUpperCase();\n }\n return \"?\";\n}\n\nconst AccountMenu = forwardRef<HTMLElement, AccountMenuProps>(\n ({ className, name, avatar, plan, secondary, onClick, ...props }, ref) => {\n const interactive = typeof onClick === \"function\";\n const initials = deriveInitials(name, avatar);\n const isUrlAvatar = avatar !== undefined && URL_RE.test(avatar);\n const altText = typeof name === \"string\" ? name : \"account\";\n\n const content = (\n <>\n <Avatar size=\"sm\">\n {isUrlAvatar ? <Avatar.Image src={avatar} alt={altText} /> : null}\n <Avatar.Fallback delayMs={0}>{initials}</Avatar.Fallback>\n </Avatar>\n\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"truncate font-medium text-body-sm text-foreground\">{name}</span>\n {plan ? <PlanBadge plan={plan} size=\"sm\" /> : null}\n </div>\n {secondary ? (\n <span className=\"truncate text-label text-muted-foreground\">{secondary}</span>\n ) : null}\n </div>\n\n {interactive ? (\n <ChevronsUpDown className=\"size-3 shrink-0 text-muted-foreground\" aria-hidden=\"true\" />\n ) : null}\n </>\n );\n\n const baseClass = cn(\n \"flex w-full items-center gap-3 px-3 py-2\",\n interactive &&\n cn(\n \"rounded-md text-left transition-colors\",\n \"hover:bg-muted/40\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-card\",\n ),\n className,\n );\n\n if (interactive) {\n const { ...buttonProps } = props as ButtonHTMLAttributes<HTMLButtonElement>;\n return (\n <button\n data-slot=\"account-menu\"\n ref={ref as React.Ref<HTMLButtonElement>}\n type=\"button\"\n className={baseClass}\n onClick={onClick}\n {...buttonProps}\n >\n {content}\n </button>\n );\n }\n\n return (\n <div\n data-slot=\"account-menu\"\n ref={ref as React.Ref<HTMLDivElement>}\n className={baseClass}\n {...(props as HTMLAttributes<HTMLDivElement>)}\n >\n {content}\n </div>\n );\n },\n);\nAccountMenu.displayName = \"AccountMenu\";\n\nexport { AccountMenu };\n"
22
22
  }
23
23
  ]
24
24
  }
@@ -16,7 +16,7 @@
16
16
  "path": "components/primitives/action-bar/action-bar.tsx",
17
17
  "type": "registry:ui",
18
18
  "target": "components/ui/action-bar.tsx",
19
- "content": "import { Filter, Loader2, Search } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { ElementType, HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * ActionBar — page-top action strip primitive.\n *\n * A horizontal flexbox row with three optional slots:\n * - Search input (flex-1, grows to fill)\n * - Filter icon button (next to search)\n * - Primary action button (right-aligned)\n *\n * Returns `null` when no props are provided — don't render an empty\n * bar. Used standalone or composed inside `<PageShell>` (Brief #5).\n *\n * @example\n * <ActionBar\n * search={{ placeholder: \"Search projects…\", value: q, onChange: setQ }}\n * primaryAction={{ label: \"New project\", icon: Plus, onClick: openModal }}\n * />\n */\n\nexport interface ActionBarProps extends Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\n search?: {\n placeholder: string;\n value: string;\n onChange: (value: string) => void;\n };\n primaryAction?: {\n label: ReactNode;\n icon?: ElementType;\n onClick: () => void;\n loading?: boolean;\n };\n onFilterClick?: () => void;\n}\n\nconst ActionBar = forwardRef<HTMLDivElement, ActionBarProps>(\n ({ className, search, primaryAction, onFilterClick, ...props }, ref) => {\n if (!search && !primaryAction && !onFilterClick) {\n return null;\n }\n\n const PrimaryIcon = primaryAction?.icon;\n const isLoading = primaryAction?.loading === true;\n\n return (\n <div ref={ref} className={cn(\"flex w-full items-center gap-2\", className)} {...props}>\n {search ? (\n <div className=\"relative flex-1\">\n <Search\n aria-hidden=\"true\"\n className=\"-translate-y-1/2 absolute top-1/2 left-3 size-4 text-muted-foreground\"\n />\n <input\n type=\"search\"\n placeholder={search.placeholder}\n value={search.value}\n onChange={(e) => search.onChange(e.target.value)}\n className={cn(\n \"w-full rounded-md border border-border/40 bg-card py-2 pr-3 pl-9\",\n \"font-sans text-body-sm text-foreground placeholder:text-muted-foreground\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n )}\n />\n </div>\n ) : null}\n {onFilterClick !== undefined ? (\n <button\n type=\"button\"\n onClick={onFilterClick}\n aria-label=\"Filter\"\n className={cn(\n \"inline-flex size-9 items-center justify-center rounded-md border border-border/40\",\n \"text-muted-foreground transition-colors\",\n \"hover:bg-muted hover:text-foreground\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n )}\n >\n <Filter aria-hidden=\"true\" className=\"size-4\" />\n </button>\n ) : null}\n {primaryAction !== undefined ? (\n <button\n type=\"button\"\n onClick={primaryAction.onClick}\n disabled={isLoading}\n className={cn(\n \"ml-auto inline-flex items-center gap-2 rounded-md bg-primary px-3 py-2\",\n \"font-medium font-sans text-body-sm text-primary-foreground\",\n \"transition-colors hover:bg-primary-deep\",\n \"disabled:cursor-not-allowed disabled:opacity-60\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n )}\n >\n {isLoading ? (\n <Loader2 aria-hidden=\"true\" className=\"size-4 animate-spin\" />\n ) : PrimaryIcon ? (\n <PrimaryIcon aria-hidden=\"true\" className=\"size-4\" />\n ) : null}\n {primaryAction.label}\n </button>\n ) : null}\n </div>\n );\n },\n);\nActionBar.displayName = \"ActionBar\";\n\nexport { ActionBar };\n"
19
+ "content": "import { Filter, Loader2, Search } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { ElementType, HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/lib/cn\";\n\n/**\n * ActionBar — page-top action strip primitive.\n *\n * A horizontal flexbox row with three optional slots:\n * - Search input (flex-1, grows to fill)\n * - Filter icon button (next to search)\n * - Primary action button (right-aligned)\n *\n * Returns `null` when no props are provided — don't render an empty\n * bar. Used standalone or composed inside `<PageShell>` (Brief #5).\n *\n * @example\n * <ActionBar\n * search={{ placeholder: \"Search projects…\", value: q, onChange: setQ }}\n * primaryAction={{ label: \"New project\", icon: Plus, onClick: openModal }}\n * />\n */\n\nexport interface ActionBarProps extends Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\n search?: {\n placeholder: string;\n value: string;\n onChange: (value: string) => void;\n };\n primaryAction?: {\n label: ReactNode;\n icon?: ElementType;\n onClick: () => void;\n loading?: boolean;\n };\n onFilterClick?: () => void;\n}\n\nconst ActionBar = forwardRef<HTMLDivElement, ActionBarProps>(\n ({ className, search, primaryAction, onFilterClick, ...props }, ref) => {\n if (!search && !primaryAction && !onFilterClick) {\n return null;\n }\n\n const PrimaryIcon = primaryAction?.icon;\n const isLoading = primaryAction?.loading === true;\n\n return (\n <div\n data-slot=\"action-bar\"\n ref={ref}\n className={cn(\"flex w-full items-center gap-2\", className)}\n {...props}\n >\n {search ? (\n <div className=\"relative flex-1\">\n <Search\n aria-hidden=\"true\"\n className=\"-translate-y-1/2 absolute top-1/2 left-3 size-4 text-muted-foreground\"\n />\n <input\n type=\"search\"\n placeholder={search.placeholder}\n value={search.value}\n onChange={(e) => search.onChange(e.target.value)}\n className={cn(\n \"w-full rounded-md border border-border/40 bg-card py-2 pr-3 pl-9\",\n \"font-sans text-body-sm text-foreground placeholder:text-muted-foreground\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n )}\n />\n </div>\n ) : null}\n {onFilterClick !== undefined ? (\n <button\n type=\"button\"\n onClick={onFilterClick}\n aria-label=\"Filter\"\n className={cn(\n \"inline-flex size-9 items-center justify-center rounded-md border border-border/40\",\n \"text-muted-foreground transition-colors\",\n \"hover:bg-muted hover:text-foreground\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n )}\n >\n <Filter aria-hidden=\"true\" className=\"size-4\" />\n </button>\n ) : null}\n {primaryAction !== undefined ? (\n <button\n type=\"button\"\n onClick={primaryAction.onClick}\n disabled={isLoading}\n className={cn(\n \"ml-auto inline-flex items-center gap-2 rounded-md bg-primary px-3 py-2\",\n \"font-medium font-sans text-body-sm text-primary-foreground\",\n \"transition-colors hover:bg-primary-deep\",\n \"disabled:cursor-not-allowed disabled:opacity-60\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n )}\n >\n {isLoading ? (\n <Loader2 aria-hidden=\"true\" className=\"size-4 animate-spin\" />\n ) : PrimaryIcon ? (\n <PrimaryIcon aria-hidden=\"true\" className=\"size-4\" />\n ) : null}\n {primaryAction.label}\n </button>\n ) : null}\n </div>\n );\n },\n);\nActionBar.displayName = \"ActionBar\";\n\nexport { ActionBar };\n"
20
20
  }
21
21
  ]
22
22
  }
@@ -16,7 +16,7 @@
16
16
  "path": "components/composites/agent-composer/agent-composer.tsx",
17
17
  "type": "registry:ui",
18
18
  "target": "components/ui/agent-composer.tsx",
19
- "content": "import { useMemo, useState } from \"react\";\nimport type { ComponentProps, KeyboardEvent, ReactNode } from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport {\n type MentionItem,\n MentionMenu,\n type MentionTrigger,\n} from \"@/components/ui/mention-menu\";\nimport { ChatComposer } from \"@/components/ui/chat-composer\";\n\n/**\n * AgentComposer — ChatComposer + slash-command / @file / #memory triggers.\n *\n * Wraps ChatComposer and watches the value for three trigger characters:\n * `/` → slash commands (`/clear`, `/help`, …)\n * `@` → file references (`@src/components/Foo.tsx`)\n * `#` → memory entries (`#alignment-grid`)\n *\n * Detection is string-based — no textarea ref required. A trigger is active\n * iff the value ends with a token of the form `[\\s|^]([/@#])[^\\s]*` (i.e. a\n * trigger char preceded by start-of-string or whitespace, with no space\n * after).\n *\n * The consumer provides the candidate items per trigger. On selection the\n * trailing token is replaced with the chosen value plus a trailing space.\n */\n\ntype ItemsProvider = (query: string) => MentionItem[];\n\ninterface AgentComposerProps extends ComponentProps<typeof ChatComposer> {\n /** Items shown when `/` is the active trigger. */\n commands?: MentionItem[] | ItemsProvider;\n /** Items shown when `@` is the active trigger. */\n files?: MentionItem[] | ItemsProvider;\n /** Items shown when `#` is the active trigger. */\n memories?: MentionItem[] | ItemsProvider;\n /**\n * What text gets inserted when an item is picked. Defaults to\n * `${trigger}${item.label}` (assumes `label` is a string). Override to\n * insert a token different from the visible label (e.g. include path,\n * id, …).\n */\n resolveInsertText?: (item: MentionItem, trigger: MentionTrigger) => string;\n /** Optional slot for the empty-state copy per trigger. */\n emptyLabels?: Partial<Record<MentionTrigger, ReactNode>>;\n /** Outer wrapper className (the relative positioning anchor for the menu). */\n containerClassName?: string;\n}\n\nconst TRIGGER_CHARS: ReadonlyArray<MentionTrigger> = [\"/\", \"@\", \"#\"];\n\nconst TRIGGER_RE = /(^|\\s)([/@#])([^\\s]*)$/;\n\ninterface DetectedTrigger {\n trigger: MentionTrigger;\n query: string;\n /** Index in the value where the trigger char starts. */\n start: number;\n}\n\nfunction detectTrigger(value: string): DetectedTrigger | null {\n const match = value.match(TRIGGER_RE);\n if (!match) return null;\n const leading = match[1] ?? \"\";\n const triggerChar = match[2] as MentionTrigger;\n const query = match[3] ?? \"\";\n if (!TRIGGER_CHARS.includes(triggerChar)) return null;\n // start = position of the trigger char itself\n const start = (match.index ?? 0) + leading.length;\n return { trigger: triggerChar, query, start };\n}\n\nfunction resolveItems(\n source: MentionItem[] | ItemsProvider | undefined,\n query: string,\n): MentionItem[] {\n if (!source) return [];\n if (typeof source === \"function\") return source(query);\n if (!query) return source;\n const q = query.toLowerCase();\n return source.filter((item) => {\n const haystack = `${typeof item.label === \"string\" ? item.label : \"\"} ${\n typeof item.description === \"string\" ? item.description : \"\"\n }`.toLowerCase();\n return haystack.includes(q);\n });\n}\n\nfunction defaultInsertText(item: MentionItem, trigger: MentionTrigger): string {\n const label = typeof item.label === \"string\" ? item.label : \"\";\n // If the visible label already starts with the trigger char (e.g. \"/clear\"),\n // use it as-is so we don't end up with \"//clear\".\n if (label.startsWith(trigger)) return label;\n return `${trigger}${label}`;\n}\n\nexport function AgentComposer({\n value,\n onValueChange,\n commands,\n files,\n memories,\n resolveInsertText = defaultInsertText,\n emptyLabels,\n containerClassName,\n className,\n textareaProps,\n ...chatComposerProps\n}: AgentComposerProps) {\n // Trigger detection + manual dismiss state.\n // We honour `dismissed` so the user can Esc the menu and keep typing after\n // a trigger char without the menu re-appearing.\n const [dismissedAt, setDismissedAt] = useState<number | null>(null);\n\n const detected = useMemo(() => detectTrigger(value), [value]);\n const isDismissed = detected !== null && dismissedAt === detected.start;\n const activeTrigger = isDismissed ? null : (detected?.trigger ?? null);\n const query = isDismissed ? \"\" : (detected?.query ?? \"\");\n\n const items = useMemo(() => {\n if (!activeTrigger || !detected) return [];\n if (activeTrigger === \"/\") return resolveItems(commands, query);\n if (activeTrigger === \"@\") return resolveItems(files, query);\n if (activeTrigger === \"#\") return resolveItems(memories, query);\n return [];\n }, [activeTrigger, detected, commands, files, memories, query]);\n\n const handleSelect = (item: MentionItem) => {\n if (!detected) return;\n const before = value.slice(0, detected.start);\n const insert = resolveInsertText(item, detected.trigger);\n onValueChange(`${before}${insert} `);\n setDismissedAt(null);\n };\n\n const handleClose = () => {\n if (detected) setDismissedAt(detected.start);\n };\n\n const interceptKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (activeTrigger) {\n // Let MentionMenu's global key handler take Arrow/Enter/Esc.\n if ([\"ArrowDown\", \"ArrowUp\", \"Enter\", \"Escape\"].includes(e.key)) {\n if (e.key === \"Enter\") e.preventDefault(); // also prevent form submit\n return;\n }\n }\n // Mirror ChatComposer's default Enter-to-submit when menu is closed.\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n (e.currentTarget.form as HTMLFormElement | null)?.requestSubmit();\n }\n textareaProps?.onKeyDown?.(e);\n };\n\n return (\n <div className={cn(\"relative\", containerClassName)}>\n <MentionMenu\n open={!!activeTrigger && items !== null}\n trigger={(activeTrigger ?? \"/\") as MentionTrigger}\n items={items}\n onSelect={handleSelect}\n onClose={handleClose}\n emptyLabel={activeTrigger ? emptyLabels?.[activeTrigger] : undefined}\n />\n <ChatComposer\n value={value}\n onValueChange={(next) => {\n // If user clears the trigger token, drop the dismissed marker too.\n if (!detectTrigger(next)) setDismissedAt(null);\n onValueChange(next);\n }}\n className={className}\n textareaProps={{\n ...textareaProps,\n onKeyDown: interceptKeyDown,\n }}\n {...chatComposerProps}\n />\n </div>\n );\n}\n"
19
+ "content": "\"use client\";\n\nimport { useMemo, useState } from \"react\";\nimport type { ComponentProps, KeyboardEvent, ReactNode } from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport {\n type MentionItem,\n MentionMenu,\n type MentionTrigger,\n} from \"@/components/ui/mention-menu\";\nimport { ChatComposer } from \"@/components/ui/chat-composer\";\n\n/**\n * AgentComposer — ChatComposer + slash-command / @file / #memory triggers.\n *\n * Wraps ChatComposer and watches the value for three trigger characters:\n * `/` → slash commands (`/clear`, `/help`, …)\n * `@` → file references (`@src/components/Foo.tsx`)\n * `#` → memory entries (`#alignment-grid`)\n *\n * Detection is string-based — no textarea ref required. A trigger is active\n * iff the value ends with a token of the form `[\\s|^]([/@#])[^\\s]*` (i.e. a\n * trigger char preceded by start-of-string or whitespace, with no space\n * after).\n *\n * The consumer provides the candidate items per trigger. On selection the\n * trailing token is replaced with the chosen value plus a trailing space.\n */\n\ntype ItemsProvider = (query: string) => MentionItem[];\n\ninterface AgentComposerProps extends ComponentProps<typeof ChatComposer> {\n /** Items shown when `/` is the active trigger. */\n commands?: MentionItem[] | ItemsProvider;\n /** Items shown when `@` is the active trigger. */\n files?: MentionItem[] | ItemsProvider;\n /** Items shown when `#` is the active trigger. */\n memories?: MentionItem[] | ItemsProvider;\n /**\n * What text gets inserted when an item is picked. Defaults to\n * `${trigger}${item.label}` (assumes `label` is a string). Override to\n * insert a token different from the visible label (e.g. include path,\n * id, …).\n */\n resolveInsertText?: (item: MentionItem, trigger: MentionTrigger) => string;\n /** Optional slot for the empty-state copy per trigger. */\n emptyLabels?: Partial<Record<MentionTrigger, ReactNode>>;\n /** Outer wrapper className (the relative positioning anchor for the menu). */\n containerClassName?: string;\n}\n\nconst TRIGGER_CHARS: ReadonlyArray<MentionTrigger> = [\"/\", \"@\", \"#\"];\n\nconst TRIGGER_RE = /(^|\\s)([/@#])([^\\s]*)$/;\n\ninterface DetectedTrigger {\n trigger: MentionTrigger;\n query: string;\n /** Index in the value where the trigger char starts. */\n start: number;\n}\n\nfunction detectTrigger(value: string): DetectedTrigger | null {\n const match = value.match(TRIGGER_RE);\n if (!match) return null;\n const leading = match[1] ?? \"\";\n const triggerChar = match[2] as MentionTrigger;\n const query = match[3] ?? \"\";\n if (!TRIGGER_CHARS.includes(triggerChar)) return null;\n // start = position of the trigger char itself\n const start = (match.index ?? 0) + leading.length;\n return { trigger: triggerChar, query, start };\n}\n\nfunction resolveItems(\n source: MentionItem[] | ItemsProvider | undefined,\n query: string,\n): MentionItem[] {\n if (!source) return [];\n if (typeof source === \"function\") return source(query);\n if (!query) return source;\n const q = query.toLowerCase();\n return source.filter((item) => {\n const haystack = `${typeof item.label === \"string\" ? item.label : \"\"} ${\n typeof item.description === \"string\" ? item.description : \"\"\n }`.toLowerCase();\n return haystack.includes(q);\n });\n}\n\nfunction defaultInsertText(item: MentionItem, trigger: MentionTrigger): string {\n const label = typeof item.label === \"string\" ? item.label : \"\";\n // If the visible label already starts with the trigger char (e.g. \"/clear\"),\n // use it as-is so we don't end up with \"//clear\".\n if (label.startsWith(trigger)) return label;\n return `${trigger}${label}`;\n}\n\nexport function AgentComposer({\n value,\n onValueChange,\n commands,\n files,\n memories,\n resolveInsertText = defaultInsertText,\n emptyLabels,\n containerClassName,\n className,\n textareaProps,\n ...chatComposerProps\n}: AgentComposerProps) {\n // Trigger detection + manual dismiss state.\n // We honour `dismissed` so the user can Esc the menu and keep typing after\n // a trigger char without the menu re-appearing.\n const [dismissedAt, setDismissedAt] = useState<number | null>(null);\n\n const detected = useMemo(() => detectTrigger(value), [value]);\n const isDismissed = detected !== null && dismissedAt === detected.start;\n const activeTrigger = isDismissed ? null : (detected?.trigger ?? null);\n const query = isDismissed ? \"\" : (detected?.query ?? \"\");\n\n const items = useMemo(() => {\n if (!activeTrigger || !detected) return [];\n if (activeTrigger === \"/\") return resolveItems(commands, query);\n if (activeTrigger === \"@\") return resolveItems(files, query);\n if (activeTrigger === \"#\") return resolveItems(memories, query);\n return [];\n }, [activeTrigger, detected, commands, files, memories, query]);\n\n const handleSelect = (item: MentionItem) => {\n if (!detected) return;\n const before = value.slice(0, detected.start);\n const insert = resolveInsertText(item, detected.trigger);\n onValueChange(`${before}${insert} `);\n setDismissedAt(null);\n };\n\n const handleClose = () => {\n if (detected) setDismissedAt(detected.start);\n };\n\n const interceptKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (activeTrigger) {\n // Let MentionMenu's global key handler take Arrow/Enter/Esc.\n if ([\"ArrowDown\", \"ArrowUp\", \"Enter\", \"Escape\"].includes(e.key)) {\n if (e.key === \"Enter\") e.preventDefault(); // also prevent form submit\n return;\n }\n }\n // Mirror ChatComposer's default Enter-to-submit when menu is closed.\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n (e.currentTarget.form as HTMLFormElement | null)?.requestSubmit();\n }\n textareaProps?.onKeyDown?.(e);\n };\n\n return (\n <div data-slot=\"agent-composer\" className={cn(\"relative\", containerClassName)}>\n <MentionMenu\n open={!!activeTrigger && items !== null}\n trigger={(activeTrigger ?? \"/\") as MentionTrigger}\n items={items}\n onSelect={handleSelect}\n onClose={handleClose}\n emptyLabel={activeTrigger ? emptyLabels?.[activeTrigger] : undefined}\n />\n <ChatComposer\n value={value}\n onValueChange={(next) => {\n // If user clears the trigger token, drop the dismissed marker too.\n if (!detectTrigger(next)) setDismissedAt(null);\n onValueChange(next);\n }}\n className={className}\n textareaProps={{\n ...textareaProps,\n onKeyDown: interceptKeyDown,\n }}\n {...chatComposerProps}\n />\n </div>\n );\n}\n"
20
20
  }
21
21
  ]
22
22
  }
@@ -21,7 +21,7 @@
21
21
  "path": "components/composites/agent-editor/agent-editor.tsx",
22
22
  "type": "registry:block",
23
23
  "target": "components/blocks/agent-editor.tsx",
24
- "content": "import { useState } from \"react\";\nimport type { FormEvent, HTMLAttributes } from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport { ALL_MODES, MODE_LABEL, type Mode } from \"@/types/mode\";\nimport type { AgentProfileDescriptor } from \"@/components/ui/agent-profile\";\nimport { Button } from \"@/components/ui/button\";\nimport { FormField } from \"@/components/ui/form-field\";\nimport { Input } from \"@/components/ui/input\";\nimport { Select } from \"@/components/ui/select\";\nimport { Textarea } from \"@/components/ui/textarea\";\n\n/**\n * AgentEditor — form for creating or editing an Agent persona.\n */\n\nexport interface AgentDraft extends Omit<AgentProfileDescriptor, \"id\"> {\n id?: string;\n systemPrompt?: string;\n model?: string;\n allowedTools?: string[];\n skillIds?: string[];\n /** Modes this agent is visible in. Omit / empty = global (all modes). */\n modes?: Mode[];\n}\n\ninterface AgentEditorProps extends Omit<HTMLAttributes<HTMLFormElement>, \"onSubmit\" | \"onChange\"> {\n initial?: Partial<AgentDraft>;\n models?: Array<{ id: string; label: string }>;\n skills?: Array<{ id: string; label: string }>;\n onSave: (draft: AgentDraft) => void;\n onCancel?: () => void;\n onDelete?: () => void;\n}\n\nconst TONES: Array<{ id: NonNullable<AgentProfileDescriptor[\"tone\"]>; label: string }> = [\n { id: \"primary\", label: \"Primary (violet)\" },\n { id: \"accent\", label: \"Accent (sienna)\" },\n { id: \"success\", label: \"Success (green)\" },\n { id: \"warning\", label: \"Warning (amber)\" },\n { id: \"info\", label: \"Info (blue)\" },\n { id: \"muted\", label: \"Muted (neutral)\" },\n];\n\nexport function AgentEditor({\n className,\n initial,\n models,\n skills,\n onSave,\n onCancel,\n onDelete,\n ...formProps\n}: AgentEditorProps) {\n const [name, setName] = useState(initial?.name ?? \"\");\n const [initials, setInitials] = useState(initial?.initials ?? \"\");\n const [description, setDescription] = useState(\n typeof initial?.description === \"string\" ? initial.description : \"\",\n );\n const [tone, setTone] = useState<NonNullable<AgentProfileDescriptor[\"tone\"]>>(\n initial?.tone ?? \"primary\",\n );\n const [model, setModel] = useState<string>(initial?.model ?? models?.[0]?.id ?? \"\");\n const [systemPrompt, setSystemPrompt] = useState(initial?.systemPrompt ?? \"\");\n const [allowedToolsRaw, setAllowedToolsRaw] = useState(initial?.allowedTools?.join(\", \") ?? \"\");\n const [skillsSelected, setSkillsSelected] = useState<Set<string>>(\n new Set(initial?.skillIds ?? []),\n );\n const [modes, setModes] = useState<Mode[]>(initial?.modes ?? []);\n\n // Note: state is only seeded once on mount. To reset the form when editing a\n // different agent, use the React `key` pattern at the call site:\n // <AgentEditor key={agent.id} initial={agent} ... />\n // This is the idiomatic React way (over a useEffect that watches prop deltas\n // and writes setters) — it guarantees a clean component instance per entity.\n const toggleMode = (m: Mode) =>\n setModes((prev) => (prev.includes(m) ? prev.filter((x) => x !== m) : [...prev, m]));\n\n const canSave = name.trim().length > 0;\n const handleSubmit = (e: FormEvent) => {\n e.preventDefault();\n if (!canSave) return;\n onSave({\n id: initial?.id,\n name: name.trim(),\n initials: initials.trim() || undefined,\n description: description.trim() || undefined,\n tone,\n model: model || undefined,\n systemPrompt: systemPrompt.trim() || undefined,\n allowedTools: allowedToolsRaw\n .split(\",\")\n .map((t) => t.trim())\n .filter(Boolean),\n skillIds: Array.from(skillsSelected),\n modes: modes.length > 0 ? modes : undefined,\n });\n };\n\n const toggleSkill = (id: string) => {\n setSkillsSelected((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n };\n\n return (\n <form\n onSubmit={handleSubmit}\n className={cn(\"flex h-full flex-col gap-4\", className)}\n {...formProps}\n >\n <div className=\"grid grid-cols-[1fr_auto] gap-3\">\n <FormField>\n <FormField.Label>Name</FormField.Label>\n <FormField.Control>\n <Input\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"Coder\"\n required\n />\n </FormField.Control>\n </FormField>\n <FormField className=\"w-24\">\n <FormField.Label>Initials</FormField.Label>\n <FormField.Control>\n <Input\n value={initials}\n onChange={(e) => setInitials(e.target.value.slice(0, 2).toUpperCase())}\n placeholder=\"CO\"\n maxLength={2}\n className=\"text-center font-mono uppercase\"\n />\n </FormField.Control>\n </FormField>\n </div>\n\n <FormField>\n <FormField.Label>Description</FormField.Label>\n <FormField.Control>\n <Input\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder=\"Writes code, edits files, runs verification.\"\n />\n </FormField.Control>\n </FormField>\n\n <div className=\"grid grid-cols-2 gap-3\">\n <FormField>\n <FormField.Label>Tone</FormField.Label>\n <FormField.Control>\n <Select\n value={tone}\n onValueChange={(v) => {\n // Re-audit Issue 7: narrow the string `v` against TONES.id\n // values before casting. Radix Select guarantees `v` is one\n // of the Select.Item values declared below, but adding the\n // runtime guard keeps the type narrowing explicit and\n // surfaces invalid future configurations as no-ops instead\n // of silently writing a bad state.\n const next = TONES.find((t) => t.id === v);\n if (next) setTone(next.id);\n }}\n >\n <Select.Trigger aria-label=\"Select tone\">\n <Select.Value />\n </Select.Trigger>\n <Select.Content>\n {TONES.map((t) => (\n <Select.Item key={t.id} value={t.id}>\n {t.label}\n </Select.Item>\n ))}\n </Select.Content>\n </Select>\n </FormField.Control>\n </FormField>\n {models && models.length > 0 ? (\n <FormField>\n <FormField.Label>Model</FormField.Label>\n <FormField.Control>\n <Select value={model} onValueChange={setModel}>\n <Select.Trigger aria-label=\"Select model\">\n <Select.Value />\n </Select.Trigger>\n <Select.Content>\n {models.map((m) => (\n <Select.Item key={m.id} value={m.id}>\n {m.label}\n </Select.Item>\n ))}\n </Select.Content>\n </Select>\n </FormField.Control>\n </FormField>\n ) : null}\n </div>\n\n <FormField className=\"flex-1\">\n <FormField.Label>System prompt override</FormField.Label>\n <FormField.Control>\n <Textarea\n value={systemPrompt}\n onChange={(e) => setSystemPrompt(e.target.value)}\n rows={6}\n placeholder=\"You are the Coder. You write code, edit files, and run verification…\"\n className=\"min-h-[10rem] flex-1 font-mono text-code-sm\"\n />\n </FormField.Control>\n <FormField.Hint>Leave empty to inherit the workspace default.</FormField.Hint>\n </FormField>\n\n <FormField>\n <FormField.Label>Allowed tools</FormField.Label>\n <FormField.Control>\n <Input\n value={allowedToolsRaw}\n onChange={(e) => setAllowedToolsRaw(e.target.value)}\n placeholder=\"Read, Edit, Bash\"\n />\n </FormField.Control>\n </FormField>\n\n {skills && skills.length > 0 ? (\n <FormField>\n <FormField.Label>Linked skills</FormField.Label>\n <div className=\"flex flex-wrap gap-1.5\">\n {skills.map((s) => {\n const on = skillsSelected.has(s.id);\n return (\n <button\n key={s.id}\n type=\"button\"\n onClick={() => toggleSkill(s.id)}\n aria-pressed={on}\n className={cn(\n \"inline-flex h-7 items-center rounded-full border px-3 font-mono text-body-sm transition-colors\",\n on\n ? \"border-primary bg-primary/15 text-primary\"\n : \"border-border/60 bg-card text-muted-foreground hover:text-foreground\",\n )}\n >\n {s.label}\n </button>\n );\n })}\n </div>\n </FormField>\n ) : null}\n\n <FormField>\n <FormField.Label>Active modes</FormField.Label>\n <div className=\"flex flex-wrap gap-1.5\">\n {ALL_MODES.map((m) => {\n const on = modes.includes(m);\n return (\n <button\n key={m}\n type=\"button\"\n onClick={() => toggleMode(m)}\n aria-pressed={on}\n className={cn(\n \"inline-flex h-7 items-center rounded-full border px-3 font-mono text-body-sm transition-colors\",\n on\n ? \"border-primary bg-primary/15 text-primary\"\n : \"border-border/60 bg-card text-muted-foreground hover:text-foreground\",\n )}\n >\n {MODE_LABEL[m]}\n </button>\n );\n })}\n </div>\n <FormField.Hint>\n {modes.length === 0\n ? \"Empty = global (available in every mode).\"\n : `Only visible in: ${modes.map((m) => MODE_LABEL[m]).join(\", \")}.`}\n </FormField.Hint>\n </FormField>\n\n <footer className=\"flex items-center justify-between gap-2 border-border/40 border-t pt-4\">\n <div>\n {onDelete ? (\n <Button type=\"button\" variant=\"ghost\" onClick={onDelete}>\n Delete\n </Button>\n ) : null}\n </div>\n <div className=\"flex items-center gap-2\">\n {onCancel ? (\n <Button type=\"button\" variant=\"secondary\" onClick={onCancel}>\n Cancel\n </Button>\n ) : null}\n <Button type=\"submit\" disabled={!canSave}>\n {initial?.id ? \"Save changes\" : \"Create agent\"}\n </Button>\n </div>\n </footer>\n </form>\n );\n}\n"
24
+ "content": "\"use client\";\n\nimport { useState } from \"react\";\nimport type { FormEvent, HTMLAttributes } from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport { ALL_MODES, MODE_LABEL, type Mode } from \"@/types/mode\";\nimport type { AgentProfileDescriptor } from \"@/components/ui/agent-profile\";\nimport { Button } from \"@/components/ui/button\";\nimport { FormField } from \"@/components/ui/form-field\";\nimport { Input } from \"@/components/ui/input\";\nimport { Select } from \"@/components/ui/select\";\nimport { Textarea } from \"@/components/ui/textarea\";\n\n/**\n * AgentEditor — form for creating or editing an Agent persona.\n */\n\nexport interface AgentDraft extends Omit<AgentProfileDescriptor, \"id\"> {\n id?: string;\n systemPrompt?: string;\n model?: string;\n allowedTools?: string[];\n skillIds?: string[];\n /** Modes this agent is visible in. Omit / empty = global (all modes). */\n modes?: Mode[];\n}\n\ninterface AgentEditorProps extends Omit<HTMLAttributes<HTMLFormElement>, \"onSubmit\" | \"onChange\"> {\n initial?: Partial<AgentDraft>;\n models?: Array<{ id: string; label: string }>;\n skills?: Array<{ id: string; label: string }>;\n onSave: (draft: AgentDraft) => void;\n onCancel?: () => void;\n onDelete?: () => void;\n}\n\nconst TONES: Array<{ id: NonNullable<AgentProfileDescriptor[\"tone\"]>; label: string }> = [\n { id: \"primary\", label: \"Primary (violet)\" },\n { id: \"accent\", label: \"Accent (sienna)\" },\n { id: \"success\", label: \"Success (green)\" },\n { id: \"warning\", label: \"Warning (amber)\" },\n { id: \"info\", label: \"Info (blue)\" },\n { id: \"muted\", label: \"Muted (neutral)\" },\n];\n\nexport function AgentEditor({\n className,\n initial,\n models,\n skills,\n onSave,\n onCancel,\n onDelete,\n ...formProps\n}: AgentEditorProps) {\n const [name, setName] = useState(initial?.name ?? \"\");\n const [initials, setInitials] = useState(initial?.initials ?? \"\");\n const [description, setDescription] = useState(\n typeof initial?.description === \"string\" ? initial.description : \"\",\n );\n const [tone, setTone] = useState<NonNullable<AgentProfileDescriptor[\"tone\"]>>(\n initial?.tone ?? \"primary\",\n );\n const [model, setModel] = useState<string>(initial?.model ?? models?.[0]?.id ?? \"\");\n const [systemPrompt, setSystemPrompt] = useState(initial?.systemPrompt ?? \"\");\n const [allowedToolsRaw, setAllowedToolsRaw] = useState(initial?.allowedTools?.join(\", \") ?? \"\");\n const [skillsSelected, setSkillsSelected] = useState<Set<string>>(\n new Set(initial?.skillIds ?? []),\n );\n const [modes, setModes] = useState<Mode[]>(initial?.modes ?? []);\n\n // Note: state is only seeded once on mount. To reset the form when editing a\n // different agent, use the React `key` pattern at the call site:\n // <AgentEditor key={agent.id} initial={agent} ... />\n // This is the idiomatic React way (over a useEffect that watches prop deltas\n // and writes setters) — it guarantees a clean component instance per entity.\n const toggleMode = (m: Mode) =>\n setModes((prev) => (prev.includes(m) ? prev.filter((x) => x !== m) : [...prev, m]));\n\n const canSave = name.trim().length > 0;\n const handleSubmit = (e: FormEvent) => {\n e.preventDefault();\n if (!canSave) return;\n onSave({\n id: initial?.id,\n name: name.trim(),\n initials: initials.trim() || undefined,\n description: description.trim() || undefined,\n tone,\n model: model || undefined,\n systemPrompt: systemPrompt.trim() || undefined,\n allowedTools: allowedToolsRaw\n .split(\",\")\n .map((t) => t.trim())\n .filter(Boolean),\n skillIds: Array.from(skillsSelected),\n modes: modes.length > 0 ? modes : undefined,\n });\n };\n\n const toggleSkill = (id: string) => {\n setSkillsSelected((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n };\n\n return (\n <form\n data-slot=\"agent-editor\"\n onSubmit={handleSubmit}\n className={cn(\"flex h-full flex-col gap-4\", className)}\n {...formProps}\n >\n <div className=\"grid grid-cols-[1fr_auto] gap-3\">\n <FormField>\n <FormField.Label>Name</FormField.Label>\n <FormField.Control>\n <Input\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"Coder\"\n required\n />\n </FormField.Control>\n </FormField>\n <FormField className=\"w-24\">\n <FormField.Label>Initials</FormField.Label>\n <FormField.Control>\n <Input\n value={initials}\n onChange={(e) => setInitials(e.target.value.slice(0, 2).toUpperCase())}\n placeholder=\"CO\"\n maxLength={2}\n className=\"text-center font-mono uppercase\"\n />\n </FormField.Control>\n </FormField>\n </div>\n\n <FormField>\n <FormField.Label>Description</FormField.Label>\n <FormField.Control>\n <Input\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder=\"Writes code, edits files, runs verification.\"\n />\n </FormField.Control>\n </FormField>\n\n <div className=\"grid grid-cols-2 gap-3\">\n <FormField>\n <FormField.Label>Tone</FormField.Label>\n <FormField.Control>\n <Select\n value={tone}\n onValueChange={(v) => {\n // Re-audit Issue 7: narrow the string `v` against TONES.id\n // values before casting. Radix Select guarantees `v` is one\n // of the Select.Item values declared below, but adding the\n // runtime guard keeps the type narrowing explicit and\n // surfaces invalid future configurations as no-ops instead\n // of silently writing a bad state.\n const next = TONES.find((t) => t.id === v);\n if (next) setTone(next.id);\n }}\n >\n <Select.Trigger aria-label=\"Select tone\">\n <Select.Value />\n </Select.Trigger>\n <Select.Content>\n {TONES.map((t) => (\n <Select.Item key={t.id} value={t.id}>\n {t.label}\n </Select.Item>\n ))}\n </Select.Content>\n </Select>\n </FormField.Control>\n </FormField>\n {models && models.length > 0 ? (\n <FormField>\n <FormField.Label>Model</FormField.Label>\n <FormField.Control>\n <Select value={model} onValueChange={setModel}>\n <Select.Trigger aria-label=\"Select model\">\n <Select.Value />\n </Select.Trigger>\n <Select.Content>\n {models.map((m) => (\n <Select.Item key={m.id} value={m.id}>\n {m.label}\n </Select.Item>\n ))}\n </Select.Content>\n </Select>\n </FormField.Control>\n </FormField>\n ) : null}\n </div>\n\n <FormField className=\"flex-1\">\n <FormField.Label>System prompt override</FormField.Label>\n <FormField.Control>\n <Textarea\n value={systemPrompt}\n onChange={(e) => setSystemPrompt(e.target.value)}\n rows={6}\n placeholder=\"You are the Coder. You write code, edit files, and run verification…\"\n className=\"min-h-[10rem] flex-1 font-mono text-code-sm\"\n />\n </FormField.Control>\n <FormField.Hint>Leave empty to inherit the workspace default.</FormField.Hint>\n </FormField>\n\n <FormField>\n <FormField.Label>Allowed tools</FormField.Label>\n <FormField.Control>\n <Input\n value={allowedToolsRaw}\n onChange={(e) => setAllowedToolsRaw(e.target.value)}\n placeholder=\"Read, Edit, Bash\"\n />\n </FormField.Control>\n </FormField>\n\n {skills && skills.length > 0 ? (\n <FormField>\n <FormField.Label>Linked skills</FormField.Label>\n <div className=\"flex flex-wrap gap-1.5\">\n {skills.map((s) => {\n const on = skillsSelected.has(s.id);\n return (\n <button\n key={s.id}\n type=\"button\"\n onClick={() => toggleSkill(s.id)}\n aria-pressed={on}\n className={cn(\n \"inline-flex h-7 items-center rounded-full border px-3 font-mono text-body-sm transition-colors\",\n on\n ? \"border-primary bg-primary/15 text-primary\"\n : \"border-border/60 bg-card text-muted-foreground hover:text-foreground\",\n )}\n >\n {s.label}\n </button>\n );\n })}\n </div>\n </FormField>\n ) : null}\n\n <FormField>\n <FormField.Label>Active modes</FormField.Label>\n <div className=\"flex flex-wrap gap-1.5\">\n {ALL_MODES.map((m) => {\n const on = modes.includes(m);\n return (\n <button\n key={m}\n type=\"button\"\n onClick={() => toggleMode(m)}\n aria-pressed={on}\n className={cn(\n \"inline-flex h-7 items-center rounded-full border px-3 font-mono text-body-sm transition-colors\",\n on\n ? \"border-primary bg-primary/15 text-primary\"\n : \"border-border/60 bg-card text-muted-foreground hover:text-foreground\",\n )}\n >\n {MODE_LABEL[m]}\n </button>\n );\n })}\n </div>\n <FormField.Hint>\n {modes.length === 0\n ? \"Empty = global (available in every mode).\"\n : `Only visible in: ${modes.map((m) => MODE_LABEL[m]).join(\", \")}.`}\n </FormField.Hint>\n </FormField>\n\n <footer className=\"flex items-center justify-between gap-2 border-border/40 border-t pt-4\">\n <div>\n {onDelete ? (\n <Button type=\"button\" variant=\"ghost\" onClick={onDelete}>\n Delete\n </Button>\n ) : null}\n </div>\n <div className=\"flex items-center gap-2\">\n {onCancel ? (\n <Button type=\"button\" variant=\"secondary\" onClick={onCancel}>\n Cancel\n </Button>\n ) : null}\n <Button type=\"submit\" disabled={!canSave}>\n {initial?.id ? \"Save changes\" : \"Create agent\"}\n </Button>\n </div>\n </footer>\n </form>\n );\n}\n"
25
25
  }
26
26
  ]
27
27
  }
@@ -16,7 +16,7 @@
16
16
  "path": "components/primitives/agent-error-card/agent-error-card.tsx",
17
17
  "type": "registry:ui",
18
18
  "target": "components/ui/agent-error-card.tsx",
19
- "content": "import {\n AlertOctagon,\n Database,\n KeyRound,\n type LucideIcon,\n Network,\n ShieldOff,\n} from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport { useInLiveRegion } from \"@/lib/live-region-context\";\n\n/**\n * AgentErrorCard — inline error / blocked-state card for an agent stream.\n *\n * Renders when the agent run hits a wall it can't recover from on its own:\n * rate limit, context overflow, auth lost, tool failure, network error.\n * Severity is always destructive; the `kind` drives the icon and helps the\n * consumer wire recovery actions in the footer slot.\n */\n\nexport type AgentErrorKind =\n | \"rate-limit\"\n | \"context-overflow\"\n | \"auth\"\n | \"tool-failure\"\n | \"network\"\n | \"generic\";\n\nconst ICON_FOR_KIND: Record<AgentErrorKind, LucideIcon> = {\n \"rate-limit\": Database,\n \"context-overflow\": ShieldOff,\n auth: KeyRound,\n \"tool-failure\": AlertOctagon,\n network: Network,\n generic: AlertOctagon,\n};\n\ninterface AgentErrorCardProps extends Omit<HTMLAttributes<HTMLElement>, \"title\"> {\n kind?: AgentErrorKind;\n title: ReactNode;\n detail?: ReactNode;\n /** Recovery action slot (Retry, Reset, Re-auth, etc.). */\n actions?: ReactNode;\n timestamp?: ReactNode;\n}\n\nconst AgentErrorCard = forwardRef<HTMLElement, AgentErrorCardProps>(\n ({ className, kind = \"generic\", title, detail, actions, timestamp, ...props }, ref) => {\n const Icon = ICON_FOR_KIND[kind];\n // T4.1 (MF-4): omit own aria-live when nested in a container live region.\n // role=\"alert\" stays — alerts should announce even via outer region —\n // but we drop the explicit aria-live=\"assertive\" attribute so AT doesn't\n // see two competing live region declarations.\n const inLiveRegion = useInLiveRegion();\n return (\n <section\n ref={ref}\n role=\"alert\"\n aria-live={inLiveRegion ? undefined : \"assertive\"}\n className={cn(\n \"grid w-full gap-3 rounded-xl border border-destructive/40 bg-destructive/5 p-4\",\n className,\n )}\n {...props}\n >\n <header className=\"flex items-start gap-3\">\n <span className=\"mt-0.5 inline-flex shrink-0 text-destructive\" aria-hidden=\"true\">\n <Icon className=\"size-4\" />\n </span>\n <div className=\"grid min-w-0 flex-1 gap-1\">\n <div className=\"flex items-baseline justify-between gap-2\">\n <h4 className=\"font-display text-foreground text-title-md tracking-tight\">{title}</h4>\n {timestamp ? (\n <span className=\"shrink-0 font-mono text-label text-muted-foreground tabular-nums\">\n {timestamp}\n </span>\n ) : null}\n </div>\n {detail ? (\n <p className=\"break-words font-mono text-code-sm text-muted-foreground\">{detail}</p>\n ) : null}\n </div>\n </header>\n {actions ? (\n <footer className=\"flex flex-wrap items-center justify-end gap-2\">{actions}</footer>\n ) : null}\n </section>\n );\n },\n);\nAgentErrorCard.displayName = \"AgentErrorCard\";\n\nexport { AgentErrorCard };\n"
19
+ "content": "import {\n AlertOctagon,\n Database,\n KeyRound,\n type LucideIcon,\n Network,\n ShieldOff,\n} from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport { useInLiveRegion } from \"@/lib/live-region-context\";\n\n/**\n * AgentErrorCard — inline error / blocked-state card for an agent stream.\n *\n * Renders when the agent run hits a wall it can't recover from on its own:\n * rate limit, context overflow, auth lost, tool failure, network error.\n * Severity is always destructive; the `kind` drives the icon and helps the\n * consumer wire recovery actions in the footer slot.\n */\n\nexport type AgentErrorKind =\n | \"rate-limit\"\n | \"context-overflow\"\n | \"auth\"\n | \"tool-failure\"\n | \"network\"\n | \"generic\";\n\nconst ICON_FOR_KIND: Record<AgentErrorKind, LucideIcon> = {\n \"rate-limit\": Database,\n \"context-overflow\": ShieldOff,\n auth: KeyRound,\n \"tool-failure\": AlertOctagon,\n network: Network,\n generic: AlertOctagon,\n};\n\n/**\n * G5 T2.3 — derive an AgentErrorKind from a TheoErrorEnvelope `code` string.\n *\n * Maps the canonical TheoErrorCode union (theokit/server + @theokit/sdk\n * cross-layer envelope) to the AgentErrorKind that drives the icon + visual\n * severity in this primitive. Unknown codes fall back to 'generic'.\n *\n * Consumer pattern (without coupling to theokit/server types):\n *\n * ```tsx\n * <AgentErrorCard envelopeCode={env.code} title={env.message} />\n * ```\n *\n * Or use the helper directly when fully controlling the kind prop:\n *\n * ```tsx\n * <AgentErrorCard kind={kindFromEnvelopeCode(env.code)} title={env.message} />\n * ```\n */\nexport function kindFromEnvelopeCode(code: string): AgentErrorKind {\n switch (code) {\n case \"UNAUTHORIZED\":\n case \"FORBIDDEN\":\n case \"PROVIDER_KEY_MISSING\":\n return \"auth\";\n case \"RATE_LIMITED\":\n case \"TOO_MANY_REQUESTS\":\n case \"CREDENTIAL_POOL_EXHAUSTED\":\n return \"rate-limit\";\n case \"BAD_GATEWAY\":\n case \"SERVICE_UNAVAILABLE\":\n case \"GATEWAY_TIMEOUT\":\n return \"network\";\n case \"AGENT_RUN_ERROR\":\n return \"tool-failure\";\n case \"PAYLOAD_TOO_LARGE\":\n case \"CONTENT_TOO_LARGE\":\n return \"context-overflow\";\n default:\n return \"generic\";\n }\n}\n\ninterface AgentErrorCardProps extends Omit<HTMLAttributes<HTMLElement>, \"title\"> {\n kind?: AgentErrorKind;\n /**\n * G5 T2.3 — canonical TheoErrorCode (e.g. `\"UNAUTHORIZED\"`, `\"RATE_LIMITED\"`)\n * used to derive `kind` automatically. The explicit `kind` prop takes\n * precedence when both are passed. Pass `envelope.code` from a\n * `TheoErrorEnvelope` directly — no coupling to theokit/server types.\n */\n envelopeCode?: string;\n title: ReactNode;\n detail?: ReactNode;\n /** Recovery action slot (Retry, Reset, Re-auth, etc.). */\n actions?: ReactNode;\n timestamp?: ReactNode;\n}\n\nconst AgentErrorCard = forwardRef<HTMLElement, AgentErrorCardProps>(\n ({ className, kind, envelopeCode, title, detail, actions, timestamp, ...props }, ref) => {\n // G5 T2.3: explicit `kind` wins; otherwise derive from envelopeCode; else 'generic'.\n const effectiveKind: AgentErrorKind =\n kind ?? (envelopeCode !== undefined ? kindFromEnvelopeCode(envelopeCode) : \"generic\");\n const Icon = ICON_FOR_KIND[effectiveKind];\n // T4.1 (MF-4): omit own aria-live when nested in a container live region.\n // role=\"alert\" stays — alerts should announce even via outer region —\n // but we drop the explicit aria-live=\"assertive\" attribute so AT doesn't\n // see two competing live region declarations.\n const inLiveRegion = useInLiveRegion();\n return (\n <section\n data-slot=\"agent-error-card\"\n ref={ref}\n role=\"alert\"\n aria-live={inLiveRegion ? undefined : \"assertive\"}\n className={cn(\n \"grid w-full gap-3 rounded-xl border border-destructive/40 bg-destructive/5 p-4\",\n className,\n )}\n {...props}\n >\n <header className=\"flex items-start gap-3\">\n <span className=\"mt-0.5 inline-flex shrink-0 text-destructive\" aria-hidden=\"true\">\n <Icon className=\"size-4\" />\n </span>\n <div className=\"grid min-w-0 flex-1 gap-1\">\n <div className=\"flex items-baseline justify-between gap-2\">\n <h4 className=\"font-display text-foreground text-title-md tracking-tight\">{title}</h4>\n {timestamp ? (\n <span className=\"shrink-0 font-mono text-label text-muted-foreground tabular-nums\">\n {timestamp}\n </span>\n ) : null}\n </div>\n {detail ? (\n <p className=\"break-words font-mono text-code-sm text-muted-foreground\">{detail}</p>\n ) : null}\n </div>\n </header>\n {actions ? (\n <footer className=\"flex flex-wrap items-center justify-end gap-2\">{actions}</footer>\n ) : null}\n </section>\n );\n },\n);\nAgentErrorCard.displayName = \"AgentErrorCard\";\n\nexport { AgentErrorCard };\n"
20
20
  }
21
21
  ]
22
22
  }
@@ -18,7 +18,7 @@
18
18
  "path": "components/primitives/agent-event/agent-event.tsx",
19
19
  "type": "registry:ui",
20
20
  "target": "components/ui/agent-event.tsx",
21
- "content": "import {\n AlertTriangle,\n CheckCircle2,\n ChevronRight,\n CircleDot,\n Edit3,\n FilePlus,\n FileSearch,\n Hammer,\n Loader2,\n ShieldCheck,\n Terminal,\n Wrench,\n} from \"lucide-react\";\nimport { forwardRef, useState } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport type { IconComponent } from \"@/lib/types\";\nimport type {\n AgentEvent as AgentEventModel,\n AgentEventStatus,\n AgentEventType,\n} from \"@/types/agent\";\n\nconst typeIcon: Record<AgentEventType, IconComponent> = {\n command: Terminal,\n file_read: FileSearch,\n file_write: FilePlus,\n edit: Edit3,\n lint: ShieldCheck,\n typecheck: ShieldCheck,\n build: Hammer,\n tool: Wrench,\n};\n\nconst statusIcon: Record<AgentEventStatus, IconComponent> = {\n pending: CircleDot,\n running: Loader2,\n success: CheckCircle2,\n failed: AlertTriangle,\n};\n\nconst statusColor: Record<AgentEventStatus, string> = {\n pending: \"text-muted-foreground\",\n running: \"text-primary\",\n success: \"text-success\",\n failed: \"text-destructive\",\n};\n\ninterface AgentEventProps extends HTMLAttributes<HTMLDivElement> {\n event: AgentEventModel;\n /**\n * If true, clicking the row toggles `event.detail` visibility.\n */\n collapsible?: boolean;\n /**\n * Force the collapsible state (for controlled scenarios).\n */\n defaultOpen?: boolean;\n}\n\n/**\n * AgentEvent — single event row in the agent timeline.\n *\n * Composition: type icon + label + path + diff stats + status icon + (optional) chevron.\n * Running events show a spinner via motion-safe:animate-spin (respects\n * `prefers-reduced-motion`); failed events flash red.\n *\n * When `collapsible` is true and `event.detail` is provided, the row renders as\n * a native `<button>` for correct keyboard and screen-reader semantics.\n */\nconst AgentEvent = forwardRef<HTMLDivElement, AgentEventProps>(\n ({ className, event, collapsible, defaultOpen, ...props }, ref) => {\n const [open, setOpen] = useState(defaultOpen ?? false);\n const TypeIcon = typeIcon[event.type];\n const StatusIcon = statusIcon[event.status];\n const isExpandable = !!(collapsible && event.detail !== undefined);\n\n const handleToggle = () => {\n if (isExpandable) setOpen((v) => !v);\n };\n\n const headerContent: ReactNode = (\n <>\n <span className=\"grid size-7 place-items-center rounded-md bg-muted text-muted-foreground\">\n <TypeIcon className=\"size-3.5\" />\n </span>\n <div className=\"min-w-0\">\n <p className=\"flex flex-wrap items-baseline gap-x-2 gap-y-0.5\">\n <span className=\"truncate font-medium text-body-sm text-foreground\">{event.label}</span>\n {event.path ? (\n <span className=\"truncate font-mono text-code-sm text-muted-foreground\">\n {event.path}\n </span>\n ) : null}\n {event.diff ? (\n <span className=\"font-mono text-code-sm\">\n <span className=\"text-success\">+{event.diff.added}</span>{\" \"}\n <span className=\"text-destructive\">-{event.diff.removed}</span>\n </span>\n ) : null}\n </p>\n {event.timestamp ? (\n <p className=\"font-mono text-label text-muted-foreground\">{event.timestamp}</p>\n ) : null}\n </div>\n <div className=\"flex items-center gap-1.5\">\n <StatusIcon\n className={cn(\n \"size-4\",\n statusColor[event.status],\n event.status === \"running\" && \"motion-safe:animate-spin\",\n )}\n aria-label={event.status}\n />\n {isExpandable ? (\n <ChevronRight\n className={cn(\n \"size-4 text-muted-foreground transition-transform\",\n open && \"rotate-90\",\n )}\n aria-hidden=\"true\"\n />\n ) : null}\n </div>\n </>\n );\n\n return (\n <div\n ref={ref}\n className={cn(\n \"rounded-md border border-transparent\",\n isExpandable && \"hover:border-border/40 hover:bg-muted/40\",\n className,\n )}\n {...props}\n >\n {isExpandable ? (\n <button\n type=\"button\"\n onClick={handleToggle}\n aria-expanded={open}\n className={cn(\n \"grid w-full grid-cols-[auto_1fr_auto] items-center gap-3 px-3 py-2 text-left\",\n \"cursor-pointer rounded-md\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n )}\n >\n {headerContent}\n </button>\n ) : (\n <div className=\"grid grid-cols-[auto_1fr_auto] items-center gap-3 px-3 py-2\">\n {headerContent}\n </div>\n )}\n {isExpandable && open ? (\n <div className=\"border-border/40 border-t bg-muted/20 px-3 py-2 font-mono text-code-sm text-muted-foreground\">\n {event.detail}\n </div>\n ) : null}\n </div>\n );\n },\n);\nAgentEvent.displayName = \"AgentEvent\";\n\nexport { AgentEvent };\n"
21
+ "content": "\"use client\";\n\nimport {\n AlertTriangle,\n CheckCircle2,\n ChevronRight,\n CircleDot,\n Edit3,\n FilePlus,\n FileSearch,\n Hammer,\n Loader2,\n ShieldCheck,\n Terminal,\n Wrench,\n} from \"lucide-react\";\nimport { forwardRef, useState } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport type { IconComponent } from \"@/lib/types\";\nimport type {\n AgentEvent as AgentEventModel,\n AgentEventStatus,\n AgentEventType,\n} from \"@/types/agent\";\n\nconst typeIcon: Record<AgentEventType, IconComponent> = {\n command: Terminal,\n file_read: FileSearch,\n file_write: FilePlus,\n edit: Edit3,\n lint: ShieldCheck,\n typecheck: ShieldCheck,\n build: Hammer,\n tool: Wrench,\n};\n\nconst statusIcon: Record<AgentEventStatus, IconComponent> = {\n pending: CircleDot,\n running: Loader2,\n success: CheckCircle2,\n failed: AlertTriangle,\n};\n\nconst statusColor: Record<AgentEventStatus, string> = {\n pending: \"text-muted-foreground\",\n running: \"text-primary\",\n success: \"text-success\",\n failed: \"text-destructive\",\n};\n\ninterface AgentEventProps extends HTMLAttributes<HTMLDivElement> {\n event: AgentEventModel;\n /**\n * If true, clicking the row toggles `event.detail` visibility.\n */\n collapsible?: boolean;\n /**\n * Force the collapsible state (for controlled scenarios).\n */\n defaultOpen?: boolean;\n}\n\n/**\n * AgentEvent — single event row in the agent timeline.\n *\n * Composition: type icon + label + path + diff stats + status icon + (optional) chevron.\n * Running events show a spinner via motion-safe:animate-spin (respects\n * `prefers-reduced-motion`); failed events flash red.\n *\n * When `collapsible` is true and `event.detail` is provided, the row renders as\n * a native `<button>` for correct keyboard and screen-reader semantics.\n */\nconst AgentEvent = forwardRef<HTMLDivElement, AgentEventProps>(\n ({ className, event, collapsible, defaultOpen, ...props }, ref) => {\n const [open, setOpen] = useState(defaultOpen ?? false);\n const TypeIcon = typeIcon[event.type];\n const StatusIcon = statusIcon[event.status];\n const isExpandable = !!(collapsible && event.detail !== undefined);\n\n const handleToggle = () => {\n if (isExpandable) setOpen((v) => !v);\n };\n\n const headerContent: ReactNode = (\n <>\n <span className=\"grid size-7 place-items-center rounded-md bg-muted text-muted-foreground\">\n <TypeIcon className=\"size-3.5\" />\n </span>\n <div className=\"min-w-0\">\n <p className=\"flex flex-wrap items-baseline gap-x-2 gap-y-0.5\">\n <span className=\"truncate font-medium text-body-sm text-foreground\">{event.label}</span>\n {event.path ? (\n <span className=\"truncate font-mono text-code-sm text-muted-foreground\">\n {event.path}\n </span>\n ) : null}\n {event.diff ? (\n <span className=\"font-mono text-code-sm\">\n <span className=\"text-success\">+{event.diff.added}</span>{\" \"}\n <span className=\"text-destructive\">-{event.diff.removed}</span>\n </span>\n ) : null}\n </p>\n {event.timestamp ? (\n <p className=\"font-mono text-label text-muted-foreground\">{event.timestamp}</p>\n ) : null}\n </div>\n <div className=\"flex items-center gap-1.5\">\n <StatusIcon\n className={cn(\n \"size-4\",\n statusColor[event.status],\n event.status === \"running\" && \"motion-safe:animate-spin\",\n )}\n aria-label={event.status}\n />\n {isExpandable ? (\n <ChevronRight\n className={cn(\n \"size-4 text-muted-foreground transition-transform\",\n open && \"rotate-90\",\n )}\n aria-hidden=\"true\"\n />\n ) : null}\n </div>\n </>\n );\n\n return (\n <div\n data-slot=\"agent-event\"\n ref={ref}\n className={cn(\n \"rounded-md border border-transparent\",\n isExpandable && \"hover:border-border/40 hover:bg-muted/40\",\n className,\n )}\n {...props}\n >\n {isExpandable ? (\n <button\n type=\"button\"\n onClick={handleToggle}\n aria-expanded={open}\n className={cn(\n \"grid w-full grid-cols-[auto_1fr_auto] items-center gap-3 px-3 py-2 text-left\",\n \"cursor-pointer rounded-md\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n )}\n >\n {headerContent}\n </button>\n ) : (\n <div className=\"grid grid-cols-[auto_1fr_auto] items-center gap-3 px-3 py-2\">\n {headerContent}\n </div>\n )}\n {isExpandable && open ? (\n <div className=\"border-border/40 border-t bg-muted/20 px-3 py-2 font-mono text-code-sm text-muted-foreground\">\n {event.detail}\n </div>\n ) : null}\n </div>\n );\n },\n);\nAgentEvent.displayName = \"AgentEvent\";\n\nexport { AgentEvent };\n"
22
22
  }
23
23
  ]
24
24
  }
@@ -16,7 +16,7 @@
16
16
  "path": "components/primitives/agent-handoff/agent-handoff.tsx",
17
17
  "type": "registry:ui",
18
18
  "target": "components/ui/agent-handoff.tsx",
19
- "content": "import { ArrowRight } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/lib/cn\";\n\nexport interface HandoffParty {\n /** Display name, e.g. \"planner\". */\n name: string;\n /** Optional avatar initials (max 2 chars). */\n initials?: string;\n /** Identity tone matching AgentProfile. */\n tone?: \"primary\" | \"accent\" | \"success\" | \"warning\" | \"info\" | \"muted\";\n}\n\ninterface AgentHandoffProps extends HTMLAttributes<HTMLElement> {\n from: HandoffParty;\n to: HandoffParty;\n /** What is being handed off — short reason / payload preview. */\n reason: ReactNode;\n /** Optional metadata footer (e.g. timestamp, token budget). */\n footer?: ReactNode;\n}\n\nconst TONE_CLASS: Record<NonNullable<HandoffParty[\"tone\"]>, string> = {\n primary: \"bg-primary text-primary-foreground\",\n accent: \"bg-accent text-accent-foreground\",\n success: \"bg-success text-success-foreground\",\n warning: \"bg-warning text-warning-foreground\",\n info: \"bg-info text-info-foreground\",\n muted: \"bg-muted text-foreground\",\n};\n\nfunction Avatar({ party }: { party: HandoffParty }) {\n const inits = party.initials ?? party.name.slice(0, 2).toUpperCase();\n return (\n <span className=\"inline-flex items-center gap-2\">\n <span\n className={cn(\n \"grid size-7 place-items-center rounded-full font-bold font-mono text-label\",\n TONE_CLASS[party.tone ?? \"primary\"],\n )}\n aria-hidden=\"true\"\n >\n {inits}\n </span>\n <span className=\"font-medium font-mono text-code-sm text-foreground\">{party.name}</span>\n </span>\n );\n}\n\n/**\n * AgentHandoff — visual marker of one agent delegating to another. Pairs\n * with AgentProfile for the identity tones; place it in the timeline so the\n * user sees the baton being passed.\n */\nconst AgentHandoff = forwardRef<HTMLElement, AgentHandoffProps>(\n ({ className, from, to, reason, footer, ...props }, ref) => (\n <article\n ref={ref}\n className={cn(\n \"grid gap-2 rounded-lg border border-primary/30 border-dashed bg-primary/5 px-4 py-3\",\n className,\n )}\n {...props}\n >\n <header className=\"flex items-center gap-2\">\n <Avatar party={from} />\n <ArrowRight className=\"size-4 text-primary\" aria-hidden=\"true\" />\n <Avatar party={to} />\n <span className=\"ml-auto font-mono text-label-caps text-muted-foreground uppercase tracking-wider\">\n handoff\n </span>\n </header>\n <p className=\"text-body-sm text-foreground\">{reason}</p>\n {footer ? <p className=\"font-mono text-label text-muted-foreground\">{footer}</p> : null}\n </article>\n ),\n);\nAgentHandoff.displayName = \"AgentHandoff\";\n\nexport { AgentHandoff };\n"
19
+ "content": "import { ArrowRight } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/lib/cn\";\n\nexport interface HandoffParty {\n /** Display name, e.g. \"planner\". */\n name: string;\n /** Optional avatar initials (max 2 chars). */\n initials?: string;\n /** Identity tone matching AgentProfile. */\n tone?: \"primary\" | \"accent\" | \"success\" | \"warning\" | \"info\" | \"muted\";\n}\n\ninterface AgentHandoffProps extends HTMLAttributes<HTMLElement> {\n from: HandoffParty;\n to: HandoffParty;\n /** What is being handed off — short reason / payload preview. */\n reason: ReactNode;\n /** Optional metadata footer (e.g. timestamp, token budget). */\n footer?: ReactNode;\n}\n\nconst TONE_CLASS: Record<NonNullable<HandoffParty[\"tone\"]>, string> = {\n primary: \"bg-primary text-primary-foreground\",\n accent: \"bg-accent text-accent-foreground\",\n success: \"bg-success text-success-foreground\",\n warning: \"bg-warning text-warning-foreground\",\n info: \"bg-info text-info-foreground\",\n muted: \"bg-muted text-foreground\",\n};\n\nfunction Avatar({ party }: { party: HandoffParty }) {\n const inits = party.initials ?? party.name.slice(0, 2).toUpperCase();\n return (\n <span className=\"inline-flex items-center gap-2\">\n <span\n className={cn(\n \"grid size-7 place-items-center rounded-full font-bold font-mono text-label\",\n TONE_CLASS[party.tone ?? \"primary\"],\n )}\n aria-hidden=\"true\"\n >\n {inits}\n </span>\n <span className=\"font-medium font-mono text-code-sm text-foreground\">{party.name}</span>\n </span>\n );\n}\n\n/**\n * AgentHandoff — visual marker of one agent delegating to another. Pairs\n * with AgentProfile for the identity tones; place it in the timeline so the\n * user sees the baton being passed.\n */\nconst AgentHandoff = forwardRef<HTMLElement, AgentHandoffProps>(\n ({ className, from, to, reason, footer, ...props }, ref) => (\n <article\n data-slot=\"agent-handoff\"\n ref={ref}\n className={cn(\n \"grid gap-2 rounded-lg border border-primary/30 border-dashed bg-primary/5 px-4 py-3\",\n className,\n )}\n {...props}\n >\n <header className=\"flex items-center gap-2\">\n <Avatar party={from} />\n <ArrowRight className=\"size-4 text-primary\" aria-hidden=\"true\" />\n <Avatar party={to} />\n <span className=\"ml-auto font-mono text-label-caps text-muted-foreground uppercase tracking-wider\">\n handoff\n </span>\n </header>\n <p className=\"text-body-sm text-foreground\">{reason}</p>\n {footer ? <p className=\"font-mono text-label text-muted-foreground\">{footer}</p> : null}\n </article>\n ),\n);\nAgentHandoff.displayName = \"AgentHandoff\";\n\nexport { AgentHandoff };\n"
20
20
  }
21
21
  ]
22
22
  }
@@ -17,7 +17,7 @@
17
17
  "path": "components/primitives/agent-profile/agent-profile.tsx",
18
18
  "type": "registry:ui",
19
19
  "target": "components/ui/agent-profile.tsx",
20
- "content": "import * as DropdownMenu from \"@radix-ui/react-dropdown-menu\";\nimport { Check, ChevronDown, Sparkles } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { ButtonHTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/lib/cn\";\n\nexport interface AgentProfileDescriptor {\n id: string;\n /** Display name, e.g. \"Coder\", \"Planner\", \"Reviewer\". */\n name: string;\n /** Avatar initials (2 chars max). Falls back to first 2 letters of name. */\n initials?: string;\n /** Optional short description for tooltips and the dropdown. */\n description?: ReactNode;\n /**\n * Identity tone — colors the avatar so users tell agents apart at a glance.\n */\n tone?: \"primary\" | \"accent\" | \"success\" | \"warning\" | \"info\" | \"muted\";\n /** Optional badge text (e.g. \"experimental\"). */\n badge?: ReactNode;\n}\n\nconst TONE_CLASS: Record<NonNullable<AgentProfileDescriptor[\"tone\"]>, string> = {\n primary: \"bg-primary text-primary-foreground\",\n accent: \"bg-accent text-accent-foreground\",\n success: \"bg-success text-success-foreground\",\n warning: \"bg-warning text-warning-foreground\",\n info: \"bg-info text-info-foreground\",\n muted: \"bg-muted text-foreground\",\n};\n\ninterface AgentProfileProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"onChange\"> {\n agents: AgentProfileDescriptor[];\n activeId: string;\n onChange?: (id: string) => void;\n}\n\n/**\n * AgentProfile — switcher between multiple agent profiles (coder, planner,\n * reviewer, etc.). Each profile gets its own tone so the user can spot at a\n * glance which \"persona\" is currently driving the session.\n */\nconst AgentProfile = forwardRef<HTMLButtonElement, AgentProfileProps>(\n ({ className, agents, activeId, onChange, ...props }, ref) => {\n const active = agents.find((a) => a.id === activeId) ?? agents[0];\n if (!active) return null;\n const initials = active.initials ?? active.name.slice(0, 2).toUpperCase();\n return (\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <button\n ref={ref}\n type=\"button\"\n className={cn(\n \"inline-flex h-9 items-center gap-2 rounded-full border border-border/60 bg-card pr-3 pl-1\",\n \"transition-colors hover:bg-muted\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n className,\n )}\n {...props}\n >\n <span\n className={cn(\n \"grid size-7 place-items-center rounded-full font-bold font-mono text-label\",\n TONE_CLASS[active.tone ?? \"primary\"],\n )}\n aria-hidden=\"true\"\n >\n {initials}\n </span>\n <span className=\"font-medium font-sans text-body-sm text-foreground\">\n {active.name}\n </span>\n <ChevronDown className=\"size-3 text-muted-foreground\" aria-hidden=\"true\" />\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n align=\"start\"\n sideOffset={6}\n className={cn(\n \"z-50 min-w-[18rem] overflow-hidden rounded-lg border bg-popover p-1 text-popover-foreground shadow-md\",\n \"data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[state=open]:animate-in\",\n \"data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=closed]:animate-out\",\n )}\n >\n <DropdownMenu.Label className=\"px-2 py-1.5 font-mono text-label-caps text-muted-foreground uppercase tracking-wider\">\n Switch agent\n </DropdownMenu.Label>\n {agents.map((agent) => {\n const inits = agent.initials ?? agent.name.slice(0, 2).toUpperCase();\n const isActive = agent.id === activeId;\n return (\n <DropdownMenu.Item\n key={agent.id}\n onSelect={() => onChange?.(agent.id)}\n className={cn(\n \"flex cursor-pointer items-start gap-3 rounded-md px-2 py-2\",\n \"focus:bg-muted focus:outline-none data-[highlighted]:bg-muted\",\n )}\n >\n <span\n className={cn(\n \"mt-0.5 grid size-8 place-items-center rounded-full font-bold font-mono text-label\",\n TONE_CLASS[agent.tone ?? \"muted\"],\n )}\n aria-hidden=\"true\"\n >\n {inits}\n </span>\n <div className=\"grid min-w-0 flex-1 gap-0.5\">\n <span className=\"flex items-center gap-2\">\n <span className=\"font-medium text-body-sm\">{agent.name}</span>\n {agent.badge ? (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-accent/15 px-1.5 py-0 font-mono text-accent text-label uppercase\">\n <Sparkles className=\"size-2.5\" aria-hidden=\"true\" />\n {agent.badge}\n </span>\n ) : null}\n </span>\n {agent.description ? (\n <span className=\"text-body-sm text-muted-foreground\">\n {agent.description}\n </span>\n ) : null}\n </div>\n {isActive ? (\n <Check className=\"mt-1 size-4 shrink-0 text-primary\" aria-hidden=\"true\" />\n ) : null}\n </DropdownMenu.Item>\n );\n })}\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n );\n },\n);\nAgentProfile.displayName = \"AgentProfile\";\n\nexport { AgentProfile };\n"
20
+ "content": "import * as DropdownMenu from \"@radix-ui/react-dropdown-menu\";\nimport { Check, ChevronDown, Sparkles } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { ButtonHTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/lib/cn\";\n\nexport interface AgentProfileDescriptor {\n id: string;\n /** Display name, e.g. \"Coder\", \"Planner\", \"Reviewer\". */\n name: string;\n /** Avatar initials (2 chars max). Falls back to first 2 letters of name. */\n initials?: string;\n /** Optional short description for tooltips and the dropdown. */\n description?: ReactNode;\n /**\n * Identity tone — colors the avatar so users tell agents apart at a glance.\n */\n tone?: \"primary\" | \"accent\" | \"success\" | \"warning\" | \"info\" | \"muted\";\n /** Optional badge text (e.g. \"experimental\"). */\n badge?: ReactNode;\n}\n\nconst TONE_CLASS: Record<NonNullable<AgentProfileDescriptor[\"tone\"]>, string> = {\n primary: \"bg-primary text-primary-foreground\",\n accent: \"bg-accent text-accent-foreground\",\n success: \"bg-success text-success-foreground\",\n warning: \"bg-warning text-warning-foreground\",\n info: \"bg-info text-info-foreground\",\n muted: \"bg-muted text-foreground\",\n};\n\ninterface AgentProfileProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"onChange\"> {\n agents: AgentProfileDescriptor[];\n activeId: string;\n onChange?: (id: string) => void;\n}\n\n/**\n * AgentProfile — switcher between multiple agent profiles (coder, planner,\n * reviewer, etc.). Each profile gets its own tone so the user can spot at a\n * glance which \"persona\" is currently driving the session.\n */\nconst AgentProfile = forwardRef<HTMLButtonElement, AgentProfileProps>(\n ({ className, agents, activeId, onChange, ...props }, ref) => {\n const active = agents.find((a) => a.id === activeId) ?? agents[0];\n if (!active) return null;\n const initials = active.initials ?? active.name.slice(0, 2).toUpperCase();\n return (\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <button\n data-slot=\"agent-profile\"\n ref={ref}\n type=\"button\"\n className={cn(\n \"inline-flex h-9 items-center gap-2 rounded-full border border-border/60 bg-card pr-3 pl-1\",\n \"transition-colors hover:bg-muted\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n className,\n )}\n {...props}\n >\n <span\n className={cn(\n \"grid size-7 place-items-center rounded-full font-bold font-mono text-label\",\n TONE_CLASS[active.tone ?? \"primary\"],\n )}\n aria-hidden=\"true\"\n >\n {initials}\n </span>\n <span className=\"font-medium font-sans text-body-sm text-foreground\">\n {active.name}\n </span>\n <ChevronDown className=\"size-3 text-muted-foreground\" aria-hidden=\"true\" />\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n align=\"start\"\n sideOffset={6}\n className={cn(\n \"z-50 min-w-[18rem] overflow-hidden rounded-lg border bg-popover p-1 text-popover-foreground shadow-md\",\n \"data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[state=open]:animate-in\",\n \"data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=closed]:animate-out\",\n )}\n >\n <DropdownMenu.Label className=\"px-2 py-1.5 font-mono text-label-caps text-muted-foreground uppercase tracking-wider\">\n Switch agent\n </DropdownMenu.Label>\n {agents.map((agent) => {\n const inits = agent.initials ?? agent.name.slice(0, 2).toUpperCase();\n const isActive = agent.id === activeId;\n return (\n <DropdownMenu.Item\n key={agent.id}\n onSelect={() => onChange?.(agent.id)}\n className={cn(\n \"flex cursor-pointer items-start gap-3 rounded-md px-2 py-2\",\n \"focus:bg-muted focus:outline-none data-[highlighted]:bg-muted\",\n )}\n >\n <span\n className={cn(\n \"mt-0.5 grid size-8 place-items-center rounded-full font-bold font-mono text-label\",\n TONE_CLASS[agent.tone ?? \"muted\"],\n )}\n aria-hidden=\"true\"\n >\n {inits}\n </span>\n <div className=\"grid min-w-0 flex-1 gap-0.5\">\n <span className=\"flex items-center gap-2\">\n <span className=\"font-medium text-body-sm\">{agent.name}</span>\n {agent.badge ? (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-accent/15 px-1.5 py-0 font-mono text-accent text-label uppercase\">\n <Sparkles className=\"size-2.5\" aria-hidden=\"true\" />\n {agent.badge}\n </span>\n ) : null}\n </span>\n {agent.description ? (\n <span className=\"text-body-sm text-muted-foreground\">\n {agent.description}\n </span>\n ) : null}\n </div>\n {isActive ? (\n <Check className=\"mt-1 size-4 shrink-0 text-primary\" aria-hidden=\"true\" />\n ) : null}\n </DropdownMenu.Item>\n );\n })}\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n );\n },\n);\nAgentProfile.displayName = \"AgentProfile\";\n\nexport { AgentProfile };\n"
21
21
  }
22
22
  ]
23
23
  }
@@ -16,7 +16,7 @@
16
16
  "path": "components/primitives/agent-starting-state/agent-starting-state.tsx",
17
17
  "type": "registry:ui",
18
18
  "target": "components/ui/agent-starting-state.tsx",
19
- "content": "import { Loader2 } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { OutputHTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport { useInLiveRegion } from \"@/lib/live-region-context\";\n\ninterface AgentStartingStateProps extends OutputHTMLAttributes<HTMLOutputElement> {\n /** Title shown next to the spinner. Default \"Starting up…\". */\n label?: ReactNode;\n /** Optional secondary copy explaining the bootstrap step. */\n hint?: ReactNode;\n}\n\n/**\n * AgentStartingState — full-width skeleton shown while the agent boots.\n *\n * Visual: violet spinner + label, optional hint below. Wrapped in a soft card.\n * Uses semantic `<output aria-live=\"polite\">` so screen readers announce the state.\n */\nconst AgentStartingState = forwardRef<HTMLOutputElement, AgentStartingStateProps>(\n ({ className, label = \"Starting up…\", hint, ...props }, ref) => {\n // T4.1 (MF-4): omit aria-live when nested inside a container live region.\n const inLiveRegion = useInLiveRegion();\n return (\n <output\n ref={ref}\n aria-live={inLiveRegion ? undefined : \"polite\"}\n className={cn(\n \"flex items-center gap-3 rounded-xl border border-primary/30 border-dashed bg-primary/5 px-4 py-3\",\n className,\n )}\n {...props}\n >\n <Loader2 className=\"size-4 animate-spin text-primary\" aria-hidden=\"true\" />\n <div className=\"grid\">\n <span className=\"font-medium text-body-sm text-foreground\">{label}</span>\n {hint ? <span className=\"text-body-sm text-muted-foreground\">{hint}</span> : null}\n </div>\n </output>\n );\n },\n);\nAgentStartingState.displayName = \"AgentStartingState\";\n\nexport { AgentStartingState };\n"
19
+ "content": "import { Loader2 } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { OutputHTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport { useInLiveRegion } from \"@/lib/live-region-context\";\n\ninterface AgentStartingStateProps extends OutputHTMLAttributes<HTMLOutputElement> {\n /** Title shown next to the spinner. Default \"Starting up…\". */\n label?: ReactNode;\n /** Optional secondary copy explaining the bootstrap step. */\n hint?: ReactNode;\n}\n\n/**\n * AgentStartingState — full-width skeleton shown while the agent boots.\n *\n * Visual: violet spinner + label, optional hint below. Wrapped in a soft card.\n * Uses semantic `<output aria-live=\"polite\">` so screen readers announce the state.\n */\nconst AgentStartingState = forwardRef<HTMLOutputElement, AgentStartingStateProps>(\n ({ className, label = \"Starting up…\", hint, ...props }, ref) => {\n // T4.1 (MF-4): omit aria-live when nested inside a container live region.\n const inLiveRegion = useInLiveRegion();\n return (\n <output\n data-slot=\"agent-starting-state\"\n ref={ref}\n aria-live={inLiveRegion ? undefined : \"polite\"}\n className={cn(\n \"flex items-center gap-3 rounded-xl border border-primary/30 border-dashed bg-primary/5 px-4 py-3\",\n className,\n )}\n {...props}\n >\n <Loader2 className=\"size-4 animate-spin text-primary\" aria-hidden=\"true\" />\n <div className=\"grid\">\n <span className=\"font-medium text-body-sm text-foreground\">{label}</span>\n {hint ? <span className=\"text-body-sm text-muted-foreground\">{hint}</span> : null}\n </div>\n </output>\n );\n },\n);\nAgentStartingState.displayName = \"AgentStartingState\";\n\nexport { AgentStartingState };\n"
20
20
  }
21
21
  ]
22
22
  }
@@ -21,7 +21,7 @@
21
21
  "path": "components/composites/agent-stream/agent-stream.tsx",
22
22
  "type": "registry:ui",
23
23
  "target": "components/ui/agent-stream.tsx",
24
- "content": "import { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport { LiveRegionProvider } from \"@/lib/live-region-context\";\nimport type { IconComponent } from \"@/lib/types\";\nimport type { UIMessage } from \"@/types/chat\";\nimport { AgentErrorCard, type AgentErrorKind } from \"@/components/ui/agent-error-card\";\nimport { AgentStreaming } from \"@/components/ui/agent-streaming\";\nimport { ToolCallCard, type ToolCallStatus } from \"@/components/ui/tool-call-card\";\nimport { ApprovalCard, type ApprovalSeverity } from \"@/components/blocks/approval-card\";\nimport { ChatMessage } from \"@/components/ui/chat-message/index\";\n\n/**\n * AgentStream — the canonical conversation surface for a code agent.\n *\n * Interleaves chat messages (user + assistant), tool invocations, approval\n * gates, errors, and the live streaming indicator. Mirrors how Claude Code\n * presents work to the user: conversation-centric, tool calls embedded,\n * approvals pause the flow inline, errors surface where they happen.\n *\n * Items are rendered in array order. The consumer fully controls the data;\n * AgentStream is a pure presentational composite over its child primitives.\n */\n\ninterface ToolCallStreamItem {\n kind: \"tool-call\";\n id: string;\n tool: ReactNode;\n icon?: IconComponent;\n target?: ReactNode;\n status: ToolCallStatus;\n output?: ReactNode;\n defaultExpanded?: boolean;\n timestamp?: ReactNode;\n}\n\ninterface ApprovalStreamItem {\n kind: \"approval\";\n id: string;\n severity?: ApprovalSeverity;\n title: ReactNode;\n request: ReactNode;\n description?: ReactNode;\n details?: ReactNode;\n onApprove?: () => void;\n onDeny?: () => void;\n onAlways?: () => void;\n}\n\ninterface ErrorStreamItem {\n kind: \"error\";\n id: string;\n errorKind?: AgentErrorKind;\n title: ReactNode;\n detail?: ReactNode;\n actions?: ReactNode;\n timestamp?: ReactNode;\n}\n\ninterface StreamingStreamItem {\n kind: \"streaming\";\n id: string;\n model?: ReactNode;\n partial?: ReactNode;\n}\n\ninterface MessageStreamItem {\n kind: \"message\";\n id: string;\n message: UIMessage;\n}\n\ninterface CustomStreamItem {\n kind: \"custom\";\n id: string;\n /** Arbitrary node — escape hatch for inline diff cards, etc. */\n node: ReactNode;\n}\n\nexport type AgentStreamItem =\n | MessageStreamItem\n | ToolCallStreamItem\n | ApprovalStreamItem\n | ErrorStreamItem\n | StreamingStreamItem\n | CustomStreamItem;\n\ninterface AgentStreamProps extends HTMLAttributes<HTMLDivElement> {\n items: AgentStreamItem[];\n}\n\nconst AgentStream = forwardRef<HTMLDivElement, AgentStreamProps>(\n ({ className, items, ...props }, ref) => (\n // T4.1 (MF-4): AgentStream is the canonical live region for the stream\n // surface. Wrap children in LiveRegionProvider so nested AgentStreaming,\n // AgentErrorCard, AutoCompactNotice, Skeleton, etc. don't declare their\n // own aria-live (which would cause double announcements).\n <LiveRegionProvider value={true}>\n <div\n ref={ref}\n role=\"log\"\n aria-live=\"polite\"\n aria-relevant=\"additions\"\n // MEDIUM-001: explicit aria-atomic=\"false\" so VoiceOver/macOS doesn't\n // reannounce the entire stream on each new item.\n aria-atomic=\"false\"\n className={cn(\"flex flex-col gap-3\", className)}\n {...props}\n >\n {items.map((item) => {\n if (item.kind === \"message\") return <ChatMessage key={item.id} message={item.message} />;\n if (item.kind === \"tool-call\")\n return (\n <ToolCallCard\n key={item.id}\n tool={item.tool}\n icon={item.icon}\n target={item.target}\n status={item.status}\n output={item.output}\n defaultExpanded={item.defaultExpanded}\n timestamp={item.timestamp}\n />\n );\n if (item.kind === \"approval\")\n return (\n <ApprovalCard\n key={item.id}\n severity={item.severity}\n title={item.title}\n request={item.request}\n description={item.description}\n details={item.details}\n onApprove={item.onApprove}\n onDeny={item.onDeny}\n onAlways={item.onAlways}\n />\n );\n if (item.kind === \"error\")\n return (\n <AgentErrorCard\n key={item.id}\n kind={item.errorKind}\n title={item.title}\n detail={item.detail}\n actions={item.actions}\n timestamp={item.timestamp}\n />\n );\n if (item.kind === \"streaming\")\n return <AgentStreaming key={item.id} model={item.model} partial={item.partial} />;\n if (item.kind === \"custom\") return <div key={item.id}>{item.node}</div>;\n return null;\n })}\n </div>\n </LiveRegionProvider>\n ),\n);\nAgentStream.displayName = \"AgentStream\";\n\nexport { AgentStream };\n"
24
+ "content": "import { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport { LiveRegionProvider } from \"@/lib/live-region-context\";\nimport type { IconComponent } from \"@/lib/types\";\nimport type { UIMessage } from \"@/types/chat\";\nimport { AgentErrorCard, type AgentErrorKind } from \"@/components/ui/agent-error-card\";\nimport { AgentStreaming } from \"@/components/ui/agent-streaming\";\nimport { ToolCallCard, type ToolCallStatus } from \"@/components/ui/tool-call-card\";\nimport { ApprovalCard, type ApprovalSeverity } from \"@/components/blocks/approval-card\";\nimport { ChatMessage } from \"@/components/ui/chat-message/index\";\n\n/**\n * AgentStream — the canonical conversation surface for a code agent.\n *\n * Interleaves chat messages (user + assistant), tool invocations, approval\n * gates, errors, and the live streaming indicator. Mirrors how Claude Code\n * presents work to the user: conversation-centric, tool calls embedded,\n * approvals pause the flow inline, errors surface where they happen.\n *\n * Items are rendered in array order. The consumer fully controls the data;\n * AgentStream is a pure presentational composite over its child primitives.\n */\n\nexport interface ToolCallStreamItem {\n kind: \"tool-call\";\n id: string;\n tool: ReactNode;\n icon?: IconComponent;\n target?: ReactNode;\n status: ToolCallStatus;\n output?: ReactNode;\n defaultExpanded?: boolean;\n timestamp?: ReactNode;\n}\n\ninterface ApprovalStreamItem {\n kind: \"approval\";\n id: string;\n severity?: ApprovalSeverity;\n title: ReactNode;\n request: ReactNode;\n description?: ReactNode;\n details?: ReactNode;\n onApprove?: () => void;\n onDeny?: () => void;\n onAlways?: () => void;\n}\n\ninterface ErrorStreamItem {\n kind: \"error\";\n id: string;\n errorKind?: AgentErrorKind;\n title: ReactNode;\n detail?: ReactNode;\n actions?: ReactNode;\n timestamp?: ReactNode;\n}\n\ninterface StreamingStreamItem {\n kind: \"streaming\";\n id: string;\n model?: ReactNode;\n partial?: ReactNode;\n}\n\nexport interface MessageStreamItem {\n kind: \"message\";\n id: string;\n message: UIMessage;\n}\n\ninterface CustomStreamItem {\n kind: \"custom\";\n id: string;\n /** Arbitrary node — escape hatch for inline diff cards, etc. */\n node: ReactNode;\n}\n\nexport type AgentStreamItem =\n | MessageStreamItem\n | ToolCallStreamItem\n | ApprovalStreamItem\n | ErrorStreamItem\n | StreamingStreamItem\n | CustomStreamItem;\n\ninterface AgentStreamProps extends HTMLAttributes<HTMLDivElement> {\n items: AgentStreamItem[];\n}\n\nconst AgentStream = forwardRef<HTMLDivElement, AgentStreamProps>(\n ({ className, items, ...props }, ref) => (\n // T4.1 (MF-4): AgentStream is the canonical live region for the stream\n // surface. Wrap children in LiveRegionProvider so nested AgentStreaming,\n // AgentErrorCard, AutoCompactNotice, Skeleton, etc. don't declare their\n // own aria-live (which would cause double announcements).\n <LiveRegionProvider value={true}>\n <div\n data-slot=\"agent-stream\"\n ref={ref}\n role=\"log\"\n aria-live=\"polite\"\n aria-relevant=\"additions\"\n // MEDIUM-001: explicit aria-atomic=\"false\" so VoiceOver/macOS doesn't\n // reannounce the entire stream on each new item.\n aria-atomic=\"false\"\n className={cn(\"flex flex-col gap-3\", className)}\n {...props}\n >\n {items.map((item) => {\n if (item.kind === \"message\") return <ChatMessage key={item.id} message={item.message} />;\n if (item.kind === \"tool-call\")\n return (\n <ToolCallCard\n key={item.id}\n tool={item.tool}\n icon={item.icon}\n target={item.target}\n status={item.status}\n output={item.output}\n defaultExpanded={item.defaultExpanded}\n timestamp={item.timestamp}\n />\n );\n if (item.kind === \"approval\")\n return (\n <ApprovalCard\n key={item.id}\n severity={item.severity}\n title={item.title}\n request={item.request}\n description={item.description}\n details={item.details}\n onApprove={item.onApprove}\n onDeny={item.onDeny}\n onAlways={item.onAlways}\n />\n );\n if (item.kind === \"error\")\n return (\n <AgentErrorCard\n key={item.id}\n kind={item.errorKind}\n title={item.title}\n detail={item.detail}\n actions={item.actions}\n timestamp={item.timestamp}\n />\n );\n if (item.kind === \"streaming\")\n return <AgentStreaming key={item.id} model={item.model} partial={item.partial} />;\n if (item.kind === \"custom\") return <div key={item.id}>{item.node}</div>;\n return null;\n })}\n </div>\n </LiveRegionProvider>\n ),\n);\nAgentStream.displayName = \"AgentStream\";\n\nexport { AgentStream };\n"
25
25
  }
26
26
  ]
27
27
  }
@@ -16,7 +16,7 @@
16
16
  "path": "components/primitives/agent-streaming/agent-streaming.tsx",
17
17
  "type": "registry:ui",
18
18
  "target": "components/ui/agent-streaming.tsx",
19
- "content": "import { Sparkles } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport { useInLiveRegion } from \"@/lib/live-region-context\";\n\n/**\n * AgentStreaming — inline \"agent is thinking / typing\" indicator.\n *\n * Renders inside an agent stream while the model is producing a response.\n * Default visual is 3 violet dots pulsing. If `partial` is provided, renders\n * the streamed-so-far text with a caret. Optional `model` label on the right.\n */\n\ninterface AgentStreamingProps extends HTMLAttributes<HTMLDivElement> {\n /** Streamed-so-far text. When present, replaces the dots animation. */\n partial?: ReactNode;\n /** Optional model name shown as a chip. */\n model?: ReactNode;\n}\n\nconst AgentStreaming = forwardRef<HTMLDivElement, AgentStreamingProps>(\n ({ className, partial, model, ...props }, ref) => {\n // T4.1 (MF-4): when nested inside a live region container (AgentStream,\n // ChatThread, etc.), omit our own aria-live to prevent double-announcement.\n // Standalone usage keeps the live region intact.\n const inLiveRegion = useInLiveRegion();\n return (\n <div\n ref={ref}\n role={inLiveRegion ? undefined : \"status\"}\n aria-live={inLiveRegion ? undefined : \"polite\"}\n aria-label=\"Agent is responding\"\n className={cn(\n \"flex w-full items-start gap-3 rounded-xl border border-border/40 bg-card/40 px-4 py-3\",\n className,\n )}\n {...props}\n >\n <span\n className=\"grid size-7 shrink-0 place-items-center rounded-full bg-primary/15 text-primary\"\n aria-hidden=\"true\"\n >\n <Sparkles className=\"size-3.5\" />\n </span>\n <div className=\"grid min-w-0 flex-1 gap-1\">\n {model ? (\n <span className=\"font-mono text-label-caps text-muted-foreground uppercase tracking-wider\">\n {model}\n </span>\n ) : null}\n {partial ? (\n <span className=\"break-words text-body-md text-foreground\">\n {partial}\n <span\n className=\"ml-0.5 inline-block h-4 w-[2px] translate-y-0.5 animate-pulse bg-primary align-middle\"\n aria-hidden=\"true\"\n />\n </span>\n ) : (\n <span className=\"flex items-center gap-1.5\" aria-hidden=\"true\">\n <Dot delay={0} />\n <Dot delay={120} />\n <Dot delay={240} />\n <span className=\"ml-1 text-body-sm text-muted-foreground\">thinking…</span>\n </span>\n )}\n </div>\n </div>\n );\n },\n);\nAgentStreaming.displayName = \"AgentStreaming\";\n\nfunction Dot({ delay }: { delay: number }) {\n return (\n <span\n className=\"size-1.5 animate-pulse rounded-full bg-primary\"\n style={{ animationDelay: `${delay}ms` }}\n />\n );\n}\n\nexport { AgentStreaming };\n"
19
+ "content": "import { Sparkles } from \"lucide-react\";\nimport { forwardRef } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport { useInLiveRegion } from \"@/lib/live-region-context\";\n\n/**\n * AgentStreaming — inline \"agent is thinking / typing\" indicator.\n *\n * Renders inside an agent stream while the model is producing a response.\n * Default visual is 3 violet dots pulsing. If `partial` is provided, renders\n * the streamed-so-far text with a caret. Optional `model` label on the right.\n */\n\ninterface AgentStreamingProps extends HTMLAttributes<HTMLDivElement> {\n /** Streamed-so-far text. When present, replaces the dots animation. */\n partial?: ReactNode;\n /** Optional model name shown as a chip. */\n model?: ReactNode;\n}\n\nconst AgentStreaming = forwardRef<HTMLDivElement, AgentStreamingProps>(\n ({ className, partial, model, ...props }, ref) => {\n // T4.1 (MF-4): when nested inside a live region container (AgentStream,\n // ChatThread, etc.), omit our own aria-live to prevent double-announcement.\n // Standalone usage keeps the live region intact.\n const inLiveRegion = useInLiveRegion();\n return (\n <div\n data-slot=\"agent-streaming\"\n ref={ref}\n role={inLiveRegion ? undefined : \"status\"}\n aria-live={inLiveRegion ? undefined : \"polite\"}\n aria-label=\"Agent is responding\"\n className={cn(\n \"flex w-full items-start gap-3 rounded-xl border border-border/40 bg-card/40 px-4 py-3\",\n className,\n )}\n {...props}\n >\n <span\n className=\"grid size-7 shrink-0 place-items-center rounded-full bg-primary/15 text-primary\"\n aria-hidden=\"true\"\n >\n <Sparkles className=\"size-3.5\" />\n </span>\n <div className=\"grid min-w-0 flex-1 gap-1\">\n {model ? (\n <span className=\"font-mono text-label-caps text-muted-foreground uppercase tracking-wider\">\n {model}\n </span>\n ) : null}\n {partial ? (\n <span className=\"break-words text-body-md text-foreground\">\n {partial}\n <span\n className=\"ml-0.5 inline-block h-4 w-[2px] translate-y-0.5 animate-pulse bg-primary align-middle\"\n aria-hidden=\"true\"\n />\n </span>\n ) : (\n <span className=\"flex items-center gap-1.5\" aria-hidden=\"true\">\n <Dot delay={0} />\n <Dot delay={120} />\n <Dot delay={240} />\n <span className=\"ml-1 text-body-sm text-muted-foreground\">thinking…</span>\n </span>\n )}\n </div>\n </div>\n );\n },\n);\nAgentStreaming.displayName = \"AgentStreaming\";\n\nfunction Dot({ delay }: { delay: number }) {\n return (\n <span\n className=\"size-1.5 animate-pulse rounded-full bg-primary\"\n style={{ animationDelay: `${delay}ms` }}\n />\n );\n}\n\nexport { AgentStreaming };\n"
20
20
  }
21
21
  ]
22
22
  }
@@ -16,7 +16,7 @@
16
16
  "path": "components/composites/agent-timeline/agent-timeline.tsx",
17
17
  "type": "registry:ui",
18
18
  "target": "components/ui/agent-timeline.tsx",
19
- "content": "import { forwardRef } from \"react\";\nimport type { HTMLAttributes } from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport type { AgentEvent as AgentEventModel } from \"@/types/agent\";\nimport { AgentEvent } from \"@/components/ui/agent-event\";\n\ninterface AgentTimelineProps extends HTMLAttributes<HTMLOListElement> {\n events: AgentEventModel[];\n /**\n * If true, events with `detail` are collapsible.\n */\n collapsible?: boolean;\n /**\n * Renders a vertical line connecting events. Default true.\n */\n showLine?: boolean;\n}\n\n/**\n * AgentTimeline — vertical list of agent events.\n *\n * Visual: optional thin border-left running through the column, with each\n * AgentEvent slightly indented from the line. Events animate in via fade-in-up\n * when first mounted.\n */\nconst AgentTimeline = forwardRef<HTMLOListElement, AgentTimelineProps>(\n ({ className, events, collapsible = true, showLine = true, ...props }, ref) => (\n <ol\n ref={ref}\n className={cn(\n \"grid gap-1\",\n showLine &&\n \"relative pl-4 before:absolute before:top-1 before:bottom-1 before:left-[11px] before:w-px before:bg-border/60\",\n className,\n )}\n {...props}\n >\n {events.map((event) => (\n <li key={event.id} className=\"animate-fade-in-up\">\n <AgentEvent event={event} collapsible={collapsible} />\n </li>\n ))}\n </ol>\n ),\n);\nAgentTimeline.displayName = \"AgentTimeline\";\n\nexport { AgentTimeline };\n"
19
+ "content": "import { forwardRef } from \"react\";\nimport type { HTMLAttributes } from \"react\";\nimport { cn } from \"@/lib/cn\";\nimport type { AgentEvent as AgentEventModel } from \"@/types/agent\";\nimport { AgentEvent } from \"@/components/ui/agent-event\";\n\ninterface AgentTimelineProps extends HTMLAttributes<HTMLOListElement> {\n events: AgentEventModel[];\n /**\n * If true, events with `detail` are collapsible.\n */\n collapsible?: boolean;\n /**\n * Renders a vertical line connecting events. Default true.\n */\n showLine?: boolean;\n}\n\n/**\n * AgentTimeline — vertical list of agent events.\n *\n * Visual: optional thin border-left running through the column, with each\n * AgentEvent slightly indented from the line. Events animate in via fade-in-up\n * when first mounted.\n */\nconst AgentTimeline = forwardRef<HTMLOListElement, AgentTimelineProps>(\n ({ className, events, collapsible = true, showLine = true, ...props }, ref) => (\n <ol\n data-slot=\"agent-timeline\"\n ref={ref}\n className={cn(\n \"grid gap-1\",\n showLine &&\n \"relative pl-4 before:absolute before:top-1 before:bottom-1 before:left-[11px] before:w-px before:bg-border/60\",\n className,\n )}\n {...props}\n >\n {events.map((event) => (\n <li key={event.id} className=\"animate-fade-in-up\">\n <AgentEvent event={event} collapsible={collapsible} />\n </li>\n ))}\n </ol>\n ),\n);\nAgentTimeline.displayName = \"AgentTimeline\";\n\nexport { AgentTimeline };\n"
20
20
  }
21
21
  ]
22
22
  }