@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,312 @@
1
+ // src/primitives/card-data-types.ts
2
+ // The five built-in card PAYLOAD types — `CardEnvelope.data`, one per card type —
3
+ // authored beside the schemas they mirror rather than inside the components that
4
+ // render them.
5
+ //
6
+ // THE FOURTH INSTANCE OF ONE DEFECT, AND THE LAST ONE THAT WAS LEFT
7
+ // -----------------------------------------------------------------
8
+ // `BUILTIN_CARD_TAGS` (card-tags.ts), `CardComponentMap` (card-component-types.ts)
9
+ // and the tag map before it were each pulled out of a `.tsx` for the same reason,
10
+ // and each header says so. Read card-tags.ts first; this is the same problem one
11
+ // layer further out, and the reason it is worth a fourth file rather than a fourth
12
+ // exception is that these are the types a BACKEND names, which makes them the ones
13
+ // with the least business living under a Solid component.
14
+ //
15
+ // `tsconfig.mcp.json` is Node-only — `lib: ["ESNext"]`, no `jsx` — and a type import
16
+ // still has to RESOLVE even though it erases. While `ConfirmCardData` and friends
17
+ // lived in components/confirm-card.tsx, any Node/no-DOM project that named one got
18
+ //
19
+ // error TS6142: Module '../../components/choice-card' was resolved to
20
+ // '.../src/components/choice-card.tsx', but '--jsx' is not set.
21
+ //
22
+ // measured on this tree, and `@kitn.ai/ui/schemas` — the server-safe entry that
23
+ // exists precisely so a route can hand a model tool definitions — could not
24
+ // re-export them at all without dragging the Solid tree into that pass. So the one
25
+ // language the kit is AUTHORED in was the only one that could not name the contract
26
+ // it publishes: Python and Go read `./schemas/*.json` and get the full shape, while
27
+ // a TypeScript backend building a card envelope got `data: unknown`.
28
+ //
29
+ // Relaxing tsconfig.mcp.json is not the alternative, and that is measured rather
30
+ // than recalled: granting it `jsx: "preserve"` + `jsxImportSource: "solid-js"` takes
31
+ // it from 0 errors to 130 on this exact case (838 without the import source, and
32
+ // card-tags.ts records 1364 for the broader one), almost all `TS2304: Cannot find
33
+ // name 'HTMLDivElement' / 'window'`, because a `jsx` setting drags the whole Solid
34
+ // component tree into a Node-only pass. The Node/no-DOM boundary is load-bearing.
35
+ //
36
+ // WHY THEY ARE `type` ALIASES AND NOT `interface`S — DO NOT "TIDY" THIS BACK
37
+ // --------------------------------------------------------------------------
38
+ // This is the other half of the same story and it is not a style preference.
39
+ // TypeScript gives an object TYPE ALIAS an implicit index signature and gives an
40
+ // INTERFACE none. Measured, both directions, on a two-line file:
41
+ //
42
+ // interface IFace { a: string }
43
+ // type TAlias = { a: string }
44
+ // const r1: Record<string, unknown> = iface; // TS2322: Index signature for type
45
+ // // 'string' is missing in type 'IFace'
46
+ // const r2: Record<string, unknown> = alias; // OK
47
+ //
48
+ // Every card element's `data` prop is a `Record<string, unknown>` at some point in
49
+ // the chain — the generated `element-types.d.ts` used to declare it that way
50
+ // outright, and `renderType` in scripts/_ts-helpers.mjs still emits exactly that
51
+ // string as its cycle placeholder when it inlines a self-referential type (which
52
+ // `FormField` is). So as interfaces these types were not assignable to the very
53
+ // property each one's own doc comment tells a consumer to assign it to:
54
+ // `el.data = myChoiceCardData` was TS2322 while `<kai-choice>`'s JSDoc said "Import
55
+ // `ChoiceCardData` from `@kitn.ai/ui` for the full shape".
56
+ //
57
+ // Aliases fix that at the root instead of at each of the four call sites, and they
58
+ // are what makes `FormDefinition` work at all: it is self-referential, so the
59
+ // generator can only inline it down to a `Record<string, unknown>` placeholder, and
60
+ // an interface would fail against that placeholder no matter what the elements
61
+ // declare.
62
+ //
63
+ // Nothing here merges declarations, so the one capability `interface` has that
64
+ // `type` lacks is not in use.
65
+ //
66
+ // WHAT THIS FILE MAY CONTAIN
67
+ // --------------------------
68
+ // Types only, and only types with no DOM and no Solid below them. It must stay
69
+ // importable from a Node process with no `jsx`, which is the whole point; the
70
+ // discriminating check is `tsc --noEmit -p tsconfig.mcp.json` on a tree with no
71
+ // `dist/` present, and nothing else is evidence for it. `CardEnvelope` below comes
72
+ // from ./card-contract, which is already a `.ts` for the same reason.
73
+ //
74
+ // Each component re-exports its own types from here, so every existing importer of
75
+ // `components/confirm-card` etc. is unaffected, and `@kitn.ai/ui/schemas` exports
76
+ // them too so a backend route can finally name what it is building.
77
+
78
+ import type { CardEnvelope } from './card-contract';
79
+
80
+ // ─────────────────────────────────────────────────────────────────────────────
81
+ // confirm (confirm.schema.json)
82
+ // ─────────────────────────────────────────────────────────────────────────────
83
+
84
+ export type ConfirmActionStyle = 'primary' | 'default' | 'destructive';
85
+ export type ConfirmTone = 'default' | 'warning' | 'danger';
86
+
87
+ export type ConfirmAction = {
88
+ id: string;
89
+ label: string;
90
+ style?: ConfirmActionStyle;
91
+ payload?: unknown;
92
+ default?: boolean;
93
+ };
94
+
95
+ export type ConfirmCardData = {
96
+ heading?: string;
97
+ body?: string;
98
+ tone?: ConfirmTone;
99
+ actions: ConfirmAction[]; // 1..4
100
+ dismissible?: boolean;
101
+ };
102
+
103
+ export type ConfirmCardEnvelope = CardEnvelope<'confirm', ConfirmCardData>;
104
+
105
+ // ─────────────────────────────────────────────────────────────────────────────
106
+ // choice (choice.schema.json)
107
+ // ─────────────────────────────────────────────────────────────────────────────
108
+
109
+ export type ChoiceOptionMedia = {
110
+ image?: string;
111
+ imageAlt?: string;
112
+ icon?: string;
113
+ };
114
+
115
+ export type ChoiceOption = {
116
+ id: string; // required, unique within the card
117
+ label: string; // required
118
+ description?: string;
119
+ media?: ChoiceOptionMedia;
120
+ meta?: string; // trailing freeform text (e.g. price/badge)
121
+ recommended?: boolean; // renders a "Recommended" pill
122
+ disabled?: boolean; // not selectable; skipped in keyboard nav
123
+ payload?: unknown; // echoed back in the emitted action
124
+ };
125
+
126
+ export type ChoiceAllowOther = boolean | { label?: string; placeholder?: string };
127
+
128
+ export type ChoiceCardData = {
129
+ prompt?: string; // optional question/body above the options
130
+ options: ChoiceOption[]; // 1..N
131
+ allowOther?: ChoiceAllowOther; // free-text escape
132
+ submitLabel?: string; // label for the Submit button (default 'Submit')
133
+ dismissible?: boolean; // show a close affordance that emits `dismiss`
134
+ };
135
+
136
+ export type ChoiceCardEnvelope = CardEnvelope<'choice', ChoiceCardData>;
137
+
138
+ // ─────────────────────────────────────────────────────────────────────────────
139
+ // tasks (tasks.schema.json)
140
+ // ─────────────────────────────────────────────────────────────────────────────
141
+
142
+ export type TasksTask = {
143
+ id: string;
144
+ label: string;
145
+ description?: string;
146
+ checked?: boolean;
147
+ disabled?: boolean;
148
+ };
149
+
150
+ export type TasksCardData = {
151
+ /**
152
+ * `select` (default) = checkbox rows + a confirm button that emits the contract
153
+ * `submit`. `progress` = an onboarding/checklist look: a header `done / total`
154
+ * count, circular indicators, per-item title + muted description, and NO confirm
155
+ * button (checking a row is itself the terminal action). Both share the same
156
+ * selection model (toggle by id, the `max` gate, `kai-value-change`); `progress`
157
+ * is purely a presentational variant.
158
+ */
159
+ mode?: 'select' | 'progress';
160
+ heading?: string;
161
+ tasks: TasksTask[]; // >=1
162
+ selectAll?: boolean;
163
+ confirmLabel?: string;
164
+ allowEmpty?: boolean;
165
+ min?: number;
166
+ max?: number;
167
+ dismissible?: boolean; // show a close affordance that emits `dismiss`
168
+ };
169
+
170
+ export type TasksCardResult = {
171
+ selected: string[];
172
+ };
173
+
174
+ export type TasksCardEnvelope = CardEnvelope<'tasks', TasksCardData>;
175
+
176
+ // ─────────────────────────────────────────────────────────────────────────────
177
+ // form (form.schema.json)
178
+ // ─────────────────────────────────────────────────────────────────────────────
179
+
180
+ /** A field definition (the JSON Schema subset kai-form renders). */
181
+ export type FormField = {
182
+ type: 'string' | 'number' | 'integer' | 'boolean' | 'array' | 'object';
183
+ title?: string;
184
+ description?: string;
185
+ default?: unknown;
186
+ enum?: unknown[];
187
+ format?: 'email' | 'uri' | 'url' | 'date' | 'date-time' | 'time';
188
+ minimum?: number;
189
+ maximum?: number;
190
+ minLength?: number;
191
+ maxLength?: number;
192
+ pattern?: string;
193
+ minItems?: number;
194
+ maxItems?: number;
195
+ items?: FormField | { enum: unknown[] };
196
+ properties?: Record<string, FormField>;
197
+ required?: string[];
198
+ readOnly?: boolean;
199
+ 'x-kai-widget'?:
200
+ | 'textarea'
201
+ | 'slider'
202
+ | 'rating'
203
+ | 'radio'
204
+ | 'select'
205
+ | 'checkbox'
206
+ | 'password'
207
+ | 'switch';
208
+ 'x-kai-placeholder'?: string;
209
+ 'x-kai-step'?: number;
210
+ };
211
+
212
+ /** The form definition = CardEnvelope.data for type:'form'. */
213
+ export type FormDefinition = {
214
+ type: 'object';
215
+ title?: string;
216
+ description?: string;
217
+ required?: string[];
218
+ properties: Record<string, FormField>;
219
+ 'x-kai-order'?: string[];
220
+ 'x-kai-inlineMax'?: number;
221
+ 'x-kai-submitLabel'?: string;
222
+ 'x-kai-dismissible'?: boolean;
223
+ 'x-kai-actions'?: { id: string; label: string; variant?: 'default' | 'ghost' | 'outline' }[];
224
+ };
225
+
226
+ export type FormCardEnvelope = CardEnvelope<'form', FormDefinition>;
227
+
228
+ // ─────────────────────────────────────────────────────────────────────────────
229
+ // artifact (artifact.schema.json)
230
+ // ─────────────────────────────────────────────────────────────────────────────
231
+
232
+ /**
233
+ * One file behind an artifact card: the Code tab's tree row, plus where the
234
+ * preview loads it.
235
+ *
236
+ * The SAME declaration the `FileTree` primitive uses — `components/file-tree.tsx`
237
+ * re-exports this as `FileTreeFile` and `components/artifact.tsx` aliases that to
238
+ * `ArtifactFile`, so there is one shape here and not a copy of one. It is authored
239
+ * in this file rather than in file-tree.tsx for this module's whole reason: it is
240
+ * reachable from `ArtifactCardData`, so leaving it in a `.tsx` would put TS6142
241
+ * back on any Node/no-DOM project that names an artifact card payload, and the
242
+ * extraction would have moved four of five types and quietly failed on the fifth.
243
+ * It mirrors `artifact.schema.json`'s `files[].items`, which carries the same
244
+ * fields with `additionalProperties: false`.
245
+ */
246
+ export type ArtifactCardFile = {
247
+ /** Tree label/key. Folders are built from `/`-delimited segments. */
248
+ path: string;
249
+ /** Where the preview loads it (CDN/S3/dev-server/API). */
250
+ url?: string;
251
+ /** Source for the Code tab. */
252
+ code?: string;
253
+ /** Language id for syntax highlighting (e.g. `html`, `css`, `tsx`). */
254
+ language?: string;
255
+ /** Kind — drives the icon + whether Code applies. */
256
+ type?: 'html' | 'pdf' | 'image' | 'other';
257
+ /** Lines added vs the base. Rendered as a trailing `+N` stat (success hue,
258
+ * tabular-nums). Only shown when present; omit for a plain file row. */
259
+ additions?: number;
260
+ /** Lines removed vs the base. Rendered as a trailing `-N` stat (error hue). */
261
+ deletions?: number;
262
+ /** Change status vs the base. Drives a small trailing status letter in the
263
+ * conventional VCS hue (added=green, modified=amber, deleted=red,
264
+ * renamed=blue, untracked=muted). Only shown when present. */
265
+ status?: 'added' | 'modified' | 'deleted' | 'renamed' | 'untracked';
266
+ };
267
+
268
+ /** Which view an artifact card opens on. */
269
+ export type ArtifactCardTab = 'preview' | 'code';
270
+
271
+ /** The `artifact` card payload: a deliberately NARROW subset of `ArtifactProps`.
272
+ *
273
+ * A card envelope is written by a model, so the surface it can reach has to be
274
+ * the part that describes WHAT to show, not how the viewer behaves. Toolbar
275
+ * composition (`showNav`/`showTabs`/…), view-state (`maximized`), the iframe
276
+ * `sandbox` and the imperative `controllerRef` are all host concerns and stay
277
+ * off the wire — a model must not be able to widen its own sandbox or hide the
278
+ * chrome the user needs to inspect what it built. */
279
+ export type ArtifactCardData = {
280
+ /** URL the preview iframe frames. */
281
+ src?: string;
282
+ /** Files for the Code tab's tree (+ each file's preview `url`). */
283
+ files?: ArtifactCardFile[];
284
+ /** Which view the card OPENS on: `preview` (default) or `code`.
285
+ *
286
+ * Seed only, and deliberately so. This card exists to be revised — `addCard`
287
+ * upserts on `envelope.id` — and a revision hands the same live component a
288
+ * new envelope. Were this wired to `Artifact`'s CONTROLLED `tab` prop, every
289
+ * revision would re-assert it and yank a user who had switched views back to
290
+ * the model's choice. A model cannot move the user between tabs after the
291
+ * first render; the user's choice wins. */
292
+ tab?: ArtifactCardTab;
293
+ /** Path of the file selected in the tree when the card first renders.
294
+ *
295
+ * Seed only, for the same reason as `tab`, but achieved differently:
296
+ * `Artifact` has a `defaultTab` prop to seed the tab and no `defaultActiveFile`
297
+ * counterpart, so this is read ONCE via `untrack` at setup and handed over as
298
+ * a static value. That leaves `Artifact`'s unconditional
299
+ * `createEffect(() => setActiveFile(local.activeFile))` with nothing reactive
300
+ * to track, so it runs once instead of resetting the user's selection on
301
+ * every revision. Keep it static — passing `props.data.activeFile` straight
302
+ * through would silently restore that bug. */
303
+ activeFile?: string;
304
+ /** Friendly address shown INSTEAD of the real url. Use when `src` is not
305
+ * consumer-facing (e.g. a `data:` blob) so a clean address is shown. */
306
+ displayUrl?: string;
307
+ /** Frame height. A bare number is px; a string is any CSS length. Defaults to
308
+ * `DEFAULT_ARTIFACT_CARD_HEIGHT` — see the note on ArtifactCard. */
309
+ height?: number | string;
310
+ };
311
+
312
+ export type ArtifactCardEnvelope = CardEnvelope<'artifact', ArtifactCardData>;
@@ -96,9 +96,20 @@ function resolutionOf(cards: CardEnvelope[], cardId: string): CardResolution | u
96
96
  return cards.find((c) => c.id === cardId)?.resolution;
