@kitn.ai/ui 0.20.1 → 0.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (500) hide show
  1. package/README.md +44 -45
  2. package/dist/components/artifact-card.d.ts +51 -0
  3. package/dist/components/artifact.d.ts +1 -1
  4. package/dist/components/attachments.d.ts +2 -2
  5. package/dist/components/audio-visualizer/index.d.ts +3 -3
  6. package/dist/components/audio-visualizer/labs/lab-choreography.d.ts +59 -0
  7. package/dist/components/audio-visualizer/labs/lab-shaders.d.ts +22 -0
  8. package/dist/components/audio-visualizer/labs/lab-visualizer.d.ts +18 -0
  9. package/dist/components/audio-visualizer/variant-aurora.d.ts +2 -2
  10. package/dist/components/audio-visualizer/variant-bar.d.ts +2 -2
  11. package/dist/components/audio-visualizer/variant-custom.d.ts +2 -2
  12. package/dist/components/audio-visualizer/variant-grid.d.ts +1 -1
  13. package/dist/components/audio-visualizer/variant-radial.d.ts +1 -1
  14. package/dist/components/audio-visualizer/variant-wave.d.ts +1 -1
  15. package/dist/components/card-fallback.d.ts +12 -2
  16. package/dist/components/card-renderer.d.ts +63 -2
  17. package/dist/components/chat-container.d.ts +3 -0
  18. package/dist/components/chat-scope-picker.d.ts +2 -2
  19. package/dist/components/chat-thread.d.ts +68 -18
  20. package/dist/components/choice-card.d.ts +3 -28
  21. package/dist/components/composer-dom.d.ts +1 -1
  22. package/dist/components/composer-highlight.d.ts +1 -1
  23. package/dist/components/composer-history.d.ts +1 -1
  24. package/dist/components/composer.d.ts +1 -1
  25. package/dist/components/confirm-card.d.ts +3 -18
  26. package/dist/components/context.d.ts +8 -4
  27. package/dist/components/conversation-item.d.ts +1 -1
  28. package/dist/components/conversation-list.d.ts +4 -3
  29. package/dist/components/embed.d.ts +3 -3
  30. package/dist/components/file-tree.d.ts +11 -22
  31. package/dist/components/form-widgets.d.ts +1 -1
  32. package/dist/components/form.d.ts +3 -44
  33. package/dist/components/link-preview.d.ts +3 -3
  34. package/dist/components/loader.d.ts +30 -48
  35. package/dist/components/message-skills.d.ts +4 -0
  36. package/dist/components/message.d.ts +84 -21
  37. package/dist/components/model-switcher.d.ts +2 -2
  38. package/dist/components/prompt-input.d.ts +2 -2
  39. package/dist/components/response-compare-types.d.ts +11 -2
  40. package/dist/components/response-compare.d.ts +3 -3
  41. package/dist/components/source.d.ts +12 -3
  42. package/dist/components/tasks-card.d.ts +3 -31
  43. package/dist/components/thread.d.ts +17 -5
  44. package/dist/components/toast.d.ts +2 -2
  45. package/dist/components/tool-classify.d.ts +8 -0
  46. package/dist/components/tool-types.d.ts +29 -1
  47. package/dist/components/tool.d.ts +3 -3
  48. package/dist/components/use-card-resolution.d.ts +1 -1
  49. package/dist/create-tween-D3Y5qiij.js +338 -0
  50. package/dist/create-tween-DGKY1FDY.js +341 -0
  51. package/dist/create-tween-paho5Rh-.js +7 -0
  52. package/dist/custom-elements.json +1681 -454
  53. package/dist/elements/agent-card.js +1 -1
  54. package/dist/elements/artifact.js +1 -1
  55. package/dist/elements/attachments.js +1 -1
  56. package/dist/elements/audio-visualizer.js +1 -1
  57. package/dist/elements/avatar.js +1 -1
  58. package/dist/elements/badge.js +1 -1
  59. package/dist/elements/button.js +1 -1
  60. package/dist/elements/card.js +1 -1
  61. package/dist/elements/cards.js +1 -1
  62. package/dist/elements/chain-of-thought.js +1 -1
  63. package/dist/elements/chat-scope-picker.js +1 -1
  64. package/dist/elements/chat-types.d.ts +70 -10
  65. package/dist/elements/chat-workspace.js +1 -1
  66. package/dist/elements/chat.js +1 -1
  67. package/dist/elements/checkpoint.js +1 -1
  68. package/dist/elements/choice.js +1 -1
  69. package/dist/elements/chunks/{Icon-Tj58ES_d.js → Icon-C-2LvGDG.js} +1 -1
  70. package/dist/elements/chunks/{action-icons-ns1Fnedj.js → action-icons-CaYoImEk.js} +1 -1
  71. package/dist/elements/chunks/arrow-left-Bb46H7w9.js +1 -0
  72. package/dist/elements/chunks/artifact-BBIscOxJ.js +1 -0
  73. package/dist/elements/chunks/{attachments-mCB5F1Fq.js → attachments-BB56zoji.js} +1 -1
  74. package/dist/elements/chunks/audio-visualizer-BxOx4THz.js +1 -0
  75. package/dist/elements/chunks/{badge-B4Zuajl2.js → badge-SxLSZ19R.js} +1 -1
  76. package/dist/elements/chunks/{button-ZWNif3--.js → button-CmkUkz6c.js} +1 -1
  77. package/dist/elements/chunks/card-renderer-Db4ffkWv.js +1 -0
  78. package/dist/elements/chunks/card-tags-D8lZ-C_U.js +1 -0
  79. package/dist/elements/chunks/chat-thread-B3Ks-cKr.js +1 -0
  80. package/dist/elements/chunks/check-C8desc_h.js +1 -0
  81. package/dist/elements/chunks/chevron-down-DKtc2HNB.js +1 -0
  82. package/dist/elements/chunks/chevron-right-Dw4GPhwL.js +1 -0
  83. package/dist/elements/chunks/choice-card-Q9cYYDyM.js +1 -0
  84. package/dist/elements/chunks/circle-BeokBsvB.js +1 -0
  85. package/dist/elements/chunks/circle-check-wJSqt859.js +1 -0
  86. package/dist/elements/chunks/{circle-x-B7faJFlY.js → circle-x-D0MEfxOM.js} +1 -1
  87. package/dist/elements/chunks/code-block-C8VzAraE.js +1 -0
  88. package/dist/elements/chunks/{collapsible-DM1Ckd4e.js → collapsible-Cvj61obE.js} +1 -1
  89. package/dist/elements/chunks/{composer-BguS0QL_.js → composer-D86ztyL0.js} +2 -2
  90. package/dist/elements/chunks/confirm-card-BdyDAGLw.js +1 -0
  91. package/dist/elements/chunks/context-WHDl-xSx.js +1 -0
  92. package/dist/elements/chunks/conversation-list-CdR14_Y4.js +1 -0
  93. package/dist/elements/chunks/create-tween-C_A_B638.js +7 -0
  94. package/dist/elements/chunks/{default-input-Cqqilg9t.js → default-input-CSZqUM81.js} +1 -1
  95. package/dist/elements/chunks/define-BzPnNsXg.js +1 -0
  96. package/dist/elements/chunks/{disclosure-CIZ5c8nO.js → disclosure-DVKsoc1F.js} +1 -1
  97. package/dist/elements/chunks/{download-Dsbg3ste.js → download-BjA54IMJ.js} +1 -1
  98. package/dist/elements/chunks/{dropdown-BDd1-Zgi.js → dropdown-BjVVHWXH.js} +1 -1
  99. package/dist/elements/chunks/{ellipsis-Dw6qrss-.js → ellipsis-BNedmqfi.js} +1 -1
  100. package/dist/elements/chunks/embed-DQsl4XEq.js +1 -0
  101. package/dist/elements/chunks/{external-link-Vt74zAoL.js → external-link-Di-dw2CU.js} +1 -1
  102. package/dist/elements/chunks/{file-text-CZrZF6_v.js → file-text-B3sAODCV.js} +1 -1
  103. package/dist/elements/chunks/{file-tree-DF4okKyo.js → file-tree-Dgto-bMn.js} +1 -1
  104. package/dist/elements/chunks/{folder-glP5rha4.js → folder-D6rMadFV.js} +1 -1
  105. package/dist/elements/chunks/form-CILxvhQ7.js +1 -0
  106. package/dist/elements/chunks/hover-card-BtiF4XiU.js +1 -0
  107. package/dist/elements/chunks/{icon-BLb8beoi.js → icon-DKkmze3y.js} +1 -1
  108. package/dist/elements/chunks/{info-CIsv92JK.js → info-CWRjZkuy.js} +1 -1
  109. package/dist/elements/chunks/{input-Dds1kFyt.js → input--QJBK6BA.js} +1 -1
  110. package/dist/elements/chunks/{kbd-De_xbgi9.js → kbd-C3zuKh8R.js} +1 -1
  111. package/dist/elements/chunks/{link-i4r_k7z4.js → link-BL5JA7Q0.js} +1 -1
  112. package/dist/elements/chunks/link-preview-CU37bbXh.js +1 -0
  113. package/dist/elements/chunks/{loader-BmQH4s3V.js → loader-XmpyxyRH.js} +1 -1
  114. package/dist/elements/chunks/{markdown-Zi21WhUz.js → markdown-3Gv5UZ_o.js} +1 -1
  115. package/dist/elements/chunks/message-CnBA2OUt.js +1 -0
  116. package/dist/elements/chunks/message-X5NZbq-W.js +1 -0
  117. package/dist/elements/chunks/message-square-CnpAm_P0.js +1 -0
  118. package/dist/elements/chunks/{minimize-2--ifeCGrl.js → minimize-2-DwyrUTcM.js} +1 -1
  119. package/dist/elements/chunks/{model-switcher-B94YAKsM.js → model-switcher-CclaJEHt.js} +1 -1
  120. package/dist/elements/chunks/{overlay-kD8dwRv_.js → overlay-Cepd-KcS.js} +1 -1
  121. package/dist/elements/chunks/{paperclip-q21dYOSK.js → paperclip-CdwKjrlu.js} +1 -1
  122. package/dist/elements/chunks/{progress-bar-BrAIIaaJ.js → progress-bar-DMVXBD3b.js} +1 -1
  123. package/dist/elements/chunks/{prompt-suggestion-Bjn2K-fR.js → prompt-suggestion-Di_WZE_5.js} +1 -1
  124. package/dist/elements/chunks/reasoning-D0jMch5u.js +1 -0
  125. package/dist/elements/chunks/{resizable-Dp4JExql.js → resizable-1znbL1Gv.js} +1 -1
  126. package/dist/elements/chunks/{rotate-cw-CFWWkpj2.js → rotate-cw-DVhhgx8n.js} +1 -1
  127. package/dist/elements/chunks/{scroll-area-Bb0kHH1j.js → scroll-area-Bs4bFS1P.js} +1 -1
  128. package/dist/elements/chunks/scroll-button-Bet5NLc4.js +1 -0
  129. package/dist/elements/chunks/{separator-9kRgr1X9.js → separator-C5Gh8qGC.js} +1 -1
  130. package/dist/elements/chunks/{settings-B8lmec4D.js → settings-5vmEFg0K.js} +1 -1
  131. package/dist/elements/chunks/{settings-group-I0hEuXiN.js → settings-group-BWLB38kz.js} +1 -1
  132. package/dist/elements/chunks/{share-C3lTiYGt.js → share-BZ3G_DaB.js} +1 -1
  133. package/dist/elements/chunks/skeleton-DafPJQTp.js +1 -0
  134. package/dist/elements/chunks/slots-CIw9RlAe.js +1 -0
  135. package/dist/elements/chunks/source-D_qj_6uJ.js +1 -0
  136. package/dist/elements/chunks/{star-CSJtGxgv.js → star-Cuv7j2IE.js} +1 -1
  137. package/dist/elements/chunks/{store-CHyW95TP.js → store-C1StPHfW.js} +1 -1
  138. package/dist/elements/chunks/tasks-card-EyoBZfpA.js +1 -0
  139. package/dist/elements/chunks/{text-shimmer-Cn9TmNpI.js → text-shimmer-D9gRSh34.js} +1 -1
  140. package/dist/elements/chunks/textarea-DuhtHfcm.js +1 -0
  141. package/dist/elements/chunks/{thumbs-up-PNVVThEF.js → thumbs-up-B9hwv43w.js} +1 -1
  142. package/dist/elements/chunks/{toast-store-DKbQn3Wn.js → toast-store-Bm3DUEDe.js} +1 -1
  143. package/dist/elements/chunks/{tool-DjTRpIpl.js → tool-CDtW7L0z.js} +1 -1
  144. package/dist/elements/chunks/tooltip-eB226mGK.js +1 -0
  145. package/dist/elements/chunks/{triangle-alert-DsHTHCPm.js → triangle-alert-C1SNzTqK.js} +1 -1
  146. package/dist/elements/chunks/use-card-resolution-YZh2MvI5.js +1 -0
  147. package/dist/elements/chunks/{variant-aurora-Dc4nQUia.js → variant-aurora-Cj1F7D0l.js} +2 -2
  148. package/dist/elements/chunks/{variant-custom-y_3kVQhS.js → variant-custom-T9gpt7QE.js} +1 -1
  149. package/dist/elements/chunks/{variant-wave-D5OR1-9Z.js → variant-wave-CxU9z-TE.js} +2 -2
  150. package/dist/elements/chunks/{video-B7vmenoC.js → video-CK4R7Rus.js} +1 -1
  151. package/dist/elements/chunks/x-D1qx0aLd.js +1 -0
  152. package/dist/elements/coachmark.js +1 -1
  153. package/dist/elements/code-block.js +1 -1
  154. package/dist/elements/command.js +1 -1
  155. package/dist/elements/compare.js +1 -1
  156. package/dist/elements/composer.js +1 -1
  157. package/dist/elements/confirm-card.js +1 -1
  158. package/dist/elements/context-meter.js +1 -1
  159. package/dist/elements/conversation-list.js +1 -1
  160. package/dist/elements/default-input.d.ts +7 -7
  161. package/dist/elements/define.d.ts +1 -0
  162. package/dist/elements/dialog.js +1 -1
  163. package/dist/elements/disclosure.d.ts +1 -1
  164. package/dist/elements/editable-label.js +1 -1
  165. package/dist/elements/element-data-types.d.ts +107 -0
  166. package/dist/elements/embed.js +1 -1
  167. package/dist/elements/empty.js +1 -1
  168. package/dist/elements/feedback-bar.js +1 -1
  169. package/dist/elements/file-tree.js +1 -1
  170. package/dist/elements/file-upload.js +1 -1
  171. package/dist/elements/form.js +1 -1
  172. package/dist/elements/hover-card.js +1 -1
  173. package/dist/elements/icon.js +1 -1
  174. package/dist/elements/image.js +1 -1
  175. package/dist/elements/input.js +1 -1
  176. package/dist/elements/kbd.js +1 -1
  177. package/dist/elements/link-preview.js +1 -1
  178. package/dist/elements/loader.js +1 -1
  179. package/dist/elements/markdown.js +1 -1
  180. package/dist/elements/menu.js +1 -1
  181. package/dist/elements/message-skills.js +1 -1
  182. package/dist/elements/message.js +1 -1
  183. package/dist/elements/model-switcher.js +1 -1
  184. package/dist/elements/nav.js +1 -1
  185. package/dist/elements/notice.js +1 -1
  186. package/dist/elements/pane-group.js +1 -1
  187. package/dist/elements/pane.js +1 -1
  188. package/dist/elements/popover.js +1 -1
  189. package/dist/elements/progress-bar.js +1 -1
  190. package/dist/elements/prompt-dock.js +1 -1
  191. package/dist/elements/prompt-input.js +1 -1
  192. package/dist/elements/prompt-suggestions.js +1 -1
  193. package/dist/elements/reasoning.js +1 -1
  194. package/dist/elements/register.d.ts +8 -6
  195. package/dist/elements/remote.js +1 -1
  196. package/dist/elements/resizable.js +1 -1
  197. package/dist/elements/response-stream.js +2 -2
  198. package/dist/elements/screen.js +1 -1
  199. package/dist/elements/scroll-area.js +1 -1
  200. package/dist/elements/scroll-button.js +1 -1
  201. package/dist/elements/search.js +1 -1
  202. package/dist/elements/segmented.js +1 -1
  203. package/dist/elements/separator.js +1 -1
  204. package/dist/elements/setting-item.js +1 -1
  205. package/dist/elements/settings-group.js +1 -1
  206. package/dist/elements/skeleton.js +1 -1
  207. package/dist/elements/slots.d.ts +16 -0
  208. package/dist/elements/source.js +1 -1
  209. package/dist/elements/status.js +1 -1
  210. package/dist/elements/switch.js +1 -1
  211. package/dist/elements/tabs.js +1 -1
  212. package/dist/elements/tasks.js +1 -1
  213. package/dist/elements/text-shimmer.js +1 -1
  214. package/dist/elements/thinking-bar.js +1 -1
  215. package/dist/elements/thread.js +1 -1
  216. package/dist/elements/toast.js +1 -1
  217. package/dist/elements/tool.js +1 -1
  218. package/dist/elements/tooltip.js +1 -1
  219. package/dist/elements/validate-messages.d.ts +25 -0
  220. package/dist/elements/voice-input.js +1 -1
  221. package/dist/elements/voice-output.js +1 -1
  222. package/dist/elements.d.ts +2725 -214
  223. package/dist/index.d.ts +163 -125
  224. package/dist/index.js +6336 -5802
  225. package/dist/index.server.d.ts +5 -0
  226. package/dist/index.server.js +5446 -4937
  227. package/dist/kai-provider.es.d.ts +5 -0
  228. package/dist/kai-provider.es.js +79 -77
  229. package/dist/kai.es.d.ts +5 -0
  230. package/dist/kai.es.js +1 -1
  231. package/dist/llms/llms-full.txt +762 -148
  232. package/dist/llms/llms.txt +57 -5
  233. package/dist/mcp.es.js +4010 -770
  234. package/dist/primitives/card-component-types.d.ts +11 -0
  235. package/dist/primitives/card-data-types.d.ts +196 -0
  236. package/dist/primitives/card-host.d.ts +1 -1
  237. package/dist/primitives/card-recovery.d.ts +3 -3
  238. package/dist/primitives/card-registry.d.ts +4 -14
  239. package/dist/primitives/card-resolution.d.ts +1 -1
  240. package/dist/primitives/card-routing.d.ts +1 -1
  241. package/dist/primitives/card-tags.d.ts +11 -0
  242. package/dist/primitives/card-validate-cards.d.ts +57 -0
  243. package/dist/primitives/card-validate-generator.testlib.d.ts +20 -0
  244. package/dist/primitives/card-validate-schemas.d.ts +17 -0
  245. package/dist/primitives/card-validate.d.ts +24 -0
  246. package/dist/primitives/create-kai-chat.d.ts +3 -3
  247. package/dist/primitives/embed-providers.d.ts +1 -1
  248. package/dist/primitives/link-preview.d.ts +1 -1
  249. package/dist/primitives/message-feedback.d.ts +2 -2
  250. package/dist/primitives/toast-store.d.ts +1 -1
  251. package/dist/react/index.d.ts +717 -299
  252. package/dist/react/use-kai-chat.d.ts +8 -4
  253. package/dist/react.d.ts +5 -0
  254. package/dist/react.js +417 -316
  255. package/dist/register-impl-bzrZ44ft.js +145 -0
  256. package/dist/remote/host-embed.d.ts +1 -1
  257. package/dist/remote/index.d.ts +2 -2
  258. package/dist/remote/provider-runtime.d.ts +2 -2
  259. package/dist/remote/provider.d.ts +2 -2
  260. package/dist/remote/validate.d.ts +1 -1
  261. package/dist/remote/wire.d.ts +1 -1
  262. package/dist/schemas/artifact.schema.json +92 -0
  263. package/dist/schemas/embed.schema.json +0 -2
  264. package/dist/schemas/from-tool-call.d.ts +48 -0
  265. package/dist/schemas/index.d.ts +48 -0
  266. package/dist/schemas/link.schema.json +0 -2
  267. package/dist/schemas/provider-subsets.d.ts +136 -0
  268. package/dist/schemas/registry.d.ts +140 -0
  269. package/dist/schemas/tool-defs.d.ts +121 -0
  270. package/dist/schemas.d.ts +5 -0
  271. package/dist/schemas.js +717 -0
  272. package/dist/solid-BCJUQqwS.js +22750 -0
  273. package/dist/solid-BdENBcEq.js +20108 -0
  274. package/dist/solid.d.ts +66 -0
  275. package/dist/solid.js +261 -0
  276. package/dist/solid.server.d.ts +5 -0
  277. package/dist/solid.server.js +261 -0
  278. package/dist/state/index.d.ts +14 -4
  279. package/dist/state/messages.d.ts +8 -3
  280. package/dist/state/mock.d.ts +46 -0
  281. package/dist/state/parts.d.ts +85 -0
  282. package/dist/state/stream.d.ts +15 -9
  283. package/dist/state.d.ts +5 -0
  284. package/dist/state.js +253 -84
  285. package/dist/ui/action-icons.d.ts +1 -1
  286. package/dist/ui/collapsible.d.ts +11 -6
  287. package/dist/ui/dropdown.d.ts +47 -42
  288. package/dist/ui/pane-group.d.ts +1 -1
  289. package/dist/variant-aurora-1wMcXRUS.js +381 -0
  290. package/dist/variant-aurora-BKHHiOgL.js +391 -0
  291. package/dist/{variant-aurora-DVtGqVH6.js → variant-aurora-DOb_o4pC.js} +1 -1
  292. package/dist/{variant-custom-Dif-IV4u.js → variant-custom-CJGB0Kbw.js} +1 -1
  293. package/dist/variant-custom-Co0CkXJF.js +200 -0
  294. package/dist/variant-custom-DWSSgmd2.js +170 -0
  295. package/dist/variant-wave-C3-45cL6.js +218 -0
  296. package/dist/{variant-wave-DbfNdvSi.js → variant-wave-CEODq-9q.js} +1 -1
  297. package/dist/variant-wave-jdXBnCUZ.js +208 -0
  298. package/dist/wire/chunk.d.ts +171 -0
  299. package/dist/wire/consume.d.ts +26 -0
  300. package/dist/wire/encode.d.ts +148 -0
  301. package/dist/wire/formats/anthropic.d.ts +2 -0
  302. package/dist/wire/formats/openai.d.ts +5 -0
  303. package/dist/wire/index.d.ts +14 -0
  304. package/dist/wire/read.d.ts +26 -0
  305. package/dist/wire/sink-helpers.d.ts +21 -0
  306. package/dist/wire/sse.d.ts +33 -0
  307. package/dist/wire.d.ts +5 -53
  308. package/dist/wire.js +898 -0
  309. package/frameworks/react/index.tsx +183 -154
  310. package/frameworks/react/runtime.tsx +21 -1
  311. package/frameworks/react/use-kai-chat.tsx +11 -1
  312. package/llms-full.txt +762 -148
  313. package/llms.txt +57 -5
  314. package/package.json +61 -8
  315. package/src/agent-tooling/archetypes.ts +96 -0
  316. package/src/agent-tooling/integrations/anthropic.ts +412 -0
  317. package/src/agent-tooling/integrations/cloudflare.ts +136 -52
  318. package/src/agent-tooling/integrations/langgraph.ts +67 -13
  319. package/src/agent-tooling/integrations/mastra.ts +120 -12
  320. package/src/agent-tooling/integrations/mock.ts +43 -8
  321. package/src/agent-tooling/integrations/ollama.ts +61 -24
  322. package/src/agent-tooling/integrations/openai.ts +87 -0
  323. package/src/agent-tooling/integrations/openrouter.ts +56 -8
  324. package/src/agent-tooling/integrations/pi.ts +79 -23
  325. package/src/agent-tooling/integrations/pydantic-ai.ts +24 -2
  326. package/src/agent-tooling/integrations/vercel-ai-sdk.ts +84 -13
  327. package/src/agent-tooling/mcp/manifest.ts +206 -25
  328. package/src/agent-tooling/mcp/tools/debug.ts +13 -7
  329. package/src/agent-tooling/mcp/tools/reference.ts +285 -6
  330. package/src/agent-tooling/mcp/tools/scaffold.ts +3345 -675
  331. package/src/agent-tooling/registry.ts +17 -0
  332. package/src/agent-tooling/types.ts +229 -1
  333. package/src/components/artifact-card.tsx +120 -0
  334. package/src/components/audio-visualizer/index.tsx +9 -0
  335. package/src/components/audio-visualizer/labs/lab-choreography.ts +187 -0
  336. package/src/components/audio-visualizer/labs/lab-shaders.ts +363 -0
  337. package/src/components/audio-visualizer/labs/lab-visualizer.tsx +102 -0
  338. package/src/components/audio-visualizer/shader-canvas.tsx +31 -1
  339. package/src/components/card-fallback.tsx +42 -10
  340. package/src/components/card-renderer.tsx +146 -9
  341. package/src/components/chat-container.tsx +4 -0
  342. package/src/components/chat-thread.tsx +118 -51
  343. package/src/components/choice-card.tsx +17 -29
  344. package/src/components/composer.tsx +12 -2
  345. package/src/components/confirm-card.tsx +24 -20
  346. package/src/components/context.tsx +12 -4
  347. package/src/components/conversation-list.tsx +18 -2
  348. package/src/components/file-tree.tsx +11 -22
  349. package/src/components/file-upload.tsx +14 -8
  350. package/src/components/form.tsx +14 -47
  351. package/src/components/loader.tsx +39 -12
  352. package/src/components/message-skills.tsx +4 -0
  353. package/src/components/message.tsx +294 -46
  354. package/src/components/reasoning.tsx +92 -5
  355. package/src/components/response-compare-types.ts +25 -0
  356. package/src/components/response-compare.tsx +4 -9
  357. package/src/components/source.tsx +50 -24
  358. package/src/components/tasks-card.tsx +10 -33
  359. package/src/components/thread.tsx +84 -42
  360. package/src/components/toast.tsx +11 -5
  361. package/src/components/tool-classify.ts +26 -0
  362. package/src/components/tool-types.ts +31 -1
  363. package/src/elements/agent-card.tsx +11 -11
  364. package/src/elements/artifact.tsx +15 -7
  365. package/src/elements/attachments.tsx +6 -4
  366. package/src/elements/avatar.tsx +1 -1
  367. package/src/elements/button.tsx +3 -3
  368. package/src/elements/card.tsx +2 -2
  369. package/src/elements/cards.tsx +109 -14
  370. package/src/elements/chain-of-thought.tsx +14 -10
  371. package/src/elements/chat-scope-picker.tsx +9 -7
  372. package/src/elements/chat-types.ts +59 -6
  373. package/src/elements/chat-workspace.tsx +50 -9
  374. package/src/elements/chat.tsx +64 -3
  375. package/src/elements/choice.tsx +8 -8
  376. package/src/elements/coachmark.tsx +1 -1
  377. package/src/elements/command.tsx +8 -23
  378. package/src/elements/compare.tsx +7 -6
  379. package/src/elements/compiled.css +1 -1
  380. package/src/elements/composer.tsx +8 -8
  381. package/src/elements/confirm-card.tsx +9 -9
  382. package/src/elements/context-meter.tsx +4 -18
  383. package/src/elements/conversation-list.tsx +14 -9
  384. package/src/elements/default-input.tsx +3 -3
  385. package/src/elements/define.tsx +178 -43
  386. package/src/elements/editable-label.tsx +17 -2
  387. package/src/elements/element-data-types.ts +112 -0
  388. package/src/elements/element-meta.json +1596 -304
  389. package/src/elements/element-types.d.ts +2636 -211
  390. package/src/elements/feedback-bar.tsx +1 -1
  391. package/src/elements/file-tree.tsx +1 -1
  392. package/src/elements/file-upload.tsx +1 -1
  393. package/src/elements/form.tsx +14 -6
  394. package/src/elements/input.tsx +1 -1
  395. package/src/elements/kbd.tsx +1 -1
  396. package/src/elements/menu.tsx +10 -29
  397. package/src/elements/message-skills.tsx +7 -9
  398. package/src/elements/message.tsx +200 -32
  399. package/src/elements/model-switcher.tsx +5 -3
  400. package/src/elements/pane.tsx +1 -1
  401. package/src/elements/prompt-dock.tsx +8 -8
  402. package/src/elements/prompt-input.tsx +10 -10
  403. package/src/elements/prompt-suggestions.tsx +7 -4
  404. package/src/elements/reasoning.tsx +1 -1
  405. package/src/elements/register.ts +9 -0
  406. package/src/elements/resizable.globals.d.ts +36 -0
  407. package/src/elements/resizable.tsx +24 -13
  408. package/src/elements/response-stream.tsx +1 -1
  409. package/src/elements/scroll-button.tsx +1 -1
  410. package/src/elements/search.tsx +6 -1
  411. package/src/elements/segmented.tsx +5 -11
  412. package/src/elements/separator.tsx +1 -1
  413. package/src/elements/slots.ts +57 -24
  414. package/src/elements/source.tsx +21 -22
  415. package/src/elements/switch.tsx +3 -3
  416. package/src/elements/tasks.tsx +5 -4
  417. package/src/elements/thread.tsx +36 -4
  418. package/src/elements/toast.tsx +3 -2
  419. package/src/elements/tool.tsx +1 -1
  420. package/src/elements/validate-messages.ts +76 -0
  421. package/src/elements/voice-input.tsx +7 -7
  422. package/src/elements/voice-output.tsx +4 -4
  423. package/src/index.ts +141 -6
  424. package/src/primitives/card-component-types.ts +63 -0
  425. package/src/primitives/card-data-types.ts +312 -0
  426. package/src/primitives/card-recovery.ts +13 -2
  427. package/src/primitives/card-registry.tsx +34 -23
  428. package/src/primitives/card-schemas/artifact.schema.json +92 -0
  429. package/src/primitives/card-schemas/embed.schema.json +0 -2
  430. package/src/primitives/card-schemas/link.schema.json +0 -2
  431. package/src/primitives/card-tags.ts +61 -0
  432. package/src/primitives/card-validate-cards.ts +255 -0
  433. package/src/primitives/card-validate-generator.testlib.ts +38 -0
  434. package/src/primitives/card-validate-schemas.ts +58 -0
  435. package/src/primitives/card-validate.ts +48 -20
  436. package/src/primitives/create-tween.ts +54 -2
  437. package/src/primitives/message-feedback.ts +3 -2
  438. package/src/primitives/use-audio-analysis.ts +20 -1
  439. package/src/primitives/use-sequencer.ts +20 -1
  440. package/src/schemas/from-tool-call.ts +151 -0
  441. package/src/schemas/index.ts +340 -0
  442. package/src/schemas/provider-subsets.ts +538 -0
  443. package/src/schemas/registry.ts +355 -0
  444. package/src/schemas/tool-defs.ts +492 -0
  445. package/src/solid.ts +150 -0
  446. package/src/state/index.ts +27 -1
  447. package/src/state/messages.ts +21 -4
  448. package/src/state/mock.ts +211 -0
  449. package/src/state/parts.ts +295 -0
  450. package/src/state/stream.ts +56 -58
  451. package/src/ui/collapsible.tsx +17 -5
  452. package/src/ui/dropdown.tsx +46 -12
  453. package/src/ui/overlay.tsx +10 -4
  454. package/src/wire/chunk.ts +201 -0
  455. package/src/wire/consume.ts +440 -0
  456. package/src/wire/encode.ts +474 -0
  457. package/src/wire/formats/anthropic.ts +267 -0
  458. package/src/wire/formats/openai.ts +187 -0
  459. package/src/wire/index.ts +52 -0
  460. package/src/wire/read.ts +152 -0
  461. package/src/wire/sink-helpers.ts +50 -0
  462. package/src/wire/sse.ts +140 -0
  463. package/dist/create-tween-hvpmSuwW.js +0 -7
  464. package/dist/elements/chunks/arrow-left-DQocUFvy.js +0 -1
  465. package/dist/elements/chunks/audio-visualizer-BqNy7dfm.js +0 -1
  466. package/dist/elements/chunks/card-BkHbp4BA.js +0 -1
  467. package/dist/elements/chunks/chat-thread-CkRN6pZ7.js +0 -1
  468. package/dist/elements/chunks/check-B9-gn6SS.js +0 -1
  469. package/dist/elements/chunks/chevron-down-BNsxc2hk.js +0 -1
  470. package/dist/elements/chunks/chevron-right-Hv00StBO.js +0 -1
  471. package/dist/elements/chunks/circle-0e3KJTDr.js +0 -1
  472. package/dist/elements/chunks/circle-check-BNAS0JEy.js +0 -1
  473. package/dist/elements/chunks/code-block-BFUHn6Va.js +0 -1
  474. package/dist/elements/chunks/context-Cb7k4F-v.js +0 -1
  475. package/dist/elements/chunks/conversation-list-CvoAkWhN.js +0 -1
  476. package/dist/elements/chunks/create-tween-oVvAIG8r.js +0 -7
  477. package/dist/elements/chunks/define-D1din7Ld.js +0 -1
  478. package/dist/elements/chunks/hover-card-Cmm6Q53m.js +0 -1
  479. package/dist/elements/chunks/message-BqyXDN3-.js +0 -1
  480. package/dist/elements/chunks/message-feedback-Djr3z6Yb.js +0 -1
  481. package/dist/elements/chunks/message-square-vFAgbDaX.js +0 -1
  482. package/dist/elements/chunks/reasoning-DTpCGtnY.js +0 -1
  483. package/dist/elements/chunks/scroll-button-B0cH5fXf.js +0 -1
  484. package/dist/elements/chunks/skeleton-DSXW5Yya.js +0 -1
  485. package/dist/elements/chunks/slots--V19HwUb.js +0 -1
  486. package/dist/elements/chunks/textarea-CUwqAX0G.js +0 -1
  487. package/dist/elements/chunks/tooltip-CgBZCVKp.js +0 -1
  488. package/dist/elements/chunks/use-card-resolution-BSu_XHjH.js +0 -1
  489. package/dist/elements/chunks/x-GRUeeQFT.js +0 -1
  490. package/dist/host-embed.d.ts +0 -33
  491. package/dist/kai-provider.d.ts +0 -2
  492. package/dist/origin.d.ts +0 -5
  493. package/dist/provider-runtime.d.ts +0 -27
  494. package/dist/register-impl-DQyejdfb.js +0 -145
  495. package/dist/validate.d.ts +0 -4
  496. package/dist/version.d.ts +0 -4
  497. package/src/components/component-meta.json +0 -4550
  498. package/src/elements/card-media.jpg +0 -0
  499. package/src/elements/resizable.d.ts +0 -27
  500. package/src/elements/video-poster.jpg +0 -0
