@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
@@ -33,6 +33,25 @@ export function useSequencer(interval: () => number): Accessor<number> {
33
33
 
34
34
  if (!Number.isFinite(ms) || ms <= 0) return;
35
35
  if (typeof requestAnimationFrame === 'undefined') return;
36
+ if (typeof cancelAnimationFrame === 'undefined') return;
37
+
38
+ // Captured at SETUP and closed over, never re-resolved as a global inside
39
+ // `onCleanup`: cleanup can run after the host removed the DOM globals (a
40
+ // `kai-*` release is deferred one microtask past detachment, so an
41
+ // environment teardown gets in between), and a bare `cancelAnimationFrame`
42
+ // there throws -- from a promise nobody holds, so it lands as an unhandled
43
+ // rejection that fails the run while every test passes.
44
+ // See tests/components/teardown-without-dom-globals.test.tsx.
45
+ //
46
+ // The FUNCTION, not the view. The `const win = window` capture that fixes a
47
+ // bare `document` does nothing here: `window === globalThis` -- measured, in
48
+ // jsdom and in real Chromium/WebKit alike -- and the teardown deletes these
49
+ // keys off that very object, so `win.cancelAnimationFrame` is undefined by
50
+ // the time cleanup runs. It only trades the ReferenceError for a TypeError.
51
+ // `.bind` pins the receiver the WebIDL operation is specified on; Chromium
52
+ // and WebKit both accept a detached call (measured), so the bind is belt and
53
+ // braces against an engine that does not, at zero cost.
54
+ const cancelFrame = cancelAnimationFrame.bind(globalThis);
36
55
 
37
56
  let raf = 0;
38
57
  let last = performance.now();
@@ -46,7 +65,7 @@ export function useSequencer(interval: () => number): Accessor<number> {
46
65
  };
47
66
 
48
67
  raf = requestAnimationFrame(step);
49
- onCleanup(() => cancelAnimationFrame(raf));
68
+ onCleanup(() => cancelFrame(raf));
50
69
  });
51
70
 
52
71
  return tick;