97
97
  }
98
98
 
99
+ // On the return type — `Required<Pick<…>>`, not a bare `Pick`. Both members are
100
+ // optional on CardPolicy, which is right there, where a host supplies one, the other,
101
+ // or neither; but `Pick` carries the `?` across even though the body below returns
102
+ // both handlers on every path, so the declaration said "may be missing" about two
103
+ // things that never are. That was consumer-facing, not internal tidiness: this
104
+ // function is exported from src/index.ts and the MCP scaffolder emits
105
+ // `const { onDismiss, onReopen } = dismissRecovery({…})`, so anyone who destructured
106
+ // and then INVOKED a handler hit TS2722 in code we generated for them. Assigning the
107
+ // result straight into a CardPolicy stays fine either way, both fields being optional
108
+ // there, which is why it stayed invisible. tests/primitives/card-recovery.test.ts pins
109
+ // the runtime side over the full cross-product of the optional options.
99
110
  /**
100
111
  * Build the `{ onDismiss, onReopen }` policy handlers for the card dismiss/recovery
101
- * flow over a host store (`get`/`set`).
112
+ * flow over a host store (`get`/`set`). Both handlers are always returned.
102
113
  *
103
114
  * - `onDismiss(cardId)` — stamps `{ kind:'dismissed', at }` immutably and, when a
104
115
  * `toast` is injected, shows "Dismissed" with an Undo that restores the card's
@@ -108,7 +119,7 @@ function resolutionOf(cards: CardEnvelope[], cardId: string): CardResolution | u
108
119
  */