@@ -0,0 +1,11 @@
1
+ import { Component } from 'solid-js';
2
+ import { CardEnvelope, CardHost } from './card-contract.js';
3
+ /** Solid renderer for one envelope. `host` is the resolved CardHost so each wrapper
4
+ * can bridge its card's emit convention (form/confirm/tasks take `host`;
5
+ * link/embed take `onEmit`). */
6
+ export type CardComponent = Component<{
7
+ envelope: CardEnvelope;
8
+ host?: CardHost;
9
+ }>;
10
+ /** Solid layer: envelope type → the component that draws it. */
11
+ export type CardComponentMap = Record<string, CardComponent>;
@@ -0,0 +1,196 @@
1
+ import { CardEnvelope } from './card-contract.js';
2
+ export type ConfirmActionStyle = 'primary' | 'default' | 'destructive';
3
+ export type ConfirmTone = 'default' | 'warning' | 'danger';
4
+ export type ConfirmAction = {
5
+ id: string;
6
+ label: string;
7
+ style?: ConfirmActionStyle;
8
+ payload?: unknown;
9
+ default?: boolean;
10
+ };
11
+ export type ConfirmCardData = {
12
+ heading?: string;
13
+ body?: string;
14
+ tone?: ConfirmTone;
15
+ actions: ConfirmAction[];
16
+ dismissible?: boolean;
17
+ };
18
+ export type ConfirmCardEnvelope = CardEnvelope<'confirm', ConfirmCardData>;
19
+ export type ChoiceOptionMedia = {
20
+ image?: string;
21
+ imageAlt?: string;
22
+ icon?: string;
23
+ };
24
+ export type ChoiceOption = {
25
+ id: string;
26
+ label: string;
27
+ description?: string;
28
+ media?: ChoiceOptionMedia;
29
+ meta?: string;
30
+ recommended?: boolean;
31
+ disabled?: boolean;
32
+ payload?: unknown;
33
+ };
34
+ export type ChoiceAllowOther = boolean | {
35
+ label?: string;
36
+ placeholder?: string;
37
+ };
38
+ export type ChoiceCardData = {
39
+ prompt?: string;
40
+ options: ChoiceOption[];
41
+ allowOther?: ChoiceAllowOther;
42
+ submitLabel?: string;
43
+ dismissible?: boolean;
44
+ };
45
+ export type ChoiceCardEnvelope = CardEnvelope<'choice', ChoiceCardData>;
46
+ export type TasksTask = {
47
+ id: string;
48
+ label: string;
49
+ description?: string;
50
+ checked?: boolean;
51
+ disabled?: boolean;
52
+ };
53
+ export type TasksCardData = {
54
+ /**
55
+ * `select` (default) = checkbox rows + a confirm button that emits the contract
56
+ * `submit`. `progress` = an onboarding/checklist look: a header `done / total`
57
+ * count, circular indicators, per-item title + muted description, and NO confirm
58
+ * button (checking a row is itself the terminal action). Both share the same
59
+ * selection model (toggle by id, the `max` gate, `kai-value-change`); `progress`
60
+ * is purely a presentational variant.
61
+ */
62
+ mode?: 'select' | 'progress';
63
+ heading?: string;
64
+ tasks: TasksTask[];
65
+ selectAll?: boolean;
66
+ confirmLabel?: string;
67
+ allowEmpty?: boolean;
68
+ min?: number;
69
+ max?: number;
70
+ dismissible?: boolean;
71
+ };
72
+ export type TasksCardResult = {
73
+ selected: string[];
74
+ };
75
+ export type TasksCardEnvelope = CardEnvelope<'tasks', TasksCardData>;
76
+ /** A field definition (the JSON Schema subset kai-form renders). */
77
+ export type FormField = {
78
+ type: 'string' | 'number' | 'integer' | 'boolean' | 'array' | 'object';
79
+ title?: string;
80
+ description?: string;
81
+ default?: unknown;
82
+ enum?: unknown[];
83
+ format?: 'email' | 'uri' | 'url' | 'date' | 'date-time' | 'time';
84
+ minimum?: number;
85
+ maximum?: number;
86
+ minLength?: number;
87
+ maxLength?: number;
88
+ pattern?: string;
89
+ minItems?: number;
90
+ maxItems?: number;
91
+ items?: FormField | {
92
+ enum: unknown[];
93
+ };
94
+ properties?: Record<string, FormField>;
95
+ required?: string[];
96
+ readOnly?: boolean;
97
+ 'x-kai-widget'?: 'textarea' | 'slider' | 'rating' | 'radio' | 'select' | 'checkbox' | 'password' | 'switch';
98
+ 'x-kai-placeholder'?: string;
99
+ 'x-kai-step'?: number;
100
+ };
101
+ /** The form definition = CardEnvelope.data for type:'form'. */
102
+ export type FormDefinition = {
103
+ type: 'object';
104
+ title?: string;
105
+ description?: string;
106
+ required?: string[];
107
+ properties: Record<string, FormField>;
108
+ 'x-kai-order'?: string[];
109
+ 'x-kai-inlineMax'?: number;
110
+ 'x-kai-submitLabel'?: string;
111
+ 'x-kai-dismissible'?: boolean;
112
+ 'x-kai-actions'?: {
113
+ id: string;
114
+ label: string;
115
+ variant?: 'default' | 'ghost' | 'outline';
116
+ }[];
117
+ };
118
+ export type FormCardEnvelope = CardEnvelope<'form', FormDefinition>;
119
+ /**
120
+ * One file behind an artifact card: the Code tab's tree row, plus where the
121
+ * preview loads it.
122
+ *
123
+ * The SAME declaration the `FileTree` primitive uses — `components/file-tree.tsx`
124
+ * re-exports this as `FileTreeFile` and `components/artifact.tsx` aliases that to
125
+ * `ArtifactFile`, so there is one shape here and not a copy of one. It is authored
126
+ * in this file rather than in file-tree.tsx for this module's whole reason: it is
127
+ * reachable from `ArtifactCardData`, so leaving it in a `.tsx` would put TS6142
128
+ * back on any Node/no-DOM project that names an artifact card payload, and the
129
+ * extraction would have moved four of five types and quietly failed on the fifth.
130
+ * It mirrors `artifact.schema.json`'s `files[].items`, which carries the same
131
+ * fields with `additionalProperties: false`.
132
+ */
133
+ export type ArtifactCardFile = {
134
+ /** Tree label/key. Folders are built from `/`-delimited segments. */
135
+ path: string;
136
+ /** Where the preview loads it (CDN/S3/dev-server/API). */
137
+ url?: string;
138
+ /** Source for the Code tab. */
139
+ code?: string;
140
+ /** Language id for syntax highlighting (e.g. `html`, `css`, `tsx`). */
141
+ language?: string;
142
+ /** Kind — drives the icon + whether Code applies. */
143
+ type?: 'html' | 'pdf' | 'image' | 'other';
144
+ /** Lines added vs the base. Rendered as a trailing `+N` stat (success hue,
145
+ * tabular-nums). Only shown when present; omit for a plain file row. */
146
+ additions?: number;
147
+ /** Lines removed vs the base. Rendered as a trailing `-N` stat (error hue). */
148
+ deletions?: number;
149
+ /** Change status vs the base. Drives a small trailing status letter in the
150
+ * conventional VCS hue (added=green, modified=amber, deleted=red,
151
+ * renamed=blue, untracked=muted). Only shown when present. */
152
+ status?: 'added' | 'modified' | 'deleted' | 'renamed' | 'untracked';
153
+ };
154
+ /** Which view an artifact card opens on. */
155
+ export type ArtifactCardTab = 'preview' | 'code';
156
+ /** The `artifact` card payload: a deliberately NARROW subset of `ArtifactProps`.
157
+ *
158
+ * A card envelope is written by a model, so the surface it can reach has to be
159
+ * the part that describes WHAT to show, not how the viewer behaves. Toolbar
160
+ * composition (`showNav`/`showTabs`/…), view-state (`maximized`), the iframe
161
+ * `sandbox` and the imperative `controllerRef` are all host concerns and stay
162
+ * off the wire — a model must not be able to widen its own sandbox or hide the
163
+ * chrome the user needs to inspect what it built. */
164
+ export type ArtifactCardData = {
165
+ /** URL the preview iframe frames. */
166
+ src?: string;
167
+ /** Files for the Code tab's tree (+ each file's preview `url`). */
168
+ files?: ArtifactCardFile[];
169
+ /** Which view the card OPENS on: `preview` (default) or `code`.
170
+ *
171
+ * Seed only, and deliberately so. This card exists to be revised — `addCard`
172
+ * upserts on `envelope.id` — and a revision hands the same live component a
173
+ * new envelope. Were this wired to `Artifact`'s CONTROLLED `tab` prop, every
174
+ * revision would re-assert it and yank a user who had switched views back to
175
+ * the model's choice. A model cannot move the user between tabs after the
176
+ * first render; the user's choice wins. */
177
+ tab?: ArtifactCardTab;
178
+ /** Path of the file selected in the tree when the card first renders.
179
+ *
180
+ * Seed only, for the same reason as `tab`, but achieved differently:
181
+ * `Artifact` has a `defaultTab` prop to seed the tab and no `defaultActiveFile`
182
+ * counterpart, so this is read ONCE via `untrack` at setup and handed over as
183
+ * a static value. That leaves `Artifact`'s unconditional
184
+ * `createEffect(() => setActiveFile(local.activeFile))` with nothing reactive
185
+ * to track, so it runs once instead of resetting the user's selection on
186
+ * every revision. Keep it static — passing `props.data.activeFile` straight
187
+ * through would silently restore that bug. */
188
+ activeFile?: string;
189
+ /** Friendly address shown INSTEAD of the real url. Use when `src` is not
190
+ * consumer-facing (e.g. a `data:` blob) so a clean address is shown. */
191
+ displayUrl?: string;
192
+ /** Frame height. A bare number is px; a string is any CSS length. Defaults to
193
+ * `DEFAULT_ARTIFACT_CARD_HEIGHT` — see the note on ArtifactCard. */
194
+ height?: number | string;
195
+ };
196
+ export type ArtifactCardEnvelope = CardEnvelope<'artifact', ArtifactCardData>;
@@ -1,5 +1,5 @@
1
1
  import { JSX } from 'solid-js';
