@kitn.ai/ui 0.20.1 → 0.22.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 (510) hide show
  1. package/README.md +44 -45
  2. package/dist/components/artifact-card.d.ts +51 -0
  3. package/dist/components/artifact.d.ts +1 -1
  4. package/dist/components/attachments.d.ts +2 -2
  5. package/dist/components/audio-visualizer/index.d.ts +3 -3
  6. package/dist/components/audio-visualizer/labs/lab-choreography.d.ts +59 -0
  7. package/dist/components/audio-visualizer/labs/lab-shaders.d.ts +22 -0
  8. package/dist/components/audio-visualizer/labs/lab-visualizer.d.ts +18 -0
  9. package/dist/components/audio-visualizer/variant-aurora.d.ts +2 -2
  10. package/dist/components/audio-visualizer/variant-bar.d.ts +2 -2
  11. package/dist/components/audio-visualizer/variant-custom.d.ts +2 -2
  12. package/dist/components/audio-visualizer/variant-grid.d.ts +1 -1
  13. package/dist/components/audio-visualizer/variant-radial.d.ts +1 -1
  14. package/dist/components/audio-visualizer/variant-wave.d.ts +1 -1
  15. package/dist/components/card-fallback.d.ts +12 -2
  16. package/dist/components/card-renderer.d.ts +63 -2
  17. package/dist/components/chat-container.d.ts +3 -0
  18. package/dist/components/chat-scope-picker.d.ts +2 -2
  19. package/dist/components/chat-thread.d.ts +77 -18
  20. package/dist/components/choice-card.d.ts +3 -28
  21. package/dist/components/composer-dom.d.ts +1 -1
  22. package/dist/components/composer-highlight.d.ts +1 -1
  23. package/dist/components/composer-history.d.ts +1 -1
  24. package/dist/components/composer.d.ts +1 -1
  25. package/dist/components/confirm-card.d.ts +3 -18
  26. package/dist/components/context.d.ts +8 -4
  27. package/dist/components/conversation-item.d.ts +1 -1
  28. package/dist/components/conversation-list.d.ts +4 -3
  29. package/dist/components/embed.d.ts +3 -3
  30. package/dist/components/file-tree.d.ts +11 -22
  31. package/dist/components/form-widgets.d.ts +1 -1
  32. package/dist/components/form.d.ts +3 -44
  33. package/dist/components/link-preview.d.ts +3 -3
  34. package/dist/components/loader.d.ts +30 -48
  35. package/dist/components/message-skills.d.ts +4 -0
  36. package/dist/components/message.d.ts +84 -21
  37. package/dist/components/model-switcher.d.ts +2 -2
  38. package/dist/components/prompt-input.d.ts +2 -2
  39. package/dist/components/response-compare-types.d.ts +11 -2
  40. package/dist/components/response-compare.d.ts +3 -3
  41. package/dist/components/source.d.ts +12 -3
  42. package/dist/components/tasks-card.d.ts +3 -31
  43. package/dist/components/thread.d.ts +17 -5
  44. package/dist/components/toast.d.ts +2 -2
  45. package/dist/components/tool-classify.d.ts +8 -0
  46. package/dist/components/tool-types.d.ts +29 -1
  47. package/dist/components/tool.d.ts +3 -3
  48. package/dist/components/use-card-resolution.d.ts +1 -1
  49. package/dist/create-tween-COnPwAQN.js +338 -0
  50. package/dist/create-tween-DmTUaXWE.js +341 -0
  51. package/dist/create-tween-qs-jjvNA.js +7 -0
  52. package/dist/custom-elements.json +1726 -463
  53. package/dist/elements/agent-card.js +1 -1
  54. package/dist/elements/artifact.js +1 -1
  55. package/dist/elements/attachments.js +1 -1
  56. package/dist/elements/audio-visualizer.js +1 -1
  57. package/dist/elements/avatar.js +1 -1
  58. package/dist/elements/badge.js +1 -1
  59. package/dist/elements/button.js +1 -1
  60. package/dist/elements/card.js +1 -1
  61. package/dist/elements/cards.js +1 -1
  62. package/dist/elements/chain-of-thought.js +1 -1
  63. package/dist/elements/chat-scope-picker.js +1 -1
  64. package/dist/elements/chat-types.d.ts +70 -10
  65. package/dist/elements/chat-workspace.js +1 -1
  66. package/dist/elements/chat.js +1 -1
  67. package/dist/elements/checkpoint.js +1 -1
  68. package/dist/elements/choice.js +1 -1
  69. package/dist/elements/chunks/{Icon-Tj58ES_d.js → Icon-CHG5z5L7.js} +1 -1
  70. package/dist/elements/chunks/{action-icons-ns1Fnedj.js → action-icons-BAtCEEgg.js} +1 -1
  71. package/dist/elements/chunks/arrow-left-CFPTeL1Y.js +1 -0
  72. package/dist/elements/chunks/artifact-fBZOE4SO.js +1 -0
  73. package/dist/elements/chunks/{attachments-mCB5F1Fq.js → attachments-DpYMe5VQ.js} +1 -1
  74. package/dist/elements/chunks/audio-visualizer-DFwzAcuL.js +1 -0
  75. package/dist/elements/chunks/{badge-B4Zuajl2.js → badge-D6zodm6E.js} +1 -1
  76. package/dist/elements/chunks/{button-ZWNif3--.js → button-C42vrGvO.js} +1 -1
  77. package/dist/elements/chunks/card-renderer-DMZsSuvU.js +1 -0
  78. package/dist/elements/chunks/card-tags-D8lZ-C_U.js +1 -0
  79. package/dist/elements/chunks/chat-thread-CNNEhol-.js +1 -0
  80. package/dist/elements/chunks/check-7Q3K-iXE.js +1 -0
  81. package/dist/elements/chunks/chevron-down-CpNYLn7E.js +1 -0
  82. package/dist/elements/chunks/chevron-right-DrH85Fha.js +1 -0
  83. package/dist/elements/chunks/choice-card-YoWjpsFV.js +1 -0
  84. package/dist/elements/chunks/circle-C9KRjKYv.js +1 -0
  85. package/dist/elements/chunks/circle-check-Dmi7Y4zw.js +1 -0
  86. package/dist/elements/chunks/{circle-x-B7faJFlY.js → circle-x-QIxXda6k.js} +1 -1
  87. package/dist/elements/chunks/code-block-CqeugReY.js +1 -0
  88. package/dist/elements/chunks/{collapsible-DM1Ckd4e.js → collapsible-sTv-_5lF.js} +1 -1
  89. package/dist/elements/chunks/{composer-BguS0QL_.js → composer-ldQyeVEB.js} +2 -2
  90. package/dist/elements/chunks/confirm-card-C0RNOwfn.js +1 -0
  91. package/dist/elements/chunks/context-5qgypNHC.js +1 -0
  92. package/dist/elements/chunks/conversation-list-DLzOacXz.js +1 -0
  93. package/dist/elements/chunks/create-tween-V4TXZ93X.js +7 -0
  94. package/dist/elements/chunks/default-input-DeeRSDHc.js +1 -0
  95. package/dist/elements/chunks/define-lE-QvQFn.js +1 -0
  96. package/dist/elements/chunks/{disclosure-CIZ5c8nO.js → disclosure-DZSa9jog.js} +1 -1
  97. package/dist/elements/chunks/{download-Dsbg3ste.js → download-B2ZmnGqW.js} +1 -1
  98. package/dist/elements/chunks/{dropdown-BDd1-Zgi.js → dropdown-R3B7cSRE.js} +1 -1
  99. package/dist/elements/chunks/{ellipsis-Dw6qrss-.js → ellipsis-BmxceY4l.js} +1 -1
  100. package/dist/elements/chunks/embed-BVrtTZPo.js +1 -0
  101. package/dist/elements/chunks/{external-link-Vt74zAoL.js → external-link-BbdR7YO7.js} +1 -1
  102. package/dist/elements/chunks/{file-text-CZrZF6_v.js → file-text-D7dijo1A.js} +1 -1
  103. package/dist/elements/chunks/{file-tree-DF4okKyo.js → file-tree-0upJ5jeb.js} +1 -1
  104. package/dist/elements/chunks/{folder-glP5rha4.js → folder-D8z58t7B.js} +1 -1
  105. package/dist/elements/chunks/form-p5BKJNw5.js +1 -0
  106. package/dist/elements/chunks/hover-card-CN9s2md5.js +1 -0
  107. package/dist/elements/chunks/{icon-BLb8beoi.js → icon-CNiKP37E.js} +1 -1
  108. package/dist/elements/chunks/{info-CIsv92JK.js → info-BSnuJiHI.js} +1 -1
  109. package/dist/elements/chunks/{input-Dds1kFyt.js → input-BauDmzxX.js} +1 -1
  110. package/dist/elements/chunks/{kbd-De_xbgi9.js → kbd-BlHJaP9b.js} +1 -1
  111. package/dist/elements/chunks/{link-i4r_k7z4.js → link-DEi5iUWC.js} +1 -1
  112. package/dist/elements/chunks/link-preview-BaHyM6W4.js +1 -0
  113. package/dist/elements/chunks/{loader-BmQH4s3V.js → loader-CmJG_Fkq.js} +1 -1
  114. package/dist/elements/chunks/{markdown-Zi21WhUz.js → markdown-D2jaMpCN.js} +1 -1
  115. package/dist/elements/chunks/message-C5UfXZ2Z.js +1 -0
  116. package/dist/elements/chunks/message-CXWLmmLn.js +1 -0
  117. package/dist/elements/chunks/message-square-hXylwsy0.js +1 -0
  118. package/dist/elements/chunks/{minimize-2--ifeCGrl.js → minimize-2-C9ytZFMU.js} +1 -1
  119. package/dist/elements/chunks/model-switcher-CivGfD7-.js +1 -0
  120. package/dist/elements/chunks/{overlay-kD8dwRv_.js → overlay-DJL_sbOm.js} +1 -1
  121. package/dist/elements/chunks/{paperclip-q21dYOSK.js → paperclip-CFaB8naM.js} +1 -1
  122. package/dist/elements/chunks/{progress-bar-BrAIIaaJ.js → progress-bar-Br5SksfR.js} +1 -1
  123. package/dist/elements/chunks/{prompt-suggestion-Bjn2K-fR.js → prompt-suggestion-CMIvtAhU.js} +1 -1
  124. package/dist/elements/chunks/reasoning-DpZcNzLq.js +1 -0
  125. package/dist/elements/chunks/{resizable-Dp4JExql.js → resizable-Q8i3T9a_.js} +1 -1
  126. package/dist/elements/chunks/{rotate-cw-CFWWkpj2.js → rotate-cw-B5IHCBFV.js} +1 -1
  127. package/dist/elements/chunks/{scroll-area-Bb0kHH1j.js → scroll-area-eLeydBje.js} +1 -1
  128. package/dist/elements/chunks/scroll-button-DWbz0yA1.js +1 -0
  129. package/dist/elements/chunks/{separator-9kRgr1X9.js → separator-Xic78AD_.js} +1 -1
  130. package/dist/elements/chunks/{settings-B8lmec4D.js → settings-B8H51pAx.js} +1 -1
  131. package/dist/elements/chunks/{settings-group-I0hEuXiN.js → settings-group-CsG9eYLe.js} +1 -1
  132. package/dist/elements/chunks/{share-C3lTiYGt.js → share-CNTx0z__.js} +1 -1
  133. package/dist/elements/chunks/skeleton-CLlHTcMI.js +1 -0
  134. package/dist/elements/chunks/slots-CIw9RlAe.js +1 -0
  135. package/dist/elements/chunks/source-BoVcU5ok.js +1 -0
  136. package/dist/elements/chunks/{star-CSJtGxgv.js → star-CxQVTVhI.js} +1 -1
  137. package/dist/elements/chunks/{store-CHyW95TP.js → store-CLtS5CUG.js} +1 -1
  138. package/dist/elements/chunks/tasks-card-CzlkLmUt.js +1 -0
  139. package/dist/elements/chunks/{text-shimmer-Cn9TmNpI.js → text-shimmer-D5NhpIQ1.js} +1 -1
  140. package/dist/elements/chunks/textarea-x5Uxsmtm.js +1 -0
  141. package/dist/elements/chunks/{thumbs-up-PNVVThEF.js → thumbs-up-UobcJnx9.js} +1 -1
  142. package/dist/elements/chunks/{toast-store-DKbQn3Wn.js → toast-store-BOfs9eXq.js} +1 -1
  143. package/dist/elements/chunks/{tool-DjTRpIpl.js → tool-Be6Dh_dt.js} +1 -1
  144. package/dist/elements/chunks/tooltip-RxMxyCLF.js +1 -0
  145. package/dist/elements/chunks/{triangle-alert-DsHTHCPm.js → triangle-alert-C4yxH2XN.js} +1 -1
  146. package/dist/elements/chunks/use-card-resolution-jva9ehH6.js +1 -0
  147. package/dist/elements/chunks/{variant-aurora-Dc4nQUia.js → variant-aurora-Dx4VRcjS.js} +2 -2
  148. package/dist/elements/chunks/{variant-custom-y_3kVQhS.js → variant-custom-Y1ZTWgEa.js} +1 -1
  149. package/dist/elements/chunks/{variant-wave-D5OR1-9Z.js → variant-wave-B9gml9Cg.js} +2 -2
  150. package/dist/elements/chunks/{video-B7vmenoC.js → video-CrPHsytT.js} +1 -1
  151. package/dist/elements/chunks/x-_-OPHept.js +1 -0
  152. package/dist/elements/coachmark.js +1 -1
  153. package/dist/elements/code-block.js +1 -1
  154. package/dist/elements/command.js +1 -1
  155. package/dist/elements/compare.js +1 -1
  156. package/dist/elements/composer.js +1 -1
  157. package/dist/elements/confirm-card.js +1 -1
  158. package/dist/elements/context-meter.js +1 -1
  159. package/dist/elements/conversation-list.js +1 -1
  160. package/dist/elements/default-input.d.ts +34 -7
  161. package/dist/elements/define.d.ts +1 -0
  162. package/dist/elements/dialog.js +1 -1
  163. package/dist/elements/disclosure.d.ts +1 -1
  164. package/dist/elements/editable-label.js +1 -1
  165. package/dist/elements/element-data-types.d.ts +107 -0
  166. package/dist/elements/embed.js +1 -1
  167. package/dist/elements/empty.js +1 -1
  168. package/dist/elements/feedback-bar.js +1 -1
  169. package/dist/elements/file-tree.js +1 -1
  170. package/dist/elements/file-upload.js +1 -1
  171. package/dist/elements/form.js +1 -1
  172. package/dist/elements/hover-card.js +1 -1
  173. package/dist/elements/icon.js +1 -1
  174. package/dist/elements/image.js +1 -1
  175. package/dist/elements/input.js +1 -1
  176. package/dist/elements/kbd.js +1 -1
  177. package/dist/elements/link-preview.js +1 -1
  178. package/dist/elements/loader.js +1 -1
  179. package/dist/elements/markdown.js +1 -1
  180. package/dist/elements/menu.js +1 -1
  181. package/dist/elements/message-skills.js +1 -1
  182. package/dist/elements/message.js +1 -1
  183. package/dist/elements/model-switcher.js +1 -1
  184. package/dist/elements/nav.js +1 -1
  185. package/dist/elements/notice.js +1 -1
  186. package/dist/elements/pane-group.js +1 -1
  187. package/dist/elements/pane.js +1 -1
  188. package/dist/elements/popover.js +1 -1
  189. package/dist/elements/progress-bar.js +1 -1
  190. package/dist/elements/prompt-dock.js +1 -1
  191. package/dist/elements/prompt-input.js +1 -1
  192. package/dist/elements/prompt-suggestions.js +1 -1
  193. package/dist/elements/reasoning.js +1 -1
  194. package/dist/elements/register.d.ts +8 -6
  195. package/dist/elements/remote.js +1 -1
  196. package/dist/elements/resizable.js +1 -1
  197. package/dist/elements/response-stream.js +1 -1
  198. package/dist/elements/screen.js +1 -1
  199. package/dist/elements/scroll-area.js +1 -1
  200. package/dist/elements/scroll-button.js +1 -1
  201. package/dist/elements/search.js +1 -1
  202. package/dist/elements/segmented.js +1 -1
  203. package/dist/elements/separator.js +1 -1
  204. package/dist/elements/setting-item.js +1 -1
  205. package/dist/elements/settings-group.js +1 -1
  206. package/dist/elements/skeleton.js +1 -1
  207. package/dist/elements/slot-text.d.ts +51 -0
  208. package/dist/elements/slots.d.ts +21 -0
  209. package/dist/elements/source.js +1 -1
  210. package/dist/elements/status.js +1 -1
  211. package/dist/elements/switch.js +1 -1
  212. package/dist/elements/tabs.js +1 -1
  213. package/dist/elements/tasks.js +1 -1
  214. package/dist/elements/text-shimmer.js +1 -1
  215. package/dist/elements/thinking-bar.js +1 -1
  216. package/dist/elements/thread.js +1 -1
  217. package/dist/elements/toast.js +1 -1
  218. package/dist/elements/tool.js +1 -1
  219. package/dist/elements/tooltip.js +1 -1
  220. package/dist/elements/validate-messages.d.ts +25 -0
  221. package/dist/elements/voice-input.js +1 -1
  222. package/dist/elements/voice-output.js +1 -1
  223. package/dist/elements.d.ts +2734 -217
  224. package/dist/index.d.ts +163 -125
  225. package/dist/index.js +6572 -5990
  226. package/dist/index.server.d.ts +5 -0
  227. package/dist/index.server.js +5403 -4860
  228. package/dist/kai-provider.es.d.ts +5 -0
  229. package/dist/kai-provider.es.js +79 -77
  230. package/dist/kai.es.d.ts +5 -0
  231. package/dist/kai.es.js +1 -1
  232. package/dist/llms/llms-full.txt +774 -151
  233. package/dist/llms/llms.txt +57 -5
  234. package/dist/mcp.es.js +4756 -782
  235. package/dist/primitives/card-component-types.d.ts +11 -0
  236. package/dist/primitives/card-data-types.d.ts +196 -0
  237. package/dist/primitives/card-host.d.ts +1 -1
  238. package/dist/primitives/card-recovery.d.ts +3 -3
  239. package/dist/primitives/card-registry.d.ts +4 -14
  240. package/dist/primitives/card-resolution.d.ts +1 -1
  241. package/dist/primitives/card-routing.d.ts +1 -1
  242. package/dist/primitives/card-tags.d.ts +11 -0
  243. package/dist/primitives/card-validate-cards.d.ts +57 -0
  244. package/dist/primitives/card-validate-generator.testlib.d.ts +20 -0
  245. package/dist/primitives/card-validate-schemas.d.ts +17 -0
  246. package/dist/primitives/card-validate.d.ts +24 -0
  247. package/dist/primitives/create-kai-chat.d.ts +3 -3
  248. package/dist/primitives/embed-providers.d.ts +1 -1
  249. package/dist/primitives/link-preview.d.ts +1 -1
  250. package/dist/primitives/message-feedback.d.ts +2 -2
  251. package/dist/primitives/toast-store.d.ts +1 -1
  252. package/dist/react/index.d.ts +730 -302
  253. package/dist/react/use-kai-chat.d.ts +8 -4
  254. package/dist/react.d.ts +5 -0
  255. package/dist/react.js +418 -317
  256. package/dist/register-impl-AxIlqjo7.js +145 -0
  257. package/dist/remote/host-embed.d.ts +1 -1
  258. package/dist/remote/index.d.ts +2 -2
  259. package/dist/remote/provider-runtime.d.ts +2 -2
  260. package/dist/remote/provider.d.ts +2 -2
  261. package/dist/remote/validate.d.ts +1 -1
  262. package/dist/remote/wire.d.ts +1 -1
  263. package/dist/schemas/artifact.schema.json +92 -0
  264. package/dist/schemas/embed.schema.json +0 -2
  265. package/dist/schemas/from-tool-call.d.ts +48 -0
  266. package/dist/schemas/index.d.ts +48 -0
  267. package/dist/schemas/link.schema.json +0 -2
  268. package/dist/schemas/provider-subsets.d.ts +136 -0
  269. package/dist/schemas/registry.d.ts +140 -0
  270. package/dist/schemas/tool-defs.d.ts +121 -0
  271. package/dist/schemas.d.ts +5 -0
  272. package/dist/schemas.js +717 -0
  273. package/dist/solid-BGYSJyHG.js +22960 -0
  274. package/dist/solid-Dt2nEwfl.js +20194 -0
  275. package/dist/solid.d.ts +66 -0
  276. package/dist/solid.js +261 -0
  277. package/dist/solid.server.d.ts +5 -0
  278. package/dist/solid.server.js +261 -0
  279. package/dist/state/index.d.ts +14 -4
  280. package/dist/state/messages.d.ts +8 -3
  281. package/dist/state/mock.d.ts +46 -0
  282. package/dist/state/parts.d.ts +85 -0
  283. package/dist/state/stream.d.ts +15 -9
  284. package/dist/state.d.ts +5 -0
  285. package/dist/state.js +253 -84
  286. package/dist/ui/action-icons.d.ts +1 -1
  287. package/dist/ui/collapsible.d.ts +11 -6
  288. package/dist/ui/dropdown.d.ts +47 -42
  289. package/dist/ui/pane-group.d.ts +1 -1
  290. package/dist/{variant-aurora-DVtGqVH6.js → variant-aurora-B44X69AG.js} +1 -1
  291. package/dist/variant-aurora-BRhV8Flk.js +391 -0
  292. package/dist/variant-aurora-Ds5ou9BH.js +381 -0
  293. package/dist/variant-custom-B20FhtYj.js +170 -0
  294. package/dist/{variant-custom-Dif-IV4u.js → variant-custom-BvA1Schl.js} +1 -1
  295. package/dist/variant-custom-D6Rtvneb.js +200 -0
  296. package/dist/{variant-wave-DbfNdvSi.js → variant-wave-BUQtkryq.js} +1 -1
  297. package/dist/variant-wave-BVYnqy9L.js +218 -0
  298. package/dist/variant-wave-DXC6_LcH.js +208 -0
  299. package/dist/wire/chunk.d.ts +171 -0
  300. package/dist/wire/consume.d.ts +26 -0
  301. package/dist/wire/encode.d.ts +221 -0
  302. package/dist/wire/files.d.ts +116 -0
  303. package/dist/wire/formats/anthropic.d.ts +2 -0
  304. package/dist/wire/formats/openai.d.ts +5 -0
  305. package/dist/wire/index.d.ts +16 -0
  306. package/dist/wire/media-types.d.ts +106 -0
  307. package/dist/wire/read.d.ts +26 -0
  308. package/dist/wire/sink-helpers.d.ts +21 -0
  309. package/dist/wire/sse.d.ts +33 -0
  310. package/dist/wire.d.ts +5 -53
  311. package/dist/wire.js +1126 -0
  312. package/frameworks/react/index.tsx +191 -158
  313. package/frameworks/react/runtime.tsx +21 -1
  314. package/frameworks/react/use-kai-chat.tsx +11 -1
  315. package/llms-full.txt +774 -151
  316. package/llms.txt +57 -5
  317. package/package.json +62 -8
  318. package/src/agent-tooling/archetypes.ts +127 -0
  319. package/src/agent-tooling/integrations/anthropic.ts +436 -0
  320. package/src/agent-tooling/integrations/cloudflare.ts +141 -52
  321. package/src/agent-tooling/integrations/langgraph.ts +80 -13
  322. package/src/agent-tooling/integrations/mastra.ts +161 -12
  323. package/src/agent-tooling/integrations/mock.ts +47 -8
  324. package/src/agent-tooling/integrations/ollama.ts +68 -24
  325. package/src/agent-tooling/integrations/openai.ts +89 -0
  326. package/src/agent-tooling/integrations/openrouter.ts +58 -8
  327. package/src/agent-tooling/integrations/pi.ts +104 -23
  328. package/src/agent-tooling/integrations/pydantic-ai.ts +61 -5
  329. package/src/agent-tooling/integrations/vercel-ai-sdk.ts +120 -13
  330. package/src/agent-tooling/mcp/manifest.ts +206 -25
  331. package/src/agent-tooling/mcp/tools/debug.ts +13 -7
  332. package/src/agent-tooling/mcp/tools/reference.ts +285 -6
  333. package/src/agent-tooling/mcp/tools/scaffold.ts +4152 -661
  334. package/src/agent-tooling/registry.ts +74 -0
  335. package/src/agent-tooling/types.ts +361 -1
  336. package/src/components/artifact-card.tsx +120 -0
  337. package/src/components/audio-visualizer/index.tsx +9 -0
  338. package/src/components/audio-visualizer/labs/lab-choreography.ts +187 -0
  339. package/src/components/audio-visualizer/labs/lab-shaders.ts +363 -0
  340. package/src/components/audio-visualizer/labs/lab-visualizer.tsx +102 -0
  341. package/src/components/audio-visualizer/shader-canvas.tsx +31 -1
  342. package/src/components/card-fallback.tsx +42 -10
  343. package/src/components/card-renderer.tsx +146 -9
  344. package/src/components/chat-container.tsx +4 -0
  345. package/src/components/chat-thread.tsx +128 -52
  346. package/src/components/choice-card.tsx +17 -29
  347. package/src/components/composer.tsx +12 -2
  348. package/src/components/confirm-card.tsx +24 -20
  349. package/src/components/context.tsx +30 -16
  350. package/src/components/conversation-item.tsx +6 -0
  351. package/src/components/conversation-list.tsx +18 -2
  352. package/src/components/file-tree.tsx +11 -22
  353. package/src/components/file-upload.tsx +14 -8
  354. package/src/components/form.tsx +14 -47
  355. package/src/components/loader.tsx +39 -12
  356. package/src/components/message-skills.tsx +4 -0
  357. package/src/components/message.tsx +294 -46
  358. package/src/components/model-switcher.tsx +38 -8
  359. package/src/components/reasoning.tsx +92 -5
  360. package/src/components/response-compare-types.ts +25 -0
  361. package/src/components/response-compare.tsx +4 -9
  362. package/src/components/source.tsx +50 -24
  363. package/src/components/tasks-card.tsx +10 -33
  364. package/src/components/thread.tsx +84 -42
  365. package/src/components/toast.tsx +17 -6
  366. package/src/components/tool-classify.ts +26 -0
  367. package/src/components/tool-types.ts +31 -1
  368. package/src/elements/agent-card.tsx +11 -11
  369. package/src/elements/artifact.tsx +15 -7
  370. package/src/elements/attachments.tsx +6 -4
  371. package/src/elements/avatar.tsx +1 -1
  372. package/src/elements/button.tsx +29 -6
  373. package/src/elements/card.tsx +2 -2
  374. package/src/elements/cards.tsx +109 -14
  375. package/src/elements/chain-of-thought.tsx +14 -10
  376. package/src/elements/chat-scope-picker.tsx +9 -7
  377. package/src/elements/chat-types.ts +59 -6
  378. package/src/elements/chat-workspace.tsx +50 -9
  379. package/src/elements/chat.tsx +90 -3
  380. package/src/elements/choice.tsx +8 -8
  381. package/src/elements/coachmark.tsx +1 -1
  382. package/src/elements/command.tsx +8 -23
  383. package/src/elements/compare.tsx +7 -6
  384. package/src/elements/compiled.css +1 -1
  385. package/src/elements/composer.tsx +8 -8
  386. package/src/elements/confirm-card.tsx +9 -9
  387. package/src/elements/context-meter.tsx +4 -18
  388. package/src/elements/conversation-list.tsx +14 -9
  389. package/src/elements/default-input.tsx +131 -8
  390. package/src/elements/define.tsx +178 -43
  391. package/src/elements/editable-label.tsx +17 -2
  392. package/src/elements/element-data-types.ts +112 -0
  393. package/src/elements/element-meta.json +1624 -306
  394. package/src/elements/element-types.d.ts +2645 -214
  395. package/src/elements/feedback-bar.tsx +1 -1
  396. package/src/elements/file-tree.tsx +1 -1
  397. package/src/elements/file-upload.tsx +1 -1
  398. package/src/elements/form.tsx +14 -6
  399. package/src/elements/input.tsx +1 -1
  400. package/src/elements/kbd.tsx +1 -1
  401. package/src/elements/menu.tsx +40 -32
  402. package/src/elements/message-skills.tsx +7 -9
  403. package/src/elements/message.tsx +200 -32
  404. package/src/elements/model-switcher.tsx +5 -3
  405. package/src/elements/pane.tsx +1 -1
  406. package/src/elements/prompt-dock.tsx +8 -8
  407. package/src/elements/prompt-input.tsx +10 -10
  408. package/src/elements/prompt-suggestions.tsx +7 -4
  409. package/src/elements/reasoning.tsx +1 -1
  410. package/src/elements/register.ts +9 -0
  411. package/src/elements/resizable.globals.d.ts +36 -0
  412. package/src/elements/resizable.tsx +24 -13
  413. package/src/elements/response-stream.tsx +1 -1
  414. package/src/elements/scroll-button.tsx +1 -1
  415. package/src/elements/search.tsx +6 -1
  416. package/src/elements/segmented.tsx +5 -11
  417. package/src/elements/separator.tsx +1 -1
  418. package/src/elements/slot-text.ts +73 -0
  419. package/src/elements/slots.ts +67 -24
  420. package/src/elements/source.tsx +21 -22
  421. package/src/elements/switch.tsx +3 -3
  422. package/src/elements/tasks.tsx +5 -4
  423. package/src/elements/thread.tsx +36 -4
  424. package/src/elements/toast.tsx +3 -2
  425. package/src/elements/tool.tsx +1 -1
  426. package/src/elements/validate-messages.ts +76 -0
  427. package/src/elements/voice-input.tsx +7 -7
  428. package/src/elements/voice-output.tsx +4 -4
  429. package/src/index.ts +145 -6
  430. package/src/primitives/card-component-types.ts +63 -0
  431. package/src/primitives/card-data-types.ts +312 -0
  432. package/src/primitives/card-recovery.ts +13 -2
  433. package/src/primitives/card-registry.tsx +34 -23
  434. package/src/primitives/card-schemas/artifact.schema.json +92 -0
  435. package/src/primitives/card-schemas/embed.schema.json +0 -2
  436. package/src/primitives/card-schemas/link.schema.json +0 -2
  437. package/src/primitives/card-tags.ts +61 -0
  438. package/src/primitives/card-validate-cards.ts +255 -0
  439. package/src/primitives/card-validate-generator.testlib.ts +38 -0
  440. package/src/primitives/card-validate-schemas.ts +58 -0
  441. package/src/primitives/card-validate.ts +48 -20
  442. package/src/primitives/create-tween.ts +54 -2
  443. package/src/primitives/message-feedback.ts +3 -2
  444. package/src/primitives/use-audio-analysis.ts +20 -1
  445. package/src/primitives/use-sequencer.ts +20 -1
  446. package/src/schemas/from-tool-call.ts +151 -0
  447. package/src/schemas/index.ts +340 -0
  448. package/src/schemas/provider-subsets.ts +538 -0
  449. package/src/schemas/registry.ts +355 -0
  450. package/src/schemas/tool-defs.ts +492 -0
  451. package/src/solid.ts +150 -0
  452. package/src/state/index.ts +27 -1
  453. package/src/state/messages.ts +21 -4
  454. package/src/state/mock.ts +211 -0
  455. package/src/state/parts.ts +295 -0
  456. package/src/state/stream.ts +56 -58
  457. package/src/ui/collapsible.tsx +17 -5
  458. package/src/ui/dropdown.tsx +46 -12
  459. package/src/ui/overlay.tsx +10 -4
  460. package/src/wire/chunk.ts +201 -0
  461. package/src/wire/consume.ts +440 -0
  462. package/src/wire/encode.ts +689 -0
  463. package/src/wire/files.ts +342 -0
  464. package/src/wire/formats/anthropic.ts +267 -0
  465. package/src/wire/formats/openai.ts +187 -0
  466. package/src/wire/index.ts +73 -0
  467. package/src/wire/media-types.ts +344 -0
  468. package/src/wire/read.ts +152 -0
  469. package/src/wire/sink-helpers.ts +50 -0
  470. package/src/wire/sse.ts +140 -0
  471. package/dist/create-tween-hvpmSuwW.js +0 -7
  472. package/dist/elements/chunks/arrow-left-DQocUFvy.js +0 -1
  473. package/dist/elements/chunks/audio-visualizer-BqNy7dfm.js +0 -1
  474. package/dist/elements/chunks/card-BkHbp4BA.js +0 -1
  475. package/dist/elements/chunks/chat-thread-CkRN6pZ7.js +0 -1
  476. package/dist/elements/chunks/check-B9-gn6SS.js +0 -1
  477. package/dist/elements/chunks/chevron-down-BNsxc2hk.js +0 -1
  478. package/dist/elements/chunks/chevron-right-Hv00StBO.js +0 -1
  479. package/dist/elements/chunks/circle-0e3KJTDr.js +0 -1
  480. package/dist/elements/chunks/circle-check-BNAS0JEy.js +0 -1
  481. package/dist/elements/chunks/code-block-BFUHn6Va.js +0 -1
  482. package/dist/elements/chunks/context-Cb7k4F-v.js +0 -1
  483. package/dist/elements/chunks/conversation-list-CvoAkWhN.js +0 -1
  484. package/dist/elements/chunks/create-tween-oVvAIG8r.js +0 -7
  485. package/dist/elements/chunks/default-input-Cqqilg9t.js +0 -1
  486. package/dist/elements/chunks/define-D1din7Ld.js +0 -1
  487. package/dist/elements/chunks/hover-card-Cmm6Q53m.js +0 -1
  488. package/dist/elements/chunks/message-BqyXDN3-.js +0 -1
  489. package/dist/elements/chunks/message-feedback-Djr3z6Yb.js +0 -1
  490. package/dist/elements/chunks/message-square-vFAgbDaX.js +0 -1
  491. package/dist/elements/chunks/model-switcher-B94YAKsM.js +0 -1
  492. package/dist/elements/chunks/reasoning-DTpCGtnY.js +0 -1
  493. package/dist/elements/chunks/scroll-button-B0cH5fXf.js +0 -1
  494. package/dist/elements/chunks/skeleton-DSXW5Yya.js +0 -1
  495. package/dist/elements/chunks/slots--V19HwUb.js +0 -1
  496. package/dist/elements/chunks/textarea-CUwqAX0G.js +0 -1
  497. package/dist/elements/chunks/tooltip-CgBZCVKp.js +0 -1
  498. package/dist/elements/chunks/use-card-resolution-BSu_XHjH.js +0 -1
  499. package/dist/elements/chunks/x-GRUeeQFT.js +0 -1
  500. package/dist/host-embed.d.ts +0 -33
  501. package/dist/kai-provider.d.ts +0 -2
  502. package/dist/origin.d.ts +0 -5
  503. package/dist/provider-runtime.d.ts +0 -27
  504. package/dist/register-impl-DQyejdfb.js +0 -145
  505. package/dist/validate.d.ts +0 -4
  506. package/dist/version.d.ts +0 -4
  507. package/src/components/component-meta.json +0 -4550
  508. package/src/elements/card-media.jpg +0 -0
  509. package/src/elements/resizable.d.ts +0 -27
  510. package/src/elements/video-poster.jpg +0 -0
