@kitn.ai/ui 0.25.2 → 0.26.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 (409) hide show
  1. package/README.md +2 -2
  2. package/dist/components/attachment-types.d.ts +46 -1
  3. package/dist/components/attachments.d.ts +31 -0
  4. package/dist/components/audio-visualizer/fit-scale.d.ts +50 -0
  5. package/dist/components/audio-visualizer/index.d.ts +15 -1
  6. package/dist/components/audio-visualizer/variant-bar.d.ts +24 -1
  7. package/dist/components/chat-thread.d.ts +3 -41
  8. package/dist/components/code-block.d.ts +22 -0
  9. package/dist/components/conversation-item.d.ts +54 -1
  10. package/dist/components/conversation-list.d.ts +65 -0
  11. package/dist/components/form.d.ts +42 -0
  12. package/dist/components/message.d.ts +7 -0
  13. package/dist/components/toast.d.ts +2 -1
  14. package/dist/components/voice-input.d.ts +8 -0
  15. package/dist/components/voice-output.d.ts +12 -1
  16. package/dist/components/workspace-shell.d.ts +87 -0
  17. package/dist/{create-tween-B5Y4Im8G.js → create-tween-BFT6c-Y8.js} +1 -1
  18. package/dist/{create-tween-4z1XYLkR.js → create-tween-CJNlzoaO.js} +1 -1
  19. package/dist/{create-tween-CUzOlaMS.js → create-tween-CQED4T0g.js} +1 -1
  20. package/dist/custom-elements.json +2931 -2572
  21. package/dist/diagnostics/hook.d.ts +81 -0
  22. package/dist/diagnostics/index.d.ts +7 -0
  23. package/dist/diagnostics/report-request.d.ts +61 -0
  24. package/dist/diagnostics.d.ts +5 -0
  25. package/dist/diagnostics.js +209 -0
  26. package/dist/elements/agent-card.js +1 -1
  27. package/dist/elements/artifact.js +1 -1
  28. package/dist/elements/attachments.js +1 -1
  29. package/dist/elements/audio-visualizer.js +1 -1
  30. package/dist/elements/autoloader.js +1 -1
  31. package/dist/elements/avatar.js +1 -1
  32. package/dist/elements/badge.js +1 -1
  33. package/dist/elements/button.js +1 -1
  34. package/dist/elements/card.js +1 -1
  35. package/dist/elements/cards.js +1 -1
  36. package/dist/elements/chain-of-thought.js +1 -1
  37. package/dist/elements/chat-scope-picker.js +1 -1
  38. package/dist/elements/chat-workspace.js +1 -1
  39. package/dist/elements/chat.js +1 -1
  40. package/dist/elements/checkpoint.js +1 -1
  41. package/dist/elements/choice.js +1 -1
  42. package/dist/elements/chunks/{Icon-b5A8hlHs.js → Icon--Y8vsFal.js} +1 -1
  43. package/dist/elements/chunks/action-icons-D9u3OzYW.js +1 -0
  44. package/dist/elements/chunks/arrow-left-CVh1TeN7.js +1 -0
  45. package/dist/elements/chunks/{artifact-BSuPYFHY.js → artifact-BkYcfIlZ.js} +1 -1
  46. package/dist/elements/chunks/attachments-DwfNlubq.js +1 -0
  47. package/dist/elements/chunks/audio-visualizer-D7lB6mvR.js +1 -0
  48. package/dist/elements/chunks/{badge-TIMiJFKc.js → badge-Q0-Cmwzz.js} +1 -1
  49. package/dist/elements/chunks/{button-B9okqG73.js → button-flUbeufF.js} +1 -1
  50. package/dist/elements/chunks/{card-renderer-CSoTL_e1.js → card-renderer-3Dyl-FpN.js} +1 -1
  51. package/dist/elements/chunks/check-B5kBPKeo.js +1 -0
  52. package/dist/elements/chunks/chevron-down-DZ1GS39h.js +1 -0
  53. package/dist/elements/chunks/chevron-right-CvP7OUd2.js +1 -0
  54. package/dist/elements/chunks/{choice-card-CGMc3kek.js → choice-card-D4QUIOWZ.js} +1 -1
  55. package/dist/elements/chunks/circle-CDf9g6MQ.js +1 -0
  56. package/dist/elements/chunks/circle-check-CA47Nqbz.js +1 -0
  57. package/dist/elements/chunks/{circle-x-mhH7pOK2.js → circle-x-CJ_HVbC8.js} +1 -1
  58. package/dist/elements/chunks/code-block-BdLiTitd.js +1 -0
  59. package/dist/elements/chunks/collapsible-BzbXpPzr.js +1 -0
  60. package/dist/elements/chunks/{composer-CZZmtYOT.js → composer-Byve-n8K.js} +2 -2
  61. package/dist/elements/chunks/{confirm-card-BWjf2-xo.js → confirm-card-B0flE3MN.js} +1 -1
  62. package/dist/elements/chunks/context-VLIL3sJ-.js +1 -0
  63. package/dist/elements/chunks/controllable-DTwTIlwp.js +1 -0
  64. package/dist/elements/chunks/conversation-item-BDztezOG.js +1 -0
  65. package/dist/elements/chunks/copy-Nf-kqxXH.js +1 -0
  66. package/dist/elements/chunks/{create-tween-CUrM6D_o.js → create-tween-c4Z8TDYz.js} +2 -2
  67. package/dist/elements/chunks/default-input-C2iLFq0b.js +1 -0
  68. package/dist/elements/chunks/define-wjHR1MkU.js +1 -0
  69. package/dist/elements/chunks/disclosure-CcNbyLy0.js +1 -0
  70. package/dist/elements/chunks/{download-DnCyWFJE.js → download-C4V7tBdb.js} +1 -1
  71. package/dist/elements/chunks/dropdown-BgWTthUx.js +1 -0
  72. package/dist/elements/chunks/{ellipsis-CVxqfsDZ.js → ellipsis-7gU33mL2.js} +1 -1
  73. package/dist/elements/chunks/embed-D3KewsIJ.js +1 -0
  74. package/dist/elements/chunks/{external-link-DG2sRdQL.js → external-link-CSOEsNlx.js} +1 -1
  75. package/dist/elements/chunks/{file-text-D0J9F6M7.js → file-text-D1G8khle.js} +1 -1
  76. package/dist/elements/chunks/{file-tree-yGWNK0Js.js → file-tree-zvB2i7P9.js} +1 -1
  77. package/dist/elements/chunks/{folder-NV1pi_ud.js → folder-WW2LGLid.js} +1 -1
  78. package/dist/elements/chunks/form-CQirdC4W.js +1 -0
  79. package/dist/elements/chunks/hover-card-CJJkfHTK.js +1 -0
  80. package/dist/elements/chunks/icon-Cfgmf4fa.js +1 -0
  81. package/dist/elements/chunks/{info-C8r5Q6cc.js → info-DX3YMOt6.js} +1 -1
  82. package/dist/elements/chunks/input-BtW9U6Sq.js +1 -0
  83. package/dist/elements/chunks/{kbd-OGJDUT-O.js → kbd-LGXwuT_V.js} +1 -1
  84. package/dist/elements/chunks/{link-BdsfLB7b.js → link-2My69BqT.js} +1 -1
  85. package/dist/elements/chunks/{link-preview-Cf5KOP-i.js → link-preview-OQ9IEq0f.js} +1 -1
  86. package/dist/elements/chunks/{loader-B5QzK_8_.js → loader-iOxc_Tu-.js} +1 -1
  87. package/dist/elements/chunks/{markdown-DbozyYqa.js → markdown-DgBFaGAz.js} +1 -1
  88. package/dist/elements/chunks/{message-DtXKPqiR.js → message-VMZohrXx.js} +1 -1
  89. package/dist/elements/chunks/message-circle-CpXMM-_n.js +1 -0
  90. package/dist/elements/chunks/message-square-DxcWtETQ.js +1 -0
  91. package/dist/elements/chunks/message-tZmV2A3p.js +1 -0
  92. package/dist/elements/chunks/{minimize-2-SegJ_oku.js → minimize-2-DPIUKTrT.js} +1 -1
  93. package/dist/elements/chunks/{model-switcher-D7JrFFHp.js → model-switcher-DsT8tFB0.js} +1 -1
  94. package/dist/elements/chunks/{overlay-CV7z2YuX.js → overlay-DuiwdXjm.js} +1 -1
  95. package/dist/elements/chunks/{paperclip-Bg0ITU3b.js → paperclip-CRZVp4z_.js} +1 -1
  96. package/dist/elements/chunks/{progress-bar-D1_rzt6N.js → progress-bar-DNy66e_E.js} +1 -1
  97. package/dist/elements/chunks/{prompt-suggestion-D5Sm8xF1.js → prompt-suggestion-Bn64Nl7L.js} +1 -1
  98. package/dist/elements/chunks/reasoning-Emn9N4-T.js +1 -0
  99. package/dist/elements/chunks/{resizable-Dpzjlvp4.js → resizable-D181b4fM.js} +1 -1
  100. package/dist/elements/chunks/{rotate-cw-DzVDJOA1.js → rotate-cw-CPWe37D9.js} +1 -1
  101. package/dist/elements/chunks/{scroll-area-93A1bbeG.js → scroll-area-ClZkZxIk.js} +1 -1
  102. package/dist/elements/chunks/scroll-button-DPE-t3x_.js +1 -0
  103. package/dist/elements/chunks/{separator-DH2r_ZSZ.js → separator-CeJHQqLW.js} +1 -1
  104. package/dist/elements/chunks/{settings-BFMOd6yB.js → settings-CqaHgJF9.js} +1 -1
  105. package/dist/elements/chunks/{settings-group-B3VZKIcz.js → settings-group-CjqjLCOn.js} +1 -1
  106. package/dist/elements/chunks/share-CyfnNEqp.js +1 -0
  107. package/dist/elements/chunks/{skeleton-N8BuWYmf.js → skeleton-D8akBnKS.js} +1 -1
  108. package/dist/elements/chunks/slots-DaNjX0rc.js +1 -0
  109. package/dist/elements/chunks/{source-w9V0NnBn.js → source-UWCvmVak.js} +1 -1
  110. package/dist/elements/chunks/{star-DHvACxtm.js → star-DoHFAikQ.js} +1 -1
  111. package/dist/elements/chunks/store-Cjq0qwYN.js +1 -0
  112. package/dist/elements/chunks/{tasks-card-lPxoodlA.js → tasks-card-CmZ5xh6v.js} +1 -1
  113. package/dist/elements/chunks/{text-shimmer-BY_rI3s5.js → text-shimmer-DYn09zrz.js} +1 -1
  114. package/dist/elements/chunks/textarea-skiGHURM.js +1 -0
  115. package/dist/elements/chunks/{thumbs-up-DQe0hvkZ.js → thumbs-up-DX2Ijk3H.js} +1 -1
  116. package/dist/elements/chunks/{toast-store-VUZZBhzH.js → toast-store-CFnQpThX.js} +1 -1
  117. package/dist/elements/chunks/{tool-C1YtxwPu.js → tool-DKQ2D1DP.js} +1 -1
  118. package/dist/elements/chunks/{tooltip-BqwnFWhn.js → tooltip-B0G99y8w.js} +1 -1
  119. package/dist/elements/chunks/{triangle-alert-B6or7F5u.js → triangle-alert-F9cyUEyy.js} +1 -1
  120. package/dist/elements/chunks/{use-card-resolution-DJg32jGH.js → use-card-resolution-DoA2f_EU.js} +1 -1
  121. package/dist/elements/chunks/{variant-aurora-QXTZPyST.js → variant-aurora-qt6Zct8M.js} +2 -2
  122. package/dist/elements/chunks/variant-custom-tJp22_BQ.js +1 -0
  123. package/dist/{variant-wave-BwzrHD1s.js → elements/chunks/variant-wave-CaQ5ti39.js} +2 -2
  124. package/dist/elements/chunks/x-B6UnOiLw.js +1 -0
  125. package/dist/elements/coachmark.js +1 -1
  126. package/dist/elements/code-block.js +1 -1
  127. package/dist/elements/command.js +1 -1
  128. package/dist/elements/compare.js +1 -1
  129. package/dist/elements/composer.js +1 -1
  130. package/dist/elements/confirm-card.js +1 -1
  131. package/dist/elements/context-meter.js +1 -1
  132. package/dist/elements/conversation-item.d.ts +1 -0
  133. package/dist/elements/conversation-item.js +1 -0
  134. package/dist/elements/conversation-list.js +1 -1
  135. package/dist/elements/default-input.d.ts +3 -3
  136. package/dist/elements/define.d.ts +27 -0
  137. package/dist/elements/diagnostic-events.d.ts +74 -0
  138. package/dist/elements/dialog.js +1 -1
  139. package/dist/elements/dock.d.ts +1 -0
  140. package/dist/elements/dock.js +149 -0
  141. package/dist/elements/dropdown.d.ts +1 -0
  142. package/dist/elements/dropdown.js +1 -0
  143. package/dist/elements/editable-label.js +1 -1
  144. package/dist/elements/element-diagnostics.d.ts +81 -0
  145. package/dist/elements/embed.js +1 -1
  146. package/dist/elements/empty.js +1 -1
  147. package/dist/elements/feedback-bar.js +1 -1
  148. package/dist/elements/file-tree.js +1 -1
  149. package/dist/elements/file-upload.js +1 -1
  150. package/dist/elements/form.js +1 -1
  151. package/dist/elements/hover-card.js +1 -1
  152. package/dist/elements/icon.js +1 -1
  153. package/dist/elements/image.js +1 -1
  154. package/dist/elements/input.js +1 -1
  155. package/dist/elements/kbd.js +1 -1
  156. package/dist/elements/link-preview.js +1 -1
  157. package/dist/elements/loader.js +1 -1
  158. package/dist/elements/markdown.js +1 -1
  159. package/dist/elements/menu.js +1 -1
  160. package/dist/elements/message-skills.js +1 -1
  161. package/dist/elements/message.js +1 -1
  162. package/dist/elements/model-switcher.js +1 -1
  163. package/dist/elements/nav.js +1 -1
  164. package/dist/elements/notice.js +1 -1
  165. package/dist/elements/pane-group.js +1 -1
  166. package/dist/elements/pane.js +1 -1
  167. package/dist/elements/popover.js +1 -1
  168. package/dist/elements/progress-bar.js +1 -1
  169. package/dist/elements/prompt-dock.js +1 -1
  170. package/dist/elements/prompt-input.js +1 -1
  171. package/dist/elements/prompt-suggestions.js +1 -1
  172. package/dist/elements/reasoning.js +1 -1
  173. package/dist/elements/register.d.ts +2 -0
  174. package/dist/elements/remote.js +1 -1
  175. package/dist/elements/resizable.js +1 -1
  176. package/dist/elements/response-stream.js +3 -3
  177. package/dist/elements/screen.js +1 -1
  178. package/dist/elements/scroll-area.js +1 -1
  179. package/dist/elements/scroll-button.js +1 -1
  180. package/dist/elements/search.js +1 -1
  181. package/dist/elements/segmented.js +1 -1
  182. package/dist/elements/separator.js +1 -1
  183. package/dist/elements/setting-item.js +1 -1
  184. package/dist/elements/settings-group.js +1 -1
  185. package/dist/elements/skeleton.js +1 -1
  186. package/dist/elements/slots.d.ts +35 -3
  187. package/dist/elements/source.js +1 -1
  188. package/dist/elements/status.js +1 -1
  189. package/dist/elements/switch.js +1 -1
  190. package/dist/elements/tabs.js +1 -1
  191. package/dist/elements/tasks.js +1 -1
  192. package/dist/elements/text-shimmer.js +1 -1
  193. package/dist/elements/thinking-bar.js +1 -1
  194. package/dist/elements/thread.js +1 -1
  195. package/dist/elements/toast.js +1 -1
  196. package/dist/elements/tool.js +1 -1
  197. package/dist/elements/tooltip.js +1 -1
  198. package/dist/elements/voice-input.js +1 -1
  199. package/dist/elements/voice-output.js +1 -1
  200. package/dist/elements.d.ts +232 -148
  201. package/dist/index.d.ts +2 -0
  202. package/dist/index.js +5456 -4931
  203. package/dist/index.server.js +4142 -3669
  204. package/dist/kai-provider.es.js +40 -40
  205. package/dist/kai.es.js +1 -1
  206. package/dist/llms/llms-full.txt +184 -69
  207. package/dist/llms/llms.txt +3 -3
  208. package/dist/mcp.es.js +2669 -546
  209. package/dist/primitives/use-resize-observer.d.ts +23 -0
  210. package/dist/primitives/use-speech-recognition.d.ts +8 -0
  211. package/dist/primitives/use-text-stream.d.ts +5 -0
  212. package/dist/react/index.d.ts +115 -266
  213. package/dist/react.js +247 -221
  214. package/dist/register-impl-DpE7icIb.js +293 -0
  215. package/dist/schemas/index.d.ts +1 -1
  216. package/dist/schemas/tool-defs.d.ts +35 -0
  217. package/dist/schemas.js +403 -310
  218. package/dist/{solid-BMuDmFo_.js → solid-BtdqNZI7.js} +8435 -7394
  219. package/dist/{solid-CGYNdLRR.js → solid-CnavwBye.js} +5987 -5035
  220. package/dist/solid.d.ts +5 -0
  221. package/dist/solid.js +210 -203
  222. package/dist/solid.server.js +210 -203
  223. package/dist/state/index.d.ts +4 -0
  224. package/dist/state/persistence.d.ts +51 -0
  225. package/dist/state/stream.d.ts +50 -0
  226. package/dist/state/threads.d.ts +71 -0
  227. package/dist/state.js +269 -169
  228. package/dist/types.d.ts +4 -2
  229. package/dist/ui/dock.d.ts +109 -0
  230. package/dist/ui/hover-card.d.ts +44 -0
  231. package/dist/{variant-aurora-DwSOfraQ.js → variant-aurora-B8II3-I1.js} +27 -27
  232. package/dist/{variant-aurora-wKvAQ5wp.js → variant-aurora-CMNWOSJR.js} +28 -28
  233. package/dist/{variant-aurora-XEkPT0_z.js → variant-aurora-CcuDMWwQ.js} +2 -2
  234. package/dist/{variant-custom-eFIg2XWQ.js → variant-custom-BdvYC7af.js} +40 -40
  235. package/dist/{variant-custom-BhS9wIpU.js → variant-custom-C714mqKl.js} +65 -65
  236. package/dist/variant-custom-L16JLLZy.js +1 -0
  237. package/dist/{elements/chunks/variant-wave-DDCwhLas.js → variant-wave-2S4La2Ka.js} +2 -2
  238. package/dist/{variant-wave-CbVsmgwT.js → variant-wave-D7ruiA1W.js} +25 -25
  239. package/dist/{variant-wave-CUWGx9Bn.js → variant-wave-ecwykeyL.js} +21 -21
  240. package/dist/wire/chunk.d.ts +47 -0
  241. package/dist/wire/diagnostics.d.ts +575 -0
  242. package/dist/wire/encode-probe.d.ts +70 -0
  243. package/dist/wire/encode.d.ts +24 -0
  244. package/dist/wire/index.d.ts +2 -0
  245. package/dist/wire/sse.d.ts +10 -2
  246. package/dist/wire.js +917 -480
  247. package/frameworks/react/index.tsx +132 -93
  248. package/llms-full.txt +184 -69
  249. package/llms.txt +3 -3
  250. package/package.json +26 -6
  251. package/src/agent-tooling/archetypes.ts +41 -9
  252. package/src/agent-tooling/catalog/README.md +676 -0
  253. package/src/agent-tooling/catalog/catalog-types.ts +231 -0
  254. package/src/agent-tooling/catalog/fabrications.ts +96 -0
  255. package/src/agent-tooling/catalog/invariants.ts +284 -0
  256. package/src/agent-tooling/catalog/labs-titles.ts +114 -0
  257. package/src/agent-tooling/catalog/scenarios.ts +87 -0
  258. package/src/agent-tooling/catalog/surfaces.ts +275 -0
  259. package/src/agent-tooling/integrations/anthropic.ts +7 -1
  260. package/src/agent-tooling/integrations/cloudflare.ts +43 -2
  261. package/src/agent-tooling/integrations/langgraph.ts +7 -1
  262. package/src/agent-tooling/integrations/mastra.ts +7 -1
  263. package/src/agent-tooling/integrations/mock.ts +92 -17
  264. package/src/agent-tooling/integrations/ollama.ts +7 -1
  265. package/src/agent-tooling/integrations/openai.ts +7 -1
  266. package/src/agent-tooling/integrations/openrouter.ts +7 -1
  267. package/src/agent-tooling/integrations/pi.ts +56 -1
  268. package/src/agent-tooling/integrations/vercel-ai-sdk.ts +7 -1
  269. package/src/agent-tooling/mcp/css-raw.d.ts +12 -0
  270. package/src/agent-tooling/mcp/manifest.ts +100 -1
  271. package/src/agent-tooling/mcp/server.ts +61 -5
  272. package/src/agent-tooling/mcp/tools/reference.ts +440 -4
  273. package/src/agent-tooling/mcp/tools/scaffold.ts +1834 -307
  274. package/src/agent-tooling/mcp/tools/theme.ts +146 -30
  275. package/src/agent-tooling/mcp/validate-args.ts +141 -0
  276. package/src/agent-tooling/registry.ts +19 -7
  277. package/src/agent-tooling/route-emit.ts +26 -2
  278. package/src/components/attachment-types.ts +47 -1
  279. package/src/components/attachments.tsx +169 -22
  280. package/src/components/audio-visualizer/fit-scale.ts +112 -0
  281. package/src/components/audio-visualizer/index.tsx +80 -3
  282. package/src/components/audio-visualizer/variant-aurora.tsx +10 -4
  283. package/src/components/audio-visualizer/variant-bar.tsx +38 -6
  284. package/src/components/audio-visualizer/variant-custom.tsx +8 -2
  285. package/src/components/audio-visualizer/variant-grid.tsx +16 -11
  286. package/src/components/audio-visualizer/variant-radial.tsx +15 -10
  287. package/src/components/audio-visualizer/variant-wave.tsx +7 -2
  288. package/src/components/chat-container.tsx +4 -1
  289. package/src/components/chat-thread.tsx +36 -7
  290. package/src/components/code-block.tsx +79 -3
  291. package/src/components/composer.tsx +8 -1
  292. package/src/components/conversation-item.tsx +114 -4
  293. package/src/components/conversation-list.tsx +212 -12
  294. package/src/components/embed.tsx +4 -0
  295. package/src/components/form.tsx +41 -14
  296. package/src/components/message.tsx +75 -5
  297. package/src/components/response-stream.tsx +13 -7
  298. package/src/components/screen.tsx +5 -0
  299. package/src/components/scroll-button.tsx +7 -0
  300. package/src/components/toast.tsx +11 -5
  301. package/src/components/voice-input.tsx +35 -3
  302. package/src/components/voice-output.tsx +46 -6
  303. package/src/components/workspace-shell.tsx +285 -0
  304. package/src/diagnostics/hook.ts +352 -0
  305. package/src/diagnostics/index.ts +82 -0
  306. package/src/diagnostics/report-request.ts +296 -0
  307. package/src/elements/attachments.tsx +6 -7
  308. package/src/elements/audio-visualizer.tsx +48 -4
  309. package/src/elements/chat-workspace.tsx +159 -287
  310. package/src/elements/chat.tsx +12 -9
  311. package/src/elements/code-block.tsx +19 -1
  312. package/src/elements/command.tsx +4 -1
  313. package/src/elements/compiled.css +1 -1
  314. package/src/elements/conversation-item.tsx +80 -0
  315. package/src/elements/conversation-list.tsx +60 -11
  316. package/src/elements/default-input.tsx +5 -5
  317. package/src/elements/define.tsx +168 -8
  318. package/src/elements/diagnostic-events.ts +114 -0
  319. package/src/elements/dialog.tsx +47 -0
  320. package/src/elements/disclosure.ts +34 -12
  321. package/src/elements/dock.tsx +204 -0
  322. package/src/elements/dropdown.tsx +123 -0
  323. package/src/elements/element-diagnostics.ts +392 -0
  324. package/src/elements/element-manifest.json +12 -0
  325. package/src/elements/element-meta.json +672 -439
  326. package/src/elements/element-nonscalar.json +170 -0
  327. package/src/elements/element-types.d.ts +232 -148
  328. package/src/elements/menu.tsx +13 -0
  329. package/src/elements/prompt-dock.tsx +2 -1
  330. package/src/elements/prompt-input.tsx +8 -8
  331. package/src/elements/register-impl.ts +46 -0
  332. package/src/elements/register.ts +28 -0
  333. package/src/elements/resizable.tsx +52 -25
  334. package/src/elements/scroll-button.tsx +5 -0
  335. package/src/elements/slots.ts +107 -12
  336. package/src/elements/styles.css +30 -6
  337. package/src/elements/thinking-bar.tsx +16 -7
  338. package/src/elements/toast.tsx +3 -0
  339. package/src/elements/tool.tsx +26 -5
  340. package/src/elements/voice-input.tsx +11 -2
  341. package/src/elements/voice-output.tsx +16 -3
  342. package/src/index.ts +2 -0
  343. package/src/primitives/use-resize-observer.ts +33 -0
  344. package/src/primitives/use-speech-recognition.ts +12 -1
  345. package/src/primitives/use-stick-to-bottom.ts +34 -2
  346. package/src/primitives/use-text-stream.ts +33 -2
  347. package/src/remote/provider-runtime.ts +6 -3
  348. package/src/schemas/index.ts +1 -0
  349. package/src/schemas/tool-defs.ts +297 -6
  350. package/src/solid.ts +5 -0
  351. package/src/state/index.ts +12 -0
  352. package/src/state/persistence.ts +180 -0
  353. package/src/state/stream.ts +71 -4
  354. package/src/state/threads.ts +142 -0
  355. package/src/types.ts +4 -2
  356. package/src/ui/dialog.tsx +6 -0
  357. package/src/ui/dock.tsx +445 -0
  358. package/src/ui/dropdown.tsx +67 -23
  359. package/src/ui/hover-card.tsx +156 -6
  360. package/src/ui/input.tsx +29 -10
  361. package/src/ui/resizable.tsx +11 -0
  362. package/src/wire/chunk.ts +47 -0
  363. package/src/wire/consume.ts +185 -26
  364. package/src/wire/diagnostics.ts +727 -0
  365. package/src/wire/encode-probe.ts +214 -0
  366. package/src/wire/encode.ts +267 -14
  367. package/src/wire/formats/anthropic.ts +8 -1
  368. package/src/wire/formats/openai.ts +5 -0
  369. package/src/wire/index.ts +22 -0
  370. package/src/wire/read.ts +250 -6
  371. package/src/wire/sse.ts +16 -3
  372. package/dist/elements/chunks/action-icons-DW9muWrY.js +0 -1
  373. package/dist/elements/chunks/arrow-left-iJVnQmxA.js +0 -1
  374. package/dist/elements/chunks/attachments-CL6TaqIb.js +0 -1
  375. package/dist/elements/chunks/audio-visualizer-BuUqQmaO.js +0 -1
  376. package/dist/elements/chunks/chat-thread-DxoKaStk.js +0 -1
  377. package/dist/elements/chunks/check-MdLzbxrm.js +0 -1
  378. package/dist/elements/chunks/chevron-down-MK7IzDqe.js +0 -1
  379. package/dist/elements/chunks/chevron-right-C5jXhmtV.js +0 -1
  380. package/dist/elements/chunks/circle-BG7VkPep.js +0 -1
  381. package/dist/elements/chunks/circle-check-GqvO2UBs.js +0 -1
  382. package/dist/elements/chunks/code-block-ClhQO9RW.js +0 -1
  383. package/dist/elements/chunks/collapsible-DBcBkFPh.js +0 -1
  384. package/dist/elements/chunks/context-hKjNqiyQ.js +0 -1
  385. package/dist/elements/chunks/conversation-list-CsGJjSKG.js +0 -1
  386. package/dist/elements/chunks/default-input-B1Mem5wu.js +0 -1
  387. package/dist/elements/chunks/define-B_tXMYRm.js +0 -1
  388. package/dist/elements/chunks/disclosure-DAoYOKew.js +0 -1
  389. package/dist/elements/chunks/dropdown-CmNna5lT.js +0 -1
  390. package/dist/elements/chunks/embed-CjAD2jSi.js +0 -1
  391. package/dist/elements/chunks/form-Cp8Y00Wn.js +0 -1
  392. package/dist/elements/chunks/hover-card-6KtXpLwT.js +0 -1
  393. package/dist/elements/chunks/icon-97R8SR2p.js +0 -1
  394. package/dist/elements/chunks/input-DrseEjhp.js +0 -1
  395. package/dist/elements/chunks/message-CE4k-qaj.js +0 -1
  396. package/dist/elements/chunks/message-square-C9ovmtOo.js +0 -1
  397. package/dist/elements/chunks/reasoning-BrxQfpfI.js +0 -1
  398. package/dist/elements/chunks/scroll-button-CrTo7wm4.js +0 -1
  399. package/dist/elements/chunks/share-DgNbkJKY.js +0 -1
  400. package/dist/elements/chunks/slots-CIw9RlAe.js +0 -1
  401. package/dist/elements/chunks/store-HIPGhNz9.js +0 -1
  402. package/dist/elements/chunks/textarea-DPfuhswM.js +0 -1
  403. package/dist/elements/chunks/variant-custom-D5ZlmziF.js +0 -1
  404. package/dist/elements/chunks/video-Bb86fVYI.js +0 -1
  405. package/dist/elements/chunks/x-BOhjBeOd.js +0 -1
  406. package/dist/primitives/card-validate-generator.testlib.d.ts +0 -20
  407. package/dist/register-impl-DGmGzrEM.js +0 -145
  408. package/dist/variant-custom-MkTNTycd.js +0 -1
  409. package/src/primitives/card-validate-generator.testlib.ts +0 -38
