@kitn.ai/ui 0.27.0 → 0.29.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 (612) hide show
  1. package/README.md +10 -2
  2. package/dist/{Icon-BnFKqqtY.js → Icon-DObhsRtm.js} +1 -1
  3. package/dist/{action-icons-CBskfBMz.js → action-icons-CcgNN2oT.js} +1 -1
  4. package/dist/agent-tooling/construct/public.d.ts +15 -0
  5. package/dist/agent-tooling/construct/schema.d.ts +111 -0
  6. package/dist/arrow-down-CjRU3JgV.js +1 -0
  7. package/dist/arrow-left-Bnpb1UEW.js +1 -0
  8. package/dist/{artifact-CvXEm1lS.js → artifact-Bwt7OgcR.js} +1 -1
  9. package/dist/{attachments-C43ZegEq.js → attachments-Qr4kg-2b.js} +1 -1
  10. package/dist/{audio-visualizer-B-79y1Tj.js → audio-visualizer-DToYdfSc.js} +1 -1
  11. package/dist/{badge-BpUbq8c0.js → badge-CdEu_jn2.js} +1 -1
  12. package/dist/{bell-sn17Ip9v.js → bell-DQAAOpDz.js} +1 -1
  13. package/dist/{button-BH6rN0U-.js → button-DkuOnGLy.js} +1 -1
  14. package/dist/{card-renderer-Cb1gQmth.js → card-renderer-Jx70m6_l.js} +1 -1
  15. package/dist/{card-routing-DifQgS7n.js → card-routing-0YidER_3.js} +1 -1
  16. package/dist/check-njkVdZu2.js +1 -0
  17. package/dist/{checkbox-Dc9Yov_B.js → checkbox-D7iRB3nL.js} +1 -1
  18. package/dist/{checkbox-group-B1kDLLYk.js → checkbox-group-B2_rpoPM.js} +1 -1
  19. package/dist/chevron-down-B72s6PXR.js +1 -0
  20. package/dist/chevron-right-BatuHzUm.js +1 -0
  21. package/dist/{choice-card-BT3c1S8g.js → choice-card-m0BYqqOK.js} +1 -1
  22. package/dist/circle-check-B62pODB3.js +1 -0
  23. package/dist/{circle-x-wobWkoSx.js → circle-x-BPG0iPst.js} +1 -1
  24. package/dist/circle-zx0ByzY9.js +1 -0
  25. package/dist/code-block-ClMLKb7C.js +1 -0
  26. package/dist/{collapsible-CPJbf6FM.js → collapsible-B4DlWicL.js} +1 -1
  27. package/dist/components/chat-thread.d.ts +89 -1
  28. package/dist/components/conversation-item.d.ts +16 -0
  29. package/dist/components/conversation-panel.d.ts +29 -0
  30. package/dist/components/home-panel.d.ts +34 -0
  31. package/dist/components/widget-tab-bar.d.ts +16 -0
  32. package/dist/{composer-CjngLzal.js → composer-sQ0HcvyG.js} +3 -3
  33. package/dist/{confirm-card-DCx_A4bU.js → confirm-card-rQWDQsnC.js} +1 -1
  34. package/dist/construct-cli.es.js +185 -17
  35. package/dist/construct.d.ts +5 -0
  36. package/dist/construct.js +327 -0
  37. package/dist/{context-BY8V-Nlp.js → context-0kg4ZX1J.js} +1 -1
  38. package/dist/controllable-CnGpMF6r.js +1 -0
  39. package/dist/conversation-item-BxwQLaFJ.js +1 -0
  40. package/dist/conversation-list-BCfGN1JU.js +1 -0
  41. package/dist/{copy-B6DO4PqB.js → copy-n9u9rqpi.js} +1 -1
  42. package/dist/core-C8fzo39E.js +1 -12
  43. package/dist/{create-tween-CnMHviKB.js → create-tween-C-q-JCM-.js} +1 -1
  44. package/dist/{create-tween-D1aiGZZh.js → create-tween-CRrJXxBd.js} +1 -1
  45. package/dist/{create-tween-BPzaefTp.js → create-tween-DZ3RRDHD.js} +1 -1
  46. package/dist/{create-tween-DUSQUKpr.js → create-tween-uPkArjIG.js} +1 -1
  47. package/dist/custom-elements.json +51 -2
  48. package/dist/{default-input-CucQEOqH.js → default-input-CaMrJkgH.js} +1 -1
  49. package/dist/define-By-uL588.js +1 -0
  50. package/dist/define.js +2 -2
  51. package/dist/define.server.js +2 -2
  52. package/dist/{disclosure-CbLtajUQ.js → disclosure-WUImBbDv.js} +1 -1
  53. package/dist/{dropdown-BwhViJFd.js → dropdown-wZVeJOMd.js} +1 -1
  54. package/dist/elements/agent-card.js +1 -1
  55. package/dist/elements/artifact.js +1 -1
  56. package/dist/elements/attachments.js +1 -1
  57. package/dist/elements/audio-visualizer.js +1 -1
  58. package/dist/elements/avatar.js +1 -1
  59. package/dist/elements/badge.js +1 -1
  60. package/dist/elements/button.js +1 -1
  61. package/dist/elements/card.js +1 -1
  62. package/dist/elements/cards.js +1 -1
  63. package/dist/elements/chain-of-thought.js +1 -1
  64. package/dist/elements/chat-scope-picker.js +1 -1
  65. package/dist/elements/chat-workspace.js +1 -1
  66. package/dist/elements/chat.js +1 -1
  67. package/dist/elements/checkbox-group.js +1 -1
  68. package/dist/elements/checkbox.js +1 -1
  69. package/dist/elements/checkpoint.js +1 -1
  70. package/dist/elements/choice.js +1 -1
  71. package/dist/elements/coachmark.js +1 -1
  72. package/dist/elements/code-block.js +1 -1
  73. package/dist/elements/command.js +1 -1
  74. package/dist/elements/compare.js +1 -1
  75. package/dist/elements/composer.js +1 -1
  76. package/dist/elements/confirm-card.js +1 -1
  77. package/dist/elements/context-meter.js +1 -1
  78. package/dist/elements/conversation-item.js +1 -1
  79. package/dist/elements/conversation-list.js +1 -1
  80. package/dist/elements/dialog.js +1 -1
  81. package/dist/elements/dock.js +3 -3
  82. package/dist/elements/dropdown.js +1 -1
  83. package/dist/elements/editable-label.js +1 -1
  84. package/dist/elements/embed.js +1 -1
  85. package/dist/elements/empty.js +1 -1
  86. package/dist/elements/feedback-bar.js +1 -1
  87. package/dist/elements/file-tree.js +1 -1
  88. package/dist/elements/file-upload.js +1 -1
  89. package/dist/elements/form.js +1 -1
  90. package/dist/elements/hover-card.js +1 -1
  91. package/dist/elements/icon.js +1 -1
  92. package/dist/elements/image.js +1 -1
  93. package/dist/elements/input.js +1 -1
  94. package/dist/elements/kbd.js +1 -1
  95. package/dist/elements/link-preview.js +1 -1
  96. package/dist/elements/loader.js +1 -1
  97. package/dist/elements/markdown.js +1 -1
  98. package/dist/elements/menu.js +1 -1
  99. package/dist/elements/message-skills.js +1 -1
  100. package/dist/elements/message.js +1 -1
  101. package/dist/elements/model-switcher.js +1 -1
  102. package/dist/elements/nav.js +1 -1
  103. package/dist/elements/notice.js +1 -1
  104. package/dist/elements/pane-grid.js +1 -1
  105. package/dist/elements/pane-group.js +1 -1
  106. package/dist/elements/pane.js +1 -1
  107. package/dist/elements/popover.js +1 -1
  108. package/dist/elements/progress-bar.js +1 -1
  109. package/dist/elements/prompt-dock.js +1 -1
  110. package/dist/elements/prompt-input.js +1 -1
  111. package/dist/elements/prompt-suggestions.js +1 -1
  112. package/dist/elements/radio-group.js +1 -1
  113. package/dist/elements/reasoning.js +1 -1
  114. package/dist/elements/remote.js +1 -1
  115. package/dist/elements/resizable.js +1 -1
  116. package/dist/elements/response-stream.js +1 -1
  117. package/dist/elements/screen.js +1 -1
  118. package/dist/elements/scroll-area.js +1 -1
  119. package/dist/elements/scroll-button.js +1 -1
  120. package/dist/elements/search.js +1 -1
  121. package/dist/elements/segmented.js +1 -1
  122. package/dist/elements/select.js +1 -1
  123. package/dist/elements/separator.js +1 -1
  124. package/dist/elements/setting-item.js +1 -1
  125. package/dist/elements/settings-group.js +1 -1
  126. package/dist/elements/skeleton.js +1 -1
  127. package/dist/elements/slider.js +1 -1
  128. package/dist/elements/source.js +1 -1
  129. package/dist/elements/status.js +1 -1
  130. package/dist/elements/switch.js +1 -1
  131. package/dist/elements/tabs.js +1 -1
  132. package/dist/elements/tasks.js +1 -1
  133. package/dist/elements/text-shimmer.js +1 -1
  134. package/dist/elements/thinking-bar.js +1 -1
  135. package/dist/elements/thread.js +1 -1
  136. package/dist/elements/toast.js +1 -1
  137. package/dist/elements/tool.js +1 -1
  138. package/dist/elements/tooltip.js +1 -1
  139. package/dist/elements/voice-input.js +1 -1
  140. package/dist/elements/voice-output.js +1 -1
  141. package/dist/elements.d.ts +20 -4
  142. package/dist/{ellipsis-DFr4Vqr3.js → ellipsis-CbOpJnU3.js} +1 -1
  143. package/dist/{embed-5s_vU4J0.js → embed-CrfjkbUG.js} +1 -1
  144. package/dist/engine-javascript-C1x7zo1_.js +1 -141
  145. package/dist/{external-link-u9d85ORQ.js → external-link-ByXAwBBQ.js} +1 -1
  146. package/dist/{file-text-CX7_x42o.js → file-text-DMib2qwt.js} +1 -1
  147. package/dist/{file-tree-D3kBjXI5.js → file-tree-CJqM2aP7.js} +1 -1
  148. package/dist/{folder-V-YdIL8f.js → folder-_BAb929C.js} +1 -1
  149. package/dist/{form-BRNUMCN2.js → form-DSZgZQZk.js} +1 -1
  150. package/dist/{hover-card-DaeiYrTA.js → hover-card-BQbul9eq.js} +1 -1
  151. package/dist/{icon-BpixdZNq.js → icon-CdcfRhYI.js} +1 -1
  152. package/dist/index.d.ts +3 -1
  153. package/dist/index.js +2842 -2703
  154. package/dist/index.server.js +2820 -2681
  155. package/dist/{info-8mFsIjS3.js → info-DsFjGuI_.js} +1 -1
  156. package/dist/{input-d1Yuu-hz.js → input-DKbmkMos.js} +1 -1
  157. package/dist/kai.es.js +1 -1
  158. package/dist/{kbd-961zMPFB.js → kbd-PvdGhX4s.js} +1 -1
  159. package/dist/{link-preview-DIIbV2Sd.js → link-preview-DbM1866N.js} +1 -1
  160. package/dist/{link-DlZZBGaR.js → link-zF8PzWfF.js} +1 -1
  161. package/dist/{loader-YQszHFaW.js → loader-BM4CEz4G.js} +1 -1
  162. package/dist/{markdown-CVk1MPsj.js → markdown-LMvmAyBk.js} +7 -7
  163. package/dist/mcp.es.js +79 -5
  164. package/dist/{message-CwKVEdZg.js → message-BSsgvHvf.js} +1 -1
  165. package/dist/{message-DS8lzHc1.js → message-BYZECyek.js} +1 -1
  166. package/dist/message-circle-DruwObfX.js +1 -0
  167. package/dist/message-square-BG6q6mlm.js +1 -0
  168. package/dist/{minimize-2-UEZmP2QT.js → minimize-2-BQRoBV1V.js} +1 -1
  169. package/dist/{model-switcher-Kk1jEQ5t.js → model-switcher-CMpCOYcB.js} +1 -1
  170. package/dist/{overlay-C1od6LOz.js → overlay-Cb-MkyDa.js} +1 -1
  171. package/dist/{panel-right-ryET0yyn.js → panel-right-i8warFxT.js} +1 -1
  172. package/dist/{paperclip-BDNoZFJP.js → paperclip-ByY3UVO6.js} +1 -1
  173. package/dist/play-BvKKq3fX.js +1 -0
  174. package/dist/primitives/conversation-store.d.ts +54 -0
  175. package/dist/{progress-bar-BvYX0aoy.js → progress-bar-jVAHvMUf.js} +1 -1
  176. package/dist/{prompt-suggestion-BRFu2lcu.js → prompt-suggestion-CD-qtNgC.js} +1 -1
  177. package/dist/{radio-DcL23cNJ.js → radio-BsoBMhkF.js} +1 -1
  178. package/dist/react/index.d.ts +393 -0
  179. package/dist/react.js +20 -20
  180. package/dist/{reasoning-Cackq4Rh.js → reasoning-4kBPtlTx.js} +1 -1
  181. package/dist/register-impl-B1hLkrI8.js +424 -0
  182. package/dist/{resizable-Cp9HUYih.js → resizable-uPmY9VY-.js} +1 -1
  183. package/dist/{rotate-ccw-0DLRDHH5.js → rotate-ccw-B2xn93py.js} +1 -1
  184. package/dist/{rotate-cw-DOB9IGcU.js → rotate-cw-CMVLoCyH.js} +1 -1
  185. package/dist/{scroll-area-emVmWP4K.js → scroll-area-BqLUo8ZZ.js} +1 -1
  186. package/dist/{scroll-button-CeP_gv1x.js → scroll-button-DslXiJyL.js} +1 -1
  187. package/dist/{select-CWmu00tS.js → select-2cLRtPGT.js} +1 -1
  188. package/dist/{separator-CE6vly6z.js → separator-BWQtNJcM.js} +1 -1
  189. package/dist/{settings-CE-78SvZ.js → settings-BBR63jLg.js} +1 -1
  190. package/dist/{settings-group-ZFWNxFQR.js → settings-group-B2ciy-Iw.js} +1 -1
  191. package/dist/{skeleton-BebdP4mf.js → skeleton-CkHI-HgC.js} +1 -1
  192. package/dist/{slider-BAKRYUlz.js → slider-DDR9U-i0.js} +1 -1
  193. package/dist/{solid-BE5ui6sy.js → solid-BzCFdL25.js} +7720 -7058
  194. package/dist/{solid-DFhsce3O.js → solid-DruVOXnf.js} +5864 -5283
  195. package/dist/solid.d.ts +6 -2
  196. package/dist/solid.js +217 -210
  197. package/dist/solid.server.js +217 -210
  198. package/dist/{source-B0FlguSx.js → source-GEnFF528.js} +1 -1
  199. package/dist/{star-CBMZvLuN.js → star-CilHq8GP.js} +1 -1
  200. package/dist/store-Ciyk6eZG.js +1 -0
  201. package/dist/{switch-CViARZCy.js → switch-KkeQIbuH.js} +1 -1
  202. package/dist/{tasks-card-MjCcOhR_.js → tasks-card-BrN4bggJ.js} +1 -1
  203. package/dist/{text-shimmer-DKlwRF2G.js → text-shimmer-Dcj1MHuq.js} +1 -1
  204. package/dist/{textarea-3ay2Me2-.js → textarea-Dpvbngbg.js} +1 -1
  205. package/dist/theme.tokens.css +28 -0
  206. package/dist/{thumbs-up-DQcu2HMO.js → thumbs-up-CsT9Wzb9.js} +1 -1
  207. package/dist/{toast-store-C6yKOhbk.js → toast-store-tgK6MuMv.js} +1 -1
  208. package/dist/{tool-BCYNlfKy.js → tool-DzUjIBT8.js} +1 -1
  209. package/dist/{tooltip-05zI4hjs.js → tooltip-Bkkg_4t0.js} +1 -1
  210. package/dist/{trash-2-BR1RxGky.js → trash-2-jBKxjGGQ.js} +1 -1
  211. package/dist/{triangle-alert-DHohDOCy.js → triangle-alert-DlQ68ppf.js} +1 -1
  212. package/dist/types.d.ts +48 -3
  213. package/dist/ui/dock.d.ts +29 -0
  214. package/dist/{upload-BbGW6A_u.js → upload-TcAHXv9W.js} +1 -1
  215. package/dist/{url-scheme-policy-DHpoTJwB.js → url-scheme-policy-DR5DgvkM.js} +1 -1
  216. package/dist/{use-card-resolution-CJW4grFa.js → use-card-resolution-DaZqAdWf.js} +1 -1
  217. package/dist/{variant-aurora-xiMPty8f.js → variant-aurora-BhLuYxJR.js} +1 -1
  218. package/dist/{variant-aurora-BUOVgPOB.js → variant-aurora-CNmfHhcx.js} +2 -2
  219. package/dist/{variant-aurora-CUsUJvFI.js → variant-aurora-D6GsdTPA.js} +2 -2
  220. package/dist/{variant-aurora-CW2i4bfr.js → variant-aurora-DbW_OWL2.js} +1 -1
  221. package/dist/{variant-custom-D91HjAKz.js → variant-custom-BRvaNHSi.js} +1 -1
  222. package/dist/{variant-custom-BQtOnmeO.js → variant-custom-BvYHR62b.js} +1 -1
  223. package/dist/{variant-custom-CAnzzppW.js → variant-custom-DMTrEO5w.js} +2 -2
  224. package/dist/{variant-custom-CAm9L-E5.js → variant-custom-DV2x254s.js} +2 -2
  225. package/dist/{variant-wave-Ca1Ls4_y.js → variant-wave-BNMGrDfj.js} +2 -2
  226. package/dist/{variant-wave-uY5crU_K.js → variant-wave-BpDd8t3Z.js} +1 -1
  227. package/dist/{variant-wave-CxX39DKd.js → variant-wave-CyBueXj9.js} +2 -2
  228. package/dist/{variant-wave-DYyzIIZv.js → variant-wave-sp-qwsdI.js} +1 -1
  229. package/dist/x-Z5UntkIJ.js +1 -0
  230. package/frameworks/react/index.tsx +14 -4
  231. package/llms-full.txt +7 -2
  232. package/package.json +16 -16
  233. package/src/elements/element-meta.json +49 -6
  234. package/theme.css +28 -0
  235. package/bin/route.test.js +0 -58
  236. package/dist/arrow-down-Br0qtpsz.js +0 -1
  237. package/dist/arrow-left-Dj7xgE12.js +0 -1
  238. package/dist/check-DPeeMUYx.js +0 -1
  239. package/dist/chevron-down-CHSWk7ZT.js +0 -1
  240. package/dist/chevron-right-B7l_fMgx.js +0 -1
  241. package/dist/circle-Bb0yOpqM.js +0 -1
  242. package/dist/circle-check-BGZpCiz7.js +0 -1
  243. package/dist/code-block-CUQ5mtv0.js +0 -1
  244. package/dist/controllable-D43BKmtX.js +0 -1
  245. package/dist/conversation-list-D4lLU_yS.js +0 -1
  246. package/dist/define-CGGX-7Vg.js +0 -1
  247. package/dist/message-circle-Xf8Q-vZp.js +0 -1
  248. package/dist/message-square-Cxnwgkns.js +0 -1
  249. package/dist/play-OFIvYXUQ.js +0 -1
  250. package/dist/register-impl-C7rENvPK.js +0 -424
  251. package/dist/store-7eoadydQ.js +0 -1
  252. package/dist/x-C5m1JFgi.js +0 -1
  253. package/src/agent-tooling/archetypes.ts +0 -205
  254. package/src/agent-tooling/catalog/README.md +0 -676
  255. package/src/agent-tooling/catalog/catalog-types.ts +0 -231
  256. package/src/agent-tooling/catalog/fabrications.ts +0 -96
  257. package/src/agent-tooling/catalog/invariants.ts +0 -284
  258. package/src/agent-tooling/catalog/labs-titles.ts +0 -114
  259. package/src/agent-tooling/catalog/scenarios.ts +0 -87
  260. package/src/agent-tooling/catalog/surfaces.ts +0 -347
  261. package/src/agent-tooling/construct/cli-entry.ts +0 -8
  262. package/src/agent-tooling/construct/cli.ts +0 -131
  263. package/src/agent-tooling/construct/codegen.ts +0 -1353
  264. package/src/agent-tooling/construct/construct.v1.schema.json +0 -250
  265. package/src/agent-tooling/construct/dev.ts +0 -148
  266. package/src/agent-tooling/construct/fixtures/demo-widget.construct.json +0 -7
  267. package/src/agent-tooling/construct/fixtures/ops-console.construct.json +0 -44
  268. package/src/agent-tooling/construct/fixtures/owner-widget.construct.json +0 -23
  269. package/src/agent-tooling/construct/schema.ts +0 -371
  270. package/src/agent-tooling/integrations/anthropic.ts +0 -442
  271. package/src/agent-tooling/integrations/cloudflare.ts +0 -218
  272. package/src/agent-tooling/integrations/langgraph.ts +0 -133
  273. package/src/agent-tooling/integrations/mastra.ts +0 -182
  274. package/src/agent-tooling/integrations/mock.ts +0 -148
  275. package/src/agent-tooling/integrations/ollama.ts +0 -97
  276. package/src/agent-tooling/integrations/openai.ts +0 -95
  277. package/src/agent-tooling/integrations/openrouter.ts +0 -82
  278. package/src/agent-tooling/integrations/pi.ts +0 -176
  279. package/src/agent-tooling/integrations/pydantic-ai.ts +0 -108
  280. package/src/agent-tooling/integrations/vercel-ai-sdk.ts +0 -398
  281. package/src/agent-tooling/mcp/css-raw.d.ts +0 -12
  282. package/src/agent-tooling/mcp/manifest.ts +0 -422
  283. package/src/agent-tooling/mcp/server.ts +0 -116
  284. package/src/agent-tooling/mcp/stdio.ts +0 -18
  285. package/src/agent-tooling/mcp/tools/construct.ts +0 -130
  286. package/src/agent-tooling/mcp/tools/debug.ts +0 -621
  287. package/src/agent-tooling/mcp/tools/reference.ts +0 -980
  288. package/src/agent-tooling/mcp/tools/scaffold.ts +0 -6708
  289. package/src/agent-tooling/mcp/tools/theme.ts +0 -456
  290. package/src/agent-tooling/mcp/tools/types.ts +0 -14
  291. package/src/agent-tooling/mcp/validate-args.ts +0 -141
  292. package/src/agent-tooling/recipes/composed-thread.ts +0 -714
  293. package/src/agent-tooling/recipes/index.ts +0 -22
  294. package/src/agent-tooling/recipes/types.ts +0 -32
  295. package/src/agent-tooling/registry.ts +0 -132
  296. package/src/agent-tooling/route-emit.ts +0 -305
  297. package/src/agent-tooling/types.ts +0 -390
  298. package/src/components/artifact-card.tsx +0 -120
  299. package/src/components/artifact.tsx +0 -914
  300. package/src/components/attachment-types.ts +0 -66
  301. package/src/components/attachments.tsx +0 -536
  302. package/src/components/audio-visualizer/audio-visualizer.voice-fixture.ts +0 -257
  303. package/src/components/audio-visualizer/aurora.glsl.ts +0 -330
  304. package/src/components/audio-visualizer/fit-scale.ts +0 -112
  305. package/src/components/audio-visualizer/index.tsx +0 -528
  306. package/src/components/audio-visualizer/labs/lab-choreography.ts +0 -187
  307. package/src/components/audio-visualizer/labs/lab-shaders.ts +0 -363
  308. package/src/components/audio-visualizer/labs/lab-visualizer.tsx +0 -102
  309. package/src/components/audio-visualizer/shader-canvas.tsx +0 -876
  310. package/src/components/audio-visualizer/sizes.ts +0 -54
  311. package/src/components/audio-visualizer/variant-aurora.tsx +0 -305
  312. package/src/components/audio-visualizer/variant-bar.tsx +0 -175
  313. package/src/components/audio-visualizer/variant-custom.tsx +0 -344
  314. package/src/components/audio-visualizer/variant-grid.tsx +0 -175
  315. package/src/components/audio-visualizer/variant-radial.tsx +0 -163
  316. package/src/components/audio-visualizer/variant-wave.tsx +0 -130
  317. package/src/components/audio-visualizer/wave.glsl.ts +0 -130
  318. package/src/components/card-fallback.tsx +0 -60
  319. package/src/components/card-renderer.tsx +0 -220
  320. package/src/components/card.tsx +0 -212
  321. package/src/components/chain-of-thought.tsx +0 -348
  322. package/src/components/chat-container.tsx +0 -89
  323. package/src/components/chat-scope-picker.tsx +0 -57
  324. package/src/components/chat-thread.tsx +0 -518
  325. package/src/components/checkpoint.tsx +0 -88
  326. package/src/components/choice-card.tsx +0 -743
  327. package/src/components/coachmark.tsx +0 -249
  328. package/src/components/code-block.tsx +0 -181
  329. package/src/components/composer-dom.ts +0 -159
  330. package/src/components/composer-highlight.ts +0 -242
  331. package/src/components/composer-history.ts +0 -82
  332. package/src/components/composer.tsx +0 -1075
  333. package/src/components/confirm-card.tsx +0 -402
  334. package/src/components/context.tsx +0 -377
  335. package/src/components/conversation-item.tsx +0 -218
  336. package/src/components/conversation-list.tsx +0 -429
  337. package/src/components/dismissed-stub.tsx +0 -80
  338. package/src/components/embed.tsx +0 -200
  339. package/src/components/empty.tsx +0 -177
  340. package/src/components/feedback-bar.tsx +0 -166
  341. package/src/components/file-tree.tsx +0 -530
  342. package/src/components/file-upload.tsx +0 -167
  343. package/src/components/form-widgets.tsx +0 -525
  344. package/src/components/form.tsx +0 -1296
  345. package/src/components/image.tsx +0 -65
  346. package/src/components/link-preview.tsx +0 -195
  347. package/src/components/loader.tsx +0 -367
  348. package/src/components/markdown.tsx +0 -162
  349. package/src/components/message-skills.tsx +0 -40
  350. package/src/components/message.tsx +0 -765
  351. package/src/components/model-switcher.tsx +0 -132
  352. package/src/components/prompt-input.tsx +0 -188
  353. package/src/components/prompt-suggestion.tsx +0 -150
  354. package/src/components/reasoning.tsx +0 -293
  355. package/src/components/response-compare-types.ts +0 -152
  356. package/src/components/response-compare.tsx +0 -455
  357. package/src/components/response-stream.tsx +0 -109
  358. package/src/components/screen.tsx +0 -181
  359. package/src/components/scroll-button.tsx +0 -93
  360. package/src/components/source.tsx +0 -192
  361. package/src/components/tasks-card.tsx +0 -801
  362. package/src/components/text-shimmer.tsx +0 -37
  363. package/src/components/thinking-bar.tsx +0 -50
  364. package/src/components/thread.tsx +0 -228
  365. package/src/components/toast.tsx +0 -503
  366. package/src/components/tool-classify.ts +0 -26
  367. package/src/components/tool-types.ts +0 -49
  368. package/src/components/tool.tsx +0 -190
  369. package/src/components/use-card-resolution.ts +0 -44
  370. package/src/components/voice-input.tsx +0 -222
  371. package/src/components/voice-output.tsx +0 -242
  372. package/src/components/workspace-shell.tsx +0 -285
  373. package/src/diagnostics/hook.ts +0 -352
  374. package/src/diagnostics/index.ts +0 -82
  375. package/src/diagnostics/report-request.ts +0 -296
  376. package/src/elements/agent-card.tsx +0 -67
  377. package/src/elements/artifact.tsx +0 -194
  378. package/src/elements/attachments.tsx +0 -140
  379. package/src/elements/audio-visualizer.tsx +0 -227
  380. package/src/elements/autoloader.ts +0 -89
  381. package/src/elements/avatar.tsx +0 -33
  382. package/src/elements/badge.tsx +0 -32
  383. package/src/elements/button.tsx +0 -149
  384. package/src/elements/card.tsx +0 -133
  385. package/src/elements/cards.tsx +0 -266
  386. package/src/elements/chain-of-thought.tsx +0 -141
  387. package/src/elements/chat-scope-picker.tsx +0 -65
  388. package/src/elements/chat-types.ts +0 -102
  389. package/src/elements/chat-workspace.tsx +0 -188
  390. package/src/elements/chat.tsx +0 -212
  391. package/src/elements/checkbox-group.tsx +0 -164
  392. package/src/elements/checkbox.tsx +0 -134
  393. package/src/elements/checkpoint.tsx +0 -47
  394. package/src/elements/choice.tsx +0 -100
  395. package/src/elements/coachmark.tsx +0 -90
  396. package/src/elements/code-block.tsx +0 -60
  397. package/src/elements/command.tsx +0 -197
  398. package/src/elements/compare.tsx +0 -111
  399. package/src/elements/compiled.css +0 -2
  400. package/src/elements/composer.tsx +0 -162
  401. package/src/elements/confirm-card.tsx +0 -76
  402. package/src/elements/context-meter.tsx +0 -107
  403. package/src/elements/conversation-item.tsx +0 -120
  404. package/src/elements/conversation-list.tsx +0 -203
  405. package/src/elements/css.ts +0 -5
  406. package/src/elements/default-input.tsx +0 -392
  407. package/src/elements/define-entry.ts +0 -12
  408. package/src/elements/define.tsx +0 -563
  409. package/src/elements/diagnostic-events.ts +0 -114
  410. package/src/elements/dialog.tsx +0 -145
  411. package/src/elements/disclosure.ts +0 -95
  412. package/src/elements/dock.tsx +0 -215
  413. package/src/elements/dropdown.tsx +0 -123
  414. package/src/elements/editable-label.tsx +0 -140
  415. package/src/elements/element-data-types.ts +0 -152
  416. package/src/elements/element-diagnostics.ts +0 -392
  417. package/src/elements/element-manifest.json +0 -354
  418. package/src/elements/element-nonscalar.json +0 -185
  419. package/src/elements/element-types.d.ts +0 -4337
  420. package/src/elements/embed.tsx +0 -35
  421. package/src/elements/empty.tsx +0 -29
  422. package/src/elements/feedback-bar.tsx +0 -66
  423. package/src/elements/file-tree.tsx +0 -62
  424. package/src/elements/file-upload.tsx +0 -44
  425. package/src/elements/form.tsx +0 -94
  426. package/src/elements/hover-card.tsx +0 -80
  427. package/src/elements/icon.tsx +0 -41
  428. package/src/elements/image.tsx +0 -32
  429. package/src/elements/input.tsx +0 -492
  430. package/src/elements/kbd.tsx +0 -45
  431. package/src/elements/link-preview.tsx +0 -34
  432. package/src/elements/loader.tsx +0 -25
  433. package/src/elements/markdown.tsx +0 -38
  434. package/src/elements/menu.tsx +0 -241
  435. package/src/elements/message-skills.tsx +0 -83
  436. package/src/elements/message.tsx +0 -361
  437. package/src/elements/model-switcher.tsx +0 -121
  438. package/src/elements/nav.tsx +0 -87
  439. package/src/elements/notice.tsx +0 -53
  440. package/src/elements/pane-grid.tsx +0 -111
  441. package/src/elements/pane-group.tsx +0 -119
  442. package/src/elements/pane.tsx +0 -129
  443. package/src/elements/popover.tsx +0 -81
  444. package/src/elements/progress-bar.tsx +0 -39
  445. package/src/elements/prompt-dock.tsx +0 -82
  446. package/src/elements/prompt-input.tsx +0 -240
  447. package/src/elements/prompt-suggestions.tsx +0 -113
  448. package/src/elements/radio-group.tsx +0 -129
  449. package/src/elements/reasoning.tsx +0 -71
  450. package/src/elements/register-impl.ts +0 -148
  451. package/src/elements/register.ts +0 -76
  452. package/src/elements/remote.tsx +0 -225
  453. package/src/elements/resizable.globals.d.ts +0 -36
  454. package/src/elements/resizable.tsx +0 -704
  455. package/src/elements/response-stream.tsx +0 -40
  456. package/src/elements/screen.tsx +0 -90
  457. package/src/elements/scroll-area.tsx +0 -33
  458. package/src/elements/scroll-button.tsx +0 -179
  459. package/src/elements/search.tsx +0 -185
  460. package/src/elements/segmented.tsx +0 -129
  461. package/src/elements/select.tsx +0 -165
  462. package/src/elements/separator.tsx +0 -36
  463. package/src/elements/setting-item.tsx +0 -50
  464. package/src/elements/settings-group.tsx +0 -37
  465. package/src/elements/skeleton.tsx +0 -45
  466. package/src/elements/slider.tsx +0 -171
  467. package/src/elements/slot-text.ts +0 -73
  468. package/src/elements/slots.ts +0 -787
  469. package/src/elements/source.tsx +0 -126
  470. package/src/elements/status.tsx +0 -42
  471. package/src/elements/styles.css +0 -328
  472. package/src/elements/switch.tsx +0 -118
  473. package/src/elements/tabs.tsx +0 -95
  474. package/src/elements/tasks.tsx +0 -103
  475. package/src/elements/text-shimmer.tsx +0 -28
  476. package/src/elements/thinking-bar.tsx +0 -43
  477. package/src/elements/thread.tsx +0 -139
  478. package/src/elements/toast.tsx +0 -106
  479. package/src/elements/tool.tsx +0 -78
  480. package/src/elements/tooltip.tsx +0 -85
  481. package/src/elements/validate-messages.ts +0 -76
  482. package/src/elements/voice-input.tsx +0 -100
  483. package/src/elements/voice-output.tsx +0 -82
  484. package/src/index.ts +0 -428
  485. package/src/primitives/audio-bands.ts +0 -174
  486. package/src/primitives/card-component-types.ts +0 -63
  487. package/src/primitives/card-contract.ts +0 -80
  488. package/src/primitives/card-data-types.ts +0 -361
  489. package/src/primitives/card-host.tsx +0 -37
  490. package/src/primitives/card-recovery.ts +0 -160
  491. package/src/primitives/card-registry.tsx +0 -78
  492. package/src/primitives/card-resolution.ts +0 -36
  493. package/src/primitives/card-routing.ts +0 -85
  494. package/src/primitives/card-schemas/artifact.schema.json +0 -92
  495. package/src/primitives/card-schemas/card-envelope.schema.json +0 -14
  496. package/src/primitives/card-schemas/card-event.schema.json +0 -12
  497. package/src/primitives/card-schemas/choice.schema.json +0 -75
  498. package/src/primitives/card-schemas/confirm.schema.json +0 -65
  499. package/src/primitives/card-schemas/embed.schema.json +0 -63
  500. package/src/primitives/card-schemas/form.result.schema.json +0 -7
  501. package/src/primitives/card-schemas/form.schema.json +0 -53
  502. package/src/primitives/card-schemas/link.schema.json +0 -54
  503. package/src/primitives/card-schemas/tasks.result.schema.json +0 -16
  504. package/src/primitives/card-schemas/tasks.schema.json +0 -83
  505. package/src/primitives/card-tags.ts +0 -61
  506. package/src/primitives/card-validate-cards.ts +0 -255
  507. package/src/primitives/card-validate-schemas.ts +0 -58
  508. package/src/primitives/card-validate.ts +0 -131
  509. package/src/primitives/chat-config.tsx +0 -103
  510. package/src/primitives/composer-model.ts +0 -49
  511. package/src/primitives/composer-triggers.ts +0 -35
  512. package/src/primitives/controllable.ts +0 -21
  513. package/src/primitives/create-kai-chat.ts +0 -66
  514. package/src/primitives/create-tween.ts +0 -266
  515. package/src/primitives/embed-providers.ts +0 -254
  516. package/src/primitives/field-mask.ts +0 -256
  517. package/src/primitives/field-semantics.ts +0 -115
  518. package/src/primitives/highlighter.ts +0 -157
  519. package/src/primitives/input-mask.ts +0 -853
  520. package/src/primitives/link-preview.ts +0 -87
  521. package/src/primitives/message-feedback.ts +0 -124
  522. package/src/primitives/pdf-preview.ts +0 -121
  523. package/src/primitives/toast-store.ts +0 -338
  524. package/src/primitives/url-scheme-policy.ts +0 -70
  525. package/src/primitives/use-audio-analysis.ts +0 -340
  526. package/src/primitives/use-auto-resize.ts +0 -31
  527. package/src/primitives/use-resize-observer.ts +0 -45
  528. package/src/primitives/use-sequencer.ts +0 -72
  529. package/src/primitives/use-speech-recognition.ts +0 -146
  530. package/src/primitives/use-stick-to-bottom.ts +0 -75
  531. package/src/primitives/use-text-stream.ts +0 -143
  532. package/src/primitives/use-voice-recorder.ts +0 -62
  533. package/src/primitives/visualizer-sequences.ts +0 -350
  534. package/src/remote/host-embed.ts +0 -345
  535. package/src/remote/index.ts +0 -2
  536. package/src/remote/origin.ts +0 -30
  537. package/src/remote/provider-runtime.ts +0 -262
  538. package/src/remote/provider.ts +0 -2
  539. package/src/remote/validate.ts +0 -22
  540. package/src/remote/version.ts +0 -12
  541. package/src/remote/wire.ts +0 -48
  542. package/src/schemas/from-tool-call.ts +0 -151
  543. package/src/schemas/index.ts +0 -341
  544. package/src/schemas/provider-subsets.ts +0 -538
  545. package/src/schemas/registry.ts +0 -355
  546. package/src/schemas/tool-defs.ts +0 -793
  547. package/src/solid.ts +0 -165
  548. package/src/state/index.ts +0 -44
  549. package/src/state/messages.ts +0 -53
  550. package/src/state/mock.ts +0 -297
  551. package/src/state/parts.ts +0 -295
  552. package/src/state/persistence.ts +0 -180
  553. package/src/state/stream.ts +0 -246
  554. package/src/state/suggestions.ts +0 -9
  555. package/src/state/threads.ts +0 -142
  556. package/src/test-utils/fake-clock.ts +0 -88
  557. package/src/types.ts +0 -53
  558. package/src/ui/action-icons.ts +0 -53
  559. package/src/ui/agent-card.tsx +0 -218
  560. package/src/ui/avatar.tsx +0 -23
  561. package/src/ui/badge.tsx +0 -21
  562. package/src/ui/button.tsx +0 -49
  563. package/src/ui/card.tsx +0 -245
  564. package/src/ui/checkbox-group.tsx +0 -153
  565. package/src/ui/checkbox.tsx +0 -63
  566. package/src/ui/collapsible.tsx +0 -163
  567. package/src/ui/command.tsx +0 -103
  568. package/src/ui/dialog.tsx +0 -223
  569. package/src/ui/dock.tsx +0 -584
  570. package/src/ui/dropdown.tsx +0 -636
  571. package/src/ui/editable-label.tsx +0 -112
  572. package/src/ui/hover-card.tsx +0 -345
  573. package/src/ui/icon.tsx +0 -167
  574. package/src/ui/input.tsx +0 -391
  575. package/src/ui/kbd.tsx +0 -118
  576. package/src/ui/nav.tsx +0 -282
  577. package/src/ui/notice.tsx +0 -84
  578. package/src/ui/overlay.tsx +0 -277
  579. package/src/ui/pane-grid.tsx +0 -117
  580. package/src/ui/pane-group.tsx +0 -291
  581. package/src/ui/pane.tsx +0 -193
  582. package/src/ui/popover.tsx +0 -106
  583. package/src/ui/progress-bar.tsx +0 -83
  584. package/src/ui/prompt-dock.tsx +0 -145
  585. package/src/ui/radio.tsx +0 -150
  586. package/src/ui/resizable.tsx +0 -693
  587. package/src/ui/scroll-area.tsx +0 -26
  588. package/src/ui/segmented.tsx +0 -109
  589. package/src/ui/select.tsx +0 -168
  590. package/src/ui/separator.tsx +0 -10
  591. package/src/ui/settings-group.tsx +0 -67
  592. package/src/ui/skeleton.tsx +0 -73
  593. package/src/ui/slider.tsx +0 -178
  594. package/src/ui/status.tsx +0 -48
  595. package/src/ui/switch.tsx +0 -119
  596. package/src/ui/tabs.tsx +0 -168
  597. package/src/ui/textarea.tsx +0 -21
  598. package/src/ui/tooltip.tsx +0 -118
  599. package/src/utils/cn.ts +0 -30
  600. package/src/wire/chunk.ts +0 -248
  601. package/src/wire/consume.ts +0 -599
  602. package/src/wire/diagnostics.ts +0 -727
  603. package/src/wire/encode-probe.ts +0 -214
  604. package/src/wire/encode.ts +0 -947
  605. package/src/wire/files.ts +0 -342
  606. package/src/wire/formats/anthropic.ts +0 -274
  607. package/src/wire/formats/openai.ts +0 -228
  608. package/src/wire/index.ts +0 -95
  609. package/src/wire/media-types.ts +0 -344
  610. package/src/wire/read.ts +0 -396
  611. package/src/wire/sink-helpers.ts +0 -50
  612. package/src/wire/sse.ts +0 -153
