@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,171 @@
1
+ import { RawOrigin, ToolPart } from '../components/tool-types.js';
2
+ import { MessagePart, MessageSource } from '../elements/chat-types.js';
3
+ import { ReasoningOpts } from '../state/parts.js';
4
+ /** One fragment of a tool call. */
5
+ export interface ModelToolCallDelta {
6
+ /**
7
+ * The ONLY thing correlating fragments, and its NAMESPACE IS FORMAT-DEFINED.
8
+ * `openaiChatFormat` uses the position in `delta.tool_calls`;
9
+ * `anthropicMessagesFormat` uses the content-block index. Both are correct and
10
+ * both are stable within one stream, but they are not the same number, so a
11
+ * third-party format must pick one and stay consistent with itself.
12
+ */
13
+ index: number;
14
+ id?: string;
15
+ /** Usually whole on the first fragment; a few providers split it. */
16
+ name?: string;
17
+ /** A FRAGMENT of the JSON arguments string, not valid JSON on its own. */
18
+ arguments?: string;
19
+ /** A result the PROVIDER executed (Anthropic web_search_tool_result, an OpenAI
20
+ * built-in). Completes the panel with no host work. */
21
+ output?: Record<string, unknown>;
22
+ /** A provider-executed tool that failed. */
23
+ outputError?: string;
24
+ }
25
+ /** Field names are deliberately provider-neutral. OpenAI says prompt/completion,
26
+ * Anthropic says input/output; input/output is the one that reads correctly for
27
+ * both. */
28
+ export interface ModelUsage {
29
+ inputTokens?: number;
30
+ outputTokens?: number;
31
+ totalTokens?: number;
32
+ /** Non-zero proves the model reasoned even when no reasoning text streamed. */
33
+ reasoningTokens?: number;
34
+ cachedInputTokens?: number;
35
+ costUsd?: number;
36
+ }
37
+ export interface ModelStreamChunk {
38
+ text?: string;
39
+ /**
40
+ * Reasoning delta. `''` is MEANINGFUL, not a no-op: a redacted block has no
41
+ * readable text but still carries a payload that must round-trip, and a format
42
+ * uses an empty delta to OPEN a reasoning part at the right position in the
43
+ * stream so block order survives into `parts`.
44
+ */
45
+ reasoning?: string;
46
+ /** The provider's BLOCK index. Keeps parallel reasoning blocks distinct.
47
+ * Omitted means block 0, the single-block case every provider degrades to. */
48
+ reasoningIndex?: number;
49
+ /**
50
+ * The UNTRANSLATED provider payload for this reasoning block. Valid on a chunk
51
+ * with NO reasoning text at all, which is the whole point: Anthropic returns
52
+ * 400 if a `thinking` block is modified, reordered or RECONSTRUCTED, so an
53
+ * encoder has to echo the original block rather than rebuild one from `text`
54
+ * plus `signature`.
55
+ */
56
+ reasoningRaw?: RawOrigin;
57
+ /** Informational. `reasoningRaw` is the round-trip channel, not this. */
58
+ reasoningSignature?: string;
59
+ toolCalls?: ModelToolCallDelta[];
60
+ /** Citations the model produced. A run of consecutive `source` parts renders
61
+ * as one citation row (`part="citations"`), outside the message bubble. */
62
+ sources?: MessageSource[];
63
+ /** Provider VERBATIM: 'stop' | 'tool_calls' | 'end_turn' | 'max_tokens' | ...
64
+ * Normalizing in place would destroy information consumers branch on. */
65
+ finishReason?: string | null;
66
+ usage?: ModelUsage;
67
+ /** An in-band provider error (the HTTP response was already 200). */
68
+ error?: {
69
+ code?: string | number;
70
+ message: string;
71
+ };
72
+ }
73
+ /** One vocabulary across formats, for code that has to BRANCH. `finishReason`
74
+ * stays beside it, verbatim, for code that has to REPORT. */
75
+ export type StopReason = 'stop' | 'length' | 'tool-calls' | 'content-filter' | 'error' | 'other';
76
+ /** Unknown reasons degrade to 'other' rather than throwing: providers add stop
77
+ * reasons without warning and a new one must not take a turn down. */
78
+ export declare function normalizeStopReason(finishReason: string | null | undefined): StopReason | undefined;
79
+ /**
80
+ * The subset of the kit's `AssistantStream` the adapter drives. Declared
81
+ * STRUCTURALLY so the adapter has no runtime dependency on a stream
82
+ * implementation and can be tested against a recorder. The kit's real
83
+ * `AssistantStream` satisfies it as-is: same method names, same arities, and its
84
+ * `AssistantStream` returns are assignable to `unknown`.
85
+ *
86
+ * `addSource` is optional so a hand-rolled three-method sink still compiles.
87
+ */
88
+ export interface AssistantStreamSink {
89
+ appendText(delta: string): unknown;
90
+ appendReasoning(delta: string, opts?: ReasoningOpts): unknown;
91
+ /** Create-or-merge. There is no separate "announce" call: handing a patch for
92
+ * an unknown `toolCallId` creates the ToolPart, and every later patch merges. */
93
+ upsertTool(toolCallId: string, patch: Partial<ToolPart>): unknown;
94
+ addSource?(source: MessageSource): unknown;
95
+ }
96
+ /** One tool call reassembled out of the stream's fragments. */
97
+ export interface ModelToolCall {
98
+ /** The delta index that correlated this call's fragments. */
99
+ index: number;
100
+ /** Provider call id (synthesised as `call_<index>` if the provider omits it). */
101
+ id: string;
102
+ name: string;
103
+ /** The RAW accumulated argument fragments. Echo THIS back on the next turn,
104
+ * not a re-stringified parse. */
105
+ argumentsText: string;
106
+ /** Parsed arguments: present only when `argumentsText` was a valid JSON object. */
107
+ input?: Record<string, unknown>;
108
+ /** Present only for a call the PROVIDER executed. */
109
+ output?: Record<string, unknown>;
110
+ /** True when the provider ran the tool and returned its result in-stream. The
111
+ * host must NOT execute these. */
112
+ providerExecuted?: boolean;
113
+ /** Why this call is unusable (malformed or truncated args, missing name). */
114
+ error?: string;
115
+ }
116
+ /** Everything one assistant turn produced. */
117
+ export interface ModelTurn {
118
+ /** The turn as ORDERED MESSAGE PARTS, built with the kit's own part builders,
119
+ * so it is exactly what the sink was driven with. Covers this turn only. */
120
+ parts: MessagePart[];
121
+ /** Flat concatenation of the text deltas. The provider wire format is a flat
122
+ * string, so this is kept for encoders. Not the content model. */
123
+ text: string;
124
+ /** Flat concatenation of the reasoning deltas, for the same reason. */
125
+ reasoning: string;
126
+ toolCalls: ModelToolCall[];
127
+ sources: MessageSource[];
128
+ /** The provider's own word for why it stopped. Never normalized. */
129
+ finishReason: string | null;
130
+ /** The same fact in one vocabulary. Branch on this. */
131
+ stopReason?: StopReason;
132
+ error?: {
133
+ code?: string | number;
134
+ message: string;
135
+ };
136
+ usage?: ModelUsage;
137
+ /** How many chunks carried a NON-EMPTY reasoning delta. Zero with a non-zero
138
+ * `usage.reasoningTokens` means the provider hid the thinking text. */
139
+ reasoningChunks: number;
140
+ chunks: number;
141
+ }
142
+ export interface ConsumeOptions {
143
+ /** Label for the reasoning disclosure. Defaults to 'Thinking'. */
144
+ reasoningLabel?: string;
145
+ /** Fires once per tool call the moment its arguments parse cleanly. This is
146
+ * the hook a host's tool loop waits on. There is deliberately no
147
+ * per-fragment callback: `ToolPart.rawInput` is written on every fragment,
148
+ * so the streaming text is already on the part. */
149
+ onToolCallReady?: (call: ModelToolCall) => void;
150
+ }
151
+ /** Per-stream state for one format. */
152
+ export interface WireFormatReader {
153
+ /**
154
+ * Map one decoded frame onto zero or more neutral chunks. Returns an ARRAY
155
+ * because the mapping is not one-to-one: an Anthropic `message_start` yields
156
+ * usage, a `content_block_start` for `tool_use` yields an id-plus-name delta,
157
+ * a `ping` yields nothing.
158
+ *
159
+ * MUST NOT throw on an unrecognized frame. Return `[]` instead: providers add
160
+ * event types without warning.
161
+ */
162
+ push(frame: unknown): ModelStreamChunk[];
163
+ }
164
+ /** A pluggable wire format. Values, not a flag, so a third party can add one
165
+ * without a PR to this repo. */
166
+ export interface WireFormat {
167
+ readonly id: string;
168
+ /** Called once per stream so a format can hold per-stream state. Two calls
169
+ * must share NOTHING. */
170
+ open(): WireFormatReader;
171
+ }
@@ -0,0 +1,26 @@
1
+ import { AssistantStreamSink, ConsumeOptions, ModelStreamChunk, ModelToolCall, ModelToolCallDelta, ModelTurn, StopReason } from './chunk.js';
2
+ /**
3
+ * Correlate tool-call fragments by `index` and drive the ToolPart lifecycle.
4
+ * THE HARD PART: `id`, `name` and each slice of `arguments` arrive across
5
+ * arbitrarily many chunks in provider-dependent order.
6
+ *
7
+ * A ToolPart is pushed (`input-streaming`) the first time a call has BOTH an id
8
+ * and a non-empty name: announcing earlier would create a panel whose `type` is
9
+ * the empty string. Everything before that is buffered and flushed at announce.
10
+ */
11
+ export declare function createToolCallAccumulator(sink: AssistantStreamSink, opts?: ConsumeOptions): {
12
+ apply: (raw: ModelToolCallDelta) => void;
13
+ settle: (stopReason: StopReason | undefined, streamError?: string) => ModelToolCall[];
14
+ };
15
+ /**
16
+ * Read one turn's worth of `ModelStreamChunk`s and drive `sink` with them.
17
+ *
18
+ * The sink is expected to be the kit's `AssistantStream`, which produces a NEW
19
+ * message object (and a new `parts` array) on every real mutation: that is what
20
+ * makes `<kai-thread>` re-render. This adapter calls the sink once per delta and
21
+ * never batches; batching is a host concern.
22
+ *
23
+ * This is also the escape hatch for a consumer who already has neutral chunks
24
+ * from somewhere else and does not need a WireFormat at all.
25
+ */
26
+ export declare function consumeModelStream(chunks: AsyncIterable<ModelStreamChunk>, sink: AssistantStreamSink, opts?: ConsumeOptions): Promise<ModelTurn>;
@@ -0,0 +1,148 @@
1
+ import { ChatMessage } from '../elements/chat-types.js';
2
+ export interface OpenAIToolCall {
3
+ id: string;
4
+ type: 'function';
5
+ function: {
6
+ name: string;
7
+ arguments: string;
8
+ };
9
+ }
10
+ /** One `reasoning_details` entry. Provider-owned open shape, kept as a record
11
+ * for the same reason `AnthropicContentBlock` is: an opaque entry has to pass
12
+ * through UNTOUCHED, and a closed type would be a list of the fields we happen
13
+ * to have seen. */
14
+ export type OpenAIReasoningDetail = Record<string, unknown>;
15
+ export interface OpenAIWireMessage {
16
+ role: 'system' | 'user' | 'assistant' | 'tool';
17
+ content: string | null;
18
+ tool_calls?: OpenAIToolCall[];
19
+ tool_call_id?: string;
20
+ name?: string;
21
+ /** Only ever present when `toOpenAIMessages` was asked for it. See
22
+ * `OpenAIEncodeOptions.reasoning`. */
23
+ reasoning_details?: OpenAIReasoningDetail[];
24
+ }
25
+ export interface OpenAIEncodeOptions {
26
+ /**
27
+ * Whether to send the assistant's own reasoning back with the thread.
28
+ *
29
+ * DEFAULT `'omit'`, and that default is a measurement, not caution. Omitting
30
+ * reasoning is accepted by every configuration tested -- five live omission
31
+ * trials plus 28 recorded live requests per configuration across the spike's
32
+ * conformance sweep, zero 400s -- so the path that ships today demonstrably
33
+ * works, while including reasoning cost about 25% more prompt tokens per round
34
+ * when measured (665 -> 834 on a two-round loop). A library does not get to
35
+ * raise every consumer's bill and add a new provider-validation surface as a
36
+ * side effect of a bug fix.
37
+ *
38
+ * `'include'` is for a multi-round TOOL loop, which is where OpenRouter says it
39
+ * pays: "when you post tool results, including the original reasoning ensures
40
+ * the model can continue its reasoning from where it left off". Measured
41
+ * accepted (HTTP 200) for a signed Anthropic block and for an OpenAI encrypted
42
+ * block, over the OpenAI-compatible wire.
43
+ *
44
+ * The Anthropic wire has no such knob because it has no such choice: a filtered
45
+ * or rebuilt thinking block there is a hard 400.
46
+ */
47
+ reasoning?: 'omit' | 'include';
48
+ }
49
+ /** Anthropic content blocks are an open, provider-owned union. Keeping them as
50
+ * records is what lets a verbatim `thinking` payload pass through UNTOUCHED,
51
+ * which is the entire point of this encoder. */
52
+ export type AnthropicContentBlock = Record<string, unknown>;
53
+ export interface AnthropicWireMessage {
54
+ role: 'user' | 'assistant';
55
+ content: AnthropicContentBlock[];
56
+ }
57
+ /** A message cannot be encoded without losing something the provider will reject.
58
+ * Thrown at encode time, on purpose: a throw here beats a 400 at request time,
59
+ * because here you still know which message and which part caused it. */
60
+ export declare class WireEncodeError extends Error {
61
+ readonly messageId: string;
62
+ readonly partIndex: number;
63
+ constructor(message: string, messageId: string, partIndex: number);
64
+ }
65
+ /**
66
+ * ChatMessage[] to an OpenAI chat-completions `messages` array.
67
+ *
68
+ * ONE ChatMessage CAN BECOME SEVERAL WIRE MESSAGES. The kit streams a whole
69
+ * assistant turn into a single message, so text, a tool call and the model's
70
+ * answer to that call all live in one `parts` array. The OpenAI wire has no such
71
+ * shape: a `role:'tool'` result must sit between the assistant message that
72
+ * announced the call and whatever the model said afterwards. So the turn is
73
+ * SPLIT at each tool boundary, into
74
+ *
75
+ * assistant(pre-tool text + tool_calls) -> tool(result)... -> assistant(answer)
76
+ *
77
+ * Flattening instead would put the model's answer BEFORE the result it was based
78
+ * on. No endpoint rejects that, which is exactly why it is worth spelling out:
79
+ * it quietly degrades every later round of a tool loop.
80
+ *
81
+ * Consecutive tool parts stay in ONE assistant message, because parallel calls
82
+ * are announced together and their results follow together.
83
+ *
84
+ * A turn that encodes to nothing is SKIPPED, never sent as `{ content: null }`
85
+ * with no `tool_calls`: OpenAI treats `content` as required unless `tool_calls`
86
+ * is present, and strict-compatible endpoints reject it.
87
+ *
88
+ * REASONING IS OPT-IN, and off by default. OpenRouter's OpenAI-compatible
89
+ * endpoint does have a channel on the way back in -- `reasoning_details` on the
90
+ * assistant message -- and `{ reasoning: 'include' }` uses it, one entry per
91
+ * reasoning part, in part order, reassembled by `reasoningDetailOf` rather than
92
+ * echoed out of `part.raw`. Read that function for which blocks make it and why.
93
+ * The default omits, because omitting is measured-accepted everywhere and costs
94
+ * about 25% fewer prompt tokens per round; see `OpenAIEncodeOptions.reasoning`.
95
+ *
96
+ * Reasoning alone still encodes to NOTHING. A block is content the model already
97
+ * produced, not a reason to send a turn, so a message carrying reasoning and no
98
+ * text and no settled tool is skipped exactly as before, rather than becoming
99
+ * `{ content: null }` with no `tool_calls`.
100
+ *
101
+ * `card`, `source` and `file` parts are never encoded; they are kit-side. File
102
+ * attachments are a documented v1 limitation, which is why a user turn carrying
103
+ * only an attachment encodes to nothing and is skipped.
104
+ */
105
+ export declare function toOpenAIMessages(messages: ChatMessage[], options?: OpenAIEncodeOptions): OpenAIWireMessage[];
106
+ /**
107
+ * ChatMessage[] to an Anthropic Messages `messages` array. THE ROUND-TRIP
108
+ * ENCODER.
109
+ *
110
+ * A reasoning block is emitted as `part.raw.payload` verbatim and is NEVER
111
+ * rebuilt from `text` plus `signature`: Anthropic returns 400 if a thinking
112
+ * block in the most recent assistant message is modified, reordered, filtered or
113
+ * reconstructed. A reasoning part with no `raw`, or with a `raw` captured from
114
+ * some other format, therefore THROWS rather than silently producing a request
115
+ * that will fail.
116
+ *
117
+ * Block order follows part order, which follows stream order, with no filtering,
118
+ * because the API validates order too. An empty-text reasoning part (an omitted
119
+ * or redacted block) is still emitted: the docs require sending back every block
120
+ * "including any blocks with empty thinking fields".
121
+ *
122
+ * ONE ChatMessage CAN BECOME SEVERAL WIRE MESSAGES, for the same reason as
123
+ * `toOpenAIMessages`: the kit streams a whole assistant turn into one message, so
124
+ * the tool call and the model's answer to it share a `parts` array, but Anthropic
125
+ * carries the result in a SEPARATE user message that has to sit between them. So
126
+ * the turn is SPLIT at each tool boundary, into
127
+ *
128
+ * assistant(pre-tool blocks + tool_use) -> user(tool_result)... -> assistant(answer)
129
+ *
130
+ * Flattening instead puts the model's answer BEFORE the result it was based on,
131
+ * and strands every later round's thinking block in the first assistant message.
132
+ * Consecutive tool parts stay in ONE assistant message, because parallel calls are
133
+ * announced together and their results come back together.
134
+ *
135
+ * Adjacent user messages are MERGED. The API combines consecutive same-role turns
136
+ * itself rather than rejecting them, so this is not what stands between you and a
137
+ * 400; it is emitted anyway because the tool-result turn and a following user turn
138
+ * are one turn, several OpenAI-compatible Anthropic proxies do enforce strict
139
+ * alternation, and the merged form is what the models are trained on. Ordering is
140
+ * safe by construction: `results` is only non-empty when `blocks` is, so a
141
+ * tool_result message always follows its assistant message and can never be
142
+ * appended after a plain user turn.
143
+ *
144
+ * Asymmetry worth knowing: `tool_use.input` is a parsed OBJECT on this wire, not
145
+ * a string, so it uses `input` and not `rawInput`. Only thinking blocks carry a
146
+ * verbatim requirement.
147
+ */
148
+ export declare function toAnthropicMessages(messages: ChatMessage[]): AnthropicWireMessage[];
@@ -0,0 +1,2 @@
1
+ import { WireFormat } from '../chunk.js';
2
+ export declare const anthropicMessagesFormat: WireFormat;
@@ -0,0 +1,5 @@
1
+ import { WireFormat } from '../chunk.js';
2
+ /** Stateless: every frame is self-describing, so `open()` returns a reader with
3
+ * no closure state. The interface still calls it per stream, which is what lets
4
+ * the stateful Anthropic format use the same seam. */
5
+ export declare const openaiChatFormat: WireFormat;
@@ -0,0 +1,14 @@
1
+ export { readModelStream, readOpenAIStream, readAnthropicStream, WireError } from './read.js';
2
+ export type { StreamSource, ReadOptions } from './read.js';
3
+ export { consumeModelStream, createToolCallAccumulator } from './consume.js';
4
+ export { applyToolOutput, applyToolFailure, bufferText } from './sink-helpers.js';
5
+ export { toOpenAIMessages, toAnthropicMessages, WireEncodeError } from './encode.js';
6
+ export type { AnthropicContentBlock, AnthropicWireMessage, OpenAIEncodeOptions, OpenAIReasoningDetail, OpenAIToolCall, OpenAIWireMessage, } from './encode.js';
7
+ export { openaiChatFormat } from './formats/openai.js';
8
+ export { anthropicMessagesFormat } from './formats/anthropic.js';
9
+ export { sseDataFrames, sseJson, readableToAsyncIterable } from './sse.js';
10
+ export type { ByteSource } from './sse.js';
11
+ export { normalizeStopReason } from './chunk.js';
12
+ export type { AssistantStreamSink, ConsumeOptions, ModelStreamChunk, ModelToolCall, ModelToolCallDelta, ModelTurn, ModelUsage, StopReason, WireFormat, WireFormatReader, } from './chunk.js';
13
+ export type { ChatMessage, MessagePart, MessageSource, RawOrigin } from '../elements/chat-types.js';
14
+ export type { ToolPart } from '../components/tool-types.js';
@@ -0,0 +1,26 @@
1
+ import { AssistantStreamSink, ConsumeOptions, ModelTurn, WireFormat } from './chunk.js';
2
+ export type StreamSource = Response | ReadableStream<Uint8Array> | AsyncIterable<Uint8Array | string>;
3
+ export interface ReadOptions extends ConsumeOptions {
4
+ format: WireFormat;
5
+ }
6
+ /** A non-ok HTTP response from the model endpoint, with the provider's own error
7
+ * body attached when there is one. Thrown before a single chunk is read, so a
8
+ * caller can distinguish "the request failed" from "the stream carried an
9
+ * error", which is `ModelTurn.error`. */
10
+ export declare class WireError extends Error {
11
+ readonly status: number;
12
+ readonly statusText: string;
13
+ /** The response body parsed as JSON, or undefined when it was not JSON (an
14
+ * HTML error page from a proxy, most often). */
15
+ readonly body: unknown;
16
+ /** The raw response body, always. */
17
+ readonly bodyText: string;
18
+ constructor(status: number, statusText: string, bodyText: string, body: unknown);
19
+ }
20
+ /** Read one turn off the wire in `opts.format` and drive `sink` with it. */
21
+ export declare function readModelStream(source: StreamSource, sink: AssistantStreamSink, opts: ReadOptions): Promise<ModelTurn>;
22
+ /** OpenAI chat-completions SSE. Also what all nine catalog integrations except
23
+ * `mock` re-frame to server-side, so this is the common path. */
24
+ export declare function readOpenAIStream(source: StreamSource, sink: AssistantStreamSink, opts?: ConsumeOptions): Promise<ModelTurn>;
25
+ /** Anthropic Messages SSE. */
26
+ export declare function readAnthropicStream(source: StreamSource, sink: AssistantStreamSink, opts?: ConsumeOptions): Promise<ModelTurn>;
@@ -0,0 +1,21 @@
1
+ import { AssistantStreamSink } from './chunk.js';
2
+ /** Mark a tool call's panel done with the result the host computed. */
3
+ export declare function applyToolOutput(sink: AssistantStreamSink, toolCallId: string, output: Record<string, unknown>): void;
4
+ /** Mark a tool call's panel failed. */
5
+ export declare function applyToolFailure(sink: AssistantStreamSink, toolCallId: string, message: string): void;
6
+ /**
7
+ * A sink wrapper that swallows text instead of appending it, and hands the
8
+ * buffered text back at the end.
9
+ *
10
+ * Needed for STRUCTURED OUTPUTS: when `response_format` is a JSON schema the
11
+ * assistant's whole message is raw JSON, so streaming it into `<kai-thread>`
12
+ * shows the user a wall of braces. Buffer, parse, then `appendText` the human
13
+ * part, which behaves as a SET because nothing text-shaped ever reached the
14
+ * message (the kit has no replace-the-text operation; `appendTextPart` only ever
15
+ * extends or opens a text part).
16
+ *
17
+ * Reasoning, tools and sources pass straight through. Only text is held back.
18
+ */
19
+ export declare function bufferText(sink: AssistantStreamSink): AssistantStreamSink & {
20
+ buffered(): string;
21
+ };
@@ -0,0 +1,33 @@
1
+ export type ByteSource = AsyncIterable<Uint8Array | string> | ReadableStream<Uint8Array>;
2
+ /** Adapt a WHATWG ReadableStream to an async iterable. Never rely on
3
+ * `for await (... of res.body)`: Safari still lacks async iteration on it.
4
+ *
5
+ * On EARLY EXIT the underlying stream is CANCELLED, not just unlocked.
6
+ * `releaseLock()` alone hands the reader back while the body stays open, which
7
+ * leaks the socket. The adapter stops reading mid-stream on a real and
8
+ * not-rare path (an in-band provider error after a 200), and every consumer
9
+ * `break`/`throw` inside `for await` lands here too, so this is where the
10
+ * connection has to be closed.
11
+ *
12
+ * What must NOT land here is normal completion. `drained` is only honest if
13
+ * every layer above reads to EOF rather than returning on a sentinel — see
14
+ * `sseJson` and `[DONE]`. */
15
+ export declare function readableToAsyncIterable(stream: ReadableStream<Uint8Array>): AsyncGenerator<Uint8Array>;
16
+ /** Yield the payload of each SSE `data:` frame. `[DONE]` is yielded as-is; the
17
+ * caller decides to stop. */
18
+ export declare function sseDataFrames(source: ByteSource): AsyncGenerator<string>;
19
+ /** Decode an SSE byte stream into JSON payloads, stopping at `[DONE]` and
20
+ * skipping frames that are not JSON. A provider that emits a stray non-JSON
21
+ * line should not take the turn down.
22
+ *
23
+ * `[DONE]` stops the YIELDING, not the READING. Returning at the sentinel
24
+ * unwinds the generator chain while the reader has not yet seen `done: true`,
25
+ * so `readableToAsyncIterable` treats normal completion as an early exit and
26
+ * CANCELS the body — and since every OpenAI-format stream ends in `[DONE]`,
27
+ * that aborts the response on the normal path, one `net::ERR_ABORTED` per
28
+ * turn. Reading on to EOF instead lets the producer's own close end the
29
+ * iteration, which is the only thing that makes `drained` mean what it says.
30
+ * In practice that costs exactly one more `read()`: a server that has sent
31
+ * `[DONE]` has finished the response body. Frames after the sentinel are
32
+ * dropped, so what a caller sees is unchanged. */
33
+ export declare function sseJson<T>(source: ByteSource): AsyncGenerator<T>;
package/dist/wire.d.ts CHANGED
@@ -1,53 +1,5 @@
1
- import { CardEnvelope, CardContext, CardEvent } from '../primitives/card-contract';
2
- export declare const CARD_WIRE_PROTOCOL: "kitn-card";
3
- export interface WireFrame<M extends WireMessage = WireMessage> {
4
- protocol: typeof CARD_WIRE_PROTOCOL;
5
- /** The NEGOTIATED contract version (set by the per-bridge packer). */
6
- version: string;
7
- /** Per-bridge instance nonce (host-minted, echoed on every up-frame). */
8
- nonce: string;
9
- message: M;
10
- }
11
- export type DownMessage = {
12
- dir: 'down';
13
- kind: 'hello';
14
- supportedVersions: string[];
15
- } | {
16
- dir: 'down';
17
- kind: 'render';
18
- envelope: CardEnvelope;
19
- } | {
20
- dir: 'down';
21
- kind: 'context';
22
- context: CardContext;
23
- } | {
24
- dir: 'down';
25
- kind: 'teardown';
26
- };
27
- export type UpMessage = {
28
- dir: 'up';
29
- kind: 'ready';
30
- acceptedVersion: string;
31
- capabilities?: {
32
- types?: string[];
33
- };
34
- } | {
35
- dir: 'up';
36
- kind: 'event';
37
- event: CardEvent;
38
- } | {
39
- dir: 'up';
40
- kind: 'focus-edge';
41
- edge: 'start' | 'end';
42
- } | {
43
- dir: 'up';
44
- kind: 'fault';
45
- code: WireFaultCode;
46
- message: string;
47
- };
48
- export type WireFaultCode = 'version-unsupported' | 'bad-frame' | 'render-failed' | 'origin-rejected';
49
- export type WireMessage = DownMessage | UpMessage;
50
- export declare function createPacker(version: string, nonce: string): <M extends WireMessage>(message: M) => WireFrame<M>;
51
- /** Structural + direction guard. Host calls with 'up', runtime with 'down'.
52
- * STRUCTURAL only — nonce/version equality + schema validation happen after. */
53
- export declare function isCardWireFrame(data: unknown, expectedDir: 'up' | 'down'): data is WireFrame;
1
+ // GENERATED by scripts/emit-subpath-dts.mjs do not edit.
2
+ // Sibling declarations for dist/wire.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 './wire/index.js';