@kitn.ai/ui 0.20.1 → 0.21.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 (500) 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 +68 -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-D3Y5qiij.js +338 -0
  50. package/dist/create-tween-DGKY1FDY.js +341 -0
  51. package/dist/create-tween-paho5Rh-.js +7 -0
  52. package/dist/custom-elements.json +1681 -454
  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-C-2LvGDG.js} +1 -1
  70. package/dist/elements/chunks/{action-icons-ns1Fnedj.js → action-icons-CaYoImEk.js} +1 -1
  71. package/dist/elements/chunks/arrow-left-Bb46H7w9.js +1 -0
  72. package/dist/elements/chunks/artifact-BBIscOxJ.js +1 -0
  73. package/dist/elements/chunks/{attachments-mCB5F1Fq.js → attachments-BB56zoji.js} +1 -1
  74. package/dist/elements/chunks/audio-visualizer-BxOx4THz.js +1 -0
  75. package/dist/elements/chunks/{badge-B4Zuajl2.js → badge-SxLSZ19R.js} +1 -1
  76. package/dist/elements/chunks/{button-ZWNif3--.js → button-CmkUkz6c.js} +1 -1
  77. package/dist/elements/chunks/card-renderer-Db4ffkWv.js +1 -0
  78. package/dist/elements/chunks/card-tags-D8lZ-C_U.js +1 -0
  79. package/dist/elements/chunks/chat-thread-B3Ks-cKr.js +1 -0
  80. package/dist/elements/chunks/check-C8desc_h.js +1 -0
  81. package/dist/elements/chunks/chevron-down-DKtc2HNB.js +1 -0
  82. package/dist/elements/chunks/chevron-right-Dw4GPhwL.js +1 -0
  83. package/dist/elements/chunks/choice-card-Q9cYYDyM.js +1 -0
  84. package/dist/elements/chunks/circle-BeokBsvB.js +1 -0
  85. package/dist/elements/chunks/circle-check-wJSqt859.js +1 -0
  86. package/dist/elements/chunks/{circle-x-B7faJFlY.js → circle-x-D0MEfxOM.js} +1 -1
  87. package/dist/elements/chunks/code-block-C8VzAraE.js +1 -0
  88. package/dist/elements/chunks/{collapsible-DM1Ckd4e.js → collapsible-Cvj61obE.js} +1 -1
  89. package/dist/elements/chunks/{composer-BguS0QL_.js → composer-D86ztyL0.js} +2 -2
  90. package/dist/elements/chunks/confirm-card-BdyDAGLw.js +1 -0
  91. package/dist/elements/chunks/context-WHDl-xSx.js +1 -0
  92. package/dist/elements/chunks/conversation-list-CdR14_Y4.js +1 -0
  93. package/dist/elements/chunks/create-tween-C_A_B638.js +7 -0
  94. package/dist/elements/chunks/{default-input-Cqqilg9t.js → default-input-CSZqUM81.js} +1 -1
  95. package/dist/elements/chunks/define-BzPnNsXg.js +1 -0
  96. package/dist/elements/chunks/{disclosure-CIZ5c8nO.js → disclosure-DVKsoc1F.js} +1 -1
  97. package/dist/elements/chunks/{download-Dsbg3ste.js → download-BjA54IMJ.js} +1 -1
  98. package/dist/elements/chunks/{dropdown-BDd1-Zgi.js → dropdown-BjVVHWXH.js} +1 -1
  99. package/dist/elements/chunks/{ellipsis-Dw6qrss-.js → ellipsis-BNedmqfi.js} +1 -1
  100. package/dist/elements/chunks/embed-DQsl4XEq.js +1 -0
  101. package/dist/elements/chunks/{external-link-Vt74zAoL.js → external-link-Di-dw2CU.js} +1 -1
  102. package/dist/elements/chunks/{file-text-CZrZF6_v.js → file-text-B3sAODCV.js} +1 -1
  103. package/dist/elements/chunks/{file-tree-DF4okKyo.js → file-tree-Dgto-bMn.js} +1 -1
  104. package/dist/elements/chunks/{folder-glP5rha4.js → folder-D6rMadFV.js} +1 -1
  105. package/dist/elements/chunks/form-CILxvhQ7.js +1 -0
  106. package/dist/elements/chunks/hover-card-BtiF4XiU.js +1 -0
  107. package/dist/elements/chunks/{icon-BLb8beoi.js → icon-DKkmze3y.js} +1 -1
  108. package/dist/elements/chunks/{info-CIsv92JK.js → info-CWRjZkuy.js} +1 -1
  109. package/dist/elements/chunks/{input-Dds1kFyt.js → input--QJBK6BA.js} +1 -1
  110. package/dist/elements/chunks/{kbd-De_xbgi9.js → kbd-C3zuKh8R.js} +1 -1
  111. package/dist/elements/chunks/{link-i4r_k7z4.js → link-BL5JA7Q0.js} +1 -1
  112. package/dist/elements/chunks/link-preview-CU37bbXh.js +1 -0
  113. package/dist/elements/chunks/{loader-BmQH4s3V.js → loader-XmpyxyRH.js} +1 -1
  114. package/dist/elements/chunks/{markdown-Zi21WhUz.js → markdown-3Gv5UZ_o.js} +1 -1
  115. package/dist/elements/chunks/message-CnBA2OUt.js +1 -0
  116. package/dist/elements/chunks/message-X5NZbq-W.js +1 -0
  117. package/dist/elements/chunks/message-square-CnpAm_P0.js +1 -0
  118. package/dist/elements/chunks/{minimize-2--ifeCGrl.js → minimize-2-DwyrUTcM.js} +1 -1
  119. package/dist/elements/chunks/{model-switcher-B94YAKsM.js → model-switcher-CclaJEHt.js} +1 -1
  120. package/dist/elements/chunks/{overlay-kD8dwRv_.js → overlay-Cepd-KcS.js} +1 -1
  121. package/dist/elements/chunks/{paperclip-q21dYOSK.js → paperclip-CdwKjrlu.js} +1 -1
  122. package/dist/elements/chunks/{progress-bar-BrAIIaaJ.js → progress-bar-DMVXBD3b.js} +1 -1
  123. package/dist/elements/chunks/{prompt-suggestion-Bjn2K-fR.js → prompt-suggestion-Di_WZE_5.js} +1 -1
  124. package/dist/elements/chunks/reasoning-D0jMch5u.js +1 -0
  125. package/dist/elements/chunks/{resizable-Dp4JExql.js → resizable-1znbL1Gv.js} +1 -1
  126. package/dist/elements/chunks/{rotate-cw-CFWWkpj2.js → rotate-cw-DVhhgx8n.js} +1 -1
  127. package/dist/elements/chunks/{scroll-area-Bb0kHH1j.js → scroll-area-Bs4bFS1P.js} +1 -1
  128. package/dist/elements/chunks/scroll-button-Bet5NLc4.js +1 -0
  129. package/dist/elements/chunks/{separator-9kRgr1X9.js → separator-C5Gh8qGC.js} +1 -1
  130. package/dist/elements/chunks/{settings-B8lmec4D.js → settings-5vmEFg0K.js} +1 -1
  131. package/dist/elements/chunks/{settings-group-I0hEuXiN.js → settings-group-BWLB38kz.js} +1 -1
  132. package/dist/elements/chunks/{share-C3lTiYGt.js → share-BZ3G_DaB.js} +1 -1
  133. package/dist/elements/chunks/skeleton-DafPJQTp.js +1 -0
  134. package/dist/elements/chunks/slots-CIw9RlAe.js +1 -0
  135. package/dist/elements/chunks/source-D_qj_6uJ.js +1 -0
  136. package/dist/elements/chunks/{star-CSJtGxgv.js → star-Cuv7j2IE.js} +1 -1
  137. package/dist/elements/chunks/{store-CHyW95TP.js → store-C1StPHfW.js} +1 -1
  138. package/dist/elements/chunks/tasks-card-EyoBZfpA.js +1 -0
  139. package/dist/elements/chunks/{text-shimmer-Cn9TmNpI.js → text-shimmer-D9gRSh34.js} +1 -1
  140. package/dist/elements/chunks/textarea-DuhtHfcm.js +1 -0
  141. package/dist/elements/chunks/{thumbs-up-PNVVThEF.js → thumbs-up-B9hwv43w.js} +1 -1
  142. package/dist/elements/chunks/{toast-store-DKbQn3Wn.js → toast-store-Bm3DUEDe.js} +1 -1
  143. package/dist/elements/chunks/{tool-DjTRpIpl.js → tool-CDtW7L0z.js} +1 -1
  144. package/dist/elements/chunks/tooltip-eB226mGK.js +1 -0
  145. package/dist/elements/chunks/{triangle-alert-DsHTHCPm.js → triangle-alert-C1SNzTqK.js} +1 -1
  146. package/dist/elements/chunks/use-card-resolution-YZh2MvI5.js +1 -0
  147. package/dist/elements/chunks/{variant-aurora-Dc4nQUia.js → variant-aurora-Cj1F7D0l.js} +2 -2
  148. package/dist/elements/chunks/{variant-custom-y_3kVQhS.js → variant-custom-T9gpt7QE.js} +1 -1
  149. package/dist/elements/chunks/{variant-wave-D5OR1-9Z.js → variant-wave-CxU9z-TE.js} +2 -2
  150. package/dist/elements/chunks/{video-B7vmenoC.js → video-CK4R7Rus.js} +1 -1
  151. package/dist/elements/chunks/x-D1qx0aLd.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 +7 -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 +2 -2
  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/slots.d.ts +16 -0
  208. package/dist/elements/source.js +1 -1
  209. package/dist/elements/status.js +1 -1
  210. package/dist/elements/switch.js +1 -1
  211. package/dist/elements/tabs.js +1 -1
  212. package/dist/elements/tasks.js +1 -1
  213. package/dist/elements/text-shimmer.js +1 -1
  214. package/dist/elements/thinking-bar.js +1 -1
  215. package/dist/elements/thread.js +1 -1
  216. package/dist/elements/toast.js +1 -1
  217. package/dist/elements/tool.js +1 -1
  218. package/dist/elements/tooltip.js +1 -1
  219. package/dist/elements/validate-messages.d.ts +25 -0
  220. package/dist/elements/voice-input.js +1 -1
  221. package/dist/elements/voice-output.js +1 -1
  222. package/dist/elements.d.ts +2725 -214
  223. package/dist/index.d.ts +163 -125
  224. package/dist/index.js +6336 -5802
  225. package/dist/index.server.d.ts +5 -0
  226. package/dist/index.server.js +5446 -4937
  227. package/dist/kai-provider.es.d.ts +5 -0
  228. package/dist/kai-provider.es.js +79 -77
  229. package/dist/kai.es.d.ts +5 -0
  230. package/dist/kai.es.js +1 -1
  231. package/dist/llms/llms-full.txt +762 -148
  232. package/dist/llms/llms.txt +57 -5
  233. package/dist/mcp.es.js +4010 -770
  234. package/dist/primitives/card-component-types.d.ts +11 -0
  235. package/dist/primitives/card-data-types.d.ts +196 -0
  236. package/dist/primitives/card-host.d.ts +1 -1
  237. package/dist/primitives/card-recovery.d.ts +3 -3
  238. package/dist/primitives/card-registry.d.ts +4 -14
  239. package/dist/primitives/card-resolution.d.ts +1 -1
  240. package/dist/primitives/card-routing.d.ts +1 -1
  241. package/dist/primitives/card-tags.d.ts +11 -0
  242. package/dist/primitives/card-validate-cards.d.ts +57 -0
  243. package/dist/primitives/card-validate-generator.testlib.d.ts +20 -0
  244. package/dist/primitives/card-validate-schemas.d.ts +17 -0
  245. package/dist/primitives/card-validate.d.ts +24 -0
  246. package/dist/primitives/create-kai-chat.d.ts +3 -3
  247. package/dist/primitives/embed-providers.d.ts +1 -1
  248. package/dist/primitives/link-preview.d.ts +1 -1
  249. package/dist/primitives/message-feedback.d.ts +2 -2
  250. package/dist/primitives/toast-store.d.ts +1 -1
  251. package/dist/react/index.d.ts +717 -299
  252. package/dist/react/use-kai-chat.d.ts +8 -4
  253. package/dist/react.d.ts +5 -0
  254. package/dist/react.js +417 -316
  255. package/dist/register-impl-bzrZ44ft.js +145 -0
  256. package/dist/remote/host-embed.d.ts +1 -1
  257. package/dist/remote/index.d.ts +2 -2
  258. package/dist/remote/provider-runtime.d.ts +2 -2
  259. package/dist/remote/provider.d.ts +2 -2
  260. package/dist/remote/validate.d.ts +1 -1
  261. package/dist/remote/wire.d.ts +1 -1
  262. package/dist/schemas/artifact.schema.json +92 -0
  263. package/dist/schemas/embed.schema.json +0 -2
  264. package/dist/schemas/from-tool-call.d.ts +48 -0
  265. package/dist/schemas/index.d.ts +48 -0
  266. package/dist/schemas/link.schema.json +0 -2
  267. package/dist/schemas/provider-subsets.d.ts +136 -0
  268. package/dist/schemas/registry.d.ts +140 -0
  269. package/dist/schemas/tool-defs.d.ts +121 -0
  270. package/dist/schemas.d.ts +5 -0
  271. package/dist/schemas.js +717 -0
  272. package/dist/solid-BCJUQqwS.js +22750 -0
  273. package/dist/solid-BdENBcEq.js +20108 -0
  274. package/dist/solid.d.ts +66 -0
  275. package/dist/solid.js +261 -0
  276. package/dist/solid.server.d.ts +5 -0
  277. package/dist/solid.server.js +261 -0
  278. package/dist/state/index.d.ts +14 -4
  279. package/dist/state/messages.d.ts +8 -3
  280. package/dist/state/mock.d.ts +46 -0
  281. package/dist/state/parts.d.ts +85 -0
  282. package/dist/state/stream.d.ts +15 -9
  283. package/dist/state.d.ts +5 -0
  284. package/dist/state.js +253 -84
  285. package/dist/ui/action-icons.d.ts +1 -1
  286. package/dist/ui/collapsible.d.ts +11 -6
  287. package/dist/ui/dropdown.d.ts +47 -42
  288. package/dist/ui/pane-group.d.ts +1 -1
  289. package/dist/variant-aurora-1wMcXRUS.js +381 -0
  290. package/dist/variant-aurora-BKHHiOgL.js +391 -0
  291. package/dist/{variant-aurora-DVtGqVH6.js → variant-aurora-DOb_o4pC.js} +1 -1
  292. package/dist/{variant-custom-Dif-IV4u.js → variant-custom-CJGB0Kbw.js} +1 -1
  293. package/dist/variant-custom-Co0CkXJF.js +200 -0
  294. package/dist/variant-custom-DWSSgmd2.js +170 -0
  295. package/dist/variant-wave-C3-45cL6.js +218 -0
  296. package/dist/{variant-wave-DbfNdvSi.js → variant-wave-CEODq-9q.js} +1 -1
  297. package/dist/variant-wave-jdXBnCUZ.js +208 -0
  298. package/dist/wire/chunk.d.ts +171 -0
  299. package/dist/wire/consume.d.ts +26 -0
  300. package/dist/wire/encode.d.ts +148 -0
  301. package/dist/wire/formats/anthropic.d.ts +2 -0
  302. package/dist/wire/formats/openai.d.ts +5 -0
  303. package/dist/wire/index.d.ts +14 -0
  304. package/dist/wire/read.d.ts +26 -0
  305. package/dist/wire/sink-helpers.d.ts +21 -0
  306. package/dist/wire/sse.d.ts +33 -0
  307. package/dist/wire.d.ts +5 -53
  308. package/dist/wire.js +898 -0
  309. package/frameworks/react/index.tsx +183 -154
  310. package/frameworks/react/runtime.tsx +21 -1
  311. package/frameworks/react/use-kai-chat.tsx +11 -1
  312. package/llms-full.txt +762 -148
  313. package/llms.txt +57 -5
  314. package/package.json +61 -8
  315. package/src/agent-tooling/archetypes.ts +96 -0
  316. package/src/agent-tooling/integrations/anthropic.ts +412 -0
  317. package/src/agent-tooling/integrations/cloudflare.ts +136 -52
  318. package/src/agent-tooling/integrations/langgraph.ts +67 -13
  319. package/src/agent-tooling/integrations/mastra.ts +120 -12
  320. package/src/agent-tooling/integrations/mock.ts +43 -8
  321. package/src/agent-tooling/integrations/ollama.ts +61 -24
  322. package/src/agent-tooling/integrations/openai.ts +87 -0
  323. package/src/agent-tooling/integrations/openrouter.ts +56 -8
  324. package/src/agent-tooling/integrations/pi.ts +79 -23
  325. package/src/agent-tooling/integrations/pydantic-ai.ts +24 -2
  326. package/src/agent-tooling/integrations/vercel-ai-sdk.ts +84 -13
  327. package/src/agent-tooling/mcp/manifest.ts +206 -25
  328. package/src/agent-tooling/mcp/tools/debug.ts +13 -7
  329. package/src/agent-tooling/mcp/tools/reference.ts +285 -6
  330. package/src/agent-tooling/mcp/tools/scaffold.ts +3345 -675
  331. package/src/agent-tooling/registry.ts +17 -0
  332. package/src/agent-tooling/types.ts +229 -1
  333. package/src/components/artifact-card.tsx +120 -0
  334. package/src/components/audio-visualizer/index.tsx +9 -0
  335. package/src/components/audio-visualizer/labs/lab-choreography.ts +187 -0
  336. package/src/components/audio-visualizer/labs/lab-shaders.ts +363 -0
  337. package/src/components/audio-visualizer/labs/lab-visualizer.tsx +102 -0
  338. package/src/components/audio-visualizer/shader-canvas.tsx +31 -1
  339. package/src/components/card-fallback.tsx +42 -10
  340. package/src/components/card-renderer.tsx +146 -9
  341. package/src/components/chat-container.tsx +4 -0
  342. package/src/components/chat-thread.tsx +118 -51
  343. package/src/components/choice-card.tsx +17 -29
  344. package/src/components/composer.tsx +12 -2
  345. package/src/components/confirm-card.tsx +24 -20
  346. package/src/components/context.tsx +12 -4
  347. package/src/components/conversation-list.tsx +18 -2
  348. package/src/components/file-tree.tsx +11 -22
  349. package/src/components/file-upload.tsx +14 -8
  350. package/src/components/form.tsx +14 -47
  351. package/src/components/loader.tsx +39 -12
  352. package/src/components/message-skills.tsx +4 -0
  353. package/src/components/message.tsx +294 -46
  354. package/src/components/reasoning.tsx +92 -5
  355. package/src/components/response-compare-types.ts +25 -0
  356. package/src/components/response-compare.tsx +4 -9
  357. package/src/components/source.tsx +50 -24
  358. package/src/components/tasks-card.tsx +10 -33
  359. package/src/components/thread.tsx +84 -42
  360. package/src/components/toast.tsx +11 -5
  361. package/src/components/tool-classify.ts +26 -0
  362. package/src/components/tool-types.ts +31 -1
  363. package/src/elements/agent-card.tsx +11 -11
  364. package/src/elements/artifact.tsx +15 -7
  365. package/src/elements/attachments.tsx +6 -4
  366. package/src/elements/avatar.tsx +1 -1
  367. package/src/elements/button.tsx +3 -3
  368. package/src/elements/card.tsx +2 -2
  369. package/src/elements/cards.tsx +109 -14
  370. package/src/elements/chain-of-thought.tsx +14 -10
  371. package/src/elements/chat-scope-picker.tsx +9 -7
  372. package/src/elements/chat-types.ts +59 -6
  373. package/src/elements/chat-workspace.tsx +50 -9
  374. package/src/elements/chat.tsx +64 -3
  375. package/src/elements/choice.tsx +8 -8
  376. package/src/elements/coachmark.tsx +1 -1
  377. package/src/elements/command.tsx +8 -23
  378. package/src/elements/compare.tsx +7 -6
  379. package/src/elements/compiled.css +1 -1
  380. package/src/elements/composer.tsx +8 -8
  381. package/src/elements/confirm-card.tsx +9 -9
  382. package/src/elements/context-meter.tsx +4 -18
  383. package/src/elements/conversation-list.tsx +14 -9
  384. package/src/elements/default-input.tsx +3 -3
  385. package/src/elements/define.tsx +178 -43
  386. package/src/elements/editable-label.tsx +17 -2
  387. package/src/elements/element-data-types.ts +112 -0
  388. package/src/elements/element-meta.json +1596 -304
  389. package/src/elements/element-types.d.ts +2636 -211
  390. package/src/elements/feedback-bar.tsx +1 -1
  391. package/src/elements/file-tree.tsx +1 -1
  392. package/src/elements/file-upload.tsx +1 -1
  393. package/src/elements/form.tsx +14 -6
  394. package/src/elements/input.tsx +1 -1
  395. package/src/elements/kbd.tsx +1 -1
  396. package/src/elements/menu.tsx +10 -29
  397. package/src/elements/message-skills.tsx +7 -9
  398. package/src/elements/message.tsx +200 -32
  399. package/src/elements/model-switcher.tsx +5 -3
  400. package/src/elements/pane.tsx +1 -1
  401. package/src/elements/prompt-dock.tsx +8 -8
  402. package/src/elements/prompt-input.tsx +10 -10
  403. package/src/elements/prompt-suggestions.tsx +7 -4
  404. package/src/elements/reasoning.tsx +1 -1
  405. package/src/elements/register.ts +9 -0
  406. package/src/elements/resizable.globals.d.ts +36 -0
  407. package/src/elements/resizable.tsx +24 -13
  408. package/src/elements/response-stream.tsx +1 -1
  409. package/src/elements/scroll-button.tsx +1 -1
  410. package/src/elements/search.tsx +6 -1
  411. package/src/elements/segmented.tsx +5 -11
  412. package/src/elements/separator.tsx +1 -1
  413. package/src/elements/slots.ts +57 -24
  414. package/src/elements/source.tsx +21 -22
  415. package/src/elements/switch.tsx +3 -3
  416. package/src/elements/tasks.tsx +5 -4
  417. package/src/elements/thread.tsx +36 -4
  418. package/src/elements/toast.tsx +3 -2
  419. package/src/elements/tool.tsx +1 -1
  420. package/src/elements/validate-messages.ts +76 -0
  421. package/src/elements/voice-input.tsx +7 -7
  422. package/src/elements/voice-output.tsx +4 -4
  423. package/src/index.ts +141 -6
  424. package/src/primitives/card-component-types.ts +63 -0
  425. package/src/primitives/card-data-types.ts +312 -0
  426. package/src/primitives/card-recovery.ts +13 -2
  427. package/src/primitives/card-registry.tsx +34 -23
  428. package/src/primitives/card-schemas/artifact.schema.json +92 -0
  429. package/src/primitives/card-schemas/embed.schema.json +0 -2
  430. package/src/primitives/card-schemas/link.schema.json +0 -2
  431. package/src/primitives/card-tags.ts +61 -0
  432. package/src/primitives/card-validate-cards.ts +255 -0
  433. package/src/primitives/card-validate-generator.testlib.ts +38 -0
  434. package/src/primitives/card-validate-schemas.ts +58 -0
  435. package/src/primitives/card-validate.ts +48 -20
  436. package/src/primitives/create-tween.ts +54 -2
  437. package/src/primitives/message-feedback.ts +3 -2
  438. package/src/primitives/use-audio-analysis.ts +20 -1
  439. package/src/primitives/use-sequencer.ts +20 -1
  440. package/src/schemas/from-tool-call.ts +151 -0
  441. package/src/schemas/index.ts +340 -0
  442. package/src/schemas/provider-subsets.ts +538 -0
  443. package/src/schemas/registry.ts +355 -0
  444. package/src/schemas/tool-defs.ts +492 -0
  445. package/src/solid.ts +150 -0
  446. package/src/state/index.ts +27 -1
  447. package/src/state/messages.ts +21 -4
  448. package/src/state/mock.ts +211 -0
  449. package/src/state/parts.ts +295 -0
  450. package/src/state/stream.ts +56 -58
  451. package/src/ui/collapsible.tsx +17 -5
  452. package/src/ui/dropdown.tsx +46 -12
  453. package/src/ui/overlay.tsx +10 -4
  454. package/src/wire/chunk.ts +201 -0
  455. package/src/wire/consume.ts +440 -0
  456. package/src/wire/encode.ts +474 -0
  457. package/src/wire/formats/anthropic.ts +267 -0
  458. package/src/wire/formats/openai.ts +187 -0
  459. package/src/wire/index.ts +52 -0
  460. package/src/wire/read.ts +152 -0
  461. package/src/wire/sink-helpers.ts +50 -0
  462. package/src/wire/sse.ts +140 -0
  463. package/dist/create-tween-hvpmSuwW.js +0 -7
  464. package/dist/elements/chunks/arrow-left-DQocUFvy.js +0 -1
  465. package/dist/elements/chunks/audio-visualizer-BqNy7dfm.js +0 -1
  466. package/dist/elements/chunks/card-BkHbp4BA.js +0 -1
  467. package/dist/elements/chunks/chat-thread-CkRN6pZ7.js +0 -1
  468. package/dist/elements/chunks/check-B9-gn6SS.js +0 -1
  469. package/dist/elements/chunks/chevron-down-BNsxc2hk.js +0 -1
  470. package/dist/elements/chunks/chevron-right-Hv00StBO.js +0 -1
  471. package/dist/elements/chunks/circle-0e3KJTDr.js +0 -1
  472. package/dist/elements/chunks/circle-check-BNAS0JEy.js +0 -1
  473. package/dist/elements/chunks/code-block-BFUHn6Va.js +0 -1
  474. package/dist/elements/chunks/context-Cb7k4F-v.js +0 -1
  475. package/dist/elements/chunks/conversation-list-CvoAkWhN.js +0 -1
  476. package/dist/elements/chunks/create-tween-oVvAIG8r.js +0 -7
  477. package/dist/elements/chunks/define-D1din7Ld.js +0 -1
  478. package/dist/elements/chunks/hover-card-Cmm6Q53m.js +0 -1
  479. package/dist/elements/chunks/message-BqyXDN3-.js +0 -1
  480. package/dist/elements/chunks/message-feedback-Djr3z6Yb.js +0 -1
  481. package/dist/elements/chunks/message-square-vFAgbDaX.js +0 -1
  482. package/dist/elements/chunks/reasoning-DTpCGtnY.js +0 -1
  483. package/dist/elements/chunks/scroll-button-B0cH5fXf.js +0 -1
  484. package/dist/elements/chunks/skeleton-DSXW5Yya.js +0 -1
  485. package/dist/elements/chunks/slots--V19HwUb.js +0 -1
  486. package/dist/elements/chunks/textarea-CUwqAX0G.js +0 -1
  487. package/dist/elements/chunks/tooltip-CgBZCVKp.js +0 -1
  488. package/dist/elements/chunks/use-card-resolution-BSu_XHjH.js +0 -1
  489. package/dist/elements/chunks/x-GRUeeQFT.js +0 -1
  490. package/dist/host-embed.d.ts +0 -33
  491. package/dist/kai-provider.d.ts +0 -2
  492. package/dist/origin.d.ts +0 -5
  493. package/dist/provider-runtime.d.ts +0 -27
  494. package/dist/register-impl-DQyejdfb.js +0 -145
  495. package/dist/validate.d.ts +0 -4
  496. package/dist/version.d.ts +0 -4
  497. package/src/components/component-meta.json +0 -4550
  498. package/src/elements/card-media.jpg +0 -0
  499. package/src/elements/resizable.d.ts +0 -27
  500. package/src/elements/video-poster.jpg +0 -0
