@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
@@ -469,11 +469,21 @@ export function Composer(props: ComposerProps): JSX.Element {
469
469
  const handleBlur = (e: FocusEvent) => { focused = false; clearPillSelection(); props.onBlur?.(e); };
470
470
 
471
471
  onMount(() => {
472
+ // Captured at SETUP and closed over, never re-resolved as a global inside
473
+ // `onCleanup`: cleanup can run after the host removed the DOM globals (a
474
+ // `kai-*` release is deferred one microtask past detachment, so an
475
+ // environment teardown gets in between), and a bare `document` there throws
476
+ // -- from a promise nobody holds, so it lands as an unhandled rejection that
477
+ // fails the run while every test passes. That is how this was found.
478
+ // See tests/components/teardown-without-dom-globals.test.tsx.
479
+ // `ownerDocument` rather than a captured `document`, matching the rest of
480
+ // this file and staying correct for a composer inside an iframe.
481
+ const doc = editable.ownerDocument;
472
482
  const onSelectionChange = () => {
473
483
  if (focused) updateTriggerState();
474
484
  };
475
- document.addEventListener('selectionchange', onSelectionChange);
476
- onCleanup(() => document.removeEventListener('selectionchange', onSelectionChange));
485
+ doc.addEventListener('selectionchange', onSelectionChange);
486
+ onCleanup(() => doc.removeEventListener('selectionchange', onSelectionChange));
477
487
  });
478
488
 
479
489
  // --- Imperative controller (Pattern C): hand the facade a handle over the
@@ -21,29 +21,33 @@ import { useCardHost } from '../primitives/card-host';
21
21
  import { AlertTriangle, Check, X } from 'lucide-solid';
22
22
 
23
23
  // ─────────────────────────────────────────────────────────────────────────────
24
- // Types (confirm.schema.json) — see src/primitives/card-schemas/confirm.schema.json
24
+ // Types (confirm.schema.json) — AUTHORED IN ../primitives/card-data-types.ts.
25
+ //
26
+ // They used to be declared here, and moving them is the fourth instance of the
27
+ // split card-tags.ts and card-component-types.ts already made twice: a type
28
+ // import still has to RESOLVE, so while these lived in a `.tsx` no Node/no-DOM
29
+ // project could name them (TS6142), which meant `@kitn.ai/ui/schemas` could not
30
+ // re-export them and a TypeScript backend building a card envelope got
31
+ // `data: unknown` while Python and Go read the full shape out of the published
32
+ // JSON Schemas. They are also `type` aliases rather than `interface`s now, which
33
+ // is what makes `el.data = myConfirmCardData` compile — see that file's header
34
+ // for both measurements. Re-exported here, so this module's surface is unchanged.
25
35
  // ─────────────────────────────────────────────────────────────────────────────
26
36
 
27
- export type ConfirmActionStyle = 'primary' | 'default' | 'destructive';
28
- export type ConfirmTone = 'default' | 'warning' | 'danger';
37
+ import type {
38
+ ConfirmAction,
39
+ ConfirmActionStyle,
40
+ ConfirmCardData,
41
+ ConfirmTone,
42
+ } from '../primitives/card-data-types';
29
43
 
30
- export interface ConfirmAction {
31
- id: string;
32
- label: string;
33
- style?: ConfirmActionStyle;
34
- payload?: unknown;
35
- default?: boolean;
36
- }
37
-
38
- export interface ConfirmCardData {
39
- heading?: string;
40
- body?: string;
41
- tone?: ConfirmTone;
42
- actions: ConfirmAction[]; // 1..4
43
- dismissible?: boolean;
44
- }
45
-
46
- export type ConfirmCardEnvelope = CardEnvelope<'confirm', ConfirmCardData>;
44
+ export type {
45
+ ConfirmAction,
46
+ ConfirmActionStyle,
47
+ ConfirmCardData,
48
+ ConfirmCardEnvelope,
49
+ ConfirmTone,
50
+ } from '../primitives/card-data-types';
47
51
 
48
52
  export const CONFIRM_CARD_TYPE = 'confirm' as const;
49
53
 
@@ -2,12 +2,12 @@ import { type JSX, Show, createContext, createMemo, useContext } from 'solid-js'
2
2
  import { HoverCardRoot, HoverCardTrigger, HoverCardContent } from '../ui/hover-card';
3
3
  import { cn } from '../utils/cn';
4
4
  import { Button } from '../ui/button';
5
+ import { ProgressBar, type ProgressTone } from '../ui/progress-bar';
5
6
 
6
7
  const ICON_RADIUS = 10;
7
8
  const ICON_VIEWBOX = 24;
8
9
  const ICON_CENTER = 12;
9
10
  const ICON_STROKE_WIDTH = 2;
10
- const PERCENT_MAX = 100;
11
11
 
12
12
  /** Default fraction (0–1) at which the meter transitions to the warning colour. */
13
13
  export const DEFAULT_WARN_THRESHOLD = 0.7;
@@ -206,7 +206,6 @@ export function ContextContentHeader(props: ContextContentHeaderProps) {
206
206
  const displayPct = createMemo(() => fmtPercent.format(usedPercent()));
207
207
  const used = createMemo(() => fmtCompact.format(ctx.usedTokens));
208
208
  const total = createMemo(() => fmtCompact.format(ctx.maxTokens));
209
- const barWidth = createMemo(() => `${Math.min(usedPercent() * PERCENT_MAX, PERCENT_MAX)}%`);
210
209
 
211
210
  const severity = createMemo<ContextSeverity>(() => {
212
211
  const pct = usedPercent();
@@ -215,11 +214,16 @@ export function ContextContentHeader(props: ContextContentHeaderProps) {
215
214
  return 'ok';
216
215
  });
217
216
 
218
- const colorClass = createMemo(() => {
217
+ // Severity used to pick a bare hue class and nothing else, so the meter was a
218
+ // pair of styled divs: no role, no value, invisible to assistive tech. Map it to
219
+ // the shared ProgressBar's semantic `tone` instead and let that primitive supply
220
+ // `role="progressbar"` + aria-valuenow/min/max, rather than hand-rolling those
221
+ // onto the divs.
222
+ const tone = createMemo<ProgressTone>(() => {
219
223
  const s = severity();
220
- if (s === 'danger') return 'bg-red-400';
221
- if (s === 'warn') return 'bg-yellow-400';
222
- return 'bg-primary';
224
+ if (s === 'danger') return 'error';
225
+ if (s === 'warn') return 'warning';
226
+ return 'primary';
223
227
  });
224
228
 
225
229
  return (
@@ -232,12 +236,14 @@ export function ContextContentHeader(props: ContextContentHeaderProps) {
232
236
  </p>
233
237
  </div>
234
238
  <div class="space-y-2">
235
- <div class="h-1.5 w-full rounded-full bg-muted overflow-hidden">
236
- <div
237
- class={cn('h-full rounded-full transition-all', colorClass())}
238
- style={{ width: barWidth() }}
239
- />
240
- </div>
239
+ {/* Values are the raw token counts, so a screen reader announces
240
+ "190,000 of 200,000" rather than a bare percentage. */}
241
+ <ProgressBar
242
+ value={ctx.usedTokens}
243
+ max={ctx.maxTokens}
244
+ tone={tone()}
245
+ aria-label="Context usage"
246
+ />
241
247
  </div>
242
248
  </Show>
243
249
  </div>
@@ -306,7 +312,15 @@ export interface ContextUsageRowProps {
306
312
  children?: JSX.Element;
307
313
  }
308
314
 
309
- export function ContextInputUsage(props: ContextUsageRowProps) {
315
+ // The four rows share one shape, but each still ships a `<Name>Props` alias: a
316
+ // consumer typing a wrapper around one of them should not have to discover that
317
+ // the shared name exists.
318
+ export type ContextInputUsageProps = ContextUsageRowProps;
319
+ export type ContextOutputUsageProps = ContextUsageRowProps;
320
+ export type ContextReasoningUsageProps = ContextUsageRowProps;
321
+ export type ContextCacheUsageProps = ContextUsageRowProps;
322
+
323
+ export function ContextInputUsage(props: ContextInputUsageProps) {
310
324
  const ctx = useContextValue();
311
325
  return (
312
326
  <Show when={props.children || ctx.inputTokens}>
@@ -320,7 +334,7 @@ export function ContextInputUsage(props: ContextUsageRowProps) {
320
334
  );
321
335
  }
322
336
 
323
- export function ContextOutputUsage(props: ContextUsageRowProps) {
337
+ export function ContextOutputUsage(props: ContextOutputUsageProps) {
324
338
  const ctx = useContextValue();
325
339
  return (
326
340
  <Show when={props.children || ctx.outputTokens}>
@@ -334,7 +348,7 @@ export function ContextOutputUsage(props: ContextUsageRowProps) {
334
348
  );
335
349
  }
336
350
 
337
- export function ContextReasoningUsage(props: ContextUsageRowProps) {
351
+ export function ContextReasoningUsage(props: ContextReasoningUsageProps) {
338
352
  const ctx = useContextValue();
339
353
  return (
340
354
  <Show when={props.children || ctx.reasoningTokens}>
@@ -348,7 +362,7 @@ export function ContextReasoningUsage(props: ContextUsageRowProps) {
348
362
  );
349
363
  }
350
364
 
351
- export function ContextCacheUsage(props: ContextUsageRowProps) {
365
+ export function ContextCacheUsage(props: ContextCacheUsageProps) {
352
366
  const ctx = useContextValue();
353
367
  return (
354
368
  <Show when={props.children || ctx.cacheTokens}>
@@ -43,6 +43,12 @@ export function ConversationItem(props: ConversationItemProps) {
43
43
  return (
44
44
  <button
45
45
  data-conversation-id={local.conversation.id}
46
+ // `isActive` drives the selected LOOK below; it has to reach assistive tech
47
+ // too, or the active conversation is visible only to sighted users. `true`
48
+ // rather than `page` because this selects a conversation within the app, it
49
+ // is not page navigation — same call as ui/agent-card.tsx and ui/pane-group.tsx
50
+ // (ui/nav.tsx uses `page` because its items really are nav links).
51
+ aria-current={local.isActive ? 'true' : undefined}
46
52
  onClick={() => local.onSelect(local.conversation.id)}
47
53
  class={cn(
48
54
  'w-full rounded-lg text-left transition-colors',
@@ -16,7 +16,9 @@ import type { ConversationSummary, ConversationGroup } from '../types';
16
16
  * surrounding region (the workspace puts the thread beside it, the standalone
17
17
  * element stands alone). `onExpand` reopens the rail.
18
18
  */
19
- export function CollapsedRail(props: { onExpand: () => void; class?: string }) {
19
+ export interface CollapsedRailProps { onExpand: () => void; class?: string }
20
+
21
+ export function CollapsedRail(props: CollapsedRailProps) {
20
22
  return (
21
23
  <Button
22
24
  variant="ghost" size="icon-sm" aria-label="Open sidebar"
@@ -94,7 +96,21 @@ export function ConversationList(props: ConversationListProps) {
94
96
  return grouped;
95
97
  });
96
98
 
97
- const ungrouped = createMemo(() => groupedConversations().get(undefined) ?? []);
99
+ /**
100
+ * Everything that is NOT filed under a rendered group heading: no `groupId` at
101
+ * all, OR a `groupId` that matches no entry in `groups`.
102
+ *
103
+ * The second half used to be dropped on the floor. `groups` drives the render
104
+ * loop, so a conversation pointing at a group the consumer had not declared
105
+ * (a stale id, a group removed from the array, a filtered/paginated `groups`
106
+ * response) vanished from the sidebar with no error and no empty state — the
107
+ * list just silently held fewer rows than the data it was given. Falling through
108
+ * to "Ungrouped" keeps every conversation the consumer passed in reachable.
109
+ */
110
+ const ungrouped = createMemo(() => {
111
+ const known = new Set((local.groups ?? []).map((g) => g.id));
112
+ return filteredConversations().filter((c) => c.groupId == null || !known.has(c.groupId));
113
+ });
98
114
 
99
115
  return (
100
116
  <div class={cn('flex flex-col h-full bg-sidebar', local.class)}>
@@ -18,28 +18,17 @@ import {
18
18
  File as FileIcon,
19
19
  } from 'lucide-solid';
20
20
 
21
- /** A single artifact file the tree can show + the preview can load. */
22
- export interface FileTreeFile {
23
- /** Tree label/key. Folders are built from `/`-delimited segments. */
24
- path: string;
25
- /** Where the preview loads it (CDN/S3/dev-server/API). */
26
- url?: string;
27
- /** Source for the Code tab. */
28
- code?: string;
29
- /** Language id for syntax highlighting (e.g. `html`, `css`, `tsx`). */
30
- language?: string;
31
- /** Kind drives the icon + whether Code applies. */
32
- type?: 'html' | 'pdf' | 'image' | 'other';
33
- /** Lines added vs the base. Rendered as a trailing `+N` stat (success hue,
34
- * tabular-nums). Only shown when present; omit for a plain file row. */
35
- additions?: number;
36
- /** Lines removed vs the base. Rendered as a trailing `-N` stat (error hue). */
37
- deletions?: number;
38
- /** Change status vs the base. Drives a small trailing status letter in the
39
- * conventional VCS hue (added=green, modified=amber, deleted=red,
40
- * renamed=blue, untracked=muted). Only shown when present. */
41
- status?: 'added' | 'modified' | 'deleted' | 'renamed' | 'untracked';
42
- }
21
+ /** A single artifact file the tree can show + the preview can load.
22
+ *
23
+ * AUTHORED IN ../primitives/card-data-types.ts as `ArtifactCardFile`, and aliased
24
+ * here rather than declared, so there is ONE shape and not a copy of one. It has
25
+ * to live in that `.ts` because `ArtifactCardData.files` reaches it: a type import
26
+ * still has to RESOLVE, and a Node/no-DOM project (tsconfig.mcp.json has no `jsx`
27
+ * on purpose) cannot resolve a `.tsx` at all — so leaving this declaration here
28
+ * would put TS6142 back on any backend that names an artifact card payload. See
29
+ * that file's header. */
30
+ export type { ArtifactCardFile as FileTreeFile } from '../primitives/card-data-types';
31
+ import type { ArtifactCardFile as FileTreeFile } from '../primitives/card-data-types';
43
32
 
44
33
  /** A change status a file can carry. */
45
34
  export type FileStatus = NonNullable<FileTreeFile['status']>;
@@ -66,16 +66,22 @@ function FileUpload(props: FileUploadProps) {
66
66
  }
67
67
  };
68
68
 
69
- window.addEventListener('dragenter', handleDragIn);
70
- window.addEventListener('dragleave', handleDragOut);
71
- window.addEventListener('dragover', handleDrag);
72
- window.addEventListener('drop', handleDrop);
69
+ // Captured at SETUP and closed over, never re-resolved as a global inside
70
+ // `onCleanup`: cleanup can run after the host removed the DOM globals (a
71
+ // `kai-*` release is deferred one microtask past detachment, so an
72
+ // environment teardown gets in between), and a bare `window` there throws.
73
+ // See tests/components/teardown-without-dom-globals.test.tsx.
74
+ const win = window;
75
+ win.addEventListener('dragenter', handleDragIn);
76
+ win.addEventListener('dragleave', handleDragOut);
77
+ win.addEventListener('dragover', handleDrag);
78
+ win.addEventListener('drop', handleDrop);
73
79
 
74
80
  onCleanup(() => {
75
- window.removeEventListener('dragenter', handleDragIn);
76
- window.removeEventListener('dragleave', handleDragOut);
77
- window.removeEventListener('dragover', handleDrag);
78
- window.removeEventListener('drop', handleDrop);
81
+ win.removeEventListener('dragenter', handleDragIn);
82
+ win.removeEventListener('dragleave', handleDragOut);
83
+ win.removeEventListener('dragover', handleDrag);
84
+ win.removeEventListener('drop', handleDrop);
79
85
  });
80
86
  });
81
87
 
@@ -44,53 +44,20 @@ import {
44
44
  // Types (the JSON-Schema subset kai-form renders) — see form.schema.json.
45
45
  // ─────────────────────────────────────────────────────────────────────────────
46
46
 
47
- /** A field definition (the JSON Schema subset kai-form renders). */
48
- export interface FormField {
49
- type: 'string' | 'number' | 'integer' | 'boolean' | 'array' | 'object';
50
- title?: string;
51
- description?: string;
52
- default?: unknown;
53
- enum?: unknown[];
54
- format?: 'email' | 'uri' | 'url' | 'date' | 'date-time' | 'time';
55
- minimum?: number;
56
- maximum?: number;
57
- minLength?: number;
58
- maxLength?: number;
59
- pattern?: string;
60
- minItems?: number;
61
- maxItems?: number;
62
- items?: FormField | { enum: unknown[] };
63
- properties?: Record<string, FormField>;
64
- required?: string[];
65
- readOnly?: boolean;
66
- 'x-kai-widget'?:
67
- | 'textarea'
68
- | 'slider'
69
- | 'rating'
70
- | 'radio'
71
- | 'select'
72
- | 'checkbox'
73
- | 'password'
74
- | 'switch';
75
- 'x-kai-placeholder'?: string;
76
- 'x-kai-step'?: number;
77
- }
78
-
79
- /** The form definition = CardEnvelope.data for type:'form'. */
80
- export interface FormDefinition {
81
- type: 'object';
82
- title?: string;
83
- description?: string;
84
- required?: string[];
85
- properties: Record<string, FormField>;
86
- 'x-kai-order'?: string[];
87
- 'x-kai-inlineMax'?: number;
88
- 'x-kai-submitLabel'?: string;
89
- 'x-kai-dismissible'?: boolean;
90
- 'x-kai-actions'?: { id: string; label: string; variant?: 'default' | 'ghost' | 'outline' }[];
91
- }
92
-
93
- export type FormCardEnvelope = CardEnvelope<'form', FormDefinition>;
47
+ // AUTHORED IN ../primitives/card-data-types.ts. See the note in confirm-card.tsx,
48
+ // or that file's header, for why they left a `.tsx` and why they are `type`
49
+ // aliases. `FormField` in particular CANNOT be an interface: it is
50
+ // self-referential, so the element-types generator can only inline it down to a
51
+ // `Record<string, unknown>` placeholder, and an interface is not assignable to
52
+ // that. Re-exported here unchanged.
53
+
54
+ import type { FormDefinition, FormField } from '../primitives/card-data-types';
55
+
56
+ export type {
57
+ FormCardEnvelope,
58
+ FormDefinition,
59
+ FormField,
60
+ } from '../primitives/card-data-types';
94
61
 
95
62
  /** The internal widget identifiers `widgetFor` resolves to. */
96
63
  export type WidgetKind =
@@ -24,9 +24,36 @@ export interface LoaderProps {
24
24
  class?: string;
25
25
  }
26
26
 
27
+ /** Props of the shape-only loader variants (no label). */
28
+ export interface LoaderShapeProps {
29
+ class?: string;
30
+ size?: LoaderSize;
31
+ }
32
+
33
+ /** Props of the text-based loader variants, which also take the label. */
34
+ export interface LoaderTextProps extends LoaderShapeProps {
35
+ text?: string;
36
+ }
37
+
38
+ // Every variant shortcut ships its own `<Name>Props` alias: a consumer typing a
39
+ // wrapper around `<DotsLoader>` must be able to name its props without knowing
40
+ // that nine components happen to share one shape.
41
+ export type CircularLoaderProps = LoaderShapeProps;
42
+ export type ClassicLoaderProps = LoaderShapeProps;
43
+ export type PulseLoaderProps = LoaderShapeProps;
44
+ export type PulseDotLoaderProps = LoaderShapeProps;
45
+ export type DotsLoaderProps = LoaderShapeProps;
46
+ export type TypingLoaderProps = LoaderShapeProps;
47
+ export type WaveLoaderProps = LoaderShapeProps;
48
+ export type BarsLoaderProps = LoaderShapeProps;
49
+ export type TerminalLoaderProps = LoaderShapeProps;
50
+ export type TextBlinkLoaderProps = LoaderTextProps;
51
+ export type TextShimmerLoaderProps = LoaderTextProps;
52
+ export type TextDotsLoaderProps = LoaderTextProps;
53
+
27
54
  // --- CircularLoader ---
28
55
 
29
- export function CircularLoader(props: { class?: string; size?: LoaderSize }) {
56
+ export function CircularLoader(props: CircularLoaderProps) {
30
57
  const size = () => props.size ?? 'md';
31
58
  const sizeClasses = { sm: 'size-4', md: 'size-5', lg: 'size-6' };
32
59
  return (
@@ -44,7 +71,7 @@ export function CircularLoader(props: { class?: string; size?: LoaderSize }) {
44
71
 
45
72
  // --- ClassicLoader ---
46
73
 
47
- export function ClassicLoader(props: { class?: string; size?: LoaderSize }) {
74
+ export function ClassicLoader(props: ClassicLoaderProps) {
48
75
  const size = () => props.size ?? 'md';
49
76
  const sizeClasses = { sm: 'size-4', md: 'size-5', lg: 'size-6' };
50
77
  const barSizes = {
@@ -81,7 +108,7 @@ export function ClassicLoader(props: { class?: string; size?: LoaderSize }) {
81
108
 
82
109
  // --- PulseLoader ---
83
110
 
84
- export function PulseLoader(props: { class?: string; size?: LoaderSize }) {
111
+ export function PulseLoader(props: PulseLoaderProps) {
85
112
  const size = () => props.size ?? 'md';
86
113
  const sizeClasses = { sm: 'size-4', md: 'size-5', lg: 'size-6' };
87
114
  return (
@@ -94,7 +121,7 @@ export function PulseLoader(props: { class?: string; size?: LoaderSize }) {
94
121
 
95
122
  // --- PulseDotLoader ---
96
123
 
97
- export function PulseDotLoader(props: { class?: string; size?: LoaderSize }) {
124
+ export function PulseDotLoader(props: PulseDotLoaderProps) {
98
125
  const size = () => props.size ?? 'md';
99
126
  const sizeClasses = { sm: 'size-1', md: 'size-2', lg: 'size-3' };
100
127
  return (
@@ -112,7 +139,7 @@ export function PulseDotLoader(props: { class?: string; size?: LoaderSize }) {
112
139
 
113
140
  // --- DotsLoader ---
114
141
 
115
- export function DotsLoader(props: { class?: string; size?: LoaderSize }) {
142
+ export function DotsLoader(props: DotsLoaderProps) {
116
143
  const size = () => props.size ?? 'md';
117
144
  const dotSizes = { sm: 'h-1.5 w-1.5', md: 'h-2 w-2', lg: 'h-2.5 w-2.5' };
118
145
  const containerSizes = { sm: 'h-4', md: 'h-5', lg: 'h-6' };
@@ -136,7 +163,7 @@ export function DotsLoader(props: { class?: string; size?: LoaderSize }) {
136
163
 
137
164
  // --- TypingLoader ---
138
165
 
139
- export function TypingLoader(props: { class?: string; size?: LoaderSize }) {
166
+ export function TypingLoader(props: TypingLoaderProps) {
140
167
  const size = () => props.size ?? 'md';
141
168
  const dotSizes = { sm: 'h-1 w-1', md: 'h-1.5 w-1.5', lg: 'h-2 w-2' };
142
169
  const containerSizes = { sm: 'h-4', md: 'h-5', lg: 'h-6' };
@@ -160,7 +187,7 @@ export function TypingLoader(props: { class?: string; size?: LoaderSize }) {
160
187
 
161
188
  // --- WaveLoader ---
162
189
 
163
- export function WaveLoader(props: { class?: string; size?: LoaderSize }) {
190
+ export function WaveLoader(props: WaveLoaderProps) {
164
191
  const size = () => props.size ?? 'md';
165
192
  const barWidths = { sm: 'w-0.5', md: 'w-0.5', lg: 'w-1' };
166
193
  const containerSizes = { sm: 'h-4', md: 'h-5', lg: 'h-6' };
@@ -192,7 +219,7 @@ export function WaveLoader(props: { class?: string; size?: LoaderSize }) {
192
219
 
193
220
  // --- BarsLoader ---
194
221
 
195
- export function BarsLoader(props: { class?: string; size?: LoaderSize }) {
222
+ export function BarsLoader(props: BarsLoaderProps) {
196
223
  const size = () => props.size ?? 'md';
197
224
  const barWidths = { sm: 'w-1', md: 'w-1.5', lg: 'w-2' };
198
225
  const containerSizes = { sm: 'h-4 gap-1', md: 'h-5 gap-1.5', lg: 'h-6 gap-2' };
@@ -216,7 +243,7 @@ export function BarsLoader(props: { class?: string; size?: LoaderSize }) {
216
243
 
217
244
  // --- TerminalLoader ---
218
245
 
219
- export function TerminalLoader(props: { class?: string; size?: LoaderSize }) {
246
+ export function TerminalLoader(props: TerminalLoaderProps) {
220
247
  const size = () => props.size ?? 'md';
221
248
  const cursorSizes = { sm: 'h-3 w-1.5', md: 'h-4 w-2', lg: 'h-5 w-2.5' };
222
249
  const textSizes = { sm: 'text-xs', md: 'text-sm', lg: 'text-base' };
@@ -232,7 +259,7 @@ export function TerminalLoader(props: { class?: string; size?: LoaderSize }) {
232
259
 
233
260
  // --- TextBlinkLoader ---
234
261
 
235
- export function TextBlinkLoader(props: { text?: string; class?: string; size?: LoaderSize }) {
262
+ export function TextBlinkLoader(props: TextBlinkLoaderProps) {
236
263
  const size = () => props.size ?? 'md';
237
264
  const textSizes = { sm: 'text-xs', md: 'text-sm', lg: 'text-base' };
238
265
  return (
@@ -250,7 +277,7 @@ export function TextBlinkLoader(props: { text?: string; class?: string; size?: L
250
277
 
251
278
  // --- TextShimmerLoader ---
252
279
 
253
- export function TextShimmerLoader(props: { text?: string; class?: string; size?: LoaderSize }) {
280
+ export function TextShimmerLoader(props: TextShimmerLoaderProps) {
254
281
  const size = () => props.size ?? 'md';
255
282
  const textSizes = { sm: 'text-xs', md: 'text-sm', lg: 'text-base' };
256
283
  return (
@@ -270,7 +297,7 @@ export function TextShimmerLoader(props: { text?: string; class?: string; size?:
270
297
 
271
298
  // --- TextDotsLoader ---
272
299
 
273
- export function TextDotsLoader(props: { text?: string; class?: string; size?: LoaderSize }) {
300
+ export function TextDotsLoader(props: TextDotsLoaderProps) {
274
301
  const size = () => props.size ?? 'md';
275
302
  const textSizes = { sm: 'text-xs', md: 'text-sm', lg: 'text-base' };
276
303
  return (
@@ -3,8 +3,12 @@ import { cn } from "../utils/cn";
3
3
 
4
4
  // --- MessageSkills ---
5
5
 
6
+ /** One skill badge. Also the shape of `<kai-skills>`' `skills` property and of a
7
+ * `<kai-skill>` light-DOM child. */
6
8
  export interface Skill {
9
+ /** Stable identifier for the skill. */
7
10
  id: string;
11
+ /** Human-readable skill name shown on the badge. */
8
12
  name: string;
9
13
  }
10
14