@@ -0,0 +1,151 @@
1
+ // The inverse of `cardTools()`: a model's tool call back into a renderable card.
2
+ //
3
+ // This is the one line a developer adds to their tool loop:
4
+ //
5
+ // for (const call of pending) {
6
+ // const card = cardFromToolCall(call.name, call.input ?? {}, { id: call.id });
7
+ // if (card) {
8
+ // stream.addCard(card);
9
+ // applyToolOutput(stream, call.id, { status: 'awaiting_user' });
10
+ // continue;
11
+ // }
12
+ // applyToolOutput(stream, call.id, await runTool(call.name, call.input ?? {}));
13
+ // }
14
+ //
15
+ // It replaces the hand-written mapper this repo's own reference harness carries
16
+ // (examples/internal/openrouter-spike/src/tools.ts:471-500), whose comment says the
17
+ // model cannot emit a CardEnvelope directly because the schemas are unreachable.
18
+ // They are reachable now (./index.ts), so the mapper does not need to exist.
19
+ //
20
+ // RUNTIME-FREE, DELIBERATELY
21
+ // --------------------------
22
+ // One type import, which erases. No DOM, no Solid, no validator, no schema data.
23
+ // This is imported by a backend route inside a tool loop, so it must weigh nothing
24
+ // and must not drag `cardSchemas` in behind it.
25
+ //
26
+ //
27
+ // THE TWO DESIGN CALLS, AND WHY
28
+ // =============================
29
+ //
30
+ // 1. THE TOOL NAME CARRIES `type`; THE `tool_call_id` CARRIES `id`.
31
+ //
32
+ // `kai_confirm` produces `{ type: 'confirm' }`, and the provider's `tool_call_id`
33
+ // becomes `CardEnvelope.id` unchanged. The id is not a detail: it is already unique
34
+ // per call, and it is already the key `upsertCardPart` (src/state/parts.ts:172)
35
+ // matches on. So a model that revises a card re-sends the same tool call id, and
36
+ // `AssistantStream.addCard` replaces that card in place instead of rendering a
37
+ // second copy of it. Generating an id here would break that for free, which is what
38
+ // the spike's `card-${++cardSeq}` does today.
39
+ //
40
+ // 2. `kai_` DECIDES "CARD TOOL". IT DOES NOT DECIDE "RENDERABLE".
41
+ //
42
+ // Two questions get asked about a `kai_*` call, and they are answered in two places
43
+ // on purpose:
44
+ //
45
+ // "is this a card tool at all?" -> here, from the prefix. Returns null if not,
46
+ // so the loop's `if (card)` falls through to
47
+ // the app's own tools. Never throws: an unknown
48
+ // tool name is ordinary, not exceptional.
49
+ //
50
+ // "can this card render / is the -> the DISPATCHER. An unregistered type already
51
+ // data well-formed?" renders `CardFallback` and emits
52
+ // `{ kind: 'error', cardId }`
53
+ // (components/card-renderer.tsx:33-42), and
54
+ // T1.5 adds the same treatment for data that
55
+ // does not match its schema, mirroring
56
+ // remote/provider-runtime.ts:142.
57
+ //
58
+ // So this module has no validator and must not grow one. Two consequences, both
59
+ // intentional:
60
+ //
61
+ // - A type the kit does not know (`kai_pricing-table`) still produces an envelope.
62
+ // Gating on the 7 built-ins instead would send a custom card type, registered
63
+ // perfectly legally through `cardTypes`/`mergeCardTags`, to
64
+ // `runTool('kai_pricing-table')` which no app implements, and the card would
65
+ // vanish with no diagnostic anywhere. The permissive read costs nothing, because
66
+ // a genuinely unknown type is named on screen by the fallback.
67
+ //
68
+ // - Malformed `data` still produces an envelope. Returning null would be
69
+ // indistinguishable from "not a card tool" and would misroute the call to
70
+ // `runTool`; throwing would kill the whole turn, including the sibling tool calls
71
+ // in the same batch, for what the plan explicitly treats as a PRODUCTION failure
72
+ // mode. Keeping the envelope keeps the bad data attributable to the tool call
73
+ // that produced it, which is what lets the app hand the diagnostic back to the
74
+ // model, and the model's corrected retry then upserts over the broken card
75
+ // because it reuses the same tool call id. That healing only works if the
76
+ // malformed call produced an envelope in the first place.
77
+ //
78
+ // `isCardTool` and `cardFromToolCall` are derived from ONE decision function below,
79
+ // rather than each testing the prefix, so they cannot drift into disagreeing about
80
+ // the same question.
81
+
82
+ import type { CardEnvelope } from '../primitives/card-contract';
83
+
84
+ /**
85
+ * The tool-name prefix that marks a card tool.
86
+ *
87
+ * Prefixed so a developer's own `confirm` tool cannot collide with ours, and
88
+ * exported as a value so `cardTools()` names its tools from here instead of
89
+ * restating the literal. A prefix written in two places is a prefix that can drift.
90
+ */
91
+ export const KAI_TOOL_PREFIX = 'kai_';
92
+
93
+ /**
94
+ * The card type a tool name denotes, or `null` if the name is not a card tool.
95
+ *
96
+ * The single decision both public predicates below are derived from. The remainder
97
+ * after the prefix is used verbatim: card types may contain hyphens
98
+ * (`kai_pricing-table` -> `pricing-table`), and both providers accept
99
+ * `[a-zA-Z0-9_-]` in a tool name, so there is nothing to translate. Matching is
100
+ * case-sensitive, because tool names are.
101
+ */
102
+ export function cardTypeFromToolName(name: string): string | null {
103
+ if (!name.startsWith(KAI_TOOL_PREFIX)) return null;
104
+ const type = name.slice(KAI_TOOL_PREFIX.length);
105
+ return type.length > 0 ? type : null;
106
+ }
107
+
108
+ /** The tool name for a card type. The exact inverse of {@link cardTypeFromToolName}. */
109
+ export function toolNameForCardType(type: string): string {
110
+ return `${KAI_TOOL_PREFIX}${type}`;
111
+ }
112
+
113
+ /**
114
+ * Is this tool call a card, rather than one of the app's own tools?
115
+ *
116
+ * True for any `kai_`-prefixed name with a non-empty remainder. It does NOT claim
117
+ * the type is registered or the data is valid; see the module header for why those
118
+ * are the dispatcher's questions.
119
+ */
120
+ export function isCardTool(name: string): boolean {
121
+ return cardTypeFromToolName(name) !== null;
122
+ }
123
+
124
+ /**
125
+ * Turn a model's tool call into a `CardEnvelope`, or `null` if it is not a card tool.
126
+ *
127
+ * @param name the tool name the model called, e.g. `kai_confirm`
128
+ * @param input the tool arguments, used verbatim as `CardEnvelope.data`
129
+ * @param opts.id the provider's `tool_call_id`, used verbatim as `CardEnvelope.id`
130
+ *
131
+ * `data` is the input as given: the tool's input schema IS the card-data schema that
132
+ * `cardTools()` handed the model, so the mapping is identity and nothing is peeled,
133
+ * renamed or defaulted. In particular no `title` is set. `CardEnvelope.title` is
134
+ * chrome the host owns and no card-data schema offers the model one (`confirm`
135
+ * deliberately calls its in-body heading `heading` and says so in its description),
136
+ * so a caller who wants a title writes `{ ...card, title }`.
137
+ *
138
+ * Never throws.
139
+ */
140
+ export function cardFromToolCall(
141
+ name: string,
142
+ input: unknown,
143
+ opts: { id: string },
144
+ ): CardEnvelope | null {
145
+ const type = cardTypeFromToolName(name);
146
+ if (type === null) return null;
147
+ // `undefined` is the only value here that cannot have come off the wire (a model
148
+ // calling a tool with no arguments), so it is the only one normalised. `null` is
149
+ // real JSON and is passed through for the validator to complain about.
150
+ return { type, id: opts.id, data: input === undefined ? {} : input };
151
+ }
@@ -0,0 +1,340 @@
1
+ // @kitn.ai/ui/schemas: the card JSON Schemas, reachable.
2
+ //
3
+ // The 11 schema documents under src/primitives/card-schemas/ have been copied into
4
+ // dist/schemas/ on every build and shipped in every tarball since the card contract
5
+ // landed. Nothing could reach them: package.json "exports" is a CLOSED map with no
6
+ // `./schemas` key, so both `@kitn.ai/ui/schemas` and
7
+ // `@kitn.ai/ui/schemas/confirm.schema.json` resolved to TS2307 /
8
+ // ERR_PACKAGE_PATH_NOT_EXPORTED. This repo's own reference harness gave up and
9
+ // hand-derived the confirm schema in
10
+ // examples/internal/openrouter-spike/src/card-schema.ts, saying so in a comment.
11
+ //
12
+ // WHY THIS JS ENTRY IS THE PRIMARY SURFACE
13
+ // ----------------------------------------
14
+ // The raw JSON subpaths ship too (`@kitn.ai/ui/schemas/confirm.schema.json`), and
15
+ // they are the right answer for a Python or Go backend, or for `fetch`. They are
16
+ // the SECONDARY surface for JS/TS consumers because importing JSON breaks three
17
+ // different ways across the framework targets the scaffolder supports: Node ESM and
18
+ // TS `nodenext` need `with { type: 'json' }`, types need `resolveJsonModule` in any
19
+ // mode, and Workers need a `wrangler` rule. A JS entry has none of those problems
20
+ // anywhere, and it picks up `verify:ssr` coverage for free, since that guard derives
21
+ // its entry list from the exports map.
22
+ //
23
+ // SERVER-SAFE, DELIBERATELY
24
+ // -------------------------
25
+ // No DOM, no Solid, no `fetch`. Everything reached from here is data or plain
26
+ // functions, and as of src/primitives/card-component-types.ts that is true of the
27
+ // TYPES too: nothing reachable from this entry resolves to a `.tsx` any more, so a
28
+ // Node/no-DOM project can read the whole graph from source. (`CardComponentMap` used
29
+ // to come from primitives/card-registry.tsx and was the last exception.) This entry
30
+ // is meant to be imported by a backend route that hands tool definitions to a model,
31
+ // so anything that touches a browser global would defeat its purpose. `verify:ssr`
32
+ // asserts the RUNTIME half, by importing the BUILT entry under the `node` condition
33
+ // in its own child process; the compile-time half is `tsc --noEmit -p
34
+ // tsconfig.mcp.json` on a tree with no dist/, and only that one sees a `.tsx` creep
35
+ // back in.
36
+ //
37
+ // WHAT `verify:ssr` DOES NOT CATCH, MEASURED
38
+ // ------------------------------------------
39
+ // It checks the BUILT bundle, so it only sees what survives tree-shaking — and
40
+ // rollup is good enough here that it does not see the mistake you would actually
41
+ // make. Measured, not assumed: pointing the `BUILTIN_CARD_TAGS` re-export below at
42
+ // src/primitives/card-registry.TSX instead of card-tags.ts produces a byte-identical
43
+ // dist/schemas.js with zero `solid-js` references, and imports clean under `node`.
44
+ // Rollup compiles the whole Solid component tree (build time 0.2s -> 3.9s) and then
45
+ // discards all of it, because only the tag map is reachable.
46
+ //
47
+ // So the `.ts` split is NOT holding a runtime guard up, and must not be described as
48
+ // if it were. What it buys is that this entry's server-safety stops depending on
49
+ // tree-shaking staying perfect: one module-scope side effect anywhere under
50
+ // components/ and the discarded tree stops being discardable. Removing the dependency
51
+ // beats relying on it being elided.
52
+ //
53
+ // WHAT IT COSTS, AND WHERE
54
+ // ------------------------
55
+ // dist/schemas.js, measured on this tree, not recalled:
56
+ //
57
+ // 42,658 B min / 11,762 B gzip before ./registry landed
58
+ // 53,658 B min / 14,669 B gzip after ./registry (+11,000 B / +2,907 B gzip)
59
+ // 53,864 B min / 14,739 B gzip now, with BUILTIN_CARD_TAGS (+206 B / +70 B gzip)
60
+ //
61
+ // The middle row is this comment's previous "53,656 / 14,667", re-measured rather than
62
+ // carried forward; the 2-byte drift is what a claim costs when it is copied instead of
63
+ // taken again. The last row is the tag map below, measured by building this entry with
64
+ // and without that one export line.
65
+ //
66
+ // The `18,160 B / 5,800 B` this comment used to claim was measured at 0.20.1, before
67
+ // tool-defs and provider-subsets were added to the barrel, and had been stale ever
68
+ // since. Corrected here rather than left, because a size claim nobody re-measures is
69
+ // the same class of thing as a guard nobody watches fail.
70
+ //
71
+ // The delta is ./registry plus what it pulls: primitives/card-validate.ts (the
72
+ // validator) and primitives/card-validate-schemas.ts (the LEAN projection). That last
73
+ // one means the seven card schemas appear TWICE in this bundle, authored and lean.
74
+ // Deliberate, and the alternative is worse: validating built-ins against the authored
75
+ // documents here while the browser validates them against the projection would be two
76
+ // behaviours wearing one name. One function, one answer, 4 KB.
77
+ //
78
+ // All of it is a SERVER cost and does not touch a client bundle. Nothing in the
79
+ // component tree imports this entry, so no consumer pays it unless a route or a
80
+ // build script imports it on purpose. If you are here comparing it against the
81
+ // ~1 KB gzip figure in the emit-contract plan, those are different things: that one
82
+ // is the LEAN projection destined for the browser (descriptions and `$id` stripped,
83
+ // validation keywords only), which is a separate artifact and not this file.
84
+ //
85
+ // NOT RESTATED
86
+ // ------------
87
+ // Every value below is the JSON file itself, imported and inlined by the bundler.
88
+ // There is no hand-copied shape here and there must never be one: `verify:schemas`
89
+ // asserts each exported entry is byte-identical to its file on disk, and that the
90
+ // two maps between them account for every file in the directory and for nothing
91
+ // else. The whole point of this entry is to stop the same shape existing in five
92
+ // places.
93
+
94
+ import type { JsonSchema } from '../primitives/card-validate';
95
+
96
+ import artifactSchema from '../primitives/card-schemas/artifact.schema.json';
97
+ import cardEnvelopeSchema from '../primitives/card-schemas/card-envelope.schema.json';
98
+ import cardEventSchema from '../primitives/card-schemas/card-event.schema.json';
99
+ import choiceSchema from '../primitives/card-schemas/choice.schema.json';
100
+ import confirmSchema from '../primitives/card-schemas/confirm.schema.json';
101
+ import embedSchema from '../primitives/card-schemas/embed.schema.json';
102
+ import formResultSchema from '../primitives/card-schemas/form.result.schema.json';
103
+ import formSchema from '../primitives/card-schemas/form.schema.json';
104
+ import linkSchema from '../primitives/card-schemas/link.schema.json';
105
+ import tasksResultSchema from '../primitives/card-schemas/tasks.result.schema.json';
106
+ import tasksSchema from '../primitives/card-schemas/tasks.schema.json';
107
+
108
+ /**
109
+ * A card schema document, as authored.
110
+ *
111
+ * Wider than {@link JsonSchema} on purpose. `JsonSchema` describes the LEAN subset
112
+ * `validateAgainstSchema` implements; the files also carry `$schema`, `$id`,
113
+ * `title`, `description`, `default`, `additionalProperties`, `x-kai-*`, and (in
114
+ * `embed` and `artifact`) `allOf`/`if`/`then`/`oneOf`. Reading a document as
115
+ * `JsonSchema` alone would quietly imply the validator understands all of it.
116
+ */
117
+ export type CardSchema = JsonSchema & Readonly<Record<string, unknown>>;
118
+
119
+ /**
120
+ * DO NOT "TIGHTEN" THIS TO `doc as JsonSchema`, OR DELETE THE CAST.
121
+ *
122
+ * It reads like laziness and is not. `JsonSchema` (src/primitives/card-validate.ts)
123
+ * pins `type` to a literal union — `'string' | 'number' | ... | 'null'` — while
124
+ * TypeScript infers plain `string` for the `"type"` member of an imported JSON
125
+ * literal, so a schema document is NOT assignable to `JsonSchema` and no narrowing
126
+ * short of a per-file `as const` would make it so. On top of that the documents
127
+ * legitimately carry `$schema`, `$id`, `title`, `description`, `default`,
128
+ * `additionalProperties`, `x-kai-*` and (in `embed` and `artifact`)
129
+ * `allOf`/`if`/`then`/`oneOf`, which `JsonSchema` does not describe at all.
130
+ *
131
+ * So this widens once, at the module boundary, deliberately. It is not a claim
132
+ * about the contents, and the claim it does NOT make is checked elsewhere:
133
+ * `verify:schemas` imports the BUILT entry from a temp package outside the repo and
134
+ * asserts every exported value is byte-identical to its file on disk. A tighter
135
+ * type here would buy nothing that check does not already prove, and would cost the
136
+ * ability to represent the schemas we actually ship.
137
+ */
138
+ const asSchema = (doc: unknown): CardSchema => doc as CardSchema;
139
+
140
+ /**
141
+ * The card-DATA schemas: one per built-in `CardEnvelope.type`, describing the
142
+ * `data` payload for that type. These are the tool candidates. The key IS the
143
+ * envelope type.
144
+ */
145
+ export type CardSchemaName = 'artifact' | 'choice' | 'confirm' | 'embed' | 'form' | 'link' | 'tasks';
146
+
147
+ /**
148
+ * The contract shapes: the envelope itself, the event a card emits back up, and the
149
+ * two result payloads. Not card data and NOT tool candidates — a model is never
150
+ * asked to emit one of these, so keeping them out of `cardSchemas` is what stops
151
+ * `cardTools()` offering the model an envelope-shaped tool.
152
+ */
153
+ export type ContractSchemaName = 'card-envelope' | 'card-event' | 'form.result' | 'tasks.result';
154
+
155
+ /** The 7 card-data schemas, keyed by `CardEnvelope.type`. */
156
+ export const cardSchemas: Readonly<Record<CardSchemaName, CardSchema>> = Object.freeze({
157
+ artifact: asSchema(artifactSchema),
158
+ choice: asSchema(choiceSchema),
159
+ confirm: asSchema(confirmSchema),
160
+ embed: asSchema(embedSchema),
161
+ form: asSchema(formSchema),
162
+ link: asSchema(linkSchema),
163
+ tasks: asSchema(tasksSchema),
164
+ });
165
+
166
+ /** The 4 contract shapes, keyed by file stem. */
167
+ export const contractSchemas: Readonly<Record<ContractSchemaName, CardSchema>> = Object.freeze({
168
+ 'card-envelope': asSchema(cardEnvelopeSchema),
169
+ 'card-event': asSchema(cardEventSchema),
170
+ 'form.result': asSchema(formResultSchema),
171
+ 'tasks.result': asSchema(tasksResultSchema),
172
+ });
173
+
174
+ /** The built-in card types, in the order `cardSchemas` declares them. */
175
+ export const cardSchemaNames: readonly CardSchemaName[] = Object.freeze(
176
+ Object.keys(cardSchemas) as CardSchemaName[],
177
+ );
178
+
179
+ /** Narrow an arbitrary string to a built-in card type. */
180
+ export function isCardSchemaName(name: string): name is CardSchemaName {
181
+ return Object.prototype.hasOwnProperty.call(cardSchemas, name);
182
+ }
183
+
184
+ // Re-exported so a consumer reading a schema out of these maps can annotate what
185
+ // they hand to the kit's validator without a second import.
186
+ export type { JsonSchema, ValidationResult } from '../primitives/card-validate';
187
+ export type { CardEnvelope } from '../primitives/card-contract';
188
+
189
+ // The card PAYLOAD types — `CardEnvelope.data`, one per built-in card type — so a
190
+ // TypeScript backend can NAME the shape it is building instead of assembling an
191
+ // `unknown` and hoping.
192
+ //
193
+ // This is the point of the whole entry, restated at the type level. We publish
194
+ // `./schemas/*.json` precisely so a Python or Go route can generate models for
195
+ // these payloads, and until this block existed TypeScript — the language the kit
196
+ // is authored in — was the one that could not: the types lived inside their
197
+ // components' `.tsx`, so naming one from a Node/no-DOM project was TS6142 and
198
+ // re-exporting one from here would have dragged the Solid tree into this entry's
199
+ // graph. They are authored in ../primitives/card-data-types.ts now, which has no
200
+ // DOM and no Solid below it, so this costs the entry nothing — see that file's
201
+ // header, and note that the check which can tell the difference is
202
+ // `tsc --noEmit -p tsconfig.mcp.json` on a tree with no dist/ present.
203
+ //
204
+ // Types only: they erase, so this adds nothing to dist/schemas.js.
205
+ export type {
206
+ ArtifactCardData,
207
+ ArtifactCardEnvelope,
208
+ ArtifactCardFile,
209
+ ArtifactCardTab,
210
+ ChoiceAllowOther,
211
+ ChoiceCardData,
212
+ ChoiceCardEnvelope,
213
+ ChoiceOption,
214
+ ChoiceOptionMedia,
215
+ ConfirmAction,
216
+ ConfirmActionStyle,
217
+ ConfirmCardData,
218
+ ConfirmCardEnvelope,
219
+ ConfirmTone,
220
+ FormCardEnvelope,
221
+ FormDefinition,
222
+ FormField,
223
+ TasksCardData,
224
+ TasksCardEnvelope,
225
+ TasksCardResult,
226
+ TasksTask,
227
+ } from '../primitives/card-data-types';
228
+
229
+ // The remaining two payload types, `link` and `embed`.
230
+ //
231
+ // They are NOT in card-data-types.ts, and that is deliberate rather than an
232
+ // oversight to be tidied later: that file exists to rescue types that were
233
+ // trapped inside a `.tsx`, and these two never were. `LinkPreviewData` and
234
+ // `EmbedCardData` have always been authored beside the pure logic that consumes
235
+ // them — `resolveLinkMetadata`, `resolveEmbed`/`watchUrl` — in modules that carry
236
+ // no DOM and no Solid, so they were already importable from a Node/no-DOM
237
+ // project. Moving them would buy nothing and would split each type from the
238
+ // functions written against it.
239
+ //
240
+ // Which is precisely how they got missed. The extraction that created
241
+ // card-data-types.ts swept the `.tsx` files, exported what it found HERE, and
242
+ // the two types that needed no rescuing were never on its list — five of seven
243
+ // payload types landed on this entry and nobody noticed the other two, because
244
+ // both are exported from src/index.ts and every check asked only whether a
245
+ // consumer could reach them from SOME public barrel. A backend cannot import
246
+ // from src/index.ts; that is the Solid-bearing one. See the REACHABILITY note in
247
+ // card-type-parity.test.ts, which now enumerates the payload types from
248
+ // `cardSchemas` and requires each to be reachable from THIS entry specifically.
249
+ //
250
+ // `EmbedProvider` comes along because `EmbedCardData.provider` names it, and a
251
+ // member type a consumer cannot import leaves them writing `provider: 'youtube'
252
+ // as EmbedCardData['provider']`. `ResolvedEmbed` and `LinkMetadataFetcher` stay
253
+ // off this entry on purpose — they describe how a card RENDERS and how an app
254
+ // resolves metadata in the browser, neither of which a route builds.
255
+ export type { EmbedCardData, EmbedCardEnvelope, EmbedProvider } from '../primitives/embed-providers';
256
+ export type { LinkPreviewData, LinkPreviewEnvelope } from '../primitives/link-preview';
257
+
258
+ // The loop, both directions.
259
+ //
260
+ // `cardTools` projects a card schema INTO a provider tool definition;
261
+ // `cardFromToolCall` turns the model's call back into a renderable envelope. They
262
+ // are the two halves of one contract and the tool-name convention that joins them
263
+ // lives in ./from-tool-call, spelled once. Exporting `from-tool-call` here is not
264
+ // bookkeeping: `verify:schemas` and `verify:ssr` both read the BUILT entry, so a
265
+ // module missing from this barrel is a module no guard covers.
266
+ export { cardFromToolCall, isCardTool, cardTypeFromToolName, toolNameForCardType, KAI_TOOL_PREFIX } from './from-tool-call';
267
+
268
+ // `tool-defs` imports `cardSchemas` back out of this module so that
269
+ // `cardTools({ provider })` can default to the built-ins. That cycle is deliberate
270
+ // and safe (the read happens inside a function, never at module init); the comment
271
+ // on `builtInSchemas()` over there explains why, and why it must not be hoisted.
272
+ export {
273
+ CARD_TOOL_DESCRIPTIONS,
274
+ UnsupportedCardToolSchemaError,
275
+ cardTools,
276
+ toAnthropicTools,
277
+ toJsonSchemaTools,
278
+ toOpenAITools,
279
+ } from './tool-defs';
280
+ export type {
281
+ AnthropicToolDef,
282
+ CardToolInput,
283
+ CardToolOptions,
284
+ CardToolSource,
285
+ JsonSchemaToolDef,
286
+ OpenAIToolDef,
287
+ ToolDef,
288
+ ToolDefFor,
289
+ ToolParameters,
290
+ ToolProvider,
291
+ UnsupportedCardTool,
292
+ } from './tool-defs';
293
+
294
+ // The registry: "these are the card types THIS app renders", written once and threaded
295
+ // to both ends (`chat.cardTypes = cards.tags` on the client, `cardTools(cards, …)` on
296
+ // the route). It is what turns the `cardTypes` seam from something a developer CAN use
297
+ // into the path they normally take, which is the only thing that stops it rotting again
298
+ // the way it did when the conformance spike's `spike-artifact` workaround was deleted.
299
+ //
300
+ // `registry.ts` imports `cardSchemas` back out of this module, the same deliberate
301
+ // cycle `tool-defs` has and for the same reason; the read happens inside
302
+ // `createCardRegistry`, never at module init.
303
+ export { createCardRegistry } from './registry';
304
+ export type { CardRegistry, CardRegistrySpec, CustomCardSpec, IncompletePolicy } from './registry';
305
+
306
+ // Re-exported so a route can check a custom card's data server-side, in the tool loop,
307
+ // with the same tiering the browser dispatchers use, rather than a second validator.
308
+ // `registry.validate()` is the ergonomic form; this is the same function underneath.
309
+ export { cardValidationMessage, validateCardData } from '../primitives/card-validate-cards';
310
+ export type { CardValidationIssue, CardValidationReport, CardValidationTier } from '../primitives/card-validate-cards';
311
+
312
+ // `CardEnvelope.type` -> the `kai-*` element that renders it — exported because a
313
+ // server-side reader needed it and was inventing its own answer instead.
314
+ //
315
+ // src/agent-tooling/mcp/manifest.ts used to RE-DERIVE this map from the element
316
+ // manifest by convention (`kai-<type>`, else the single `kai-<type>-*`). The
317
+ // derivation was correct — it even got `link` -> `kai-link-preview` right, via the
318
+ // prefix branch — but it was a second copy of a fact the repo already held, kept
319
+ // honest only by a test. It re-derived because the authoritative map shared a module
320
+ // with `BUILTIN_CARD_COMPONENTS`, which is nothing but Solid, and the MCP is a
321
+ // Node/no-DOM project (tsconfig.mcp.json: `lib: ["ESNext"]`, no `jsx` — giving it one
322
+ // measures 0 errors -> 1364). src/primitives/card-tags.ts is that data on its own, so
323
+ // the map is now readable from source by anything, with or without a DOM.
324
+ //
325
+ // See "WHAT `verify:ssr` DOES NOT CATCH" above before describing the split as a
326
+ // bundle-safety fix: it is a dependency-graph fix, and the bundle is identical either
327
+ // way today.
328
+ //
329
+ // `mergeCardTags` is deliberately NOT re-exported here: merging a consumer's overrides
330
+ // is a rendering concern, it already ships from the main entry, and this one is for
331
+ // routes.
332
+ export { BUILTIN_CARD_TAGS } from '../primitives/card-tags';
333
+ export type { CardTagMap } from '../primitives/card-tags';
334
+
335
+ // The two provider subsets, exported rather than kept private, because a developer
336
+ // registering a CUSTOM card schema in Phase 2 needs the same check we run on ours,
337
+ // and because `verify:tool-schemas` reads them out of the BUILT entry rather than
338
+ // re-deriving them (a guard with its own copy of the table proves nothing).
339
+ export { ANTHROPIC_STRICT, OPENAI_STRICT, checkProviderSubset, providerSubsets } from './provider-subsets';
340
+ export type { KeywordRule, KeywordStatus, ProviderSubset, StrictProviderId, SubsetViolation } from './provider-subsets';