@@ -1,599 +0,0 @@
1
- // The adapter core: read neutral chunks, drive a sink, and report the turn.
2
- //
3
- // PORTABILITY RULES: no React, no Solid, no DOM, no fetch, no SSE, and NO
4
- // PROVIDER SDK. The only kit values imported are the three part builders, which
5
- // are REUSED rather than reimplemented so that `ModelTurn.parts` is produced by
6
- // exactly the code that drove the sink.
7
- import type { MessagePart, MessageSource } from '../elements/chat-types';
8
- import { appendReasoningPart, appendTextPart, fingerprint, upsertToolPart } from '../state/parts';
9
- import {
10
- normalizeStopReason,
11
- type AssistantStreamSink,
12
- type ConsumeOptions,
13
- type ModelStreamChunk,
14
- type ModelToolCall,
15
- type ModelToolCallDelta,
16
- type ModelTurn,
17
- type ModelUsage,
18
- type StopReason,
19
- } from './chunk';
20
- import type { RawOrigin } from '../components/tool-types';
21
- import {
22
- emitWireDiagnostic,
23
- nextStreamId,
24
- wireCorrelation,
25
- wireDiagnosticsActive,
26
- withPayload,
27
- type WireCorrelation,
28
- } from './diagnostics';
29
-
30
- // ── Tool-call accumulator ────────────────────────────────────────────────────
31
-
32
- interface MutableCall {
33
- index: number;
34
- id: string | null;
35
- name: string;
36
- argumentsText: string;
37
- announced: boolean;
38
- /** Fingerprint of the last `input` written, so a re-parse of unchanged text
39
- * does not patch the part again. */
40
- lastInputFp: string | null;
41
- providerExecuted: boolean;
42
- output?: Record<string, unknown>;
43
- outputError?: string;
44
- }
45
-
46
- const snapshot = (c: MutableCall): ModelToolCall => ({
47
- index: c.index,
48
- id: c.id ?? `call_${c.index}`,
49
- name: c.name,
50
- argumentsText: c.argumentsText,
51
- });
52
-
53
- /**
54
- * The provider-shaped tool-call block, REASSEMBLED from the fragments, kept on
55
- * the part so an encoder can round-trip without re-deriving it.
56
- *
57
- * Tagged `custom.` on purpose: it is a reconstruction, not a payload the
58
- * provider handed over intact, so it must never be mistaken for one of the
59
- * verbatim blocks (Anthropic `thinking`) a provider refuses to accept rebuilt.
60
- */
61
- const rawOf = (c: MutableCall): RawOrigin => ({
62
- source: 'custom.wire.tool_call',
63
- payload: { id: c.id ?? `call_${c.index}`, name: c.name, arguments: c.argumentsText },
64
- });
65
-
66
- function clip(s: string, n: number): string {
67
- return s.length <= n ? s : `${s.slice(0, n)}...`;
68
- }
69
-
70
- /** Parse accumulated argument text into a JSON OBJECT, or undefined. A prefix of
71
- * a JSON object never parses, which is why `rawInput` exists. No tolerant
72
- * partial-JSON closer ships: guessing at a half-written object produces
73
- * confidently wrong tool inputs. */
74
- function parseArgumentObject(text: string): Record<string, unknown> | undefined {
75
- const trimmed = text.trim();
76
- if (trimmed === '') return undefined;
77
- try {
78
- const value: unknown = JSON.parse(trimmed);
79
- if (value === null || typeof value !== 'object' || Array.isArray(value)) return undefined;
80
- return value as Record<string, unknown>;
81
- } catch {
82
- return undefined;
83
- }
84
- }
85
-
86
- /**
87
- * Correlate tool-call fragments by `index` and drive the ToolPart lifecycle.
88
- * THE HARD PART: `id`, `name` and each slice of `arguments` arrive across
89
- * arbitrarily many chunks in provider-dependent order.
90
- *
91
- * A ToolPart is pushed (`input-streaming`) the first time a call has BOTH an id
92
- * and a non-empty name: announcing earlier would create a panel whose `type` is
93
- * the empty string. Everything before that is buffered and flushed at announce.
94
- */
95
- export function createToolCallAccumulator(sink: AssistantStreamSink, opts: ConsumeOptions = {}) {
96
- const calls = new Map<number, MutableCall>();
97
-
98
- /** Write the argument text that has arrived so far.
99
- *
100
- * `rawInput` is written on EVERY fragment, so a consumer watching the part
101
- * sees the arguments assemble character by character. `input` is written only
102
- * when the whole accumulated text parses to a JSON object. Honest caveat:
103
- * with plain `JSON.parse` a prefix never parses, so `input` in practice still
104
- * lands once, at the end. `rawInput` is what streams. */
105
- const writeArguments = (call: MutableCall) => {
106
- const id = call.id!;
107
- const text = call.argumentsText;
108
- const parsed = parseArgumentObject(text);
109
- if (parsed) {
110
- const fp = fingerprint(parsed);
111
- if (fp !== call.lastInputFp) {
112
- call.lastInputFp = fp;
113
- sink.upsertTool(id, { rawInput: text, input: parsed, state: 'input-available' });
114
- return;
115
- }
116
- }
117
- sink.upsertTool(id, { rawInput: text });
118
- };
119
-
120
- const announce = (call: MutableCall) => {
121
- if (call.announced) return;
122
- call.id ??= `call_${call.index}`;
123
- call.announced = true;
124
- sink.upsertTool(call.id, { type: call.name || 'unknown_tool', state: 'input-streaming' });
125
- // Fragments that arrived before the id did are flushed now.
126
- if (call.argumentsText) writeArguments(call);
127
- };
128
-
129
- const apply = (raw: ModelToolCallDelta) => {
130
- const index = typeof raw.index === 'number' ? raw.index : 0;
131
- let call = calls.get(index);
132
- if (!call) {
133
- call = {
134
- index,
135
- id: null,
136
- name: '',
137
- argumentsText: '',
138
- announced: false,
139
- lastInputFp: null,
140
- providerExecuted: false,
141
- };
142
- calls.set(index, call);
143
- }
144
- if (raw.id && !call.id) call.id = raw.id;
145
- if (raw.name) call.name += raw.name;
146
- if (call.id && call.name) announce(call);
147
-
148
- if (typeof raw.arguments === 'string' && raw.arguments !== '') {
149
- call.argumentsText += raw.arguments;
150
- if (call.announced) writeArguments(call);
151
- }
152
-
153
- if (raw.output !== undefined || raw.outputError !== undefined) {
154
- // A result the PROVIDER executed. Force the announce so the panel exists,
155
- // then complete it. `settle` must not touch it afterwards.
156
- announce(call);
157
- call.providerExecuted = true;
158
- if (raw.outputError !== undefined) {
159
- call.outputError = raw.outputError;
160
- sink.upsertTool(call.id!, { state: 'output-error', errorText: raw.outputError });
161
- } else {
162
- call.output = raw.output;
163
- sink.upsertTool(call.id!, { state: 'output-available', output: raw.output });
164
- }
165
- }
166
- };
167
-
168
- /** Settle every accumulated call once the stream ends. */
169
- const settle = (stopReason: StopReason | undefined, streamError?: string): ModelToolCall[] =>
170
- [...calls.values()]
171
- .sort((a, b) => a.index - b.index)
172
- .map((call) => {
173
- announce(call); // a call that only ever had arguments still gets a panel
174
- const id = call.id!;
175
- const base = snapshot(call);
176
-
177
- if (call.providerExecuted) {
178
- // Already at output-available/output-error. Re-settling would overwrite
179
- // the provider's own result with a parse of its arguments.
180
- return {
181
- ...base,
182
- providerExecuted: true,
183
- ...(call.output !== undefined ? { output: call.output } : {}),
184
- ...(call.outputError !== undefined ? { error: call.outputError } : {}),
185
- };
186
- }
187
-
188
- // Attached once, at settle: before that `argumentsText` is still growing
189
- // and a raw snapshot of half a JSON string is worse than none.
190
- const raw = rawOf(call);
191
- // `type` is re-sent because a provider may split the tool NAME across
192
- // fragments; the announce could have fired on a prefix.
193
- const name = call.name || 'unknown_tool';
194
-
195
- if (streamError) {
196
- const error = `Stream failed before the tool call completed: ${streamError}`;
197
- sink.upsertTool(id, {
198
- type: name,
199
- state: 'output-error',
200
- errorText: error,
201
- rawInput: call.argumentsText,
202
- raw,
203
- });
204
- return { ...base, error };
205
- }
206
-
207
- if (!call.name) {
208
- const error = 'Tool call arrived with no function name; cannot dispatch it.';
209
- sink.upsertTool(id, { state: 'output-error', errorText: error, raw });
210
- return { ...base, error };
211
- }
212
-
213
- const rawArgs = call.argumentsText.trim();
214
- try {
215
- // An argument-less tool legitimately streams '' or '{}'.
216
- const parsed: unknown = rawArgs === '' ? {} : JSON.parse(rawArgs);
217
- if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {
218
- throw new Error('arguments must be a JSON object');
219
- }
220
- const input = parsed as Record<string, unknown>;
221
- sink.upsertTool(id, {
222
- type: name,
223
- state: 'input-available',
224
- input,
225
- rawInput: call.argumentsText,
226
- raw,
227
- });
228
- const ready: ModelToolCall = { ...base, input };
229
- opts.onToolCallReady?.(ready);
230
- return ready;
231
- } catch (e) {
232
- const truncated =
233
- stopReason === 'length' ? ' (the stream hit the token limit mid-call)' : '';
234
- const error =
235
- `Malformed tool arguments${truncated}: ${(e as Error).message}. ` +
236
- `Received ${rawArgs.length} chars: ${clip(rawArgs, 160)}`;
237
- sink.upsertTool(id, {
238
- type: name,
239
- state: 'output-error',
240
- errorText: error,
241
- rawInput: call.argumentsText,
242
- raw,
243
- });
244
- return { ...base, error };
245
- }
246
- });
247
-
248
- return { apply, settle };
249
- }
250
-
251
- // ── Part recording and sink tee ──────────────────────────────────────────────
252
-
253
- /** A sink that writes nowhere but into a `MessagePart[]`, using the kit's own
254
- * builders. Teed alongside the real sink so `ModelTurn.parts` cannot drift from
255
- * what the message actually received. */
256
- function createPartsRecorder(correlation: WireCorrelation): AssistantStreamSink & {
257
- parts(): MessagePart[];
258
- /** How many DISTINCT parts each variant produced, keyed by variant name.
259
- *
260
- * Counted from the sink method that was called plus the fact that the parts
261
- * array GREW, NOT by discriminating a `MessagePart` -- which is what keeps
262
- * this out of scope for `lint:silent-drops`: there is no new switch over
263
- * `MessagePart.type` in `wire/` to go stale when a seventh variant lands.
264
- *
265
- * Parts, not writes: five text deltas merge into ONE text part and report
266
- * `{ text: 1 }`. A consumer renders these as "N parts", so a write count
267
- * would lie there. Per-delta granularity is not lost -- one `wire.part`
268
- * event is still emitted per write, carrying that delta's own `chars`. */
269
- partCounts(): Record<string, number>;
270
- } {
271
- let parts: MessagePart[] = [];
272
- const counts: Record<string, number> = {};
273
-
274
- /** Count the part if this write created one, then report the write. `chars` is
275
- * the delta LENGTH and is passed only for the text-bearing variants; the
276
- * delta itself never travels.
277
- *
278
- * A write either APPENDS a part or MERGES into one that already exists, and
279
- * the array length is what separates them -- uniform across all four methods
280
- * and needing no knowledge of any variant's shape. The growth amount is used
281
- * rather than a flat +1 so a builder that ever appends two stays honest.
282
- *
283
- * `index` is the position in `parts` this write landed on, found by comparing
284
- * references before and after. The builders return a new array with a new
285
- * object for the item they changed, so the first slot that differs IS the
286
- * part that moved. Computed only when someone is listening. */
287
- const record = (
288
- variant: string,
289
- before: MessagePart[],
290
- chars?: number,
291
- /** Built ONLY when the payload switch is on -- a thunk, so with it off
292
- * nothing here is read or copied. */
293
- payload?: () => { delta?: string; patch?: unknown; source?: unknown },
294
- ) => {
295
- if (parts.length > before.length) {
296
- counts[variant] = (counts[variant] ?? 0) + (parts.length - before.length);
297
- }
298
- if (!wireDiagnosticsActive()) return;
299
- let index = parts.length - 1;
300
- for (let i = 0; i < parts.length; i++) {
301
- if (before[i] !== parts[i]) {
302
- index = i;
303
- break;
304
- }
305
- }
306
- emitWireDiagnostic({
307
- type: 'wire.part',
308
- t: Date.now(),
309
- ...correlation,
310
- variant,
311
- index,
312
- ...(chars !== undefined ? { chars } : {}),
313
- ...(payload ? withPayload(payload) : {}),
314
- });
315
- };
316
-
317
- return {
318
- appendText(delta) {
319
- const before = parts;
320
- parts = appendTextPart(parts, delta);
321
- record('text', before, delta.length, () => ({ delta }));
322
- },
323
- appendReasoning(delta, opts) {
324
- const before = parts;
325
- // `streamId` is DROPPED here on purpose. It namespaces block indices for a
326
- // sink that outlives one stream; this recorder starts a fresh array per
327
- // call, so within `ModelTurn.parts` there is nothing to disambiguate. Worse,
328
- // it is a new value on every call, so keeping it would make `parts`
329
- // non-reproducible for identical input and break the determinism the
330
- // adapter guarantees (same chunks in, same parts out, whatever the byte
331
- // boundaries). The host's own sink still receives it.
332
- parts = appendReasoningPart(parts, delta, { ...opts, streamId: undefined });
333
- record('reasoning', before, delta.length, () => ({ delta }));
334
- },
335
- upsertTool(toolCallId, patch) {
336
- const before = parts;
337
- parts = upsertToolPart(parts, toolCallId, patch);
338
- // The patch is where the tool's arguments and its output live, so the
339
- // whole thing is payload and none of it is metadata.
340
- record('tool', before, undefined, () => ({ patch }));
341
- },
342
- addSource(source) {
343
- const before = parts;
344
- parts = [...parts, { type: 'source', source }];
345
- record('source', before, undefined, () => ({ source }));
346
- },
347
- parts: () => parts,
348
- partCounts: () => counts,
349
- };
350
- }
351
-
352
- /** Drive two sinks from one call. `a` (the host's) goes first so the visible
353
- * message updates in stream order. */
354
- function teeSink(a: AssistantStreamSink, b: AssistantStreamSink): AssistantStreamSink {
355
- return {
356
- appendText(delta) {
357
- a.appendText(delta);
358
- b.appendText(delta);
359
- },
360
- appendReasoning(delta, opts) {
361
- a.appendReasoning(delta, opts);
362
- b.appendReasoning(delta, opts);
363
- },
364
- upsertTool(toolCallId, patch) {
365
- a.upsertTool(toolCallId, patch);
366
- b.upsertTool(toolCallId, patch);
367
- },
368
- addSource(source) {
369
- a.addSource?.(source);
370
- b.addSource?.(source);
371
- },
372
- };
373
- }
374
-
375
- // ── The main loop ────────────────────────────────────────────────────────────
376
-
377
- /**
378
- * Read one turn's worth of `ModelStreamChunk`s and drive `sink` with them.
379
- *
380
- * The sink is expected to be the kit's `AssistantStream`, which produces a NEW
381
- * message object (and a new `parts` array) on every real mutation: that is what
382
- * makes `<kai-thread>` re-render. This adapter calls the sink once per delta and
383
- * never batches; batching is a host concern.
384
- *
385
- * This is also the escape hatch for a consumer who already has neutral chunks
386
- * from somewhere else and does not need a WireFormat at all.
387
- */
388
- export async function consumeModelStream(
389
- chunks: AsyncIterable<ModelStreamChunk>,
390
- sink: AssistantStreamSink,
391
- opts: ConsumeOptions = {},
392
- ): Promise<ModelTurn> {
393
- const label = opts.reasoningLabel ?? 'Thinking';
394
- // `readModelStream` assigns the id one level up, because it opens the format
395
- // and counts frames before this function runs and every event from one read
396
- // has to carry the same id. A direct caller still gets a fresh one per call.
397
- const streamId = opts.streamId ?? nextStreamId();
398
- // `traceId`/`label` ride along unchanged from the caller. `readModelStream`
399
- // built the same object one level up and passes the parts of it through
400
- // `opts`, so a read and its consume report one identical correlation.
401
- const correlation = wireCorrelation(streamId, opts);
402
- const startedAt = Date.now();
403
- const recorder = createPartsRecorder(correlation);
404
- const out = teeSink(sink, recorder);
405
- const tools = createToolCallAccumulator(out, opts);
406
-
407
- let text = '';
408
- let reasoning = '';
409
- let reasoningChunks = 0;
410
- let chunkCount = 0;
411
- let finishReason: string | null = null;
412
- let error: ModelTurn['error'];
413
- let usage: ModelUsage | undefined;
414
- const sources: MessageSource[] = [];
415
-
416
- for await (const chunk of chunks) {
417
- chunkCount++;
418
-
419
- if (chunk.usage) usage = { ...usage, ...chunk.usage };
420
-
421
- if (chunk.error) {
422
- error = chunk.error;
423
- if (chunk.finishReason) finishReason = chunk.finishReason;
424
- break;
425
- }
426
-
427
- if (chunk.text) {
428
- text += chunk.text;
429
- out.appendText(chunk.text);
430
- }
431
-
432
- // REWORK 1. The spike gated this whole branch on `if (chunk.reasoning)`,
433
- // which is falsy for ''. That dropped exactly the payloads `raw` exists to
434
- // preserve: an Anthropic redacted_thinking block (opaque, no readable text,
435
- // and the docs require sending it back "including any blocks with empty
436
- // thinking fields") and the assembled block emitted at content_block_stop
437
- // after signature_delta. Both arrive with no text.
438
- if (
439
- chunk.reasoning !== undefined ||
440
- chunk.reasoningRaw !== undefined ||
441
- chunk.reasoningSignature !== undefined
442
- ) {
443
- const delta = chunk.reasoning ?? '';
444
- reasoning += delta;
445
- // Only NON-EMPTY text counts as "reasoning streamed".
446
- if (delta !== '') reasoningChunks++;
447
- // `raw` and `signature` are spread in only when present: passing undefined
448
- // would blank a value an earlier delta already established.
449
- out.appendReasoning(delta, {
450
- index: chunk.reasoningIndex ?? 0,
451
- // Namespaces the index to THIS stream, so a later round reading into the
452
- // same sink opens its own part instead of overwriting this one's `raw`.
453
- streamId,
454
- label,
455
- ...(chunk.reasoningRaw ? { raw: chunk.reasoningRaw } : {}),
456
- ...(chunk.reasoningSignature ? { signature: chunk.reasoningSignature } : {}),
457
- });
458
- }
459
-
460
- if (chunk.toolCalls) for (const tc of chunk.toolCalls) tools.apply(tc);
461
-
462
- if (chunk.sources) {
463
- for (const source of chunk.sources) {
464
- sources.push(source);
465
- out.addSource?.(source);
466
- }
467
- }
468
-
469
- if (chunk.finishReason) finishReason = chunk.finishReason;
470
- }
471
-
472
- // A turn that received NOTHING has failed, and used to say so nowhere.
473
- //
474
- // The response was 200 and the body carried no parsable frame at all, which is
475
- // exactly what a proxy route produces when it forwards a provider failure
476
- // WITHOUT its status: an upstream 401 (no key — the most common first run)
477
- // arrives as HTTP 200 whose body is a JSON error object mislabelled
478
- // text/event-stream. `readModelStream` cannot throw for it (the response is
479
- // ok) and the SSE decoder finds no `data:` line, so the turn resolved empty:
480
- // no text, no error, no console output, nothing to debug. The route templates
481
- // forward the status now; this is the second, independent guard, and it also
482
- // covers a truncated body, a non-streaming completion returned by mistake, and
483
- // an HTML proxy page.
484
- //
485
- // AND ITS SIBLING: a turn whose frames PARSED but produced no part.
486
- //
487
- // The guard judges on parts produced rather than on raw chunk count, which is
488
- // what makes it hold once a format reads a field that content-less frames also
489
- // carry (`model`, `finishReason`, `usage`). Judged on chunks alone, surfacing
490
- // `model` would have taken this whole guard quiet: frames yielding nothing but
491
- // an id would push `chunkCount` above zero and the turn would go back to
492
- // resolving empty and saying so nowhere.
493
- //
494
- // The split reports which of the two happened, because they have different
495
- // fixes: zero chunks means nothing parsed as a frame at all, while chunks with
496
- // no parts means the frames parsed and carried nothing THIS reader reads --
497
- // the wrong-dialect case, and the one this option makes common.
498
- // ORDER IS LOAD-BEARING: settle runs FIRST, because settle PRODUCES PARTS.
499
- //
500
- // A tool call that never held both an id and a non-empty name is announced
501
- // only inside `settle`, so a parts map read before it is not final. Judged
502
- // there, a turn whose only content is such a call looked empty, and the
503
- // damage went both ways: the guard's own prose was fed back in as
504
- // `streamError` and REPLACED the call's accurate "arrived with no function
505
- // name" diagnosis, while `wire.close` reported an emptiness code beside a
506
- // produced part. Both reads now happen after settle, so the parts map, the
507
- // error code and the tool's own error agree by construction.
508
- //
509
- // `settle` still receives only a GENUINE in-band stream error, exactly as it
510
- // did before the guard was widened -- an emptiness diagnosis must never flow
511
- // into it. `stopReason` is recomputed below because the guard can set the
512
- // error that makes it 'error'; settle only branches on 'length', which the
513
- // guard cannot produce, so the pre-guard value is the right one to pass.
514
- const settleStopReason = normalizeStopReason(finishReason) ?? (error ? 'error' : undefined);
515
- const toolCalls = tools.settle(settleStopReason, error?.message);
516
-
517
- const partsTotal = Object.values(recorder.partCounts()).reduce((a, b) => a + b, 0);
518
- if (!error && partsTotal === 0) {
519
- error =
520
- chunkCount === 0
521
- ? {
522
- code: 'empty-stream',
523
- message:
524
- 'The model stream produced no chunks. The response was 200 but nothing in its body parsed ' +
525
- 'as a stream frame — check the endpoint really sent Content-Type: text/event-stream and that ' +
526
- 'the request set stream: true. A route that forwards a provider error without its status ' +
527
- 'lands here: the body is a JSON error, not SSE.',
528
- }
529
- : {
530
- code: 'empty-turn',
531
- message:
532
- `The stream completed and ${chunkCount} chunk(s) were parsed, but none carried content ` +
533
- 'this reader reads, so no message part was produced. If the endpoint streams a different ' +
534
- 'dialect (or carries its payload in a field this format does not read), switch to the ' +
535
- 'matching reader. A model that returned no content at all also lands here.',
536
- };
537
- }
538
-
539
- // REWORK 3. `finishReason` is reported verbatim; `stopReason` is what the
540
- // adapter itself branches on, so no OpenAI literal leaks into adapter logic.
541
- //
542
- // Recomputed after the guard: an emptiness error is still an error, and a turn
543
- // that reports one must report `stopReason: 'error'` beside it as it always
544
- // has. Identical to `settleStopReason` whenever the guard stayed silent.
545
- const stopReason = normalizeStopReason(finishReason) ?? (error ? 'error' : undefined);
546
-
547
- if (wireDiagnosticsActive()) {
548
- // `_frames` is supplied by `readModelStream` only. A direct caller had no
549
- // frames, so the field is absent rather than zero -- a consumer must be able
550
- // to tell "not reported" from "none arrived".
551
- const frames = (opts as { _frames?: () => number })._frames?.();
552
- emitWireDiagnostic({
553
- type: 'wire.close',
554
- t: Date.now(),
555
- ...correlation,
556
- ...(frames !== undefined ? { frames } : {}),
557
- chunks: chunkCount,
558
- parts: recorder.partCounts(),
559
- finishReason,
560
- ...(stopReason ? { stopReason } : {}),
561
- // The CODE only. A provider's error message can echo request content back,
562
- // which is why it stays on `ModelTurn.error` and never on the event.
563
- ...(error?.code !== undefined ? { errorCode: error.code } : {}),
564
- ...(usage ? { usage } : {}),
565
- ms: Date.now() - startedAt,
566
- // The assembled turn: everything the sink was driven with, in one place,
567
- // which is what a panel renders when someone asks "what did it actually
568
- // say" -- plus the in-band error's own message.
569
- //
570
- // ALL THREE TERMINAL EVENTS TREAT PROVIDER MESSAGE TEXT IDENTICALLY:
571
- // `wire.close`, `wire.failed` and `wire.interrupted` each keep it out of
572
- // the metadata (where only `errorCode` travels, because a message can
573
- // echo request content back) and each publish it under `payload`, which
574
- // is the switch that accepts exactly that. A developer who armed payload
575
- // is most often chasing the in-band error that explains an empty turn.
576
- ...withPayload(() => ({
577
- text,
578
- reasoning,
579
- toolCalls,
580
- sources,
581
- ...(error?.message !== undefined ? { message: error.message } : {}),
582
- })),
583
- });
584
- }
585
-
586
- return {
587
- parts: recorder.parts(),
588
- text,
589
- reasoning,
590
- toolCalls,
591
- sources,
592
- finishReason,
593
- reasoningChunks,
594
- chunks: chunkCount,
595
- ...(stopReason ? { stopReason } : {}),
596
- ...(error ? { error } : {}),
597
- ...(usage ? { usage } : {}),
598
- };
599
- }