@theokit/ui 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (715) hide show
  1. package/CHANGELOG.md +1325 -0
  2. package/DESIGN.md +456 -0
  3. package/LICENSE +201 -0
  4. package/NOTICE +38 -0
  5. package/README.md +467 -0
  6. package/dist/chunk-27ENTTY7.js +146 -0
  7. package/dist/chunk-27ENTTY7.js.map +1 -0
  8. package/dist/chunk-2H6TQELG.js +33 -0
  9. package/dist/chunk-2H6TQELG.js.map +1 -0
  10. package/dist/chunk-2L6MRJD4.js +120 -0
  11. package/dist/chunk-2L6MRJD4.js.map +1 -0
  12. package/dist/chunk-2Y5V2PAL.js +80 -0
  13. package/dist/chunk-2Y5V2PAL.js.map +1 -0
  14. package/dist/chunk-34NAFDVL.js +46 -0
  15. package/dist/chunk-34NAFDVL.js.map +1 -0
  16. package/dist/chunk-36KJGXEK.js +112 -0
  17. package/dist/chunk-36KJGXEK.js.map +1 -0
  18. package/dist/chunk-3BMYYNN6.js +124 -0
  19. package/dist/chunk-3BMYYNN6.js.map +1 -0
  20. package/dist/chunk-3OHV7EEI.js +34 -0
  21. package/dist/chunk-3OHV7EEI.js.map +1 -0
  22. package/dist/chunk-3QKTS6F5.js +88 -0
  23. package/dist/chunk-3QKTS6F5.js.map +1 -0
  24. package/dist/chunk-3TBXLYNM.js +42 -0
  25. package/dist/chunk-3TBXLYNM.js.map +1 -0
  26. package/dist/chunk-4AM2HSXU.js +67 -0
  27. package/dist/chunk-4AM2HSXU.js.map +1 -0
  28. package/dist/chunk-4BCGKM65.js +44 -0
  29. package/dist/chunk-4BCGKM65.js.map +1 -0
  30. package/dist/chunk-4D3JILQX.js +145 -0
  31. package/dist/chunk-4D3JILQX.js.map +1 -0
  32. package/dist/chunk-4EJU2GBG.js +48 -0
  33. package/dist/chunk-4EJU2GBG.js.map +1 -0
  34. package/dist/chunk-4WKO3G5C.js +110 -0
  35. package/dist/chunk-4WKO3G5C.js.map +1 -0
  36. package/dist/chunk-53XPKI7Q.js +97 -0
  37. package/dist/chunk-53XPKI7Q.js.map +1 -0
  38. package/dist/chunk-55TDVDPG.js +58 -0
  39. package/dist/chunk-55TDVDPG.js.map +1 -0
  40. package/dist/chunk-56BJLFW7.js +26 -0
  41. package/dist/chunk-56BJLFW7.js.map +1 -0
  42. package/dist/chunk-5HOQLE6Y.js +35 -0
  43. package/dist/chunk-5HOQLE6Y.js.map +1 -0
  44. package/dist/chunk-5TY3NYF5.js +144 -0
  45. package/dist/chunk-5TY3NYF5.js.map +1 -0
  46. package/dist/chunk-5VOSCJKQ.js +92 -0
  47. package/dist/chunk-5VOSCJKQ.js.map +1 -0
  48. package/dist/chunk-65NVO6TK.js +171 -0
  49. package/dist/chunk-65NVO6TK.js.map +1 -0
  50. package/dist/chunk-6A5TPCKP.js +64 -0
  51. package/dist/chunk-6A5TPCKP.js.map +1 -0
  52. package/dist/chunk-6CO4LEXZ.js +41 -0
  53. package/dist/chunk-6CO4LEXZ.js.map +1 -0
  54. package/dist/chunk-6FVUPNPG.js +56 -0
  55. package/dist/chunk-6FVUPNPG.js.map +1 -0
  56. package/dist/chunk-76YWTIWK.js +106 -0
  57. package/dist/chunk-76YWTIWK.js.map +1 -0
  58. package/dist/chunk-7EI7424P.js +78 -0
  59. package/dist/chunk-7EI7424P.js.map +1 -0
  60. package/dist/chunk-AHTVYOPQ.js +26 -0
  61. package/dist/chunk-AHTVYOPQ.js.map +1 -0
  62. package/dist/chunk-AJTJNHKK.js +85 -0
  63. package/dist/chunk-AJTJNHKK.js.map +1 -0
  64. package/dist/chunk-AMT3CPMC.js +155 -0
  65. package/dist/chunk-AMT3CPMC.js.map +1 -0
  66. package/dist/chunk-AX5EH73R.js +59 -0
  67. package/dist/chunk-AX5EH73R.js.map +1 -0
  68. package/dist/chunk-B3VAJSZ2.js +35 -0
  69. package/dist/chunk-B3VAJSZ2.js.map +1 -0
  70. package/dist/chunk-B4CQMQ64.js +25 -0
  71. package/dist/chunk-B4CQMQ64.js.map +1 -0
  72. package/dist/chunk-BMRZXT5T.js +115 -0
  73. package/dist/chunk-BMRZXT5T.js.map +1 -0
  74. package/dist/chunk-BYZ6OFH4.js +73 -0
  75. package/dist/chunk-BYZ6OFH4.js.map +1 -0
  76. package/dist/chunk-C55VUQ7N.js +156 -0
  77. package/dist/chunk-C55VUQ7N.js.map +1 -0
  78. package/dist/chunk-D4GEAV4C.js +91 -0
  79. package/dist/chunk-D4GEAV4C.js.map +1 -0
  80. package/dist/chunk-DC43CHAM.js +152 -0
  81. package/dist/chunk-DC43CHAM.js.map +1 -0
  82. package/dist/chunk-DKCRLN35.js +92 -0
  83. package/dist/chunk-DKCRLN35.js.map +1 -0
  84. package/dist/chunk-DN5BUDBI.js +86 -0
  85. package/dist/chunk-DN5BUDBI.js.map +1 -0
  86. package/dist/chunk-DOLKDYMS.js +88 -0
  87. package/dist/chunk-DOLKDYMS.js.map +1 -0
  88. package/dist/chunk-DW34WXCG.js +28 -0
  89. package/dist/chunk-DW34WXCG.js.map +1 -0
  90. package/dist/chunk-DZAAKHGZ.js +135 -0
  91. package/dist/chunk-DZAAKHGZ.js.map +1 -0
  92. package/dist/chunk-E4IRSSHO.js +116 -0
  93. package/dist/chunk-E4IRSSHO.js.map +1 -0
  94. package/dist/chunk-E67WQXBV.js +104 -0
  95. package/dist/chunk-E67WQXBV.js.map +1 -0
  96. package/dist/chunk-EG6IHP3H.js +128 -0
  97. package/dist/chunk-EG6IHP3H.js.map +1 -0
  98. package/dist/chunk-EO7LOXG2.js +82 -0
  99. package/dist/chunk-EO7LOXG2.js.map +1 -0
  100. package/dist/chunk-EWDN56AS.js +24 -0
  101. package/dist/chunk-EWDN56AS.js.map +1 -0
  102. package/dist/chunk-F5P5P2SC.js +141 -0
  103. package/dist/chunk-F5P5P2SC.js.map +1 -0
  104. package/dist/chunk-FAWPRZTM.js +79 -0
  105. package/dist/chunk-FAWPRZTM.js.map +1 -0
  106. package/dist/chunk-FGYJ2WPX.js +36 -0
  107. package/dist/chunk-FGYJ2WPX.js.map +1 -0
  108. package/dist/chunk-GBG3I5I5.js +46 -0
  109. package/dist/chunk-GBG3I5I5.js.map +1 -0
  110. package/dist/chunk-GDMCDW66.js +19 -0
  111. package/dist/chunk-GDMCDW66.js.map +1 -0
  112. package/dist/chunk-H6HSQCOW.js +80 -0
  113. package/dist/chunk-H6HSQCOW.js.map +1 -0
  114. package/dist/chunk-HDM4RCIF.js +111 -0
  115. package/dist/chunk-HDM4RCIF.js.map +1 -0
  116. package/dist/chunk-HNTOGGVD.js +77 -0
  117. package/dist/chunk-HNTOGGVD.js.map +1 -0
  118. package/dist/chunk-HQW2ABO4.js +28 -0
  119. package/dist/chunk-HQW2ABO4.js.map +1 -0
  120. package/dist/chunk-HRDRGZ2Y.js +76 -0
  121. package/dist/chunk-HRDRGZ2Y.js.map +1 -0
  122. package/dist/chunk-HUOVA7SF.js +83 -0
  123. package/dist/chunk-HUOVA7SF.js.map +1 -0
  124. package/dist/chunk-ITA3SNOR.js +133 -0
  125. package/dist/chunk-ITA3SNOR.js.map +1 -0
  126. package/dist/chunk-IYNUPG2G.js +61 -0
  127. package/dist/chunk-IYNUPG2G.js.map +1 -0
  128. package/dist/chunk-JJ65ZI4P.js +199 -0
  129. package/dist/chunk-JJ65ZI4P.js.map +1 -0
  130. package/dist/chunk-JRBGZ6NI.js +106 -0
  131. package/dist/chunk-JRBGZ6NI.js.map +1 -0
  132. package/dist/chunk-K45OO62F.js +108 -0
  133. package/dist/chunk-K45OO62F.js.map +1 -0
  134. package/dist/chunk-KDTKA667.js +67 -0
  135. package/dist/chunk-KDTKA667.js.map +1 -0
  136. package/dist/chunk-KI7KZBSN.js +142 -0
  137. package/dist/chunk-KI7KZBSN.js.map +1 -0
  138. package/dist/chunk-KOJ7XOPZ.js +87 -0
  139. package/dist/chunk-KOJ7XOPZ.js.map +1 -0
  140. package/dist/chunk-KQTHJ22B.js +82 -0
  141. package/dist/chunk-KQTHJ22B.js.map +1 -0
  142. package/dist/chunk-KRC43RZR.js +77 -0
  143. package/dist/chunk-KRC43RZR.js.map +1 -0
  144. package/dist/chunk-LJQOEGQ2.js +116 -0
  145. package/dist/chunk-LJQOEGQ2.js.map +1 -0
  146. package/dist/chunk-LKRNUSKZ.js +149 -0
  147. package/dist/chunk-LKRNUSKZ.js.map +1 -0
  148. package/dist/chunk-LLL7QQ52.js +76 -0
  149. package/dist/chunk-LLL7QQ52.js.map +1 -0
  150. package/dist/chunk-LQ4B5X4Y.js +56 -0
  151. package/dist/chunk-LQ4B5X4Y.js.map +1 -0
  152. package/dist/chunk-M3FSLEHQ.js +76 -0
  153. package/dist/chunk-M3FSLEHQ.js.map +1 -0
  154. package/dist/chunk-M5G3O6H6.js +57 -0
  155. package/dist/chunk-M5G3O6H6.js.map +1 -0
  156. package/dist/chunk-M6JIC5PU.js +81 -0
  157. package/dist/chunk-M6JIC5PU.js.map +1 -0
  158. package/dist/chunk-N2HJ3SLS.js +186 -0
  159. package/dist/chunk-N2HJ3SLS.js.map +1 -0
  160. package/dist/chunk-NGZWBFTP.js +45 -0
  161. package/dist/chunk-NGZWBFTP.js.map +1 -0
  162. package/dist/chunk-OAKCXT35.js +34 -0
  163. package/dist/chunk-OAKCXT35.js.map +1 -0
  164. package/dist/chunk-OSD3U3HT.js +54 -0
  165. package/dist/chunk-OSD3U3HT.js.map +1 -0
  166. package/dist/chunk-OUXESQ2R.js +42 -0
  167. package/dist/chunk-OUXESQ2R.js.map +1 -0
  168. package/dist/chunk-OY2LJHMJ.js +43 -0
  169. package/dist/chunk-OY2LJHMJ.js.map +1 -0
  170. package/dist/chunk-OYEZR4CN.js +221 -0
  171. package/dist/chunk-OYEZR4CN.js.map +1 -0
  172. package/dist/chunk-P57HUMAE.js +66 -0
  173. package/dist/chunk-P57HUMAE.js.map +1 -0
  174. package/dist/chunk-P6Y2PI6L.js +82 -0
  175. package/dist/chunk-P6Y2PI6L.js.map +1 -0
  176. package/dist/chunk-PA7TDXUQ.js +51 -0
  177. package/dist/chunk-PA7TDXUQ.js.map +1 -0
  178. package/dist/chunk-PPBGGNPV.js +112 -0
  179. package/dist/chunk-PPBGGNPV.js.map +1 -0
  180. package/dist/chunk-PRH4HKND.js +48 -0
  181. package/dist/chunk-PRH4HKND.js.map +1 -0
  182. package/dist/chunk-PSPAZJUQ.js +32 -0
  183. package/dist/chunk-PSPAZJUQ.js.map +1 -0
  184. package/dist/chunk-Q5G5CGZ2.js +170 -0
  185. package/dist/chunk-Q5G5CGZ2.js.map +1 -0
  186. package/dist/chunk-QDAF3LP7.js +89 -0
  187. package/dist/chunk-QDAF3LP7.js.map +1 -0
  188. package/dist/chunk-QGVIGNJ3.js +37 -0
  189. package/dist/chunk-QGVIGNJ3.js.map +1 -0
  190. package/dist/chunk-QNUITYSY.js +68 -0
  191. package/dist/chunk-QNUITYSY.js.map +1 -0
  192. package/dist/chunk-QSWVN3RT.js +116 -0
  193. package/dist/chunk-QSWVN3RT.js.map +1 -0
  194. package/dist/chunk-QTLQZ7OJ.js +110 -0
  195. package/dist/chunk-QTLQZ7OJ.js.map +1 -0
  196. package/dist/chunk-QYAMLIG2.js +84 -0
  197. package/dist/chunk-QYAMLIG2.js.map +1 -0
  198. package/dist/chunk-REILH4XF.js +128 -0
  199. package/dist/chunk-REILH4XF.js.map +1 -0
  200. package/dist/chunk-S6SSK6QX.js +80 -0
  201. package/dist/chunk-S6SSK6QX.js.map +1 -0
  202. package/dist/chunk-SA7ED3PN.js +68 -0
  203. package/dist/chunk-SA7ED3PN.js.map +1 -0
  204. package/dist/chunk-SIJOEM4N.js +55 -0
  205. package/dist/chunk-SIJOEM4N.js.map +1 -0
  206. package/dist/chunk-SLOKAAH2.js +70 -0
  207. package/dist/chunk-SLOKAAH2.js.map +1 -0
  208. package/dist/chunk-TR6NPSMX.js +85 -0
  209. package/dist/chunk-TR6NPSMX.js.map +1 -0
  210. package/dist/chunk-TSZ5DEAT.js +106 -0
  211. package/dist/chunk-TSZ5DEAT.js.map +1 -0
  212. package/dist/chunk-TUNVF45W.js +127 -0
  213. package/dist/chunk-TUNVF45W.js.map +1 -0
  214. package/dist/chunk-TXOBNSQ5.js +63 -0
  215. package/dist/chunk-TXOBNSQ5.js.map +1 -0
  216. package/dist/chunk-U44DRLMM.js +88 -0
  217. package/dist/chunk-U44DRLMM.js.map +1 -0
  218. package/dist/chunk-U4THNRV5.js +114 -0
  219. package/dist/chunk-U4THNRV5.js.map +1 -0
  220. package/dist/chunk-UAZOFC4W.js +72 -0
  221. package/dist/chunk-UAZOFC4W.js.map +1 -0
  222. package/dist/chunk-UGKI466V.js +12 -0
  223. package/dist/chunk-UGKI466V.js.map +1 -0
  224. package/dist/chunk-VM4RMQQN.js +11 -0
  225. package/dist/chunk-VM4RMQQN.js.map +1 -0
  226. package/dist/chunk-VQ37VLAS.js +54 -0
  227. package/dist/chunk-VQ37VLAS.js.map +1 -0
  228. package/dist/chunk-VT7VSYH5.js +73 -0
  229. package/dist/chunk-VT7VSYH5.js.map +1 -0
  230. package/dist/chunk-VTIRUCLZ.js +57 -0
  231. package/dist/chunk-VTIRUCLZ.js.map +1 -0
  232. package/dist/chunk-VVBAEYKI.js +202 -0
  233. package/dist/chunk-VVBAEYKI.js.map +1 -0
  234. package/dist/chunk-WHFIQUCC.js +120 -0
  235. package/dist/chunk-WHFIQUCC.js.map +1 -0
  236. package/dist/chunk-WPSESV5Z.js +74 -0
  237. package/dist/chunk-WPSESV5Z.js.map +1 -0
  238. package/dist/chunk-WXEXCHEN.js +51 -0
  239. package/dist/chunk-WXEXCHEN.js.map +1 -0
  240. package/dist/chunk-X2DDPD3D.js +113 -0
  241. package/dist/chunk-X2DDPD3D.js.map +1 -0
  242. package/dist/chunk-X7VIMKLD.js +127 -0
  243. package/dist/chunk-X7VIMKLD.js.map +1 -0
  244. package/dist/chunk-XJ3EG6XY.js +30 -0
  245. package/dist/chunk-XJ3EG6XY.js.map +1 -0
  246. package/dist/chunk-XOT5HWSF.js +23 -0
  247. package/dist/chunk-XOT5HWSF.js.map +1 -0
  248. package/dist/chunk-Y72IP43U.js +117 -0
  249. package/dist/chunk-Y72IP43U.js.map +1 -0
  250. package/dist/chunk-YD6FLXBV.js +61 -0
  251. package/dist/chunk-YD6FLXBV.js.map +1 -0
  252. package/dist/chunk-YEQQGYYO.js +1022 -0
  253. package/dist/chunk-YEQQGYYO.js.map +1 -0
  254. package/dist/chunk-YYW6AEIT.js +46 -0
  255. package/dist/chunk-YYW6AEIT.js.map +1 -0
  256. package/dist/chunk-ZEVGXKRU.js +104 -0
  257. package/dist/chunk-ZEVGXKRU.js.map +1 -0
  258. package/dist/chunk-ZKSMMLDP.js +74 -0
  259. package/dist/chunk-ZKSMMLDP.js.map +1 -0
  260. package/dist/chunk-ZU6IM6PK.js +101 -0
  261. package/dist/chunk-ZU6IM6PK.js.map +1 -0
  262. package/dist/chunk-ZUS5KZGO.js +714 -0
  263. package/dist/chunk-ZUS5KZGO.js.map +1 -0
  264. package/dist/chunk-ZVS2GOT2.js +58 -0
  265. package/dist/chunk-ZVS2GOT2.js.map +1 -0
  266. package/dist/chunk-ZXPDS6DH.js +3 -0
  267. package/dist/chunk-ZXPDS6DH.js.map +1 -0
  268. package/dist/chunk-ZZQQJX5Z.js +173 -0
  269. package/dist/chunk-ZZQQJX5Z.js.map +1 -0
  270. package/dist/components.css +2 -0
  271. package/dist/composites/account-menu/index.js +6 -0
  272. package/dist/composites/account-menu/index.js.map +1 -0
  273. package/dist/composites/agent-composer/index.js +7 -0
  274. package/dist/composites/agent-composer/index.js.map +1 -0
  275. package/dist/composites/agent-editor/index.js +10 -0
  276. package/dist/composites/agent-editor/index.js.map +1 -0
  277. package/dist/composites/agent-stream/index.js +12 -0
  278. package/dist/composites/agent-stream/index.js.map +1 -0
  279. package/dist/composites/agent-timeline/index.js +5 -0
  280. package/dist/composites/agent-timeline/index.js.map +1 -0
  281. package/dist/composites/approval-card/index.js +5 -0
  282. package/dist/composites/approval-card/index.js.map +1 -0
  283. package/dist/composites/chat-composer/index.js +6 -0
  284. package/dist/composites/chat-composer/index.js.map +1 -0
  285. package/dist/composites/chat-message/index.js +6 -0
  286. package/dist/composites/chat-message/index.js.map +1 -0
  287. package/dist/composites/code-block/index.js +5 -0
  288. package/dist/composites/code-block/index.js.map +1 -0
  289. package/dist/composites/command-palette/index.js +5 -0
  290. package/dist/composites/command-palette/index.js.map +1 -0
  291. package/dist/composites/confirm-dialog/index.js +7 -0
  292. package/dist/composites/confirm-dialog/index.js.map +1 -0
  293. package/dist/composites/cron-jobs-list/index.js +5 -0
  294. package/dist/composites/cron-jobs-list/index.js.map +1 -0
  295. package/dist/composites/data-table/index.js +10 -0
  296. package/dist/composites/data-table/index.js.map +1 -0
  297. package/dist/composites/deployment-row/index.js +5 -0
  298. package/dist/composites/deployment-row/index.js.map +1 -0
  299. package/dist/composites/domain-config/index.js +7 -0
  300. package/dist/composites/domain-config/index.js.map +1 -0
  301. package/dist/composites/env-var-editor/index.js +7 -0
  302. package/dist/composites/env-var-editor/index.js.map +1 -0
  303. package/dist/composites/mcp-server-list/index.js +5 -0
  304. package/dist/composites/mcp-server-list/index.js.map +1 -0
  305. package/dist/composites/page-shell/index.js +7 -0
  306. package/dist/composites/page-shell/index.js.map +1 -0
  307. package/dist/composites/permission-modal/index.js +6 -0
  308. package/dist/composites/permission-modal/index.js.map +1 -0
  309. package/dist/composites/preview-env-card/index.js +6 -0
  310. package/dist/composites/preview-env-card/index.js.map +1 -0
  311. package/dist/composites/preview-panel/index.js +5 -0
  312. package/dist/composites/preview-panel/index.js.map +1 -0
  313. package/dist/composites/project-card/index.js +6 -0
  314. package/dist/composites/project-card/index.js.map +1 -0
  315. package/dist/composites/rollback-ui/index.js +6 -0
  316. package/dist/composites/rollback-ui/index.js.map +1 -0
  317. package/dist/composites/rule-editor/index.js +11 -0
  318. package/dist/composites/rule-editor/index.js.map +1 -0
  319. package/dist/composites/skill-editor/index.js +11 -0
  320. package/dist/composites/skill-editor/index.js.map +1 -0
  321. package/dist/composites/skills-list/index.js +5 -0
  322. package/dist/composites/skills-list/index.js.map +1 -0
  323. package/dist/composites/stability-bundle-viewer/index.js +4 -0
  324. package/dist/composites/stability-bundle-viewer/index.js.map +1 -0
  325. package/dist/composites/task-header/index.js +5 -0
  326. package/dist/composites/task-header/index.js.map +1 -0
  327. package/dist/composites/usage-meter/index.js +5 -0
  328. package/dist/composites/usage-meter/index.js.map +1 -0
  329. package/dist/fonts/LICENSE-GEIST.txt +92 -0
  330. package/dist/fonts/geist-400.woff2 +0 -0
  331. package/dist/fonts/geist-500.woff2 +0 -0
  332. package/dist/fonts/geist-600.woff2 +0 -0
  333. package/dist/fonts/geist-mono-400.woff2 +0 -0
  334. package/dist/fonts/geist-mono-500.woff2 +0 -0
  335. package/dist/fonts/geist-mono-600.woff2 +0 -0
  336. package/dist/fonts-cdn.css +28 -0
  337. package/dist/fonts.css +75 -0
  338. package/dist/index.d.ts +4621 -0
  339. package/dist/index.js +1338 -0
  340. package/dist/index.js.map +1 -0
  341. package/dist/plugin-D5xmXqYb.d.ts +172 -0
  342. package/dist/preset-v3-legacy.d.ts +35 -0
  343. package/dist/preset-v3-legacy.js +159 -0
  344. package/dist/preset-v3-legacy.js.map +1 -0
  345. package/dist/preset.css +27 -0
  346. package/dist/primitives/action-bar/index.js +4 -0
  347. package/dist/primitives/action-bar/index.js.map +1 -0
  348. package/dist/primitives/agent-error-card/index.js +5 -0
  349. package/dist/primitives/agent-error-card/index.js.map +1 -0
  350. package/dist/primitives/agent-event/index.js +4 -0
  351. package/dist/primitives/agent-event/index.js.map +1 -0
  352. package/dist/primitives/agent-handoff/index.js +4 -0
  353. package/dist/primitives/agent-handoff/index.js.map +1 -0
  354. package/dist/primitives/agent-profile/index.js +4 -0
  355. package/dist/primitives/agent-profile/index.js.map +1 -0
  356. package/dist/primitives/agent-starting-state/index.js +5 -0
  357. package/dist/primitives/agent-starting-state/index.js.map +1 -0
  358. package/dist/primitives/agent-streaming/index.js +5 -0
  359. package/dist/primitives/agent-streaming/index.js.map +1 -0
  360. package/dist/primitives/alert/index.js +4 -0
  361. package/dist/primitives/alert/index.js.map +1 -0
  362. package/dist/primitives/artifact-preview/index.js +4 -0
  363. package/dist/primitives/artifact-preview/index.js.map +1 -0
  364. package/dist/primitives/attachment-chip/index.js +4 -0
  365. package/dist/primitives/attachment-chip/index.js.map +1 -0
  366. package/dist/primitives/audit-log-entry/index.js +4 -0
  367. package/dist/primitives/audit-log-entry/index.js.map +1 -0
  368. package/dist/primitives/auto-compact-notice/index.js +5 -0
  369. package/dist/primitives/auto-compact-notice/index.js.map +1 -0
  370. package/dist/primitives/avatar/index.js +4 -0
  371. package/dist/primitives/avatar/index.js.map +1 -0
  372. package/dist/primitives/badge/index.js +4 -0
  373. package/dist/primitives/badge/index.js.map +1 -0
  374. package/dist/primitives/branch-indicator/index.js +4 -0
  375. package/dist/primitives/branch-indicator/index.js.map +1 -0
  376. package/dist/primitives/browser-controls/index.js +4 -0
  377. package/dist/primitives/browser-controls/index.js.map +1 -0
  378. package/dist/primitives/build-log-stream/index.js +5 -0
  379. package/dist/primitives/build-log-stream/index.js.map +1 -0
  380. package/dist/primitives/button/index.js +4 -0
  381. package/dist/primitives/button/index.js.map +1 -0
  382. package/dist/primitives/capability-indicator/index.js +4 -0
  383. package/dist/primitives/capability-indicator/index.js.map +1 -0
  384. package/dist/primitives/card/index.js +4 -0
  385. package/dist/primitives/card/index.js.map +1 -0
  386. package/dist/primitives/channel-card/index.js +4 -0
  387. package/dist/primitives/channel-card/index.js.map +1 -0
  388. package/dist/primitives/chat-thread/index.js +5 -0
  389. package/dist/primitives/chat-thread/index.js.map +1 -0
  390. package/dist/primitives/checkbox/index.js +4 -0
  391. package/dist/primitives/checkbox/index.js.map +1 -0
  392. package/dist/primitives/context-card/index.js +4 -0
  393. package/dist/primitives/context-card/index.js.map +1 -0
  394. package/dist/primitives/context-window-bar/index.js +4 -0
  395. package/dist/primitives/context-window-bar/index.js.map +1 -0
  396. package/dist/primitives/copy-button/index.js +4 -0
  397. package/dist/primitives/copy-button/index.js.map +1 -0
  398. package/dist/primitives/cost-meter/index.js +4 -0
  399. package/dist/primitives/cost-meter/index.js.map +1 -0
  400. package/dist/primitives/created-files-card/index.js +4 -0
  401. package/dist/primitives/created-files-card/index.js.map +1 -0
  402. package/dist/primitives/cron-job-card/index.js +4 -0
  403. package/dist/primitives/cron-job-card/index.js.map +1 -0
  404. package/dist/primitives/danger-zone/index.js +4 -0
  405. package/dist/primitives/danger-zone/index.js.map +1 -0
  406. package/dist/primitives/dialog/index.js +4 -0
  407. package/dist/primitives/dialog/index.js.map +1 -0
  408. package/dist/primitives/diff-viewer/index.js +4 -0
  409. package/dist/primitives/diff-viewer/index.js.map +1 -0
  410. package/dist/primitives/dropdown-menu/index.js +4 -0
  411. package/dist/primitives/dropdown-menu/index.js.map +1 -0
  412. package/dist/primitives/empty-state/index.js +4 -0
  413. package/dist/primitives/empty-state/index.js.map +1 -0
  414. package/dist/primitives/export-chat-dialog/index.js +4 -0
  415. package/dist/primitives/export-chat-dialog/index.js.map +1 -0
  416. package/dist/primitives/folder-context-card/index.js +4 -0
  417. package/dist/primitives/folder-context-card/index.js.map +1 -0
  418. package/dist/primitives/folder-selector/index.js +4 -0
  419. package/dist/primitives/folder-selector/index.js.map +1 -0
  420. package/dist/primitives/form-field/index.js +4 -0
  421. package/dist/primitives/form-field/index.js.map +1 -0
  422. package/dist/primitives/gateway-status-indicator/index.js +4 -0
  423. package/dist/primitives/gateway-status-indicator/index.js.map +1 -0
  424. package/dist/primitives/hook-config/index.js +4 -0
  425. package/dist/primitives/hook-config/index.js.map +1 -0
  426. package/dist/primitives/hook-event-log/index.js +4 -0
  427. package/dist/primitives/hook-event-log/index.js.map +1 -0
  428. package/dist/primitives/input/index.js +4 -0
  429. package/dist/primitives/input/index.js.map +1 -0
  430. package/dist/primitives/intent-selector/index.js +4 -0
  431. package/dist/primitives/intent-selector/index.js.map +1 -0
  432. package/dist/primitives/label/index.js +4 -0
  433. package/dist/primitives/label/index.js.map +1 -0
  434. package/dist/primitives/lane-board/index.js +4 -0
  435. package/dist/primitives/lane-board/index.js.map +1 -0
  436. package/dist/primitives/login-split/index.js +4 -0
  437. package/dist/primitives/login-split/index.js.map +1 -0
  438. package/dist/primitives/mcp-server-card/index.js +4 -0
  439. package/dist/primitives/mcp-server-card/index.js.map +1 -0
  440. package/dist/primitives/memory-editor/index.js +4 -0
  441. package/dist/primitives/memory-editor/index.js.map +1 -0
  442. package/dist/primitives/mention-menu/index.js +4 -0
  443. package/dist/primitives/mention-menu/index.js.map +1 -0
  444. package/dist/primitives/metrics-panel/index.js +4 -0
  445. package/dist/primitives/metrics-panel/index.js.map +1 -0
  446. package/dist/primitives/model-card/index.js +4 -0
  447. package/dist/primitives/model-card/index.js.map +1 -0
  448. package/dist/primitives/model-selector/index.js +4 -0
  449. package/dist/primitives/model-selector/index.js.map +1 -0
  450. package/dist/primitives/pagination/index.js +4 -0
  451. package/dist/primitives/pagination/index.js.map +1 -0
  452. package/dist/primitives/permission-matrix/index.js +4 -0
  453. package/dist/primitives/permission-matrix/index.js.map +1 -0
  454. package/dist/primitives/pin-input/index.js +4 -0
  455. package/dist/primitives/pin-input/index.js.map +1 -0
  456. package/dist/primitives/plan-badge/index.js +4 -0
  457. package/dist/primitives/plan-badge/index.js.map +1 -0
  458. package/dist/primitives/progress/index.js +4 -0
  459. package/dist/primitives/progress/index.js.map +1 -0
  460. package/dist/primitives/progress-checklist/index.js +4 -0
  461. package/dist/primitives/progress-checklist/index.js.map +1 -0
  462. package/dist/primitives/project-switcher/index.js +4 -0
  463. package/dist/primitives/project-switcher/index.js.map +1 -0
  464. package/dist/primitives/quick-action-chips/index.js +4 -0
  465. package/dist/primitives/quick-action-chips/index.js.map +1 -0
  466. package/dist/primitives/radio-group/index.js +4 -0
  467. package/dist/primitives/radio-group/index.js.map +1 -0
  468. package/dist/primitives/recent-folders-list/index.js +4 -0
  469. package/dist/primitives/recent-folders-list/index.js.map +1 -0
  470. package/dist/primitives/rule-card/index.js +4 -0
  471. package/dist/primitives/rule-card/index.js.map +1 -0
  472. package/dist/primitives/run-stats/index.js +4 -0
  473. package/dist/primitives/run-stats/index.js.map +1 -0
  474. package/dist/primitives/run-status-pill/index.js +4 -0
  475. package/dist/primitives/run-status-pill/index.js.map +1 -0
  476. package/dist/primitives/running-tasks-panel/index.js +4 -0
  477. package/dist/primitives/running-tasks-panel/index.js.map +1 -0
  478. package/dist/primitives/scroll-area/index.js +4 -0
  479. package/dist/primitives/scroll-area/index.js.map +1 -0
  480. package/dist/primitives/select/index.js +4 -0
  481. package/dist/primitives/select/index.js.map +1 -0
  482. package/dist/primitives/session-list-item/index.js +4 -0
  483. package/dist/primitives/session-list-item/index.js.map +1 -0
  484. package/dist/primitives/session-timeline/index.js +4 -0
  485. package/dist/primitives/session-timeline/index.js.map +1 -0
  486. package/dist/primitives/sheet/index.js +4 -0
  487. package/dist/primitives/sheet/index.js.map +1 -0
  488. package/dist/primitives/sidebar/index.js +4 -0
  489. package/dist/primitives/sidebar/index.js.map +1 -0
  490. package/dist/primitives/skeleton/index.js +5 -0
  491. package/dist/primitives/skeleton/index.js.map +1 -0
  492. package/dist/primitives/skill-card/index.js +4 -0
  493. package/dist/primitives/skill-card/index.js.map +1 -0
  494. package/dist/primitives/social-auth-row/index.js +4 -0
  495. package/dist/primitives/social-auth-row/index.js.map +1 -0
  496. package/dist/primitives/stat-tile/index.js +4 -0
  497. package/dist/primitives/stat-tile/index.js.map +1 -0
  498. package/dist/primitives/status-dot/index.js +4 -0
  499. package/dist/primitives/status-dot/index.js.map +1 -0
  500. package/dist/primitives/steps-rail/index.js +4 -0
  501. package/dist/primitives/steps-rail/index.js.map +1 -0
  502. package/dist/primitives/sub-agent-dispatch/index.js +4 -0
  503. package/dist/primitives/sub-agent-dispatch/index.js.map +1 -0
  504. package/dist/primitives/switch/index.js +4 -0
  505. package/dist/primitives/switch/index.js.map +1 -0
  506. package/dist/primitives/system-prompt-editor/index.js +4 -0
  507. package/dist/primitives/system-prompt-editor/index.js.map +1 -0
  508. package/dist/primitives/table/index.js +4 -0
  509. package/dist/primitives/table/index.js.map +1 -0
  510. package/dist/primitives/tabs/index.js +4 -0
  511. package/dist/primitives/tabs/index.js.map +1 -0
  512. package/dist/primitives/task-plan/index.js +4 -0
  513. package/dist/primitives/task-plan/index.js.map +1 -0
  514. package/dist/primitives/terminal-panel/index.js +5 -0
  515. package/dist/primitives/terminal-panel/index.js.map +1 -0
  516. package/dist/primitives/textarea/index.js +4 -0
  517. package/dist/primitives/textarea/index.js.map +1 -0
  518. package/dist/primitives/thinking-level-selector/index.js +4 -0
  519. package/dist/primitives/thinking-level-selector/index.js.map +1 -0
  520. package/dist/primitives/timestamp/index.js +4 -0
  521. package/dist/primitives/timestamp/index.js.map +1 -0
  522. package/dist/primitives/toast/index.js +4 -0
  523. package/dist/primitives/toast/index.js.map +1 -0
  524. package/dist/primitives/token-usage-chart/index.js +4 -0
  525. package/dist/primitives/token-usage-chart/index.js.map +1 -0
  526. package/dist/primitives/tool-call/index.js +4 -0
  527. package/dist/primitives/tool-call/index.js.map +1 -0
  528. package/dist/primitives/tool-call-card/index.js +4 -0
  529. package/dist/primitives/tool-call-card/index.js.map +1 -0
  530. package/dist/primitives/tool-result/index.js +4 -0
  531. package/dist/primitives/tool-result/index.js.map +1 -0
  532. package/dist/primitives/tools-list/index.js +4 -0
  533. package/dist/primitives/tools-list/index.js.map +1 -0
  534. package/dist/primitives/tooltip/index.js +4 -0
  535. package/dist/primitives/tooltip/index.js.map +1 -0
  536. package/dist/primitives/topnav/index.js +4 -0
  537. package/dist/primitives/topnav/index.js.map +1 -0
  538. package/dist/primitives/update-banner/index.js +4 -0
  539. package/dist/primitives/update-banner/index.js.map +1 -0
  540. package/dist/slide/index.d.ts +212 -0
  541. package/dist/slide/index.js +3 -0
  542. package/dist/slide/index.js.map +1 -0
  543. package/dist/slide/plugins/emoji/index.d.ts +29 -0
  544. package/dist/slide/plugins/emoji/index.js +157 -0
  545. package/dist/slide/plugins/emoji/index.js.map +1 -0
  546. package/dist/slide/plugins/math/index.d.ts +13 -0
  547. package/dist/slide/plugins/math/index.js +145 -0
  548. package/dist/slide/plugins/math/index.js.map +1 -0
  549. package/dist/slide/plugins/mermaid/index.d.ts +55 -0
  550. package/dist/slide/plugins/mermaid/index.js +218 -0
  551. package/dist/slide/plugins/mermaid/index.js.map +1 -0
  552. package/dist/slide/plugins/shiki/index.d.ts +18 -0
  553. package/dist/slide/plugins/shiki/index.js +87 -0
  554. package/dist/slide/plugins/shiki/index.js.map +1 -0
  555. package/dist/slide/themes/default.css +256 -0
  556. package/dist/slide/themes/layouts.css +143 -0
  557. package/dist/slide/themes/violet-forge.css +256 -0
  558. package/dist/slide-deck/index.css +52 -0
  559. package/dist/slide-deck/index.css.map +1 -0
  560. package/dist/slide-deck/index.d.ts +377 -0
  561. package/dist/slide-deck/index.js +1111 -0
  562. package/dist/slide-deck/index.js.map +1 -0
  563. package/dist/styles-v3-legacy.css +88 -0
  564. package/dist/styles.css +137 -0
  565. package/dist/tokens-v4.css +187 -0
  566. package/dist/tokens.css +230 -0
  567. package/dist/vite-plugin.d.ts +29 -0
  568. package/dist/vite-plugin.js +76 -0
  569. package/dist/vite-plugin.js.map +1 -0
  570. package/dist/whiteboard/index.d.ts +258 -0
  571. package/dist/whiteboard/index.js +738 -0
  572. package/dist/whiteboard/index.js.map +1 -0
  573. package/llms.txt +273 -0
  574. package/package.json +800 -0
  575. package/registry/index.json +856 -0
  576. package/registry/r/account-menu.json +24 -0
  577. package/registry/r/action-bar.json +22 -0
  578. package/registry/r/agent-composer.json +22 -0
  579. package/registry/r/agent-editor.json +27 -0
  580. package/registry/r/agent-error-card.json +22 -0
  581. package/registry/r/agent-event.json +24 -0
  582. package/registry/r/agent-handoff.json +22 -0
  583. package/registry/r/agent-profile.json +23 -0
  584. package/registry/r/agent-starting-state.json +22 -0
  585. package/registry/r/agent-stream.json +27 -0
  586. package/registry/r/agent-streaming.json +22 -0
  587. package/registry/r/agent-timeline.json +22 -0
  588. package/registry/r/agent-types.json +15 -0
  589. package/registry/r/alert.json +22 -0
  590. package/registry/r/approval-card.json +25 -0
  591. package/registry/r/artifact-preview.json +22 -0
  592. package/registry/r/attachment-chip.json +24 -0
  593. package/registry/r/audit-log-entry.json +23 -0
  594. package/registry/r/auto-compact-notice.json +22 -0
  595. package/registry/r/avatar.json +23 -0
  596. package/registry/r/badge.json +22 -0
  597. package/registry/r/browser-controls.json +22 -0
  598. package/registry/r/build-log-stream.json +19 -0
  599. package/registry/r/button.json +23 -0
  600. package/registry/r/capability-indicator.json +23 -0
  601. package/registry/r/card.json +22 -0
  602. package/registry/r/chat-composer.json +23 -0
  603. package/registry/r/chat-message.json +129 -0
  604. package/registry/r/chat-thread.json +20 -0
  605. package/registry/r/chat-types.json +15 -0
  606. package/registry/r/checkbox.json +24 -0
  607. package/registry/r/cn.json +19 -0
  608. package/registry/r/code-block.json +21 -0
  609. package/registry/r/command-palette.json +25 -0
  610. package/registry/r/confirm-dialog.json +25 -0
  611. package/registry/r/context-card.json +23 -0
  612. package/registry/r/context-window-bar.json +20 -0
  613. package/registry/r/copy-button.json +22 -0
  614. package/registry/r/cost-meter.json +22 -0
  615. package/registry/r/created-files-card.json +23 -0
  616. package/registry/r/cron-job-card.json +22 -0
  617. package/registry/r/cron-jobs-list.json +23 -0
  618. package/registry/r/danger-zone.json +20 -0
  619. package/registry/r/data-table.json +27 -0
  620. package/registry/r/deployment-row.json +23 -0
  621. package/registry/r/dialog.json +23 -0
  622. package/registry/r/diff-viewer.json +20 -0
  623. package/registry/r/domain-config.json +25 -0
  624. package/registry/r/dropdown-menu.json +23 -0
  625. package/registry/r/empty-state.json +20 -0
  626. package/registry/r/env-var-editor.json +25 -0
  627. package/registry/r/folder-context-card.json +23 -0
  628. package/registry/r/folder-selector.json +22 -0
  629. package/registry/r/form-field.json +23 -0
  630. package/registry/r/hook-config.json +22 -0
  631. package/registry/r/hook-event-log.json +22 -0
  632. package/registry/r/input.json +22 -0
  633. package/registry/r/intent-selector.json +24 -0
  634. package/registry/r/label.json +22 -0
  635. package/registry/r/lane-board.json +20 -0
  636. package/registry/r/live-region-context.json +16 -0
  637. package/registry/r/login-split.json +20 -0
  638. package/registry/r/mcp-server-card.json +22 -0
  639. package/registry/r/mcp-server-list.json +23 -0
  640. package/registry/r/memory-editor.json +23 -0
  641. package/registry/r/mention-menu.json +23 -0
  642. package/registry/r/metrics-panel.json +22 -0
  643. package/registry/r/mode-types.json +15 -0
  644. package/registry/r/model-card.json +23 -0
  645. package/registry/r/model-selector.json +23 -0
  646. package/registry/r/page-shell.json +25 -0
  647. package/registry/r/pagination.json +22 -0
  648. package/registry/r/permission-matrix.json +22 -0
  649. package/registry/r/permission-modal.json +24 -0
  650. package/registry/r/permission-types.json +15 -0
  651. package/registry/r/pin-input.json +20 -0
  652. package/registry/r/plan-badge.json +20 -0
  653. package/registry/r/preview-env-card.json +25 -0
  654. package/registry/r/preview-panel.json +21 -0
  655. package/registry/r/progress-checklist.json +23 -0
  656. package/registry/r/progress.json +20 -0
  657. package/registry/r/project-card.json +25 -0
  658. package/registry/r/project-switcher.json +22 -0
  659. package/registry/r/quick-action-chips.json +21 -0
  660. package/registry/r/radio-group.json +23 -0
  661. package/registry/r/recent-folders-list.json +22 -0
  662. package/registry/r/rollback-ui.json +24 -0
  663. package/registry/r/rule-card.json +23 -0
  664. package/registry/r/rule-editor.json +28 -0
  665. package/registry/r/rule-types.json +18 -0
  666. package/registry/r/run-stats.json +22 -0
  667. package/registry/r/running-tasks-panel.json +22 -0
  668. package/registry/r/safe-href.json +16 -0
  669. package/registry/r/scroll-area.json +22 -0
  670. package/registry/r/select.json +24 -0
  671. package/registry/r/session-list-item.json +20 -0
  672. package/registry/r/session-timeline.json +22 -0
  673. package/registry/r/sheet.json +24 -0
  674. package/registry/r/sidebar.json +19 -0
  675. package/registry/r/skeleton.json +19 -0
  676. package/registry/r/skill-card.json +24 -0
  677. package/registry/r/skill-editor.json +28 -0
  678. package/registry/r/skills-list.json +23 -0
  679. package/registry/r/slide-deck.json +130 -0
  680. package/registry/r/slide-plugin-emoji.json +28 -0
  681. package/registry/r/slide-plugin-math.json +24 -0
  682. package/registry/r/slide-plugin-mermaid.json +23 -0
  683. package/registry/r/slide-plugin-shiki.json +23 -0
  684. package/registry/r/slide.json +123 -0
  685. package/registry/r/social-auth-row.json +21 -0
  686. package/registry/r/stat-tile.json +22 -0
  687. package/registry/r/status-dot.json +20 -0
  688. package/registry/r/steps-rail.json +20 -0
  689. package/registry/r/sub-agent-dispatch.json +22 -0
  690. package/registry/r/switch.json +23 -0
  691. package/registry/r/system-prompt-editor.json +22 -0
  692. package/registry/r/table.json +22 -0
  693. package/registry/r/tabs.json +22 -0
  694. package/registry/r/tailwind-preset.json +19 -0
  695. package/registry/r/task-header.json +24 -0
  696. package/registry/r/task-plan.json +22 -0
  697. package/registry/r/task-types.json +15 -0
  698. package/registry/r/terminal-panel.json +22 -0
  699. package/registry/r/textarea.json +22 -0
  700. package/registry/r/theme-provider.json +59 -0
  701. package/registry/r/theme-script.json +18 -0
  702. package/registry/r/theo-ui-provider.json +20 -0
  703. package/registry/r/timestamp.json +20 -0
  704. package/registry/r/toast.json +30 -0
  705. package/registry/r/token-usage-chart.json +20 -0
  706. package/registry/r/tokens.json +21 -0
  707. package/registry/r/tool-call-card.json +23 -0
  708. package/registry/r/tool-call.json +22 -0
  709. package/registry/r/tool-result.json +20 -0
  710. package/registry/r/tools-list.json +23 -0
  711. package/registry/r/tooltip.json +22 -0
  712. package/registry/r/topnav.json +22 -0
  713. package/registry/r/types.json +15 -0
  714. package/registry/r/usage-meter.json +21 -0
  715. package/registry/r/whiteboard.json +101 -0
