@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,85 @@
1
+ import { MessagePart, RawOrigin } from '../elements/chat-types.js';
2
+ import { ToolPart } from '../components/tool-types.js';
3
+ import { CardEnvelope } from '../primitives/card-contract.js';
4
+ /** Stable structural fingerprint. Key order independent, so an identical snapshot
5
+ * arriving twice compares equal and can be skipped. */
6
+ export declare function fingerprint(value: unknown): string;
7
+ /** Appends to the trailing text part, or OPENS A NEW ONE if the last part is not
8
+ * text. This is what stops a post-tool answer being glued onto the pre-tool text. */
9
+ export declare function appendTextPart(parts: MessagePart[], delta: string): MessagePart[];
10
+ export interface ReasoningOpts {
11
+ index?: number;
12
+ /** Namespaces `index` to one provider response stream. Producers that read more
13
+ * than one stream into the SAME message must set it. See `appendReasoningPart`. */
14
+ streamId?: string;
15
+ label?: string;
16
+ signature?: string;
17
+ raw?: RawOrigin;
18
+ }
19
+ /** Keyed by `(streamId, index)` so parallel reasoning blocks stay distinct.
20
+ *
21
+ * WHY THE KEY IS A PAIR. A block index alone is NOT unique inside one `parts`
22
+ * array. Anthropic numbers content blocks per MESSAGE and restarts at 0 on the
23
+ * next one, while a tool loop folds every round into a single assistant turn.
24
+ * Keyed on index alone, round 2's thinking block (index 0) merges into round 1's
25
+ * part: the text concatenates and `raw: opts.raw ?? cur.raw` OVERWRITES round 1's
26
+ * verbatim provider payload with round 2's. `toAnthropicMessages` then emits one
27
+ * thinking block where two belong, carrying round 2's signature in round 1's
28
+ * position -- a modified-and-filtered thinking block, which is exactly the 400
29
+ * the verbatim `raw` channel exists to prevent.
30
+ *
31
+ * `streamId` is the namespace: one value per provider response stream, attached
32
+ * by `consumeModelStream`. Two rounds are two streams, so their index 0s are two
33
+ * parts. Producers that drive a sink from a single stream can omit it; `undefined`
34
+ * is its own namespace and behaves exactly as before.
35
+ *
36
+ * Returns the SAME array reference when the merge produces an identical part,
37
+ * for the same reason `upsertToolPart` does: a new `parts` array is the
38
+ * re-render signal, so handing one back for a delta that changed nothing is a
39
+ * spurious render.
40
+ *
41
+ * An EMPTY delta is not a no-op and must still reach here: it is how a redacted
42
+ * reasoning block, a `signature_delta` and an assembled `content_block_stop`
43
+ * block arrive, and how a format opens a block at the right position so block
44
+ * ORDER survives into `parts`. Those carry a new `raw`/`signature`/index and so
45
+ * compare unequal and DO rebuild. What the check absorbs is the other empty
46
+ * frame: one carrying nothing new, which a provider is free to send repeatedly.
47
+ *
48
+ * `signature` and `raw` resolve with `??`, so an explicit `undefined` from a
49
+ * later delta never blanks a value an earlier one established. Pass a DEFINED
50
+ * value to replace either; there is no way to clear them. */
51
+ export declare function appendReasoningPart(parts: MessagePart[], delta: string, opts?: ReasoningOpts): MessagePart[];
52
+ /** Creates or REPLACES a card part, keyed on `envelope.id`. Returns the SAME array
53
+ * reference when the incoming envelope is structurally identical to the current
54
+ * one, for the same reason `upsertToolPart` does: a new `parts` array is the
55
+ * re-render signal, so handing one back for a revision that changed nothing is a
56
+ * spurious render.
57
+ *
58
+ * WHY THIS REPLACES WHERE `upsertToolPart` MERGES. A tool part is patched
59
+ * fragment-by-fragment as its arguments stream in, which is why that function
60
+ * needs carry-forward rules for `raw` and `kind` — a later patch that omits a
61
+ * field is not asserting the field is gone. A card envelope is the opposite: it
62
+ * arrives WHOLE, as one complete tool result, so an omitted field IS an
63
+ * assertion. Last-write-wins is both simpler and the only semantics under which
64
+ * a host can CLEAR `resolution` to re-open a dismissed card — a field-by-field
65
+ * merge can only ever set that field, never unset it, so `CardPolicy.onReopen`
66
+ * (see `primitives/card-contract.ts`) would have no way to express its result.
67
+ *
68
+ * The PART-level `raw` is preserved across a revision. It is a different field
69
+ * from anything inside the envelope: the untranslated provider payload the part
70
+ * was built from, attached once by the producer, which a fresh envelope carries
71
+ * no opinion about.
72
+ *
73
+ * Position is preserved: a revised card stays where it first appeared in the
74
+ * thread rather than jumping past the text that followed it. */
75
+ export declare function upsertCardPart(parts: MessagePart[], envelope: CardEnvelope): MessagePart[];
76
+ /** Creates or merges a tool part. Returns the SAME array reference when the merge
77
+ * produces an identical tool, so repeated snapshots do not trigger a re-render.
78
+ *
79
+ * Two fields do NOT follow plain spread semantics, because a streaming provider
80
+ * hands them over on one fragment and then keeps patching the rest:
81
+ * - `kind`: a value the consumer set is preserved across later patches instead
82
+ * of being reverted to `classifyTool(type)` (see `resolveKind`).
83
+ * - `raw`: an explicit `raw: undefined` never blanks a `raw` an earlier patch
84
+ * established. Pass a DEFINED `raw` to replace it; there is no way to clear it. */
85
+ export declare function upsertToolPart(parts: MessagePart[], toolCallId: string, patch: Partial<ToolPart>): MessagePart[];
@@ -1,18 +1,24 @@
1
- import { ChatMessage } from '../elements/chat-types';
2
- import { ToolPart } from '../components/tool-types';
1
+ import { ChatMessage, Source } from '../elements/chat-types.js';
2
+ import { ToolPart } from '../components/tool-types.js';
3
+ import { CardEnvelope } from '../primitives/card-contract.js';
4
+ import { AttachmentData } from '../components/attachment-types.js';
5
+ import { ReasoningOpts } from './parts.js';
3
6
  /** The one universal contract: a functional-updater setter (React setState shape). */