109
120
  export function dismissRecovery(
110
121
  opts: DismissRecoveryOptions,
111
- ): Pick<CardPolicy, 'onDismiss' | 'onReopen'> {
122
+ ): Required<Pick<CardPolicy, 'onDismiss' | 'onReopen'>> {
112
123
  const now = opts.now ?? (() => Date.now());
113
124
  const reopenable = opts.isReopenable ?? ((env: ReopenEnv) => defaultIsReopenable(env, opts.staleAfterMs));
114
125
  const undoMs = opts.undoMs ?? 6000;
@@ -2,34 +2,43 @@
2
2
  // One source of truth mapping a CardEnvelope.type to a renderer, for both layers:
3
3
  // - CardComponentMap drives the Solid <CardRenderer>.
4
4
  // - CardTagMap drives the <kai-cards> web component (child kai-* elements).
5
- // Built-ins cover the 5 contract card types; consumers extend/override via a `types`
5
+ // Built-ins cover the 7 contract card types; consumers extend/override via a `types`
6
6
  // prop (merged OVER the built-ins). kai-card (bare shell) is intentionally NOT a target.
7
- import type { Component } from 'solid-js';
8
- import type { CardEnvelope, CardHost } from './card-contract';
7
+ //
8
+ // THE TAG HALF NOW LIVES IN ./card-tags — AND MUST STAY THERE.
9
+ // `BUILTIN_CARD_TAGS` / `mergeCardTags` / `CardTagMap` are plain data with no Solid in
10
+ // them, but while they shared this module with `BUILTIN_CARD_COMPONENTS` no Node/no-DOM
11
+ // project could import them AS SOURCE, and the `kai` MCP re-derived the map by
12
+ // convention as a result. ./card-tags.ts is that data on its own so
13
+ // `@kitn.ai/ui/schemas` can export it; the re-export below keeps every existing
14
+ // importer of this module working unchanged. Do not move them back — see the header
15
+ // of ./card-tags.ts for the measured cost of the alternative (0 -> 1364 tsc errors).
16
+ //
17
+ // THE COMPONENT TYPES NOW LIVE IN ./card-component-types — SAME REASON, SECOND TIME.
18
+ // `CardComponent` / `CardComponentMap` are named in the PUBLIC surface of
19
+ // `@kitn.ai/ui/schemas` (src/schemas/registry.ts), so a Node/no-DOM project resolving
20
+ // that entry's types reached this `.tsx` and hit TS6142. The types went to a `.ts`;
21
+ // `BUILTIN_CARD_COMPONENTS` and `mergeCardComponents` stayed, because they are JSX and
22
+ // have nowhere to go. Re-exported below, so this module's surface is unchanged.
23
+ import type { CardComponentMap } from './card-component-types';
9
24
  import { Form } from '../components/form';
10
25
  import { ConfirmCard } from '../components/confirm-card';
11
26
  import { TasksCard } from '../components/tasks-card';
12
27
  import { ChoiceCard } from '../components/choice-card';
13
28
  import { LinkPreview } from '../components/link-preview';
14
29
  import { Embed } from '../components/embed';
30
+ import { ArtifactCard, type ArtifactCardData } from '../components/artifact-card';
15
31
 
16
- /** Solid renderer for one envelope. `host` is the resolved CardHost so each wrapper
17
- * can bridge its card's emit convention (form/confirm/tasks take `host`;
18
- * link/embed take `onEmit`). */
19
- export type CardComponent = Component<{ envelope: CardEnvelope; host?: CardHost }>;
20
- export type CardComponentMap = Record<string, CardComponent>;
32
+ // The tag half, re-exported so this module's surface is unchanged. Authored in
33
+ // ./card-tags.ts because that file has no Solid below it and can therefore be read
34
+ // from a Node process; this one cannot.
35
+ export { BUILTIN_CARD_TAGS, mergeCardTags } from './card-tags';
36
+ export type { CardTagMap } from './card-tags';
21
37
 
22
- /** Web-component layer: envelope type kai-* tag name. */
23
- export type CardTagMap = Record<string, string>;
24
-
25
- export const BUILTIN_CARD_TAGS: CardTagMap = {
26
- form: 'kai-form',
27
- confirm: 'kai-confirm',
28
- 'tasks': 'kai-tasks',
29
- choice: 'kai-choice',
30
- link: 'kai-link-preview',
31
- embed: 'kai-embed',
32
- };
38
+ // The component TYPES, re-exported for the same reason. Authored in
39
+ // ./card-component-types.ts because resolving a `.tsx` is what a no-`jsx` project
40
+ // cannot do; the values below stay here because they are JSX.
41
+ export type { CardComponent, CardComponentMap } from './card-component-types';
33
42
 
34
43
  export const BUILTIN_CARD_COMPONENTS: CardComponentMap = {
35
44
  form: (p) => (
@@ -55,13 +64,15 @@ export const BUILTIN_CARD_COMPONENTS: CardComponentMap = {
55
64
  embed: (p) => (
56
65
  <Embed data={p.envelope.data as never} cardId={p.envelope.id} onEmit={(e) => p.host?.emit(e)} />
57
66
  ),
67
+ // artifact owns real chrome of its own (sizing + heading), so like the four
68
+ // above it lives in components/ and gets only a thin wrapper here.
69
+ artifact: (p) => (
70
+ <ArtifactCard data={p.envelope.data as ArtifactCardData} cardId={p.envelope.id}
71
+ heading={p.envelope.title} host={p.host} />
72
+ ),
58
73
  };
59
74
 
60
75
  /** Built-ins with the consumer's overrides merged on top (consumer wins). */
61
76
  export function mergeCardComponents(types?: CardComponentMap): CardComponentMap {
62
77
  return types ? { ...BUILTIN_CARD_COMPONENTS, ...types } : { ...BUILTIN_CARD_COMPONENTS };
63
78
  }
64
-
65
- export function mergeCardTags(types?: CardTagMap): CardTagMap {
66
- return types ? { ...BUILTIN_CARD_TAGS, ...types } : { ...BUILTIN_CARD_TAGS };
67
- }
@@ -0,0 +1,92 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://kitn.ai/schemas/card/artifact.schema.json",
4
+ "title": "ArtifactCardData",
5
+ "description": "Generated-artifact viewer payload: a framed preview plus the source files behind it. A deliberately NARROW subset of the Artifact component's props — it says WHAT to show, never how the viewer behaves. Toolbar composition, view-state and the iframe `sandbox` are host-owned and stay off the wire, so a model cannot widen its own sandbox or hide the chrome the user needs to inspect what it built.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "anyOf": [{ "required": ["src"] }, { "required": ["files"] }],
9
+ "properties": {
10
+ "src": {
11
+ "type": "string",
12
+ "format": "uri",
13
+ "description": "URL the preview iframe frames, and the target of the Home button. Omit for a source-only artifact (`tab: 'code'` with `files`).",
14
+ "x-kai-format": "url"
15
+ },
16
+ "files": {
17
+ "type": "array",
18
+ "description": "Files behind the artifact: the Code tab's tree, each optionally carrying its own preview url and source.",
19
+ "maxItems": 500,
20
+ "items": {
21
+ "type": "object",
22
+ "required": ["path"],
23
+ "additionalProperties": false,
24
+ "properties": {
25
+ "path": {
26
+ "type": "string",
27
+ "description": "Tree label/key. Folders are built from `/`-delimited segments.",
28
+ "maxLength": 1024
29
+ },
30
+ "url": {
31
+ "type": "string",
32
+ "format": "uri",
33
+ "description": "Where the preview loads this file. Defaults to `path` resolved against `src`.",
34
+ "x-kai-format": "url"
35
+ },
36
+ "code": {
37
+ "type": "string",
38
+ "description": "Source shown in the Code tab. Omit for binary files (image/pdf), which have no code view."
39
+ },
40
+ "language": {
41
+ "type": "string",
42
+ "description": "Language id for syntax highlighting (e.g. 'html', 'css', 'tsx').",
43
+ "maxLength": 40
44
+ },
45
+ "type": {
46
+ "type": "string",
47
+ "enum": ["html", "pdf", "image", "other"],
48
+ "description": "File kind. Drives the tree icon and whether the Code view applies; 'pdf' also routes the preview to the inline PDF viewer.",
49
+ "x-kai-control": "select"
50
+ },
51
+ "additions": {
52
+ "type": "integer",
53
+ "minimum": 0,
54
+ "description": "Lines added vs the base. Rendered as a trailing '+N' stat."
55
+ },
56
+ "deletions": {
57
+ "type": "integer",
58
+ "minimum": 0,
59
+ "description": "Lines removed vs the base. Rendered as a trailing '-N' stat."
60
+ },
61
+ "status": {
62
+ "type": "string",
63
+ "enum": ["added", "modified", "deleted", "renamed", "untracked"],
64
+ "description": "Change status vs the base. Drives a trailing status letter in the conventional VCS hue.",
65
+ "x-kai-control": "select"
66
+ }
67
+ }
68
+ }
69
+ },
70
+ "tab": {
71
+ "type": "string",
72
+ "enum": ["preview", "code"],
73
+ "default": "preview",
74
+ "description": "Which view the card OPENS on. SEED ONLY: the user can switch freely afterwards and a revision of this card will NOT move them back, because the user's choice wins over the model's. A switch is reported back as a `state` patch.",
75
+ "x-kai-control": "select"
76
+ },
77
+ "activeFile": {
78
+ "type": "string",
79
+ "description": "Path of the file selected in the tree when the card FIRST renders (must match a `files[].path`). Seeds the tree highlight, the Code source and the preview. SEED ONLY, like `tab`: revising this card will not move a user who has since selected a different file.",
80
+ "maxLength": 1024
81
+ },
82
+ "displayUrl": {
83
+ "type": "string",
84
+ "description": "Friendly address shown in the path field INSTEAD of the real url, which also makes the field read-only. Use when `src` is not consumer-facing (e.g. a `data:` blob) so a clean address is shown rather than leaking it.",
85
+ "maxLength": 2048
86
+ },
87
+ "height": {
88
+ "description": "Frame height. A bare number is px; a string is any CSS length. Defaults to 420px. REQUIRED CONCEPT, not decoration: the viewer is built to fill its container, and a message thread supplies no height, so the card sets one explicitly or the artifact collapses to zero and renders invisible.",
89
+ "oneOf": [{ "type": "number", "minimum": 1 }, { "type": "string", "maxLength": 32 }]
90
+ }
91
+ }
92
+ }
@@ -4,8 +4,6 @@
4
4
  "title": "EmbedCardData",
5
5
  "description": "Lazy media-embed payload (YouTube / Vimeo / generic player URL).",
6
6
  "type": "object",
7
- "x-kai-card-type": "embed",
8
- "x-kai-contract-version": "1",
9
7
  "required": ["provider"],
10
8
  "additionalProperties": false,
11
9
  "properties": {
@@ -4,8 +4,6 @@
4
4
  "title": "LinkPreviewData",
5
5
  "description": "Rich link / Open-Graph preview payload. The card renders from this; it never fetches.",
6
6
  "type": "object",
7
- "x-kai-card-type": "link",
8
- "x-kai-contract-version": "1",
9
7
  "required": ["url"],
10
8
  "additionalProperties": false,
11
9
  "properties": {
@@ -0,0 +1,61 @@
1
+ // src/primitives/card-tags.ts
2
+ // `CardEnvelope.type` -> the `kai-*` element that renders it. The authoritative map,
3
+ // and the ONLY place it is written down.
4
+ //
5
+ // WHY IT IS ALONE IN A `.ts`
6
+ // --------------------------
7
+ // It used to live in card-registry.tsx beside `BUILTIN_CARD_COMPONENTS`, which is
8
+ // nothing but Solid. The map itself has no Solid in it — it is `Record<string, string>`
9
+ // — but sharing a module with the component map meant no Node/no-DOM project could
10
+ // import it AS SOURCE, and the `kai` MCP server is exactly that: tsconfig.mcp.json is
11
+ // Node-only, `lib: ["ESNext"]`, no `jsx`. So src/agent-tooling/mcp/manifest.ts
12
+ // RE-DERIVED each tag by convention (`kai-<type>`, else the single `kai-<type>-*`) —
13
+ // a second copy of a fact this repo already held, one that happened to agree.
14
+ //
15
+ // Relaxing tsconfig.mcp.json instead is not an option and was measured, not guessed:
16
+ // giving that project a `jsx` setting drags the Solid component tree into a Node-only
17
+ // pass and takes it from 0 errors to 1364. The Node/no-DOM boundary is load-bearing.
18
+ // Splitting the data out is the fix; this file is that split.
19
+ //
20
+ // Because it is plain data with no DOM and no Solid runtime below it,
21
+ // `@kitn.ai/ui/schemas` — the server-safe entry a backend route imports — re-exports
22
+ // it, so the MCP and any consumer route read the same map instead of guessing at it.
23
+ // card-registry.tsx re-exports everything here in turn, so every existing importer of
24
+ // `BUILTIN_CARD_TAGS` / `mergeCardTags` / `CardTagMap` is unaffected.
25
+ //
26
+ // WHAT THIS SPLIT DOES NOT DO, MEASURED
27
+ // -------------------------------------
28
+ // It does not change dist/schemas.js. Routing that entry's re-export back through
29
+ // card-registry.tsx yields a byte-identical bundle with zero `solid-js` references
30
+ // that imports clean under `node`: rollup compiles the Solid tree and discards it,
31
+ // since only the tag map is reachable. So no runtime guard tells the two apart, and
32
+ // this file must not be sold as one. What it changes is the dependency GRAPH — the
33
+ // server-safe entry no longer reaches the component tree at all, instead of reaching
34
+ // it and counting on tree-shaking to undo that. See src/schemas/index.ts.
35
+ //
36
+ // Built-ins cover the 7 contract card types; consumers extend/override via a `types`
37
+ // prop (merged OVER the built-ins). kai-card (bare shell) is intentionally NOT a target.
38
+
39
+ /** Web-component layer: envelope type → kai-* tag name. */
40
+ export type CardTagMap = Record<string, string>;
41
+
42
+ /**
43
+ * The seven built-in card types and the element that draws each one.
44
+ *
45
+ * Note `link` → `kai-link-preview`: the one entry that is NOT `kai-<type>`, and the
46
+ * reason inferring these from the tag list is a guess rather than a lookup.
47
+ */
48
+ export const BUILTIN_CARD_TAGS: CardTagMap = {
49
+ form: 'kai-form',
50
+ confirm: 'kai-confirm',
51
+ 'tasks': 'kai-tasks',
52
+ choice: 'kai-choice',
53
+ link: 'kai-link-preview',
54
+ embed: 'kai-embed',
55
+ artifact: 'kai-artifact',
56
+ };
57
+
58
+ /** Built-ins with the consumer's overrides merged on top (consumer wins). */
59
+ export function mergeCardTags(types?: CardTagMap): CardTagMap {
60
+ return types ? { ...BUILTIN_CARD_TAGS, ...types } : { ...BUILTIN_CARD_TAGS };
61
+ }