package/dist/state.js CHANGED
@@ -1,37 +1,37 @@
1
- function y(t) {
2
- const e = t.toLowerCase();
3
- return e ? e.includes("bash") || e.includes("command") || e.includes("shell") || e.includes("terminal") || e.includes("exec") ? "command" : e.includes("edit") || e.includes("write") || e.includes("patch") || e.includes("replace") || e.includes("delete") ? "file-change" : e.includes("search") || e.includes("grep") || e.includes("glob") || e.includes("find") ? "search" : e.includes("fetch") || e.includes("http") || e.includes("browse") || e.includes("crawl") ? "fetch" : e.includes("mcp") ? "mcp" : e.includes("image") || e.includes("screenshot") || e.includes("vision") ? "image" : "generic" : "generic";
1
+ function g(e) {
2
+ const t = e.toLowerCase();
3
+ return t ? t.includes("bash") || t.includes("command") || t.includes("shell") || t.includes("terminal") || t.includes("exec") ? "command" : t.includes("edit") || t.includes("write") || t.includes("patch") || t.includes("replace") || t.includes("delete") ? "file-change" : t.includes("search") || t.includes("grep") || t.includes("glob") || t.includes("find") ? "search" : t.includes("fetch") || t.includes("http") || t.includes("browse") || t.includes("crawl") ? "fetch" : t.includes("mcp") ? "mcp" : t.includes("image") || t.includes("screenshot") || t.includes("vision") ? "image" : "generic" : "generic";
4
4
  }
5
- function d(t) {
6
- const e = /* @__PURE__ */ new WeakSet(), n = (r) => {
5
+ function p(e) {
6
+ const t = /* @__PURE__ */ new WeakSet(), n = (r) => {
7
7
  if (r === null || typeof r != "object") return r;
8
- if (e.has(r)) return "[circular]";
9
- e.add(r);
10
- const i = r, u = Array.isArray(r) ? r.map(n) : Object.fromEntries(Object.keys(i).sort().map((o) => [o, n(i[o])]));
11
- return e.delete(r), u;
8
+ if (t.has(r)) return "[circular]";
9
+ t.add(r);
10
+ const o = r, a = Array.isArray(r) ? r.map(n) : Object.fromEntries(Object.keys(o).sort().map((i) => [i, n(o[i])]));
11
+ return t.delete(r), a;
12
12
  };
13
- return JSON.stringify(n(t)) ?? "";
13
+ return JSON.stringify(n(e)) ?? "";
14
14
  }
15
- function k(t, e) {
16
- const n = t[t.length - 1];
17
- return (n == null ? void 0 : n.type) === "text" ? [...t.slice(0, -1), { ...n, text: n.text + e }] : [...t, { type: "text", text: e }];
15
+ function x(e, t) {
16
+ const n = e[e.length - 1];
17
+ return (n == null ? void 0 : n.type) === "text" ? [...e.slice(0, -1), { ...n, text: n.text + t }] : [...e, { type: "text", text: t }];
18
18
  }
19
- function h(t, e, n = {}) {
20
- const r = n.index ?? 0, i = n.streamId, u = t.findIndex(
21
- (s) => s.type === "reasoning" && (s.index ?? 0) === r && s.streamId === i
19
+ function T(e, t, n = {}) {
20
+ const r = n.index ?? 0, o = n.streamId, a = e.findIndex(
21
+ (u) => u.type === "reasoning" && (u.index ?? 0) === r && u.streamId === o
22
22
  );
23
- if (u < 0)
24
- return [...t, { type: "reasoning", text: e, index: r, streamId: i, label: n.label, signature: n.signature, raw: n.raw }];
25
- const o = t[u], a = {
26
- ...o,
27
- text: o.text + e,
28
- label: n.label ?? o.label,
29
- signature: n.signature ?? o.signature,
30
- raw: n.raw ?? o.raw
23
+ if (a < 0)
24
+ return [...e, { type: "reasoning", text: t, index: r, streamId: o, label: n.label, signature: n.signature, raw: n.raw }];
25
+ const i = e[a], s = {
26
+ ...i,
27
+ text: i.text + t,
28
+ label: n.label ?? i.label,
29
+ signature: n.signature ?? i.signature,
30
+ raw: n.raw ?? i.raw
31
31
  };
32
- return O(o, a) ? t : [...t.slice(0, u), a, ...t.slice(u + 1)];
32
+ return S(i, s) ? e : [...e.slice(0, a), s, ...e.slice(a + 1)];
33
33
  }
34
- const I = [
34
+ const b = [
35
35
  "type",
36
36
  "text",
37
37
  "index",
@@ -39,42 +39,42 @@ const I = [
39
39
  "label",
40
40
  "signature",
41
41
  "raw"
42
- ], T = {
43
- type: (t, e) => t.type === e.type,
44
- text: (t, e) => t.text === e.text,
45
- index: (t, e) => t.index === e.index,
46
- streamId: (t, e) => t.streamId === e.streamId,
47
- label: (t, e) => t.label === e.label,
48
- signature: (t, e) => t.signature === e.signature,
49
- raw: (t, e) => t.raw === e.raw
42
+ ], I = {
43
+ type: (e, t) => e.type === t.type,
44
+ text: (e, t) => e.text === t.text,
45
+ index: (e, t) => e.index === t.index,
46
+ streamId: (e, t) => e.streamId === t.streamId,
47
+ label: (e, t) => e.label === t.label,
48
+ signature: (e, t) => e.signature === t.signature,
49
+ raw: (e, t) => e.raw === t.raw
50
50
  };
51
- function O(t, e) {
52
- return I.every((n) => T[n](t, e));
51
+ function S(e, t) {
52
+ return b.every((n) => I[n](e, t));
53
53
  }
54
- function _(t, e) {
55
- const n = t.findIndex((i) => i.type === "card" && i.envelope.id === e.id);
56
- if (n < 0) return [...t, { type: "card", envelope: e }];
57
- const r = t[n];
58
- return d(r.envelope) === d(e) ? t : [...t.slice(0, n), { ...r, envelope: e }, ...t.slice(n + 1)];
54
+ function A(e, t) {
55
+ const n = e.findIndex((o) => o.type === "card" && o.envelope.id === t.id);
56
+ if (n < 0) return [...e, { type: "card", envelope: t }];
57
+ const r = e[n];
58
+ return p(r.envelope) === p(t) ? e : [...e.slice(0, n), { ...r, envelope: t }, ...e.slice(n + 1)];
59
59
  }
60
- function b(t, e, n) {
61
- const r = t.findIndex((o) => o.type === "tool" && o.tool.toolCallId === e);
60
+ function M(e, t, n) {
61
+ const r = e.findIndex((i) => i.type === "tool" && i.tool.toolCallId === t);
62
62
  if (r < 0) {
63
- const o = {
63
+ const i = {
64
64
  type: n.type ?? "unknown",
65
65
  state: n.state ?? "input-streaming",
66
66
  ...n,
67
- toolCallId: e
67
+ toolCallId: t
68
68
  };
69
- return o.kind = o.kind ?? y(o.type), [...t, { type: "tool", tool: o }];
69
+ return i.kind = i.kind ?? g(i.type), [...e, { type: "tool", tool: i }];
70
70
  }
71
- const i = t[r].tool, u = { ...i, ...n, toolCallId: e };
72
- return u.kind = M(i, n, u.type), u.raw === void 0 && i.raw !== void 0 && (u.raw = i.raw), E(i, u) ? t : [...t.slice(0, r), { type: "tool", tool: u }, ...t.slice(r + 1)];
71
+ const o = e[r].tool, a = { ...o, ...n, toolCallId: t };
72
+ return a.kind = O(o, n, a.type), a.raw === void 0 && o.raw !== void 0 && (a.raw = o.raw), E(o, a) ? e : [...e.slice(0, r), { type: "tool", tool: a }, ...e.slice(r + 1)];
73
73
  }
74
- function M(t, e, n) {
75
- return e.kind !== void 0 ? e.kind : t.kind === void 0 || t.kind === y(t.type) ? y(n) : t.kind;
74
+ function O(e, t, n) {
75
+ return t.kind !== void 0 ? t.kind : e.kind === void 0 || e.kind === g(e.type) ? g(n) : e.kind;
76
76
  }
77
- const S = [
77
+ const R = [
78
78
  "type",
79
79
  "state",
80
80
  "kind",
@@ -84,172 +84,267 @@ const S = [
84
84
  "raw",
85
85
  "input",
86
86
  "output"
87
- ], R = {
88
- type: (t, e) => t.type === e.type,
89
- state: (t, e) => t.state === e.state,
90
- kind: (t, e) => t.kind === e.kind,
91
- toolCallId: (t, e) => t.toolCallId === e.toolCallId,
92
- errorText: (t, e) => t.errorText === e.errorText,
93
- rawInput: (t, e) => t.rawInput === e.rawInput,
94
- raw: (t, e) => t.raw === e.raw,
95
- input: (t, e) => t.input === e.input || d(t.input) === d(e.input),
96
- output: (t, e) => t.output === e.output || d(t.output) === d(e.output)
87
+ ], _ = {
88
+ type: (e, t) => e.type === t.type,
89
+ state: (e, t) => e.state === t.state,
90
+ kind: (e, t) => e.kind === t.kind,
91
+ toolCallId: (e, t) => e.toolCallId === t.toolCallId,
92
+ errorText: (e, t) => e.errorText === t.errorText,
93
+ rawInput: (e, t) => e.rawInput === t.rawInput,
94
+ raw: (e, t) => e.raw === t.raw,
95
+ input: (e, t) => e.input === t.input || p(e.input) === p(t.input),
96
+ output: (e, t) => e.output === t.output || p(e.output) === p(t.output)
97
97
  };
98
- function E(t, e) {
99
- return S.every((n) => R[n](t, e));
98
+ function E(e, t) {
99
+ return R.every((n) => _[n](e, t));
100
100
  }
101
101
  function C() {
102
102
  return typeof crypto < "u" && crypto.randomUUID ? crypto.randomUUID() : "kai-" + Math.random().toString(36).slice(2);
103
103
  }
104
- function U(t, e, n = {}) {
105
- return { id: n.id ?? C(), role: t, parts: [{ type: "text", text: e }], ...n };
104
+ function Y(e, t, n = {}) {
105
+ return { id: n.id ?? C(), role: e, parts: [{ type: "text", text: t }], ...n };
106
106
  }
107
- function j(t) {
108
- return t.filter((e) => e.type === "text").map((e) => e.text).join("");
107
+ function q(e) {
108
+ return e.filter((t) => t.type === "text").map((t) => t.text).join("");
109
109
  }
110
- function L(t, e) {
111
- return [...t, e];
110
+ function G(e, t) {
111
+ return [...e, t];
112
112
  }
113
- function $(t, e) {
114
- const n = t.findIndex((i) => i.id === e.id);
115
- if (n === -1) return [...t, e];
116
- const r = t.slice();
117
- return r[n] = e, r;
113
+ function J(e, t) {
114
+ const n = e.findIndex((o) => o.id === t.id);
115
+ if (n === -1) return [...e, t];
116
+ const r = e.slice();
117
+ return r[n] = t, r;
118
118
  }
119
- function F(t, e, n) {
120
- return t.map(
121
- (r) => r.id === e ? typeof n == "function" ? n(r) : { ...r, ...n } : r
119
+ function V(e, t, n) {
120
+ return e.map(
121
+ (r) => r.id === t ? typeof n == "function" ? n(r) : { ...r, ...n } : r
122
122
  );
123
123
  }
124
- function Y(t, e) {
125
- return t.filter((n) => n.id !== e);
124
+ function W(e, t) {
125
+ return e.filter((n) => n.id !== t);
126
126
  }
127
- function q(t, e, n) {
128
- return t.map((r) => r.id === e ? { ...r, parts: k(r.parts, n) } : r);
127
+ function z(e, t, n) {
128
+ return e.map((r) => r.id === t ? { ...r, parts: x(r.parts, n) } : r);
129
129
  }
130
- function G(t, e) {
131
- return t.includes(e) ? t.slice() : [...t, e];
130
+ function B(e, t) {
131
+ return e.includes(t) ? e.slice() : [...e, t];
132
132
  }
133
- function J(t, e) {
134
- return t.filter((n) => n !== e);
133
+ function H(e, t) {
134
+ return e.filter((n) => n !== t);
135
135
  }
136
- function A() {
136
+ function P() {
137
137
  return typeof crypto < "u" && crypto.randomUUID ? crypto.randomUUID() : "kai-" + Math.random().toString(36).slice(2);
138
138
  }
139
- function W(t, e = {}) {
140
- const n = e.id ?? A();
139
+ function Q(e, t = {}) {
140
+ const n = t.id ?? P();
141
141
  let r = !1;
142
- t((o) => [...o, { id: n, role: "assistant", parts: [], ...e }]);
143
- const i = (o) => {
144
- r || t((a) => {
145
- const s = a.findIndex((l) => l.id === n);
146
- if (s < 0) return a;
147
- const c = o(a[s].parts);
148
- return c === a[s].parts ? a : [...a.slice(0, s), { ...a[s], parts: c }, ...a.slice(s + 1)];
142
+ e((i) => [...i, { id: n, role: "assistant", parts: [], ...t }]);
143
+ const o = (i) => {
144
+ r || e((s) => {
145
+ const u = s.findIndex((d) => d.id === n);
146
+ if (u < 0) return s;
147
+ const c = i(s[u].parts);
148
+ return c === s[u].parts ? s : [...s.slice(0, u), { ...s[u], parts: c }, ...s.slice(u + 1)];
149
149
  });
150
- }, u = {
150
+ }, a = {
151
151
  id: n,
152
- appendText(o) {
153
- return i((a) => k(a, o)), u;
152
+ appendText(i) {
153
+ return o((s) => x(s, i)), a;
154
154
  },
155
- appendReasoning(o, a) {
156
- return i((s) => h(s, o, a)), u;
155
+ appendReasoning(i, s) {
156
+ return o((u) => T(u, i, s)), a;
157
157
  },
158
- upsertTool(o, a) {
159
- return i((s) => b(s, o, a)), u;
158
+ upsertTool(i, s) {
159
+ return o((u) => M(u, i, s)), a;
160
160
  },
161
161
  // Upsert, not append: keyed on envelope.id so a revised card replaces itself.
162
- addCard(o) {
163
- return i((a) => _(a, o)), u;
162
+ addCard(i) {
163
+ return o((s) => A(s, i)), a;
164
164
  },
165
- addSource(o) {
166
- return i((a) => [...a, { type: "source", source: o }]), u;
165
+ addSource(i) {
166
+ return o((s) => [...s, { type: "source", source: i }]), a;
167
167
  },
168
- addFile(o) {
169
- return i((a) => [...a, { type: "file", attachment: o }]), u;
168
+ addFile(i) {
169
+ return o((s) => [...s, { type: "file", attachment: i }]), a;
170
170
  },
171
171
  done() {
172
172
  r = !0;
173
173
  },
174
- abort(o) {
175
- i((a) => a.map((s) => s.type === "tool" && s.tool.state !== "output-available" ? { ...s, tool: { ...s.tool, state: "output-error", errorText: o } } : s)), r = !0;
174
+ abort(i) {
175
+ const s = (i == null ? void 0 : i.trim()) || void 0;
176
+ o((u) => {
177
+ let c = !1;
178
+ const d = u.map((l) => {
179
+ var y;
180
+ return l.type !== "tool" || l.tool.state === "output-available" ? l : l.tool.state === "output-error" && ((y = l.tool.errorText) != null && y.trim()) ? (c = !0, l) : (c = !0, { ...l, tool: { ...l.tool, state: "output-error", errorText: s } });
181
+ });
182
+ return c || !s ? d : [...d, { type: "text", text: s }];
183
+ }), r = !0;
176
184
  }
177
185
  };
178
- return u;
186
+ return a;
179
187
  }
180
- function v(t, e) {
188
+ function X(e, t) {
181
189
  const n = {
182
- id: t.id,
190
+ id: e.id,
183
191
  appendText(r) {
184
- return t.appendText(r), n;
192
+ return e.appendText(r), n;
185
193
  },
186
- appendReasoning(r, i) {
187
- return t.appendReasoning(r, i), n;
194
+ appendReasoning(r, o) {
195
+ return e.appendReasoning(r, o), n;
188
196
  },
189
- upsertTool(r, i) {
190
- return t.upsertTool(r, i), n;
197
+ upsertTool(r, o) {
198
+ return e.upsertTool(r, o), n;
191
199
  },
192
200
  addCard(r) {
193
- return t.addCard(r), n;
201
+ return e.addCard(r), n;
194
202
  },
195
203
  addSource(r) {
196
- return t.addSource(r), n;
204
+ return e.addSource(r), n;
197
205
  },
198
206
  addFile(r) {
199
- return t.addFile(r), n;
207
+ return e.addFile(r), n;
200
208
  },
201
209
  done() {
202
- t.done(), e();
210
+ e.done(), t();
203
211
  },
204
212
  abort(r) {
205
- t.abort(r), e();
213
+ e.abort(r), t();
206
214
  }
207
215
  };
208
216
  return n;
209
217
  }
210
- const K = "kai-mock", N = "_kai_mock", w = "no provider was contacted — this reply was generated locally by createMockResponder() from @kitn.ai/ui/state", m = `: kai-mock — NO PROVIDER WAS CONTACTED. ${w}.`, g = [
218
+ function D(e, t, n, r = {}) {
219
+ var i;
220
+ let o = !1;
221
+ const a = e.map((s) => {
222
+ if (s.id !== t) return s;
223
+ o = !0;
224
+ const u = { ...s, messages: n(s.messages) };
225
+ return r.touch ? r.touch(u) : u;
226
+ });
227
+ return o ? a : ((i = r.onDrop) == null || i.call(r, t), e);
228
+ }
229
+ function Z(e, t, n = {}) {
230
+ return (r) => {
231
+ e((o) => D(o, t, r, n));
232
+ };
233
+ }
234
+ function v(e) {
235
+ const t = /* @__PURE__ */ new Map(), n = () => Array.from(t.keys()), r = () => e == null ? void 0 : e(n());
236
+ return {
237
+ begin(o) {
238
+ var i;
239
+ (i = t.get(o)) == null || i.abort();
240
+ const a = new AbortController();
241
+ return t.set(o, a), r(), a;
242
+ },
243
+ end(o, a) {
244
+ t.get(o) === a && (t.delete(o), r());
245
+ },
246
+ abort(o) {
247
+ const a = t.get(o);
248
+ return a ? (a.abort(), t.delete(o), r(), !0) : !1;
249
+ },
250
+ isStreaming(o) {
251
+ return t.has(o);
252
+ },
253
+ streamingIds: n
254
+ };
255
+ }
256
+ function f(e) {
257
+ return typeof e == "object" && e !== null;
258
+ }
259
+ const K = {
260
+ text: (e) => typeof e.text == "string",
261
+ reasoning: (e) => typeof e.text == "string",
262
+ tool: (e) => f(e.tool),
263
+ card: (e) => f(e.envelope) && typeof e.envelope.type == "string" && typeof e.envelope.id == "string",
264
+ source: (e) => f(e.source),
265
+ file: (e) => f(e.attachment)
266
+ };
267
+ function N(e, t) {
268
+ if (!f(e) || typeof e.type != "string")
269
+ return t.push({ at: "part", reason: "not a part record", value: e }), null;
270
+ const n = K[e.type];
271
+ return n ? n(e) ? e : (t.push({ at: "part", reason: `missing or invalid payload for "${e.type}" part`, value: e }), null) : (t.push({ at: "part", reason: `unknown part type "${e.type}"`, value: e }), null);
272
+ }
273
+ function U(e, t) {
274
+ if (!f(e) || typeof e.id != "string" || e.role !== "user" && e.role !== "assistant" || !Array.isArray(e.parts))
275
+ return t.push({ at: "message", reason: "not a message record (id/role/parts)", value: e }), null;
276
+ const n = e.parts.map((o) => N(o, t)).filter((o) => o !== null);
277
+ if (n.length === 0)
278
+ return t.push({ at: "message", reason: "no readable parts survived", value: e }), null;
279
+ const r = { id: e.id, role: e.role, parts: n };
280
+ return (e.feedback === "like" || e.feedback === "dislike") && (r.feedback = e.feedback), f(e.avatar) && (r.avatar = e.avatar), Array.isArray(e.actions) && (r.actions = e.actions), r;
281
+ }
282
+ function ee(e) {
283
+ const t = [];
284
+ return Array.isArray(e) ? { messages: e.map((r) => U(r, t)).filter((r) => r !== null), dropped: t } : { messages: [], dropped: [{ at: "thread", reason: "stored thread is not an array", value: e }] };
285
+ }
286
+ function te(e, t) {
287
+ const n = t.setTimeout ?? ((c, d) => setTimeout(c, d)), r = t.clearTimeout ?? ((c) => clearTimeout(c));
288
+ let o, a = !1, i;
289
+ const s = () => {
290
+ a && (r(i), a = !1);
291
+ }, u = () => {
292
+ a = !1, e(o);
293
+ };
294
+ return {
295
+ schedule(c) {
296
+ o = c, s(), i = n(u, t.delayMs), a = !0;
297
+ },
298
+ flush() {
299
+ a && (s(), e(o));
300
+ },
301
+ cancel: s,
302
+ pending: () => a
303
+ };
304
+ }
305
+ const $ = "kai-mock", j = "_kai_mock", w = "no provider was contacted — this reply was generated locally by createMockResponder() from @kitn.ai/ui/state", h = `: kai-mock — NO PROVIDER WAS CONTACTED. ${w}.`, k = [
211
306
  "Hi! I'm a local mock — no backend, no API key, no provider was contacted. I'm streaming through the same parser a real model would, so what you're seeing is the real rendering path with a canned reply.",
212
307
  "Still the mock. Swap `createMockResponder()` for a `fetch('/api/chat', …)` and nothing else in this handler changes — that's the whole point of the seam.",
213
308
  "Mock again. Every frame I send is tagged `_kai_mock` and my usage reports zero tokens, so nothing here can be mistaken for a real turn."
214
309
  ];
215
- function P(t, e) {
216
- const n = t.split(/(\s+)/).filter((i) => i !== "");
217
- if (e <= 1) return n;
310
+ function L(e, t) {
311
+ const n = e.split(/(\s+)/).filter((o) => o !== "");
312
+ if (t <= 1) return n;
218
313
  const r = [];
219
- for (let i = 0; i < n.length; i += e)
220
- r.push(n.slice(i, i + e).join(""));
314
+ for (let o = 0; o < n.length; o += t)
315
+ r.push(n.slice(o, o + t).join(""));
221
316
  return r;
222
317
  }
223
- function p(t, e) {
318
+ function m(e, t) {
224
319
  return `data: ${JSON.stringify({
225
- [N]: w,
226
- id: t,
320
+ [j]: w,
321
+ id: e,
227
322
  object: "chat.completion.chunk",
228
- model: K,
229
- ...e
323
+ model: $,
324
+ ...t
230
325
  })}
231
326
 
232
327
  `;
233
328
  }
234
- const D = (t) => t > 0 ? new Promise((e) => setTimeout(e, t)) : Promise.resolve();
235
- function z(t = {}) {
329
+ const F = (e) => e > 0 ? new Promise((t) => setTimeout(t, e)) : Promise.resolve();
330
+ function ne(e = {}) {
236
331
  const {
237
- replies: e = g,
332
+ replies: t = k,
238
333
  delayMs: n = 24,
239
334
  chunkSize: r = 1,
240
- announce: i = !0
241
- } = t, u = e.length > 0 ? e : g;
242
- let o = 0, a = !1;
335
+ announce: o = !0
336
+ } = e, a = t.length > 0 ? t : k;
337
+ let i = 0, s = !1;
243
338
  return function(c) {
244
- const l = u[o % u.length], f = `kai-mock-${o + 1}`;
245
- return o += 1, {
339
+ const d = a[i % a.length], l = `kai-mock-${i + 1}`;
340
+ return i += 1, {
246
341
  async *[Symbol.asyncIterator]() {
247
- i && !a && (a = !0, console.info(`[kai] ${m.slice(2)}`)), yield `${m}
342
+ o && !s && (s = !0, console.info(`[kai] ${h.slice(2)}`)), yield `${h}
248
343
 
249
- `, yield p(f, { choices: [{ index: 0, delta: { role: "assistant" }, finish_reason: null }] });
250
- for (const x of P(l, r))
251
- await D(n), yield p(f, { choices: [{ index: 0, delta: { content: x }, finish_reason: null }] });
252
- yield p(f, {
344
+ `, yield m(l, { choices: [{ index: 0, delta: { role: "assistant" }, finish_reason: null }] });
345
+ for (const y of L(d, r))
346
+ await F(n), yield m(l, { choices: [{ index: 0, delta: { content: y }, finish_reason: null }] });
347
+ yield m(l, {
253
348
  choices: [{ index: 0, delta: {}, finish_reason: "stop" }],
254
349
  usage: { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 }
255
350
  }), yield `data: [DONE]
@@ -260,27 +355,32 @@ function z(t = {}) {
260
355
  };
261
356
  }
262
357
  export {
263
- g as DEFAULT_MOCK_REPLIES,
264
- m as MOCK_BANNER,
358
+ k as DEFAULT_MOCK_REPLIES,
359
+ h as MOCK_BANNER,
265
360
  w as MOCK_MARKER,
266
- N as MOCK_MARKER_KEY,
267
- K as MOCK_MODEL_ID,
268
- G as addSuggestion,
269
- L as appendMessage,
270
- h as appendReasoningPart,
271
- q as appendText,
272
- k as appendTextPart,
273
- y as classifyTool,
274
- W as createAssistantStream,
275
- z as createMockResponder,
276
- d as fingerprint,
277
- v as onStreamSettled,
278
- j as partsToText,
279
- Y as removeMessage,
280
- J as removeSuggestion,
281
- U as textMessage,
282
- F as updateMessage,
283
- _ as upsertCardPart,
284
- $ as upsertMessage,
285
- b as upsertToolPart
361
+ j as MOCK_MARKER_KEY,
362
+ $ as MOCK_MODEL_ID,
363
+ B as addSuggestion,
364
+ G as appendMessage,
365
+ T as appendReasoningPart,
366
+ z as appendText,
367
+ x as appendTextPart,
368
+ Z as bindThreadMessages,
369
+ g as classifyTool,
370
+ Q as createAssistantStream,
371
+ ne as createMockResponder,
372
+ te as createSaveScheduler,
373
+ v as createThreadSessions,
374
+ p as fingerprint,
375
+ X as onStreamSettled,
376
+ ee as parseStoredThread,
377
+ q as partsToText,
378
+ W as removeMessage,
379
+ H as removeSuggestion,
380
+ Y as textMessage,
381
+ V as updateMessage,
382
+ D as updateThreadMessages,
383
+ A as upsertCardPart,
384
+ J as upsertMessage,
385
+ M as upsertToolPart
286
386
  };
package/dist/types.d.ts CHANGED
@@ -27,9 +27,11 @@ export interface ConversationSummary {
27
27
  id: string;
28
28
  title: string;
29
29
  groupId?: string;
30
- scope: ConversationScope;
30
+ /** Only meaningful to scope-aware consumers; the list never reads it. */
31
+ scope?: ConversationScope;
31
32
  messageCount: number;
32
- lastMessageAt: string;
33
+ /** Fallback for the auto relative time when updatedAt is absent. */
34
+ lastMessageAt?: string;
33
35
  updatedAt: string;
34
36
  /** Right-aligned trailing text on the row — a count, status, or "days ago".
35
37
  * When omitted, a short relative time is auto-derived from `updatedAt`