4
7
  export type SetMessages = (updater: (prev: ChatMessage[]) => ChatMessage[]) => void;
5
8
  /** A fluent builder for one in-flight assistant message. Owns no state. */
6
9
  export interface AssistantStream {
7
10
  readonly id: string;
8
11
  appendText(delta: string): AssistantStream;
9
- setText(content: string): AssistantStream;
10
- appendReasoning(delta: string, label?: string): AssistantStream;
11
- setReasoning(text: string, label?: string): AssistantStream;
12
- upsertTool(tool: ToolPart): AssistantStream;
13
- updateTool(toolCallId: string, patch: Partial<ToolPart>): AssistantStream;
14
- patch(patch: Partial<ChatMessage>): AssistantStream;
15
- done(final?: Partial<ChatMessage>): void;
12
+ appendReasoning(delta: string, opts?: ReasoningOpts): AssistantStream;
13
+ upsertTool(toolCallId: string, patch: Partial<ToolPart>): AssistantStream;
14
+ /** Adds a card, or REPLACES the existing one with the same `envelope.id`. A
15
+ * model that revises a card mid-turn re-sends the whole envelope, so a second
16
+ * call with a known id revises that card in place rather than rendering a
17
+ * second copy of it. See `upsertCardPart`. */
18
+ addCard(envelope: CardEnvelope): AssistantStream;
19
+ addSource(source: Source): AssistantStream;
20
+ addFile(attachment: AttachmentData): AssistantStream;
21
+ done(): void;
16
22
  abort(reason?: string): void;
17
23
  }