@@ -0,0 +1,4621 @@
1
+ import { ClassValue } from 'clsx';
2
+ import * as react from 'react';
3
+ import { ReactNode, JSX as JSX$1, ComponentPropsWithoutRef, ComponentProps, ButtonHTMLAttributes, HTMLAttributes, InputHTMLAttributes, ComponentType, SVGProps, TextareaHTMLAttributes, ElementType, ReactElement, OutputHTMLAttributes, TdHTMLAttributes, ThHTMLAttributes, TimeHTMLAttributes } from 'react';
4
+ import * as class_variance_authority_types from 'class-variance-authority/types';
5
+ import * as ToastPrimitive from '@radix-ui/react-toast';
6
+ import { VariantProps } from 'class-variance-authority';
7
+ import * as DialogPrimitive from '@radix-ui/react-dialog';
8
+ import * as TabsPrimitive from '@radix-ui/react-tabs';
9
+ import * as TooltipPrimitive from '@radix-ui/react-tooltip';
10
+ import * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area';
11
+ import * as AvatarPrimitive from '@radix-ui/react-avatar';
12
+ import * as LabelPrimitive from '@radix-ui/react-label';
13
+ import * as SelectPrimitive from '@radix-ui/react-select';
14
+ import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
15
+ import * as RadioGroupPrimitive from '@radix-ui/react-radio-group';
16
+ import * as SwitchPrimitive from '@radix-ui/react-switch';
17
+ import * as lucide_react from 'lucide-react';
18
+ import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
19
+
20
+ /**
21
+ * Merge Tailwind classes with conflict resolution.
22
+ * Standard utility across all @theokit/ui components.
23
+ */
24
+ declare function cn(...inputs: ClassValue[]): string;
25
+
26
+ /**
27
+ * Theo UI — Theme types.
28
+ *
29
+ * A Theme is a frozen bundle of CSS-var values that the runtime can swap by
30
+ * setting `data-theme="<name>"` on `<html>`. The structure mirrors what lives
31
+ * in tokens.css so themes can be merged without ambiguity.
32
+ */
33
+ type ThemeMode = "light" | "dark";
34
+ interface ColorScale {
35
+ background: string;
36
+ foreground: string;
37
+ card: string;
38
+ "card-foreground": string;
39
+ popover: string;
40
+ "popover-foreground": string;
41
+ primary: string;
42
+ "primary-deep": string;
43
+ "primary-glow": string;
44
+ "primary-foreground": string;
45
+ secondary: string;
46
+ "secondary-foreground": string;
47
+ accent: string;
48
+ "accent-deep": string;
49
+ "accent-foreground": string;
50
+ muted: string;
51
+ "muted-foreground": string;
52
+ border: string;
53
+ input: string;
54
+ ring: string;
55
+ success: string;
56
+ "success-foreground": string;
57
+ warning: string;
58
+ "warning-foreground": string;
59
+ destructive: string;
60
+ "destructive-foreground": string;
61
+ info: string;
62
+ "info-foreground": string;
63
+ }
64
+ interface ThemeFonts {
65
+ /** Display headlines (h1-h3, hero text). */
66
+ display: string;
67
+ /** Body / UI text. */
68
+ body: string;
69
+ /** Code, mono, paths, timestamps. */
70
+ mono: string;
71
+ }
72
+ interface Theme {
73
+ /** Stable id, used in `data-theme`. */
74
+ name: string;
75
+ /** Human-readable label for theme switchers. */
76
+ label: string;
77
+ /** Optional short description shown in switchers. */
78
+ description?: string;
79
+ fonts: ThemeFonts;
80
+ light: ColorScale;
81
+ dark: ColorScale;
82
+ /**
83
+ * Optional URL(s) to fetch before applying. The provider injects a `<link>`
84
+ * tag once per URL to load remote fonts. Already-injected URLs are deduped.
85
+ */
86
+ fontUrls?: string[];
87
+ }
88
+
89
+ type Density = "compact" | "comfortable" | "spacious";
90
+ interface DensityContextValue {
91
+ density: Density;
92
+ setDensity: (next: Density) => void;
93
+ }
94
+ /**
95
+ * Read the current density from the active ThemeProvider context. Throws
96
+ * outside the provider so misuse fails loud — analogous to `useTheme`.
97
+ */
98
+ declare function useDensity(): DensityContextValue;
99
+
100
+ interface ThemeContextValue {
101
+ /** Active theme (full descriptor). */
102
+ theme: Theme;
103
+ /** Active mode: light or dark. */
104
+ mode: ThemeMode;
105
+ /** All available themes. */
106
+ themes: Theme[];
107
+ /** Swap the active theme by name. */
108
+ setTheme: (name: string) => void;
109
+ /** Set light/dark explicitly. */
110
+ setMode: (mode: ThemeMode) => void;
111
+ /** Toggle light <> dark. */
112
+ toggleMode: () => void;
113
+ /** Register an additional theme at runtime. */
114
+ registerTheme: (theme: Theme) => void;
115
+ }
116
+ interface ThemeProviderProps {
117
+ children: ReactNode;
118
+ /**
119
+ * Theme to start with. Must match the `name` of an entry in `themes`.
120
+ * Defaults to `"violet-forge"` for backward compat — if you don't pass
121
+ * `violet-forge` in `themes`, set this prop explicitly.
122
+ */
123
+ defaultTheme?: string;
124
+ /** Mode to start with. Defaults to `"dark"` (library is dark-first). */
125
+ defaultMode?: ThemeMode;
126
+ /**
127
+ * Available themes. **Required**: ThemeProvider does not auto-include any
128
+ * built-in theme since v0.1.0-next.0 — pass `builtinThemes` for all three
129
+ * Violet Forge defaults, or your own array for a slimmer bundle.
130
+ *
131
+ * Migration: consumers previously calling `<ThemeProvider>` without this
132
+ * prop now must pass `themes={builtinThemes}` (or use `<TheoUIProvider>`
133
+ * which defaults to `builtinThemes` for you).
134
+ */
135
+ themes: Theme[];
136
+ /**
137
+ * Persist selection in localStorage under this key. Pass `null` to disable.
138
+ * Default: "theo-ui:theme".
139
+ */
140
+ storageKey?: string | null;
141
+ /**
142
+ * Initial density. Drives `data-density` on `<html>` and the `--theo-control-h`
143
+ * / `--theo-control-px` CSS vars consumed by form-control `md` variants.
144
+ * Defaults to `"comfortable"` (36px controls — FAANG-tier modern density).
145
+ * Plan: faang-density-tightening (D3).
146
+ */
147
+ defaultDensity?: Density;
148
+ }
149
+ /**
150
+ * ThemeProvider — central registry + runtime switcher for Theo themes.
151
+ *
152
+ * Behavior:
153
+ * 1. On mount, injects a `<style id="theo-ui-theme-vars">` element with
154
+ * one CSS block per theme (`[data-theme="<name>"] { --token: ... }`).
155
+ * 2. Sets `data-theme` and `data-mode` on `<html>` so any element nested
156
+ * below inherits the right tokens (the Tailwind config consumes them).
157
+ * 3. Lazy-loads theme font URLs by injecting `<link rel="stylesheet">`.
158
+ * 4. Optionally persists choice in localStorage.
159
+ */
160
+ declare function ThemeProvider({ children, defaultTheme, defaultMode, themes: themesProp, storageKey, defaultDensity, }: ThemeProviderProps): JSX$1.Element;
161
+ /**
162
+ * useTheme — access theme state from any component inside <ThemeProvider>.
163
+ * Throws if used outside the provider — fail-fast.
164
+ */
165
+ declare function useTheme(): ThemeContextValue;
166
+
167
+ /**
168
+ * ThemeScript — inline `<script>` for SSR-safe theme initialization.
169
+ *
170
+ * Renders a synchronous script that runs BEFORE React hydration. It reads the
171
+ * persisted theme + mode from localStorage (or falls back to the defaults) and
172
+ * sets `data-theme` / `data-mode` on `<html>`, plus the `.dark` class when
173
+ * mode is dark. This eliminates FOUC and avoids hydration mismatch warnings
174
+ * when the user's persisted choice differs from the SSR defaults.
175
+ *
176
+ * Place this in `<head>` ABOVE `<body>`. The component does not need to live
177
+ * inside `<ThemeProvider>`.
178
+ *
179
+ * Security: every interpolated value is passed through `safe()`, which both
180
+ * `JSON.stringify`s the value AND escapes `<` to `<`. The `<` escape is
181
+ * REQUIRED because `JSON.stringify` alone does NOT escape `/`, so a payload
182
+ * like `"</script><script>alert(1)</script>"` would otherwise break out of
183
+ * the inline `<script>` tag even though it stays inside a JS string literal.
184
+ * (The browser tokenizes `</script>` at the HTML layer before JS parses.)
185
+ *
186
+ * Example (Next.js App Router): see docs/design-system.md → SSR section.
187
+ * Pass `defaultTheme` and `defaultMode` to align with the consumer's
188
+ * preferred initial state. Always wrap the root in `<html
189
+ * suppressHydrationWarning>` to silence the expected one-render diff.
190
+ */
191
+
192
+ interface ThemeScriptProps {
193
+ /** Theme name to apply when no persisted value exists. Default `"violet-forge"`. */
194
+ defaultTheme?: string;
195
+ /** Mode to apply when no persisted value exists. Default `"dark"`. */
196
+ defaultMode?: ThemeMode;
197
+ /**
198
+ * Density to apply when no persisted value exists. Default `"comfortable"`.
199
+ * Mirrors `ThemeProvider`'s `defaultDensity` so the inline-script and
200
+ * the React provider agree on the SSR-default density (and the
201
+ * `data-density` attribute set by this script matches what
202
+ * `ThemeProvider` promotes via its post-mount hydration effect).
203
+ */
204
+ defaultDensity?: "compact" | "comfortable" | "spacious";
205
+ /**
206
+ * localStorage namespace. Must match the `storageKey` passed to
207
+ * `<ThemeProvider>`. Default `"theo-ui:theme"`. Pass `null` to disable
208
+ * persistence reads (the script will always apply defaults).
209
+ */
210
+ storageKey?: string | null;
211
+ }
212
+ declare function ThemeScript({ defaultTheme, defaultMode, defaultDensity, storageKey, }: ThemeScriptProps): JSX$1.Element;
213
+
214
+ interface ThemeSwitcherProps {
215
+ className?: string;
216
+ /** If true, renders mode toggle inline next to the theme menu. */
217
+ showModeToggle?: boolean;
218
+ }
219
+ /**
220
+ * ThemeSwitcher — drop-in theme + mode picker.
221
+ *
222
+ * Two affordances:
223
+ * - Palette dropdown lists all registered themes with the active marked.
224
+ * - Optional sun/moon button toggles light/dark.
225
+ *
226
+ * Stateless wrt itself — pulls state from `useTheme()`.
227
+ */
228
+ declare function ThemeSwitcher({ className, showModeToggle }: ThemeSwitcherProps): JSX$1.Element;
229
+
230
+ /**
231
+ * Violet Forge — the default Theo theme.
232
+ *
233
+ * Identity: Theo violet primary (#7C3AED), burnt sienna accent (#C96442),
234
+ * Vercel-style neutral surfaces (pure white light / charcoal dark),
235
+ * Geist Sans + Geist Mono throughout.
236
+ *
237
+ * Source of truth for `data-theme` overrides. Values mirror
238
+ * src/styles/tokens.css for the default `:root`.
239
+ */
240
+ declare const violetForge: Theme;
241
+
242
+ /**
243
+ * Classic Paper — light-primary with deep-navy dark mirror; Inter + JetBrains Mono.
244
+ *
245
+ * Identity: warm paper background, deep navy foreground, indigo primary
246
+ * (closer to traditional dashboard SaaS), Inter throughout. Maximizes
247
+ * legibility and familiarity — use when reading endurance > differentiation.
248
+ *
249
+ * Provides a full `dark` palette mirror so consumers toggling `.dark` still
250
+ * get a coherent surface (it is not "light-only" by accident).
251
+ */
252
+ declare const classicPaper: Theme;
253
+
254
+ /**
255
+ * Aurora Terminal — dark-first, cyan-aurora primary, Geist Mono everywhere.
256
+ *
257
+ * Identity: deep oceanic background, cyan-aurora primary, aurora-pink accent.
258
+ * Headers use Geist with heavier tracking; body uses Geist Mono for full
259
+ * "developer console" feel. Suits CLI/devtools showcase.
260
+ */
261
+ declare const auroraTerminal: Theme;
262
+
263
+ /**
264
+ * `defineTheme(input)` — build a `Theme` from a partial override.
265
+ *
266
+ * Reduces the boilerplate of authoring a custom theme from 58 colour
267
+ * keys (`light` × 29 + `dark` × 29) to "just what you want to change".
268
+ * The merge always uses `violetForge` as the base — this is a pure,
269
+ * deterministic helper that does not depend on whatever theme is active
270
+ * at the call site.
271
+ *
272
+ * The `Theme` object it returns is drop-in compatible with
273
+ * `<ThemeProvider themes={[...]}>` — same shape as `violetForge`,
274
+ * `classicPaper`, and `auroraTerminal`.
275
+ *
276
+ * Honest caveat: if you override `light.primary` but NOT `dark.primary`,
277
+ * the two modes will use different colours — your override in light,
278
+ * Violet Forge's default in dark. That's intentional. Pass both sides
279
+ * to keep them in sync.
280
+ *
281
+ * @example
282
+ * import { defineTheme, hex } from "@theokit/ui";
283
+ * export const corp = defineTheme({
284
+ * name: "corp",
285
+ * light: { primary: hex("#0EA5E9") },
286
+ * dark: { primary: hex("#38BDF8") },
287
+ * });
288
+ *
289
+ * Plan: `.claude/knowledge-base/plans/theming-and-sizes-plan.md` T2.1.
290
+ */
291
+
292
+ interface DefineThemeInput {
293
+ /**
294
+ * Stable id used in `data-theme="<name>"` on the root element. Must
295
+ * match `/^[a-z][a-z0-9-]*$/i` (CSS-identifier-safe). Required.
296
+ */
297
+ name: string;
298
+ /**
299
+ * Human-readable label for theme switchers. Defaults to the
300
+ * capitalized version of `name` (e.g. "corp" → "Corp").
301
+ */
302
+ label?: string;
303
+ /** Optional one-line description shown in switchers. */
304
+ description?: string;
305
+ /**
306
+ * Override light-mode colours. Any key omitted is inherited from
307
+ * `violetForge.light`. See `ColorScale` for the full list.
308
+ */
309
+ light?: Partial<ColorScale>;
310
+ /**
311
+ * Override dark-mode colours. Any key omitted is inherited from
312
+ * `violetForge.dark`.
313
+ */
314
+ dark?: Partial<ColorScale>;
315
+ /**
316
+ * Override fonts (`display`, `body`, `mono`). Any key omitted is
317
+ * inherited from `violetForge.fonts`.
318
+ */
319
+ fonts?: Partial<ThemeFonts>;
320
+ /**
321
+ * Replace the default remote font URLs. Pass an empty array to skip
322
+ * font fetching entirely. Defaults to `violetForge.fontUrls` when
323
+ * omitted (so consumers that don't care still get Geist preloaded).
324
+ */
325
+ fontUrls?: string[];
326
+ }
327
+ declare function defineTheme(input: DefineThemeInput): Theme;
328
+
329
+ /**
330
+ * Color helpers that return values in the HSL string-tuple format the
331
+ * `ColorScale` shape expects (e.g. `"262 83% 58%"`).
332
+ *
333
+ * Why this format: matches the shadcn / Violet Forge convention where
334
+ * CSS variables hold the H S% L% components and consumers write
335
+ * `hsl(var(--primary))` (allowing alpha overlays via
336
+ * `hsl(var(--primary) / 0.5)`). Returning an object would force callers
337
+ * to write `${theme.light.primary.h} ${theme.light.primary.s}% …` —
338
+ * exactly the friction `hex()` is meant to remove.
339
+ *
340
+ * No external dependency: vanilla algorithm from CSS Color spec.
341
+ * Alpha channels are intentionally discarded — `ColorScale` is opaque;
342
+ * use `hsl(var(--primary) / 0.5)` in CSS for transparency.
343
+ *
344
+ * Plan: `.claude/knowledge-base/plans/theming-and-sizes-plan.md` T2.2.
345
+ */
346
+ /**
347
+ * Convert a hex color string to the HSL string-tuple format used by
348
+ * `ColorScale` ("`H S% L%`", e.g. `"262 83% 58%"`).
349
+ *
350
+ * Accepts `#rgb`, `#rgba`, `#rrggbb`, `#rrggbbaa`. Case-insensitive.
351
+ * Alpha bytes are silently dropped — use `hsl(var(--primary) / 0.5)`
352
+ * in CSS for transparency.
353
+ *
354
+ * @throws if the input is malformed.
355
+ *
356
+ * @example
357
+ * hex("#7C3AED") // "262 83% 58%"
358
+ * hex("#7c3aed") // "262 83% 58%" (same)
359
+ * hex("#abc") // expanded to "#aabbcc"
360
+ */
361
+ declare function hex(input: string): string;
362
+ /**
363
+ * Convert an RGB triplet (each in `[0, 255]`) to the HSL string-tuple
364
+ * format used by `ColorScale`.
365
+ *
366
+ * @throws if any channel is out of `[0, 255]`.
367
+ *
368
+ * @example
369
+ * rgb(124, 58, 237) // "262 83% 58%"
370
+ */
371
+ declare function rgb(r: number, g: number, b: number): string;
372
+
373
+ /**
374
+ * Vercel Mono — razor-sharp monochrome + signature blue.
375
+ *
376
+ * Inspired by, not affiliated with Vercel. Based on Geist Design tokens
377
+ * (https://github.com/vercel/geist). Light = pure white + black ink + blue
378
+ * accent (#0070F3); dark = near-black canvas + white text + same blue.
379
+ *
380
+ * Plan: .claude/knowledge-base/plans/seven-themes-plan.md T2.1
381
+ */
382
+ declare const vercelMono: Theme;
383
+
384
+ /**
385
+ * GitHub Dark — GitHub's default dark theme.
386
+ *
387
+ * Based on the canonical Primer Primitives tokens
388
+ * (https://github.com/primer/primitives, MIT). Light fallback uses GitHub's
389
+ * "light-default" Primer scale.
390
+ *
391
+ * Plan: .claude/knowledge-base/plans/seven-themes-plan.md T3.1
392
+ */
393
+ declare const githubDark: Theme;
394
+
395
+ /**
396
+ * Dracula — the cult OSS dark theme (https://draculatheme.com, MIT).
397
+ *
398
+ * Dark mode = canonical Dracula spec (background #282A36, signature pink
399
+ * #FF79C6, purple #BD93F9, etc.).
400
+ *
401
+ * Note: "light" mode is a Theo-original adaptation — Dracula upstream
402
+ * spec is dark-only. We darken the signature pink/purple to pass WCAG AA
403
+ * against light backgrounds, sacrificing palette purity for accessibility.
404
+ *
405
+ * Plan: .claude/knowledge-base/plans/seven-themes-plan.md T4.1
406
+ */
407
+ declare const dracula: Theme;
408
+
409
+ /**
410
+ * One Dark / One Light — Atom's iconic syntax theme.
411
+ *
412
+ * Sources:
413
+ * - atom/one-dark-syntax (MIT) — dark mode canonical
414
+ * - atom/one-light-syntax (MIT) — light mode canonical
415
+ *
416
+ * Plan: .claude/knowledge-base/plans/seven-themes-plan.md T5.1
417
+ */
418
+ declare const oneDark: Theme;
419
+
420
+ /**
421
+ * Anthropic-style — claude.ai-inspired editorial calm.
422
+ *
423
+ * Inspired by, not affiliated with Anthropic. Visually informed by claude.ai's
424
+ * warm cream canvas + burnt sienna primary + ink-on-paper feel. No proprietary
425
+ * assets reproduced (font is Geist, colors are independent measurements).
426
+ *
427
+ * Plan: .claude/knowledge-base/plans/seven-themes-plan.md T6.1
428
+ */
429
+ declare const anthropicStyle: Theme;
430
+
431
+ /**
432
+ * OpenAI-style — chatgpt.com-inspired minimal tech-utility.
433
+ *
434
+ * Inspired by, not affiliated with OpenAI. Pure white / charcoal canvas +
435
+ * signature ChatGPT green (#10A37F). Minimal saturation, high contrast.
436
+ *
437
+ * Plan: .claude/knowledge-base/plans/seven-themes-plan.md T7.1
438
+ */
439
+ declare const openaiStyle: Theme;
440
+
441
+ /**
442
+ * Linear Glass — linear.app-inspired glassy indigo.
443
+ *
444
+ * Inspired by, not affiliated with Linear. Refined indigo-violet primary
445
+ * (#5E6AD2) on near-black canvas in dark, pure white in light. Subtle
446
+ * glassmorphic surface temperature.
447
+ *
448
+ * Plan: .claude/knowledge-base/plans/seven-themes-plan.md T8.1
449
+ */
450
+ declare const linearGlass: Theme;
451
+
452
+ /**
453
+ * All themes bundled with Theo UI. Pass to `<ThemeProvider themes={builtinThemes}>`
454
+ * if you want all 10 available out of the box.
455
+ *
456
+ * EC-4 note: passing the full 10-entry list triggers ~60 KB CSS injection in
457
+ * `<style id="theo-ui-theme-vars">`. For apps focused on 1-2 themes, prefer
458
+ * `themes={[violetForge, dracula]}` to keep the payload at ~12 KB.
459
+ */
460
+ declare const builtinThemes: Theme[];
461
+
462
+ /**
463
+ * Toast — transient notification built on Radix Toast.
464
+ *
465
+ * Composition: app mounts <Toaster /> once. Components call `toast(...)` via
466
+ * the `useToast()` hook (see toaster.tsx). The look is theme-aware: status
467
+ * icon coloured by --primary/--success/--warning/--destructive; the body
468
+ * card uses --popover surface.
469
+ *
470
+ * Variants:
471
+ * - default (neutral)
472
+ * - info (primary tint)
473
+ * - success (deploy ok, action completed)
474
+ * - warning (queued, permission requested)
475
+ * - destructive (failed, fatal)
476
+ */
477
+ declare const toastVariants: (props?: ({
478
+ variant?: "success" | "warning" | "destructive" | "info" | "default" | null | undefined;
479
+ size?: "sm" | "md" | "lg" | null | undefined;
480
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
481
+ type ToastVariant = NonNullable<VariantProps<typeof toastVariants>["variant"]>;
482
+ interface ToastProps extends ComponentPropsWithoutRef<typeof ToastPrimitive.Root>, VariantProps<typeof toastVariants> {
483
+ }
484
+ declare const Toast: react.ForwardRefExoticComponent<ToastProps & react.RefAttributes<HTMLLIElement>> & {
485
+ Title: react.ForwardRefExoticComponent<Omit<ToastPrimitive.ToastTitleProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
486
+ Description: react.ForwardRefExoticComponent<Omit<ToastPrimitive.ToastDescriptionProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
487
+ Close: react.ForwardRefExoticComponent<Omit<ToastPrimitive.ToastCloseProps & react.RefAttributes<HTMLButtonElement>, "ref"> & react.RefAttributes<HTMLButtonElement>>;
488
+ Action: react.ForwardRefExoticComponent<Omit<ToastPrimitive.ToastActionProps & react.RefAttributes<HTMLButtonElement>, "ref"> & react.RefAttributes<HTMLButtonElement>>;
489
+ Provider: react.FC<ToastPrimitive.ToastProviderProps>;
490
+ Viewport: react.ForwardRefExoticComponent<ToastPrimitive.ToastViewportProps & react.RefAttributes<HTMLOListElement>>;
491
+ };
492
+
493
+ interface ToastDescriptor {
494
+ id: string;
495
+ title?: ReactNode;
496
+ description?: ReactNode;
497
+ variant?: ToastVariant;
498
+ /** Auto-dismiss in ms. Default 5000. Pass `null` for sticky. */
499
+ duration?: number | null;
500
+ action?: {
501
+ label: ReactNode;
502
+ onClick: () => void;
503
+ };
504
+ }
505
+ interface ToastContextValue {
506
+ toast: (descriptor: Omit<ToastDescriptor, "id">) => string;
507
+ dismiss: (id: string) => void;
508
+ }
509
+ interface ToasterProps {
510
+ children: ReactNode;
511
+ /** Toast viewport position. Default bottom-right. */
512
+ position?: "top-right" | "top-left" | "bottom-right" | "bottom-left";
513
+ className?: string;
514
+ }
515
+ /**
516
+ * Toaster — mount once at the app root. Wraps children in a Radix Toast
517
+ * Provider + Viewport and exposes the `useToast()` hook for descendants.
518
+ */
519
+ declare function Toaster({ children, position, className }: ToasterProps): JSX$1.Element;
520
+ /**
521
+ * useToast — fire toasts from anywhere inside <Toaster>.
522
+ *
523
+ * Example:
524
+ * const { toast } = useToast();
525
+ * toast({ title: "Deployed", variant: "success" });
526
+ */
527
+ declare function useToast(): ToastContextValue;
528
+
529
+ /**
530
+ * TheoUIProvider — primary entry point composing `<ThemeProvider>` and
531
+ * `<Toaster>` in the correct order with sensible defaults.
532
+ *
533
+ * Recommended for consumer apps to avoid hand-wiring the provider stack.
534
+ * Equivalent to:
535
+ *
536
+ * <ThemeProvider themes={builtinThemes} {...theme}>
537
+ * <Toaster {...toaster}>{children}</Toaster>
538
+ * </ThemeProvider>
539
+ *
540
+ * Notes:
541
+ * - Since v0.1.0-next.0, `<ThemeProvider>` requires the `themes` prop
542
+ * (T2.5 decoupling). `<TheoUIProvider>` defaults it to `builtinThemes`
543
+ * to preserve "works out of the box" DX. Pass `theme.themes` to override.
544
+ * - The `"use client"` directive is required for Next.js App Router (RSC)
545
+ * because `<ThemeProvider>` uses React state and effects internally.
546
+ * - `<Tooltip>` provider stays per-instance (Radix recommendation) — this
547
+ * wrapper does NOT introduce a global tooltip context.
548
+ * - `<ThemeProvider>` and `<Toaster>` remain independently exported for
549
+ * consumers who want bespoke control.
550
+ *
551
+ * SSR:
552
+ * - Place `<ThemeScript>` in `<head>` to avoid FOUC + hydration mismatch.
553
+ * - Wrap `<html lang="en" suppressHydrationWarning>`.
554
+ *
555
+ * @example
556
+ * import { TheoUIProvider } from "@theokit/ui";
557
+ *
558
+ * export default function App({ children }) {
559
+ * return <TheoUIProvider>{children}</TheoUIProvider>;
560
+ * }
561
+ */
562
+ interface TheoUIProviderProps {
563
+ children: ReactNode;
564
+ /** Pass-through props for the inner `<ThemeProvider>`. Optional. */
565
+ theme?: Omit<ComponentProps<typeof ThemeProvider>, "children" | "themes"> & {
566
+ /** Override the default theme set (defaults to `builtinThemes`). */
567
+ themes?: ComponentProps<typeof ThemeProvider>["themes"];
568
+ };
569
+ /** Pass-through props for the inner `<Toaster>`. */
570
+ toaster?: Omit<ComponentProps<typeof Toaster>, "children">;
571
+ }
572
+ declare function TheoUIProvider({ children, theme, toaster }: TheoUIProviderProps): JSX$1.Element;
573
+ declare namespace TheoUIProvider {
574
+ var displayName: string;
575
+ }
576
+
577
+ /**
578
+ * Chat message types — structurally compatible with `vercel/ai` `UIMessage`.
579
+ *
580
+ * Verbatim of the part-type shape from `packages/ai/src/ui/ui-messages.ts`
581
+ * (Apache-2.0, copyright Vercel Inc., see NOTICE). Re-declared standalone so
582
+ * `@theokit/ui` does not take `ai` as a direct dependency — the goal is
583
+ * interop without coupling.
584
+ *
585
+ * Consumer code using `useChat()` from `@ai-sdk/react`:
586
+ *
587
+ * const { messages } = useChat();
588
+ * return messages.map((m) => <ChatMessage message={m} />);
589
+ *
590
+ * Works because the Vercel `UIMessage` shape is structurally assignable to
591
+ * the types declared here.
592
+ */
593
+ type MessageRole = "system" | "user" | "assistant";
594
+ /**
595
+ * Orthogonal attachment shape used by `<AttachmentChip>` and chat composer
596
+ * primitives. Distinct from `FileUIPart` (which is part of the message
597
+ * payload) — `Attachment` is the consumer's pending-upload state.
598
+ */
599
+ interface Attachment {
600
+ id: string;
601
+ name: string;
602
+ size?: string;
603
+ type?: string;
604
+ }
605
+ type ProviderMetadata = Record<string, Record<string, unknown>>;
606
+ /**
607
+ * A text part of a message.
608
+ */
609
+ interface TextUIPart {
610
+ type: "text";
611
+ text: string;
612
+ /** "streaming" while tokens arrive; "done" when complete. */
613
+ state?: "streaming" | "done";
614
+ providerMetadata?: ProviderMetadata;
615
+ }
616
+ /**
617
+ * A reasoning ("thinking") part of a message — typically rendered as a
618
+ * collapsible panel.
619
+ */
620
+ interface ReasoningUIPart {
621
+ type: "reasoning";
622
+ text: string;
623
+ state?: "streaming" | "done";
624
+ providerMetadata?: ProviderMetadata;
625
+ }
626
+ /**
627
+ * A file part of a message (image, document, audio, video).
628
+ */
629
+ interface FileUIPart {
630
+ type: "file";
631
+ /**
632
+ * IANA media type (e.g. `image/png`) or top-level segment (e.g. `image`).
633
+ */
634
+ mediaType: string;
635
+ filename?: string;
636
+ /** URL or data: URL. */
637
+ url: string;
638
+ providerMetadata?: ProviderMetadata;
639
+ }
640
+ /**
641
+ * A file emitted as part of a reasoning trace (e.g. internal scratchpad).
642
+ */
643
+ interface ReasoningFileUIPart {
644
+ type: "reasoning-file";
645
+ mediaType: string;
646
+ url: string;
647
+ providerMetadata?: ProviderMetadata;
648
+ }
649
+ /**
650
+ * A URL source citation.
651
+ */
652
+ interface SourceUrlUIPart {
653
+ type: "source-url";
654
+ sourceId: string;
655
+ url: string;
656
+ title?: string;
657
+ providerMetadata?: ProviderMetadata;
658
+ }
659
+ /**
660
+ * A document source citation.
661
+ */
662
+ interface SourceDocumentUIPart {
663
+ type: "source-document";
664
+ sourceId: string;
665
+ mediaType: string;
666
+ title: string;
667
+ filename?: string;
668
+ providerMetadata?: ProviderMetadata;
669
+ }
670
+ /**
671
+ * A step boundary marker — used to delimit multi-step agent responses.
672
+ */
673
+ interface StepStartUIPart {
674
+ type: "step-start";
675
+ }
676
+ /**
677
+ * A provider-specific custom content part.
678
+ */
679
+ interface CustomContentUIPart {
680
+ type: "custom";
681
+ /** Format: `${provider}.${providerType}`. */
682
+ kind: `${string}.${string}`;
683
+ providerMetadata?: ProviderMetadata;
684
+ }
685
+ type ToolInvocationState = "input-streaming" | "input-available" | "approval-requested" | "approval-responded" | "output-available" | "output-error" | "output-denied";
686
+ /**
687
+ * A tool invocation part — covers both static (typed) and dynamic tools via
688
+ * the `dynamic-tool` discriminator. The `type` field follows the Vercel
689
+ * convention: `tool-${toolName}` for static, `dynamic-tool` for runtime.
690
+ */
691
+ interface ToolUIPart {
692
+ /** `tool-${toolName}` (static) or `dynamic-tool` (runtime). */
693
+ type: `tool-${string}` | "dynamic-tool";
694
+ toolCallId: string;
695
+ toolName?: string;
696
+ title?: string;
697
+ state: ToolInvocationState;
698
+ input?: unknown;
699
+ output?: unknown;
700
+ errorText?: string;
701
+ providerExecuted?: boolean;
702
+ callProviderMetadata?: ProviderMetadata;
703
+ resultProviderMetadata?: ProviderMetadata;
704
+ approval?: {
705
+ id: string;
706
+ approved?: boolean;
707
+ reason?: string;
708
+ isAutomatic?: boolean;
709
+ };
710
+ }
711
+ /**
712
+ * A data part — typed custom application state. The `type` field follows
713
+ * `data-${name}` and `data` carries the payload. Consumers register a
714
+ * renderer per `data-${name}` via the `<ChatMessage>` `dataRenderers` prop.
715
+ */
716
+ interface DataUIPart {
717
+ /** `data-${name}` */
718
+ type: `data-${string}`;
719
+ id?: string;
720
+ data: unknown;
721
+ }
722
+ type UIMessagePart = TextUIPart | ReasoningUIPart | FileUIPart | ReasoningFileUIPart | SourceUrlUIPart | SourceDocumentUIPart | StepStartUIPart | CustomContentUIPart | ToolUIPart | DataUIPart;
723
+ declare function isTextUIPart(part: UIMessagePart): part is TextUIPart;
724
+ declare function isReasoningUIPart(part: UIMessagePart): part is ReasoningUIPart;
725
+ declare function isFileUIPart(part: UIMessagePart): part is FileUIPart;
726
+ declare function isReasoningFileUIPart(part: UIMessagePart): part is ReasoningFileUIPart;
727
+ declare function isSourceUrlUIPart(part: UIMessagePart): part is SourceUrlUIPart;
728
+ declare function isSourceDocumentUIPart(part: UIMessagePart): part is SourceDocumentUIPart;
729
+ declare function isStepStartUIPart(part: UIMessagePart): part is StepStartUIPart;
730
+ declare function isCustomContentUIPart(part: UIMessagePart): part is CustomContentUIPart;
731
+ declare function isToolUIPart(part: UIMessagePart): part is ToolUIPart;
732
+ declare function isDataUIPart(part: UIMessagePart): part is DataUIPart;
733
+ /**
734
+ * A chat message in UI form.
735
+ *
736
+ * Field-for-field compatible with `UIMessage` from `vercel/ai` (the AI SDK's
737
+ * `useChat()` return type) — a consumer's `useChat()` messages flow into
738
+ * `<ChatMessage message={msg} />` with zero adapter.
739
+ *
740
+ * `metadata` is opaque (`unknown`) so consumers can attach arbitrary fields
741
+ * (timestamps, model identifiers, request IDs, …) without our type
742
+ * dictating shape.
743
+ */
744
+ interface UIMessage {
745
+ id: string;
746
+ role: MessageRole;
747
+ parts: UIMessagePart[];
748
+ metadata?: unknown;
749
+ }
750
+
751
+ type AgentEventType = "command" | "file_read" | "file_write" | "edit" | "lint" | "typecheck" | "build" | "tool";
752
+ type AgentEventStatus = "pending" | "running" | "success" | "failed";
753
+ interface AgentEvent$1 {
754
+ id: string;
755
+ type: AgentEventType;
756
+ label: string;
757
+ /** File path when the event is file-related. */
758
+ path?: string;
759
+ /** Diff stats for edit/write events. */
760
+ diff?: {
761
+ added: number;
762
+ removed: number;
763
+ };
764
+ status: AgentEventStatus;
765
+ timestamp?: string;
766
+ /** Optional expandable detail (e.g. command output, diff snippet). */
767
+ detail?: ReactNode;
768
+ }
769
+
770
+ type PermissionOperation = "read" | "write" | "delete";
771
+ type PermissionDecision = "denied" | "allowed_once" | "always_allowed";
772
+ interface PermissionRequest {
773
+ /** Absolute path to the resource (file or folder). */
774
+ path: string;
775
+ /** Operations the agent wants to perform on the resource. */
776
+ operations: PermissionOperation[];
777
+ }
778
+
779
+ type TaskStatus = "idle" | "permission_required" | "starting" | "running" | "verifying" | "completed" | "failed";
780
+ type TaskStepStatus = "pending" | "running" | "done" | "skipped";
781
+ interface TaskStep {
782
+ id: string;
783
+ label: string;
784
+ status: TaskStepStatus;
785
+ /** 0..1 progress for in-flight steps. */
786
+ progress?: number;
787
+ }
788
+
789
+ /**
790
+ * Button — primitive action element in the Violet Forge design system.
791
+ *
792
+ * Variants:
793
+ * - primary Theo violet fill, glow on hover (signature)
794
+ * - secondary surface with hairline border
795
+ * - accent burnt-sienna fill, celebratory actions
796
+ * - ghost transparent, hover lifts surface
797
+ * - link text-only, primary color, underline on hover
798
+ * - destructive for irreversible actions
799
+ *
800
+ * Sizes: sm (32px) · md (40px, default) · lg (48px) · icon (square 40px)
801
+ *
802
+ * `asChild` swaps the root for the consumer's element (Radix Slot pattern).
803
+ */
804
+ declare const buttonVariants: (props?: ({
805
+ variant?: "accent" | "link" | "primary" | "secondary" | "destructive" | "ghost" | null | undefined;
806
+ size?: "sm" | "md" | "lg" | "icon" | null | undefined;
807
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
808
+ interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
809
+ asChild?: boolean;
810
+ }
811
+ declare const Button: react.ForwardRefExoticComponent<ButtonProps & react.RefAttributes<HTMLButtonElement>>;
812
+
813
+ /**
814
+ * Badge — small status / tag indicator.
815
+ *
816
+ * Variants:
817
+ * - default muted surface, hairline border
818
+ * - primary violet outline + soft violet bg
819
+ * - accent burnt sienna (celebration / pro / beta)
820
+ * - success deploy succeeded
821
+ * - warning attention needed
822
+ * - destructive failed
823
+ * - outline transparent, just border
824
+ *
825
+ * Status dots are inlined via `<Badge.Dot />` for things like "Building…",
826
+ * "Running", "Failed" rows in deployment lists.
827
+ */
828
+ declare const badgeVariants: (props?: ({
829
+ variant?: "accent" | "primary" | "success" | "warning" | "destructive" | "default" | "outline" | null | undefined;
830
+ size?: "sm" | "md" | "lg" | null | undefined;
831
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
832
+ interface BadgeProps extends HTMLAttributes<HTMLSpanElement>, VariantProps<typeof badgeVariants> {
833
+ }
834
+ declare const Badge: react.ForwardRefExoticComponent<BadgeProps & react.RefAttributes<HTMLSpanElement>>;
835
+ interface BadgeDotProps extends HTMLAttributes<HTMLSpanElement> {
836
+ pulse?: boolean;
837
+ tone?: "primary" | "accent" | "success" | "warning" | "destructive" | "muted";
838
+ }
839
+ declare const Dot: react.ForwardRefExoticComponent<BadgeDotProps & react.RefAttributes<HTMLSpanElement>>;
840
+ declare const BadgeWithDot: typeof Badge & {
841
+ Dot: typeof Dot;
842
+ };
843
+
844
+ /**
845
+ * ThinkingLevelSelector — multi-state combobox for LLM reasoning budget.
846
+ *
847
+ * Mirrors the OpenClaw Control UI thinking selector. Values follow the SDK's
848
+ * `Agent.thinking` parameter ("minimal" | "low" | "medium" | "high" | "xhigh")
849
+ * plus a sentinel "off" and the special "inherited" mode that means "use the
850
+ * value resolved by the parent agent/session".
851
+ *
852
+ * Pure UI primitive. No backend dependency. Consumer wires `value` from agent
853
+ * state and persists `onChange` selections wherever it pleases.
854
+ *
855
+ * Phase 1 of `theokit-ui-parity-plan.md` (T1.1).
856
+ */
857
+ type ThinkingLevel = "off" | "minimal" | "low" | "medium" | "high" | "xhigh";
858
+ type ThinkingLevelOrInherited = ThinkingLevel | "inherited";
859
+ interface ThinkingLevelSelectorProps {
860
+ value: ThinkingLevelOrInherited;
861
+ inheritedValue?: ThinkingLevel;
862
+ onChange: (value: ThinkingLevelOrInherited) => void;
863
+ disabled?: boolean;
864
+ className?: string;
865
+ "data-testid"?: string;
866
+ }
867
+ declare const ThinkingLevelSelector: react.ForwardRefExoticComponent<ThinkingLevelSelectorProps & react.RefAttributes<HTMLSelectElement>>;
868
+
869
+ /**
870
+ * RunStatusPill — compact status indicator for Run/Task lifecycle states.
871
+ * Mirrors OpenClaw's `Run status: In progress | Done | Interrupted` pill.
872
+ * Closed enum mirrors SDK `Task` state (D362).
873
+ */
874
+ type RunStatus = "queued" | "in_progress" | "finished" | "error" | "cancelled" | "interrupted";
875
+ interface RunStatusPillProps extends Omit<HTMLAttributes<HTMLSpanElement>, "title"> {
876
+ status: RunStatus;
877
+ detail?: string;
878
+ "data-testid"?: string;
879
+ }
880
+ declare const RunStatusPill: react.ForwardRefExoticComponent<RunStatusPillProps & react.RefAttributes<HTMLSpanElement>>;
881
+
882
+ /**
883
+ * BranchIndicator — small "×N" pill that shows when a run was retried/branched.
884
+ *
885
+ * Renders `null` when `branchCount < 2` OR when not a positive integer.
886
+ * EC-10 guard: parametrized over [-1, 0, 0.5] in tests.
887
+ */
888
+ interface BranchIndicatorProps extends HTMLAttributes<HTMLSpanElement> {
889
+ branchCount: number;
890
+ tooltipText?: string;
891
+ "data-testid"?: string;
892
+ }
893
+ declare const BranchIndicator: react.ForwardRefExoticComponent<BranchIndicatorProps & react.RefAttributes<HTMLSpanElement>>;
894
+
895
+ /**
896
+ * GatewayStatusIndicator — live connection-status dot for a gateway/server.
897
+ *
898
+ * Variants:
899
+ * - compact : colored dot only (sidebar footer use)
900
+ * - labeled : dot + label + optional latency text
901
+ *
902
+ * `reconnecting` state animates with `animate-pulse` and respects
903
+ * `prefers-reduced-motion` automatically (Tailwind defaults).
904
+ */
905
+ type GatewayStatus = "online" | "offline" | "degraded" | "reconnecting";
906
+ interface GatewayStatusIndicatorProps extends Omit<HTMLAttributes<HTMLSpanElement>, "title"> {
907
+ status: GatewayStatus;
908
+ latencyMs?: number;
909
+ variant?: "compact" | "labeled";
910
+ "data-testid"?: string;
911
+ }
912
+ declare const GatewayStatusIndicator: react.ForwardRefExoticComponent<GatewayStatusIndicatorProps & react.RefAttributes<HTMLSpanElement>>;
913
+
914
+ /**
915
+ * UpdateBanner — top-of-app alert when a newer version is available.
916
+ *
917
+ * Controlled. Dismiss persistence (localStorage/cookie/etc) is the consumer's
918
+ * responsibility (per EC-16 DOCUMENT). Component just fires `onDismiss`.
919
+ */
920
+ interface UpdateBannerProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> {
921
+ currentVersion: string;
922
+ latestVersion: string;
923
+ onUpdate: () => void;
924
+ onDismiss?: () => void;
925
+ severity?: "info" | "warn";
926
+ "data-testid"?: string;
927
+ }
928
+ declare const UpdateBanner: react.ForwardRefExoticComponent<UpdateBannerProps & react.RefAttributes<HTMLDivElement>>;
929
+
930
+ /**
931
+ * ExportChatDialog — modal letting users export a chat session in selectable
932
+ * formats. Async-aware: `onExport` returning a Promise disables the button
933
+ * until resolution.
934
+ *
935
+ * Controlled. Consumer renders the trigger and toggles `open`.
936
+ */
937
+ type ExportFormat = "markdown" | "json" | "jsonl" | "sharegpt";
938
+ interface ExportChatDialogProps {
939
+ open: boolean;
940
+ onOpenChange: (open: boolean) => void;
941
+ onExport: (format: ExportFormat) => void | Promise<void>;
942
+ availableFormats?: ExportFormat[];
943
+ sessionLabel?: string;
944
+ className?: string;
945
+ "data-testid"?: string;
946
+ }
947
+ declare const ExportChatDialog: react.ForwardRefExoticComponent<ExportChatDialogProps & react.RefAttributes<HTMLDivElement>>;
948
+
949
+ /**
950
+ * StabilityBundleViewer — inspector for a stability-bundle JSON produced by a
951
+ * server crash. Sections (error, env, config, metadata) collapse independently.
952
+ *
953
+ * EC-9: handles bundles missing optional sections gracefully. Renderer DOES
954
+ * NOT redact env values — bundle writer is expected to redact at emit-time.
955
+ */
956
+ type StabilitySeverity = "fatal" | "error" | "warn";
957
+ interface StabilityBundle {
958
+ timestamp: string;
959
+ severity: StabilitySeverity;
960
+ summary: string;
961
+ error?: {
962
+ name: string;
963
+ message: string;
964
+ stack?: string;
965
+ };
966
+ env?: Record<string, string>;
967
+ config?: Record<string, unknown>;
968
+ metadata?: Record<string, unknown>;
969
+ }
970
+ interface StabilityBundleViewerProps {
971
+ bundle: StabilityBundle;
972
+ onCopy?: () => void;
973
+ className?: string;
974
+ "data-testid"?: string;
975
+ }
976
+ declare const StabilityBundleViewer: react.ForwardRefExoticComponent<StabilityBundleViewerProps & react.RefAttributes<HTMLDivElement>>;
977
+
978
+ /**
979
+ * Card — surface container for grouping related content.
980
+ *
981
+ * Composition pattern (shadcn-style):
982
+ * <Card>
983
+ * <Card.Header>
984
+ * <Card.Title>…</Card.Title>
985
+ * <Card.Description>…</Card.Description>
986
+ * </Card.Header>
987
+ * <Card.Body>…</Card.Body>
988
+ * <Card.Footer>…</Card.Footer>
989
+ * </Card>
990
+ *
991
+ * The `size` prop on the root propagates to subparts via Context, so a
992
+ * single declaration controls padding + heading scale across the compound.
993
+ * Subparts used in isolation default to `md`. Subparts do NOT accept a `size`
994
+ * prop of their own — use `className` for granular per-subpart tweaks.
995
+ * (EC-8, edge-case review 2026-05-20.)
996
+ */
997
+ type CardSize = "sm" | "md" | "lg";
998
+ interface CardRootProps extends HTMLAttributes<HTMLDivElement> {
999
+ size?: CardSize;
1000
+ }
1001
+ interface TitleProps extends HTMLAttributes<HTMLHeadingElement> {
1002
+ /**
1003
+ * When true, renders the child element with the Card.Title styles applied
1004
+ * (Radix Slot pattern). Use to swap the default `<h3>` for `<h1>` / `<h2>`
1005
+ * when the heading hierarchy requires it.
1006
+ */
1007
+ asChild?: boolean;
1008
+ }
1009
+ declare const Card: react.ForwardRefExoticComponent<CardRootProps & react.RefAttributes<HTMLDivElement>> & {
1010
+ Header: react.ForwardRefExoticComponent<HTMLAttributes<HTMLDivElement> & react.RefAttributes<HTMLDivElement>>;
1011
+ Title: react.ForwardRefExoticComponent<TitleProps & react.RefAttributes<HTMLHeadingElement>>;
1012
+ Description: react.ForwardRefExoticComponent<HTMLAttributes<HTMLParagraphElement> & react.RefAttributes<HTMLParagraphElement>>;
1013
+ Body: react.ForwardRefExoticComponent<HTMLAttributes<HTMLDivElement> & react.RefAttributes<HTMLDivElement>>;
1014
+ Footer: react.ForwardRefExoticComponent<HTMLAttributes<HTMLDivElement> & react.RefAttributes<HTMLDivElement>>;
1015
+ };
1016
+
1017
+ declare const inputVariants: (props?: ({
1018
+ size?: "sm" | "md" | "lg" | null | undefined;
1019
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
1020
+ /**
1021
+ * Input — text input primitive.
1022
+ *
1023
+ * Violet Forge specifics:
1024
+ * - height 40px (h-10) matching default Button md.
1025
+ * - rounded-md (6px) — slightly less than buttons to differentiate.
1026
+ * - focus uses violet ring (--ring).
1027
+ * - placeholder uses --muted-foreground.
1028
+ *
1029
+ * The `size` prop accepts `"sm" | "md" | "lg"`. Default `md` preserves the
1030
+ * 40px tall input from before this prop existed. EC-1 (edge-case review):
1031
+ * this overrides the native HTML `size` attribute (text-input columns) —
1032
+ * use `{...{ size: 20 } as any}` if you genuinely need the HTML attribute,
1033
+ * which is exceedingly rare.
1034
+ */
1035
+ interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, "size">, VariantProps<typeof inputVariants> {
1036
+ }
1037
+ declare const Input: react.ForwardRefExoticComponent<InputProps & react.RefAttributes<HTMLInputElement>>;
1038
+
1039
+ interface ContentProps$1 extends ComponentPropsWithoutRef<typeof DialogPrimitive.Content> {
1040
+ hideCloseButton?: boolean;
1041
+ }
1042
+ declare const Dialog: react.FC<DialogPrimitive.DialogProps> & {
1043
+ Trigger: react.ForwardRefExoticComponent<DialogPrimitive.DialogTriggerProps & react.RefAttributes<HTMLButtonElement>>;
1044
+ Close: react.ForwardRefExoticComponent<DialogPrimitive.DialogCloseProps & react.RefAttributes<HTMLButtonElement>>;
1045
+ Content: react.ForwardRefExoticComponent<ContentProps$1 & react.RefAttributes<HTMLDivElement>>;
1046
+ Overlay: react.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogOverlayProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
1047
+ Header: {
1048
+ ({ className, ...props }: HTMLAttributes<HTMLDivElement>): react.JSX.Element;
1049
+ displayName: string;
1050
+ };
1051
+ Body: {
1052
+ ({ className, ...props }: HTMLAttributes<HTMLDivElement>): react.JSX.Element;
1053
+ displayName: string;
1054
+ };
1055
+ Footer: {
1056
+ ({ className, ...props }: HTMLAttributes<HTMLDivElement>): react.JSX.Element;
1057
+ displayName: string;
1058
+ };
1059
+ Title: react.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogTitleProps & react.RefAttributes<HTMLHeadingElement>, "ref"> & react.RefAttributes<HTMLHeadingElement>>;
1060
+ Description: react.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogDescriptionProps & react.RefAttributes<HTMLParagraphElement>, "ref"> & react.RefAttributes<HTMLParagraphElement>>;
1061
+ };
1062
+
1063
+ declare const Tabs: react.ForwardRefExoticComponent<TabsPrimitive.TabsProps & react.RefAttributes<HTMLDivElement>> & {
1064
+ List: react.ForwardRefExoticComponent<Omit<TabsPrimitive.TabsListProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
1065
+ Trigger: react.ForwardRefExoticComponent<Omit<TabsPrimitive.TabsTriggerProps & react.RefAttributes<HTMLButtonElement>, "ref"> & react.RefAttributes<HTMLButtonElement>>;
1066
+ Content: react.ForwardRefExoticComponent<Omit<TabsPrimitive.TabsContentProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
1067
+ };
1068
+
1069
+ /**
1070
+ * Tooltip — built on Radix Tooltip.
1071
+ *
1072
+ * Visual: dark surface in light mode (and inverse in dark) with rounded-md,
1073
+ * shadow-md, text-body-sm. 8px delay-show default.
1074
+ *
1075
+ * Wrap your app in <Tooltip.Provider> once (or use the default delayDuration here).
1076
+ */
1077
+ declare const Provider: react.FC<TooltipPrimitive.TooltipProviderProps>;
1078
+ declare const Root$2: react.FC<TooltipPrimitive.TooltipProps>;
1079
+ declare const Trigger$1: react.ForwardRefExoticComponent<TooltipPrimitive.TooltipTriggerProps & react.RefAttributes<HTMLButtonElement>>;
1080
+ declare const Content$2: react.ForwardRefExoticComponent<Omit<TooltipPrimitive.TooltipContentProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
1081
+ interface TooltipProps extends ComponentPropsWithoutRef<typeof TooltipPrimitive.Root> {
1082
+ label: ReactNode;
1083
+ side?: "top" | "right" | "bottom" | "left";
1084
+ align?: "start" | "center" | "end";
1085
+ children: ReactNode;
1086
+ }
1087
+ /**
1088
+ * Shorthand: <Tooltip label="…"><Button>…</Button></Tooltip>
1089
+ * Wraps Provider + Root + Trigger asChild + Content for the common case.
1090
+ * For advanced usage (controlled state, custom content), use Tooltip.Root etc. directly.
1091
+ */
1092
+ declare const Tooltip: ({ label, side, align, delayDuration, children, ...rootProps }: TooltipProps) => ReturnType<typeof Provider>;
1093
+ declare const TooltipWithStatics: typeof Tooltip & {
1094
+ Provider: typeof Provider;
1095
+ Root: typeof Root$2;
1096
+ Trigger: typeof Trigger$1;
1097
+ Content: typeof Content$2;
1098
+ };
1099
+
1100
+ /**
1101
+ * ScrollArea — custom scroller with Violet Forge styling.
1102
+ *
1103
+ * Built on Radix ScrollArea so the native scrollbar is always hidden and the
1104
+ * custom thumb stays consistent across Chrome/Firefox/Safari/macOS-trackpad.
1105
+ *
1106
+ * Visual:
1107
+ * - track is transparent, only the thumb is visible.
1108
+ * - thumb is `--primary` at 25% opacity by default; on hover, 45% with violet glow.
1109
+ * - active drag bumps to 60%.
1110
+ * - the rounded full pill thumb plays well with the brutalist border language
1111
+ * but stays subtle (1.5px wide on rest, 3px on hover).
1112
+ *
1113
+ * Modes (via `type`):
1114
+ * - "hover" (default) — scrollbar fades in on hover/focus, otherwise hidden.
1115
+ * - "always" — scrollbar always visible.
1116
+ * - "auto" — scrollbar visible only when content overflows.
1117
+ * - "scroll" — Radix-managed: visible only while scrolling.
1118
+ */
1119
+ interface ScrollAreaProps extends ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root> {
1120
+ /**
1121
+ * Optional override for which scrollbar(s) to render.
1122
+ * Defaults: vertical only. Set to "both" for grids/tables with overflow-x.
1123
+ */
1124
+ orientation?: "vertical" | "horizontal" | "both";
1125
+ /**
1126
+ * Thickness of the scrollbar. Default "thin" (2.5px → 3.5px on hover).
1127
+ * Use "regular" (8px) for content where the scrollbar should be a more prominent target.
1128
+ */
1129
+ size?: "thin" | "regular";
1130
+ }
1131
+ interface ScrollBarProps extends ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar> {
1132
+ size?: "thin" | "regular";
1133
+ }
1134
+ declare const ScrollArea: react.ForwardRefExoticComponent<ScrollAreaProps & react.RefAttributes<HTMLDivElement>> & {
1135
+ Bar: react.ForwardRefExoticComponent<ScrollBarProps & react.RefAttributes<HTMLDivElement>>;
1136
+ };
1137
+
1138
+ /**
1139
+ * Skeleton — placeholder block shown while content is loading.
1140
+ *
1141
+ * Uses --muted as base + a subtle shimmer that respects the violet theme.
1142
+ * Compose multiple Skeletons to mirror your component layout while loading.
1143
+ *
1144
+ * Accessibility (LOW-004): the default `role="status"` + `aria-live="polite"`
1145
+ * announces "Loading" to screen readers. In loops or grids where many
1146
+ * Skeletons mount simultaneously, this can be noisy. Override per-instance
1147
+ * with `aria-live="off"` and/or `aria-hidden` when only one container-level
1148
+ * loading announcement is desired:
1149
+ *
1150
+ * <div role="status" aria-live="polite" aria-label="Loading deployments">
1151
+ * {placeholders.map(id => (
1152
+ * <Skeleton key={id} aria-live="off" aria-hidden="true" className="h-8" />
1153
+ * ))}
1154
+ * </div>
1155
+ */
1156
+ declare const Skeleton: react.ForwardRefExoticComponent<HTMLAttributes<HTMLDivElement> & react.RefAttributes<HTMLDivElement>>;
1157
+
1158
+ /**
1159
+ * Avatar — user/team avatar with safe fallback to initials.
1160
+ *
1161
+ * Composition:
1162
+ * <Avatar size="md">
1163
+ * <Avatar.Image src="…" alt="…" />
1164
+ * <Avatar.Fallback>AA</Avatar.Fallback>
1165
+ * </Avatar>
1166
+ *
1167
+ * Built on Radix Avatar (handles image load failures → fallback automatically).
1168
+ * Sizes scale on the root; fallback inherits the size's text scale.
1169
+ */
1170
+ declare const avatarVariants: (props?: ({
1171
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | null | undefined;
1172
+ tone?: "accent" | "primary" | "muted" | null | undefined;
1173
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
1174
+ interface AvatarProps extends ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>, VariantProps<typeof avatarVariants> {
1175
+ }
1176
+ declare const Avatar: react.ForwardRefExoticComponent<AvatarProps & react.RefAttributes<HTMLSpanElement>> & {
1177
+ Image: react.ForwardRefExoticComponent<Omit<AvatarPrimitive.AvatarImageProps & react.RefAttributes<HTMLImageElement>, "ref"> & react.RefAttributes<HTMLImageElement>>;
1178
+ Fallback: react.ForwardRefExoticComponent<Omit<AvatarPrimitive.AvatarFallbackProps & react.RefAttributes<HTMLSpanElement>, "ref"> & react.RefAttributes<HTMLSpanElement>>;
1179
+ };
1180
+
1181
+ /**
1182
+ * Label — form field label built on Radix Label.
1183
+ *
1184
+ * Behaviors:
1185
+ * - Clicking the label focuses the associated `htmlFor` input.
1186
+ * - Adds a small red asterisk when `required` is set.
1187
+ * - Inherits disabled visuals from the wrapper (`peer-disabled`).
1188
+ */
1189
+ interface LabelProps$1 extends ComponentPropsWithoutRef<typeof LabelPrimitive.Root> {
1190
+ required?: boolean;
1191
+ }
1192
+ declare const Label$1: react.ForwardRefExoticComponent<LabelProps$1 & react.RefAttributes<HTMLLabelElement>>;
1193
+
1194
+ /**
1195
+ * FormField — composition wrapper for accessible form rows.
1196
+ *
1197
+ * Provides context with a generated `id`, so children (Label, Input, Hint,
1198
+ * Error) wire themselves via `htmlFor` / `id` / `aria-describedby` without
1199
+ * the consumer having to thread IDs manually.
1200
+ *
1201
+ * Composition:
1202
+ * <FormField>
1203
+ * <FormField.Label required>Email</FormField.Label>
1204
+ * <FormField.Control>
1205
+ * <Input type="email" placeholder="…" />
1206
+ * </FormField.Control>
1207
+ * <FormField.Hint>We never share your email.</FormField.Hint>
1208
+ * <FormField.Error>{error}</FormField.Error>
1209
+ * </FormField>
1210
+ *
1211
+ * Errors take precedence over hints (only one of them shows at once).
1212
+ */
1213
+ type FormFieldSize = "sm" | "md" | "lg";
1214
+ interface FormFieldProps extends HTMLAttributes<HTMLDivElement> {
1215
+ /** Optional explicit id override. */
1216
+ id?: string;
1217
+ /** Marks the field as invalid; switches Hint → Error and toggles aria. */
1218
+ invalid?: boolean;
1219
+ /**
1220
+ * Size scale propagated to Label / Hint / Error subparts via Context.
1221
+ * Default `md` preserves prior behavior. Subparts do NOT accept a `size`
1222
+ * prop of their own — use `className` for granular tweaks (EC-8).
1223
+ */
1224
+ size?: FormFieldSize;
1225
+ }
1226
+ interface FormFieldLabelProps extends ComponentPropsWithoutRef<typeof LabelPrimitive.Root> {
1227
+ required?: boolean;
1228
+ }
1229
+ declare const FormField: react.ForwardRefExoticComponent<FormFieldProps & react.RefAttributes<HTMLDivElement>> & {
1230
+ Label: react.ForwardRefExoticComponent<FormFieldLabelProps & react.RefAttributes<HTMLLabelElement>>;
1231
+ Control: react.ForwardRefExoticComponent<HTMLAttributes<HTMLDivElement> & react.RefAttributes<HTMLDivElement>>;
1232
+ Hint: react.ForwardRefExoticComponent<HTMLAttributes<HTMLParagraphElement> & react.RefAttributes<HTMLParagraphElement>>;
1233
+ Error: react.ForwardRefExoticComponent<HTMLAttributes<HTMLParagraphElement> & react.RefAttributes<HTMLParagraphElement>>;
1234
+ };
1235
+
1236
+ /**
1237
+ * IconComponent — shape compatible with both lucide-react icons and custom React SVG components.
1238
+ *
1239
+ * Centralizing this here avoids TS2322 noise from `exactOptionalPropertyTypes` when mapping
1240
+ * icons through Record<...> structures.
1241
+ */
1242
+ type IconComponent = ComponentType<SVGProps<SVGSVGElement> & {
1243
+ className?: string;
1244
+ }>;
1245
+
1246
+ interface EmptyStateProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> {
1247
+ /** Icon shown above the title. */
1248
+ icon?: IconComponent;
1249
+ title: ReactNode;
1250
+ description?: ReactNode;
1251
+ /** Optional action slot (typically <Button>). */
1252
+ action?: ReactNode;
1253
+ /** Hint shown above the title (e.g. uppercase eyebrow). */
1254
+ eyebrow?: ReactNode;
1255
+ /** Bordered dashed surface (placeholder vibe). Default true. */
1256
+ dashed?: boolean;
1257
+ }
1258
+ /**
1259
+ * EmptyState — visual placeholder for empty lists / first-run screens.
1260
+ *
1261
+ * Composition: icon + eyebrow + title + description + action. All slots are
1262
+ * optional except title.
1263
+ */
1264
+ declare const EmptyState: react.ForwardRefExoticComponent<EmptyStateProps & react.RefAttributes<HTMLDivElement>>;
1265
+
1266
+ /**
1267
+ * Trigger size variant (theming-and-sizes plan T1.9).
1268
+ * Items inside Select.Content stay md-equivalent regardless — the floating
1269
+ * menu is isolated from the trigger context (documented decision).
1270
+ *
1271
+ * EC-2 guard: `<Select.Trigger>` is a Radix `<button>` — no SelectHTMLAttributes
1272
+ * conflict to Omit. Verified before implementation.
1273
+ */
1274
+ declare const selectTriggerVariants: (props?: ({
1275
+ size?: "sm" | "md" | "lg" | null | undefined;
1276
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
1277
+ /**
1278
+ * Select — styled wrapper around Radix Select.
1279
+ *
1280
+ * Composition:
1281
+ * <Select value={value} onValueChange={setValue}>
1282
+ * <Select.Trigger>
1283
+ * <Select.Value placeholder="Pick…" />
1284
+ * </Select.Trigger>
1285
+ * <Select.Content>
1286
+ * <Select.Group>
1287
+ * <Select.Label>Group</Select.Label>
1288
+ * <Select.Item value="a">A</Select.Item>
1289
+ * </Select.Group>
1290
+ * </Select.Content>
1291
+ * </Select>
1292
+ *
1293
+ * Trigger matches Input height + violet focus ring. Content uses popover
1294
+ * surface with check on the selected item.
1295
+ */
1296
+ interface SelectTriggerProps extends ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>, VariantProps<typeof selectTriggerVariants> {
1297
+ }
1298
+ declare const SelectTrigger: react.ForwardRefExoticComponent<SelectTriggerProps & react.RefAttributes<HTMLButtonElement>>;
1299
+ declare const SelectContent: react.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectContentProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
1300
+ declare const SelectLabel: react.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectLabelProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
1301
+ declare const SelectItem: react.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectItemProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
1302
+ declare const SelectSeparator: react.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectSeparatorProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
1303
+ declare const Select: typeof SelectPrimitive.Root & {
1304
+ Trigger: typeof SelectTrigger;
1305
+ Value: typeof SelectPrimitive.Value;
1306
+ Content: typeof SelectContent;
1307
+ Group: typeof SelectPrimitive.Group;
1308
+ Label: typeof SelectLabel;
1309
+ Item: typeof SelectItem;
1310
+ Separator: typeof SelectSeparator;
1311
+ };
1312
+
1313
+ /**
1314
+ * Checkbox — built on Radix Checkbox.
1315
+ *
1316
+ * Supports tri-state via `checked="indeterminate"`. Violet fill when on,
1317
+ * border-only when off. Themed via tokens (--primary, --background).
1318
+ *
1319
+ * The `size` prop accepts `"sm" | "md" | "lg"`. Default `md` preserves the
1320
+ * 16px box from before this prop existed. The `sm` size keeps a >=24px
1321
+ * effective tap target via an invisible expanded hit area (WCAG 2.5.5).
1322
+ */
1323
+ declare const checkboxVariants: (props?: ({
1324
+ size?: "sm" | "md" | "lg" | null | undefined;
1325
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
1326
+ interface CheckboxProps extends ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>, VariantProps<typeof checkboxVariants> {
1327
+ }
1328
+ declare const Checkbox: react.ForwardRefExoticComponent<CheckboxProps & react.RefAttributes<HTMLButtonElement>>;
1329
+
1330
+ declare const RadioGroup$1: react.ForwardRefExoticComponent<Omit<RadioGroupPrimitive.RadioGroupProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>> & {
1331
+ Item: react.ForwardRefExoticComponent<Omit<RadioGroupPrimitive.RadioGroupItemProps & react.RefAttributes<HTMLButtonElement>, "ref"> & react.RefAttributes<HTMLButtonElement>>;
1332
+ };
1333
+
1334
+ /**
1335
+ * Switch — built on Radix Switch. Used for binary toggles (autoaccept,
1336
+ * dark mode preview, feature flags).
1337
+ *
1338
+ * Off-state uses --muted, on-state uses --primary with a subtle glow shadow
1339
+ * to mark "this is active" in the violet brand language.
1340
+ *
1341
+ * The `size` prop accepts `"sm" | "md" | "lg"`. Default `md` preserves the
1342
+ * 20×36 track from before this prop existed.
1343
+ */
1344
+ declare const switchVariants: (props?: ({
1345
+ size?: "sm" | "md" | "lg" | null | undefined;
1346
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
1347
+ interface SwitchProps extends ComponentPropsWithoutRef<typeof SwitchPrimitive.Root>, VariantProps<typeof switchVariants> {
1348
+ }
1349
+ declare const Switch: react.ForwardRefExoticComponent<SwitchProps & react.RefAttributes<HTMLButtonElement>>;
1350
+
1351
+ /**
1352
+ * Textarea — multi-line input mirror of Input.
1353
+ *
1354
+ * Matches Input visuals (violet focus ring, --input border, --card bg).
1355
+ * The `size` prop accepts `"sm" | "md" | "lg"`. Default `md` preserves the
1356
+ * 80px (5rem) min-height + body-md text from before this prop existed.
1357
+ *
1358
+ * Note: `TextareaHTMLAttributes<HTMLTextAreaElement>` does NOT declare a
1359
+ * native `size` attribute (textareas use `rows` / `cols`), so no Omit is
1360
+ * needed — contrast with `<Input>` which had EC-1 collision.
1361
+ */
1362
+ declare const textareaVariants: (props?: ({
1363
+ size?: "sm" | "md" | "lg" | null | undefined;
1364
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
1365
+ interface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement>, VariantProps<typeof textareaVariants> {
1366
+ }
1367
+ declare const Textarea: react.ForwardRefExoticComponent<TextareaProps & react.RefAttributes<HTMLTextAreaElement>>;
1368
+
1369
+ interface ContextWindowBarProps extends HTMLAttributes<HTMLDivElement> {
1370
+ /** Tokens currently used in the context window. */
1371
+ used: number;
1372
+ /** Model's total context capacity (e.g. 200_000, 1_000_000). */
1373
+ total: number;
1374
+ /** Optional secondary label rendered on the right (e.g. model name). */
1375
+ trailing?: ReactNode;
1376
+ /** Optional title shown above the bar. */
1377
+ label?: ReactNode;
1378
+ /** Compact mode hides numbers and label; just the bar. */
1379
+ compact?: boolean;
1380
+ /**
1381
+ * Override warning thresholds (0..1). Defaults: warn 0.7, danger 0.9.
1382
+ */
1383
+ warnAt?: number;
1384
+ dangerAt?: number;
1385
+ }
1386
+ /**
1387
+ * ContextWindowBar — shows how much of the model's context window has been
1388
+ * consumed. Color transitions: success → warning → destructive past thresholds.
1389
+ *
1390
+ * Critical for transparency: a user should always be able to glance at this
1391
+ * and know if the conversation is about to hit the cap.
1392
+ */
1393
+ declare const ContextWindowBar: react.ForwardRefExoticComponent<ContextWindowBarProps & react.RefAttributes<HTMLDivElement>>;
1394
+
1395
+ type CapabilityState = "enabled" | "disabled" | "blocked" | "active";
1396
+ interface Capability {
1397
+ id: string;
1398
+ /** Visible label. */
1399
+ label: ReactNode;
1400
+ /** Optional icon override. */
1401
+ icon?: IconComponent;
1402
+ /** Default state. */
1403
+ state?: CapabilityState;
1404
+ /** Tooltip / longer description. */
1405
+ hint?: ReactNode;
1406
+ }
1407
+ interface CapabilityIndicatorProps extends HTMLAttributes<HTMLDivElement> {
1408
+ capabilities: Capability[];
1409
+ }
1410
+ declare const CapabilityIndicator: react.ForwardRefExoticComponent<CapabilityIndicatorProps & react.RefAttributes<HTMLUListElement>>;
1411
+ /** Common capability presets — re-use these so apps don't reinvent labels. */
1412
+ declare const capabilityPresets: {
1413
+ read: {
1414
+ readonly id: "read";
1415
+ readonly label: "Read files";
1416
+ readonly icon: react.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & react.RefAttributes<SVGSVGElement>>;
1417
+ };
1418
+ write: {
1419
+ readonly id: "write";
1420
+ readonly label: "Write files";
1421
+ readonly icon: react.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & react.RefAttributes<SVGSVGElement>>;
1422
+ };
1423
+ delete: {
1424
+ readonly id: "delete";
1425
+ readonly label: "Delete files";
1426
+ readonly icon: react.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & react.RefAttributes<SVGSVGElement>>;
1427
+ };
1428
+ bash: {
1429
+ readonly id: "bash";
1430
+ readonly label: "Run shell";
1431
+ readonly icon: react.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & react.RefAttributes<SVGSVGElement>>;
1432
+ };
1433
+ network: {
1434
+ readonly id: "network";
1435
+ readonly label: "Network";
1436
+ readonly icon: react.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & react.RefAttributes<SVGSVGElement>>;
1437
+ };
1438
+ deploy: {
1439
+ readonly id: "deploy";
1440
+ readonly label: "Deploy";
1441
+ readonly icon: react.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & react.RefAttributes<SVGSVGElement>>;
1442
+ };
1443
+ llm: {
1444
+ readonly id: "llm";
1445
+ readonly label: "Sub-agents";
1446
+ readonly icon: react.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & react.RefAttributes<SVGSVGElement>>;
1447
+ };
1448
+ };
1449
+
1450
+ type ToolEnablement = "enabled" | "ask" | "denied";
1451
+ interface ToolEntry {
1452
+ id: string;
1453
+ name: string;
1454
+ description?: ReactNode;
1455
+ icon?: IconComponent;
1456
+ enablement?: ToolEnablement;
1457
+ /**
1458
+ * Source of the tool: built-in, plugin/skill, or MCP server name.
1459
+ */
1460
+ source?: string;
1461
+ /** Optional badge text (e.g. "destructive", "experimental"). */
1462
+ badge?: ReactNode;
1463
+ }
1464
+ interface ToolsListProps extends Omit<HTMLAttributes<HTMLDivElement>, "title" | "onChange"> {
1465
+ tools: ToolEntry[];
1466
+ /** Title above the list. */
1467
+ title?: ReactNode;
1468
+ /**
1469
+ * Fires when the consumer toggles a tool's enablement state.
1470
+ * Cycle: enabled → ask → denied → enabled.
1471
+ */
1472
+ onEnablementChange?: (id: string, next: ToolEnablement) => void;
1473
+ }
1474
+ /**
1475
+ * ToolsList — surface every tool the agent could call, with its enablement
1476
+ * state. Click the chip to cycle: Allowed → Ask → Denied.
1477
+ */
1478
+ declare const ToolsList: react.ForwardRefExoticComponent<ToolsListProps & react.RefAttributes<HTMLDivElement>>;
1479
+
1480
+ type PermissionDecisionKind = "allow" | "ask" | "deny";
1481
+ interface PermissionRule {
1482
+ id: string;
1483
+ /** Tool the rule applies to. Use "*" for any. */
1484
+ tool: string;
1485
+ /** Glob path it applies to. Use "*" for any. */
1486
+ path: string;
1487
+ decision: PermissionDecisionKind;
1488
+ /** Optional rationale shown as helper text. */
1489
+ note?: string;
1490
+ }
1491
+ interface PermissionMatrixProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> {
1492
+ rules: PermissionRule[];
1493
+ title?: ReactNode;
1494
+ /**
1495
+ * Available tools shown in the add form. Pass `undefined` (or omit) — or an
1496
+ * empty array — to hide the add form entirely. The form only renders when
1497
+ * `onAdd` is provided AND `toolOptions` has at least one entry.
1498
+ */
1499
+ toolOptions?: string[];
1500
+ onAdd?: (rule: Omit<PermissionRule, "id">) => void;
1501
+ onRemove?: (id: string) => void;
1502
+ onDecisionChange?: (id: string, decision: PermissionDecisionKind) => void;
1503
+ }
1504
+ /**
1505
+ * PermissionMatrix — tool × path × decision grid for fine-grained access
1506
+ * control. Used as the "permissions" tab in the agent settings.
1507
+ *
1508
+ * One PermissionRule per row. Click the decision pill to cycle Allow → Ask → Deny.
1509
+ *
1510
+ * Design decision (2026-05-14): PermissionMatrix stays in `primitives/`
1511
+ * — not `composites/` — even though it renders inputs and a select. The native
1512
+ * `<input>` / `<select>` elements use Theo design tokens directly (border-input,
1513
+ * ring, font-mono) so visual parity with `Input` / `Select` primitives is
1514
+ * preserved. Reason for keeping it primitive: a consumer installing
1515
+ * `permission-matrix` from the registry gets a single self-contained file with
1516
+ * no transitive Theo dependencies — opposite trade-off from `EnvVarEditor`
1517
+ * which is intentionally a composite. Both shapes are valid; we ship one of
1518
+ * each so consumers can pick the dependency profile that fits their app.
1519
+ */
1520
+ declare const PermissionMatrix: react.ForwardRefExoticComponent<PermissionMatrixProps & react.RefAttributes<HTMLDivElement>>;
1521
+
1522
+ /**
1523
+ * Mode — top-level density / domain the agent session is operating in.
1524
+ *
1525
+ * `chat` — conversational Q&A, lean UI.
1526
+ * `code` — code agent: read/plan/edit/verify inside the repo.
1527
+ * `infra` — operate the deployed system: metrics, deploys, logs, rollback.
1528
+ *
1529
+ * Used everywhere resources can be scoped per-mode (Skills, Agents, Rules,
1530
+ * SystemPrompt overrides, Sessions, …). `modes?: Mode[]` on a resource means
1531
+ * "only available in these modes"; omitting `modes` means "available
1532
+ * globally".
1533
+ */
1534
+ type Mode = "chat" | "code" | "infra";
1535
+ declare const ALL_MODES: ReadonlyArray<Mode>;
1536
+ /** Friendly label per mode — render in chips, headers, badges. */
1537
+ declare const MODE_LABEL: Record<Mode, string>;
1538
+
1539
+ type SkillSource = "builtin" | "project" | "user" | "plugin";
1540
+ type SkillState = "enabled" | "disabled";
1541
+ interface Skill {
1542
+ id: string;
1543
+ name: string;
1544
+ description?: ReactNode;
1545
+ /** Where the skill comes from. */
1546
+ source: SkillSource;
1547
+ /** Optional tools the skill is allowed to use (informational). */
1548
+ allowedTools?: string[];
1549
+ /** Optional trigger keywords / patterns for discovery. */
1550
+ triggers?: string[];
1551
+ state?: SkillState;
1552
+ /** Modes this skill is visible in. Omit / empty = global (all modes). */
1553
+ modes?: Mode[];
1554
+ }
1555
+ interface SkillCardProps extends Omit<HTMLAttributes<HTMLDivElement>, "onToggle"> {
1556
+ skill: Skill;
1557
+ onToggle?: (id: string, next: SkillState) => void;
1558
+ }
1559
+ /**
1560
+ * SkillCard — single skill entry showing what it does, where it came from,
1561
+ * and which tools it needs. Toggle to enable/disable for the current session.
1562
+ */
1563
+ declare const SkillCard: react.ForwardRefExoticComponent<SkillCardProps & react.RefAttributes<HTMLDivElement>>;
1564
+
1565
+ /**
1566
+ * Rule — a user-authored behavior instruction injected into the system prompt.
1567
+ *
1568
+ * Equivalent to a single markdown file under `.claude/rules/` in Claude Code:
1569
+ * short imperative text the user writes once and the agent follows always.
1570
+ * Rules can be scoped (`global` = applies to every session; `project` = only
1571
+ * inside the current workspace) and toggled on/off without deletion.
1572
+ */
1573
+ type RuleScope = "global" | "project";
1574
+ type RuleState = "enabled" | "disabled";
1575
+ interface Rule {
1576
+ id: string;
1577
+ /** Short title shown in the list. */
1578
+ title: string;
1579
+ /** Markdown body — the actual instruction injected into the prompt. */
1580
+ body: string;
1581
+ /** Where this rule applies. */
1582
+ scope: RuleScope;
1583
+ /** Whether the rule is currently active. */
1584
+ state: RuleState;
1585
+ /** Optional tags for grouping ("testing", "style", "security"). */
1586
+ tags?: string[];
1587
+ /** Modes this rule applies to. Omit / empty = global (every mode). */
1588
+ modes?: Mode[];
1589
+ /** ISO timestamp / friendly label of last edit. */
1590
+ updatedAt?: string;
1591
+ }
1592
+
1593
+ interface RuleCardProps extends Omit<HTMLAttributes<HTMLElement>, "title" | "onSelect" | "onToggle"> {
1594
+ rule: Rule;
1595
+ /** Click on the card body — typically opens detail/edit view. */
1596
+ onSelect?: (id: string) => void;
1597
+ /** Click on the edit pencil. Defaults to onSelect if omitted. */
1598
+ onEdit?: (id: string) => void;
1599
+ /** Click on the trash icon. Renders the icon only when provided. */
1600
+ onDelete?: (id: string) => void;
1601
+ /** Toggle enabled/disabled. Renders the switch-like dot only when provided. */
1602
+ onToggle?: (id: string, next: RuleState) => void;
1603
+ }
1604
+ declare const RuleCard: react.ForwardRefExoticComponent<RuleCardProps & react.RefAttributes<HTMLElement>>;
1605
+
1606
+ interface CostMeterProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> {
1607
+ /** Current cost in USD. */
1608
+ cost: number;
1609
+ /** Optional monthly budget; renders progress bar when present. */
1610
+ budget?: number;
1611
+ /** Optional title (e.g. "This session", "Monthly"). */
1612
+ title?: ReactNode;
1613
+ /** Optional delta vs previous period. */
1614
+ delta?: {
1615
+ value: number;
1616
+ period: string;
1617
+ };
1618
+ /** Compact mode — single-line summary. */
1619
+ compact?: boolean;
1620
+ }
1621
+ /**
1622
+ * CostMeter — gauge for token spend. Two visuals:
1623
+ * - card: title + big number + optional progress bar + optional delta.
1624
+ * - compact: chip "Coins $4.20" for nav bars.
1625
+ */
1626
+ declare const CostMeter: react.ForwardRefExoticComponent<CostMeterProps & react.RefAttributes<HTMLDivElement>>;
1627
+
1628
+ type PlanNodeStatus = "pending" | "running" | "done" | "skipped" | "failed";
1629
+ interface PlanNode {
1630
+ id: string;
1631
+ label: string;
1632
+ status: PlanNodeStatus;
1633
+ /** Optional details / sub-explanation. */
1634
+ detail?: string;
1635
+ /** Sub-nodes (rendered indented). */
1636
+ children?: PlanNode[];
1637
+ }
1638
+ interface TaskNodeProps extends HTMLAttributes<HTMLLIElement> {
1639
+ node: PlanNode;
1640
+ depth?: number;
1641
+ }
1642
+ /**
1643
+ * TaskNode — single row in a task plan. Renders its own children recursively
1644
+ * with increasing indentation.
1645
+ */
1646
+ declare const TaskNode: react.ForwardRefExoticComponent<TaskNodeProps & react.RefAttributes<HTMLLIElement>>;
1647
+ interface TaskPlanProps extends Omit<HTMLAttributes<HTMLElement>, "title"> {
1648
+ nodes: PlanNode[];
1649
+ /** Header title. */
1650
+ title?: ReactNode;
1651
+ /** Summary line shown next to the title (e.g. "3 of 7 done"). */
1652
+ summary?: ReactNode;
1653
+ }
1654
+ /**
1655
+ * TaskPlan — hierarchical task plan, à la Claude "plan mode".
1656
+ *
1657
+ * The agent emits a structured plan; the user sees each step progress from
1658
+ * pending → running → done (or failed/skipped). Children render with one
1659
+ * extra indent level and a left border to suggest hierarchy.
1660
+ */
1661
+ declare const TaskPlan: react.ForwardRefExoticComponent<TaskPlanProps & react.RefAttributes<HTMLElement>>;
1662
+
1663
+ interface SystemPromptEditorProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> {
1664
+ /** Vendor / default system prompt (read-only). */
1665
+ defaultPrompt: string;
1666
+ /** Current override; pass empty string for "use default". */
1667
+ override: string;
1668
+ onOverrideChange: (next: string) => void;
1669
+ /** Approximate token count for the active prompt. */
1670
+ tokenEstimate?: number;
1671
+ title?: ReactNode;
1672
+ }
1673
+ /**
1674
+ * SystemPromptEditor — surface the agent's system prompt with a clear
1675
+ * "vendor default" vs "user override" toggle.
1676
+ *
1677
+ * Behavior:
1678
+ * - When override is empty, the textarea shows the default (greyed out,
1679
+ * editable starts blank).
1680
+ * - When user types, override takes effect.
1681
+ * - "Reset to default" wipes the override.
1682
+ *
1683
+ * Critical for transparency: a user must be able to see and edit the prompt.
1684
+ */
1685
+ declare const SystemPromptEditor: react.ForwardRefExoticComponent<SystemPromptEditorProps & react.RefAttributes<HTMLDivElement>>;
1686
+
1687
+ type MemoryScope = "global" | "project" | "session";
1688
+ interface MemoryLayer {
1689
+ scope: MemoryScope;
1690
+ /** File path on disk for transparency. */
1691
+ path: string;
1692
+ /** Markdown content. */
1693
+ content: string;
1694
+ /** Last modified label, e.g. "2m ago". */
1695
+ modifiedAt?: string;
1696
+ }
1697
+ interface MemoryEditorProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> {
1698
+ layers: MemoryLayer[];
1699
+ /** Currently active layer for editing. */
1700
+ activeScope: MemoryScope;
1701
+ onScopeChange: (scope: MemoryScope) => void;
1702
+ onContentChange: (scope: MemoryScope, next: string) => void;
1703
+ title?: ReactNode;
1704
+ }
1705
+ /**
1706
+ * MemoryEditor — three-layer Markdown memory editor (global / project /
1707
+ * session) mirroring Claude Code's CLAUDE.md hierarchy.
1708
+ *
1709
+ * Each scope keeps its own file. Switching scopes via tab updates which
1710
+ * layer is being edited. Path is shown explicitly so users know where the
1711
+ * content lives on disk.
1712
+ */
1713
+ declare const MemoryEditor: react.ForwardRefExoticComponent<MemoryEditorProps & react.RefAttributes<HTMLDivElement>>;
1714
+
1715
+ type HookEvent = "PreToolUse" | "PostToolUse" | "UserPromptSubmit" | "Stop" | "SessionStart" | "SessionEnd";
1716
+ interface HookEntry {
1717
+ id: string;
1718
+ event: HookEvent;
1719
+ /** Tool matcher (e.g. "Bash", "Write", "*"). */
1720
+ matcher: string;
1721
+ /** Shell command to run. */
1722
+ command: string;
1723
+ enabled?: boolean;
1724
+ }
1725
+ declare const HOOK_EVENTS: HookEvent[];
1726
+ interface HookConfigProps extends Omit<HTMLAttributes<HTMLDivElement>, "title" | "onToggle"> {
1727
+ hooks: HookEntry[];
1728
+ onAdd?: (hook: Omit<HookEntry, "id">) => void;
1729
+ onRemove?: (id: string) => void;
1730
+ onToggle?: (id: string, enabled: boolean) => void;
1731
+ title?: ReactNode;
1732
+ }
1733
+ /**
1734
+ * HookConfig — editor for lifecycle hooks (PreToolUse, PostToolUse, Stop…).
1735
+ *
1736
+ * Mirrors Claude Code's settings.json hooks but visual. Each row is an
1737
+ * { event × matcher × command } triple with on/off toggle.
1738
+ */
1739
+ declare const HookConfig: react.ForwardRefExoticComponent<HookConfigProps & react.RefAttributes<HTMLDivElement>>;
1740
+
1741
+ type HookEventResult = "ok" | "blocked" | "error";
1742
+ interface HookEventEntry {
1743
+ id: string;
1744
+ /** Hook event (e.g. PreToolUse). */
1745
+ event: string;
1746
+ /** Hook matcher (e.g. Bash). */
1747
+ matcher: string;
1748
+ /** What the hook command was. */
1749
+ command: string;
1750
+ result: HookEventResult;
1751
+ timestamp: string;
1752
+ /** Optional stderr/stdout snippet. */
1753
+ output?: string;
1754
+ /** Optional duration label, e.g. "120ms". */
1755
+ duration?: string;
1756
+ }
1757
+ interface HookEventLogProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> {
1758
+ events: HookEventEntry[];
1759
+ title?: ReactNode;
1760
+ }
1761
+ /**
1762
+ * HookEventLog — chronological list of hook firings, with result tone, the
1763
+ * command that ran, and an optional output preview.
1764
+ */
1765
+ declare const HookEventLog: react.ForwardRefExoticComponent<HookEventLogProps & react.RefAttributes<HTMLDivElement>>;
1766
+
1767
+ type CronJobStatus = "idle" | "running" | "failed" | "disabled";
1768
+ interface CronJob {
1769
+ id: string;
1770
+ /** Human-readable job name. */
1771
+ name: string;
1772
+ /** Cron expression — e.g. every 4 hours. */
1773
+ schedule: string;
1774
+ /** What gets run (prompt or command). */
1775
+ prompt: string;
1776
+ status: CronJobStatus;
1777
+ /** ISO/string timestamp of last run. */
1778
+ lastRun?: string;
1779
+ /** ISO/string timestamp of next run. */
1780
+ nextRun?: string;
1781
+ /** Optional last-run result line. */
1782
+ lastResult?: ReactNode;
1783
+ }
1784
+ interface CronJobCardProps extends Omit<HTMLAttributes<HTMLElement>, "onToggle"> {
1785
+ job: CronJob;
1786
+ onRunNow?: (id: string) => void;
1787
+ onToggle?: (id: string, enabled: boolean) => void;
1788
+ onRemove?: (id: string) => void;
1789
+ }
1790
+ /**
1791
+ * CronJobCard — one scheduled agent job. Shows cron expression, prompt,
1792
+ * status, last/next run. Inline actions: run now, pause, delete.
1793
+ */
1794
+ declare const CronJobCard: react.ForwardRefExoticComponent<CronJobCardProps & react.RefAttributes<HTMLElement>>;
1795
+
1796
+ type MCPServerStatus = "connected" | "degraded" | "disconnected" | "starting";
1797
+ interface MCPServer {
1798
+ id: string;
1799
+ /** Friendly name, e.g. "postgres". */
1800
+ name: string;
1801
+ /** Transport endpoint (stdio command or URL). */
1802
+ endpoint: string;
1803
+ status: MCPServerStatus;
1804
+ /** Tools exposed by the server. */
1805
+ tools: string[];
1806
+ /** Optional resources exposed. */
1807
+ resources?: string[];
1808
+ /** Diagnostic message when degraded/disconnected. */
1809
+ message?: ReactNode;
1810
+ /** Auto-restart toggle hint. */
1811
+ autoRestart?: boolean;
1812
+ }
1813
+ interface MCPServerCardProps extends HTMLAttributes<HTMLElement> {
1814
+ server: MCPServer;
1815
+ onRestart?: (id: string) => void;
1816
+ onDisconnect?: (id: string) => void;
1817
+ }
1818
+ /**
1819
+ * MCPServerCard — one MCP server entry showing connection status, the tools
1820
+ * it exposes, and inline controls (restart, disconnect).
1821
+ *
1822
+ * Pairs with claw-code's "degraded startup reporting" — failed servers can
1823
+ * still appear here with a recovery message.
1824
+ */
1825
+ declare const MCPServerCard: react.ForwardRefExoticComponent<MCPServerCardProps & react.RefAttributes<HTMLElement>>;
1826
+
1827
+ type ChannelPlatform = "telegram" | "discord" | "slack" | "whatsapp" | "webhook" | "mcp";
1828
+ type ChannelStatus = "disconnected" | "connecting" | "connected" | "error";
1829
+ interface Channel {
1830
+ id: string;
1831
+ name: string;
1832
+ platform: ChannelPlatform;
1833
+ status: ChannelStatus;
1834
+ description?: ReactNode;
1835
+ lastSeen?: string;
1836
+ messageCount?: number;
1837
+ }
1838
+ interface ChannelCardProps extends HTMLAttributes<HTMLElement> {
1839
+ channel: Channel;
1840
+ onConfigure?: (id: string) => void;
1841
+ onToggle?: (id: string, enabled: boolean) => void;
1842
+ }
1843
+ /**
1844
+ * ChannelCard — inbound gateway connection (Telegram, Discord, Slack, …)
1845
+ * showing its connection status, platform, and inline controls.
1846
+ *
1847
+ * EC absorbed: the toggle reflects the *current* status. "connected" implies
1848
+ * enabled (toggle off disconnects); "disconnected"/"error" implies disabled
1849
+ * (toggle on reconnects). "connecting" is a transient state — toggle is a
1850
+ * no-op (button disabled).
1851
+ */
1852
+ declare const ChannelCard: react.ForwardRefExoticComponent<ChannelCardProps & react.RefAttributes<HTMLElement>>;
1853
+
1854
+ interface ModelCapabilityFlag {
1855
+ id: string;
1856
+ label: string;
1857
+ icon?: IconComponent;
1858
+ enabled: boolean;
1859
+ }
1860
+ interface ModelInfo {
1861
+ id: string;
1862
+ /** Display name (e.g. "Opus 4.7"). */
1863
+ name: string;
1864
+ /** Vendor (Anthropic, OpenAI, …). */
1865
+ vendor: string;
1866
+ /** Optional tag (default, fast, smart, beta). */
1867
+ tag?: ReactNode;
1868
+ /** Total context window in tokens. */
1869
+ contextWindow: number;
1870
+ /** Max output tokens per turn. */
1871
+ maxOutput: number;
1872
+ /** USD per million input tokens. */
1873
+ pricePerMInput?: number;
1874
+ /** USD per million output tokens. */
1875
+ pricePerMOutput?: number;
1876
+ /** Knowledge cutoff date label (e.g. "Jan 2026"). */
1877
+ cutoff?: string;
1878
+ /** Capability flags shown as chips. */
1879
+ capabilities?: ModelCapabilityFlag[];
1880
+ /** Short description / positioning. */
1881
+ description?: ReactNode;
1882
+ }
1883
+ interface ModelCardProps extends Omit<HTMLAttributes<HTMLElement>, "onSelect"> {
1884
+ model: ModelInfo;
1885
+ /** Render as the currently-selected variant (violet ring). */
1886
+ selected?: boolean;
1887
+ /** Fires when user clicks to select. */
1888
+ onSelect?: (id: string) => void;
1889
+ }
1890
+ /**
1891
+ * ModelCard — full info on a model: vendor, context, output cap, pricing,
1892
+ * capabilities, knowledge cutoff. Used in the "switch model" surface.
1893
+ */
1894
+ declare const ModelCard: react.ForwardRefExoticComponent<ModelCardProps & react.RefAttributes<HTMLElement>>;
1895
+ /** Pre-canned capability flags. */
1896
+ declare const modelCapabilityPresets: {
1897
+ vision: {
1898
+ readonly id: "vision";
1899
+ readonly label: "Vision";
1900
+ readonly icon: IconComponent;
1901
+ };
1902
+ tools: {
1903
+ readonly id: "tools";
1904
+ readonly label: "Tool use";
1905
+ readonly icon: react.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & react.RefAttributes<SVGSVGElement>>;
1906
+ };
1907
+ reasoning: {
1908
+ readonly id: "reasoning";
1909
+ readonly label: "Reasoning";
1910
+ readonly icon: react.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & react.RefAttributes<SVGSVGElement>>;
1911
+ };
1912
+ fineTuning: {
1913
+ readonly id: "ft";
1914
+ readonly label: "Fine-tuning";
1915
+ readonly icon: react.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & react.RefAttributes<SVGSVGElement>>;
1916
+ };
1917
+ multimodal: {
1918
+ readonly id: "multimodal";
1919
+ readonly label: "Multimodal";
1920
+ readonly icon: react.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & react.RefAttributes<SVGSVGElement>>;
1921
+ };
1922
+ };
1923
+
1924
+ interface AgentProfileDescriptor {
1925
+ id: string;
1926
+ /** Display name, e.g. "Coder", "Planner", "Reviewer". */
1927
+ name: string;
1928
+ /** Avatar initials (2 chars max). Falls back to first 2 letters of name. */
1929
+ initials?: string;
1930
+ /** Optional short description for tooltips and the dropdown. */
1931
+ description?: ReactNode;
1932
+ /**
1933
+ * Identity tone — colors the avatar so users tell agents apart at a glance.
1934
+ */
1935
+ tone?: "primary" | "accent" | "success" | "warning" | "info" | "muted";
1936
+ /** Optional badge text (e.g. "experimental"). */
1937
+ badge?: ReactNode;
1938
+ }
1939
+ interface AgentProfileProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, "onChange"> {
1940
+ agents: AgentProfileDescriptor[];
1941
+ activeId: string;
1942
+ onChange?: (id: string) => void;
1943
+ }
1944
+ /**
1945
+ * AgentProfile — switcher between multiple agent profiles (coder, planner,
1946
+ * reviewer, etc.). Each profile gets its own tone so the user can spot at a
1947
+ * glance which "persona" is currently driving the session.
1948
+ */
1949
+ declare const AgentProfile: react.ForwardRefExoticComponent<AgentProfileProps & react.RefAttributes<HTMLButtonElement>>;
1950
+
1951
+ type SubAgentState = "spawning" | "running" | "completed" | "failed" | "cancelled";
1952
+ interface SubAgentRun {
1953
+ id: string;
1954
+ /** Profile name (matches AgentProfile.name). */
1955
+ agent: string;
1956
+ /** Short task description given to the sub-agent. */
1957
+ task: string;
1958
+ state: SubAgentState;
1959
+ /** Optional duration label. */
1960
+ duration?: string;
1961
+ /** Optional last status line (preview of the latest event). */
1962
+ lastEvent?: string;
1963
+ /** Optional result summary (one-liner). */
1964
+ result?: ReactNode;
1965
+ }
1966
+ interface SubAgentDispatchProps extends HTMLAttributes<HTMLElement> {
1967
+ run: SubAgentRun;
1968
+ /** When provided, renders a cancel button while the run is in flight. */
1969
+ onCancel?: (id: string) => void;
1970
+ }
1971
+ /**
1972
+ * SubAgentDispatch — visualization for a Task() / sub-agent invocation.
1973
+ *
1974
+ * Shows the agent name, the task summary, current state, an inline event
1975
+ * preview, and an optional result. Use inside the agent timeline to make
1976
+ * delegation visible.
1977
+ */
1978
+ declare const SubAgentDispatch: react.ForwardRefExoticComponent<SubAgentDispatchProps & react.RefAttributes<HTMLElement>>;
1979
+
1980
+ type SessionStatus = "active" | "completed" | "failed" | "aborted";
1981
+ interface SessionSummary {
1982
+ id: string;
1983
+ /** Friendly title (often the first user message). */
1984
+ title: string;
1985
+ /** ISO timestamp / friendly date label. */
1986
+ startedAt: string;
1987
+ duration?: string;
1988
+ status: SessionStatus;
1989
+ /** Agent/model that ran the session. */
1990
+ model?: string;
1991
+ /** Total tokens consumed (formatted, e.g. "35.7k"). */
1992
+ tokens?: string;
1993
+ /** Total cost (USD). */
1994
+ cost?: number;
1995
+ /** Number of messages in the session. */
1996
+ messageCount?: number;
1997
+ }
1998
+ interface SessionTimelineProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> {
1999
+ sessions: SessionSummary[];
2000
+ /** Title above the list. */
2001
+ title?: ReactNode;
2002
+ /** Fires when a row is clicked. */
2003
+ onOpen?: (id: string) => void;
2004
+ }
2005
+ /**
2006
+ * SessionTimeline — historical view of past agent sessions with per-row
2007
+ * tokens / cost / duration / status. Click a row to open the full session.
2008
+ */
2009
+ declare const SessionTimeline: react.ForwardRefExoticComponent<SessionTimelineProps & react.RefAttributes<HTMLDivElement>>;
2010
+
2011
+ type AuditActorKind = "user" | "agent" | "system";
2012
+ type AuditSeverity = "info" | "warning" | "error";
2013
+ interface AuditEntry {
2014
+ id: string;
2015
+ /** Who triggered the action. */
2016
+ actor: {
2017
+ kind: AuditActorKind;
2018
+ name: string;
2019
+ };
2020
+ /** Verb / action label, e.g. "wrote file", "ran command". */
2021
+ action: string;
2022
+ /** Target of the action (file path, command, etc). */
2023
+ target?: ReactNode;
2024
+ /** ISO timestamp / friendly label. */
2025
+ timestamp: string;
2026
+ severity?: AuditSeverity;
2027
+ /** Optional detail block (multi-line). */
2028
+ detail?: ReactNode;
2029
+ }
2030
+ interface AuditLogEntryProps extends HTMLAttributes<HTMLElement> {
2031
+ entry: AuditEntry;
2032
+ }
2033
+ /**
2034
+ * AuditLogEntry — one row in the agent audit log. Tells the user exactly
2035
+ * who did what and when. Severity colors the timestamp and target.
2036
+ */
2037
+ declare const AuditLogEntry: react.ForwardRefExoticComponent<AuditLogEntryProps & react.RefAttributes<HTMLElement>>;
2038
+
2039
+ type LaneState = "started" | "blocked" | "failed" | "finished";
2040
+ interface LaneCard {
2041
+ id: string;
2042
+ /** Card title (e.g. task name). */
2043
+ title: ReactNode;
2044
+ /** Optional description / preview. */
2045
+ description?: ReactNode;
2046
+ /** Optional footer / metadata row. */
2047
+ footer?: ReactNode;
2048
+ }
2049
+ interface Lane {
2050
+ state: LaneState;
2051
+ cards: LaneCard[];
2052
+ }
2053
+ interface LaneBoardProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> {
2054
+ lanes: Lane[];
2055
+ title?: ReactNode;
2056
+ }
2057
+ /**
2058
+ * LaneBoard — kanban-style task board with 4 lanes matching the claw-code
2059
+ * lane event schema (started/blocked/failed/finished). Each card is a
2060
+ * machine-readable task snapshot the agent emits.
2061
+ */
2062
+ declare const LaneBoard: react.ForwardRefExoticComponent<LaneBoardProps & react.RefAttributes<HTMLDivElement>>;
2063
+
2064
+ interface TokenUsagePoint {
2065
+ /** ISO date or friendly label for the x-axis tooltip. */
2066
+ label: string;
2067
+ /** Input tokens for this period (e.g. day). */
2068
+ input: number;
2069
+ /** Output tokens for this period. */
2070
+ output: number;
2071
+ }
2072
+ interface TokenUsageChartProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> {
2073
+ points: TokenUsagePoint[];
2074
+ /** Title above the chart. */
2075
+ title?: ReactNode;
2076
+ /** Chart height in px. Default 160. */
2077
+ height?: number;
2078
+ /** Show legend below the chart. Default true. */
2079
+ showLegend?: boolean;
2080
+ /**
2081
+ * Maximum number of bars to render. When `points.length` exceeds this, the
2082
+ * series is binned (summed in equal-width windows) so the chart stays
2083
+ * legible and SVG node count stays bounded. Default 60.
2084
+ */
2085
+ maxBars?: number;
2086
+ }
2087
+ /**
2088
+ * TokenUsageChart — stacked-bar chart of input vs output tokens over time.
2089
+ *
2090
+ * Pure SVG, no chart lib. Width is fluid; bars adjust to viewBox. Hover any
2091
+ * bar to see the breakdown in the tooltip slot below.
2092
+ */
2093
+ declare const TokenUsageChart: react.ForwardRefExoticComponent<TokenUsageChartProps & react.RefAttributes<HTMLDivElement>>;
2094
+
2095
+ interface AutoCompactNoticeProps extends Omit<HTMLAttributes<HTMLElement>, "title"> {
2096
+ /** Optional custom title. */
2097
+ title?: ReactNode;
2098
+ /**
2099
+ * How many turns until the next auto-compaction. Used to render an inline
2100
+ * countdown chip.
2101
+ */
2102
+ turnsRemaining?: number;
2103
+ /** Approx tokens that will be removed/summarized. */
2104
+ tokensToCompact?: number;
2105
+ onCompactNow?: () => void;
2106
+ onDismiss?: () => void;
2107
+ }
2108
+ /**
2109
+ * AutoCompactNotice — inline banner warning the user that the agent is
2110
+ * about to summarize / compact older context. Lets them act early (compact
2111
+ * now) or dismiss.
2112
+ *
2113
+ * Critical for transparency: a user must not be surprised by silent context
2114
+ * loss. This component announces it before it happens.
2115
+ */
2116
+ declare const AutoCompactNotice: react.ForwardRefExoticComponent<AutoCompactNoticeProps & react.RefAttributes<HTMLElement>>;
2117
+
2118
+ interface HandoffParty {
2119
+ /** Display name, e.g. "planner". */
2120
+ name: string;
2121
+ /** Optional avatar initials (max 2 chars). */
2122
+ initials?: string;
2123
+ /** Identity tone matching AgentProfile. */
2124
+ tone?: "primary" | "accent" | "success" | "warning" | "info" | "muted";
2125
+ }
2126
+ interface AgentHandoffProps extends HTMLAttributes<HTMLElement> {
2127
+ from: HandoffParty;
2128
+ to: HandoffParty;
2129
+ /** What is being handed off — short reason / payload preview. */
2130
+ reason: ReactNode;
2131
+ /** Optional metadata footer (e.g. timestamp, token budget). */
2132
+ footer?: ReactNode;
2133
+ }
2134
+ /**
2135
+ * AgentHandoff — visual marker of one agent delegating to another. Pairs
2136
+ * with AgentProfile for the identity tones; place it in the timeline so the
2137
+ * user sees the baton being passed.
2138
+ */
2139
+ declare const AgentHandoff: react.ForwardRefExoticComponent<AgentHandoffProps & react.RefAttributes<HTMLElement>>;
2140
+
2141
+ /**
2142
+ * AgentStreaming — inline "agent is thinking / typing" indicator.
2143
+ *
2144
+ * Renders inside an agent stream while the model is producing a response.
2145
+ * Default visual is 3 violet dots pulsing. If `partial` is provided, renders
2146
+ * the streamed-so-far text with a caret. Optional `model` label on the right.
2147
+ */
2148
+ interface AgentStreamingProps extends HTMLAttributes<HTMLDivElement> {
2149
+ /** Streamed-so-far text. When present, replaces the dots animation. */
2150
+ partial?: ReactNode;
2151
+ /** Optional model name shown as a chip. */
2152
+ model?: ReactNode;
2153
+ }
2154
+ declare const AgentStreaming: react.ForwardRefExoticComponent<AgentStreamingProps & react.RefAttributes<HTMLDivElement>>;
2155
+
2156
+ /**
2157
+ * AgentErrorCard — inline error / blocked-state card for an agent stream.
2158
+ *
2159
+ * Renders when the agent run hits a wall it can't recover from on its own:
2160
+ * rate limit, context overflow, auth lost, tool failure, network error.
2161
+ * Severity is always destructive; the `kind` drives the icon and helps the
2162
+ * consumer wire recovery actions in the footer slot.
2163
+ */
2164
+ type AgentErrorKind = "rate-limit" | "context-overflow" | "auth" | "tool-failure" | "network" | "generic";
2165
+ interface AgentErrorCardProps extends Omit<HTMLAttributes<HTMLElement>, "title"> {
2166
+ kind?: AgentErrorKind;
2167
+ title: ReactNode;
2168
+ detail?: ReactNode;
2169
+ /** Recovery action slot (Retry, Reset, Re-auth, etc.). */
2170
+ actions?: ReactNode;
2171
+ timestamp?: ReactNode;
2172
+ }
2173
+ declare const AgentErrorCard: react.ForwardRefExoticComponent<AgentErrorCardProps & react.RefAttributes<HTMLElement>>;
2174
+
2175
+ /**
2176
+ * ToolCallCard — single agent tool invocation rendered inside the stream.
2177
+ *
2178
+ * Visual: row with tool icon + tool name + target/command (mono) + status +
2179
+ * optional chevron. Expandable: when `output` is provided the row becomes a
2180
+ * `<details>` whose body renders the stdout/stderr/result block.
2181
+ *
2182
+ * Distinct from `AgentEvent` in the existing AgentTimeline by being a
2183
+ * stand-alone card that lives inside an AgentStream alongside chat messages.
2184
+ */
2185
+ type ToolCallStatus = "running" | "success" | "failed" | "queued" | "skipped";
2186
+ interface ToolCallCardProps extends HTMLAttributes<HTMLElement> {
2187
+ /** Tool name (matches Theo Code / Claude Code tool registry: Bash, Edit, Read, …). */
2188
+ tool: ReactNode;
2189
+ /** Optional icon for the tool. */
2190
+ icon?: IconComponent;
2191
+ /** Target / command shown in monospace next to the tool name. */
2192
+ target?: ReactNode;
2193
+ status: ToolCallStatus;
2194
+ /** Optional stdout/stderr/result body. When present, the card becomes expandable. */
2195
+ output?: ReactNode;
2196
+ /** Default expanded state. Default: false (collapsed). */
2197
+ defaultExpanded?: boolean;
2198
+ /** Timestamp shown on the right. */
2199
+ timestamp?: ReactNode;
2200
+ }
2201
+ declare function ToolCallCard({ className, tool, icon: Icon, target, status, output, defaultExpanded, timestamp, ...props }: ToolCallCardProps): react.JSX.Element;
2202
+
2203
+ interface SectionProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> {
2204
+ title?: ReactNode;
2205
+ }
2206
+ interface ItemProps$1 extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, "type"> {
2207
+ icon?: ElementType;
2208
+ active?: boolean;
2209
+ count?: number | string;
2210
+ as?: "button" | "a";
2211
+ href?: string;
2212
+ }
2213
+ declare const Sidebar: react.ForwardRefExoticComponent<HTMLAttributes<HTMLElement> & react.RefAttributes<HTMLElement>> & {
2214
+ Header: react.ForwardRefExoticComponent<HTMLAttributes<HTMLDivElement> & react.RefAttributes<HTMLDivElement>>;
2215
+ Section: react.ForwardRefExoticComponent<SectionProps & react.RefAttributes<HTMLDivElement>>;
2216
+ Item: react.ForwardRefExoticComponent<ItemProps$1 & react.RefAttributes<HTMLElement>>;
2217
+ Footer: react.ForwardRefExoticComponent<HTMLAttributes<HTMLDivElement> & react.RefAttributes<HTMLDivElement>>;
2218
+ };
2219
+
2220
+ interface BreadcrumbItem {
2221
+ label: ReactNode;
2222
+ href?: string;
2223
+ }
2224
+ interface BreadcrumbsProps extends HTMLAttributes<HTMLElement> {
2225
+ items: BreadcrumbItem[];
2226
+ }
2227
+ interface ModeSwitcherOption {
2228
+ value: string;
2229
+ label: ReactNode;
2230
+ }
2231
+ interface ModeSwitcherProps extends Omit<HTMLAttributes<HTMLDivElement>, "onChange"> {
2232
+ value: string;
2233
+ options: ModeSwitcherOption[];
2234
+ onChange?: (value: string) => void;
2235
+ /**
2236
+ * Accessible label for the radiogroup. Defaults to "Mode".
2237
+ */
2238
+ ariaLabel?: string;
2239
+ }
2240
+ declare const TopNav: react.ForwardRefExoticComponent<HTMLAttributes<HTMLElement> & react.RefAttributes<HTMLElement>> & {
2241
+ Left: react.ForwardRefExoticComponent<HTMLAttributes<HTMLDivElement> & react.RefAttributes<HTMLDivElement>>;
2242
+ Center: react.ForwardRefExoticComponent<HTMLAttributes<HTMLDivElement> & react.RefAttributes<HTMLDivElement>>;
2243
+ Right: react.ForwardRefExoticComponent<HTMLAttributes<HTMLDivElement> & react.RefAttributes<HTMLDivElement>>;
2244
+ Breadcrumbs: react.ForwardRefExoticComponent<BreadcrumbsProps & react.RefAttributes<HTMLElement>>;
2245
+ ModeSwitcher: react.ForwardRefExoticComponent<ModeSwitcherProps & react.RefAttributes<HTMLDivElement>>;
2246
+ };
2247
+
2248
+ /**
2249
+ * Sheet — slide-in side panel built on Radix Dialog.
2250
+ *
2251
+ * Same Radix primitive as Dialog, but Content slides from an edge instead of
2252
+ * fading from center. Used for: workspace overlays (Memory, Observability,
2253
+ * Sub-agents), Settings, contextual filters.
2254
+ *
2255
+ * Composition:
2256
+ * <Sheet>
2257
+ * <Sheet.Trigger>Open</Sheet.Trigger>
2258
+ * <Sheet.Content side="right">
2259
+ * <Sheet.Header>
2260
+ * <Sheet.Title>Memory</Sheet.Title>
2261
+ * <Sheet.Description>Episodes and wiki pages</Sheet.Description>
2262
+ * </Sheet.Header>
2263
+ * <Sheet.Body>…</Sheet.Body>
2264
+ * <Sheet.Footer>…</Sheet.Footer>
2265
+ * </Sheet.Content>
2266
+ * </Sheet>
2267
+ */
2268
+ declare const Overlay: react.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogOverlayProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
2269
+ declare const sheetVariants: (props?: ({
2270
+ side?: "bottom" | "left" | "right" | "top" | null | undefined;
2271
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
2272
+ interface ContentProps extends ComponentPropsWithoutRef<typeof DialogPrimitive.Content>, VariantProps<typeof sheetVariants> {
2273
+ hideCloseButton?: boolean;
2274
+ }
2275
+ declare const Content$1: react.ForwardRefExoticComponent<ContentProps & react.RefAttributes<HTMLDivElement>>;
2276
+ declare const Header$1: {
2277
+ ({ className, ...props }: HTMLAttributes<HTMLDivElement>): react.JSX.Element;
2278
+ displayName: string;
2279
+ };
2280
+ declare const Body$1: {
2281
+ ({ className, ...props }: HTMLAttributes<HTMLDivElement>): react.JSX.Element;
2282
+ displayName: string;
2283
+ };
2284
+ declare const Footer: {
2285
+ ({ className, ...props }: HTMLAttributes<HTMLDivElement>): react.JSX.Element;
2286
+ displayName: string;
2287
+ };
2288
+ declare const Title: react.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogTitleProps & react.RefAttributes<HTMLHeadingElement>, "ref"> & react.RefAttributes<HTMLHeadingElement>>;
2289
+ declare const Description: react.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogDescriptionProps & react.RefAttributes<HTMLParagraphElement>, "ref"> & react.RefAttributes<HTMLParagraphElement>>;
2290
+ declare const Sheet: typeof DialogPrimitive.Root & {
2291
+ Trigger: typeof DialogPrimitive.Trigger;
2292
+ Close: typeof DialogPrimitive.Close;
2293
+ Content: typeof Content$1;
2294
+ Overlay: typeof Overlay;
2295
+ Header: typeof Header$1;
2296
+ Body: typeof Body$1;
2297
+ Footer: typeof Footer;
2298
+ Title: typeof Title;
2299
+ Description: typeof Description;
2300
+ };
2301
+
2302
+ /**
2303
+ * ProjectSwitcher — sidebar header for a code agent app.
2304
+ *
2305
+ * Shows the active workspace (folder name) + branch + status dot + a tiny
2306
+ * `ChevronsUpDown` hint when clickable. Used in Sidebar.Header to anchor the
2307
+ * current project context for the session list below.
2308
+ *
2309
+ * <Sidebar.Header className="p-0">
2310
+ * <ProjectSwitcher
2311
+ * workspace="acme-web"
2312
+ * branch="claude/alignment-grid"
2313
+ * status="running"
2314
+ * onClick={openProjectPicker}
2315
+ * />
2316
+ * </Sidebar.Header>
2317
+ *
2318
+ * If `onClick` is omitted, renders as a static `<div>` (no chevron, not focusable).
2319
+ */
2320
+ type ProjectStatus = "idle" | "running" | "error" | "offline";
2321
+ interface ProjectSwitcherProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, "type" | "children"> {
2322
+ /** Workspace / folder name (e.g. "acme-web"). */
2323
+ workspace: ReactNode;
2324
+ /** Optional git branch. Renders inline with a GitBranch icon. */
2325
+ branch?: ReactNode;
2326
+ /** Optional status dot. Defaults to "idle". */
2327
+ status?: ProjectStatus;
2328
+ /** Brand letter / icon shown in the violet tile. Default: first char of workspace if string. */
2329
+ brand?: ReactNode;
2330
+ }
2331
+ declare const ProjectSwitcher: react.ForwardRefExoticComponent<ProjectSwitcherProps & react.RefAttributes<HTMLButtonElement>>;
2332
+
2333
+ /**
2334
+ * SessionListItem — single row in the sidebar's Sessions list for a code agent
2335
+ * app. Richer than the generic `Sidebar.Item`: shows a status dot, the agent
2336
+ * mode last used (chat/code/infra), and a relative timestamp.
2337
+ *
2338
+ * <SessionListItem
2339
+ * title="Build the alignment grid demo"
2340
+ * status="running"
2341
+ * mode="code"
2342
+ * timestamp="2m ago"
2343
+ * active
2344
+ * onClick={() => navigate(`/session/${id}`)}
2345
+ * />
2346
+ *
2347
+ * The status dot maps to the agent run state and animates while running.
2348
+ */
2349
+ type SessionRunStatus = "running" | "queued" | "completed" | "failed" | "cancelled";
2350
+ type SessionMode = "chat" | "code" | "infra";
2351
+ interface SessionListItemProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, "type" | "children" | "title"> {
2352
+ /** Session title (truncated). */
2353
+ title: ReactNode;
2354
+ /** Agent run state. Drives the status dot. */
2355
+ status: SessionRunStatus;
2356
+ /** Last mode the user was viewing this session in. Optional pill. */
2357
+ mode?: SessionMode;
2358
+ /** Relative timestamp string ("2m ago", "yesterday"). */
2359
+ timestamp?: ReactNode;
2360
+ /** Optional unread count (pending agent events, new outputs). */
2361
+ unread?: number;
2362
+ /** Whether this is the currently selected session. */
2363
+ active?: boolean;
2364
+ }
2365
+ declare const SessionListItem: react.ForwardRefExoticComponent<SessionListItemProps & react.RefAttributes<HTMLButtonElement>>;
2366
+
2367
+ type DataRenderer = (data: unknown, part: DataUIPart) => JSX.Element;
2368
+ type DataRendererMap = Record<string, DataRenderer>;
2369
+ interface DataPartProps {
2370
+ part: DataUIPart;
2371
+ /** Map of `data-${name}` → renderer. */
2372
+ renderers?: DataRendererMap;
2373
+ }
2374
+ declare function DataPart({ part, renderers }: DataPartProps): JSX.Element;
2375
+
2376
+ type ChatMessageRootProps = HTMLAttributes<HTMLDivElement> & {
2377
+ /** Sender role — controls layout (right-aligned bubble for `user`, left for `assistant`/`system`). */
2378
+ from: MessageRole;
2379
+ };
2380
+ declare const ChatMessageRoot: react.ForwardRefExoticComponent<HTMLAttributes<HTMLDivElement> & {
2381
+ /** Sender role — controls layout (right-aligned bubble for `user`, left for `assistant`/`system`). */
2382
+ from: MessageRole;
2383
+ } & react.RefAttributes<HTMLDivElement>>;
2384
+ type ChatMessageContentVariant = "contained" | "flat";
2385
+ interface ChatMessageContentProps extends HTMLAttributes<HTMLDivElement> {
2386
+ /**
2387
+ * `contained` (default) — bubble surface (background + padding + radius).
2388
+ * Applied to user role automatically. Assistant defaults to `flat`.
2389
+ *
2390
+ * `flat` — no bubble, content flows directly. Use for assistant or system.
2391
+ */
2392
+ variant?: ChatMessageContentVariant;
2393
+ }
2394
+ declare const ChatMessageContent: react.ForwardRefExoticComponent<ChatMessageContentProps & react.RefAttributes<HTMLDivElement>>;
2395
+ interface RenderPartOptions {
2396
+ /** Consumer-defined renderers for `data-${name}` parts. */
2397
+ dataRenderers?: DataRendererMap;
2398
+ /** Override built-in renderers per part `type`. */
2399
+ partRenderers?: PartRendererMap;
2400
+ }
2401
+ type PartRendererMap = Partial<{
2402
+ text: (part: TextUIPart) => ReactNode;
2403
+ reasoning: (part: ReasoningUIPart) => ReactNode;
2404
+ "reasoning-file": (part: ReasoningFileUIPart) => ReactNode;
2405
+ file: (part: FileUIPart) => ReactNode;
2406
+ "source-url": (part: SourceUrlUIPart) => ReactNode;
2407
+ "source-document": (part: SourceDocumentUIPart) => ReactNode;
2408
+ tool: (part: ToolUIPart) => ReactNode;
2409
+ data: (part: DataUIPart) => ReactNode;
2410
+ "step-start": () => ReactNode;
2411
+ }>;
2412
+ declare function renderPart(part: UIMessagePart, opts?: RenderPartOptions): ReactNode;
2413
+ interface ChatMessageProps extends Omit<HTMLAttributes<HTMLDivElement>, "children"> {
2414
+ /** The UI message to render. Parts are dispatched automatically. */
2415
+ message: UIMessage;
2416
+ /** Optional avatar slot rendered before assistant/system content. */
2417
+ avatar?: ReactNode;
2418
+ /** Optional toolbar (copy / regenerate / branch nav) rendered below the content. */
2419
+ actions?: ReactNode;
2420
+ /** Variant of the content bubble. */
2421
+ variant?: ChatMessageContentVariant;
2422
+ /** Override built-in part renderers. */
2423
+ partRenderers?: PartRendererMap;
2424
+ /** Renderers for `data-${name}` parts. */
2425
+ dataRenderers?: DataRendererMap;
2426
+ }
2427
+ declare const ChatMessage: react.ForwardRefExoticComponent<ChatMessageProps & react.RefAttributes<HTMLDivElement>>;
2428
+
2429
+ interface ChatMessageResponseProps {
2430
+ /** Raw markdown text from the model. */
2431
+ text: string;
2432
+ /**
2433
+ * True while tokens are still arriving. Enables the streaming-safe
2434
+ * preprocess pass (auto-closes incomplete `**bold`, fences, links, math).
2435
+ */
2436
+ isStreaming?: boolean;
2437
+ /** Extra className on the prose wrapper. */
2438
+ className?: string;
2439
+ }
2440
+ declare function ChatMessageResponseImpl({ text, isStreaming, className, }: ChatMessageResponseProps): ReactElement;
2441
+ declare const ChatMessageResponse: react.MemoExoticComponent<typeof ChatMessageResponseImpl>;
2442
+
2443
+ /**
2444
+ * `<ChatMessageActions>` + `<ChatMessageAction>` — footer toolbar for a chat
2445
+ * message (copy, regenerate, thumbs up/down, share, edit, …).
2446
+ *
2447
+ * Forked from `vercel/ai-elements` `<MessageActions>` + `<MessageAction>`
2448
+ * (Apache-2.0, see NOTICE). Adapted to TheoUI primitives: `<Button>` from
2449
+ * `@theokit/ui` instead of shadcn, no Tooltip primitive yet (Vercel uses
2450
+ * one — we render the `tooltip` prop as a `title` attribute for now; a
2451
+ * proper Tooltip primitive lands in a follow-up RFC).
2452
+ */
2453
+
2454
+ type ChatMessageActionsProps = HTMLAttributes<HTMLDivElement>;
2455
+ declare function ChatMessageActions({ className, children, ...props }: ChatMessageActionsProps): JSX.Element;
2456
+ type ChatMessageActionProps = ComponentProps<typeof Button> & {
2457
+ /** Tooltip text — rendered as native `title` for now. */
2458
+ tooltip?: string;
2459
+ /** Accessible label (used by screen readers when only an icon is visible). */
2460
+ label?: string;
2461
+ children?: ReactNode;
2462
+ };
2463
+ declare function ChatMessageAction({ tooltip, label, variant, size, className, children, ...props }: ChatMessageActionProps): JSX.Element;
2464
+
2465
+ /**
2466
+ * `<ChatMessageToolbar>` — bottom-of-message bar holding actions + branch nav.
2467
+ * Forked from `vercel/ai-elements` `<MessageToolbar>` (Apache-2.0, NOTICE).
2468
+ */
2469
+
2470
+ type ChatMessageToolbarProps = HTMLAttributes<HTMLDivElement>;
2471
+ declare function ChatMessageToolbar({ className, children, ...props }: ChatMessageToolbarProps): JSX.Element;
2472
+
2473
+ type ChatMessageBranchProps = HTMLAttributes<HTMLDivElement> & {
2474
+ defaultBranch?: number;
2475
+ onBranchChange?: (branchIndex: number) => void;
2476
+ };
2477
+ declare function ChatMessageBranch({ defaultBranch, onBranchChange, className, ...props }: ChatMessageBranchProps): JSX.Element;
2478
+ type ChatMessageBranchContentProps = HTMLAttributes<HTMLDivElement>;
2479
+ declare function ChatMessageBranchContent({ children, ...props }: ChatMessageBranchContentProps): JSX.Element;
2480
+ type ChatMessageBranchSelectorProps = HTMLAttributes<HTMLDivElement>;
2481
+ declare function ChatMessageBranchSelector({ className, ...props }: ChatMessageBranchSelectorProps): JSX.Element | null;
2482
+ type ChatMessageBranchPreviousProps = ComponentProps<typeof Button>;
2483
+ declare function ChatMessageBranchPrevious({ children, ...props }: ChatMessageBranchPreviousProps): JSX.Element;
2484
+ type ChatMessageBranchNextProps = ComponentProps<typeof Button>;
2485
+ declare function ChatMessageBranchNext({ children, ...props }: ChatMessageBranchNextProps): JSX.Element;
2486
+ type ChatMessageBranchPageProps = HTMLAttributes<HTMLSpanElement>;
2487
+ declare function ChatMessageBranchPage({ className, ...props }: ChatMessageBranchPageProps): JSX.Element;
2488
+
2489
+ /**
2490
+ * `<TextPart>` — renders a `TextUIPart`.
2491
+ *
2492
+ * Delegates to `<ChatMessageResponse>` which handles markdown + streaming
2493
+ * preprocess + code-block highlight + memoization.
2494
+ */
2495
+
2496
+ interface TextPartProps {
2497
+ part: TextUIPart;
2498
+ }
2499
+ declare function TextPart({ part }: TextPartProps): JSX.Element;
2500
+
2501
+ interface ReasoningPartProps {
2502
+ part: ReasoningUIPart;
2503
+ /** Open by default. Useful while the model is still streaming reasoning. */
2504
+ defaultOpen?: boolean;
2505
+ }
2506
+ declare function ReasoningPart({ part, defaultOpen }: ReasoningPartProps): JSX.Element;
2507
+
2508
+ interface ToolCallPartProps {
2509
+ part: ToolUIPart;
2510
+ }
2511
+ declare function ToolCallPart({ part }: ToolCallPartProps): JSX.Element;
2512
+
2513
+ interface FilePartProps {
2514
+ part: FileUIPart;
2515
+ }
2516
+ declare function FilePart({ part }: FilePartProps): JSX.Element;
2517
+
2518
+ interface SourceUrlPartProps {
2519
+ part: SourceUrlUIPart;
2520
+ }
2521
+ declare function SourceUrlPart({ part }: SourceUrlPartProps): JSX.Element;
2522
+ interface SourceDocumentPartProps {
2523
+ part: SourceDocumentUIPart;
2524
+ }
2525
+ declare function SourceDocumentPart({ part }: SourceDocumentPartProps): JSX.Element;
2526
+
2527
+ /**
2528
+ * ChatThread — simple vertical container that applies spacing + scroll.
2529
+ *
2530
+ * No virtualization or stickiness. Wrap with your own scroller for long threads.
2531
+ *
2532
+ * T4.1 (MF-4): declares the outer live region and wraps children in
2533
+ * LiveRegionProvider so nested AgentStreaming / AgentErrorCard / Skeleton
2534
+ * don't add their own aria-live (double-announcement avoided).
2535
+ */
2536
+ declare const ChatThread: react.ForwardRefExoticComponent<HTMLAttributes<HTMLDivElement> & react.RefAttributes<HTMLDivElement>>;
2537
+
2538
+ interface ModelOption {
2539
+ id: string;
2540
+ label: string;
2541
+ /** Optional vendor hint shown small below the label. */
2542
+ vendor?: string;
2543
+ /** Optional tag e.g. "default", "fast", "smart". */
2544
+ tag?: string;
2545
+ }
2546
+ interface ModelSelectorProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, "onChange"> {
2547
+ value: string;
2548
+ options: ModelOption[];
2549
+ onChange?: (id: string) => void;
2550
+ }
2551
+ /**
2552
+ * ModelSelector — chip dropdown for picking the active LLM.
2553
+ *
2554
+ * Visual: pill with violet dot + label + chevron. Dropdown uses Radix Menu.
2555
+ */
2556
+ declare const ModelSelector: react.ForwardRefExoticComponent<ModelSelectorProps & react.RefAttributes<HTMLButtonElement>>;
2557
+
2558
+ interface IntentOption {
2559
+ id: string;
2560
+ label: string;
2561
+ /** Optional one-liner shown below the label in the menu. */
2562
+ description?: string;
2563
+ /** Optional icon — defaults to a pencil for the trigger if none. */
2564
+ icon?: IconComponent;
2565
+ }
2566
+ interface IntentSelectorProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, "onChange"> {
2567
+ value: string;
2568
+ options: IntentOption[];
2569
+ onChange?: (id: string) => void;
2570
+ }
2571
+ /**
2572
+ * IntentSelector — chip dropdown for picking the agent's intent for the next
2573
+ * turn (e.g. edit / plan / review). Mirrors ModelSelector: pill trigger +
2574
+ * Radix DropdownMenu of options with description and a check on the active.
2575
+ */
2576
+ declare const IntentSelector: react.ForwardRefExoticComponent<IntentSelectorProps & react.RefAttributes<HTMLButtonElement>>;
2577
+
2578
+ interface MentionItem {
2579
+ id: string;
2580
+ /** Primary label shown on the row. */
2581
+ label: ReactNode;
2582
+ /** Secondary one-line description (optional). */
2583
+ description?: ReactNode;
2584
+ /** Optional per-row icon override. */
2585
+ icon?: IconComponent;
2586
+ }
2587
+ /** Trigger character — drives the default header + icon if not overridden. */
2588
+ type MentionTrigger = "/" | "@" | "#";
2589
+ interface MentionMenuProps {
2590
+ /** Whether the panel is open. The consumer (composer) controls this. */
2591
+ open: boolean;
2592
+ /** Trigger character that opened the menu — used for default title + icon. */
2593
+ trigger: MentionTrigger;
2594
+ /** Items to display (already filtered by the consumer). */
2595
+ items: MentionItem[];
2596
+ /** Fires when the user selects an item via click or Enter. */
2597
+ onSelect: (item: MentionItem) => void;
2598
+ /** Fires when the user dismisses (Esc, click outside). */
2599
+ onClose: () => void;
2600
+ /** Title above the list. Defaults to the trigger's domain ("Commands", "Files", "Memories"). */
2601
+ title?: ReactNode;
2602
+ /** Empty-state message when items is empty. */
2603
+ emptyLabel?: ReactNode;
2604
+ /** Override the alignment relative to its anchor. Default: above-left. */
2605
+ className?: string;
2606
+ }
2607
+ /**
2608
+ * MentionMenu — keyboard-navigable popover for slash-command / @file / #memory
2609
+ * triggers inside an agent composer.
2610
+ *
2611
+ * Generic by design: the consumer decides what items appear for each trigger
2612
+ * (commands list, file search, memory lookup, …). MentionMenu owns the visual
2613
+ * presentation, selection highlight, Esc/Enter/Arrow keys.
2614
+ *
2615
+ * Position: absolute, anchored to the closest positioned ancestor — usually
2616
+ * the composer wrapper. Default `bottom-full left-0` (above the composer).
2617
+ */
2618
+ declare function MentionMenu({ open, trigger, items, onSelect, onClose, title, emptyLabel, className, }: MentionMenuProps): react.JSX.Element | null;
2619
+
2620
+ interface FolderSelectorProps extends ButtonHTMLAttributes<HTMLButtonElement> {
2621
+ /** Currently selected absolute path. */
2622
+ path: string;
2623
+ /**
2624
+ * Render in compact mode (smaller height, no chevron padding).
2625
+ * Default is the full-width composer variant used in the Files panel.
2626
+ */
2627
+ compact?: boolean;
2628
+ }
2629
+ /**
2630
+ * FolderSelector — chip showing the active working directory.
2631
+ *
2632
+ * Visual: folder icon + monospaced path (truncated middle) + chevron.
2633
+ * Stateless: caller handles the actual folder-picker dialog.
2634
+ */
2635
+ declare const FolderSelector: react.ForwardRefExoticComponent<FolderSelectorProps & react.RefAttributes<HTMLButtonElement>>;
2636
+
2637
+ interface AttachmentChipProps extends HTMLAttributes<HTMLDivElement> {
2638
+ attachment: Attachment;
2639
+ onRemove?: (id: string) => void;
2640
+ }
2641
+ /**
2642
+ * AttachmentChip — file pill shown in chat composer or message attachments row.
2643
+ *
2644
+ * Visual: rounded chip with type-icon + name + size + optional remove button.
2645
+ * Truncates the name with `text-ellipsis`; full name available via title.
2646
+ */
2647
+ declare const AttachmentChip: react.ForwardRefExoticComponent<AttachmentChipProps & react.RefAttributes<HTMLDivElement>>;
2648
+
2649
+ interface QuickAction {
2650
+ id: string;
2651
+ label: ReactNode;
2652
+ /** Icon component (e.g. from lucide-react). */
2653
+ icon?: IconComponent;
2654
+ /** When true, the chip is highlighted as the suggested next action. */
2655
+ primary?: boolean;
2656
+ }
2657
+ interface QuickActionChipsProps extends Omit<HTMLAttributes<HTMLDivElement>, "onSelect"> {
2658
+ actions: QuickAction[];
2659
+ onSelect?: (id: string) => void;
2660
+ }
2661
+ /**
2662
+ * QuickActionChips — row of intent chips below a hero composer.
2663
+ *
2664
+ * Used in Chat Home ("Escrever / Aprender / Código / Assuntos pessoais")
2665
+ * and the Files panel.
2666
+ */
2667
+ declare const QuickActionChips: react.ForwardRefExoticComponent<QuickActionChipsProps & react.RefAttributes<HTMLDivElement>>;
2668
+
2669
+ interface AgentEventProps extends HTMLAttributes<HTMLDivElement> {
2670
+ event: AgentEvent$1;
2671
+ /**
2672
+ * If true, clicking the row toggles `event.detail` visibility.
2673
+ */
2674
+ collapsible?: boolean;
2675
+ /**
2676
+ * Force the collapsible state (for controlled scenarios).
2677
+ */
2678
+ defaultOpen?: boolean;
2679
+ }
2680
+ /**
2681
+ * AgentEvent — single event row in the agent timeline.
2682
+ *
2683
+ * Composition: type icon + label + path + diff stats + status icon + (optional) chevron.
2684
+ * Running events show a spinner via motion-safe:animate-spin (respects
2685
+ * `prefers-reduced-motion`); failed events flash red.
2686
+ *
2687
+ * When `collapsible` is true and `event.detail` is provided, the row renders as
2688
+ * a native `<button>` for correct keyboard and screen-reader semantics.
2689
+ */
2690
+ declare const AgentEvent: react.ForwardRefExoticComponent<AgentEventProps & react.RefAttributes<HTMLDivElement>>;
2691
+
2692
+ interface AgentStartingStateProps extends OutputHTMLAttributes<HTMLOutputElement> {
2693
+ /** Title shown next to the spinner. Default "Starting up…". */
2694
+ label?: ReactNode;
2695
+ /** Optional secondary copy explaining the bootstrap step. */
2696
+ hint?: ReactNode;
2697
+ }
2698
+ /**
2699
+ * AgentStartingState — full-width skeleton shown while the agent boots.
2700
+ *
2701
+ * Visual: violet spinner + label, optional hint below. Wrapped in a soft card.
2702
+ * Uses semantic `<output aria-live="polite">` so screen readers announce the state.
2703
+ */
2704
+ declare const AgentStartingState: react.ForwardRefExoticComponent<AgentStartingStateProps & react.RefAttributes<HTMLOutputElement>>;
2705
+
2706
+ interface RunStatsProps extends HTMLAttributes<HTMLDivElement> {
2707
+ duration?: string;
2708
+ /** Formatted token count, e.g. "35.7k". */
2709
+ tokens?: string;
2710
+ /** Number of files changed in the run. */
2711
+ filesChanged?: number;
2712
+ }
2713
+ /**
2714
+ * RunStats — inline metric row shown after an agent run.
2715
+ *
2716
+ * Visual: muted bullet-separated row with clock + tokens + files-changed icons.
2717
+ * All optional — the component skips entries that aren't provided.
2718
+ */
2719
+ declare const RunStats: react.ForwardRefExoticComponent<RunStatsProps & react.RefAttributes<HTMLDivElement>>;
2720
+
2721
+ interface ToolCallProps extends HTMLAttributes<HTMLDivElement> {
2722
+ /** Tool name e.g. "bash", "read_file", "edit_file". */
2723
+ name?: string;
2724
+ /**
2725
+ * Summary label e.g. "Ran 2 commands", "Read 18 files".
2726
+ */
2727
+ summary: ReactNode;
2728
+ /**
2729
+ * Collapsible payload (e.g. command, stdout, file list).
2730
+ */
2731
+ detail?: ReactNode;
2732
+ defaultOpen?: boolean;
2733
+ /**
2734
+ * If true, hides the wrench icon (useful when grouping by name elsewhere).
2735
+ */
2736
+ hideIcon?: boolean;
2737
+ }
2738
+ /**
2739
+ * ToolCall — collapsible row representing an agent tool invocation.
2740
+ *
2741
+ * Visual: subtle muted container, wrench icon, summary in body text,
2742
+ * chevron rotates on expand. Pairs with `<ToolResult>` for the rendered output.
2743
+ *
2744
+ * Typical usage inside a ChatMessage assistant body:
2745
+ *
2746
+ * <ToolCall summary="Read 18 files" detail={<ToolResult>{output}</ToolResult>} />
2747
+ */
2748
+ declare const ToolCall: react.ForwardRefExoticComponent<ToolCallProps & react.RefAttributes<HTMLDivElement>>;
2749
+
2750
+ type Variant = "text" | "code" | "json";
2751
+ interface ToolResultProps extends HTMLAttributes<HTMLDivElement> {
2752
+ variant?: Variant;
2753
+ /**
2754
+ * Pre-formatted content. For `code`/`json`, the component uses mono font
2755
+ * and preserves whitespace. For `text`, normal body font.
2756
+ */
2757
+ children: ReactNode;
2758
+ }
2759
+ /**
2760
+ * ToolResult — formatted output of a tool invocation.
2761
+ *
2762
+ * Three quick variants: plain text, code (monospace), json (monospace, tinted).
2763
+ * Always rendered as a `<div>` for predictable prop typing; code/json variants
2764
+ * wrap children in `<pre>` internally.
2765
+ */
2766
+ declare const ToolResult: react.ForwardRefExoticComponent<ToolResultProps & react.RefAttributes<HTMLDivElement>>;
2767
+
2768
+ /**
2769
+ * Progress — accessible progress bar primitive.
2770
+ *
2771
+ * Built on `<div role="progressbar">` (NOT native `<progress>`) so Tailwind
2772
+ * classes can style the track + fill cross-browser (Chrome/Safari/Firefox
2773
+ * shadow-DOM hooks for `<progress>` diverge). Matches Radix / shadcn /
2774
+ * Mantine convention.
2775
+ *
2776
+ * Variants:
2777
+ * - intent: `default` | `success` | `warning` | `destructive` — controls fill color
2778
+ * - height: `h-1` (4px, default) | `h-1.5` | `h-2` | `h-3`
2779
+ * - indeterminate: animated bar, no value (e.g. "uploading…", "building…")
2780
+ *
2781
+ * Composition:
2782
+ * <Progress value={42} max={100} intent="success" aria-label="Upload" />
2783
+ * <Progress indeterminate aria-label="Building" />
2784
+ *
2785
+ * A11y:
2786
+ * - role="progressbar"
2787
+ * - aria-valuenow / aria-valuemin / aria-valuemax (determinate)
2788
+ * - aria-busy="true" when indeterminate
2789
+ * - Respects `prefers-reduced-motion` (no animation when set)
2790
+ *
2791
+ * Used by `<UsageMeter>` to render each metric's fill bar, but ships as a
2792
+ * standalone primitive for direct consumer use (deploy phase, file upload,
2793
+ * build progress, quota fill).
2794
+ */
2795
+ interface ProgressProps extends Omit<HTMLAttributes<HTMLDivElement>, "role"> {
2796
+ /** Current value (0..max). Values outside the range are clamped. */
2797
+ value?: number;
2798
+ /** Maximum value. Defaults to 100. */
2799
+ max?: number;
2800
+ /** Visual intent — controls fill color. */
2801
+ intent?: "default" | "success" | "warning" | "destructive";
2802
+ /** Bar height in tailwind units. Defaults to `"h-1"` (4px). */
2803
+ height?: "h-1" | "h-1.5" | "h-2" | "h-3";
2804
+ /** When true, animated bar with no value. Omits `aria-valuenow`, adds `aria-busy`. */
2805
+ indeterminate?: boolean;
2806
+ /** Accessible label. Required if not preceded by an `aria-labelledby` element. */
2807
+ "aria-label"?: string;
2808
+ }
2809
+ declare const Progress: react.ForwardRefExoticComponent<ProgressProps & react.RefAttributes<HTMLDivElement>>;
2810
+
2811
+ /**
2812
+ * PlanBadge — semantic pricing-tier badge.
2813
+ *
2814
+ * Five canonical tiers (`free` / `hobby` / `pro` / `team` / `enterprise`) with
2815
+ * distinct color tokens. Consumers self-document intent with `plan="hobby"`
2816
+ * instead of mapping a generic `<Badge variant="outline">` to colors per app.
2817
+ * Future rebrand / dark-mode tweaks propagate automatically — no consumer
2818
+ * code change.
2819
+ *
2820
+ * Visual spec (per `theo/docs/handoff/2026-05-23-theo-ui-cloud-dashboard-gaps-brief.md`):
2821
+ *
2822
+ * | tier | bg | border | text |
2823
+ * |--------------|---------------------|--------------------------|-----------------------|
2824
+ * | free | bg-muted/40 | border-muted-foreground/20 | text-muted-foreground |
2825
+ * | hobby | bg-warning/10 | border-warning/30 | text-warning |
2826
+ * | pro | bg-primary/10 | border-primary/30 | text-primary |
2827
+ * | team | bg-success/10 | border-success/30 | text-success |
2828
+ * | enterprise | bg-foreground/5 | border-foreground/20 | text-foreground |
2829
+ *
2830
+ * Default label capitalizes the tier (`hobby → "Hobby"`, `enterprise → "Enterprise"`).
2831
+ *
2832
+ * Used by `<AccountMenu>` inline with the user name; usable standalone.
2833
+ */
2834
+ type PlanTier = "free" | "hobby" | "pro" | "team" | "enterprise";
2835
+ interface PlanBadgeProps extends HTMLAttributes<HTMLSpanElement> {
2836
+ /** Plan tier identifier. */
2837
+ plan: PlanTier;
2838
+ /** Override the display label. Defaults to the capitalized tier name. */
2839
+ label?: string;
2840
+ /** Size variant. */
2841
+ size?: "sm" | "md";
2842
+ }
2843
+ declare const PlanBadge: react.ForwardRefExoticComponent<PlanBadgeProps & react.RefAttributes<HTMLSpanElement>>;
2844
+
2845
+ /**
2846
+ * UsageMeter — multi-metric stacked usage card.
2847
+ *
2848
+ * PaaS-shape sibling of `<CostMeter>` (which is mono-USD). Displays N
2849
+ * metrics with arbitrary units (GB, requests, build-minutes, seats) per
2850
+ * the reference TheoCloud dashboard mockup. Each row = label + value/max
2851
+ * + `<Progress>` fill bar.
2852
+ *
2853
+ * Composition:
2854
+ *
2855
+ * <UsageMeter
2856
+ * title="Last 30 days"
2857
+ * action={<Badge variant="outline">Upgrade</Badge>}
2858
+ * metrics={[
2859
+ * { label: "Fast Data Transfer", value: 0, max: 100, unit: "GB" },
2860
+ * { label: "Edge Requests", value: 0, max: 1_000_000, unit: "req",
2861
+ * formatter: (v, m) => `${v} / ${m >= 1e6 ? `${m / 1e6}M` : m}` },
2862
+ * ]}
2863
+ * />
2864
+ *
2865
+ * Over-quota detection: when `value > max`, the value text gets the
2866
+ * `text-warning` class and the underlying `<Progress>` uses
2867
+ * `intent="warning"` (bar fills 100% via Progress's own clamping).
2868
+ *
2869
+ * `compact` mode renders only the bars (no label/value text) — useful in
2870
+ * narrow nav-bar slots.
2871
+ *
2872
+ * Imports the sibling `<Progress>` primitive via relative path (per RFC
2873
+ * dashboard-paas-primitives D3) — primitives must not depend on the
2874
+ * `@theokit/ui` barrel.
2875
+ */
2876
+ interface UsageMetric {
2877
+ /** Display label (e.g. "Fast Data Transfer"). */
2878
+ label: ReactNode;
2879
+ /** Current consumption. */
2880
+ value: number;
2881
+ /** Maximum allowed in the current period. */
2882
+ max: number;
2883
+ /** Unit string (e.g. "GB", "req", "min"). Rendered after value/max. */
2884
+ unit?: string;
2885
+ /** Optional custom formatter — overrides default `${value} / ${max} ${unit}`. */
2886
+ formatter?: (value: number, max: number, unit?: string) => string;
2887
+ }
2888
+ interface UsageMeterProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> {
2889
+ /** Card title (e.g. "Last 30 days", "This billing period"). */
2890
+ title?: ReactNode;
2891
+ /** Optional right-aligned action slot (e.g. an Upgrade Badge or Button). */
2892
+ action?: ReactNode;
2893
+ /** Array of metrics to display. Order preserved. */
2894
+ metrics: UsageMetric[];
2895
+ /** When true, show only the bars without label/value text (sparkline mode). */
2896
+ compact?: boolean;
2897
+ }
2898
+ declare const UsageMeter: react.ForwardRefExoticComponent<UsageMeterProps & react.RefAttributes<HTMLDivElement>>;
2899
+
2900
+ /**
2901
+ * AccountMenu — sidebar header for PaaS surfaces.
2902
+ *
2903
+ * Renders avatar + name + (optional) plan badge + (optional) secondary line.
2904
+ * Dual mode: with `onClick`, renders as a `<button>` with a `ChevronsUpDown`
2905
+ * trailing icon (account picker affordance); without, renders as a static
2906
+ * `<div>` (read-only display, not focusable).
2907
+ *
2908
+ * Composition:
2909
+ *
2910
+ * <Sidebar.Header className="p-0">
2911
+ * <AccountMenu
2912
+ * name="paulohenriquevn"
2913
+ * avatar="https://avatars.githubusercontent.com/u/12345"
2914
+ * plan="hobby"
2915
+ * onClick={openAccountSwitcher}
2916
+ * />
2917
+ * </Sidebar.Header>
2918
+ *
2919
+ * Avatar handling:
2920
+ * - URL (`http(s)://` or `/`) → `<Avatar.Image>` with `<Avatar.Fallback>` initials
2921
+ * - Short string (≤2 chars) → treated as initials directly
2922
+ * - Undefined → initials derived from the first character of `name`
2923
+ *
2924
+ * PaaS-shape sibling of `<ProjectSwitcher>` (workspace + branch + agent-status).
2925
+ * Same dual-mode (interactive vs static) pattern; different semantics.
2926
+ */
2927
+ interface AccountMenuProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, "type" | "children" | "name"> {
2928
+ /** Display name (username, email, org name). */
2929
+ name: ReactNode;
2930
+ /** Avatar URL or 1-2-char initials. If undefined, derives initials from `name`. */
2931
+ avatar?: string;
2932
+ /** Plan tier — renders inline `<PlanBadge size="sm">`. Omit for none. */
2933
+ plan?: PlanTier;
2934
+ /** Optional secondary line below name (e.g. email). */
2935
+ secondary?: ReactNode;
2936
+ /** Make the row interactive (button) with a trailing chevron. */
2937
+ onClick?: () => void;
2938
+ }
2939
+ declare const AccountMenu: react.ForwardRefExoticComponent<AccountMenuProps & react.RefAttributes<HTMLElement>>;
2940
+
2941
+ /**
2942
+ * Table — semantic data table primitive with sub-components.
2943
+ *
2944
+ * Composition:
2945
+ * <Table density="default">
2946
+ * <Table.Header>
2947
+ * <Table.Row>
2948
+ * <Table.HeaderCell>Date</Table.HeaderCell>
2949
+ * <Table.HeaderCell align="right">Amount</Table.HeaderCell>
2950
+ * </Table.Row>
2951
+ * </Table.Header>
2952
+ * <Table.Body>
2953
+ * <Table.Row>
2954
+ * <Table.Cell>2026-05-23</Table.Cell>
2955
+ * <Table.Cell align="right" numeric>$ 42.00</Table.Cell>
2956
+ * </Table.Row>
2957
+ * </Table.Body>
2958
+ * </Table>
2959
+ *
2960
+ * density propagates via Context so Cells pick up vertical padding without
2961
+ * prop drilling. Sub-components are attached as static properties on the
2962
+ * root (`Table.Header`, etc.) — single import surface.
2963
+ *
2964
+ * Sortable header: pass `onSort` + `sortDirection`. The HeaderCell renders
2965
+ * the sort affordance (ChevronUp/ChevronDown) and triggers the consumer
2966
+ * callback. `sortDirection` without `onSort` is a no-op (header stays
2967
+ * static); `sortDirection="none"` with `onSort` shows a dimmed affordance.
2968
+ */
2969
+ type TableDensity = "default" | "compact";
2970
+ type AlignKind = "left" | "center" | "right";
2971
+ type SortDirection = "asc" | "desc" | "none";
2972
+ interface TableProps extends HTMLAttributes<HTMLTableElement> {
2973
+ density?: TableDensity;
2974
+ }
2975
+ declare const Root$1: react.ForwardRefExoticComponent<TableProps & react.RefAttributes<HTMLTableElement>>;
2976
+ declare const Header: react.ForwardRefExoticComponent<HTMLAttributes<HTMLTableSectionElement> & react.RefAttributes<HTMLTableSectionElement>>;
2977
+ declare const Body: react.ForwardRefExoticComponent<HTMLAttributes<HTMLTableSectionElement> & react.RefAttributes<HTMLTableSectionElement>>;
2978
+ declare const Row: react.ForwardRefExoticComponent<HTMLAttributes<HTMLTableRowElement> & react.RefAttributes<HTMLTableRowElement>>;
2979
+ interface TableCellProps extends TdHTMLAttributes<HTMLTableCellElement> {
2980
+ align?: AlignKind;
2981
+ numeric?: boolean;
2982
+ }
2983
+ declare const Cell: react.ForwardRefExoticComponent<TableCellProps & react.RefAttributes<HTMLTableCellElement>>;
2984
+ interface TableHeaderCellProps extends ThHTMLAttributes<HTMLTableCellElement> {
2985
+ align?: AlignKind;
2986
+ /** When provided, header becomes a sort trigger. */
2987
+ onSort?: () => void;
2988
+ /** Current sort state for this column. */
2989
+ sortDirection?: SortDirection;
2990
+ }
2991
+ declare const HeaderCell: react.ForwardRefExoticComponent<TableHeaderCellProps & react.RefAttributes<HTMLTableCellElement>>;
2992
+ type TableRoot = typeof Root$1 & {
2993
+ Header: typeof Header;
2994
+ Body: typeof Body;
2995
+ Row: typeof Row;
2996
+ Cell: typeof Cell;
2997
+ HeaderCell: typeof HeaderCell;
2998
+ };
2999
+ declare const Table: TableRoot;
3000
+
3001
+ /**
3002
+ * StatusDot — semantic status indicator (colored circle + optional label).
3003
+ *
3004
+ * Five status kinds:
3005
+ * - `live` — deployed / verified / healthy (success)
3006
+ * - `building` — in-progress / queued (warning, auto-pulses)
3007
+ * - `failed` — error / down / rejected (destructive)
3008
+ * - `idle` — pending / offline (muted)
3009
+ * - `warning` — degraded but functional (warning, static)
3010
+ *
3011
+ * Three sizes (xs 6px, sm 8px default, md 10px). `pulse` defaults to
3012
+ * `true` for `building` and `false` otherwise; passing `pulse` explicitly
3013
+ * overrides the auto behavior. When no visible `label` AND no `aria-label`
3014
+ * are provided, the component auto-applies `aria-label={status}` and
3015
+ * emits a dev-mode warning (a status communicated only by color is
3016
+ * invisible to screen readers).
3017
+ *
3018
+ * @example
3019
+ * <StatusDot status="live" label="Production" />
3020
+ * <StatusDot status="building" /> // auto-pulses + auto-aria-label
3021
+ */
3022
+ type StatusKind = "live" | "building" | "failed" | "idle" | "warning";
3023
+ interface StatusDotProps extends Omit<HTMLAttributes<HTMLSpanElement>, "children"> {
3024
+ status: StatusKind;
3025
+ label?: ReactNode;
3026
+ size?: "xs" | "sm" | "md";
3027
+ pulse?: boolean;
3028
+ }
3029
+ declare const StatusDot: react.ForwardRefExoticComponent<StatusDotProps & react.RefAttributes<HTMLSpanElement>>;
3030
+
3031
+ interface CopyButtonProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, "type" | "onClick" | "children"> {
3032
+ /** String to copy when clicked. */
3033
+ value: string;
3034
+ /** Optional button label. Default: just the icon. */
3035
+ label?: ReactNode;
3036
+ /** Visual style. */
3037
+ variant?: "ghost" | "outline";
3038
+ /** Size. */
3039
+ size?: "sm" | "md";
3040
+ /** Callback after successful copy (e.g. analytics). */
3041
+ onCopied?: (value: string) => void;
3042
+ /** Duration of the feedback state in ms. Default 1500. */
3043
+ feedbackDuration?: number;
3044
+ }
3045
+ declare const CopyButton: react.ForwardRefExoticComponent<CopyButtonProps & react.RefAttributes<HTMLButtonElement>>;
3046
+
3047
+ /**
3048
+ * Timestamp — accessible relative/absolute time primitive.
3049
+ *
3050
+ * Renders a semantic `<time datetime>` element. Format modes:
3051
+ * - `relative` (default) — "just now", "5 minutes ago", "2 hours ago",
3052
+ * "Dec 5" (>7d), "Dec 5, 2024" (different year)
3053
+ * - `absolute` — full localized date+time
3054
+ * - `both` — "Dec 5, 2026 (2 hours ago)"
3055
+ *
3056
+ * Uses zero-dep `Intl.RelativeTimeFormat`. The tooltip on hover is the
3057
+ * HTML `title` attribute (not the `<Tooltip>` component) — keeps this
3058
+ * file a true primitive without sibling-primitive imports.
3059
+ *
3060
+ * Auto-refreshes via `setInterval` (default 60_000ms); pass
3061
+ * `refreshInterval={0}` to disable. `aria-label` always carries the
3062
+ * absolute time so screen readers read "May 23, 2026 14:32 — posted
3063
+ * 2 hours ago".
3064
+ *
3065
+ * @param value Source date — ISO string, Date object, or **Unix ms**
3066
+ * (NOT seconds). Passing seconds renders ~1970.
3067
+ */
3068
+ interface TimestampProps extends Omit<TimeHTMLAttributes<HTMLTimeElement>, "children"> {
3069
+ value: string | Date | number;
3070
+ format?: "relative" | "absolute" | "both";
3071
+ /** Auto-refresh interval when format=relative. Default 60000. 0 disables. */
3072
+ refreshInterval?: number;
3073
+ /** Locale for absolute formatting + Intl.RelativeTimeFormat. Default browser locale. */
3074
+ locale?: string;
3075
+ /** When true, omit the `title` tooltip. */
3076
+ noTooltip?: boolean;
3077
+ }
3078
+ declare const Timestamp: react.ForwardRefExoticComponent<TimestampProps & react.RefAttributes<HTMLTimeElement>>;
3079
+
3080
+ /**
3081
+ * StatTile — big number + label + optional delta + optional icon.
3082
+ *
3083
+ * Dual mode based on `onClick`:
3084
+ * - With onClick → renders as `<button>` with hover state + trailing
3085
+ * ArrowUpRight chevron (navigation affordance).
3086
+ * - Without onClick → renders as static `<div>`.
3087
+ *
3088
+ * Delta trend drives icon + color: up=success/TrendingUp, down=destructive/
3089
+ * TrendingDown, flat=muted/Minus. Big value uses font-display + tabular-nums.
3090
+ *
3091
+ * @example
3092
+ * <StatTile value="42" label="Projects" />
3093
+ * <StatTile value="$1,234" label="MRR" icon={DollarSign}
3094
+ * delta={{ value: "+12%", trend: "up" }} onClick={openBilling} />
3095
+ */
3096
+ interface StatTileProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, "type" | "value"> {
3097
+ value: ReactNode;
3098
+ label: ReactNode;
3099
+ icon?: ElementType;
3100
+ delta?: {
3101
+ value: ReactNode;
3102
+ trend: "up" | "down" | "flat";
3103
+ };
3104
+ }
3105
+ declare const StatTile: react.ForwardRefExoticComponent<StatTileProps & react.RefAttributes<HTMLElement>>;
3106
+
3107
+ /**
3108
+ * DangerZone — destructive-actions section primitive.
3109
+ *
3110
+ * Red-bordered container with a title bar and `DangerZone.Action` rows.
3111
+ * Each Action is laid out as title + description on the left, with a
3112
+ * consumer-provided action slot (typically a destructive Button) on
3113
+ * the right. Rows are separated by hairline dividers; the last row
3114
+ * has no bottom border via `last:border-b-0`.
3115
+ *
3116
+ * The consumer supplies the destructive button — this primitive never
3117
+ * imports `<Button>`, keeping it free of internal `@theokit/ui` deps
3118
+ * (true primitive).
3119
+ *
3120
+ * @example
3121
+ * <DangerZone>
3122
+ * <DangerZone.Action
3123
+ * title="Delete project"
3124
+ * description="Permanently delete this project."
3125
+ * action={<Button variant="destructive">Delete</Button>}
3126
+ * />
3127
+ * </DangerZone>
3128
+ */
3129
+ interface DangerZoneProps extends Omit<HTMLAttributes<HTMLElement>, "title"> {
3130
+ /** Section title. Default "Danger Zone". */
3131
+ title?: ReactNode;
3132
+ }
3133
+ declare const Root: react.ForwardRefExoticComponent<DangerZoneProps & react.RefAttributes<HTMLElement>>;
3134
+ interface DangerZoneActionProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> {
3135
+ title: ReactNode;
3136
+ description: ReactNode;
3137
+ /** Consumer-provided destructive button (or any ReactNode). */
3138
+ action: ReactNode;
3139
+ }
3140
+ declare const Action: react.ForwardRefExoticComponent<DangerZoneActionProps & react.RefAttributes<HTMLDivElement>>;
3141
+ type DangerZoneRoot = typeof Root & {
3142
+ Action: typeof Action;
3143
+ };
3144
+ declare const DangerZone: DangerZoneRoot;
3145
+
3146
+ /**
3147
+ * ConfirmDialog — controlled confirmation modal built on `Dialog`.
3148
+ *
3149
+ * Focuses Cancel on open (deliberate — NOT the destructive button).
3150
+ * `intent="destructive"` styles the confirm button with the destructive
3151
+ * variant. `confirmationPhrase` enables typed-confirmation guard:
3152
+ * the confirm button is disabled until the input value matches the
3153
+ * phrase exactly (case-sensitive). An empty string phrase is treated
3154
+ * as "no phrase required" (`!!confirmationPhrase`). Pressing Enter in
3155
+ * the input triggers confirm when `canConfirm` is true.
3156
+ *
3157
+ * `onConfirm` can be async. While the returned promise is pending,
3158
+ * both buttons are disabled and a `Loader2` spinner appears. On
3159
+ * resolve, the dialog closes via `onOpenChange(false)`. On reject,
3160
+ * the dialog stays open so the consumer can show their own error.
3161
+ *
3162
+ * @example
3163
+ * <ConfirmDialog
3164
+ * open={open} onOpenChange={setOpen}
3165
+ * title="Delete project"
3166
+ * description="This cannot be undone."
3167
+ * intent="destructive"
3168
+ * confirmationPhrase="my-project"
3169
+ * onConfirm={async () => api.deleteProject(id)}
3170
+ * />
3171
+ */
3172
+ interface ConfirmDialogProps {
3173
+ open: boolean;
3174
+ onOpenChange: (open: boolean) => void;
3175
+ title: ReactNode;
3176
+ description: ReactNode;
3177
+ confirmLabel?: ReactNode;
3178
+ cancelLabel?: ReactNode;
3179
+ intent?: "default" | "destructive";
3180
+ confirmationPhrase?: string;
3181
+ onConfirm: () => void | Promise<void>;
3182
+ loading?: boolean;
3183
+ }
3184
+ declare const ConfirmDialog: react.ForwardRefExoticComponent<ConfirmDialogProps & react.RefAttributes<HTMLDivElement>>;
3185
+
3186
+ /**
3187
+ * CodeBlock — terminal command / code snippet surface.
3188
+ *
3189
+ * Pre-rendered code block with optional terminal "$ " prefix per line,
3190
+ * optional caption (file name), and optional CopyButton positioned top-right.
3191
+ * The CopyButton receives the RAW `code` (without the visual "$ " prefix),
3192
+ * so consumers paste only the executable command.
3193
+ *
3194
+ * @example
3195
+ * <CodeBlock code="theo deploy" terminal copyable />
3196
+ * <CodeBlock code={dotenv} caption=".env.local" copyable />
3197
+ *
3198
+ * `language` is reserved for future syntax highlighting (v1: ignored).
3199
+ */
3200
+ interface CodeBlockProps extends Omit<HTMLAttributes<HTMLDivElement>, "children"> {
3201
+ /** Code content. Can be multiline. */
3202
+ code: string;
3203
+ /** Language hint (forward-compat; v1 ignored). */
3204
+ language?: string;
3205
+ /** When true, prefix each line with "$ " for shell commands. */
3206
+ terminal?: boolean;
3207
+ /** Show inline CopyButton in top-right. */
3208
+ copyable?: boolean;
3209
+ /** Optional caption above block (e.g. ".env.local"). */
3210
+ caption?: ReactNode;
3211
+ }
3212
+ declare const CodeBlock: react.ForwardRefExoticComponent<CodeBlockProps & react.RefAttributes<HTMLDivElement>>;
3213
+
3214
+ /**
3215
+ * Alert — persistent inline notice. Distinct from `Toast` (transient,
3216
+ * corner-positioned, multiple stackable) and `EmptyState` (centered card
3217
+ * for no-data affordances). Full-width-of-section banner that stays
3218
+ * visible until the user acts.
3219
+ *
3220
+ * `intent` drives icon + color tokens. `destructive` intent renders
3221
+ * `role="alert"` for assertive screen-reader announcement; the other
3222
+ * three intents render `role="status"` (polite). `onDismiss`, when
3223
+ * provided, renders a trailing `X` button. `action` slot accepts any
3224
+ * ReactNode (typically a `<Button>` or anchor).
3225
+ *
3226
+ * @example
3227
+ * <Alert
3228
+ * intent="warning"
3229
+ * title="Verify your email"
3230
+ * description="We sent a link to your email."
3231
+ * action={<Button size="sm" onClick={resend}>Resend</Button>}
3232
+ * />
3233
+ */
3234
+ type AlertIntent = "info" | "success" | "warning" | "destructive";
3235
+ interface AlertProps extends Omit<HTMLAttributes<HTMLDivElement>, "title" | "role"> {
3236
+ intent?: AlertIntent;
3237
+ title?: ReactNode;
3238
+ description?: ReactNode;
3239
+ action?: ReactNode;
3240
+ onDismiss?: () => void;
3241
+ }
3242
+ declare const Alert: react.ForwardRefExoticComponent<AlertProps & react.RefAttributes<HTMLDivElement>>;
3243
+
3244
+ /**
3245
+ * Pagination — accessible page-number navigation primitive.
3246
+ *
3247
+ * Renders a `<nav aria-label="Pagination">` containing a button group:
3248
+ * `[<<] [<] 1 ... 5 6 [7] 8 9 ... 42 [>] [>>]`. The active page carries
3249
+ * `aria-current="page"`. Keyboard navigation (ArrowLeft / ArrowRight /
3250
+ * Home / End) is wired on the nav. Ellipses are rendered as
3251
+ * non-interactive `<span>` elements with `aria-hidden`.
3252
+ *
3253
+ * Renders nothing when `totalPages <= 1` (the page is the whole list).
3254
+ *
3255
+ * `siblingCount` controls how many neighbors of the current page are
3256
+ * always visible (default 1 → "5 6 [7] 8 9"). `showJumpButtons`
3257
+ * toggles the first/last `<<` / `>>` buttons.
3258
+ *
3259
+ * Consumers control state (`currentPage`) and are responsible for any
3260
+ * URL routing — the buttons are `<button>`, not `<a>`.
3261
+ *
3262
+ * @example
3263
+ * <Pagination
3264
+ * currentPage={page}
3265
+ * totalPages={42}
3266
+ * onPageChange={setPage}
3267
+ * />
3268
+ */
3269
+ interface PaginationProps extends Omit<HTMLAttributes<HTMLElement>, "onChange"> {
3270
+ currentPage: number;
3271
+ totalPages: number;
3272
+ onPageChange: (page: number) => void;
3273
+ /** Neighbors of current page that stay visible. Default 1. */
3274
+ siblingCount?: number;
3275
+ /** Render `<<` / `>>` first/last buttons. Default true. */
3276
+ showJumpButtons?: boolean;
3277
+ /** Size variant. Default md. */
3278
+ size?: "sm" | "md";
3279
+ }
3280
+ /**
3281
+ * Pure helper: compute the visible page-range with ellipses.
3282
+ * Exported for unit testing — most pagination bugs live here.
3283
+ */
3284
+ declare function computePageRange(currentPage: number, totalPages: number, siblingCount?: number): Array<number | "ellipsis-start" | "ellipsis-end">;
3285
+ declare const Pagination: react.ForwardRefExoticComponent<PaginationProps & react.RefAttributes<HTMLElement>>;
3286
+
3287
+ /**
3288
+ * DropdownMenu — accessible menu primitive built on Radix.
3289
+ *
3290
+ * Composition (single import surface):
3291
+ * <DropdownMenu>
3292
+ * <DropdownMenu.Trigger>…</DropdownMenu.Trigger>
3293
+ * <DropdownMenu.Content>
3294
+ * <DropdownMenu.Label>Section</DropdownMenu.Label>
3295
+ * <DropdownMenu.Item onSelect={…}>Edit</DropdownMenu.Item>
3296
+ * <DropdownMenu.Separator />
3297
+ * <DropdownMenu.Item disabled>Delete</DropdownMenu.Item>
3298
+ * </DropdownMenu.Content>
3299
+ * </DropdownMenu>
3300
+ *
3301
+ * The primitive consolidates 5 prior direct-Radix usages
3302
+ * (`model-selector`, `intent-selector`, `agent-profile`,
3303
+ * `theme-switcher`, `theo-code-shell`) under a single styled
3304
+ * wrapper so consumers get consistent visuals + the design tokens.
3305
+ *
3306
+ * a11y note for tests: Radix's focus-guard spans intentionally
3307
+ * violate `aria-hidden-focus`. Tests should pass
3308
+ * `{ rules: { "aria-hidden-focus": { enabled: false } } }` to axe.
3309
+ */
3310
+ declare const Trigger: react.ForwardRefExoticComponent<DropdownMenuPrimitive.DropdownMenuTriggerProps & react.RefAttributes<HTMLButtonElement>>;
3311
+ declare const Portal: react.FC<DropdownMenuPrimitive.DropdownMenuPortalProps>;
3312
+ declare const Group: react.ForwardRefExoticComponent<DropdownMenuPrimitive.DropdownMenuGroupProps & react.RefAttributes<HTMLDivElement>>;
3313
+ declare const Sub: react.FC<DropdownMenuPrimitive.DropdownMenuSubProps>;
3314
+ declare const RadioGroup: react.ForwardRefExoticComponent<DropdownMenuPrimitive.DropdownMenuRadioGroupProps & react.RefAttributes<HTMLDivElement>>;
3315
+ declare const Content: react.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuContentProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
3316
+ interface ItemProps extends ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> {
3317
+ inset?: boolean;
3318
+ }
3319
+ declare const Item: react.ForwardRefExoticComponent<ItemProps & react.RefAttributes<HTMLDivElement>>;
3320
+ declare const CheckboxItem: react.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuCheckboxItemProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
3321
+ declare const RadioItem: react.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuRadioItemProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
3322
+ interface LabelProps extends ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> {
3323
+ inset?: boolean;
3324
+ }
3325
+ declare const Label: react.ForwardRefExoticComponent<LabelProps & react.RefAttributes<HTMLDivElement>>;
3326
+ declare const Separator: react.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuSeparatorProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
3327
+ declare const Shortcut: {
3328
+ ({ className, ...props }: HTMLAttributes<HTMLSpanElement>): react.JSX.Element;
3329
+ displayName: string;
3330
+ };
3331
+ declare const SubTrigger: react.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuSubTriggerProps & react.RefAttributes<HTMLDivElement>, "ref"> & {
3332
+ inset?: boolean;
3333
+ } & react.RefAttributes<HTMLDivElement>>;
3334
+ declare const SubContent: react.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuSubContentProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
3335
+ type DropdownMenuRoot = typeof DropdownMenuPrimitive.Root & {
3336
+ Trigger: typeof Trigger;
3337
+ Portal: typeof Portal;
3338
+ Content: typeof Content;
3339
+ Item: typeof Item;
3340
+ CheckboxItem: typeof CheckboxItem;
3341
+ RadioItem: typeof RadioItem;
3342
+ Label: typeof Label;
3343
+ Separator: typeof Separator;
3344
+ Shortcut: typeof Shortcut;
3345
+ Group: typeof Group;
3346
+ Sub: typeof Sub;
3347
+ SubTrigger: typeof SubTrigger;
3348
+ SubContent: typeof SubContent;
3349
+ RadioGroup: typeof RadioGroup;
3350
+ };
3351
+ declare const DropdownMenu: DropdownMenuRoot;
3352
+
3353
+ /**
3354
+ * ActionBar — page-top action strip primitive.
3355
+ *
3356
+ * A horizontal flexbox row with three optional slots:
3357
+ * - Search input (flex-1, grows to fill)
3358
+ * - Filter icon button (next to search)
3359
+ * - Primary action button (right-aligned)
3360
+ *
3361
+ * Returns `null` when no props are provided — don't render an empty
3362
+ * bar. Used standalone or composed inside `<PageShell>` (Brief #5).
3363
+ *
3364
+ * @example
3365
+ * <ActionBar
3366
+ * search={{ placeholder: "Search projects…", value: q, onChange: setQ }}
3367
+ * primaryAction={{ label: "New project", icon: Plus, onClick: openModal }}
3368
+ * />
3369
+ */
3370
+ interface ActionBarProps extends Omit<HTMLAttributes<HTMLDivElement>, "children"> {
3371
+ search?: {
3372
+ placeholder: string;
3373
+ value: string;
3374
+ onChange: (value: string) => void;
3375
+ };
3376
+ primaryAction?: {
3377
+ label: ReactNode;
3378
+ icon?: ElementType;
3379
+ onClick: () => void;
3380
+ loading?: boolean;
3381
+ };
3382
+ onFilterClick?: () => void;
3383
+ }
3384
+ declare const ActionBar: react.ForwardRefExoticComponent<ActionBarProps & react.RefAttributes<HTMLDivElement>>;
3385
+
3386
+ /**
3387
+ * PinInput — multi-slot OTP / code input primitive.
3388
+ *
3389
+ * Renders N separate boxes (default 6) that auto-advance focus on
3390
+ * input. Paste handling fills all slots from clipboard (whitespace
3391
+ * stripped). Arrow keys navigate; backspace clears current slot
3392
+ * then moves focus back when empty.
3393
+ *
3394
+ * Industry-standard pattern for email verification codes (Apple,
3395
+ * Stripe, Clerk, Auth0, GitHub two-factor).
3396
+ *
3397
+ * @example
3398
+ * <PinInput
3399
+ * length={6}
3400
+ * value={code}
3401
+ * onChange={setCode}
3402
+ * onComplete={(v) => verify(v)}
3403
+ * inputMode="numeric"
3404
+ * aria-label="Verification code"
3405
+ * />
3406
+ *
3407
+ * Note: value is treated as controlled. If you pass a complete value
3408
+ * on mount, onComplete will NOT fire — onComplete fires only on
3409
+ * transitions from incomplete → complete.
3410
+ */
3411
+ interface PinInputProps extends Omit<HTMLAttributes<HTMLDivElement>, "onChange" | "inputMode"> {
3412
+ length?: number;
3413
+ value?: string;
3414
+ onChange?: (value: string) => void;
3415
+ onComplete?: (value: string) => void;
3416
+ inputMode?: "numeric" | "alphanumeric";
3417
+ size?: "sm" | "md" | "lg";
3418
+ disabled?: boolean;
3419
+ error?: boolean;
3420
+ "aria-label": string;
3421
+ autoFocus?: boolean;
3422
+ mask?: boolean;
3423
+ }
3424
+ declare const PinInput: react.ForwardRefExoticComponent<PinInputProps & react.RefAttributes<HTMLDivElement>>;
3425
+
3426
+ /**
3427
+ * DataTable — generic, sortable, expandable composite over `<Table>`.
3428
+ *
3429
+ * Adds operator-grade entity-list patterns on top of the plain Table
3430
+ * primitive: sortable headers, sticky header, expandable rows
3431
+ * (multi-row by default), row action menus (Dropdown), client-side
3432
+ * pagination, loading skeleton rows, empty state. Both sort and
3433
+ * pagination support controlled OR uncontrolled mode (consumer
3434
+ * passes onSortChange / onPageChange to take over state).
3435
+ *
3436
+ * @example
3437
+ * <DataTable
3438
+ * columns={[
3439
+ * { key: "name", label: "Name", sortable: true },
3440
+ * { key: "status", label: "Status" },
3441
+ * ]}
3442
+ * data={domains}
3443
+ * rowKey={(d) => d.id}
3444
+ * expandable={(d) => d.status === "pending" ? <DnsRecords domain={d} /> : null}
3445
+ * rowActions={(d) => (
3446
+ * <>
3447
+ * <DropdownMenu.Item onSelect={() => editDomain(d)}>Edit</DropdownMenu.Item>
3448
+ * <DropdownMenu.Item onSelect={() => deleteDomain(d)}>Delete</DropdownMenu.Item>
3449
+ * </>
3450
+ * )}
3451
+ * />
3452
+ */
3453
+ interface DataTableColumn<T> {
3454
+ key: string;
3455
+ label: ReactNode;
3456
+ align?: "left" | "center" | "right";
3457
+ sortable?: boolean;
3458
+ width?: string;
3459
+ render?: (row: T) => ReactNode;
3460
+ className?: string;
3461
+ }
3462
+ interface DataTableSort {
3463
+ key: string;
3464
+ direction: "asc" | "desc";
3465
+ }
3466
+ interface DataTableProps<T> {
3467
+ data: T[];
3468
+ columns: DataTableColumn<T>[];
3469
+ rowKey: (row: T) => string;
3470
+ stickyHeader?: boolean;
3471
+ expandable?: (row: T) => ReactNode | null;
3472
+ expandMode?: "single" | "multiple";
3473
+ rowActions?: (row: T) => ReactNode;
3474
+ pagination?: {
3475
+ pageSize: number;
3476
+ controlledPage?: number;
3477
+ onPageChange?: (page: number) => void;
3478
+ } | null;
3479
+ defaultSort?: DataTableSort;
3480
+ sort?: DataTableSort | null;
3481
+ onSortChange?: (sort: DataTableSort | null) => void;
3482
+ loading?: boolean;
3483
+ emptyState?: ReactNode;
3484
+ className?: string;
3485
+ }
3486
+ declare function DataTable<T>(props: DataTableProps<T>): ReactNode;
3487
+
3488
+ /**
3489
+ * PageShell — page-level scaffold composite.
3490
+ *
3491
+ * Renders title + optional description + optional ActionBar, then
3492
+ * one of four mutually-exclusive content states:
3493
+ * 1. loading (highest precedence)
3494
+ * 2. error
3495
+ * 3. empty
3496
+ * 4. children (default)
3497
+ *
3498
+ * Scope-narrowed per Brief #5 D3: PageShell does NOT manage
3499
+ * `document.title`. Use the optional `onTitleChange` callback to
3500
+ * wire your own hook (e.g. useSetPageTitle, react-helmet,
3501
+ * next/head).
3502
+ *
3503
+ * @example
3504
+ * <PageShell
3505
+ * title="Domains"
3506
+ * description="Custom domains and DNS verification."
3507
+ * search={{ placeholder: "Search…", value: q, onChange: setQ }}
3508
+ * primaryAction={{ label: "Add domain", icon: Plus, onClick: openModal }}
3509
+ * loading={isLoading}
3510
+ * error={error ? { message: error.message, onRetry: refetch } : undefined}
3511
+ * empty={data?.length === 0 ? { title: "No domains yet" } : undefined}
3512
+ * >
3513
+ * <DataTable columns={…} data={data} />
3514
+ * </PageShell>
3515
+ */
3516
+ interface PageShellProps {
3517
+ title: string;
3518
+ description?: ReactNode;
3519
+ /** Optional callback invoked when `title` changes — wire to your own document.title hook. */
3520
+ onTitleChange?: (title: string) => void;
3521
+ primaryAction?: {
3522
+ label: ReactNode;
3523
+ icon?: ElementType;
3524
+ onClick: () => void;
3525
+ loading?: boolean;
3526
+ };
3527
+ search?: {
3528
+ placeholder: string;
3529
+ value: string;
3530
+ onChange: (v: string) => void;
3531
+ };
3532
+ onFilterClick?: () => void;
3533
+ loading?: boolean;
3534
+ /** Custom loading UI. Defaults to a centered spinner card. */
3535
+ loadingNode?: ReactNode;
3536
+ error?: {
3537
+ message: string;
3538
+ onRetry?: () => void;
3539
+ docsHref?: string;
3540
+ };
3541
+ empty?: {
3542
+ icon?: ElementType;
3543
+ title: string;
3544
+ description?: ReactNode;
3545
+ action?: {
3546
+ label: string;
3547
+ onClick: () => void;
3548
+ };
3549
+ };
3550
+ children?: ReactNode;
3551
+ className?: string;
3552
+ }
3553
+ declare const PageShell: react.ForwardRefExoticComponent<PageShellProps & react.RefAttributes<HTMLElement>>;
3554
+
3555
+ interface ProgressChecklistProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> {
3556
+ title?: ReactNode;
3557
+ steps: TaskStep[];
3558
+ /**
3559
+ * If true, shows percentage bar for running steps with `progress`.
3560
+ */
3561
+ showProgressBars?: boolean;
3562
+ }
3563
+ /**
3564
+ * ProgressChecklist — right-inspector checklist.
3565
+ *
3566
+ * Visual: vertical list of steps with status dot, label, optional progress bar.
3567
+ * Matches WIREMOCKS §3 / §4 ("Progresso") with checkmarks and pulse on running.
3568
+ */
3569
+ declare const ProgressChecklist: react.ForwardRefExoticComponent<ProgressChecklistProps & react.RefAttributes<HTMLDivElement>>;
3570
+
3571
+ interface FolderEntry {
3572
+ id: string;
3573
+ name: string;
3574
+ kind: "folder" | "file";
3575
+ /**
3576
+ * If true, the entry is expanded (icons + nested children).
3577
+ * Pure visual flag; toggling is the caller's job.
3578
+ */
3579
+ open?: boolean;
3580
+ /**
3581
+ * Optional nested entries when this is a folder.
3582
+ */
3583
+ children?: FolderEntry[];
3584
+ /** Optional adornment after the name (badge, modified indicator). */
3585
+ trailing?: ReactNode;
3586
+ /** Override the icon. */
3587
+ icon?: IconComponent;
3588
+ }
3589
+ interface FolderContextCardProps extends Omit<HTMLAttributes<HTMLElement>, "title"> {
3590
+ title?: ReactNode;
3591
+ /**
3592
+ * Root entries shown directly in the card.
3593
+ */
3594
+ entries: FolderEntry[];
3595
+ /**
3596
+ * Fires when an entry row is clicked.
3597
+ */
3598
+ onEntryClick?: (id: string) => void;
3599
+ }
3600
+ /**
3601
+ * FolderContextCard — file/folder tree fragment for the right inspector.
3602
+ *
3603
+ * Visual: 1-level tree with chevron indicating expanded state. Renders nested
3604
+ * children recursively, but does not manage open state — caller controls
3605
+ * `entry.open` and reacts to `onEntryClick`.
3606
+ */
3607
+ declare const FolderContextCard: react.ForwardRefExoticComponent<FolderContextCardProps & react.RefAttributes<HTMLElement>>;
3608
+
3609
+ interface ContextCardProps extends Omit<HTMLAttributes<HTMLElement>, "title"> {
3610
+ title?: ReactNode;
3611
+ description?: ReactNode;
3612
+ /** Optional illustration slot (rendered above title). */
3613
+ illustration?: ReactNode;
3614
+ /** Icon for the title row — used when illustration is omitted. */
3615
+ icon?: IconComponent;
3616
+ }
3617
+ /**
3618
+ * ContextCard — generic "informational" card for the right inspector.
3619
+ *
3620
+ * Used as the "Contexto" card on Files screens: illustration / icon, title,
3621
+ * short description. Inert by design — no actions.
3622
+ */
3623
+ declare const ContextCard: react.ForwardRefExoticComponent<ContextCardProps & react.RefAttributes<HTMLElement>>;
3624
+
3625
+ interface CreatedFile {
3626
+ id: string;
3627
+ name: string;
3628
+ /** Optional size for display, e.g. "42 KB". */
3629
+ size?: string;
3630
+ /** Icon override. */
3631
+ icon?: IconComponent;
3632
+ /** Optional destination metadata (e.g. "Google Drive · /Reports"). */
3633
+ destination?: ReactNode;
3634
+ /** Optional URL to open the file. */
3635
+ href?: string;
3636
+ }
3637
+ interface CreatedFilesCardProps extends Omit<HTMLAttributes<HTMLElement>, "title"> {
3638
+ title?: ReactNode;
3639
+ files: CreatedFile[];
3640
+ /**
3641
+ * Optional CTA shown at the bottom (e.g. "Move to Google Drive").
3642
+ */
3643
+ cta?: ReactNode;
3644
+ }
3645
+ /**
3646
+ * CreatedFilesCard — surfaces files produced by a completed task.
3647
+ *
3648
+ * From WIREMOCKS §2: each file is a card-like row with icon + name + destination.
3649
+ * Used as social proof of delivery in Task Completed views.
3650
+ */
3651
+ declare const CreatedFilesCard: react.ForwardRefExoticComponent<CreatedFilesCardProps & react.RefAttributes<HTMLElement>>;
3652
+
3653
+ interface ArtifactPreviewProps extends Omit<HTMLAttributes<HTMLElement>, "title"> {
3654
+ title: ReactNode;
3655
+ /** Optional source/destination label (e.g. "Google Drive", "Local · ~/reports"). */
3656
+ source?: ReactNode;
3657
+ /**
3658
+ * Tabs at the bottom of the artifact (e.g. "Expense Report | Currency Summary").
3659
+ * Caller controls the active state externally.
3660
+ */
3661
+ tabs?: ReactNode;
3662
+ /** Top toolbar actions. Defaults to refresh + maximize + close. */
3663
+ toolbar?: ReactNode;
3664
+ onMaximize?: () => void;
3665
+ onRefresh?: () => void;
3666
+ onClose?: () => void;
3667
+ }
3668
+ /**
3669
+ * ArtifactPreview — shell for previewing a generated artifact (XLSX, PDF, image…).
3670
+ *
3671
+ * Renders a toolbar + content slot + optional bottom tabs. The actual preview
3672
+ * (spreadsheet, PDF embed, image) is the caller's `children`, so this stays
3673
+ * dependency-free.
3674
+ */
3675
+ declare const ArtifactPreview: react.ForwardRefExoticComponent<ArtifactPreviewProps & react.RefAttributes<HTMLElement>>;
3676
+
3677
+ interface RailStep {
3678
+ id: string | number;
3679
+ label?: ReactNode;
3680
+ /**
3681
+ * Visual state: "complete", "current", "pending".
3682
+ */
3683
+ state?: "complete" | "current" | "pending";
3684
+ }
3685
+ interface StepsRailProps extends Omit<HTMLAttributes<HTMLElement>, "title"> {
3686
+ steps: RailStep[];
3687
+ /**
3688
+ * Optional label rendered at the top of the rail (e.g. "STEPS").
3689
+ */
3690
+ title?: ReactNode;
3691
+ }
3692
+ /**
3693
+ * StepsRail — vertical numbered rail with connecting line.
3694
+ *
3695
+ * Mirrors the file-organisation wiremock right rail: 5 numbered dots, current
3696
+ * highlighted, line connecting them.
3697
+ */
3698
+ declare const StepsRail: react.ForwardRefExoticComponent<StepsRailProps & react.RefAttributes<HTMLElement>>;
3699
+
3700
+ interface RecentFolder {
3701
+ id: string;
3702
+ name: ReactNode;
3703
+ path: string;
3704
+ /** When true, the row is highlighted as selected. */
3705
+ active?: boolean;
3706
+ }
3707
+ interface RecentFoldersListProps extends Omit<HTMLAttributes<HTMLDivElement>, "title" | "onSelect"> {
3708
+ title?: ReactNode;
3709
+ folders: RecentFolder[];
3710
+ onSelect?: (id: string) => void;
3711
+ }
3712
+ /**
3713
+ * RecentFoldersList — recently-used folders for the Files picker.
3714
+ *
3715
+ * Visual: a stack of rows with folder icon + name + path (smaller, muted),
3716
+ * active row highlighted with violet bg.
3717
+ */
3718
+ declare const RecentFoldersList: react.ForwardRefExoticComponent<RecentFoldersListProps & react.RefAttributes<HTMLDivElement>>;
3719
+
3720
+ type DiffLineKind = "added" | "removed" | "unchanged" | "meta";
3721
+ interface DiffLine {
3722
+ kind: DiffLineKind;
3723
+ /** Original line number (left side); undefined for added lines. */
3724
+ oldNumber?: number;
3725
+ /** New line number (right side); undefined for removed lines. */
3726
+ newNumber?: number;
3727
+ content: string;
3728
+ }
3729
+ interface DiffHunk {
3730
+ id: string;
3731
+ /**
3732
+ * Optional header (e.g. "@@ -42,7 +42,12 @@"). Caller usually formats this.
3733
+ */
3734
+ header?: string;
3735
+ lines: DiffLine[];
3736
+ /**
3737
+ * If true, the hunk is rendered as a collapsed "N unmodified lines" placeholder.
3738
+ */
3739
+ collapsed?: boolean;
3740
+ }
3741
+ interface DiffViewerProps extends HTMLAttributes<HTMLDivElement> {
3742
+ /** Path of the file being diffed. */
3743
+ path: string;
3744
+ /** Diff stats summary. */
3745
+ stats?: {
3746
+ added: number;
3747
+ removed: number;
3748
+ };
3749
+ hunks: DiffHunk[];
3750
+ }
3751
+ /**
3752
+ * DiffViewer — unified diff rendering, no external dep.
3753
+ *
3754
+ * Visual: two gutter columns (old/new line numbers) + sign + monospaced content.
3755
+ * Added/removed rows tinted in success/destructive. Collapsed hunks render as
3756
+ * a single muted row "N unmodified lines".
3757
+ *
3758
+ * For syntax highlighting, the consumer can render `content` via their own
3759
+ * highlighter and pass `unchanged` lines with already-highlighted strings (not
3760
+ * common; usually plain text is enough for the brutalist console aesthetic).
3761
+ */
3762
+ declare const DiffViewer: react.ForwardRefExoticComponent<DiffViewerProps & react.RefAttributes<HTMLDivElement>>;
3763
+
3764
+ interface TerminalLine {
3765
+ id: string;
3766
+ /**
3767
+ * Visual kind: command (prompted), stdout, stderr, ok (success), prompt (active line).
3768
+ */
3769
+ kind?: "command" | "stdout" | "stderr" | "ok" | "prompt";
3770
+ content: ReactNode;
3771
+ }
3772
+ interface TerminalPanelProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> {
3773
+ title?: ReactNode;
3774
+ lines: TerminalLine[];
3775
+ /**
3776
+ * Optional prompt prefix for commands, defaults to "$".
3777
+ */
3778
+ promptPrefix?: string;
3779
+ /**
3780
+ * Live-region politeness for screen readers. Use `"polite"` when streaming
3781
+ * fresh output so assistive tech announces new lines without interrupting.
3782
+ * Default `"off"` for static / historical views.
3783
+ */
3784
+ live?: "off" | "polite";
3785
+ }
3786
+ /**
3787
+ * TerminalPanel — minimal terminal output viewer.
3788
+ *
3789
+ * Visual: dark card with mono font, "$ " prefix on command lines, color-coded
3790
+ * stdout/stderr/success. No interactivity (read-only) — pair with your own
3791
+ * pty/xterm for live shells if needed.
3792
+ */
3793
+ declare const TerminalPanel: react.ForwardRefExoticComponent<TerminalPanelProps & react.RefAttributes<HTMLDivElement>>;
3794
+
3795
+ type TaskSource = "agent" | "bash" | "tool";
3796
+ type RunningTaskStatus = "running" | "completed" | "failed";
3797
+ interface RunningTaskItem {
3798
+ id: string;
3799
+ label: ReactNode;
3800
+ source: TaskSource;
3801
+ status: RunningTaskStatus;
3802
+ }
3803
+ interface RunningTasksPanelProps extends HTMLAttributes<HTMLElement> {
3804
+ tasks: RunningTaskItem[];
3805
+ }
3806
+ /**
3807
+ * RunningTasksPanel — split list of Running vs Completed tasks.
3808
+ *
3809
+ * Used in the Code workspace right rail to give operational visibility into
3810
+ * what the agent is executing (foreground/background) vs what already finished.
3811
+ */
3812
+ declare const RunningTasksPanel: react.ForwardRefExoticComponent<RunningTasksPanelProps & react.RefAttributes<HTMLElement>>;
3813
+
3814
+ interface BrowserControlsProps extends HTMLAttributes<HTMLDivElement> {
3815
+ url: string;
3816
+ onUrlChange?: (next: string) => void;
3817
+ onBack?: () => void;
3818
+ onForward?: () => void;
3819
+ onReload?: () => void;
3820
+ /**
3821
+ * Disable URL editing (some previews are read-only).
3822
+ */
3823
+ readOnlyUrl?: boolean;
3824
+ }
3825
+ /**
3826
+ * BrowserControls — back/forward/reload + URL bar.
3827
+ *
3828
+ * Used as the top of PreviewPanel in the Code workspace.
3829
+ */
3830
+ declare const BrowserControls: react.ForwardRefExoticComponent<BrowserControlsProps & react.RefAttributes<HTMLDivElement>>;
3831
+
3832
+ type LogLevel = "info" | "warn" | "error" | "success" | "debug";
3833
+ interface LogLine {
3834
+ id: string;
3835
+ timestamp: string;
3836
+ level: LogLevel;
3837
+ message: string;
3838
+ source?: string;
3839
+ }
3840
+ interface BuildLogStreamProps extends HTMLAttributes<HTMLDivElement> {
3841
+ lines: LogLine[];
3842
+ /**
3843
+ * If true, shows level filter chips above the stream.
3844
+ */
3845
+ filterable?: boolean;
3846
+ /**
3847
+ * Controlled filter — which levels are visible. Empty Set = show all.
3848
+ *
3849
+ * Pick one mode: either always pass `visibleLevels` + `onVisibleLevelsChange`
3850
+ * (controlled), or never (uncontrolled). Mixing the two between renders is
3851
+ * not supported and may produce surprising state.
3852
+ */
3853
+ visibleLevels?: Set<LogLevel>;
3854
+ onVisibleLevelsChange?: (levels: Set<LogLevel>) => void;
3855
+ /**
3856
+ * Height of the scrollable region.
3857
+ */
3858
+ height?: string | number;
3859
+ /**
3860
+ * Maximum number of lines rendered. When exceeded, only the tail is shown
3861
+ * and a banner indicates truncation. Defaults to 2000 — set higher with
3862
+ * caution; React reconciliation cost scales linearly.
3863
+ */
3864
+ maxLines?: number;
3865
+ /**
3866
+ * Screen-reader live-region politeness for newly appended lines. Defaults
3867
+ * to `"off"` because build-log streams can be high-volume; opt into
3868
+ * `"polite"` only when running the build in the foreground.
3869
+ */
3870
+ live?: "off" | "polite";
3871
+ }
3872
+ /**
3873
+ * BuildLogStream — terminal-like log viewer with timestamps + level coloring.
3874
+ *
3875
+ * Used in Code workspace and PaaS deployment views. Geist Mono throughout.
3876
+ * Lines fade in via animate-fade-in-up on mount; new lines (when prepended/appended)
3877
+ * are not animated to avoid feedback noise (consumer's responsibility to render
3878
+ * incrementally if needed).
3879
+ */
3880
+ declare const BuildLogStream: react.ForwardRefExoticComponent<BuildLogStreamProps & react.RefAttributes<HTMLDivElement>>;
3881
+
3882
+ interface Metric {
3883
+ /**
3884
+ * Short label, e.g. "Requests/s", "p95 latency", "Error rate".
3885
+ */
3886
+ label: string;
3887
+ /**
3888
+ * Pre-formatted value string, e.g. "1.2k", "182ms", "0.03%".
3889
+ * Consumer formats; the component does not parse.
3890
+ */
3891
+ value: string;
3892
+ /**
3893
+ * Optional unit suffix appended after value with .9 opacity.
3894
+ */
3895
+ unit?: string;
3896
+ /**
3897
+ * Optional change vs comparison period, e.g. "+12%", "-4ms", "+0.01pp".
3898
+ */
3899
+ delta?: string;
3900
+ /**
3901
+ * If true, delta is "good" (success color); if false, "bad" (destructive).
3902
+ * If omitted, delta is rendered in muted (neutral).
3903
+ *
3904
+ * Caller decides semantics — "more requests" is good but "more errors" is bad.
3905
+ */
3906
+ deltaGood?: boolean;
3907
+ /**
3908
+ * Optional sparkline data, 0..1 normalized. Consumer is responsible for normalization.
3909
+ */
3910
+ sparkline?: number[];
3911
+ /**
3912
+ * Optional onClick to drill into the metric.
3913
+ */
3914
+ onClick?: () => void;
3915
+ /**
3916
+ * Optional override for the clickable tile's accessible name. When the
3917
+ * tile is interactive (`onClick` set), defaults to `View <label> details`.
3918
+ * Has no effect when `onClick` is absent (tile is rendered as a non-link
3919
+ * `<div>` with no button semantics). T4.3.
3920
+ */
3921
+ actionLabel?: string;
3922
+ }
3923
+ interface MetricsPanelProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> {
3924
+ title?: ReactNode;
3925
+ description?: ReactNode;
3926
+ metrics: Metric[];
3927
+ /**
3928
+ * Grid columns. Defaults to auto-fit ~180px min.
3929
+ */
3930
+ columns?: number;
3931
+ }
3932
+ /**
3933
+ * MetricsPanel — grid of metric tiles for observability dashboards.
3934
+ *
3935
+ * Visual: each tile is a soft surface with a big value (font-display),
3936
+ * label uppercase muted, optional delta with arrow icon + tone color,
3937
+ * optional CSS-only sparkline drawn as flexed bars.
3938
+ *
3939
+ * No external chart lib — keeps the registry copy-pasteable.
3940
+ */
3941
+ declare const MetricsPanel: react.ForwardRefExoticComponent<MetricsPanelProps & react.RefAttributes<HTMLDivElement>>;
3942
+
3943
+ interface SocialProvider {
3944
+ id: string;
3945
+ label: ReactNode;
3946
+ /** Icon component (e.g. brand-specific SVG). */
3947
+ icon: IconComponent;
3948
+ }
3949
+ interface SocialAuthRowProps extends Omit<HTMLAttributes<HTMLDivElement>, "onSelect"> {
3950
+ providers: SocialProvider[];
3951
+ onSelect?: (id: string) => void;
3952
+ /**
3953
+ * Stack vertically instead of horizontally (single-column flow).
3954
+ */
3955
+ vertical?: boolean;
3956
+ }
3957
+ /**
3958
+ * SocialAuthRow — row of OAuth provider buttons.
3959
+ *
3960
+ * Stateless; caller wires the redirect on `onSelect`. Buttons share Theo button
3961
+ * styling but with provider icon prominently on the left.
3962
+ */
3963
+ declare const SocialAuthRow: react.ForwardRefExoticComponent<SocialAuthRowProps & react.RefAttributes<HTMLDivElement>>;
3964
+
3965
+ interface LoginSplitProps extends HTMLAttributes<HTMLDivElement> {
3966
+ /** Left pane content — form, brand, etc. */
3967
+ left: ReactNode;
3968
+ /** Right pane content — illustration, marketing, social proof. */
3969
+ right: ReactNode;
3970
+ /**
3971
+ * Optional footer rendered below both panes.
3972
+ */
3973
+ footer?: ReactNode;
3974
+ /**
3975
+ * Reverse the split (form on the right). Default = form left.
3976
+ */
3977
+ reverse?: boolean;
3978
+ }
3979
+ /**
3980
+ * LoginSplit — 50/50 split layout shell.
3981
+ *
3982
+ * Used for the auth flow. Two slots (`left`, `right`); the right pane has a
3983
+ * subtle violet wash so the illustration sits inside Theo identity. Mobile
3984
+ * collapses to single column.
3985
+ */
3986
+ declare const LoginSplit: react.ForwardRefExoticComponent<LoginSplitProps & react.RefAttributes<HTMLDivElement>>;
3987
+
3988
+ interface SkillsListProps extends Omit<HTMLAttributes<HTMLDivElement>, "title" | "onToggle"> {
3989
+ skills: Skill[];
3990
+ title?: ReactNode;
3991
+ /** If true, shows a search input above the grid. */
3992
+ searchable?: boolean;
3993
+ onToggle?: (id: string, next: SkillState) => void;
3994
+ }
3995
+ /**
3996
+ * SkillsList — grid of SkillCards with optional search + source filter chips.
3997
+ * Pairs with claw-code's `claw skills` inventory but visual.
3998
+ */
3999
+ declare const SkillsList: react.ForwardRefExoticComponent<SkillsListProps & react.RefAttributes<HTMLDivElement>>;
4000
+
4001
+ /**
4002
+ * SkillEditor — form for creating or editing a Skill.
4003
+ */
4004
+ type SkillDraft = Omit<Skill, "id"> & {
4005
+ id?: string;
4006
+ instructions?: string;
4007
+ };
4008
+ interface SkillEditorProps extends Omit<HTMLAttributes<HTMLFormElement>, "onSubmit" | "onChange"> {
4009
+ initial?: Partial<Skill> & {
4010
+ instructions?: string;
4011
+ };
4012
+ onSave: (draft: SkillDraft) => void;
4013
+ onCancel?: () => void;
4014
+ onDelete?: () => void;
4015
+ }
4016
+ declare function SkillEditor({ className, initial, onSave, onCancel, onDelete, ...formProps }: SkillEditorProps): react.JSX.Element;
4017
+
4018
+ /**
4019
+ * RuleEditor — form for creating or editing a Rule (behavior instruction
4020
+ * injected into the system prompt).
4021
+ */
4022
+ type RuleDraft = Omit<Rule, "id" | "updatedAt"> & {
4023
+ id?: string;
4024
+ tags?: string[];
4025
+ };
4026
+ interface RuleEditorProps extends Omit<HTMLAttributes<HTMLFormElement>, "onSubmit" | "onChange"> {
4027
+ initial?: Partial<Rule>;
4028
+ onSave: (draft: RuleDraft) => void;
4029
+ onCancel?: () => void;
4030
+ onDelete?: () => void;
4031
+ }
4032
+ declare function RuleEditor({ className, initial, onSave, onCancel, onDelete, ...formProps }: RuleEditorProps): react.JSX.Element;
4033
+
4034
+ interface CronJobsListProps extends Omit<HTMLAttributes<HTMLDivElement>, "title" | "onToggle"> {
4035
+ jobs: CronJob[];
4036
+ title?: ReactNode;
4037
+ onAdd?: () => void;
4038
+ onRunNow?: (id: string) => void;
4039
+ onToggle?: (id: string, enabled: boolean) => void;
4040
+ onRemove?: (id: string) => void;
4041
+ }
4042
+ /**
4043
+ * CronJobsList — grid of CronJobCards with a sticky "new job" action.
4044
+ */
4045
+ declare const CronJobsList: react.ForwardRefExoticComponent<CronJobsListProps & react.RefAttributes<HTMLDivElement>>;
4046
+
4047
+ interface MCPServerListProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> {
4048
+ servers: MCPServer[];
4049
+ title?: ReactNode;
4050
+ onAdd?: () => void;
4051
+ onRestart?: (id: string) => void;
4052
+ onDisconnect?: (id: string) => void;
4053
+ }
4054
+ /**
4055
+ * MCPServerList — grouped MCP server inventory with status filter chips.
4056
+ * Surfaces degraded/disconnected servers prominently so the user can act.
4057
+ */
4058
+ declare const MCPServerList: react.ForwardRefExoticComponent<MCPServerListProps & react.RefAttributes<HTMLDivElement>>;
4059
+
4060
+ /**
4061
+ * AgentEditor — form for creating or editing an Agent persona.
4062
+ */
4063
+ interface AgentDraft extends Omit<AgentProfileDescriptor, "id"> {
4064
+ id?: string;
4065
+ systemPrompt?: string;
4066
+ model?: string;
4067
+ allowedTools?: string[];
4068
+ skillIds?: string[];
4069
+ /** Modes this agent is visible in. Omit / empty = global (all modes). */
4070
+ modes?: Mode[];
4071
+ }
4072
+ interface AgentEditorProps extends Omit<HTMLAttributes<HTMLFormElement>, "onSubmit" | "onChange"> {
4073
+ initial?: Partial<AgentDraft>;
4074
+ models?: Array<{
4075
+ id: string;
4076
+ label: string;
4077
+ }>;
4078
+ skills?: Array<{
4079
+ id: string;
4080
+ label: string;
4081
+ }>;
4082
+ onSave: (draft: AgentDraft) => void;
4083
+ onCancel?: () => void;
4084
+ onDelete?: () => void;
4085
+ }
4086
+ declare function AgentEditor({ className, initial, models, skills, onSave, onCancel, onDelete, ...formProps }: AgentEditorProps): react.JSX.Element;
4087
+
4088
+ /**
4089
+ * ApprovalCard — inline pause-and-ask card for an agent stream.
4090
+ *
4091
+ * Used when the agent wants to perform an action that requires the user's
4092
+ * consent (run a destructive command, use a new tool, edit outside the
4093
+ * sandbox, etc.). Renders as a bordered card inside the conversation stream,
4094
+ * pauses the visual flow, and exposes Deny / Approve / Always-allow actions.
4095
+ */
4096
+ declare const cardVariants: (props?: ({
4097
+ severity?: "warning" | "destructive" | "info" | null | undefined;
4098
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
4099
+ type ApprovalSeverity = NonNullable<VariantProps<typeof cardVariants>["severity"]>;
4100
+ interface ApprovalCardProps extends Omit<HTMLAttributes<HTMLElement>, "title">, VariantProps<typeof cardVariants> {
4101
+ /** Short headline ("Run destructive command?"). */
4102
+ title: ReactNode;
4103
+ /** What is being requested (command, file path, tool name…). Renders monospace. */
4104
+ request: ReactNode;
4105
+ /** Optional explanation line under the request. */
4106
+ description?: ReactNode;
4107
+ /** Optional expandable details (e.g. full command, file diff). */
4108
+ details?: ReactNode;
4109
+ /** Pressing the primary "Approve" button. */
4110
+ onApprove?: () => void;
4111
+ /** Pressing "Deny". */
4112
+ onDeny?: () => void;
4113
+ /** Pressing "Always allow" — optional tertiary action. */
4114
+ onAlways?: () => void;
4115
+ /** Customise the icon shown in the corner. */
4116
+ icon?: IconComponent;
4117
+ }
4118
+ declare const ApprovalCard: react.ForwardRefExoticComponent<ApprovalCardProps & react.RefAttributes<HTMLElement>>;
4119
+
4120
+ type ComposerMode = "chat" | "code" | "infra";
4121
+ interface ChatComposerProps extends Omit<HTMLAttributes<HTMLFormElement>, "onSubmit"> {
4122
+ mode?: ComposerMode;
4123
+ value: string;
4124
+ onValueChange: (next: string) => void;
4125
+ onSubmit?: (value: string) => void;
4126
+ /**
4127
+ * If true, the composer is in "agent running" state — Send becomes a Stop button.
4128
+ */
4129
+ running?: boolean;
4130
+ onStop?: () => void;
4131
+ /**
4132
+ * Slot above the textarea — used for the folder selector in Infra mode.
4133
+ */
4134
+ contextSlot?: ReactNode;
4135
+ /**
4136
+ * Slot above the textarea for attachments / chips.
4137
+ */
4138
+ attachmentsSlot?: ReactNode;
4139
+ /**
4140
+ * Slot on the bottom-left of the action row (e.g. custom toggles).
4141
+ * Overrides the default attach button entirely when provided.
4142
+ */
4143
+ leadingActions?: ReactNode;
4144
+ /**
4145
+ * Slot on the bottom-right (e.g. model selector). Send/stop is appended after this.
4146
+ */
4147
+ trailingActions?: ReactNode;
4148
+ /**
4149
+ * Optional attach-file callback. If omitted (and `leadingActions` is also
4150
+ * omitted), no attach button is rendered. This avoids fake affordances per
4151
+ * Quality Gate §7.
4152
+ */
4153
+ onAttach?: () => void;
4154
+ /**
4155
+ * Optional voice-input callback. If omitted, no mic button is rendered.
4156
+ * Same rationale as `onAttach`.
4157
+ */
4158
+ onVoiceInput?: () => void;
4159
+ /**
4160
+ * Accessible label for the textarea. Falls back to a mode-aware default.
4161
+ */
4162
+ textareaLabel?: string;
4163
+ /**
4164
+ * Textarea placeholder. Defaults change by mode.
4165
+ */
4166
+ placeholder?: string;
4167
+ /**
4168
+ * Extra textarea props (rows, maxLength…).
4169
+ */
4170
+ textareaProps?: Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, "value" | "onChange">;
4171
+ }
4172
+ /**
4173
+ * ChatComposer — message input area, shared by Chat / Code / Infra modes.
4174
+ *
4175
+ * Visual:
4176
+ * - chat / infra → soft card with violet ring on focus, generous padding
4177
+ * - code → compact dense form with mono font, slash prefix hint
4178
+ *
4179
+ * Stateless: caller controls `value` + handles `onSubmit`. Submit fires on Enter
4180
+ * (without Shift). Shift+Enter inserts a newline.
4181
+ *
4182
+ * Optional affordances (mic, attach) are opt-in via `onVoiceInput` / `onAttach`
4183
+ * — Quality Gate §7 forbids rendering fake controls without behavior.
4184
+ */
4185
+ declare const ChatComposer: react.ForwardRefExoticComponent<ChatComposerProps & react.RefAttributes<HTMLFormElement>>;
4186
+
4187
+ /**
4188
+ * AgentComposer — ChatComposer + slash-command / @file / #memory triggers.
4189
+ *
4190
+ * Wraps ChatComposer and watches the value for three trigger characters:
4191
+ * `/` → slash commands (`/clear`, `/help`, …)
4192
+ * `@` → file references (`@src/components/Foo.tsx`)
4193
+ * `#` → memory entries (`#alignment-grid`)
4194
+ *
4195
+ * Detection is string-based — no textarea ref required. A trigger is active
4196
+ * iff the value ends with a token of the form `[\s|^]([/@#])[^\s]*` (i.e. a
4197
+ * trigger char preceded by start-of-string or whitespace, with no space
4198
+ * after).
4199
+ *
4200
+ * The consumer provides the candidate items per trigger. On selection the
4201
+ * trailing token is replaced with the chosen value plus a trailing space.
4202
+ */
4203
+ type ItemsProvider = (query: string) => MentionItem[];
4204
+ interface AgentComposerProps extends ComponentProps<typeof ChatComposer> {
4205
+ /** Items shown when `/` is the active trigger. */
4206
+ commands?: MentionItem[] | ItemsProvider;
4207
+ /** Items shown when `@` is the active trigger. */
4208
+ files?: MentionItem[] | ItemsProvider;
4209
+ /** Items shown when `#` is the active trigger. */
4210
+ memories?: MentionItem[] | ItemsProvider;
4211
+ /**
4212
+ * What text gets inserted when an item is picked. Defaults to
4213
+ * `${trigger}${item.label}` (assumes `label` is a string). Override to
4214
+ * insert a token different from the visible label (e.g. include path,
4215
+ * id, …).
4216
+ */
4217
+ resolveInsertText?: (item: MentionItem, trigger: MentionTrigger) => string;
4218
+ /** Optional slot for the empty-state copy per trigger. */
4219
+ emptyLabels?: Partial<Record<MentionTrigger, ReactNode>>;
4220
+ /** Outer wrapper className (the relative positioning anchor for the menu). */
4221
+ containerClassName?: string;
4222
+ }
4223
+ declare function AgentComposer({ value, onValueChange, commands, files, memories, resolveInsertText, emptyLabels, containerClassName, className, textareaProps, ...chatComposerProps }: AgentComposerProps): react.JSX.Element;
4224
+
4225
+ /**
4226
+ * AgentStream — the canonical conversation surface for a code agent.
4227
+ *
4228
+ * Interleaves chat messages (user + assistant), tool invocations, approval
4229
+ * gates, errors, and the live streaming indicator. Mirrors how Claude Code
4230
+ * presents work to the user: conversation-centric, tool calls embedded,
4231
+ * approvals pause the flow inline, errors surface where they happen.
4232
+ *
4233
+ * Items are rendered in array order. The consumer fully controls the data;
4234
+ * AgentStream is a pure presentational composite over its child primitives.
4235
+ */
4236
+ interface ToolCallStreamItem {
4237
+ kind: "tool-call";
4238
+ id: string;
4239
+ tool: ReactNode;
4240
+ icon?: IconComponent;
4241
+ target?: ReactNode;
4242
+ status: ToolCallStatus;
4243
+ output?: ReactNode;
4244
+ defaultExpanded?: boolean;
4245
+ timestamp?: ReactNode;
4246
+ }
4247
+ interface ApprovalStreamItem {
4248
+ kind: "approval";
4249
+ id: string;
4250
+ severity?: ApprovalSeverity;
4251
+ title: ReactNode;
4252
+ request: ReactNode;
4253
+ description?: ReactNode;
4254
+ details?: ReactNode;
4255
+ onApprove?: () => void;
4256
+ onDeny?: () => void;
4257
+ onAlways?: () => void;
4258
+ }
4259
+ interface ErrorStreamItem {
4260
+ kind: "error";
4261
+ id: string;
4262
+ errorKind?: AgentErrorKind;
4263
+ title: ReactNode;
4264
+ detail?: ReactNode;
4265
+ actions?: ReactNode;
4266
+ timestamp?: ReactNode;
4267
+ }
4268
+ interface StreamingStreamItem {
4269
+ kind: "streaming";
4270
+ id: string;
4271
+ model?: ReactNode;
4272
+ partial?: ReactNode;
4273
+ }
4274
+ interface MessageStreamItem {
4275
+ kind: "message";
4276
+ id: string;
4277
+ message: UIMessage;
4278
+ }
4279
+ interface CustomStreamItem {
4280
+ kind: "custom";
4281
+ id: string;
4282
+ /** Arbitrary node — escape hatch for inline diff cards, etc. */
4283
+ node: ReactNode;
4284
+ }
4285
+ type AgentStreamItem = MessageStreamItem | ToolCallStreamItem | ApprovalStreamItem | ErrorStreamItem | StreamingStreamItem | CustomStreamItem;
4286
+ interface AgentStreamProps extends HTMLAttributes<HTMLDivElement> {
4287
+ items: AgentStreamItem[];
4288
+ }
4289
+ declare const AgentStream: react.ForwardRefExoticComponent<AgentStreamProps & react.RefAttributes<HTMLDivElement>>;
4290
+
4291
+ interface AgentTimelineProps extends HTMLAttributes<HTMLOListElement> {
4292
+ events: AgentEvent$1[];
4293
+ /**
4294
+ * If true, events with `detail` are collapsible.
4295
+ */
4296
+ collapsible?: boolean;
4297
+ /**
4298
+ * Renders a vertical line connecting events. Default true.
4299
+ */
4300
+ showLine?: boolean;
4301
+ }
4302
+ /**
4303
+ * AgentTimeline — vertical list of agent events.
4304
+ *
4305
+ * Visual: optional thin border-left running through the column, with each
4306
+ * AgentEvent slightly indented from the line. Events animate in via fade-in-up
4307
+ * when first mounted.
4308
+ */
4309
+ declare const AgentTimeline: react.ForwardRefExoticComponent<AgentTimelineProps & react.RefAttributes<HTMLOListElement>>;
4310
+
4311
+ interface TaskHeaderProps extends Omit<HTMLAttributes<HTMLElement>, "title"> {
4312
+ title: ReactNode;
4313
+ status?: TaskStatus;
4314
+ /**
4315
+ * If provided, a chevron is shown next to the title and clicking it fires this callback.
4316
+ * Used as the "expand task metadata" affordance in the Infra shell.
4317
+ */
4318
+ onToggle?: () => void;
4319
+ /** Right-side actions (e.g. cancel task, close panel). */
4320
+ actions?: ReactNode;
4321
+ }
4322
+ /**
4323
+ * TaskHeader — title bar for a task pane.
4324
+ *
4325
+ * Visual: display-md title with chevron + optional status badge with pulse + actions slot.
4326
+ */
4327
+ declare const TaskHeader: react.ForwardRefExoticComponent<TaskHeaderProps & react.RefAttributes<HTMLElement>>;
4328
+
4329
+ interface PermissionModalLabels {
4330
+ /** "Cancel" button. */
4331
+ cancel: ReactNode;
4332
+ /** "Always allow" tertiary button. */
4333
+ always: ReactNode;
4334
+ /** "Allow once" primary button. */
4335
+ allow: ReactNode;
4336
+ /** Inline label rendered before the operation list inside the body card. */
4337
+ requestedOps: ReactNode;
4338
+ }
4339
+ interface PermissionModalProps {
4340
+ open: boolean;
4341
+ onOpenChange: (open: boolean) => void;
4342
+ request: PermissionRequest;
4343
+ /**
4344
+ * Fires when the user picks a decision. The modal does NOT auto-close;
4345
+ * caller decides whether the decision should dismiss the modal.
4346
+ */
4347
+ onDecide: (decision: PermissionDecision) => void;
4348
+ /** Override the modal title. Defaults to "Allow Theo to {ops} files in {path}?". */
4349
+ title?: ReactNode;
4350
+ /** Override the modal description (body lead text). */
4351
+ description?: ReactNode;
4352
+ /** Override the verb used for each operation in the default copy. */
4353
+ operationLabels?: Partial<Record<PermissionOperation, string>>;
4354
+ /** Override button text + inline labels. Useful for i18n. */
4355
+ labels?: Partial<PermissionModalLabels>;
4356
+ }
4357
+ /**
4358
+ * PermissionModal — local-files access prompt built on Dialog.
4359
+ *
4360
+ * Three actions: Cancel (denied), Always allow, Allow once. Per WIREMOCKS §5,
4361
+ * the path is shown in the title (not hidden in body) and destructive
4362
+ * operations are listed inline.
4363
+ *
4364
+ * All visible text can be overridden via `title`, `description`,
4365
+ * `operationLabels`, and `labels`. Defaults are English; pass overrides for
4366
+ * other locales.
4367
+ */
4368
+ declare function PermissionModal({ open, onOpenChange, request, onDecide, title, description, operationLabels, labels, }: PermissionModalProps): react.JSX.Element;
4369
+
4370
+ interface PreviewPanelProps extends Omit<HTMLAttributes<HTMLElement>, "content"> {
4371
+ url: string;
4372
+ onUrlChange?: (next: string) => void;
4373
+ onBack?: () => void;
4374
+ onForward?: () => void;
4375
+ onReload?: () => void;
4376
+ /**
4377
+ * Region rendered as the preview body. Typically an <iframe>.
4378
+ */
4379
+ content: ReactNode;
4380
+ /**
4381
+ * Optional logs section rendered below the preview (e.g. dev server output).
4382
+ */
4383
+ logsSlot?: ReactNode;
4384
+ }
4385
+ /**
4386
+ * PreviewPanel — browser preview with controls + integrated logs slot.
4387
+ *
4388
+ * The Code workspace shows live dev-server URL + HMR logs side-by-side; this
4389
+ * panel keeps both in a single card so the user doesn't switch contexts.
4390
+ */
4391
+ declare const PreviewPanel: react.ForwardRefExoticComponent<PreviewPanelProps & react.RefAttributes<HTMLElement>>;
4392
+
4393
+ type DeploymentStatus = "queued" | "building" | "deploying" | "live" | "failed" | "cancelled";
4394
+ interface Deployment {
4395
+ id: string;
4396
+ status: DeploymentStatus;
4397
+ environment: string;
4398
+ branch: string;
4399
+ commitSha: string;
4400
+ commitMessage: string;
4401
+ author?: {
4402
+ name: string;
4403
+ avatarUrl?: string;
4404
+ };
4405
+ duration?: string;
4406
+ timeAgo: string;
4407
+ }
4408
+ interface DeploymentRowProps extends HTMLAttributes<HTMLDivElement> {
4409
+ deployment: Deployment;
4410
+ actions?: ReactNode;
4411
+ }
4412
+ /**
4413
+ * DeploymentRow — one row in a deployment list (table-ish layout).
4414
+ *
4415
+ * Inspired by Vercel/Railway deployment lists. Composes Badge + Badge.Dot for status,
4416
+ * mono font for SHA/branch, muted-foreground for metadata.
4417
+ */
4418
+ declare const DeploymentRow: react.ForwardRefExoticComponent<DeploymentRowProps & react.RefAttributes<HTMLDivElement>>;
4419
+
4420
+ interface Project {
4421
+ id: string;
4422
+ name: string;
4423
+ description?: string;
4424
+ framework?: string;
4425
+ branch: string;
4426
+ commitSha: string;
4427
+ commitMessage?: string;
4428
+ status: DeploymentStatus;
4429
+ url?: string;
4430
+ region?: string;
4431
+ lastDeployedAt: string;
4432
+ }
4433
+ interface ProjectCardProps extends HTMLAttributes<HTMLAnchorElement | HTMLDivElement> {
4434
+ project: Project;
4435
+ href?: string;
4436
+ actions?: ReactNode;
4437
+ /**
4438
+ * Show the project description and commit message. Default true.
4439
+ */
4440
+ detailed?: boolean;
4441
+ }
4442
+ /**
4443
+ * ProjectCard — surface for a project in a project listing.
4444
+ *
4445
+ * Light hover lift (no shadow inflation), violet ring on focus,
4446
+ * status badge with optional pulse, framework + region in muted footer.
4447
+ */
4448
+ declare const ProjectCard: react.ForwardRefExoticComponent<ProjectCardProps & react.RefAttributes<HTMLElement>>;
4449
+
4450
+ type EnvScope = "production" | "staging" | "preview" | "all" | string;
4451
+ interface EnvVar {
4452
+ id: string;
4453
+ key: string;
4454
+ /**
4455
+ * Secret value. If `masked` is true, value is hidden by default.
4456
+ */
4457
+ value: string;
4458
+ masked?: boolean;
4459
+ scope?: EnvScope;
4460
+ /**
4461
+ * Read-only marker (e.g. system-managed vars like THEO_DEPLOY_ID).
4462
+ */
4463
+ readonly?: boolean;
4464
+ }
4465
+ interface EnvVarEditorProps extends HTMLAttributes<HTMLDivElement> {
4466
+ vars: EnvVar[];
4467
+ onAdd?: (entry: Omit<EnvVar, "id">) => void;
4468
+ onRemove?: (id: string) => void;
4469
+ /**
4470
+ * Available scope options for the add form. Defaults to a sensible PaaS set.
4471
+ */
4472
+ scopeOptions?: EnvScope[];
4473
+ }
4474
+ /**
4475
+ * EnvVarEditor — table-like editor for environment variables.
4476
+ *
4477
+ * Mono font on keys/values, mask toggle on secret values, scope badge,
4478
+ * remove + copy actions. Add form sits above the list.
4479
+ *
4480
+ * Stateless: caller controls the list and reacts to onAdd / onRemove.
4481
+ */
4482
+ declare const EnvVarEditor: react.ForwardRefExoticComponent<EnvVarEditorProps & react.RefAttributes<HTMLDivElement>>;
4483
+
4484
+ interface PreviewService {
4485
+ /** Service name e.g. "api", "web", "worker". */
4486
+ name: string;
4487
+ /** Live URL or null if not exposed (worker). */
4488
+ url?: string;
4489
+ status: DeploymentStatus;
4490
+ }
4491
+ interface PreviewEnv {
4492
+ id: string;
4493
+ prNumber: number;
4494
+ prTitle: string;
4495
+ branch: string;
4496
+ author?: {
4497
+ name: string;
4498
+ avatarUrl?: string;
4499
+ };
4500
+ services: PreviewService[];
4501
+ createdAt: string;
4502
+ }
4503
+ interface PreviewEnvCardProps extends HTMLAttributes<HTMLDivElement> {
4504
+ env: PreviewEnv;
4505
+ actions?: ReactNode;
4506
+ }
4507
+ /**
4508
+ * PreviewEnvCard — preview environment card surfacing all services from one PR.
4509
+ *
4510
+ * Theo's killer feature: full-stack preview environments. The card shows:
4511
+ * - PR number + title at the top
4512
+ * - branch + author in the metadata row
4513
+ * - one badge per service with its own status + URL
4514
+ * - bottom action row (Open, Promote, Delete)
4515
+ */
4516
+ declare const PreviewEnvCard: react.ForwardRefExoticComponent<PreviewEnvCardProps & react.RefAttributes<HTMLDivElement>>;
4517
+
4518
+ type DomainStatus = "verified" | "pending" | "invalid";
4519
+ interface Domain {
4520
+ id: string;
4521
+ hostname: string;
4522
+ status: DomainStatus;
4523
+ primary?: boolean;
4524
+ /**
4525
+ * TLS state. If true, certificate is provisioned & valid.
4526
+ */
4527
+ tls?: boolean;
4528
+ /**
4529
+ * DNS record the user must add to verify ownership.
4530
+ */
4531
+ verificationRecord?: {
4532
+ type: "TXT" | "CNAME" | "A";
4533
+ name: string;
4534
+ value: string;
4535
+ };
4536
+ }
4537
+ interface DomainConfigProps extends HTMLAttributes<HTMLDivElement> {
4538
+ domains: Domain[];
4539
+ onAdd?: (hostname: string) => void;
4540
+ onRemove?: (id: string) => void;
4541
+ onSetPrimary?: (id: string) => void;
4542
+ }
4543
+ /**
4544
+ * DomainConfig — manage custom domains for a project.
4545
+ *
4546
+ * Shows: hostname, status, TLS, primary flag, and verification DNS record when pending.
4547
+ * Common in every cloud dashboard (Vercel, Railway, Render).
4548
+ */
4549
+ declare const DomainConfig: react.ForwardRefExoticComponent<DomainConfigProps & react.RefAttributes<HTMLDivElement>>;
4550
+
4551
+ interface RollbackTarget {
4552
+ id: string;
4553
+ version: string;
4554
+ commitSha: string;
4555
+ commitMessage: string;
4556
+ deployedAt: string;
4557
+ isCurrent?: boolean;
4558
+ /**
4559
+ * Optional duration of the deploy (e.g. "24s") for context.
4560
+ */
4561
+ duration?: string;
4562
+ }
4563
+ interface RollbackUIProps extends HTMLAttributes<HTMLDivElement> {
4564
+ /**
4565
+ * Deployment history, newest first. The current deploy should have `isCurrent: true`.
4566
+ */
4567
+ history: RollbackTarget[];
4568
+ /**
4569
+ * Fires when user confirms rollback to a specific target.
4570
+ */
4571
+ onRollback?: (targetId: string) => void | Promise<void>;
4572
+ }
4573
+ /**
4574
+ * RollbackUI — instant rollback selector showing recent versions.
4575
+ *
4576
+ * The current deploy is marked, every other version offers a "Roll back" button.
4577
+ * On select, the row enters confirm state (Confirm / Cancel buttons inline) before
4578
+ * firing onRollback. This protects against accidental rollbacks while still being one click.
4579
+ */
4580
+ declare const RollbackUI: react.ForwardRefExoticComponent<RollbackUIProps & react.RefAttributes<HTMLDivElement>>;
4581
+
4582
+ interface CommandItem {
4583
+ id: string;
4584
+ label: ReactNode;
4585
+ /** Optional secondary line (path, hint, shortcut). */
4586
+ hint?: ReactNode;
4587
+ /** Optional group name. Items with the same group are visually grouped. */
4588
+ group?: string;
4589
+ /** Optional icon. */
4590
+ icon?: IconComponent;
4591
+ /** Optional searchable plain-text used by the cmdk ranker. Falls back to `label` when string. */
4592
+ searchable?: string;
4593
+ }
4594
+ interface CommandPaletteProps {
4595
+ open: boolean;
4596
+ onOpenChange: (open: boolean) => void;
4597
+ items: CommandItem[];
4598
+ onSelect: (id: string) => void;
4599
+ placeholder?: string;
4600
+ emptyMessage?: ReactNode;
4601
+ /**
4602
+ * Optional custom filter score (0 = no match, > 0 = match). Receives the
4603
+ * `value` (the item's searchable text) and the current `search` query.
4604
+ * Defaults to cmdk's built-in fuzzy ranker which prioritizes substring +
4605
+ * word-boundary + consecutive matches.
4606
+ */
4607
+ filter?: (value: string, search: string) => number;
4608
+ }
4609
+ /**
4610
+ * CommandPalette — Cmd+K-style global launcher with full keyboard navigation.
4611
+ *
4612
+ * Built on `cmdk` (the de-facto shadcn pattern) + Theo Dialog. Provides
4613
+ * out-of-the-box: ArrowUp/ArrowDown navigation, Enter selection, Escape close,
4614
+ * Home/End, active-item highlight via `data-selected`, and fuzzy ranking.
4615
+ *
4616
+ * Stateless: caller owns `open` / `onOpenChange` / `items`. Selecting an item
4617
+ * fires `onSelect(id)` and closes the dialog.
4618
+ */
4619
+ declare function CommandPalette({ open, onOpenChange, items, onSelect, placeholder, emptyMessage, filter, }: CommandPaletteProps): react.JSX.Element;
4620
+
4621
+ export { ALL_MODES, AccountMenu, type AccountMenuProps, ActionBar, type ActionBarProps, AgentComposer, type AgentDraft, AgentEditor, AgentErrorCard, type AgentErrorKind, AgentEvent, type AgentEvent$1 as AgentEventModel, type AgentEventStatus, type AgentEventType, AgentHandoff, AgentProfile, type AgentProfileDescriptor, AgentStartingState, AgentStream, type AgentStreamItem, AgentStreaming, AgentTimeline, Alert, type AlertIntent, type AlertProps, ApprovalCard, type ApprovalSeverity, ArtifactPreview, type Attachment, AttachmentChip, type AuditActorKind, type AuditEntry, AuditLogEntry, type AuditSeverity, AutoCompactNotice, Avatar, BadgeWithDot as Badge, type BadgeProps, BranchIndicator, type BranchIndicatorProps, BrowserControls, BuildLogStream, Button, type ButtonProps, type Capability, CapabilityIndicator, type CapabilityState, Card, type Channel, ChannelCard, type ChannelPlatform, type ChannelStatus, ChatComposer, ChatMessage, ChatMessageAction, type ChatMessageActionProps, ChatMessageActions, type ChatMessageActionsProps, ChatMessageBranch, ChatMessageBranchContent, type ChatMessageBranchContentProps, ChatMessageBranchNext, type ChatMessageBranchNextProps, ChatMessageBranchPage, type ChatMessageBranchPageProps, ChatMessageBranchPrevious, type ChatMessageBranchPreviousProps, type ChatMessageBranchProps, ChatMessageBranchSelector, type ChatMessageBranchSelectorProps, ChatMessageContent, type ChatMessageContentProps, type ChatMessageContentVariant, type ChatMessageProps, ChatMessageResponse, type ChatMessageResponseProps, ChatMessageRoot, type ChatMessageRootProps, ChatMessageToolbar, type ChatMessageToolbarProps, ChatThread, Checkbox, CodeBlock, type CodeBlockProps, type ColorScale, type CommandItem, CommandPalette, type ComposerMode, ConfirmDialog, type ConfirmDialogProps, ContextCard, ContextWindowBar, CopyButton, type CopyButtonProps, CostMeter, type CreatedFile, CreatedFilesCard, type CronJob, CronJobCard, type CronJobStatus, CronJobsList, type CustomContentUIPart, DangerZone, type DangerZoneActionProps, type DangerZoneProps, DataPart, type DataPartProps, type DataRenderer, type DataRendererMap, DataTable, type DataTableColumn, type DataTableProps, type DataTableSort, type DataUIPart, type DefineThemeInput, type Density, type DensityContextValue, type Deployment, DeploymentRow, type DeploymentStatus, Dialog, type DiffHunk, type DiffLine, type DiffLineKind, DiffViewer, type Domain, DomainConfig, type DomainStatus, DropdownMenu, EmptyState, type EnvScope, type EnvVar, EnvVarEditor, ExportChatDialog, type ExportChatDialogProps, type ExportFormat, FilePart, type FilePartProps, type FileUIPart, FolderContextCard, type FolderEntry, FolderSelector, FormField, type GatewayStatus, GatewayStatusIndicator, type GatewayStatusIndicatorProps, HOOK_EVENTS, type HandoffParty, HookConfig, type HookEntry, type HookEvent, type HookEventEntry, HookEventLog, type HookEventResult, Input, type InputProps, type IntentOption, IntentSelector, Label$1 as Label, type Lane, LaneBoard, type LaneCard, type LaneState, type LogLevel, type LogLine, LoginSplit, type MCPServer, MCPServerCard, MCPServerList, type MCPServerStatus, MODE_LABEL, MemoryEditor, type MemoryLayer, type MemoryScope, type MentionItem, MentionMenu, type MentionTrigger, type MessageRole, type Metric, MetricsPanel, type Mode, type ModelCapabilityFlag, ModelCard, type ModelInfo, type ModelOption, ModelSelector, PageShell, type PageShellProps, Pagination, type PaginationProps, type PartRendererMap, type PermissionDecision, type PermissionDecisionKind, PermissionMatrix, PermissionModal, type PermissionOperation, type PermissionRequest, type PermissionRule, PinInput, type PinInputProps, PlanBadge, type PlanBadgeProps, type PlanNode, type PlanNodeStatus, type PlanTier, type PreviewEnv, PreviewEnvCard, PreviewPanel, type PreviewService, Progress, ProgressChecklist, type ProgressProps, type Project, ProjectCard, type ProjectStatus, ProjectSwitcher, type ProviderMetadata, type QuickAction, QuickActionChips, RadioGroup$1 as RadioGroup, type RailStep, type ReasoningFileUIPart, ReasoningPart, type ReasoningPartProps, type ReasoningUIPart, type RecentFolder, RecentFoldersList, type RenderPartOptions, type RollbackTarget, RollbackUI, type Rule, RuleCard, RuleEditor, type RuleScope, type RuleState, RunStats, type RunStatus, RunStatusPill, type RunStatusPillProps, type RunningTaskItem, type RunningTaskStatus, RunningTasksPanel, ScrollArea, Select, SessionListItem, type SessionMode, type SessionRunStatus, type SessionStatus, type SessionSummary, SessionTimeline, Sheet, Sidebar, Skeleton, type Skill, SkillCard, SkillEditor, type SkillSource, type SkillState, SkillsList, SocialAuthRow, type SocialProvider, SourceDocumentPart, type SourceDocumentPartProps, type SourceDocumentUIPart, SourceUrlPart, type SourceUrlPartProps, type SourceUrlUIPart, type StabilityBundle, StabilityBundleViewer, type StabilityBundleViewerProps, type StabilitySeverity, StatTile, type StatTileProps, StatusDot, type StatusDotProps, type StatusKind, type StepStartUIPart, StepsRail, SubAgentDispatch, type SubAgentRun, type SubAgentState, Switch, SystemPromptEditor, Table, type TableCellProps, type TableHeaderCellProps, type TableProps, Tabs, TaskHeader, TaskNode, TaskPlan, type TaskSource, type TaskStatus, type TaskStep, type TaskStepStatus, type TerminalLine, TerminalPanel, TextPart, type TextPartProps, type TextUIPart, Textarea, type TextareaProps, type Theme, type ThemeFonts, type ThemeMode, ThemeProvider, ThemeScript, ThemeSwitcher, TheoUIProvider, type TheoUIProviderProps, type ThinkingLevel, type ThinkingLevelOrInherited, ThinkingLevelSelector, type ThinkingLevelSelectorProps, Timestamp, type TimestampProps, Toast, type ToastVariant, Toaster, TokenUsageChart, type TokenUsagePoint, ToolCall, ToolCallCard, ToolCallPart, type ToolCallPartProps, type ToolCallStatus, type ToolEnablement, type ToolEntry, type ToolInvocationState, ToolResult, type ToolUIPart, ToolsList, TooltipWithStatics as Tooltip, TopNav, type UIMessage, type UIMessagePart, UpdateBanner, type UpdateBannerProps, UsageMeter, type UsageMeterProps, type UsageMetric, anthropicStyle, auroraTerminal, avatarVariants, badgeVariants, builtinThemes, buttonVariants, capabilityPresets, classicPaper, cn, computePageRange, defineTheme, dracula, githubDark, hex, isCustomContentUIPart, isDataUIPart, isFileUIPart, isReasoningFileUIPart, isReasoningUIPart, isSourceDocumentUIPart, isSourceUrlUIPart, isStepStartUIPart, isTextUIPart, isToolUIPart, linearGlass, modelCapabilityPresets, oneDark, openaiStyle, renderPart, rgb, sheetVariants, useDensity, useTheme, useToast, vercelMono, violetForge };