@@ -1,6 +1,16 @@
1
1
  import { z } from 'zod';
2
+ import {
3
+ KAI_TOOL_PREFIX,
4
+ cardSchemaNames,
5
+ cardSchemas,
6
+ cardTools,
7
+ isCardSchemaName,
8
+ toolNameForCardType,
9
+ } from '@kitn.ai/ui/schemas';
10
+ import type { CardSchemaName, ToolProvider } from '@kitn.ai/ui/schemas';
2
11
  import type { Tool } from './types';
3
- import { getElement, listElements } from '../manifest';
12
+ import { cardHostTags, cardTagForType, cardTypeForTag, getElement, listElements } from '../manifest';
13
+ import type { CemMember } from '../manifest';
4
14
 
5
15
  /**
6
16
  * component_reference — look up AI/UI (kai-*) web components, their props,
@@ -10,6 +20,10 @@ import { getElement, listElements } from '../manifest';
10
20
  * Backed by manifest.ts which resolves the CEM in both the bundled bin
11
21
  * (dist/mcp.es.js sibling) and the Vitest source context (walks up to find
12
22
  * dist/custom-elements.json in the repo root).
23
+ *
24
+ * For a card-backed element it also serves the card's JSON Schema and a tool
25
+ * definition GENERATED by `cardTools()`. See `renderCardContract` for why not one
26
+ * byte of that is written here as a literal.
13
27
  */