18
24
  /** Start an assistant message and drive it through `set`. New refs on every mutation. */
@@ -0,0 +1,5 @@
1
+ // GENERATED by scripts/emit-subpath-dts.mjs — do not edit.
2
+ // Sibling declarations for dist/state.js, so that RELATIVE imports
3
+ // of this bundle (which bypass package.json "exports") still resolve to types.
4
+ // Without this, tsc resolves the path to the .js and reports TS7016.
5
+ export * from './state/index.js';
package/dist/state.js CHANGED
@@ -1,117 +1,286 @@
1
- function c(t, u) {
2
- return [...t, u];
1
+ function y(t) {
2
+ const e = t.toLowerCase();
3
+ return e ? e.includes("bash") || e.includes("command") || e.includes("shell") || e.includes("terminal") || e.includes("exec") ? "command" : e.includes("edit") || e.includes("write") || e.includes("patch") || e.includes("replace") || e.includes("delete") ? "file-change" : e.includes("search") || e.includes("grep") || e.includes("glob") || e.includes("find") ? "search" : e.includes("fetch") || e.includes("http") || e.includes("browse") || e.includes("crawl") ? "fetch" : e.includes("mcp") ? "mcp" : e.includes("image") || e.includes("screenshot") || e.includes("vision") ? "image" : "generic" : "generic";
3
4
  }
4
- function f(t, u) {
5
- const o = t.findIndex((d) => d.id === u.id);
6
- if (o === -1) return [...t, u];
7
- const e = t.slice();
8
- return e[o] = u, e;
5
+ function d(t) {
6
+ const e = /* @__PURE__ */ new WeakSet(), n = (r) => {
7
+ if (r === null || typeof r != "object") return r;
8
+ if (e.has(r)) return "[circular]";
9
+ e.add(r);
10
+ const i = r, u = Array.isArray(r) ? r.map(n) : Object.fromEntries(Object.keys(i).sort().map((o) => [o, n(i[o])]));
11
+ return e.delete(r), u;
12
+ };
13
+ return JSON.stringify(n(t)) ?? "";
14
+ }
15
+ function k(t, e) {
16
+ const n = t[t.length - 1];
17
+ return (n == null ? void 0 : n.type) === "text" ? [...t.slice(0, -1), { ...n, text: n.text + e }] : [...t, { type: "text", text: e }];
18
+ }
19
+ function h(t, e, n = {}) {
20
+ const r = n.index ?? 0, i = n.streamId, u = t.findIndex(
21
+ (s) => s.type === "reasoning" && (s.index ?? 0) === r && s.streamId === i
22
+ );
23
+ if (u < 0)
24
+ return [...t, { type: "reasoning", text: e, index: r, streamId: i, label: n.label, signature: n.signature, raw: n.raw }];
25
+ const o = t[u], a = {
26
+ ...o,
27
+ text: o.text + e,
28
+ label: n.label ?? o.label,
29
+ signature: n.signature ?? o.signature,
30
+ raw: n.raw ?? o.raw
31
+ };
32
+ return O(o, a) ? t : [...t.slice(0, u), a, ...t.slice(u + 1)];
33
+ }
34
+ const I = [
35
+ "type",
36
+ "text",
37
+ "index",
38
+ "streamId",
39
+ "label",
40
+ "signature",
41
+ "raw"
42
+ ], T = {
43
+ type: (t, e) => t.type === e.type,
44
+ text: (t, e) => t.text === e.text,
45
+ index: (t, e) => t.index === e.index,
46
+ streamId: (t, e) => t.streamId === e.streamId,
47
+ label: (t, e) => t.label === e.label,
48
+ signature: (t, e) => t.signature === e.signature,
49
+ raw: (t, e) => t.raw === e.raw
50
+ };
51
+ function O(t, e) {
52
+ return I.every((n) => T[n](t, e));
53
+ }
54
+ function _(t, e) {
55
+ const n = t.findIndex((i) => i.type === "card" && i.envelope.id === e.id);
56
+ if (n < 0) return [...t, { type: "card", envelope: e }];
57
+ const r = t[n];
58
+ return d(r.envelope) === d(e) ? t : [...t.slice(0, n), { ...r, envelope: e }, ...t.slice(n + 1)];
59
+ }
60
+ function b(t, e, n) {
61
+ const r = t.findIndex((o) => o.type === "tool" && o.tool.toolCallId === e);
62
+ if (r < 0) {
63
+ const o = {
64
+ type: n.type ?? "unknown",
65
+ state: n.state ?? "input-streaming",
66
+ ...n,
67
+ toolCallId: e
68
+ };
69
+ return o.kind = o.kind ?? y(o.type), [...t, { type: "tool", tool: o }];
70
+ }
71
+ const i = t[r].tool, u = { ...i, ...n, toolCallId: e };
72
+ return u.kind = M(i, n, u.type), u.raw === void 0 && i.raw !== void 0 && (u.raw = i.raw), E(i, u) ? t : [...t.slice(0, r), { type: "tool", tool: u }, ...t.slice(r + 1)];
73
+ }
74
+ function M(t, e, n) {
75
+ return e.kind !== void 0 ? e.kind : t.kind === void 0 || t.kind === y(t.type) ? y(n) : t.kind;
76
+ }
77
+ const S = [
78
+ "type",
79
+ "state",
80
+ "kind",
81
+ "toolCallId",
82
+ "errorText",
83
+ "rawInput",
84
+ "raw",
85
+ "input",
86
+ "output"
87
+ ], R = {
88
+ type: (t, e) => t.type === e.type,
89
+ state: (t, e) => t.state === e.state,
90
+ kind: (t, e) => t.kind === e.kind,
91
+ toolCallId: (t, e) => t.toolCallId === e.toolCallId,
92
+ errorText: (t, e) => t.errorText === e.errorText,
93
+ rawInput: (t, e) => t.rawInput === e.rawInput,
94
+ raw: (t, e) => t.raw === e.raw,
95
+ input: (t, e) => t.input === e.input || d(t.input) === d(e.input),
96
+ output: (t, e) => t.output === e.output || d(t.output) === d(e.output)
97
+ };
98
+ function E(t, e) {
99
+ return S.every((n) => R[n](t, e));
9
100
  }
10
- function T(t, u, o) {
101
+ function C() {
102
+ return typeof crypto < "u" && crypto.randomUUID ? crypto.randomUUID() : "kai-" + Math.random().toString(36).slice(2);
103
+ }
104
+ function U(t, e, n = {}) {
105
+ return { id: n.id ?? C(), role: t, parts: [{ type: "text", text: e }], ...n };
106
+ }
107
+ function j(t) {
108
+ return t.filter((e) => e.type === "text").map((e) => e.text).join("");
109
+ }
110
+ function L(t, e) {
111
+ return [...t, e];
112
+ }
113
+ function $(t, e) {
114
+ const n = t.findIndex((i) => i.id === e.id);
115
+ if (n === -1) return [...t, e];
116
+ const r = t.slice();
117
+ return r[n] = e, r;
118
+ }
119
+ function F(t, e, n) {
11
120
  return t.map(
12
- (e) => e.id === u ? typeof o == "function" ? o(e) : { ...e, ...o } : e
121
+ (r) => r.id === e ? typeof n == "function" ? n(r) : { ...r, ...n } : r
13
122
  );
14
123
  }
15
- function g(t, u) {
16
- return t.filter((o) => o.id !== u);
124
+ function Y(t, e) {
125
+ return t.filter((n) => n.id !== e);
17
126
  }
18
- function I(t, u, o) {
19
- return t.map((e) => e.id === u ? { ...e, content: e.content + o } : e);
127
+ function q(t, e, n) {
128
+ return t.map((r) => r.id === e ? { ...r, parts: k(r.parts, n) } : r);
20
129
  }
21
- function x(t, u) {
22
- return t.includes(u) ? t.slice() : [...t, u];
130
+ function G(t, e) {
131
+ return t.includes(e) ? t.slice() : [...t, e];
23
132
  }
24
- function y(t, u) {
25
- return t.filter((o) => o !== u);
133
+ function J(t, e) {
134
+ return t.filter((n) => n !== e);
26
135
  }
27
- function l() {
28
- return typeof crypto < "u" && typeof crypto.randomUUID == "function" ? crypto.randomUUID() : "kai-" + Math.random().toString(36).slice(2);
136
+ function A() {
137
+ return typeof crypto < "u" && crypto.randomUUID ? crypto.randomUUID() : "kai-" + Math.random().toString(36).slice(2);
29
138
  }
30
- function b(t, u = {}) {
31
- const o = u.id ?? l(), e = { id: o, role: "assistant", content: "", ...u };
32
- t((n) => [...n, e]);
33
- const d = (n) => t((r) => r.map((a) => a.id === o ? n(a) : a)), i = {
34
- id: o,
35
- appendText(n) {
36
- return d((r) => ({ ...r, content: r.content + n })), i;
37
- },
38
- setText(n) {
39
- return d((r) => ({ ...r, content: n })), i;
139
+ function W(t, e = {}) {
140
+ const n = e.id ?? A();
141
+ let r = !1;
142
+ t((o) => [...o, { id: n, role: "assistant", parts: [], ...e }]);
143
+ const i = (o) => {
144
+ r || t((a) => {
145
+ const s = a.findIndex((l) => l.id === n);
146
+ if (s < 0) return a;
147
+ const c = o(a[s].parts);
148
+ return c === a[s].parts ? a : [...a.slice(0, s), { ...a[s], parts: c }, ...a.slice(s + 1)];
149
+ });
150
+ }, u = {
151
+ id: n,
152
+ appendText(o) {
153
+ return i((a) => k(a, o)), u;
40
154
  },
41
- appendReasoning(n, r) {
42
- return d((a) => {
43
- var s, p;
44
- return { ...a, reasoning: { text: (((s = a.reasoning) == null ? void 0 : s.text) ?? "") + n, label: r ?? ((p = a.reasoning) == null ? void 0 : p.label) } };
45
- }), i;
155
+ appendReasoning(o, a) {
156
+ return i((s) => h(s, o, a)), u;
46
157
  },
47
- setReasoning(n, r) {
48
- return d((a) => {
49
- var s;
50
- return { ...a, reasoning: { text: n, label: r ?? ((s = a.reasoning) == null ? void 0 : s.label) } };
51
- }), i;
158
+ upsertTool(o, a) {
159
+ return i((s) => b(s, o, a)), u;
52
160
  },
53
- upsertTool(n) {
54
- return d((r) => {
55
- const a = r.tools ? r.tools.slice() : [], s = n.toolCallId != null ? a.findIndex((p) => p.toolCallId === n.toolCallId) : a.findIndex((p) => p.type === n.type);
56
- return s === -1 ? a.push(n) : a[s] = n, { ...r, tools: a };
57
- }), i;
161
+ // Upsert, not append: keyed on envelope.id so a revised card replaces itself.
162
+ addCard(o) {
163
+ return i((a) => _(a, o)), u;
58
164
  },
59
- updateTool(n, r) {
60
- return d((a) => ({ ...a, tools: (a.tools ?? []).map((s) => s.toolCallId === n ? { ...s, ...r } : s) })), i;
165
+ addSource(o) {
166
+ return i((a) => [...a, { type: "source", source: o }]), u;
61
167
  },
62
- patch(n) {
63
- return d((r) => ({ ...r, ...n })), i;
168
+ addFile(o) {
169
+ return i((a) => [...a, { type: "file", attachment: o }]), u;
64
170
  },
65
- done(n) {
66
- n && d((r) => ({ ...r, ...n }));
171
+ done() {
172
+ r = !0;
67
173
  },
68
- abort(n) {
69
- n ? d((r) => ({ ...r, tools: (r.tools ?? []).map((a) => ({ ...a, state: "output-error", errorText: n })) })) : t((r) => r.filter((a) => a.id !== o));
174
+ abort(o) {
175
+ i((a) => a.map((s) => s.type === "tool" && s.tool.state !== "output-available" ? { ...s, tool: { ...s.tool, state: "output-error", errorText: o } } : s)), r = !0;
70
176
  }
71
177
  };
72
- return i;
178
+ return u;
73
179
  }
74
- function R(t, u) {
75
- const o = {
180
+ function v(t, e) {
181
+ const n = {
76
182
  id: t.id,
77
- appendText(e) {
78
- return t.appendText(e), o;
183
+ appendText(r) {
184
+ return t.appendText(r), n;
79
185
  },
80
- setText(e) {
81
- return t.setText(e), o;
186
+ appendReasoning(r, i) {
187
+ return t.appendReasoning(r, i), n;
82
188
  },
83
- appendReasoning(e, d) {
84
- return t.appendReasoning(e, d), o;
189
+ upsertTool(r, i) {
190
+ return t.upsertTool(r, i), n;
85
191
  },
86
- setReasoning(e, d) {
87
- return t.setReasoning(e, d), o;
192
+ addCard(r) {
193
+ return t.addCard(r), n;
88
194
  },
89
- upsertTool(e) {
90
- return t.upsertTool(e), o;
195
+ addSource(r) {
196
+ return t.addSource(r), n;
91
197
  },
92
- updateTool(e, d) {
93
- return t.updateTool(e, d), o;
198
+ addFile(r) {
199
+ return t.addFile(r), n;
94
200
  },
95
- patch(e) {
96
- return t.patch(e), o;
201
+ done() {
202
+ t.done(), e();
97
203
  },
98
- done(e) {
99
- t.done(e), u();
100
- },
101
- abort(e) {
102
- t.abort(e), u();
204
+ abort(r) {
205
+ t.abort(r), e();
103
206
  }
104
207
  };
105
- return o;
208
+ return n;
209
+ }
210
+ const K = "kai-mock", N = "_kai_mock", w = "no provider was contacted — this reply was generated locally by createMockResponder() from @kitn.ai/ui/state", m = `: kai-mock — NO PROVIDER WAS CONTACTED. ${w}.`, g = [
211
+ "Hi! I'm a local mock — no backend, no API key, no provider was contacted. I'm streaming through the same parser a real model would, so what you're seeing is the real rendering path with a canned reply.",
212
+ "Still the mock. Swap `createMockResponder()` for a `fetch('/api/chat', …)` and nothing else in this handler changes — that's the whole point of the seam.",
213
+ "Mock again. Every frame I send is tagged `_kai_mock` and my usage reports zero tokens, so nothing here can be mistaken for a real turn."
214
+ ];
215
+ function P(t, e) {
216
+ const n = t.split(/(\s+)/).filter((i) => i !== "");
217
+ if (e <= 1) return n;
218
+ const r = [];
219
+ for (let i = 0; i < n.length; i += e)
220
+ r.push(n.slice(i, i + e).join(""));
221
+ return r;
222
+ }
223
+ function p(t, e) {
224
+ return `data: ${JSON.stringify({
225
+ [N]: w,
226
+ id: t,
227
+ object: "chat.completion.chunk",
228
+ model: K,
229
+ ...e
230
+ })}
231
+
232
+ `;
233
+ }
234
+ const D = (t) => t > 0 ? new Promise((e) => setTimeout(e, t)) : Promise.resolve();
235
+ function z(t = {}) {
236
+ const {
237
+ replies: e = g,
238
+ delayMs: n = 24,
239
+ chunkSize: r = 1,
240
+ announce: i = !0
241
+ } = t, u = e.length > 0 ? e : g;
242
+ let o = 0, a = !1;
243
+ return function(c) {
244
+ const l = u[o % u.length], f = `kai-mock-${o + 1}`;
245
+ return o += 1, {
246
+ async *[Symbol.asyncIterator]() {
247
+ i && !a && (a = !0, console.info(`[kai] ${m.slice(2)}`)), yield `${m}
248
+
249
+ `, yield p(f, { choices: [{ index: 0, delta: { role: "assistant" }, finish_reason: null }] });
250
+ for (const x of P(l, r))
251
+ await D(n), yield p(f, { choices: [{ index: 0, delta: { content: x }, finish_reason: null }] });
252
+ yield p(f, {
253
+ choices: [{ index: 0, delta: {}, finish_reason: "stop" }],
254
+ usage: { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 }
255
+ }), yield `data: [DONE]
256
+
257
+ `;
258
+ }
259
+ };
260
+ };
106
261
  }
107
262
  export {
108
- x as addSuggestion,
109
- I as appendContent,
110
- c as appendMessage,
111
- b as createAssistantStream,
112
- R as onStreamSettled,
113
- g as removeMessage,
114
- y as removeSuggestion,
115
- T as updateMessage,
116
- f as upsertMessage
263
+ g as DEFAULT_MOCK_REPLIES,
264
+ m as MOCK_BANNER,
265
+ w as MOCK_MARKER,
266
+ N as MOCK_MARKER_KEY,
267
+ K as MOCK_MODEL_ID,
268
+ G as addSuggestion,
269
+ L as appendMessage,
270
+ h as appendReasoningPart,
271
+ q as appendText,
272
+ k as appendTextPart,
273
+ y as classifyTool,
274
+ W as createAssistantStream,
275
+ z as createMockResponder,
276
+ d as fingerprint,
277
+ v as onStreamSettled,
278
+ j as partsToText,
279
+ Y as removeMessage,
280
+ J as removeSuggestion,
281
+ U as textMessage,
282
+ F as updateMessage,
283
+ _ as upsertCardPart,
284
+ $ as upsertMessage,
285
+ b as upsertToolPart
117
286
  };
@@ -1,5 +1,5 @@
1
1
  import { Component } from 'solid-js';
2
- import { ChatMessageAction } from '../elements/chat-types';
2
+ import { ChatMessageAction } from '../elements/chat-types.js';
3
3
  type IconComponent = Component<{
4
4
  class?: string;
5
5
  }>;
@@ -14,7 +14,7 @@ export interface CollapsibleController {
14
14
  open: Accessor<boolean>;
15
15
  setOpen: (v: boolean) => void;
16
16
  }
17
- export declare function Collapsible(props: {
17
+ export interface CollapsibleProps {
18
18
  open?: boolean;
19
19
  defaultOpen?: boolean;
20
20
  onOpenChange?: (open: boolean) => void;
@@ -26,16 +26,21 @@ export declare function Collapsible(props: {
26
26
  controllerRef?: (api: CollapsibleController) => void;
27
27
  children: JSX.Element;
28
28
  class?: string;
29
- }): JSX.Element;
30
- export declare function CollapsibleTrigger(props: {
29
+ }
30
+ export declare function Collapsible(props: CollapsibleProps): JSX.Element;
31
+ export interface CollapsibleTriggerProps {
31
32
  children?: JSX.Element;
32
33
  class?: string;
33
34
  as?: (props: Record<string, any>) => JSX.Element;
34
35
  onClick?: JSX.EventHandlerUnion<HTMLButtonElement, MouseEvent>;
36
+ /** Remaining attributes are spread onto the rendered trigger. */
35
37
  [k: string]: any;
36
- }): JSX.Element;
37
- export declare function CollapsibleContent(props: {
38
+ }
39
+ export declare function CollapsibleTrigger(props: CollapsibleTriggerProps): JSX.Element;
40
+ export interface CollapsibleContentProps {
38
41
  children?: JSX.Element;
39
42
  class?: string;
43
+ /** Remaining attributes are spread onto the rendered panel. */
40
44
  [k: string]: any;
41
- }): JSX.Element;
45
+ }
46
+ export declare function CollapsibleContent(props: CollapsibleContentProps): JSX.Element;