@@ -6,7 +6,7 @@ interface Props extends Record<string, unknown> {
6
6
  /** The tasks definition (the CardEnvelope.data). Set as a JS PROPERTY:
7
7
  * `el.data = { tasks:[…], selectAll, confirmLabel, … }`. Import
8
8
  * `TasksCardData` from `@kitn.ai/ui` for the full shape. */
9
- data?: Record<string, unknown>;
9
+ data?: TasksCardData;
10
10
  /** Stable card id correlating every emitted CardEvent. Attribute: `card-id`. */
11
11
  cardId?: string;
12
12
  /** Heading rendered in the card chrome (= CardEnvelope.title). Attribute: `heading`. */
@@ -29,7 +29,8 @@ interface Props extends Record<string, unknown> {
29
29
  * contract event — `kai-value-change` is the live selection signal, distinct from
30
30
  * the terminal submit.) */
31
31
  interface Events {
32
- /** The selection changed on a toggle the selected ids in input order. */
32
+ /** The selection changed on a toggle. Carries the selected ids in input
33
+ * order. */
33
34
  'kai-value-change': { value: string[] };
34
35
  }
35
36
 
@@ -72,7 +73,7 @@ defineWebComponent<Props, Events>(
72
73
  select: (taskIds?: string[]) => controller?.select(taskIds),
73
74
  /** Toggle one task by id, honoring the max gate (no `checked` = flip). */
74
75
  toggle: (taskId: string, checked?: boolean) => controller?.toggle(taskId, checked),
75
- /** Confirm the current selection emits the `submit` CardEvent + resolves
76
+ /** Confirm the current selection: emits the `submit` CardEvent + resolves
76
77
  * (only when the min/max gate passes). Named `send`, not `submit`. */
77
78
  send: () => controller?.send(),
78
79
  /** Focus the task group (select-all checkbox if shown, else the first row). */
@@ -85,7 +86,7 @@ defineWebComponent<Props, Events>(
85
86
 
86
87
  return (
87
88
  <TasksCard
88
- data={props.data as TasksCardData | undefined}
89
+ data={props.data}
89
90
  cardId={props.cardId ?? (element.id || 'kai-tasks')}
90
91
  heading={props.heading}
91
92
  resolution={props.resolution as CardResolution | undefined}
@@ -2,17 +2,19 @@ import { createSignal, onMount, onCleanup } from 'solid-js';
2
2
  import { defineWebComponent } from './define';
3
3
  import { readSlots, THREAD_SLOTS } from './slots';
4
4
  import { Thread, type ThreadController } from '../components/thread';
5
+ import { cardComponentsFromTags } from './message';
6
+ import { createMessagesGuard } from './validate-messages';
5
7
  import type { ChatMessage } from './chat-types';
6
8
  import type { ProseSize } from '../primitives/chat-config';
7
9
 
8
10
  interface Props extends Record<string, unknown> {
9
11
  /** The full message thread to render, newest last. Each entry carries its role,
10
- * content, and optional reasoning/tools/attachments/actions/avatar. Set as a JS
12
+ * ordered `parts`, and optional actions/avatar/feedback. Set as a JS
11
13
  * property (`el.messages = [...]`); a NEW array reference per streaming chunk
12
14
  * re-renders (mutating in place does not). */
13
15
  messages?: ChatMessage[];
14
- /** Show a typing indicator on the pending assistant turn set while awaiting
15
- * the assistant's reply. */
16
+ /** Show a typing indicator on the pending assistant turn. Set it while
17
+ * awaiting the assistant's reply. */
16
18
  loading?: boolean;
17
19
  /** Body/prose font scale for rendered markdown (`'xs' | 'sm' | 'base' | 'lg'`).
18
20
  * Defaults to `'sm'`. */
@@ -30,6 +32,26 @@ interface Props extends Record<string, unknown> {
30
32
  scrollButton?: boolean;
31
33
  /** Extra classes applied to the thread's inner root. */
32
34
  class?: string;
35
+ /** Optional card type -> custom-element tag overrides/additions for `card`
36
+ * parts (merged over the built-ins). Property: `el.cardTypes`. Typed as a
37
+ * plain string map (not the `CardTagMap` alias) so the generated React
38
+ * wrapper inlines it instead of emitting an unresolved named type. */
39
+ cardTypes?: Record<string, string>;
40
+ /** JSON Schemas for the card types this app renders, keyed by envelope type. The
41
+ * companion of `cardTypes`, which says what DRAWS a card while this says what a
42
+ * VALID one looks like. An OBJECT, so it is a JS property only: `el.cardSchemas
43
+ * = { 'pricing-table': pricingSchema }`, never an attribute.
44
+ * `createCardRegistry(...).validationSchemas` is exactly this shape.
45
+ *
46
+ * Without it the kit validates its own seven built-ins and leaves your own card
47
+ * type, the one your app actually cares about, as the only unchecked thing on
48
+ * screen. A schema here WINS over a built-in of the same name.
49
+ *
50
+ * Typed `Record<string, object>` rather than `Record<string, JsonSchema>`
51
+ * deliberately: an imported `.json` schema widens `"type"` to `string`, and an
52
+ * authored one carries `$schema`/`title`/`description`/`additionalProperties`,
53
+ * so the tighter type would reject both of the normal ways to supply one. */
54
+ cardSchemas?: Record<string, object>;
33
55
  }
34
56
 
35
57
  /** Events fired by `<kai-thread>`. */
@@ -61,9 +83,17 @@ defineWebComponent<Props, Events>('kai-thread', {
61
83
  actionsReveal: 'always',
62
84
  scrollButton: true,
63
85
  class: undefined,
86
+ cardTypes: undefined,
87
+ cardSchemas: undefined,
64
88
  }, (props, { element, dispatch, flag, expose }) => {
65
89
  let controller: ThreadController | undefined;
66
90
 
91
+ // `messages` is an untyped boundary: a consumer can hand it anything at
92
+ // runtime (a pre-0.20.0 `{ id, role, content }` array, in particular). Skip
93
+ // the invalid entries rather than let `groupMessageParts` throw deep inside a
94
+ // render pass, which would blank the whole element instead of one message.
95
+ const validMessages = createMessagesGuard('kai-thread');
96
+
67
97
  // Detect whether the consumer projected `slot="empty"` content, so the built-in
68
98
  // default only renders when they did NOT.
69
99
  const [slots, setSlots] = createSignal<Record<string, boolean>>({});
@@ -89,13 +119,15 @@ defineWebComponent<Props, Events>('kai-thread', {
89
119
  <style>{':host{display:block;height:100%}'}</style>
90
120
  <Thread
91
121
  class={props.class as string | undefined}
92
- messages={(props.messages as ChatMessage[] | undefined) ?? []}
122
+ messages={validMessages(props.messages)}
93
123
  loading={flag('loading')}
94
124
  proseSize={props.proseSize as ProseSize}
95
125
  codeTheme={props.codeTheme as string}
96
126
  codeHighlight={flag('codeHighlight')}
97
127
  actionsReveal={props.actionsReveal as 'always' | 'hover'}
98
128
  scrollButton={props.scrollButton !== false}
129
+ cardTypes={cardComponentsFromTags(props.cardTypes as Record<string, string> | undefined, (props as { theme?: string }).theme)}
130
+ cardSchemas={props.cardSchemas as Record<string, object> | undefined}
99
131
  empty={slots()['empty'] ? <slot name="empty" /> : undefined}
100
132
  onMessageAction={(detail) => dispatch('kai-message-action', detail)}
101
133
  controllerRef={(c) => (controller = c)}
@@ -4,8 +4,9 @@ import { toast as toastStore, type ToastItem } from '../primitives/toast-store';
4
4
 
5
5
  interface Props extends Record<string, unknown> {
6
6
  /** The toasts to render. Newest is shown on top. Set as a JS property (array);
7
- * pass a new array reference to update. */
8
- toasts: ToastItem[];
7
+ * pass a new array reference to update. Omit for an empty region, which is
8
+ * the normal resting state and how the imperative `toast()` API starts. */
9
+ toasts?: ToastItem[];
9
10
  /** Stack anchor: `'top-center'` (default), `'top-right'`, `'bottom-center'`, … */
10
11
  position?: ToastPosition;
11
12
  /** Max simultaneously-visible toasts; the rest queue. Defaults to `3`. */
@@ -13,7 +13,7 @@ interface Props extends Record<string, unknown> {
13
13
  open?: boolean;
14
14
  /** Initial open state on mount (uncontrolled seed). */
15
15
  defaultOpen?: boolean;
16
- /** Gate the disclosure trigger programmatic `show()/hide()/toggle()` still
16
+ /** Gate the disclosure trigger: programmatic `show()/hide()/toggle()` still
17
17
  * work, but the trigger click no longer toggles. */
18
18
  disabled?: boolean;
19
19
  }
@@ -0,0 +1,76 @@
1
+ import type { ChatMessage } from './chat-types';
2
+
3
+ /**
4
+ * Boundary validation for the untyped `message` / `messages` properties.
5
+ *
6
+ * A web component's properties are an untyped boundary: nothing stops a consumer
7
+ * from assigning the pre-0.20.0 `{ id, role, content }` shape, and TypeScript is
8
+ * not there at runtime to catch it. `parts` is REQUIRED internally, so a message
9
+ * without one throws inside a Solid render pass (`groupMessageParts` iterating
10
+ * `undefined`), and an uncaught exception there blanks the WHOLE element, not
11
+ * just the offending message. Validating here turns that into a skipped message
12
+ * plus one clear console error naming the element and the expected shape.
13
+ */
14
+
15
+ /** True when `m` carries the required `parts` array. */
16
+ export function hasParts(m: unknown): m is ChatMessage {
17
+ return !!m && typeof m === 'object' && Array.isArray((m as { parts?: unknown }).parts);
18
+ }
19
+
20
+ /** Shared tail of every diagnostic, so all facades say the same thing. */
21
+ const EXPECTED =
22
+ "each entry needs a 'parts' array (e.g. parts: [{ type: 'text', text: 'Hi' }]). " +
23
+ "The 'content' string field was removed in 0.20.0.";
24
+
25
+ const EMPTY: ChatMessage[] = [];
26
+
27
+ /**
28
+ * Creates a per-element-instance validator for a `messages` array. Returns the
29
+ * INPUT array unchanged when every entry is valid (no allocation, so streaming
30
+ * identity checks upstream still hold), a filtered copy when some are not, and
31
+ * `[]` when the property itself is not an array.
32
+ *
33
+ * Logs at most one `console.error` per validation pass, and never re-logs for a
34
+ * message object it has already reported, so an unrelated re-render during
35
+ * streaming does not spam the console.
36
+ */
37
+ export function createMessagesGuard(tag: string): (messages: unknown) => ChatMessage[] {
38
+ const warned = new WeakSet<object>();
39
+ // WeakSet only holds objects, so primitive entries (a stray string/null in the
40
+ // array) get one shared latch instead.
41
+ let warnedPrimitive = false;
42
+ let warnedNonArray = false;
43
+
44
+ return (messages: unknown): ChatMessage[] => {
45
+ if (!Array.isArray(messages)) {
46
+ if (messages != null && !warnedNonArray) {
47
+ warnedNonArray = true;
48
+ console.error(`<${tag}>: 'messages' must be an array. Ignoring it.`);
49
+ }
50
+ return EMPTY;
51
+ }
52
+ // Fast path: nothing to report, hand back the same reference.
53
+ if (messages.every(hasParts)) return messages as ChatMessage[];
54
+
55
+ let invalid = 0;
56
+ let unreported = 0;
57
+ for (const m of messages) {
58
+ if (hasParts(m)) continue;
59
+ invalid++;
60
+ if (m !== null && typeof m === 'object') {
61
+ if (warned.has(m as object)) continue;
62
+ warned.add(m as object);
63
+ } else {
64
+ if (warnedPrimitive) continue;
65
+ warnedPrimitive = true;
66
+ }
67
+ unreported++;
68
+ }
69
+ if (unreported > 0) {
70
+ console.error(
71
+ `<${tag}>: skipped ${invalid} of ${messages.length} messages: ${EXPECTED}`,
72
+ );
73
+ }
74
+ return messages.filter(hasParts);
75
+ };
76
+ }
@@ -3,7 +3,7 @@ import { VoiceInput, type VoiceInputController } from '../components/voice-input
3
3
 
4
4
  interface Props extends Record<string, unknown> {
5
5
  /**
6
- * Transcriber the host supplies records audio, returns the text. This is a
6
+ * Transcriber the host supplies: records audio, returns the text. This is a
7
7
  * **function-valued property** (`el.transcribe = async blob => '...'`) because
8
8
  * a value-returning callback can't be modelled as a fire-and-forget event.
9
9
  */
@@ -24,18 +24,18 @@ interface Props extends Record<string, unknown> {
24
24
 
25
25
  /** Events fired by `<kai-voice-input>`. */
26
26
  interface Events {
27
- /** Raw audio captured (before transcription) for hosts that prefer to
28
- * handle transcription themselves instead of via the `transcribe` property.
29
- * Also the unsupported-fallback signal: no `transcribe`, no SpeechRecognition,
30
- * so only the blob is produced (no text). */
27
+ /** Raw audio captured (before transcription), for hosts that prefer to handle
28
+ * transcription themselves instead of via the `transcribe` property. Also the
29
+ * unsupported-fallback signal: no `transcribe`, no SpeechRecognition, so only
30
+ * the blob is produced (no text). */
31
31
  'kai-audio-captured': { blob: Blob };
32
- /** Final transcript the `transcribe` property resolved, OR native
32
+ /** Final transcript: the `transcribe` property resolved, OR native
33
33
  * `SpeechRecognition` produced final text (no `transcribe` set). */
34
34
  'kai-transcription': { text: string };
35
35
  /** Live partial transcript during native recognition (only when `interim` is
36
36
  * set). Fires repeatedly before the final `kai-transcription`. */
37
37
  'kai-transcript-interim': { text: string };
38
- /** Recording started or stopped lets the host drive its own UI (waveform,
38
+ /** Recording started or stopped. Lets the host drive its own UI (waveform,
39
39
  * push-to-talk indicator) in sync with the mic. Fires on real transitions
40
40
  * only (manual click and programmatic start()/stop()), never on mount. */
41
41
  'kai-recording-change': { recording: boolean };
@@ -7,7 +7,7 @@ interface Props extends Record<string, unknown> {
7
7
  /** Speak automatically when `text` is set/changed. */
8
8
  autoplay?: boolean;
9
9
  /**
10
- * TTS model seam the host supplies given text, returns an audio `Blob` to
10
+ * TTS model seam the host supplies: given text, returns an audio `Blob` to
11
11
  * play. This is a **function-valued property** (`el.synthesize = async text =>
12
12
  * blob`); when set, the native `speechSynthesis` path is bypassed. Mirrors
13
13
  * `<kai-voice-input>`'s `transcribe`. A value-returning callback can't be
@@ -20,10 +20,10 @@ interface Props extends Record<string, unknown> {
20
20
 
21
21
  /** Events fired by `<kai-voice-output>`. */
22
22
  interface Events {
23
- /** Playback started or stopped drive your own UI in sync. Fires on real
24
- * transitions only (manual click and programmatic speak()/stop()), never on mount. */
23
+ /** Playback started or stopped. Drive your own UI in sync. Fires on real transitions
24
+ * only (manual click and programmatic speak()/stop()), never on mount. */
25
25
  'kai-speaking-change': { speaking: boolean };
26
- /** The model path (`synthesize`) resolved audio the raw `Blob` before playback. */
26
+ /** The model path (`synthesize`) resolved audio: the raw `Blob` before playback. */
27
27
  'kai-synthesized': { blob: Blob };
28
28
  }
29
29
 
package/src/index.ts CHANGED
@@ -1,3 +1,26 @@
1
+ // The package root entry (".").
2
+ //
3
+ // SCOPE — read before adding an export here.
4
+ // -----------------------------------------
5
+ // Every consumer of `@kitn.ai/ui` pays for this barrel, INCLUDING React/Vue/
6
+ // Svelte consumers who never render a Solid component. It is therefore frozen at
7
+ // the surface that shipped: adding a Solid component here taxes four frameworks
8
+ // to serve one. Closing the element coverage gaps on this file grew it
9
+ // 591,359 -> 705,031 bytes (+19.2%), which is what motivated the split. (That
10
+ // measurement was taken at the then-79 elements; the catalog grows, the bytes
11
+ // quoted do not — they are a record of the split, not a current reading.)
12
+ //
13
+ // The COMPLETE SolidJS surface — a component for EVERY registered element plus a
14
+ // `<Name>Props` type for every public component — lives on `@kitn.ai/ui/solid`
15
+ // (src/solid.ts), which is its own build target so only Solid consumers pay for
16
+ // it. `npm run verify:solid-coverage` prints the element count and proves that
17
+ // surface n/n on every run, which is why no count is restated here. `./solid`
18
+ // re-exports this file, so it is a strict superset: anything here is reachable
19
+ // there too, and a Solid consumer only ever needs the one import.
20
+ //
21
+ // Rule of thumb: a NEW Solid component export belongs in src/solid.ts.
22
+ // Type-only exports are free (fully erased by the build) and may live in either.
23
+
1
24
  // Shared types (folded in from @tab-zen/shared)
2
25
  export type { ModelOption, SearchFilters, ConversationScope, ConversationSummary, ConversationGroup } from './types';
3
26
 
@@ -27,7 +50,7 @@ export type {
27
50
  } from './primitives/toast-store';
28
51
  export { Toast, ToastRegion } from './components/toast';
29
52
  export type {
30
- ToastRegionProps, ToastDismissReason, ToastPosition,
53
+ ToastProps, ToastRegionProps, ToastDismissReason, ToastPosition,
31
54
  } from './components/toast';
32
55
 
33
56
  // Card Contract (generative-UI foundation)
@@ -160,32 +183,64 @@ export type { ButtonProps } from './ui/button';
160
183
  export { Avatar } from './ui/avatar';
161
184
  export type { AvatarProps } from './ui/avatar';
162
185
  export { Tooltip } from './ui/tooltip';
186
+ export type { TooltipProps, TooltipController } from './ui/tooltip';
163
187
  export { HoverCard } from './ui/hover-card';
188
+ export type { HoverCardProps, HoverCardController } from './ui/hover-card';
164
189
  export { Collapsible, CollapsibleTrigger, CollapsibleContent } from './ui/collapsible';
190
+ export type {
191
+ CollapsibleProps, CollapsibleTriggerProps, CollapsibleContentProps, CollapsibleController,
192
+ } from './ui/collapsible';
165
193
  export { ScrollArea } from './ui/scroll-area';
194
+ export type { ScrollAreaProps, ScrollOrientation } from './ui/scroll-area';
166
195
  export { Dropdown, DropdownTrigger, DropdownContent, DropdownItem } from './ui/dropdown';
196
+ export type {
197
+ DropdownProps, DropdownTriggerProps, DropdownContentProps, DropdownItemProps, DropdownController,
198
+ } from './ui/dropdown';
167
199
  export { Textarea } from './ui/textarea';
168
200
  export type { TextareaProps } from './ui/textarea';
169
201
  export { Badge } from './ui/badge';
170
202
  export type { BadgeProps } from './ui/badge';
171
203
  export { Separator } from './ui/separator';
204
+ export type { SeparatorProps } from './ui/separator';
172
205
  export { ResizablePanelGroup, ResizablePanel, ResizableHandle, Resizable, normalizeSize, resolveToPx } from './ui/resizable';
173
206
  export type { ResizablePanelGroupProps, ResizablePanelProps, ResizableHandleProps, ResizableProps, SizeValue } from './ui/resizable';
174
207
  export { Skeleton } from './ui/skeleton';
208
+ export type { SkeletonProps, SkeletonVariant } from './ui/skeleton';
175
209
  export { FileTree, buildFileTree } from './components/file-tree';
176
210
  export type {
177
211
  FileTreeProps, FileTreeFile, FileTreeNode, FileTreeFolderNode, FileTreeFileNode,
178
212
  } from './components/file-tree';
179
213
  export { Artifact } from './components/artifact';
180
214
  export type { ArtifactProps, ArtifactFile, ArtifactTab } from './components/artifact';
215
+ export { ArtifactCard, DEFAULT_ARTIFACT_CARD_HEIGHT } from './components/artifact-card';
216
+ // `ArtifactCardFile` is the SAME declaration `FileTreeFile` and `ArtifactFile`
217
+ // alias, authored in primitives/card-data-types.ts because `ArtifactCardData.files`
218
+ // reaches it and that module has to stay resolvable from a Node/no-DOM project.
219
+ // It is exported here under its authored name because that is the name the
220
+ // generated element metadata records for `kai-artifact.files` / `kai-file-tree.files`,
221
+ // and tests/elements/prop-types-exported.ts requires every named prop type to be
222
+ // importable from this entry. The two aliases stay exported above, unchanged.
223
+ export type {
224
+ ArtifactCardProps,
225
+ ArtifactCardData,
226
+ ArtifactCardEnvelope,
227
+ ArtifactCardFile,
228
+ ArtifactCardTab,
229
+ } from './components/artifact-card';
181
230
 
182
231
  // Layer 3: AI/Feature Components
183
232
  export {
184
233
  ChatContainer, ChatContainerRoot, ChatContainerContent, ChatContainerScrollAnchor,
185
234
  useChatContainer,
186
235
  } from './components/chat-container';
187
- export { Message, MessageAvatar, MessageContent, MessageActions, MessageAction, MessageCopyButton } from './components/message';
188
- export type { MessageCopyButtonProps } from './components/message';
236
+ export type {
237
+ ChatContainerProps, ChatContainerRootProps, ChatContainerContentProps, ChatContainerScrollAnchorProps,
238
+ } from './components/chat-container';
239
+ export { Message, MessageAvatar, MessageContent, MessageActions, MessageAction, MessageCopyButton, MessageBody } from './components/message';
240
+ export type {
241
+ MessageProps, MessageAvatarProps, MessageContentProps, MessageActionsProps,
242
+ MessageActionProps, MessageCopyButtonProps, MessageBodyProps,
243
+ } from './components/message';
189
244
  export { ResponseCompare, useResolved } from './components/response-compare';
190
245
  export type { ResponseCompareProps, CompareLayout, ResolvedController } from './components/response-compare';
191
246
  export {
@@ -201,14 +256,20 @@ export type {
201
256
  CompareSelection,
202
257
  } from './components/response-compare';
203
258
  export { MessageSkills } from './components/message-skills';
204
- export type { Skill as MessageSkill } from './components/message-skills';
259
+ export type { MessageSkillsProps, Skill as MessageSkill } from './components/message-skills';
205
260
  export {
206
261
  PromptInput, PromptInputTextarea, PromptInputActions, PromptInputAction,
207
262
  usePromptInput,
208
263
  } from './components/prompt-input';
264
+ export type {
265
+ PromptInputProps, PromptInputTextareaProps, PromptInputActionsProps, PromptInputActionProps,
266
+ } from './components/prompt-input';
209
267
  export { ResponseStream } from './components/response-stream';
268
+ export type { ResponseStreamProps } from './components/response-stream';
210
269
  export { Markdown } from './components/markdown';
270
+ export type { MarkdownProps } from './components/markdown';
211
271
  export { CodeBlock, CodeBlockCode, CodeBlockGroup } from './components/code-block';
272
+ export type { CodeBlockProps, CodeBlockCodeProps, CodeBlockGroupProps } from './components/code-block';
212
273
  export { Loader } from './components/loader';
213
274
  export type { LoaderVariant, LoaderSize, LoaderProps } from './components/loader';
214
275
  export {
@@ -216,13 +277,26 @@ export {
216
277
  DotsLoader, TypingLoader, WaveLoader, BarsLoader,
217
278
  TerminalLoader, TextBlinkLoader, TextShimmerLoader, TextDotsLoader,
218
279
  } from './components/loader';
219
- export { FeedbackBar, type FeedbackValue, type FeedbackDetail } from './components/feedback-bar';
280
+ export type {
281
+ LoaderShapeProps, LoaderTextProps,
282
+ CircularLoaderProps, ClassicLoaderProps, PulseLoaderProps, PulseDotLoaderProps,
283
+ DotsLoaderProps, TypingLoaderProps, WaveLoaderProps, BarsLoaderProps,
284
+ TerminalLoaderProps, TextBlinkLoaderProps, TextShimmerLoaderProps, TextDotsLoaderProps,
285
+ } from './components/loader';
286
+ export { FeedbackBar, type FeedbackValue, type FeedbackDetail, type FeedbackBarProps } from './components/feedback-bar';
220
287
  export {
221
288
  ChainOfThought, ChainOfThoughtStep, ChainOfThoughtTrigger,
222
289
  ChainOfThoughtContent, ChainOfThoughtItem,
223
290
  } from './components/chain-of-thought';
291
+ export type {
292
+ ChainOfThoughtProps, ChainOfThoughtStepProps, ChainOfThoughtTriggerProps,
293
+ ChainOfThoughtContentProps, ChainOfThoughtItemProps,
294
+ ChainOfThoughtType, ChainOfThoughtStepData, ChainOfThoughtController,
295
+ } from './components/chain-of-thought';
224
296
  export { Source, SourceTrigger, SourceContent, SourceList } from './components/source';
297
+ export type { SourceProps, SourceTriggerProps, SourceContentProps, SourceListProps } from './components/source';
225
298
  export { PromptSuggestion } from './components/prompt-suggestion';
299
+ export type { PromptSuggestionProps } from './components/prompt-suggestion';
226
300
  export {
227
301
  Empty, EmptyHeader, EmptyMedia, EmptyTitle, EmptyDescription, EmptyContent, emptyMediaVariants,
228
302
  } from './components/empty';
@@ -230,7 +304,9 @@ export type {
230
304
  EmptyProps, EmptyHeaderProps, EmptyMediaProps, EmptyTitleProps, EmptyDescriptionProps, EmptyContentProps,
231
305
  } from './components/empty';
232
306
  export { ScrollButton } from './components/scroll-button';
307
+ export type { ScrollButtonProps } from './components/scroll-button';
233
308
  export { TextShimmer } from './components/text-shimmer';
309
+ export type { TextShimmerProps } from './components/text-shimmer';
234
310
  export { Checkpoint, CheckpointIcon, CheckpointTrigger } from './components/checkpoint';
235
311
  export type { CheckpointProps, CheckpointIconProps, CheckpointTriggerProps } from './components/checkpoint';
236
312
  export {
@@ -253,14 +329,29 @@ export type {
253
329
  ContextContentBodyProps,
254
330
  ContextContentFooterProps,
255
331
  ContextUsageRowProps,
332
+ ContextInputUsageProps,
333
+ ContextOutputUsageProps,
334
+ ContextReasoningUsageProps,
335
+ ContextCacheUsageProps,
256
336
  } from './components/context';
257
337
  export { VoiceInput } from './components/voice-input';
338
+ export type { VoiceInputProps, VoiceInputController } from './components/voice-input';
258
339
  export { ConversationList } from './components/conversation-list';
340
+ export type { ConversationListProps, ConversationListController } from './components/conversation-list';
259
341
  export { ConversationItem } from './components/conversation-item';
342
+ export type { ConversationItemProps } from './components/conversation-item';
260
343
  export { ModelSwitcher } from './components/model-switcher';
344
+ export type { ModelSwitcherProps } from './components/model-switcher';
261
345
  export { ChatScopePicker } from './components/chat-scope-picker';
346
+ export type { ChatScopePickerProps } from './components/chat-scope-picker';
262
347
  export { Tool } from './components/tool';
263
348
  export type { ToolPart, ToolProps } from './components/tool';
349
+ // ToolPart.kind's doc comment says "Derive with `classifyTool(type)`", so the
350
+ // function has to be reachable from every entry that surfaces ToolPart. It is
351
+ // total, deterministic and terminates in 'generic', so it is safe public API and
352
+ // genuinely useful to anyone rendering tool calls themselves.
353
+ export { classifyTool } from './components/tool-classify';
354
+ export type { ToolKind } from './components/tool-classify';
264
355
  export { ThinkingBar } from './components/thinking-bar';
265
356
  export type { ThinkingBarProps } from './components/thinking-bar';
266
357
  export { Reasoning, ReasoningTrigger, ReasoningContent } from './components/reasoning';
@@ -283,4 +374,52 @@ export type {
283
374
  } from './components/attachments';
284
375
 
285
376
  // Chat message types — public API for consumers who need to type their own message arrays.
286
- export type { ChatMessage, ChatMessageAction, CustomAction, AvatarData, FeedbackVote } from './elements/chat-types';
377
+ // NOTE: chat-types.ts also exports an unrelated `Source` interface (a citation), and
378
+ // `Source` is already a public component export (./components/source, a citation
379
+ // chip/trigger), so re-exporting both under that name is a duplicate-identifier error.
380
+ // The citation type therefore ships under its alias `MessageSource`, which is also the
381
+ // argument type of the public `AssistantStream.addSource(source)`.
382
+ export type {
383
+ ChatMessage, ChatMessageAction, CustomAction, AvatarData, FeedbackVote, MessagePart,
384
+ MessageSource, RawOrigin,
385
+ } from './elements/chat-types';
386
+
387
+ // Composer document model. This belongs on "." rather than "./solid" because it
388
+ // is part of the ELEMENT contract, not the Solid-only surface: `ComposerDoc` is
389
+ // the non-string half of `kai-prompt-input` / `kai-composer` / `kai-default-input`'s
390
+ // `value` property, and `doc` + `entities` on their `kai-submit` /
391
+ // `kai-value-change` details. The shipped prop docs name `ComposerDoc` by name,
392
+ // so a React or Vue consumer reading them has to be able to import it. Type-only,
393
+ // so it is erased by the build and costs the root barrel nothing.
394
+ export type { ComposerDoc, Segment, EntityRef } from './primitives/composer-model';
395
+
396
+ // ---------------------------------------------------------------------------
397
+ // Named types for the remaining kai-* array/object PROPERTIES.
398
+ //
399
+ // Same rationale as `ComposerDoc` above, applied to the whole class instead of
400
+ // one instance: the generated `./elements` declarations and React wrappers expand
401
+ // every prop type structurally (deliberately — see the `IMPORTS = {}` note in
402
+ // scripts/gen-element-api.mjs), so a consumer who wants to NAME the shape had to
403
+ // write `NonNullable<KaiPromptInputElementProps['triggers']>`. Every element-prop
404
+ // type that has a name in source is now reachable from "." — the entry a React /
405
+ // Vue / Svelte / vanilla consumer imports — not only from "./solid".
406
+ //
407
+ // Type-only, so the root barrel pays nothing at runtime.
408
+ // Guarded by tests/elements/prop-types-exported.test.ts, which re-derives the
409
+ // list from the facades with the TS checker and fails on a new unexported one.
410
+ // ---------------------------------------------------------------------------
411
+ export type { TriggerDef, TriggerItem } from './components/composer';
412
+ export type { ChatThreadContextUsage } from './components/chat-thread';
413
+ export type { Skill } from './components/message-skills';
414
+ export type { AgentStatus } from './ui/agent-card';
415
+ export type { KaiNavItem } from './ui/nav';
416
+ export type { KaiTabItem } from './ui/tabs';
417
+ export type { PaneStatus } from './ui/pane';
418
+ export type { PaneTab } from './ui/pane-group';
419
+ export type {
420
+ KaiCommandItem, KaiContextUsage, KaiMenuItem, KaiSegmentedOption, KaiSourceItem,
421
+ } from './elements/element-data-types';
422
+ // `kai-audio-visualizer.shader` takes a ShaderSpec. The element arrived from main
423
+ // after this block was written, and prop-types-exported.test.ts caught it, which
424
+ // is the point of deriving that list from the facades rather than maintaining it.
425
+ export type { ShaderSpec } from './components/audio-visualizer';
@@ -0,0 +1,63 @@
1
+ // src/primitives/card-component-types.ts
2
+ // `CardEnvelope.type` -> the Solid component that renders it, as a TYPE.
3
+ //
4
+ // TYPES ONLY, AND THAT IS THE WHOLE FILE. `BUILTIN_CARD_COMPONENTS` and
5
+ // `mergeCardComponents` stay in card-registry.tsx and cannot follow them here: they
6
+ // ARE JSX. So this is not the same split card-tags.ts made — that one moved data and
7
+ // its type; this one moves only the type, because the value half has nowhere else to
8
+ // go. Do not try to "finish" the symmetry by dragging the component map over.
9
+ //
10
+ // WHY THE TYPES ARE ALONE IN A `.ts`
11
+ // ----------------------------------
12
+ // The same reason, one layer along, that card-tags.ts exists — read that file's header
13
+ // first; this is the second instance of its problem, not a new one.
14
+ //
15
+ // `@kitn.ai/ui/schemas` is the server-safe entry, and src/schemas/registry.ts declares
16
+ // `CustomCardSpec.component` and `CardRegistry.components` in terms of
17
+ // `CardComponentMap`. That is a TYPE import and erases at runtime, but a type import
18
+ // still has to RESOLVE, and while these two types lived in card-registry.tsx it
19
+ // resolved to a `.tsx`. tsconfig.mcp.json has no `jsx` on purpose, so the `kai` MCP's
20
+ // typecheck pass reported, on any tree that had not been built:
21
+ //
22
+ // src/schemas/registry.ts(61,51): error TS6142: Module '../primitives/card-registry'
23
+ // was resolved to '.../card-registry.tsx', but '--jsx' is not set.
24
+ //
25
+ // Exactly one error, and the last one standing on an unbuilt tree. Moving the two type
26
+ // aliases into this file takes that pass to 0. Measured on this tree, both directions.
27
+ //
28
+ // Relaxing tsconfig.mcp.json instead is not an option, and that is measured too, not
29
+ // recalled: giving that project `jsx: "preserve"` + `jsxImportSource: "solid-js"` —
30
+ // the settings the main tsconfig.json actually uses — takes it from 1 error to 130,
31
+ // almost all `TS2304: Cannot find name 'HTMLDivElement' / 'window'`, because a `jsx`
32
+ // setting drags the whole Solid component tree into a Node-only, `lib: ["ESNext"]`
33
+ // pass. (`jsx: "preserve"` with no import source is worse still: 838.) card-tags.ts
34
+ // records 1364 for the broader case. The figures differ because the reachable set
35
+ // differs; the conclusion does not. The Node/no-DOM boundary is load-bearing.
36
+ //
37
+ // `import type { Component } from 'solid-js'` below does NOT reintroduce the problem
38
+ // it just solved. Type-importing from solid-js resolves to a `.d.ts`, and a
39
+ // declaration file needs no `jsx` to be read; `skipLibCheck` covers what is inside it.
40
+ // It is resolving a `.tsx` SOURCE file that TS6142 objects to, and this file resolves
41
+ // none.
42
+ //
43
+ // WHAT THIS SPLIT DOES NOT DO
44
+ // ---------------------------
45
+ // It changes nothing at runtime, and must not be sold as if it did. This module is
46
+ // types only, so it compiles to nothing and there is no emitted module to compare:
47
+ // `verify:ssr` and `verify:schemas` read the BUILT entry and cannot tell the two
48
+ // arrangements apart even in principle. card-tags.ts records the same finding for its
49
+ // own case from the harder direction, where there WAS a bundle to diff and it came out
50
+ // byte-identical. The boundary this file defends is a compile-time one. The
51
+ // discriminating check is `tsc --noEmit -p tsconfig.mcp.json` on an UNBUILT tree, and
52
+ // nothing else is evidence for it.
53
+
54
+ import type { Component } from 'solid-js';
55
+ import type { CardEnvelope, CardHost } from './card-contract';
56
+
57
+ /** Solid renderer for one envelope. `host` is the resolved CardHost so each wrapper
58
+ * can bridge its card's emit convention (form/confirm/tasks take `host`;
59
+ * link/embed take `onEmit`). */
60
+ export type CardComponent = Component<{ envelope: CardEnvelope; host?: CardHost }>;
61
+
62
+ /** Solid layer: envelope type → the component that draws it. */
63
+ export type CardComponentMap = Record<string, CardComponent>;