14
28
 
15
29
  /** Types that warrant the JS-property contract note. */
@@ -19,7 +33,199 @@ function isJsOnlyType(typeText: string | undefined): boolean {
19
33
  return typeText ? JS_ONLY_TYPE_PATTERNS.test(typeText) : false;
20
34
  }
21
35
 
22
- function formatReference(tag: string): string {
36
+ // ─────────────────────────────────────────────────────────────────────────────
37
+ // The imperative half of the interaction surface
38
+ // ─────────────────────────────────────────────────────────────────────────────
39
+
40
+ /**
41
+ * A CEM member of `kind: 'method'`.
42
+ *
43
+ * `CemMember` in manifest.ts types what EVERY member carries. `parameters` and
44
+ * `return` exist only on methods, and gen-element-api.mjs writes the AUTHORED
45
+ * parameter list into a single `parameters[0].name` rather than splitting it, so
46
+ * the signature is rebuilt from those two fields rather than read off one.
47
+ */
48
+ interface CemMethodMember extends CemMember {
49
+ kind: 'method';
50
+ parameters?: { name: string }[];
51
+ return?: { type?: { text?: string } };
52
+ }
53
+
54
+ function isPublicMethod(member: CemMember): member is CemMethodMember {
55
+ return member.kind === 'method' && member.privacy === 'public';
56
+ }
57
+
58
+ /** `maximize(index: number): void` — the call as a consumer types it. */
59
+ function methodSignature(method: CemMethodMember): string {
60
+ return `${method.name}(${method.parameters?.[0]?.name ?? ''}): ${method.return?.type?.text ?? 'void'}`;
61
+ }
62
+
63
+ // ─────────────────────────────────────────────────────────────────────────────
64
+ // The card contract
65
+ // ─────────────────────────────────────────────────────────────────────────────
66
+
67
+ const PROVIDERS = ['openai', 'anthropic', 'jsonschema'] as const;
68
+
69
+ /**
70
+ * What a caller gets when they do not name a provider.
71
+ *
72
+ * NOT a coin-flip between the two wire formats, and deliberately not "serve all
73
+ * three". The three envelopes are not interchangeable in a way a reader can patch
74
+ * up: OpenAI nests the schema at `function.parameters`, Anthropic puts it flat at
75
+ * `input_schema`. Handing over one of those unasked means a harness on the other
76
+ * provider pastes it in and gets a 400 it will blame on the kit.
77
+ *
78
+ * `jsonschema` is the only one of the three that is not a wire envelope at all —
79
+ * `{ name, description, schema }` cannot be mistaken for either provider's shape, so
80
+ * a caller who reads it as one is corrected by the field names before they ship it.
81
+ * It is also directly usable, not a booby prize: `tool({ inputSchema: jsonSchema(
82
+ * def.schema) })` is exactly what the Vercel AI SDK wants, and of the nine
83
+ * integrations this MCP scaffolds, exactly one (openrouter) posts a raw OpenAI-wire
84
+ * tools array; the rest go through an SDK or an agent framework that takes the bare
85
+ * schema.
86
+ *
87
+ * Serving all three was the other candidate and it loses on cost for no gain in
88
+ * safety: measured on this tree, one card's pretty-printed definition runs
89
+ * 1.7-5.3 KB, so three of them plus the schema turns a single `kai-artifact` lookup
90
+ * into roughly 20 KB of context. The response names all three modes and the exact
91
+ * call that produces each, so a caller who does know their provider is one re-ask
92
+ * away and still never invents an envelope.
93
+ */
94
+ const DEFAULT_PROVIDER: ToolProvider = 'jsonschema';
95
+
96
+ function isProvider(value: string): value is ToolProvider {
97
+ return (PROVIDERS as readonly string[]).includes(value);
98
+ }
99
+
100
+ /** Stable fence info strings, so a reader (and reference.test.ts) can lift the blocks back out exactly. */
101
+ const TOOL_FENCE = 'kai-tool-definition';
102
+ const SCHEMA_FENCE = 'kai-card-schema';
103
+
104
+ function fence(info: string, value: unknown): string[] {
105
+ return ['```json ' + info, JSON.stringify(value, null, 2), '```'];
106
+ }
107
+
108
+ /**
109
+ * Render a card type as it would be written in JS source.
110
+ *
111
+ * The seven built-ins are all bare identifiers, but a card type is whatever string a
112
+ * developer put in `CardEnvelope.type` — `pricing-table` is legal and reaches this
113
+ * code the day an eighth built-in is hyphenated. Emitting `{ pricing-table: … }` as a
114
+ * copy-paste sample would be a syntax error, so the quoting is decided, not assumed.
115
+ */
116
+ const BARE_IDENTIFIER = /^[A-Za-z_$][\w$]*$/;
117
+
118
+ function asKey(cardType: string): string {
119
+ return BARE_IDENTIFIER.test(cardType) ? cardType : JSON.stringify(cardType);
120
+ }
121
+
122
+ function asMember(cardType: string): string {
123
+ return BARE_IDENTIFIER.test(cardType) ? `.${cardType}` : `[${JSON.stringify(cardType)}]`;
124
+ }
125
+
126
+ /**
127
+ * The loop, in the four facts a harness cannot infer from a prop table.
128
+ *
129
+ * Shared by the card-backed and the card-host sections because they are the same
130
+ * contract seen from the two ends, and a second copy would be the drift this whole
131
+ * task exists to remove, one level up from the tool definition.
132
+ *
133
+ * `example` is the card the caller actually asked about, so the illustration is about
134
+ * their card rather than a fixed one they then have to translate.
135
+ */
136
+ function loopWiring(example: string): string[] {
137
+ return [
138
+ '',
139
+ '#### Wiring the loop',
140
+ `- **Tool names are \`${KAI_TOOL_PREFIX}<card type>\`.** \`${toolNameForCardType(example)}\` produces \`{ type: "${example}" }\`. ` +
141
+ 'Use `isCardTool(name)` to split card calls from your own tools; never match the prefix by hand.',
142
+ '- **`tool_call_id` becomes `CardEnvelope.id`, unchanged.** That is what makes a revision UPSERT: ' +
143
+ 'a model that re-sends the same tool call id replaces the card in place instead of rendering a second copy of it. ' +
144
+ 'Generating your own id breaks that silently.',
145
+ '- **`cardFromToolCall(name, input, { id: call.id })`** turns the call into a renderable envelope, ' +
146
+ 'or returns `null` when it is one of your own tools so the loop falls through to it. It never throws.',
147
+ '- **Everything above is one import:** `import { cardTools, cardFromToolCall, isCardTool } from \'@kitn.ai/ui/schemas\'`. ' +
148
+ `The raw documents also ship as JSON (\`@kitn.ai/ui/schemas/${example}.schema.json\`) for a Python or Go backend.`,
149
+ ];
150
+ }
151
+
152
+ /** The card-backed section: schema + a GENERATED tool definition. */
153
+ function renderCardContract(tag: string, cardType: CardSchemaName, provider: ToolProvider): string[] {
154
+ const schema = cardSchemas[cardType];
155
+
156
+ // GENERATED, NEVER RESTATED.
157
+ //
158
+ // This calls the same `cardTools` a consumer's route calls, on the same schema, so
159
+ // the definition served here cannot diverge from the one they ship — not when a
160
+ // schema gains a field, not when the projection changes what it strips. A literal
161
+ // typed into this file would read identically today and rot on the first schema
162
+ // change, which is exactly the hand-copy drift this tool exists to remove.
163
+ // reference.test.ts asserts byte-equality against BOTH `cardTools({ [type]: schema },
164
+ // …)` and the matching entry of the whole-registry `cardTools({ provider })`, so a
165
+ // hand-edit here fails a test rather than shipping.
166
+ const [def] = cardTools({ [cardType]: schema }, { provider });
167
+
168
+ const lines: string[] = [
169
+ '',
170
+ '### Card contract',
171
+ `\`<${tag}>\` renders \`CardEnvelope.type: "${cardType}"\`. A model does not emit an envelope; ` +
172
+ `it calls the tool \`${toolNameForCardType(cardType)}\`, and the kit turns that call back into one.`,
173
+ ];
174
+
175
+ lines.push(
176
+ '',
177
+ `#### Tool definition — provider \`${provider}\``,
178
+ `Generated by \`cardTools({ ${asKey(cardType)}: cardSchemas${asMember(cardType)} }, { provider: '${provider}' })\`. ` +
179
+ 'Copy it; do not retype it, and do not hand-maintain a second copy — regenerate instead.',
180
+ `Ask again with \`provider\` set to \`openai\`, \`anthropic\` or \`jsonschema\` for the other envelopes. ` +
181
+ 'They are NOT interchangeable: OpenAI nests the schema at `function.parameters`, Anthropic puts it flat at `input_schema`.',
182
+ ...fence(TOOL_FENCE, def),
183
+ );
184
+
185
+ lines.push(
186
+ '',
187
+ '#### Card data JSON Schema',
188
+ `\`import { cardSchemas } from '@kitn.ai/ui/schemas'\` → \`cardSchemas${asMember(cardType)}\`. ` +
189
+ `Raw document: \`@kitn.ai/ui/schemas/${cardType}.schema.json\`.`,
190
+ 'This is the authored contract, and it is what `registry.validate()` checks arriving data against. ' +
191
+ 'The tool definition above carries the same document with `$schema`, `$id` and `x-kai-*` stripped — ' +
192
+ 'that projection is `cardTools`\' job, so do not put a raw schema on the wire yourself.',
193
+ ...fence(SCHEMA_FENCE, schema),
194
+ );
195
+
196
+ lines.push(...loopWiring(cardType));
197
+ return lines;
198
+ }
199
+
200
+ /** The card-host section: no schema of its own, but this is where the props live. */
201
+ function renderCardHost(tag: string): string[] {
202
+ const rows = cardSchemaNames.map((type) => {
203
+ const cardTag = cardTagForType(type);
204
+ return `- \`${type}\` → \`<${cardTag ?? '(no element)'}>\`, tool \`${toolNameForCardType(type)}\``;
205
+ });
206
+
207
+ return [
208
+ '',
209
+ '### Card contract',
210
+ `\`<${tag}>\` renders generative-UI cards inside the thread. It is a HOST: it draws whatever ` +
211
+ 'envelopes arrive, and carries the two props that say what a card may be.',
212
+ '',
213
+ '- **`cardTypes`** — `Record<envelope type, custom element tag>`. What DRAWS a card. ' +
214
+ `Merged over the built-ins, so your entry overrides ours and the other ${cardSchemaNames.length - 1} still render.`,
215
+ '- **`cardSchemas`** — `Record<envelope type, JSON Schema>`. What a VALID card looks like. ' +
216
+ `This is the prop that carries YOUR OWN card schemas into the browser validator; the ${cardSchemaNames.length} built-ins are already known. ` +
217
+ 'Both are objects, so both are JS properties (`el.cardSchemas = …`), never HTML attributes.',
218
+ '',
219
+ 'Write both once with `createCardRegistry({ use, custom })` from `@kitn.ai/ui/schemas` and thread it to both ends: ' +
220
+ '`el.cardTypes = cards.tags` / `el.cardSchemas = cards.validationSchemas` on the client, `cardTools(cards, { provider })` on the route.',
221
+ '',
222
+ 'Built-in card types (ask `component_reference` for one of these tags to get its schema and tool definition):',
223
+ ...rows,
224
+ ...loopWiring(cardSchemaNames[0]),
225
+ ];
226
+ }
227
+
228
+ function formatReference(tag: string, provider: ToolProvider): string {
23
229
  const el = getElement(tag);
24
230
 
25
231
  if (!el) {
@@ -50,6 +256,17 @@ function formatReference(tag: string): string {
50
256
  'and read `event.detail` for the payload.',
51
257
  );
52
258
 
259
+ // ── Card contract ─────────────────────────────────────────────────────────
260
+ // Attached to the two populations manifest.ts derives, and to nothing else. A
261
+ // reference that hangs card material off all 80 elements is worse than one that
262
+ // hangs it off none: it teaches a harness that every element takes a tool call.
263
+ const cardType = cardTypeForTag(tag);
264
+ if (cardType !== undefined && isCardSchemaName(cardType)) {
265
+ lines.push(...renderCardContract(tag, cardType, provider));
266
+ } else if (cardHostTags().includes(tag)) {
267
+ lines.push(...renderCardHost(tag));
268
+ }
269
+
53
270
  // ── Public JS properties ───────────────────────────────────────────────────
54
271
  const publicFields = (el.members ?? []).filter(
55
272
  (m) => m.kind === 'field' && m.privacy === 'public',
@@ -93,6 +310,25 @@ function formatReference(tag: string): string {
93
310
  }
94
311
  }
95
312
 
313
+ // ── Methods ───────────────────────────────────────────────────────────────
314
+ // The input half of the interaction surface. These were in the manifest and in
315
+ // the shipped types and rendered in NO reference, so the only way to find one
316
+ // was to read the kit's source.
317
+ const methods = (el.members ?? []).filter(isPublicMethod);
318
+ if (methods.length > 0) {
319
+ lines.push(
320
+ '',
321
+ '### Methods (call these on the element instance)',
322
+ `Get the element (\`const el = document.querySelector('${tag}')\`), then call it. ` +
323
+ 'Methods drive the element from your code; the events above report back what the ' +
324
+ 'user did. Both are public API.',
325
+ );
326
+ for (const method of methods) {
327
+ const desc = method.description?.trim() ?? '';
328
+ lines.push(`- **${methodSignature(method)}**${desc ? ` — ${desc}` : ''}`);
329
+ }
330
+ }
331
+
96
332
  // ── CSS custom properties ─────────────────────────────────────────────────
97
333
  const cssProps = el.cssProperties ?? [];
98
334
  if (cssProps.length > 0) {
@@ -142,21 +378,64 @@ function formatReference(tag: string): string {
142
378
  export const reference: Tool = {
143
379
  name: 'component_reference',
144
380
  description:
145
- 'Look up AI/UI (kai-*) web components: their tags, props, events, and usage examples.',
146
- inputSchema: z.object({ name: z.string().optional() }),
381
+ 'Look up AI/UI (kai-*) web components: their tags, props, events, imperative methods, and usage examples. ' +
382
+ 'For a card-backed element it also returns the card\'s JSON Schema and a ready-to-send ' +
383
+ 'tool definition generated from it — pass `provider` to get that provider\'s envelope.',
384
+ inputSchema: z.object({
385
+ name: z.string().optional(),
386
+ provider: z
387
+ .enum(PROVIDERS)
388
+ .optional()
389
+ .describe(
390
+ 'Which tool-definition envelope to project for a card-backed element. ' +
391
+ `Defaults to "${DEFAULT_PROVIDER}", the provider-neutral { name, description, schema } form.`,
392
+ ),
393
+ }),
147
394
  handler: async (args: Record<string, unknown>) => {
148
395
  const name = typeof args.name === 'string' ? args.name.trim() : undefined;
149
396
 
397
+ // Validated HERE, not left to the zod schema above. server.ts advertises
398
+ // `inputSchema` over the protocol but hands `request.params.arguments` straight
399
+ // to this handler without parsing it, so an unrecognised provider would reach
400
+ // `cardTools`, which treats anything that is not "openai"/"anthropic" as the
401
+ // jsonschema branch. A caller asking for "gemini" would then get a definition in
402
+ // a shape they did not ask for, with nothing saying so. Refusing is the only
403
+ // answer that cannot be mistaken for an answer.
404
+ const rawProvider = args.provider;
405
+ if (rawProvider !== undefined && (typeof rawProvider !== 'string' || !isProvider(rawProvider))) {
406
+ return {
407
+ content: [
408
+ {
409
+ type: 'text' as const,
410
+ text:
411
+ `Unknown provider: ${JSON.stringify(rawProvider)}\n\n` +
412
+ `Valid providers are ${PROVIDERS.map((p) => `"${p}"`).join(', ')}. ` +
413
+ `Omit it to get "${DEFAULT_PROVIDER}", the provider-neutral { name, description, schema } form ` +
414
+ 'that the Vercel AI SDK and most agent frameworks take directly.\n' +
415
+ 'No tool definition was returned, because guessing which envelope you meant would hand you ' +
416
+ 'a shape your provider rejects with nothing saying why.',
417
+ },
418
+ ],
419
+ };
420
+ }
421
+ const provider: ToolProvider = rawProvider ?? DEFAULT_PROVIDER;
422
+
150
423
  let text: string;
151
424
 
152
425
  if (!name || name === 'list') {
153
426
  const tags = listElements();
427
+ const cardRows = cardSchemaNames
428
+ .map((t) => cardTagForType(t))
429
+ .filter((t): t is string => t !== undefined);
154
430
  text =
155
431
  `AI/UI elements (${tags.length} total):\n\n` +
156
432
  tags.map((t) => ` ${t}`).join('\n') +
157
- '\n\nCall component_reference with a specific name (e.g. { name: "kai-chat" }) for full API details.';
433
+ '\n\nCall component_reference with a specific name (e.g. { name: "kai-chat" }) for full API details.' +
434
+ `\n\nCard-backed elements — ask for one of these to get its JSON Schema and a generated ` +
435
+ `\`${KAI_TOOL_PREFIX}*\` tool definition:\n ${cardRows.join(', ')}` +
436
+ `\nThe elements that HOST them (and carry the \`cardTypes\` / \`cardSchemas\` props): ${cardHostTags().join(', ')}`;
158
437
  } else {
159
- text = formatReference(name);
438
+ text = formatReference(name, provider);
160
439
  }
161
440
 
162
441
  return { content: [{ type: 'text' as const, text }] };