2
- import { CardContext, CardHost, CardPolicy } from './card-contract';
2
+ import { CardContext, CardHost, CardPolicy } from './card-contract.js';
3
3
  export interface CardProviderProps {
4
4
  /** Ambient context, static or a reactive getter. */
5
5
  context: CardContext | (() => CardContext);
@@ -1,4 +1,4 @@
1
- import { CardEnvelope, CardPolicy, CardResolution } from './card-contract';
1
+ import { CardEnvelope, CardPolicy, CardResolution } from './card-contract.js';
2
2
  /** The minimal toast surface this helper needs. Inject a real adapter (e.g. one
3
3
  * backed by `kai-toast-region`) — this module never imports the toast itself. */
4
4
  export interface RecoveryToast {
@@ -44,7 +44,7 @@ export interface DismissRecoveryOptions {
44
44
  export declare function defaultIsReopenable(env: ReopenEnv, staleAfterMs?: number): boolean;
45
45
  /**
46
46
  * Build the `{ onDismiss, onReopen }` policy handlers for the card dismiss/recovery
47
- * flow over a host store (`get`/`set`).
47
+ * flow over a host store (`get`/`set`). Both handlers are always returned.
48
48
  *
49
49
  * - `onDismiss(cardId)` — stamps `{ kind:'dismissed', at }` immutably and, when a
50
50
  * `toast` is injected, shows "Dismissed" with an Undo that restores the card's
@@ -52,4 +52,4 @@ export declare function defaultIsReopenable(env: ReopenEnv, staleAfterMs?: numbe
52
52
  * - `onReopen(cardId)` — clears the resolution (live) when `isReopenable`, else
53
53
  * stamps `{ kind:'expired', at }`.
54
54
  */
55
- export declare function dismissRecovery(opts: DismissRecoveryOptions): Pick<CardPolicy, 'onDismiss' | 'onReopen'>;
55
+ export declare function dismissRecovery(opts: DismissRecoveryOptions): Required<Pick<CardPolicy, 'onDismiss' | 'onReopen'>>;
@@ -1,17 +1,7 @@
1
- import { Component } from 'solid-js';
2
- import { CardEnvelope, CardHost } from './card-contract';
3
- /** Solid renderer for one envelope. `host` is the resolved CardHost so each wrapper
4
- * can bridge its card's emit convention (form/confirm/tasks take `host`;
5
- * link/embed take `onEmit`). */
6
- export type CardComponent = Component<{
7
- envelope: CardEnvelope;
8
- host?: CardHost;
9
- }>;
10
- export type CardComponentMap = Record<string, CardComponent>;
11
- /** Web-component layer: envelope type → kai-* tag name. */
12
- export type CardTagMap = Record<string, string>;
13
- export declare const BUILTIN_CARD_TAGS: CardTagMap;
1
+ import { CardComponentMap } from './card-component-types.js';
2
+ export { BUILTIN_CARD_TAGS, mergeCardTags } from './card-tags.js';
3
+ export type { CardTagMap } from './card-tags.js';
4
+ export type { CardComponent, CardComponentMap } from './card-component-types.js';
14
5
  export declare const BUILTIN_CARD_COMPONENTS: CardComponentMap;
15
6
  /** Built-ins with the consumer's overrides merged on top (consumer wins). */
16
7
  export declare function mergeCardComponents(types?: CardComponentMap): CardComponentMap;
17
- export declare function mergeCardTags(types?: CardTagMap): CardTagMap;
@@ -1,4 +1,4 @@
1
- import { CardEnvelope, CardEvent, CardResolution } from './card-contract';
1
+ import { CardEnvelope, CardEvent, CardResolution } from './card-contract.js';
2
2
  /** Map a terminal CardEvent (`action` | `submit`) to a CardResolution.
3
3
  * Returns undefined for every non-terminal verb (ready/error/resize/state/…). */
4
4
  export declare function resolutionFromEvent(event: CardEvent): CardResolution | undefined;
@@ -1,4 +1,4 @@
1
- import { CardEvent, CardPolicy } from './card-contract';
1
+ import { CardEvent, CardPolicy } from './card-contract.js';
2
2
  /** The single contract event name. */
3
3
  export declare const CARD_EVENT_NAME = "kai-card";
4
4
  /** Dispatch a CardEvent as the bubbling, composed `kai-card` event a host listener
@@ -0,0 +1,11 @@
1
+ /** Web-component layer: envelope type → kai-* tag name. */
2
+ export type CardTagMap = Record<string, string>;
3
+ /**
4
+ * The seven built-in card types and the element that draws each one.
5
+ *
6
+ * Note `link` → `kai-link-preview`: the one entry that is NOT `kai-<type>`, and the
7
+ * reason inferring these from the tag list is a guess rather than a lookup.
8
+ */
9
+ export declare const BUILTIN_CARD_TAGS: CardTagMap;
10
+ /** Built-ins with the consumer's overrides merged on top (consumer wins). */
11
+ export declare function mergeCardTags(types?: CardTagMap): CardTagMap;
@@ -0,0 +1,57 @@
1
+ import { JsonSchema, ValidationIssue } from './card-validate.js';
2
+ import { ValidatedCardType } from './card-validate-schemas.js';
3
+ export type { ValidatedCardType } from './card-validate-schemas.js';
4
+ export { CARD_VALIDATION_SCHEMAS } from './card-validate-schemas.js';
5
+ /** How badly a failed constraint hurts the rendered card. */
6
+ export type CardValidationTier = 'hard' | 'soft';
7
+ export interface CardValidationIssue extends ValidationIssue {
8
+ tier: CardValidationTier;
9
+ }
10
+ export interface CardValidationReport {
11
+ /** True when nothing failed. A SOFT-only report is not `ok`. */
12
+ ok: boolean;
13
+ /** `hard` if any issue is hard, else `soft` if any issue is soft, else `ok`. */
14
+ tier: CardValidationTier | 'ok';
15
+ /** Every failure, hard and soft, in the validator's order. */
16
+ issues: CardValidationIssue[];
17
+ /** The hard issues only. Non-empty exactly when `tier === 'hard'`. */
18
+ hard: CardValidationIssue[];
19
+ /** One line naming the failing field paths. Safe to render and to log. */
20
+ summary: string;
21
+ }
22
+ /** True when this envelope type has a BUILT-IN projected schema to validate against. */
23
+ export declare function isValidatedCardType(type: string): type is ValidatedCardType;
24
+ /**
25
+ * Validate a card envelope's `data` against the schema for `type`.
26
+ *
27
+ * Returns `null` when there is no schema for the type at all. Returning `null` rather
28
+ * than an empty pass keeps "we checked and it was fine" distinguishable from "there
29
+ * was nothing to check", so a caller cannot report the second as the first.
30
+ *
31
+ * @param schemas consumer-registered schemas by card type, normally
32
+ * `registry.validationSchemas` from `createCardRegistry`. Without it this function
33
+ * knows only the seven built-ins, which would mean a developer's own pricing-table
34
+ * card, registered perfectly legally through `cardTypes`, is the one card in the app
35
+ * nothing checks. The custom entry wins over a built-in of the same name; see
36
+ * {@link schemaFor}.
37
+ *
38
+ * A consumer schema is used AS AUTHORED rather than through the build-time lean
39
+ * projection the built-ins get, because that projection is a bundle-size measure and
40
+ * cannot run over a schema this package has never seen. The practical difference is
41
+ * only weight: `validateAgainstSchema` ignores every keyword it does not implement, so
42
+ * a custom schema is checked to exactly the same depth as a built-in, with the same
43
+ * NOT_ENFORCED gaps (no `allOf`/`anyOf`/`oneOf`/`if`, no `$ref`, no
44
+ * `additionalProperties`, no `format`).
45
+ */
46
+ export declare function validateCardData(type: string, data: unknown, schemas?: Readonly<Record<string, JsonSchema>>): CardValidationReport | null;
47
+ /**
48
+ * The message both native dispatchers put on the `error` CardEvent.
49
+ *
50
+ * Spelled once, here, and prefixed `invalid card data:` to match what
51
+ * provider-runtime.ts already emits for the remote transport, so a consumer's
52
+ * `policy.onError` sees the same string shape regardless of which transport the card
53
+ * arrived through.
54
+ */
55
+ export declare function cardValidationMessage(report: CardValidationReport): string;
56
+ /** Exposed for the tier-coverage test, which asserts it against the validator. */
57
+ export declare const TIERS_BY_KEYWORD: Readonly<Record<string, CardValidationTier>>;
@@ -0,0 +1,20 @@
1
+ /** One keyword the projection could not account for, with where it was found. */
2
+ export interface UnclassifiedKeyword {
3
+ path: string;
4
+ keyword: string;
5
+ }
6
+ export interface CardValidationGenerator {
7
+ CARD_TYPES: string[];
8
+ STRIPPED: Readonly<Record<string, string>>;
9
+ NOT_ENFORCED: Readonly<Record<string, string>>;
10
+ OUT_FILE: string;
11
+ enforcedKeywords(source?: string): Set<string>;
12
+ scanUnclassified(doc: unknown, enforced: Set<string>): UnclassifiedKeyword[];
13
+ projectSchema(doc: unknown, enforced: Set<string>): Record<string, unknown> | undefined;
14
+ build(): {
15
+ enforced: Set<string>;
16
+ projections: Record<string, unknown>;
17
+ source: string;
18
+ };
19
+ }
20
+ export declare function loadGenerator(): Promise<CardValidationGenerator>;
@@ -0,0 +1,17 @@
1
+ import { JsonSchema } from './card-validate.js';
2
+ /** The built-in `CardEnvelope.type` values that have a schema to validate against. */
3
+ export type ValidatedCardType = "artifact" | "choice" | "confirm" | "embed" | "form" | "link" | "tasks";
4
+ /**
5
+ * One widening cast, at the module boundary, for the same reason
6
+ * src/schemas/index.ts has one: TypeScript infers `string` for a `"type"` member
7
+ * written as a literal in an object literal, while `JsonSchema['type']` is a union
8
+ * of string literals, so these documents are not assignable without it. The
9
+ * alternative (`as const` throughout) makes every `required` array `readonly`,
10
+ * which `JsonSchema` does not accept either.
11
+ *
12
+ * The cast is not a claim about the contents. What it would otherwise hide is
13
+ * checked by the sync test, which re-runs this generator and compares byte for byte.
14
+ */
15
+ export declare const CARD_VALIDATION_SCHEMAS: Readonly<Record<ValidatedCardType, JsonSchema>>;
16
+ /** The card types this projection covers, in a stable order. */
17
+ export declare const VALIDATED_CARD_TYPES: readonly ValidatedCardType[];
@@ -17,9 +17,33 @@ export interface JsonSchema {
17
17
  uniqueItems?: boolean;
18
18
  [key: `x-${string}`]: unknown;
19
19
  }
20
+ /**
21
+ * One failed constraint, with the KEYWORD that failed kept separate from the prose.
22
+ *
23
+ * `errors` (the string form) is what every existing caller reads and it is unchanged.
24
+ * This structured twin exists because the native card dispatcher has to TIER a
25
+ * failure (a missing `required` field means the card cannot render, a `maxItems`
26
+ * overrun means it renders five buttons instead of four), and the only honest way to
27
+ * tell those apart is the keyword. Re-parsing the prose to recover it would be a
28
+ * second, silently-drifting copy of the same fact.
29
+ */
30
+ export interface ValidationIssue {
31
+ /** Where, in readable form: `(root)`, `(root).actions`, `(root).actions[0].id`. */
32
+ path: string;
33
+ /** The JSON Schema keyword that failed. `required` for a missing property. */
34
+ keyword: string;
35
+ /** The human-readable message; identical to the matching entry in `errors`. */
36
+ message: string;
37
+ }
20
38
  export interface ValidationResult {
21
39
  valid: boolean;
22
40
  errors: string[];
41
+ /**
42
+ * The same failures as `errors`, one-for-one and in the same order, with the
43
+ * keyword and path kept as data. Added alongside `errors` rather than replacing
44
+ * it so no existing caller changes.
45
+ */
46
+ issues: ValidationIssue[];
23
47
  }
24
48
  /** Validate `value` against the lean JSON-Schema subset. */
25
49
  export declare function validateAgainstSchema(schema: JsonSchema, value: unknown): ValidationResult;
@@ -1,6 +1,6 @@
1
- import { ChatMessage } from '../elements/chat-types';
2
- import { AttachmentData } from '../components/attachments';
3
- import { AssistantStream, SetMessages } from '../state';
1
+ import { ChatMessage } from '../elements/chat-types.js';
2
+ import { AttachmentData } from '../components/attachments.js';
3
+ import { AssistantStream, SetMessages } from '../state.js';
4
4
  export interface CreateKaiChatOptions {
5
5
  /** Seed messages, read once at creation and copied. Later changes are ignored — drive updates through the returned ops. */
6
6
  initialMessages?: ChatMessage[];
@@ -1,4 +1,4 @@
1
- import { CardEnvelope } from './card-contract';
1
+ import { CardEnvelope } from './card-contract.js';
2
2
  /** Media provider for an embed card. */
3
3
  export type EmbedProvider = 'youtube' | 'vimeo' | 'generic';
4
4
  /** Lazy media-embed payload (YouTube / Vimeo / generic player URL). */
@@ -1,4 +1,4 @@
1
- import { CardEnvelope } from './card-contract';
1
+ import { CardEnvelope } from './card-contract.js';
2
2
  /** Rich link / Open-Graph preview payload. The card renders from this; it never fetches. */
3
3
  export interface LinkPreviewData {
4
4
  /** Canonical destination; opened via the contract `open` verb. */
@@ -1,4 +1,4 @@
1
- import { ChatMessage, FeedbackVote } from '../elements/chat-types';
1
+ import { ChatMessage, FeedbackVote } from '../elements/chat-types.js';
2
2
  /** Detail shape emitted by the action row. `state` is present only for the
3
3
  * toggleable feedback votes: `'on'` when a vote is set, `'off'` when cleared.
4
4
  * Copy / regenerate / edit / custom actions omit it. */
@@ -24,7 +24,7 @@ export interface MessageFeedback {
24
24
  /** Whether a message's copy button should currently show its check. */
25
25
  isCopied: (id: string) => boolean;
26
26
  /** Route a clicked action through copy / vote / passthrough handling. */
27
- handleAction: (m: Pick<ChatMessage, 'id' | 'content' | 'feedback'>, action: string) => void;
27
+ handleAction: (m: Pick<ChatMessage, 'id' | 'parts' | 'feedback'>, action: string) => void;
28
28
  }
29
29
  /**
30
30
  * Create the action-row feedback controller for one message list (or one
@@ -1,4 +1,4 @@
1
- import { ToastPosition } from '../components/toast';
1
+ import { ToastPosition } from '../components/toast.js';
2
2
  export type ToastVariant = 'neutral' | 'success' | 'warning' | 'error' | 'info';
3
3
  /** Visual treatment: `'pill'` (default, compact single-line) or `'card'` (richer
4
4
  * rounded card with an optional description line). */