@kitn.ai/ui 0.28.0 → 0.30.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 (615) hide show
  1. package/README.md +11 -7
  2. package/dist/{Icon-DObhsRtm.js → Icon-BzBET3E-.js} +1 -1
  3. package/dist/{action-icons-CcgNN2oT.js → action-icons-DaW2pU6m.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-D783iMJj.js +1 -0
  7. package/dist/arrow-left-0VLM5kyg.js +1 -0
  8. package/dist/artifact-DGjzHYUT.js +1 -0
  9. package/dist/{attachments-Qr4kg-2b.js → attachments-YvXHlg88.js} +1 -1
  10. package/dist/{audio-visualizer-DToYdfSc.js → audio-visualizer-9lz5IHsL.js} +1 -1
  11. package/dist/{badge-CdEu_jn2.js → badge-Dh_vp8A5.js} +1 -1
  12. package/dist/{bell-DQAAOpDz.js → bell-CT7_WUwS.js} +1 -1
  13. package/dist/{button-DkuOnGLy.js → button-C_3te6fm.js} +1 -1
  14. package/dist/{card-renderer-Jx70m6_l.js → card-renderer-DZVaGH2e.js} +1 -1
  15. package/dist/check-CiEOVnEN.js +1 -0
  16. package/dist/{checkbox-D7iRB3nL.js → checkbox-Bu2T2e0U.js} +1 -1
  17. package/dist/{checkbox-group-B2_rpoPM.js → checkbox-group-BiryEXPQ.js} +1 -1
  18. package/dist/chevron-down-CSobuZRG.js +1 -0
  19. package/dist/chevron-right-DR9ZAP-2.js +1 -0
  20. package/dist/{choice-card-m0BYqqOK.js → choice-card-CM6IjkmL.js} +1 -1
  21. package/dist/circle-BC66EYF7.js +1 -0
  22. package/dist/circle-check-BqmahW0O.js +1 -0
  23. package/dist/{circle-x-BPG0iPst.js → circle-x-Bk-dA5Wf.js} +1 -1
  24. package/dist/{code-block-ClMLKb7C.js → code-block-B26t-Q7q.js} +1 -1
  25. package/dist/{collapsible-B4DlWicL.js → collapsible-Bhc636Cf.js} +1 -1
  26. package/dist/components/builder-composer-triggers.d.ts +62 -0
  27. package/dist/components/builder-layout.d.ts +54 -0
  28. package/dist/components/builder-message-actions.d.ts +72 -0
  29. package/dist/components/builder-panel.d.ts +189 -0
  30. package/dist/components/builder-preview.d.ts +11 -0
  31. package/dist/components/builder-shell-controls.d.ts +69 -0
  32. package/dist/components/builder-skeleton.d.ts +58 -0
  33. package/dist/components/builder-start.d.ts +75 -0
  34. package/dist/components/builder-workspace-variants.d.ts +23 -0
  35. package/dist/components/captions.d.ts +66 -0
  36. package/dist/{composer-sQ0HcvyG.js → composer-DMI85B6j.js} +1 -1
  37. package/dist/{confirm-card-rQWDQsnC.js → confirm-card-B0YIAwXp.js} +1 -1
  38. package/dist/construct-cli.es.js +3 -3
  39. package/dist/construct.d.ts +5 -0
  40. package/dist/construct.js +327 -0
  41. package/dist/{context-0kg4ZX1J.js → context-DWgfhqWp.js} +1 -1
  42. package/dist/controllable-BagRpyHv.js +1 -0
  43. package/dist/{conversation-item-BxwQLaFJ.js → conversation-item-BsOsVGmT.js} +1 -1
  44. package/dist/{conversation-list-BCfGN1JU.js → conversation-list-aX3Vtc7L.js} +1 -1
  45. package/dist/{copy-n9u9rqpi.js → copy-BmEwsNhJ.js} +1 -1
  46. package/dist/core-C8fzo39E.js +1 -12
  47. package/dist/{create-tween-uPkArjIG.js → create-tween-CNOAU3Fx.js} +1 -1
  48. package/dist/{create-tween-C-q-JCM-.js → create-tween-WfqiENls.js} +1 -1
  49. package/dist/{create-tween-CRrJXxBd.js → create-tween-wlFtW9Kh.js} +1 -1
  50. package/dist/{create-tween-DZ3RRDHD.js → create-tween-zt79ba32.js} +1 -1
  51. package/dist/{default-input-CaMrJkgH.js → default-input-DMV5Eaze.js} +1 -1
  52. package/dist/define-CI0y3eE4.js +1 -0
  53. package/dist/define.js +40 -40
  54. package/dist/define.server.js +45 -45
  55. package/dist/{disclosure-WUImBbDv.js → disclosure-NnACBxsC.js} +1 -1
  56. package/dist/{dropdown-wZVeJOMd.js → dropdown-DT7G0RGR.js} +1 -1
  57. package/dist/elements/agent-card.js +1 -1
  58. package/dist/elements/artifact.js +1 -1
  59. package/dist/elements/attachments.js +1 -1
  60. package/dist/elements/audio-visualizer.js +1 -1
  61. package/dist/elements/avatar.js +1 -1
  62. package/dist/elements/badge.js +1 -1
  63. package/dist/elements/button.js +1 -1
  64. package/dist/elements/card.js +1 -1
  65. package/dist/elements/cards.js +1 -1
  66. package/dist/elements/chain-of-thought.js +1 -1
  67. package/dist/elements/chat-scope-picker.js +1 -1
  68. package/dist/elements/chat-workspace.js +1 -1
  69. package/dist/elements/chat.js +1 -1
  70. package/dist/elements/checkbox-group.js +1 -1
  71. package/dist/elements/checkbox.js +1 -1
  72. package/dist/elements/checkpoint.js +1 -1
  73. package/dist/elements/choice.js +1 -1
  74. package/dist/elements/coachmark.js +1 -1
  75. package/dist/elements/code-block.js +1 -1
  76. package/dist/elements/command.js +1 -1
  77. package/dist/elements/compare.js +1 -1
  78. package/dist/elements/composer.js +1 -1
  79. package/dist/elements/confirm-card.js +1 -1
  80. package/dist/elements/context-meter.js +1 -1
  81. package/dist/elements/conversation-item.js +1 -1
  82. package/dist/elements/conversation-list.js +1 -1
  83. package/dist/elements/dialog.js +1 -1
  84. package/dist/elements/dock.js +1 -1
  85. package/dist/elements/dropdown.js +1 -1
  86. package/dist/elements/editable-label.js +1 -1
  87. package/dist/elements/embed.js +1 -1
  88. package/dist/elements/empty.js +1 -1
  89. package/dist/elements/feedback-bar.js +1 -1
  90. package/dist/elements/file-tree.js +1 -1
  91. package/dist/elements/file-upload.js +1 -1
  92. package/dist/elements/form.js +1 -1
  93. package/dist/elements/hover-card.js +1 -1
  94. package/dist/elements/icon.js +1 -1
  95. package/dist/elements/image.js +1 -1
  96. package/dist/elements/input.js +1 -1
  97. package/dist/elements/kbd.js +1 -1
  98. package/dist/elements/link-preview.js +1 -1
  99. package/dist/elements/loader.js +1 -1
  100. package/dist/elements/markdown.js +1 -1
  101. package/dist/elements/menu.js +1 -1
  102. package/dist/elements/message-skills.js +1 -1
  103. package/dist/elements/message.js +1 -1
  104. package/dist/elements/model-switcher.js +1 -1
  105. package/dist/elements/nav.js +1 -1
  106. package/dist/elements/notice.js +1 -1
  107. package/dist/elements/pane-grid.js +1 -1
  108. package/dist/elements/pane-group.js +1 -1
  109. package/dist/elements/pane.js +1 -1
  110. package/dist/elements/popover.js +1 -1
  111. package/dist/elements/progress-bar.js +1 -1
  112. package/dist/elements/prompt-dock.js +1 -1
  113. package/dist/elements/prompt-input.js +1 -1
  114. package/dist/elements/prompt-suggestions.js +1 -1
  115. package/dist/elements/radio-group.js +1 -1
  116. package/dist/elements/reasoning.js +1 -1
  117. package/dist/elements/remote.js +1 -1
  118. package/dist/elements/resizable.js +1 -1
  119. package/dist/elements/response-stream.js +1 -1
  120. package/dist/elements/screen.js +1 -1
  121. package/dist/elements/scroll-area.js +1 -1
  122. package/dist/elements/scroll-button.js +1 -1
  123. package/dist/elements/search.js +1 -1
  124. package/dist/elements/segmented.js +1 -1
  125. package/dist/elements/select.js +1 -1
  126. package/dist/elements/separator.js +1 -1
  127. package/dist/elements/setting-item.js +1 -1
  128. package/dist/elements/settings-group.js +1 -1
  129. package/dist/elements/skeleton.js +1 -1
  130. package/dist/elements/slider.js +1 -1
  131. package/dist/elements/source.js +1 -1
  132. package/dist/elements/status.js +1 -1
  133. package/dist/elements/switch.js +1 -1
  134. package/dist/elements/tabs.js +1 -1
  135. package/dist/elements/tasks.js +1 -1
  136. package/dist/elements/text-shimmer.js +1 -1
  137. package/dist/elements/thinking-bar.js +1 -1
  138. package/dist/elements/thread.js +1 -1
  139. package/dist/elements/toast.js +1 -1
  140. package/dist/elements/tool.js +1 -1
  141. package/dist/elements/tooltip.js +1 -1
  142. package/dist/elements/voice-input.js +1 -1
  143. package/dist/elements/voice-output.js +1 -1
  144. package/dist/{ellipsis-CbOpJnU3.js → ellipsis-6pJ7SxYT.js} +1 -1
  145. package/dist/{embed-CrfjkbUG.js → embed-BMje-nxj.js} +1 -1
  146. package/dist/engine-javascript-C1x7zo1_.js +1 -141
  147. package/dist/{external-link-ByXAwBBQ.js → external-link-Beh9DKeR.js} +1 -1
  148. package/dist/{file-text-DMib2qwt.js → file-text-D1GPfZ8Q.js} +1 -1
  149. package/dist/{file-tree-CJqM2aP7.js → file-tree-Dwj2lqg-.js} +1 -1
  150. package/dist/{folder-_BAb929C.js → folder-b6D8x1DY.js} +1 -1
  151. package/dist/{form-DSZgZQZk.js → form-DWgdxDXu.js} +1 -1
  152. package/dist/{hover-card-BQbul9eq.js → hover-card-CWRkqm40.js} +1 -1
  153. package/dist/{icon-CdcfRhYI.js → icon-CL0jdhsf.js} +1 -1
  154. package/dist/index.js +1741 -1725
  155. package/dist/index.server.js +1582 -1566
  156. package/dist/{info-DsFjGuI_.js → info-0cOUherQ.js} +1 -1
  157. package/dist/{input-DKbmkMos.js → input-BH6Ru91Q.js} +1 -1
  158. package/dist/kai.es.js +1 -1
  159. package/dist/{kbd-PvdGhX4s.js → kbd-DRAnVtNX.js} +1 -1
  160. package/dist/{link-zF8PzWfF.js → link-Dlr0vssB.js} +1 -1
  161. package/dist/{link-preview-DbM1866N.js → link-preview-DODgRyV9.js} +1 -1
  162. package/dist/loader-KvJB6NrT.js +1 -0
  163. package/dist/{markdown-LMvmAyBk.js → markdown-DX9tuJVj.js} +1 -1
  164. package/dist/mcp.es.js +9 -5
  165. package/dist/{message-BYZECyek.js → message-BqQ7Ot5q.js} +1 -1
  166. package/dist/{message-BSsgvHvf.js → message-DkaGfBd8.js} +1 -1
  167. package/dist/message-circle-BPpp5QKv.js +1 -0
  168. package/dist/message-square-BLbsd9BJ.js +1 -0
  169. package/dist/{minimize-2-BQRoBV1V.js → minimize-2-CyOHJwcN.js} +1 -1
  170. package/dist/{model-switcher-CMpCOYcB.js → model-switcher-0hrKDiK2.js} +1 -1
  171. package/dist/{overlay-Cb-MkyDa.js → overlay-DBMFXie6.js} +1 -1
  172. package/dist/{panel-right-i8warFxT.js → panel-right-t8SWJL6e.js} +1 -1
  173. package/dist/{paperclip-ByY3UVO6.js → paperclip-CdzuOjbU.js} +1 -1
  174. package/dist/play-BXy1u7rW.js +1 -0
  175. package/dist/primitives/use-auto-resize.d.ts +11 -0
  176. package/dist/{progress-bar-jVAHvMUf.js → progress-bar-CiBtxMWT.js} +1 -1
  177. package/dist/{prompt-suggestion-CD-qtNgC.js → prompt-suggestion-I_DHP21i.js} +1 -1
  178. package/dist/{radio-BsoBMhkF.js → radio-C_p3n39l.js} +1 -1
  179. package/dist/{reasoning-4kBPtlTx.js → reasoning-BDwy_tIe.js} +1 -1
  180. package/dist/register-impl-DvEnhIxx.js +424 -0
  181. package/dist/{resizable-uPmY9VY-.js → resizable-SYC-fStM.js} +1 -1
  182. package/dist/{rotate-ccw-B2xn93py.js → rotate-ccw-B1nwmwuY.js} +1 -1
  183. package/dist/{rotate-cw-CMVLoCyH.js → rotate-cw-CLAnBcm1.js} +1 -1
  184. package/dist/{scroll-area-BqLUo8ZZ.js → scroll-area-zRyXoLhI.js} +1 -1
  185. package/dist/{scroll-button-DslXiJyL.js → scroll-button-jzrbYCG9.js} +1 -1
  186. package/dist/{select-2cLRtPGT.js → select-DM-0nEe0.js} +1 -1
  187. package/dist/{separator-BWQtNJcM.js → separator-BToOOoOt.js} +1 -1
  188. package/dist/{settings-BBR63jLg.js → settings-PaGo_S4U.js} +1 -1
  189. package/dist/{settings-group-B2ciy-Iw.js → settings-group-BFXGIfXq.js} +1 -1
  190. package/dist/{skeleton-CkHI-HgC.js → skeleton-DYpmFnnm.js} +1 -1
  191. package/dist/{slider-DDR9U-i0.js → slider-ebutAmkQ.js} +1 -1
  192. package/dist/{solid-DruVOXnf.js → solid-15v_3WVL.js} +3563 -3412
  193. package/dist/{solid-BzCFdL25.js → solid-5P-otgdi.js} +4502 -4296
  194. package/dist/solid.d.ts +6 -0
  195. package/dist/solid.js +259 -254
  196. package/dist/solid.server.js +259 -254
  197. package/dist/{source-GEnFF528.js → source-c1gpRl9h.js} +1 -1
  198. package/dist/{star-CilHq8GP.js → star-pcV_3LqF.js} +1 -1
  199. package/dist/{store-Ciyk6eZG.js → store-CSgbFFCg.js} +1 -1
  200. package/dist/{switch-KkeQIbuH.js → switch-Bh2OdLV2.js} +1 -1
  201. package/dist/{tasks-card-BrN4bggJ.js → tasks-card-CbqQAn2S.js} +1 -1
  202. package/dist/text-shimmer-BSzgEnDH.js +1 -0
  203. package/dist/textarea-DrYNt_0z.js +1 -0
  204. package/dist/theme.tokens.css +22 -21
  205. package/dist/{thumbs-up-CsT9Wzb9.js → thumbs-up-BL3-NenK.js} +1 -1
  206. package/dist/{toast-store-tgK6MuMv.js → toast-store-DkOlYczt.js} +1 -1
  207. package/dist/{tool-DzUjIBT8.js → tool-CeIWUVUe.js} +1 -1
  208. package/dist/{tooltip-Bkkg_4t0.js → tooltip-GA-nmg06.js} +1 -1
  209. package/dist/{trash-2-jBKxjGGQ.js → trash-2-CT66QWlm.js} +1 -1
  210. package/dist/{triangle-alert-DlQ68ppf.js → triangle-alert-CeHLWxhD.js} +1 -1
  211. package/dist/ui/color-field.d.ts +48 -0
  212. package/dist/ui/textarea.d.ts +4 -0
  213. package/dist/ui/toggle-chip.d.ts +40 -0
  214. package/dist/{upload-TcAHXv9W.js → upload-9Csb0F0J.js} +1 -1
  215. package/dist/{use-card-resolution-DaZqAdWf.js → use-card-resolution-Zg0a08Z-.js} +1 -1
  216. package/dist/{variant-aurora-DbW_OWL2.js → variant-aurora-4VBQHIKV.js} +1 -1
  217. package/dist/{variant-aurora-CNmfHhcx.js → variant-aurora-DBeCAQNk.js} +2 -2
  218. package/dist/{variant-aurora-D6GsdTPA.js → variant-aurora-FzHVXHby.js} +2 -2
  219. package/dist/{variant-aurora-BhLuYxJR.js → variant-aurora-LE3fqxgw.js} +1 -1
  220. package/dist/{variant-custom-BvYHR62b.js → variant-custom-AFRGcOBS.js} +1 -1
  221. package/dist/{variant-custom-DV2x254s.js → variant-custom-BQkNuPpE.js} +2 -2
  222. package/dist/{variant-custom-BRvaNHSi.js → variant-custom-DI5R0rln.js} +1 -1
  223. package/dist/{variant-custom-DMTrEO5w.js → variant-custom-WWnrrRHS.js} +2 -2
  224. package/dist/{variant-wave-CyBueXj9.js → variant-wave-DUCbH5oI.js} +2 -2
  225. package/dist/{variant-wave-BNMGrDfj.js → variant-wave-DuQV7DhQ.js} +2 -2
  226. package/dist/{variant-wave-BpDd8t3Z.js → variant-wave-nSI2sfII.js} +1 -1
  227. package/dist/{variant-wave-sp-qwsdI.js → variant-wave-wTP5v_jU.js} +1 -1
  228. package/dist/x-eiO9V6J6.js +1 -0
  229. package/{src/elements/styles.css → kit-base.css} +27 -44
  230. package/package.json +32 -17
  231. package/solid.css +33 -0
  232. package/theme.css +39 -23
  233. package/bin/route.test.js +0 -58
  234. package/dist/arrow-down-CjRU3JgV.js +0 -1
  235. package/dist/arrow-left-Bnpb1UEW.js +0 -1
  236. package/dist/artifact-Bwt7OgcR.js +0 -1
  237. package/dist/check-njkVdZu2.js +0 -1
  238. package/dist/chevron-down-B72s6PXR.js +0 -1
  239. package/dist/chevron-right-BatuHzUm.js +0 -1
  240. package/dist/circle-check-B62pODB3.js +0 -1
  241. package/dist/circle-zx0ByzY9.js +0 -1
  242. package/dist/controllable-CnGpMF6r.js +0 -1
  243. package/dist/define-By-uL588.js +0 -1
  244. package/dist/loader-BM4CEz4G.js +0 -1
  245. package/dist/message-circle-DruwObfX.js +0 -1
  246. package/dist/message-square-BG6q6mlm.js +0 -1
  247. package/dist/play-BvKKq3fX.js +0 -1
  248. package/dist/register-impl-B1hLkrI8.js +0 -424
  249. package/dist/text-shimmer-Dcj1MHuq.js +0 -1
  250. package/dist/textarea-Dpvbngbg.js +0 -1
  251. package/dist/x-Z5UntkIJ.js +0 -1
  252. package/src/agent-tooling/README.md +0 -192
  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 -147
  263. package/src/agent-tooling/construct/codegen.ts +0 -1635
  264. package/src/agent-tooling/construct/construct.v1.schema.json +0 -319
  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 -32
  269. package/src/agent-tooling/construct/schema.ts +0 -452
  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 -1014
  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 -241
  336. package/src/components/conversation-list.tsx +0 -429
  337. package/src/components/conversation-panel.tsx +0 -118
  338. package/src/components/dismissed-stub.tsx +0 -80
  339. package/src/components/embed.tsx +0 -200
  340. package/src/components/empty.tsx +0 -177
  341. package/src/components/feedback-bar.tsx +0 -166
  342. package/src/components/file-tree.tsx +0 -530
  343. package/src/components/file-upload.tsx +0 -167
  344. package/src/components/form-widgets.tsx +0 -525
  345. package/src/components/form.tsx +0 -1296
  346. package/src/components/home-panel.tsx +0 -159
  347. package/src/components/image.tsx +0 -65
  348. package/src/components/link-preview.tsx +0 -195
  349. package/src/components/loader.tsx +0 -367
  350. package/src/components/markdown.tsx +0 -162
  351. package/src/components/message-skills.tsx +0 -40
  352. package/src/components/message.tsx +0 -765
  353. package/src/components/model-switcher.tsx +0 -132
  354. package/src/components/prompt-input.tsx +0 -188
  355. package/src/components/prompt-suggestion.tsx +0 -150
  356. package/src/components/reasoning.tsx +0 -293
  357. package/src/components/response-compare-types.ts +0 -152
  358. package/src/components/response-compare.tsx +0 -455
  359. package/src/components/response-stream.tsx +0 -109
  360. package/src/components/screen.tsx +0 -181
  361. package/src/components/scroll-button.tsx +0 -93
  362. package/src/components/source.tsx +0 -192
  363. package/src/components/tasks-card.tsx +0 -801
  364. package/src/components/text-shimmer.tsx +0 -37
  365. package/src/components/thinking-bar.tsx +0 -50
  366. package/src/components/thread.tsx +0 -228
  367. package/src/components/toast.tsx +0 -503
  368. package/src/components/tool-classify.ts +0 -26
  369. package/src/components/tool-types.ts +0 -49
  370. package/src/components/tool.tsx +0 -190
  371. package/src/components/use-card-resolution.ts +0 -44
  372. package/src/components/voice-input.tsx +0 -222
  373. package/src/components/voice-output.tsx +0 -242
  374. package/src/components/widget-tab-bar.tsx +0 -73
  375. package/src/components/workspace-shell.tsx +0 -285
  376. package/src/diagnostics/hook.ts +0 -352
  377. package/src/diagnostics/index.ts +0 -82
  378. package/src/diagnostics/report-request.ts +0 -296
  379. package/src/elements/agent-card.tsx +0 -67
  380. package/src/elements/artifact.tsx +0 -194
  381. package/src/elements/attachments.tsx +0 -140
  382. package/src/elements/audio-visualizer.tsx +0 -227
  383. package/src/elements/autoloader.ts +0 -89
  384. package/src/elements/avatar.tsx +0 -33
  385. package/src/elements/badge.tsx +0 -32
  386. package/src/elements/button.tsx +0 -149
  387. package/src/elements/card.tsx +0 -133
  388. package/src/elements/cards.tsx +0 -266
  389. package/src/elements/chain-of-thought.tsx +0 -141
  390. package/src/elements/chat-scope-picker.tsx +0 -65
  391. package/src/elements/chat-types.ts +0 -102
  392. package/src/elements/chat-workspace.tsx +0 -188
  393. package/src/elements/chat.tsx +0 -304
  394. package/src/elements/checkbox-group.tsx +0 -164
  395. package/src/elements/checkbox.tsx +0 -134
  396. package/src/elements/checkpoint.tsx +0 -47
  397. package/src/elements/choice.tsx +0 -100
  398. package/src/elements/coachmark.tsx +0 -90
  399. package/src/elements/code-block.tsx +0 -60
  400. package/src/elements/command.tsx +0 -197
  401. package/src/elements/compare.tsx +0 -111
  402. package/src/elements/compiled.css +0 -2
  403. package/src/elements/composer.tsx +0 -162
  404. package/src/elements/confirm-card.tsx +0 -76
  405. package/src/elements/context-meter.tsx +0 -107
  406. package/src/elements/conversation-item.tsx +0 -120
  407. package/src/elements/conversation-list.tsx +0 -203
  408. package/src/elements/css.ts +0 -5
  409. package/src/elements/default-input.tsx +0 -392
  410. package/src/elements/define-entry.ts +0 -12
  411. package/src/elements/define.tsx +0 -563
  412. package/src/elements/diagnostic-events.ts +0 -114
  413. package/src/elements/dialog.tsx +0 -145
  414. package/src/elements/disclosure.ts +0 -95
  415. package/src/elements/dock.tsx +0 -215
  416. package/src/elements/dropdown.tsx +0 -123
  417. package/src/elements/editable-label.tsx +0 -140
  418. package/src/elements/element-data-types.ts +0 -152
  419. package/src/elements/element-diagnostics.ts +0 -392
  420. package/src/elements/element-manifest.json +0 -354
  421. package/src/elements/element-nonscalar.json +0 -187
  422. package/src/elements/element-types.d.ts +0 -4353
  423. package/src/elements/embed.tsx +0 -35
  424. package/src/elements/empty.tsx +0 -29
  425. package/src/elements/feedback-bar.tsx +0 -66
  426. package/src/elements/file-tree.tsx +0 -62
  427. package/src/elements/file-upload.tsx +0 -44
  428. package/src/elements/form.tsx +0 -94
  429. package/src/elements/hover-card.tsx +0 -80
  430. package/src/elements/icon.tsx +0 -41
  431. package/src/elements/image.tsx +0 -32
  432. package/src/elements/input.tsx +0 -492
  433. package/src/elements/kbd.tsx +0 -45
  434. package/src/elements/link-preview.tsx +0 -34
  435. package/src/elements/loader.tsx +0 -25
  436. package/src/elements/markdown.tsx +0 -38
  437. package/src/elements/menu.tsx +0 -241
  438. package/src/elements/message-skills.tsx +0 -83
  439. package/src/elements/message.tsx +0 -361
  440. package/src/elements/model-switcher.tsx +0 -121
  441. package/src/elements/nav.tsx +0 -87
  442. package/src/elements/notice.tsx +0 -53
  443. package/src/elements/pane-grid.tsx +0 -111
  444. package/src/elements/pane-group.tsx +0 -119
  445. package/src/elements/pane.tsx +0 -129
  446. package/src/elements/popover.tsx +0 -81
  447. package/src/elements/progress-bar.tsx +0 -39
  448. package/src/elements/prompt-dock.tsx +0 -82
  449. package/src/elements/prompt-input.tsx +0 -240
  450. package/src/elements/prompt-suggestions.tsx +0 -113
  451. package/src/elements/radio-group.tsx +0 -129
  452. package/src/elements/reasoning.tsx +0 -71
  453. package/src/elements/register-impl.ts +0 -148
  454. package/src/elements/register.ts +0 -76
  455. package/src/elements/remote.tsx +0 -225
  456. package/src/elements/resizable.globals.d.ts +0 -36
  457. package/src/elements/resizable.tsx +0 -704
  458. package/src/elements/response-stream.tsx +0 -40
  459. package/src/elements/screen.tsx +0 -90
  460. package/src/elements/scroll-area.tsx +0 -33
  461. package/src/elements/scroll-button.tsx +0 -179
  462. package/src/elements/search.tsx +0 -185
  463. package/src/elements/segmented.tsx +0 -129
  464. package/src/elements/select.tsx +0 -165
  465. package/src/elements/separator.tsx +0 -36
  466. package/src/elements/setting-item.tsx +0 -50
  467. package/src/elements/settings-group.tsx +0 -37
  468. package/src/elements/skeleton.tsx +0 -45
  469. package/src/elements/slider.tsx +0 -171
  470. package/src/elements/slot-text.ts +0 -73
  471. package/src/elements/slots.ts +0 -787
  472. package/src/elements/source.tsx +0 -126
  473. package/src/elements/status.tsx +0 -42
  474. package/src/elements/switch.tsx +0 -118
  475. package/src/elements/tabs.tsx +0 -95
  476. package/src/elements/tasks.tsx +0 -103
  477. package/src/elements/text-shimmer.tsx +0 -28
  478. package/src/elements/thinking-bar.tsx +0 -43
  479. package/src/elements/thread.tsx +0 -139
  480. package/src/elements/toast.tsx +0 -106
  481. package/src/elements/tool.tsx +0 -78
  482. package/src/elements/tooltip.tsx +0 -85
  483. package/src/elements/validate-messages.ts +0 -76
  484. package/src/elements/voice-input.tsx +0 -100
  485. package/src/elements/voice-output.tsx +0 -82
  486. package/src/index.ts +0 -430
  487. package/src/primitives/audio-bands.ts +0 -174
  488. package/src/primitives/card-component-types.ts +0 -63
  489. package/src/primitives/card-contract.ts +0 -80
  490. package/src/primitives/card-data-types.ts +0 -361
  491. package/src/primitives/card-host.tsx +0 -37
  492. package/src/primitives/card-recovery.ts +0 -160
  493. package/src/primitives/card-registry.tsx +0 -78
  494. package/src/primitives/card-resolution.ts +0 -36
  495. package/src/primitives/card-routing.ts +0 -85
  496. package/src/primitives/card-schemas/artifact.schema.json +0 -92
  497. package/src/primitives/card-schemas/card-envelope.schema.json +0 -14
  498. package/src/primitives/card-schemas/card-event.schema.json +0 -12
  499. package/src/primitives/card-schemas/choice.schema.json +0 -75
  500. package/src/primitives/card-schemas/confirm.schema.json +0 -65
  501. package/src/primitives/card-schemas/embed.schema.json +0 -63
  502. package/src/primitives/card-schemas/form.result.schema.json +0 -7
  503. package/src/primitives/card-schemas/form.schema.json +0 -53
  504. package/src/primitives/card-schemas/link.schema.json +0 -54
  505. package/src/primitives/card-schemas/tasks.result.schema.json +0 -16
  506. package/src/primitives/card-schemas/tasks.schema.json +0 -83
  507. package/src/primitives/card-tags.ts +0 -61
  508. package/src/primitives/card-validate-cards.ts +0 -255
  509. package/src/primitives/card-validate-schemas.ts +0 -58
  510. package/src/primitives/card-validate.ts +0 -131
  511. package/src/primitives/chat-config.tsx +0 -103
  512. package/src/primitives/composer-model.ts +0 -49
  513. package/src/primitives/composer-triggers.ts +0 -35
  514. package/src/primitives/controllable.ts +0 -21
  515. package/src/primitives/conversation-store.ts +0 -248
  516. package/src/primitives/create-kai-chat.ts +0 -66
  517. package/src/primitives/create-tween.ts +0 -266
  518. package/src/primitives/embed-providers.ts +0 -254
  519. package/src/primitives/field-mask.ts +0 -256
  520. package/src/primitives/field-semantics.ts +0 -115
  521. package/src/primitives/highlighter.ts +0 -157
  522. package/src/primitives/input-mask.ts +0 -853
  523. package/src/primitives/link-preview.ts +0 -87
  524. package/src/primitives/message-feedback.ts +0 -124
  525. package/src/primitives/pdf-preview.ts +0 -121
  526. package/src/primitives/toast-store.ts +0 -338
  527. package/src/primitives/url-scheme-policy.ts +0 -70
  528. package/src/primitives/use-audio-analysis.ts +0 -340
  529. package/src/primitives/use-auto-resize.ts +0 -31
  530. package/src/primitives/use-resize-observer.ts +0 -45
  531. package/src/primitives/use-sequencer.ts +0 -72
  532. package/src/primitives/use-speech-recognition.ts +0 -146
  533. package/src/primitives/use-stick-to-bottom.ts +0 -75
  534. package/src/primitives/use-text-stream.ts +0 -143
  535. package/src/primitives/use-voice-recorder.ts +0 -62
  536. package/src/primitives/visualizer-sequences.ts +0 -350
  537. package/src/remote/host-embed.ts +0 -345
  538. package/src/remote/index.ts +0 -2
  539. package/src/remote/origin.ts +0 -30
  540. package/src/remote/provider-runtime.ts +0 -262
  541. package/src/remote/provider.ts +0 -2
  542. package/src/remote/validate.ts +0 -22
  543. package/src/remote/version.ts +0 -12
  544. package/src/remote/wire.ts +0 -48
  545. package/src/schemas/from-tool-call.ts +0 -151
  546. package/src/schemas/index.ts +0 -341
  547. package/src/schemas/provider-subsets.ts +0 -538
  548. package/src/schemas/registry.ts +0 -355
  549. package/src/schemas/tool-defs.ts +0 -793
  550. package/src/solid.ts +0 -173
  551. package/src/state/index.ts +0 -44
  552. package/src/state/messages.ts +0 -53
  553. package/src/state/mock.ts +0 -297
  554. package/src/state/parts.ts +0 -295
  555. package/src/state/persistence.ts +0 -180
  556. package/src/state/stream.ts +0 -246
  557. package/src/state/suggestions.ts +0 -9
  558. package/src/state/threads.ts +0 -142
  559. package/src/test-utils/fake-clock.ts +0 -88
  560. package/src/types.ts +0 -95
  561. package/src/ui/action-icons.ts +0 -53
  562. package/src/ui/agent-card.tsx +0 -218
  563. package/src/ui/avatar.tsx +0 -23
  564. package/src/ui/badge.tsx +0 -21
  565. package/src/ui/button.tsx +0 -49
  566. package/src/ui/card.tsx +0 -245
  567. package/src/ui/checkbox-group.tsx +0 -153
  568. package/src/ui/checkbox.tsx +0 -63
  569. package/src/ui/collapsible.tsx +0 -163
  570. package/src/ui/command.tsx +0 -103
  571. package/src/ui/dialog.tsx +0 -223
  572. package/src/ui/dock.tsx +0 -630
  573. package/src/ui/dropdown.tsx +0 -636
  574. package/src/ui/editable-label.tsx +0 -112
  575. package/src/ui/hover-card.tsx +0 -345
  576. package/src/ui/icon.tsx +0 -167
  577. package/src/ui/input.tsx +0 -391
  578. package/src/ui/kbd.tsx +0 -118
  579. package/src/ui/nav.tsx +0 -282
  580. package/src/ui/notice.tsx +0 -84
  581. package/src/ui/overlay.tsx +0 -277
  582. package/src/ui/pane-grid.tsx +0 -117
  583. package/src/ui/pane-group.tsx +0 -291
  584. package/src/ui/pane.tsx +0 -193
  585. package/src/ui/popover.tsx +0 -106
  586. package/src/ui/progress-bar.tsx +0 -83
  587. package/src/ui/prompt-dock.tsx +0 -145
  588. package/src/ui/radio.tsx +0 -150
  589. package/src/ui/resizable.tsx +0 -693
  590. package/src/ui/scroll-area.tsx +0 -26
  591. package/src/ui/segmented.tsx +0 -109
  592. package/src/ui/select.tsx +0 -168
  593. package/src/ui/separator.tsx +0 -10
  594. package/src/ui/settings-group.tsx +0 -67
  595. package/src/ui/skeleton.tsx +0 -73
  596. package/src/ui/slider.tsx +0 -178
  597. package/src/ui/status.tsx +0 -48
  598. package/src/ui/switch.tsx +0 -119
  599. package/src/ui/tabs.tsx +0 -168
  600. package/src/ui/textarea.tsx +0 -21
  601. package/src/ui/tooltip.tsx +0 -118
  602. package/src/utils/cn.ts +0 -30
  603. package/src/wire/chunk.ts +0 -248
  604. package/src/wire/consume.ts +0 -599
  605. package/src/wire/diagnostics.ts +0 -727
  606. package/src/wire/encode-probe.ts +0 -214
  607. package/src/wire/encode.ts +0 -947
  608. package/src/wire/files.ts +0 -342
  609. package/src/wire/formats/anthropic.ts +0 -274
  610. package/src/wire/formats/openai.ts +0 -228
  611. package/src/wire/index.ts +0 -95
  612. package/src/wire/media-types.ts +0 -344
  613. package/src/wire/read.ts +0 -396
  614. package/src/wire/sink-helpers.ts +0 -50
  615. package/src/wire/sse.ts +0 -153
@@ -1,139 +0,0 @@
1
- import { createSignal, onMount, onCleanup } from 'solid-js';
2
- import { defineWebComponent } from './define';
3
- import { readSlots, THREAD_SLOTS } from './slots';
4
- import { Thread, type ThreadController } from '../components/thread';
5
- import { cardComponentsFromTags } from './message';
6
- import { createMessagesGuard } from './validate-messages';
7
- import type { ChatMessage } from './chat-types';
8
- import type { ProseSize } from '../primitives/chat-config';
9
-
10
- interface Props extends Record<string, unknown> {
11
- /** The full message thread to render, newest last. Each entry carries its role,
12
- * ordered `parts`, and optional actions/avatar/feedback. Set as a JS
13
- * property (`el.messages = [...]`); a NEW array reference per streaming chunk
14
- * re-renders (mutating in place does not). */
15
- messages?: ChatMessage[];
16
- /** Show a typing indicator on the pending assistant turn. Set it while
17
- * awaiting the assistant's reply. */
18
- loading?: boolean;
19
- /** Body/prose font scale for rendered markdown (`'xs' | 'sm' | 'base' | 'lg'`).
20
- * Defaults to `'sm'`. */
21
- proseSize?: ProseSize;
22
- /** Shiki theme name for syntax-highlighted code blocks (e.g.
23
- * `'github-dark-dimmed'`). */
24
- codeTheme?: string;
25
- /** Enable Shiki syntax highlighting in code blocks. Turn off to render plain
26
- * `<pre>` blocks (lighter, no highlighter load). Default true. */
27
- codeHighlight?: boolean;
28
- /** Whether each message's action bar is always visible (`'always'`, default) or
29
- * only revealed on hover of that message row (`'hover'`). */
30
- actionsReveal?: 'always' | 'hover';
31
- /** Show the scroll-to-bottom button inside the scroll area. Default true. */
32
- scrollButton?: boolean;
33
- /** Extra classes applied to the thread's inner root. */
34
- class?: string;
35
- /** Optional card type -> custom-element tag overrides/additions for `card`
36
- * parts (merged over the built-ins). Property: `el.cardTypes`. Typed as a
37
- * plain string map (not the `CardTagMap` alias) so the generated React
38
- * wrapper inlines it instead of emitting an unresolved named type. */
39
- cardTypes?: Record<string, string>;
40
- /** JSON Schemas for the card types this app renders, keyed by envelope type. The
41
- * companion of `cardTypes`, which says what DRAWS a card while this says what a
42
- * VALID one looks like. An OBJECT, so it is a JS property only: `el.cardSchemas
43
- * = { 'pricing-table': pricingSchema }`, never an attribute.
44
- * `createCardRegistry(...).validationSchemas` is exactly this shape.
45
- *
46
- * Without it the kit validates its own seven built-ins and leaves your own card
47
- * type, the one your app actually cares about, as the only unchecked thing on
48
- * screen. A schema here WINS over a built-in of the same name.
49
- *
50
- * Typed `Record<string, object>` rather than `Record<string, JsonSchema>`
51
- * deliberately: an imported `.json` schema widens `"type"` to `string`, and an
52
- * authored one carries `$schema`/`title`/`description`/`additionalProperties`,
53
- * so the tighter type would reject both of the normal ways to supply one. */
54
- cardSchemas?: Record<string, object>;
55
- }
56
-
57
- /** Events fired by `<kai-thread>`. */
58
- interface Events extends Record<string, unknown> {
59
- /** A message's action button was clicked. `action` is the built-in name (`copy`
60
- * / `like` / `dislike` / `regenerate` / `edit`) or a custom id. `state` is
61
- * present only for the toggleable feedback votes: `'on'` when a like/dislike is
62
- * set, `'off'` when re-tapped to clear. */
63
- 'kai-message-action': { messageId: string; action: string; state?: 'on' | 'off' };
64
- }
65
-
66
- /**
67
- * `<kai-thread>` — the scrolling message list of a chat, as a standalone
68
- * composable element: one message row per `messages` entry with markdown / code
69
- * highlight / reasoning + tool panels / avatars / action row, stick-to-bottom
70
- * scroll with a scroll-to-bottom button, an optional typing indicator, and an
71
- * `empty` slot. It fills the height its parent gives it and scrolls internally
72
- * (`:host { display:block; height:100% }`). No composer, header, suggestions, or
73
- * sidebar — pair it with `<kai-prompt-input>` and your own layout, or reach for
74
- * the batteries-included `<kai-chat>`. Emits `kai-message-action`; exposes
75
- * `scrollToBottom()`.
76
- */
77
- defineWebComponent<Props, Events>('kai-thread', {
78
- messages: undefined,
79
- loading: false,
80
- proseSize: 'sm',
81
- codeTheme: 'github-dark-dimmed',
82
- codeHighlight: true,
83
- actionsReveal: 'always',
84
- scrollButton: true,
85
- class: undefined,
86
- cardTypes: undefined,
87
- cardSchemas: undefined,
88
- }, (props, { element, dispatch, flag, expose }) => {
89
- let controller: ThreadController | undefined;
90
-
91
- // `messages` is an untyped boundary: a consumer can hand it anything at
92
- // runtime (a pre-0.20.0 `{ id, role, content }` array, in particular). Skip
93
- // the invalid entries rather than let `groupMessageParts` throw deep inside a
94
- // render pass, which would blank the whole element instead of one message.
95
- const validMessages = createMessagesGuard('kai-thread');
96
-
97
- // Detect whether the consumer projected `slot="empty"` content, so the built-in
98
- // default only renders when they did NOT.
99
- const [slots, setSlots] = createSignal<Record<string, boolean>>({});
100
- onMount(() => {
101
- const read = () => setSlots(readSlots(element, THREAD_SLOTS));
102
- read();
103
- const observer = new MutationObserver(read);
104
- observer.observe(element, { childList: true });
105
- onCleanup(() => observer.disconnect());
106
- });
107
-
108
- // Imperative method API — forward the thread's scroll control onto the host.
109
- expose({
110
- /** Scroll the message list to the bottom (default `'smooth'`). */
111
- scrollToBottom: (behavior?: ScrollBehavior) => controller?.scrollToBottom(behavior),
112
- });
113
-
114
- return (
115
- <>
116
- {/* Fill the height the parent gives us and scroll internally, like
117
- <kai-resizable>. Consumers only need to give a parent (or the element) a
118
- height. */}
119
- <style>{':host{display:block;height:100%}'}</style>
120
- <Thread
121
- class={props.class as string | undefined}
122
- messages={validMessages(props.messages)}
123
- loading={flag('loading')}
124
- proseSize={props.proseSize as ProseSize}
125
- codeTheme={props.codeTheme as string}
126
- codeHighlight={flag('codeHighlight')}
127
- actionsReveal={props.actionsReveal as 'always' | 'hover'}
128
- scrollButton={props.scrollButton !== false}
129
- cardTypes={cardComponentsFromTags(props.cardTypes as Record<string, string> | undefined, (props as { theme?: string }).theme)}
130
- cardSchemas={props.cardSchemas as Record<string, object> | undefined}
131
- /* F-26: card parts emit off THIS element as the bubbling `kai-card` event. */
132
- cardHostElement={element}
133
- empty={slots()['empty'] ? <slot name="empty" /> : undefined}
134
- onMessageAction={(detail) => dispatch('kai-message-action', detail)}
135
- controllerRef={(c) => (controller = c)}
136
- />
137
- </>
138
- );
139
- });
@@ -1,106 +0,0 @@
1
- import { defineWebComponent } from './define';
2
- import { ToastRegion, type ToastDismissReason, type ToastPosition, type ToastAppearance } from '../components/toast';
3
- import { toast as toastStore, type ToastItem } from '../primitives/toast-store';
4
-
5
- interface Props extends Record<string, unknown> {
6
- /** The toasts to render. Newest is shown on top. Set as a JS property (array);
7
- * pass a new array reference to update. Omit for an empty region, which is
8
- * the normal resting state and how the imperative `toast()` API starts.
9
- * Note the handover: the first `toast()` call ADOPTS a region you placed in
10
- * markup (no second region mounts) and binds the imperative store to this
11
- * property, replacing any array you set. Drive a region as data OR via
12
- * `toast()`, not both at once. */
13
- toasts?: ToastItem[];
14
- /** Stack anchor: `'top-center'` (default), `'top-right'`, `'bottom-center'`, … */
15
- position?: ToastPosition;
16
- /** Max simultaneously-visible toasts; the rest queue. Defaults to `3`. */
17
- max?: number;
18
- /** Stacking: 'expanded' (default, full column) | 'collapsed' (Sonner-style
19
- * pile that expands on hover/focus). Attribute: stack. */
20
- stack?: 'expanded' | 'collapsed';
21
- /** Default appearance for this region's toasts: `'pill'` (default, compact) |
22
- * `'card'` (richer, with a description line). A per-toast `appearance` wins.
23
- * Attribute: `appearance`. */
24
- appearance?: ToastAppearance;
25
- /** Default high-contrast inverse treatment for this region's toasts. A per-toast
26
- * `inverse` wins. Off by default. Attribute: `inverse`. */
27
- inverse?: boolean;
28
- /** Container element to anchor this region to (JS property). Set by the store
29
- * for a scoped region; unset = the global viewport region. */
30
- target?: HTMLElement;
31
- }
32
-
33
- interface Events {
34
- /** A toast left the stack. `reason` is `'timeout' | 'close' | 'action'`. */
35
- 'kai-dismiss': { id: string; reason: ToastDismissReason };
36
- /** A toast's action button was pressed. */
37
- 'kai-action': { id: string; label: string };
38
- }
39
-
40
- /**
41
- * `<kai-toast-region>` — the viewport overlay that renders the toast stack.
42
- *
43
- * It is the substrate behind the imperative `toast()` API: the store lazily
44
- * mounts ONE of these on `document.body` and binds the list to `toasts`. It is
45
- * also usable declaratively — set `el.toasts = [...]` (a JS property, never an
46
- * attribute) and listen for `kai-dismiss` / `kai-action`.
47
- *
48
- * The two modes meet gracefully: `toast()` ADOPTS the first connected
49
- * `<kai-toast-region>` already in the document instead of mounting a second
50
- * one, and creates its own on `document.body` only when none exists. Adoption
51
- * keeps your authored attributes (position/stack/appearance) but binds the
52
- * imperative store to `toasts`, replacing an array you were driving as data —
53
- * so within one app, either own the array or call `toast()`, not both. With
54
- * two or more regions placed, the first in document order is adopted and a
55
- * one-time console.warn flags the ambiguity.
56
- *
57
- * Because it is a real `kai-*` element it carries its own shadow root + the
58
- * shared kit stylesheet, so it is viewport-positioned AND kit-styled.
59
- *
60
- * Stack-level defaults are also declarative: `<kai-toast-region appearance="card"
61
- * inverse>` makes every toast that doesn't set its own `appearance`/`inverse`
62
- * render as an inverted card. A per-toast value always wins.
63
- *
64
- * Your app chrome must stay below the toast layer; set `--kai-toast-z`
65
- * (default 100) on the host to move the layer.
66
- */
67
- defineWebComponent<Props, Events>('kai-toast-region', {
68
- toasts: [],
69
- position: 'top-center',
70
- max: 3,
71
- stack: 'expanded',
72
- appearance: 'pill',
73
- inverse: false,
74
- target: undefined,
75
- }, (props, { dispatch, flag }) => {
76
- // `max` may arrive as a string attribute (`<kai-toast-region max="2">`).
77
- const max = () => {
78
- const raw = props.max as unknown;
79
- const n = typeof raw === 'string' ? parseInt(raw, 10) : raw;
80
- return typeof n === 'number' && !Number.isNaN(n) ? n : 3;
81
- };
82
-
83
- const remove = (id: string) => {
84
- // Drop from the shared store (imperative path). For purely-declarative
85
- // consumers the store simply won't contain the id — the dispatched event
86
- // is the signal for them to update their own `toasts` array.
87
- toastStore.dismiss(id);
88
- };
89
-
90
- return (
91
- <ToastRegion
92
- toasts={props.toasts ?? []}
93
- position={props.position}
94
- max={max()}
95
- stack={props.stack as 'expanded' | 'collapsed' | undefined}
96
- appearance={props.appearance as ToastAppearance | undefined}
97
- inverse={flag('inverse')}
98
- target={props.target as HTMLElement | undefined}
99
- onDismiss={(id, reason) => {
100
- remove(id);
101
- dispatch('kai-dismiss', { id, reason });
102
- }}
103
- onAction={(id, label) => dispatch('kai-action', { id, label })}
104
- />
105
- );
106
- });
@@ -1,78 +0,0 @@
1
- import { createSignal, Show } from 'solid-js';
2
- import { defineWebComponent } from './define';
3
- import { Tool, type ToolPart } from '../components/tool';
4
- import { wireDisclosure } from './disclosure';
5
- import type { CollapsibleController } from '../ui/collapsible';
6
-
7
- interface Props extends Record<string, unknown> {
8
- /** The tool-call to display. Set as a JS property. */
9
- tool?: ToolPart;
10
- /** Drive/observe open state (Shoelace-style: settable + reflected to the `open`
11
- * attribute; the element still self-manages on trigger click). Set
12
- * `el.open = true`, or `<kai-tool open>`; listen for `kai-open-change`. */
13
- open?: boolean;
14
- /** Initial open state on mount (uncontrolled seed). */
15
- defaultOpen?: boolean;
16
- /** Gate the disclosure trigger: programmatic `show()/hide()/toggle()` still
17
- * work, but the trigger click no longer toggles. */
18
- disabled?: boolean;
19
- }
20
-
21
- /** Events fired by `<kai-tool>`. */
22
- interface Events {
23
- /** The panel expanded or collapsed (by trigger click or a method). */
24
- 'kai-open-change': { open: boolean };
25
- }
26
-
27
- /**
28
- * `<kai-tool>` — a collapsible tool-call panel (input/output inspection with a
29
- * state badge). Data via the `tool` property. Open state is the standard overlay
30
- * surface: settable+reflecting `open`, `kai-open-change`, and
31
- * `show()`/`hide()`/`toggle()` (gated by `disabled`); seed with `defaultOpen`.
32
- */
33
- defineWebComponent<Props, Events>('kai-tool', {
34
- tool: undefined,
35
- open: undefined,
36
- defaultOpen: undefined,
37
- disabled: undefined,
38
- }, (props, ctx) => {
39
- const { flag, reflectFlag } = ctx;
40
-
41
- // A SIGNAL, not a `let`. This facade gates its whole subtree on `<Show when={props.tool}>`,
42
- // and `tool` is an object prop, so the only sequence a consumer of the HTML spelling
43
- // has is markup-then-assign: the element connects with no tool, renders nothing, and
44
- // the Collapsible — and therefore the controller — arrives a tick later.
45
- //
46
- // With a plain `let`, wireDisclosure's effects ran once against `undefined` and never
47
- // again, because the getter they were handed was not reactive and a bare `open`
48
- // attribute never changes `props.open` to re-trigger them. Net result: `<kai-tool open>`
49
- // silently stayed shut while `el.open` read back `true` — the property and the
50
- // rendering disagreed. Making the controller reactive is the whole fix: the effects
51
- // re-run the moment it lands. `Tool` already tracks its own copy this way internally.
52
- // Pinned by the ordering rows in tests/elements/tool.test.tsx.
53
- const [api, setApi] = createSignal<CollapsibleController>();
54
-
55
- // The standard disclosure surface: settable+reflecting `open`, kai-open-change,
56
- // show/hide/toggle, disabled-gating. See ./disclosure. This is the SOLE emitter
57
- // of kai-open-change — the Tool/Collapsible no longer wires its own.
58
- wireDisclosure(ctx, api, () => props.open);
59
-
60
- // `disabled` reflects too, following kai-dock. Without it the prop is write-only in
61
- // the read direction AND deaf in the write one: `el.setAttribute('disabled', '')`
62
- // after mount is parsed by component-register to `undefined`, so the prop never
63
- // changes and nothing re-renders. reflectFlag's coercing setter resolves that
64
- // `undefined` back through the same `flag()` policy, which is what makes the plain
65
- // HTML gesture work at runtime and not only at parse time (findings G-05).
66
- reflectFlag('disabled');
67
-
68
- return (
69
- <Show when={props.tool}>
70
- <Tool
71
- toolPart={props.tool!}
72
- defaultOpen={flag('defaultOpen')}
73
- disabled={flag('disabled')}
74
- controllerRef={(a) => setApi(a)}
75
- />
76
- </Show>
77
- );
78
- });
@@ -1,85 +0,0 @@
1
- import { type Placement } from '@floating-ui/dom';
2
- import { Tooltip, type TooltipController } from '../ui/tooltip';
3
- import { defineWebComponent } from './define';
4
- import { wireDisclosure } from './disclosure';
5
-
6
- interface Props extends Record<string, unknown> {
7
- /** The hint text shown on hover/focus of the slotted trigger. */
8
- content?: string;
9
- /** Delay (ms) before the tooltip appears on hover. Defaults to 600. Focus
10
- * shows it immediately regardless. */
11
- openDelay?: number;
12
- /** Delay (ms) before it hides after the pointer leaves. Defaults to 0 (hides
13
- * immediately). */
14
- closeDelay?: number;
15
- /** Preferred placement: `'top' | 'bottom' | 'left' | 'right'` (+ optional
16
- * `-start`/`-end`). Defaults to `'top'`; flips to stay in view. */
17
- placement?: string;
18
- /** Drive/observe open state (Shoelace-style: settable + reflected to the `open`
19
- * attribute, the element still self-manages on hover/focus). Set `el.open = true`,
20
- * or `<kai-tooltip open>`; listen for `kai-open-change`. */
21
- open?: boolean;
22
- /** Initial open state on mount (uncontrolled seed). */
23
- defaultOpen?: boolean;
24
- /** Turn the tooltip off while keeping the trigger mounted (hover/focus and
25
- * `show()` no longer open it). */
26
- disabled?: boolean;
27
- }
28
-
29
- /** Events fired by `<kai-tooltip>`. */
30
- interface Events {
31
- /** The tooltip opened or closed (by hover/focus, outside-click, or a method). */
32
- 'kai-open-change': { open: boolean };
33
- }
34
-
35
- /**
36
- * `<kai-tooltip>` — wraps a trigger and shows a hint on hover/focus. Put the
37
- * trigger as light-DOM content; set the text via `content`. Positions itself and
38
- * dismisses on Escape/outside-click; the content is portaled inside the shadow
39
- * root so it isn't clipped.
40
- *
41
- * ```html
42
- * <kai-tooltip content="Voice input">
43
- * <kai-button variant="subtle" size="icon" icon="mic" label="Voice input"></kai-button>
44
- * </kai-tooltip>
45
- * ```
46
- */
47
- defineWebComponent<Props, Events>('kai-tooltip', {
48
- content: '',
49
- openDelay: undefined,
50
- closeDelay: undefined,
51
- placement: undefined,
52
- open: undefined,
53
- defaultOpen: undefined,
54
- disabled: undefined,
55
- }, (props, ctx) => {
56
- const { flag } = ctx;
57
- let api: TooltipController | undefined;
58
-
59
- // The standard overlay surface: settable+reflecting `open`, kai-open-change,
60
- // show/hide/toggle, disabled-gating. See ./disclosure.
61
- wireDisclosure(ctx, () => api, () => props.open);
62
-
63
- return (
64
- <>
65
- {/* The shared element base sets `:host{display:block}` (styles.css). A block
66
- host wraps the inline-flex trigger in a line box, so the font-descender
67
- strut makes the host taller than the control and pins the control to the
68
- top, so it reads off-center beside non-tooltipped siblings in a
69
- flex-items-center row. inline-flex (like kai-button) drops the line box so
70
- the host hugs the trigger and their centers line up. */}
71
- <style>{':host{display:inline-flex}'}</style>
72
- <Tooltip
73
- content={props.content ?? ''}
74
- openDelay={props.openDelay != null ? Number(props.openDelay) : undefined}
75
- closeDelay={props.closeDelay != null ? Number(props.closeDelay) : undefined}
76
- placement={(props.placement as Placement | undefined) ?? undefined}
77
- defaultOpen={flag('defaultOpen')}
78
- disabled={flag('disabled')}
79
- controllerRef={(a) => (api = a)}
80
- >
81
- <slot />
82
- </Tooltip>
83
- </>
84
- );
85
- });
@@ -1,76 +0,0 @@
1
- import type { ChatMessage } from './chat-types';
2
-
3
- /**
4
- * Boundary validation for the untyped `message` / `messages` properties.
5
- *
6
- * A web component's properties are an untyped boundary: nothing stops a consumer
7
- * from assigning the pre-0.20.0 `{ id, role, content }` shape, and TypeScript is
8
- * not there at runtime to catch it. `parts` is REQUIRED internally, so a message
9
- * without one throws inside a Solid render pass (`groupMessageParts` iterating
10
- * `undefined`), and an uncaught exception there blanks the WHOLE element, not
11
- * just the offending message. Validating here turns that into a skipped message
12
- * plus one clear console error naming the element and the expected shape.
13
- */
14
-
15
- /** True when `m` carries the required `parts` array. */
16
- export function hasParts(m: unknown): m is ChatMessage {
17
- return !!m && typeof m === 'object' && Array.isArray((m as { parts?: unknown }).parts);
18
- }
19
-
20
- /** Shared tail of every diagnostic, so all facades say the same thing. */
21
- const EXPECTED =
22
- "each entry needs a 'parts' array (e.g. parts: [{ type: 'text', text: 'Hi' }]). " +
23
- "The 'content' string field was removed in 0.20.0.";
24
-
25
- const EMPTY: ChatMessage[] = [];
26
-
27
- /**
28
- * Creates a per-element-instance validator for a `messages` array. Returns the
29
- * INPUT array unchanged when every entry is valid (no allocation, so streaming
30
- * identity checks upstream still hold), a filtered copy when some are not, and
31
- * `[]` when the property itself is not an array.
32
- *
33
- * Logs at most one `console.error` per validation pass, and never re-logs for a
34
- * message object it has already reported, so an unrelated re-render during
35
- * streaming does not spam the console.
36
- */
37
- export function createMessagesGuard(tag: string): (messages: unknown) => ChatMessage[] {
38
- const warned = new WeakSet<object>();
39
- // WeakSet only holds objects, so primitive entries (a stray string/null in the
40
- // array) get one shared latch instead.
41
- let warnedPrimitive = false;
42
- let warnedNonArray = false;
43
-
44
- return (messages: unknown): ChatMessage[] => {
45
- if (!Array.isArray(messages)) {
46
- if (messages != null && !warnedNonArray) {
47
- warnedNonArray = true;
48
- console.error(`<${tag}>: 'messages' must be an array. Ignoring it.`);
49
- }
50
- return EMPTY;
51
- }
52
- // Fast path: nothing to report, hand back the same reference.
53
- if (messages.every(hasParts)) return messages as ChatMessage[];
54
-
55
- let invalid = 0;
56
- let unreported = 0;
57
- for (const m of messages) {
58
- if (hasParts(m)) continue;
59
- invalid++;
60
- if (m !== null && typeof m === 'object') {
61
- if (warned.has(m as object)) continue;
62
- warned.add(m as object);
63
- } else {
64
- if (warnedPrimitive) continue;
65
- warnedPrimitive = true;
66
- }
67
- unreported++;
68
- }
69
- if (unreported > 0) {
70
- console.error(
71
- `<${tag}>: skipped ${invalid} of ${messages.length} messages: ${EXPECTED}`,
72
- );
73
- }
74
- return messages.filter(hasParts);
75
- };
76
- }
@@ -1,100 +0,0 @@
1
- import { defineWebComponent } from './define';
2
- import { VoiceInput, type VoiceInputController } from '../components/voice-input';
3
-
4
- interface Props extends Record<string, unknown> {
5
- /**
6
- * Transcriber the host supplies: records audio, returns the text. This is a
7
- * **function-valued property** (`el.transcribe = async blob => '...'`) because
8
- * a value-returning callback can't be modelled as a fire-and-forget event.
9
- */
10
- transcribe?: (audio: Blob) => Promise<string>;
11
- /** Disable the mic button (non-interactive). */
12
- disabled?: boolean;
13
- /**
14
- * BCP-47 language tag for the native `SpeechRecognition` path (e.g. `en-US`).
15
- * Attribute: `recognition-lang` (the plain `lang` attribute is reserved by
16
- * `HTMLElement` and can't be a custom-element property). No effect when
17
- * `transcribe` is set or the browser lacks SpeechRecognition.
18
- */
19
- recognitionLang?: string;
20
- /** Emit live partial transcripts (`kai-transcript-interim`) during native
21
- * recognition. Attribute: `interim`. No-op on the transcribe/fallback paths. */
22
- interim?: boolean;
23
- }
24
-
25
- /** Events fired by `<kai-voice-input>`. */
26
- interface Events {
27
- /** Raw audio captured (before transcription), for hosts that prefer to handle
28
- * transcription themselves instead of via the `transcribe` property. Also the
29
- * unsupported-fallback signal: no `transcribe`, no SpeechRecognition, so only
30
- * the blob is produced (no text). */
31
- 'kai-audio-captured': { blob: Blob };
32
- /** Final transcript: the `transcribe` property resolved, OR native
33
- * `SpeechRecognition` produced final text (no `transcribe` set). */
34
- 'kai-transcription': { text: string };
35
- /** Live partial transcript during native recognition (only when `interim` is
36
- * set). Fires repeatedly before the final `kai-transcription`. */
37
- 'kai-transcript-interim': { text: string };
38
- /** Recording started or stopped. Lets the host drive its own UI (waveform,
39
- * push-to-talk indicator) in sync with the mic. Fires on real transitions
40
- * only (manual click and programmatic start()/stop()), never on mount. */
41
- 'kai-recording-change': { recording: boolean };
42
- /** A voice session failed, so no failure is ever silent. `detail.source` names
43
- * the failing side (`recognition` on `<kai-voice-input>`, `synthesis` on
44
- * `<kai-voice-output>`), `detail.error` carries the platform error code, the
45
- * thrown exception's name, or `no-result` when recognition ended with no error
46
- * and no text (the user said nothing), and `detail.message` is human-readable.
47
- * Deliberate cancellation does not fire. */
48
- 'kai-voice-error': { source: 'recognition'; error: string; message: string };
49
- }
50
-
51
- /**
52
- * `<kai-voice-input>` — a mic button that records and transcribes. Works
53
- * natively by default: with no `transcribe` callback it uses the browser's
54
- * `SpeechRecognition` (Chrome/Safari; no Firefox — and cloud-based in Chrome).
55
- * Set `el.transcribe` to route audio through your own async transcriber instead.
56
- * Where neither is available it records the blob and emits `kai-audio-captured`
57
- * with no text. Also emits `kai-transcription` (final text), `kai-voice-error`
58
- * (a failed or empty session) and, with `interim`, `kai-transcript-interim`
59
- * (live partials).
60
- */
61
- defineWebComponent<Props, Events>('kai-voice-input', {
62
- transcribe: undefined,
63
- disabled: false,
64
- recognitionLang: undefined,
65
- interim: false,
66
- }, (props, { dispatch, flag, expose }) => {
67
- // Pattern C: the VoiceInput component owns useVoiceRecorder; it hands up a
68
- // start/stop controller and an onRecordingChange callback. The facade captures
69
- // the controller and exposes delegating methods (start/stop both run the same
70
- // record→transcribe path as the mic click, so manual + programmatic emit the
71
- // same kai-audio-captured/kai-transcription/kai-recording-change events).
72
- let controller: VoiceInputController | undefined;
73
- expose({
74
- /** Begin recording programmatically (e.g. push-to-talk bound to a global
75
- * key). Runs the same getUserMedia path as clicking the mic; no-ops if
76
- * already recording. */
77
- start: () => controller?.start(),
78
- /** Stop the in-progress recording, producing the blob (→ kai-audio-captured)
79
- * and running transcription. Pairs with start() for push-to-talk. */
80
- stop: () => controller?.stop(),
81
- });
82
-
83
- return (
84
- <VoiceInput
85
- disabled={flag('disabled')}
86
- hasTranscribe={typeof props.transcribe === 'function'}
87
- lang={props.recognitionLang}
88
- interim={flag('interim')}
89
- onTranscribe={async (blob) => {
90
- dispatch('kai-audio-captured', { blob });
91
- return props.transcribe ? props.transcribe(blob) : '';
92
- }}
93
- onTranscription={(text) => dispatch('kai-transcription', { text })}
94
- onInterim={(text) => dispatch('kai-transcript-interim', { text })}
95
- onRecordingChange={(recording) => dispatch('kai-recording-change', { recording })}
96
- onError={(detail) => dispatch('kai-voice-error', detail)}
97
- controllerRef={(c) => (controller = c)}
98
- />
99
- );
100
- });
@@ -1,82 +0,0 @@
1
- import { defineWebComponent } from './define';
2
- import { VoiceOutput, type VoiceOutputController } from '../components/voice-output';
3
-
4
- interface Props extends Record<string, unknown> {
5
- /** The utterance to read aloud. */
6
- text?: string;
7
- /** Speak automatically when `text` is set/changed. */
8
- autoplay?: boolean;
9
- /**
10
- * TTS model seam the host supplies: given text, returns an audio `Blob` to
11
- * play. This is a **function-valued property** (`el.synthesize = async text =>
12
- * blob`); when set, the native `speechSynthesis` path is bypassed. Mirrors
13
- * `<kai-voice-input>`'s `transcribe`. A value-returning callback can't be
14
- * modelled as a fire-and-forget event, hence a property.
15
- */
16
- synthesize?: (text: string) => Promise<Blob>;
17
- /** Disable the button (non-interactive). */
18
- disabled?: boolean;
19
- }
20
-
21
- /** Events fired by `<kai-voice-output>`. */
22
- interface Events {
23
- /** Playback started or stopped. Drive your own UI in sync. `speaking: true`
24
- * fires when audio actually starts (utterance.onstart natively; audio playback
25
- * beginning on the `synthesize` path), not when speak() is called; earlier
26
- * releases fired it optimistically inside speak() itself. Fires on real
27
- * transitions only (manual click and programmatic speak()/stop()), never on
28
- * mount. */
29
- 'kai-speaking-change': { speaking: boolean };
30
- /** The model path (`synthesize`) resolved audio: the raw `Blob` before playback. */
31
- 'kai-synthesized': { blob: Blob };
32
- /** A voice session failed, so no failure is ever silent. `detail.source` names
33
- * the failing side (`recognition` on `<kai-voice-input>`, `synthesis` on
34
- * `<kai-voice-output>`), `detail.error` carries the platform error code, the
35
- * thrown exception's name, or `no-result` when recognition ended with no error
36
- * and no text (the user said nothing), and `detail.message` is human-readable.
37
- * Deliberate cancellation does not fire. */
38
- 'kai-voice-error': { source: 'synthesis'; error: string; message: string };
39
- }
40
-
41
- /**
42
- * `<kai-voice-output>` — a speaker button that reads `text` aloud. Native by
43
- * default (`speechSynthesis`); set `el.synthesize` to route through your TTS
44
- * model instead. The output sibling of `<kai-voice-input>`. Emits
45
- * `kai-speaking-change`, `kai-voice-error` (a failed synthesis) and (model
46
- * path) `kai-synthesized`.
47
- */
48
- defineWebComponent<Props, Events>('kai-voice-output', {
49
- text: '',
50
- autoplay: false,
51
- synthesize: undefined,
52
- disabled: false,
53
- }, (props, { dispatch, flag, expose }) => {
54
- // Pattern C: the VoiceOutput component owns playback; it hands up a
55
- // speak/pause/resume/stop controller. The facade captures it and exposes
56
- // delegating methods (manual + programmatic run the same path, so both emit
57
- // the same kai-speaking-change / kai-synthesized events).
58
- let controller: VoiceOutputController | undefined;
59
- expose({
60
- /** Speak the current `text` (native, or via `synthesize` if set). */
61
- speak: () => controller?.speak(),
62
- /** Pause playback (resumable). */
63
- pause: () => controller?.pause(),
64
- /** Resume paused playback. */
65
- resume: () => controller?.resume(),
66
- /** Stop playback and reset. */
67
- stop: () => controller?.stop(),
68
- });
69
-
70
- return (
71
- <VoiceOutput
72
- text={(props.text as string | undefined) ?? ''}
73
- autoplay={flag('autoplay')}
74
- disabled={flag('disabled')}
75
- onSynthesize={props.synthesize ? (text) => props.synthesize!(text) : undefined}
76
- onSpeakingChange={(speaking) => dispatch('kai-speaking-change', { speaking })}
77
- onSynthesized={(blob) => dispatch('kai-synthesized', { blob })}
78
- onError={(detail) => dispatch('kai-voice-error', detail)}
79
- controllerRef={(c) => (controller = c)}
80
- />
81
- );
82
- });