@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,102 +0,0 @@
1
- import type { ToolPart, RawOrigin } from '../components/tool-types';
2
- import type { AttachmentData } from '../components/attachment-types';
3
- import type { CardEnvelope } from '../primitives/card-contract';
4
-
5
- /** Re-exported so consumers of chat-types (and MessagePart) can keep using
6
- * RawOrigin unqualified. It is defined in components/tool-types.ts, not here,
7
- * to keep the components -> elements import direction one-way. */
8
- export type { RawOrigin };
9
-
10
- /** The five built-in action buttons (each carries its own curated icon + label). */
11
- export type ChatMessageAction = 'copy' | 'like' | 'dislike' | 'regenerate' | 'edit';
12
-
13
- /** A like/dislike feedback vote on an assistant message. */
14
- export type FeedbackVote = 'like' | 'dislike';
15
-
16
- /** A host-defined action button. `icon` is a curated registry name (see
17
- * `src/ui/action-icons.ts`); unknown/absent icons render label-only. */
18
- export interface CustomAction {
19
- /** Emitted as the `kai-message-action` detail `action` when clicked. */
20
- id: string;
21
- /** Visible/`aria-label` text. */
22
- label: string;
23
- /** A curated icon name from the action-icon registry. */
24
- icon?: string;
25
- /** Tooltip text shown on hover. Defaults to `label` when omitted. */
26
- tooltip?: string;
27
- }
28
-
29
- /** The speaker avatar for a message row. (Mirrors the `…Data` convention of
30
- * `AttachmentData`; named to avoid clashing with the `MessageAvatar` component.) */
31
- export interface AvatarData {
32
- /** Image URL. When present, renders an `<img>`. */
33
- src?: string;
34
- /** Initials/short text shown when there is no `src`. */
35
- fallback?: string;
36
- /** Alt text for the image. */
37
- alt?: string;
38
- }
39
-
40
- /** A citation the model produced. */
41
- export interface Source {
42
- id?: string;
43
- url?: string;
44
- title?: string;
45
- snippet?: string;
46
- /** Citation marker number, when the model numbers its citations. */
47
- index?: number;
48
- }
49
-
50
- /** The public name for the citation carried by a `source` part, and the argument
51
- * type of `AssistantStream.addSource`. The bare `Source` name is already taken
52
- * on the public entry by the citation-chip COMPONENT (`./components/source`),
53
- * so exporting this interface unaliased would be a duplicate identifier and the
54
- * type would be unnameable from `@kitn.ai/ui`. */
55
- export type MessageSource = Source;
56
-
57
- /** One ordered piece of message content. Closed union: extension happens at the CARD
58
- * layer via the card registry, not by adding variants here. */
59
- export type MessagePart =
60
- | { type: 'text'; text: string; raw?: RawOrigin }
61
- | {
62
- type: 'reasoning';
63
- text: string;
64
- label?: string;
65
- /** Provider block index. Keeps parallel reasoning blocks distinct. */
66
- index?: number;
67
- /** Which provider RESPONSE STREAM `index` was counted in. Anthropic restarts
68
- * content-block indices at 0 for every message, and a multi-round tool loop
69
- * folds several of those messages into ONE assistant turn, so `index` alone
70
- * is not unique within `parts`. Set by the wire adapter, one value per
71
- * `consumeModelStream` call. See `appendReasoningPart`. */
72
- streamId?: string;
73
- /** Load-bearing on the OpenAI wire, informational on the Anthropic one.
74
- * `toOpenAIMessages({ reasoning: 'include' })` REBUILDS a signed
75
- * `reasoning_details` entry from `text` plus this, because `raw` after a
76
- * streamed turn is a textless fragment: only the final frame carries the
77
- * signature and it has no text, and `appendReasoningPart` resolves `raw`
78
- * last-write-wins. `toAnthropicMessages` ignores this field and echoes
79
- * `raw.payload` verbatim — a thinking block rebuilt from text plus
80
- * signature is a hard 400. */
81
- signature?: string;
82
- raw?: RawOrigin;
83
- }
84
- | { type: 'tool'; tool: ToolPart; raw?: RawOrigin }
85
- | { type: 'card'; envelope: CardEnvelope; raw?: RawOrigin }
86
- | { type: 'source'; source: Source; raw?: RawOrigin }
87
- | { type: 'file'; attachment: AttachmentData; raw?: RawOrigin };
88
-
89
- export interface ChatMessage {
90
- id: string;
91
- role: 'user' | 'assistant';
92
- /** The ONLY content channel. Ordered. */
93
- parts: MessagePart[];
94
- /** Action buttons under the message. Chrome, not content. */
95
- actions?: (ChatMessageAction | CustomAction)[];
96
- /** Optional speaker avatar shown to the left of the message column. */
97
- avatar?: AvatarData;
98
- /** Controlled feedback vote. When set, it wins over the facade's internal
99
- * optimistic state (`m.feedback ?? feedbackMap[m.id]`), so a host that
100
- * persists votes can re-hydrate them. */
101
- feedback?: FeedbackVote;
102
- }
@@ -1,188 +0,0 @@
1
- import { createSignal, onMount, onCleanup, untrack } from 'solid-js';
2
- import { defineWebComponent } from './define';
3
- import { readSlots, WORKSPACE_SLOTS } from './slots';
4
- import {
5
- WorkspaceShell,
6
- type WorkspaceShellController,
7
- type WorkspaceAsideSide,
8
- type WorkspaceAsideToggleDetail,
9
- type WorkspaceAsideResizeDetail,
10
- } from '../components/workspace-shell';
11
-
12
- interface Props extends Record<string, unknown> {
13
- /** Controlled collapsed state of the start aside. Set this as a JS property
14
- * (`el.startCollapsed = true`) to drive the aside from your app, updating it
15
- * in response to the `kai-aside-toggle` event. Omit for uncontrolled (the
16
- * element manages it). */
17
- startCollapsed?: boolean;
18
- /** Initial collapsed state of the start aside when uncontrolled (default
19
- * false). Use the `default-start-collapsed` attribute to start collapsed in
20
- * plain HTML. */
21
- defaultStartCollapsed?: boolean;
22
- /** Controlled collapsed state of the end aside. Set this as a JS property
23
- * (`el.endCollapsed = true`) to drive the aside from your app, updating it
24
- * in response to the `kai-aside-toggle` event. Omit for uncontrolled (the
25
- * element manages it). */
26
- endCollapsed?: boolean;
27
- /** Initial collapsed state of the end aside when uncontrolled (default
28
- * false). Use the `default-end-collapsed` attribute to start collapsed in
29
- * plain HTML. */
30
- defaultEndCollapsed?: boolean;
31
- /** Auto-collapse both asides when the shell's own width drops below this many
32
- * px, and re-expand when it grows back above. Applies to uncontrolled asides
33
- * only (it never fights an app-driven collapsed prop); omit to disable.
34
- * Fires `kai-aside-toggle`. Attribute: `collapse-below`. */
35
- collapseBelow?: number;
36
- /** Below this shell width in px, an expanded aside renders as an overlay
37
- * drawer over the main region instead of a column beside it. Escape inside
38
- * the drawer closes it and returns focus to the element focused before it
39
- * opened. Omit to disable. Attribute: `drawer-below`. */
40
- drawerBelow?: number;
41
- /** Density hint. Reflected as a `data-compact` hook on the root (and as the
42
- * `compact` attribute on the element) for your CSS and slotted content; the
43
- * shell itself keeps no other opinion about density. */
44
- compact?: boolean;
45
- }
46
-
47
- /** Events fired by `<kai-workspace>`. Layout only: every chat event now belongs
48
- * to the part that fires it, inside your own markup. */
49
- interface Events {
50
- /** An aside collapsed or expanded (a method, the breakpoint, the drawer's Escape). */
51
- 'kai-aside-toggle': WorkspaceAsideToggleDetail;
52
- /** The aside was resized (fires per drag step, keyboard nudge, or a handle double-click reset), width in px. */
53
- 'kai-aside-resize': WorkspaceAsideResizeDetail;
54
- }
55
-
56
- /**
57
- * `<kai-workspace>` — the chat-agnostic layout shell: five slots (`header` ·
58
- * `start` · `main` · `end` · `footer`), resize handles between the columns,
59
- * per-aside collapse, collapse-below-breakpoint, and a mobile drawer mode for
60
- * the asides. It knows nothing about chat: a file tree in `start` is as valid
61
- * as `<kai-conversations>`, and the workspace app slots `<kai-conversations>`
62
- * and `<kai-chat>` into it.
63
- *
64
- * ```html
65
- * <kai-workspace collapse-below="720" drawer-below="640">
66
- * <kai-conversations slot="start"></kai-conversations>
67
- * <kai-chat></kai-chat>
68
- * </kai-workspace>
69
- * ```
70
- *
71
- * Aside geometry is CSS custom properties, not props (the `kai-dock` rule):
72
- * `--kai-workspace-start-width` (280px) · `--kai-workspace-start-min-width`
73
- * (200px) · `--kai-workspace-start-max-width` (480px) · `--kai-workspace-end-width`
74
- * (320px) · `--kai-workspace-end-min-width` (200px) · `--kai-workspace-end-max-width`
75
- * (480px). Read once at upgrade. Parts: `header` · `start` · `main` · `end` ·
76
- * `footer` (the asides also match `::part(aside)`).
77
- *
78
- * **BREAKING (0.24):** this element was a chat
79
- * preset; it is now a layout shell, and everything chat-shaped is gone from its
80
- * surface. Where each removed prop went:
81
- *
82
- * - `conversations` / `activeId` / `groups` / `noConversations`: set them on your
83
- * own `<kai-conversations slot="start">`.
84
- * - `messages` / `loading` / `proseSize` / `codeTheme` / `codeHighlight` /
85
- * `chatTitle` / `scrollButton` / `cardTypes` / `cardSchemas`: set them on your
86
- * own `<kai-chat>` in the main region.
87
- * - `value` / `placeholder` / `suggestions` / `suggestionMode` / `voice` /
88
- * `triggers` / `kindIcons` and the renamed `webSearch` (was `search`): the
89
- * composer surface on `<kai-chat>` or `<kai-prompt-input>`.
90
- * - `models` / `currentModel` / `context`: header chrome you slot (a model
91
- * picker is a part in a slot, not three orchestrator props).
92
- * - `sidebarWidth` / `sidebarMinWidth` / `sidebarMaxWidth`: the
93
- * `--kai-workspace-start-*` custom properties above.
94
- * - `sidebarCollapsed` / `defaultSidebarCollapsed`: `startCollapsed` /
95
- * `defaultStartCollapsed` (per-aside; the end aside has its own pair).
96
- * - `collapseBelow`: kept, now collapsing both asides.
97
- * - `compact`: kept as a reflected density hint; the rail's row density is
98
- * `<kai-conversations>`' own `compact`.
99
- * - Chat events (`kai-submit`, `kai-conversation-select`, `kai-message-action`,
100
- * `kai-model-change`, `kai-search`, `kai-voice`, `kai-value-change`,
101
- * `kai-suggestion-click`): listen on the part that fires them.
102
- * `kai-sidebar-toggle` is now `kai-aside-toggle` with a `side`.
103
- * - Methods: `toggleSidebar()` / `collapseSidebar()` / `expandSidebar()` are now
104
- * `toggleAside(side)` / `collapseAside(side)` / `expandAside(side)`; the
105
- * thread methods (`focus`/`clear`/`send`/`scrollToBottom`) live on your
106
- * `<kai-chat>`.
107
- *
108
- * The migration path for a full app is the `workspace` block scaffold (the kai
109
- * MCP `scaffold` tool), which emits this composition wired.
110
- */
111
- defineWebComponent<Props, Events>('kai-workspace', {
112
- startCollapsed: undefined,
113
- defaultStartCollapsed: undefined,
114
- endCollapsed: undefined,
115
- defaultEndCollapsed: undefined,
116
- collapseBelow: undefined,
117
- drawerBelow: undefined,
118
- compact: undefined,
119
- }, (props, { dispatch, flag, expose, element, reflectFlag }) => {
120
- // Which slots the consumer has filled. A bare <slot> is always a truthy JSX
121
- // node, so each optional region renders ONLY when readSlots reports projected
122
- // light-DOM content (re-read on childList mutation). Main always renders.
123
- const [slots, setSlots] = createSignal<Record<string, boolean>>({});
124
- onMount(() => {
125
- const read = () => setSlots(readSlots(element, WORKSPACE_SLOTS));
126
- read();
127
- const observer = new MutationObserver(read);
128
- observer.observe(element, { childList: true });
129
- onCleanup(() => observer.disconnect());
130
- });
131
-
132
- // Reflect the read-back flags (the G-05 rule: a bare attribute parses to
133
- // `undefined`, so without this the property would contradict the attribute).
134
- reflectFlag('compact');
135
- reflectFlag('defaultStartCollapsed');
136
- reflectFlag('defaultEndCollapsed');
137
-
138
- // Aside geometry from the element's CSS custom properties, read once at
139
- // upgrade (inline style first so jsdom, which does not resolve custom
140
- // properties through getComputedStyle, still honors a direct set).
141
- const readVar = (name: string, fallback: number): number => {
142
- const inline = element.style.getPropertyValue(name).trim();
143
- const computed = inline || getComputedStyle(element).getPropertyValue(name).trim();
144
- const n = parseFloat(computed);
145
- return Number.isFinite(n) ? n : fallback;
146
- };
147
- const geometry = untrack(() => ({
148
- startWidth: readVar('--kai-workspace-start-width', 280),
149
- startMinWidth: readVar('--kai-workspace-start-min-width', 200),
150
- startMaxWidth: readVar('--kai-workspace-start-max-width', 480),
151
- endWidth: readVar('--kai-workspace-end-width', 320),
152
- endMinWidth: readVar('--kai-workspace-end-min-width', 200),
153
- endMaxWidth: readVar('--kai-workspace-end-max-width', 480),
154
- }));
155
-
156
- let controller: WorkspaceShellController | undefined;
157
- expose({
158
- /** Collapse/expand one aside (fires `kai-aside-toggle`). */
159
- toggleAside: (side: WorkspaceAsideSide) => controller?.toggleAside(side),
160
- /** Force one aside collapsed (fires `kai-aside-toggle`). */
161
- collapseAside: (side: WorkspaceAsideSide) => controller?.collapseAside(side),
162
- /** Force one aside expanded (fires `kai-aside-toggle`). */
163
- expandAside: (side: WorkspaceAsideSide) => controller?.expandAside(side),
164
- });
165
-
166
- return (
167
- <WorkspaceShell
168
- header={slots()['header'] ? <slot name="header" /> : undefined}
169
- start={slots()['start'] ? <slot name="start" /> : undefined}
170
- end={slots()['end'] ? <slot name="end" /> : undefined}
171
- footer={slots()['footer'] ? <slot name="footer" /> : undefined}
172
- startCollapsed={props.startCollapsed as boolean | undefined}
173
- defaultStartCollapsed={flag('defaultStartCollapsed')}
174
- endCollapsed={props.endCollapsed as boolean | undefined}
175
- defaultEndCollapsed={flag('defaultEndCollapsed')}
176
- collapseBelow={props.collapseBelow as number | undefined}
177
- drawerBelow={props.drawerBelow as number | undefined}
178
- compact={flag('compact')}
179
- {...geometry}
180
- onAsideToggle={(detail) => dispatch('kai-aside-toggle', detail)}
181
- onAsideResize={(detail) => dispatch('kai-aside-resize', detail)}
182
- controllerRef={(c) => (controller = c)}
183
- >
184
- <slot name="main" />
185
- <slot />
186
- </WorkspaceShell>
187
- );
188
- });
@@ -1,304 +0,0 @@
1
- import { createSignal, onCleanup, onMount } from 'solid-js';
2
- import { defineWebComponent } from './define';
3
- import { CHAT_SLOTS, readSlots } from './slots';
4
- import { ChatThread, type ChatThreadProps, type ChatThreadContextUsage, type ChatThreadController } from '../components/chat-thread';
5
- import { cardComponentsFromTags } from './message';
6
- import { createMessagesGuard } from './validate-messages';
7
- import type { AttachmentData } from '../components/attachments';
8
- import type { RejectedAttachment } from './default-input';
9
- import type { ChatMessage } from './chat-types';
10
- import type { TriggerDef } from '../components/composer';
11
- import type { ComposerDoc } from '../primitives/composer-model';
12
- import type { ProseSize } from '../primitives/chat-config';
13
- import type { ModelOption, HomeConfig, HomeLinkEntry } from '../types';
14
- import type { ConversationStore } from '../primitives/conversation-store';
15
-
16
- type Props = Omit<ChatThreadProps,
17
- 'class' | 'onValueChange' | 'onSubmit' | 'onAttachmentsChange' | 'onSuggestionClick' | 'onModelChange'
18
- | 'onMessageAction' | 'onWebSearch' | 'onVoice' | 'controllerRef' | 'cardTypes' | 'cardSchemas' | 'cardHostElement' | 'messages'
19
- | 'accept' | 'onAttachmentsRejected'
20
- // `conversations`/`store` are re-declared below (own doc comments, matching
21
- // this element's own attribute/property conventions) rather than left to
22
- // flow through `Omit`'s pass-through — same reason `messages` is excluded
23
- // above. Left unexcluded, the intersection carries TWO declarations of the
24
- // same property (the inherited `ChatThreadProps` one plus the re-declared
25
- // one below) and `gen-element-api.mjs` concatenates both JSDoc comments into
26
- // one duplicated, em-dash-laden description.
27
- | 'conversations' | 'store'
28
- // `home` is re-declared below for the same reason as `conversations`/`store`
29
- // above (own element-facing doc comment rather than the ChatThread-level one
30
- // flowing through `Omit`'s pass-through). `onHomeLink` is wired internally
31
- // (JSX prop on `<ChatThread>` below) as a dispatched `kai-home-link` event,
32
- // matching every other ChatThread callback on this element — same reasoning
33
- // as `onConversationLoad` just below.
34
- | 'home' | 'onHomeLink'
35
- // `onConversationLoad` is wired internally (below, JSX prop on
36
- // `<ChatThread>`) as a dispatched `kai-conversation-load` event — matching
37
- // every other ChatThread callback on this element — rather than left as a
38
- // settable JS property: a `JSX.Element`-shaped callback prop has no HTML-
39
- // consumer analogue the way `store`/`messages` do, and the kai- contract's
40
- // idiom for "this thread wants to tell you something" is already an event.
41
- // Excluded from `Props` for the same reason `onValueChange`/`onSubmit`/etc
42
- // are excluded above: it is not a property a consumer of `<kai-chat>` sets.
43
- | 'onConversationLoad'
44
- // `hostOpen`/`onUnreadChange` (unread indicators, 2026-08-26) are the SAME
45
- // "types without forwarding" trap as `onConversationLoad` above, for the
46
- // same reason: this facade does not read either off the host element and
47
- // forward it onto `<ChatThread>` below. Both exist for a caller composing
48
- // `ChatThread` directly as a Solid component with its OWN show/hide chrome
49
- // to report through `hostOpen` and its own sibling control (a `Dock`'s
50
- // `unread` badge) to mirror `onUnreadChange` onto — the construct engine's
51
- // emitted App is the motivating case (codegen.ts's `emitChatThreadUnreadProps`),
52
- // exactly like `headerEndContent`/`emptyContent` below. `<kai-chat>` has no
53
- // such sibling chrome of its own to report to or read from, so there is
54
- // nothing here for either prop to DO — left unexcluded, `gen-element-api.mjs`
55
- // would still type them into the public API and docs as settable properties
56
- // that silently do nothing when set.
57
- | 'hostOpen' | 'onUnreadChange'
58
- // `headerEndContent`/`emptyContent` are JSX.Element escape hatches for a caller
59
- // composing `ChatThread` directly as a Solid component (see their doc comments in
60
- // chat-thread.tsx — the construct-engine's emitted App is the motivating case).
61
- // `<kai-chat>` is the OPPOSITE shape: a custom element crossing the shadow-DOM
62
- // boundary, where a `JSX.Element` value cannot exist for a consumer to construct
63
- // (React/Vue/plain HTML have no such type) and the facade already has its own
64
- // working mechanism for both regions — `slot="header-end"` and `slot="empty"`.
65
- // Omitted here rather than left to flow through `Omit`'s default pass-through:
66
- // without this, `gen-element-api.mjs` picked them up and put a JSX.Element type
67
- // (which it stringifies as Solid's internal array-like union — meaningless to a
68
- // web-component consumer) into `<kai-chat>`'s public prop surface and docs.
69
- | 'headerEndContent' | 'emptyContent'> & Record<string, unknown> & {
70
- /** Which attachment media types the user may stage, in HTML `accept` syntax:
71
- * `<kai-chat accept="image/*,application/pdf">`. A plain string, so unlike
72
- * `messages` it DOES work as an attribute. Omitted means no filter.
73
- *
74
- * MEDIA TYPES ONLY -- exact (`image/png`) or subtype wildcard (`text/*`).
75
- * HTML allows a file extension here and this does not: `accept=".py"` THROWS
76
- * with the entry named, rather than silently resolving to a picker that
77
- * accepts nothing.
78
- *
79
- * It can only NARROW what the kit can already encode: `accept="image/*"`
80
- * resolves to the four image formats both APIs take, not to every image type
81
- * the OS offers. Pass the SAME string to `toOpenAIMessages(msgs, { accept })`
82
- * and the picker and the wire cannot disagree -- both resolve it through
83
- * `resolveMediaPolicy` against one declaration. That declaration is readable
84
- * as `encodableMediaTypes()` from `@kitn.ai/ui/wire`, if you would rather
85
- * build your own picker than use this prop. */
86
- accept?: string;
87
- /** The full message thread to render, newest last. Each entry carries its
88
- * role, ordered `parts`, and optional actions/avatar/feedback. Set as a JS
89
- * property (`el.messages = [...]`); a NEW array reference per streaming
90
- * chunk re-renders (mutating in place does not). Omit for an empty thread.
91
- *
92
- * Re-declared here (rather than inherited from `ChatThreadProps`) because
93
- * the ELEMENT registers a `[]` default and renders the empty state without
94
- * it, while the SolidJS `<ChatThread>` component still requires it. The
95
- * facade hands it a validated array either way. Matches `<kai-thread>`. */
96
- messages?: ChatMessage[];
97
- /** Optional card type -> custom-element tag overrides/additions for `card`
98
- * parts (merged over the built-ins). Property: `el.cardTypes`. Typed as a
99
- * plain string map (not the `CardTagMap` alias) so the generated React
100
- * wrapper inlines it instead of emitting an unresolved named type. */
101
- cardTypes?: Record<string, string>;
102
- /** JSON Schemas for the card types this app renders, keyed by envelope type. The
103
- * companion of `cardTypes`, which says what DRAWS a card while this says what a
104
- * VALID one looks like. An OBJECT, so it is a JS property only: `el.cardSchemas
105
- * = { 'pricing-table': pricingSchema }`, never an attribute.
106
- * `createCardRegistry(...).validationSchemas` is exactly this shape.
107
- *
108
- * Without it the kit validates its own seven built-ins and leaves your own card
109
- * type, the one your app actually cares about, as the only unchecked thing on
110
- * screen. A schema here WINS over a built-in of the same name.
111
- *
112
- * Typed `Record<string, object>` rather than `Record<string, JsonSchema>`
113
- * deliberately: an imported `.json` schema widens `"type"` to `string`, and an
114
- * authored one carries `$schema`/`title`/`description`/`additionalProperties`,
115
- * so the tighter type would reject both of the normal ways to supply one. */
116
- cardSchemas?: Record<string, object>;
117
- /** Turns on the prior-conversations list (a list-toggle button in the
118
- * header, plus a second list view sharing the panel, C-1). Attribute-
119
- * settable like every other boolean flag on this element:
120
- * `<kai-chat conversations>`. Requires `store`. A row select, "new
121
- * conversation," or the visitor's mount-time auto-restore all deliver
122
- * their messages the same way: listen for `kai-conversation-load` and
123
- * set `el.messages` from `event.detail.messages` (a fresh array): this
124
- * element does not update `messages` for you. Set with no `store`, the
125
- * underlying `ChatThread` decides loudly (one console.error) and stays
126
- * visually off; this facade always supplies its own internal load
127
- * handler (the `kai-conversation-load` dispatch below), so the second
128
- * ChatThread guard, missing `onConversationLoad`, never trips here,
129
- * even for a consumer who never listens for the event. Default false. */
130
- conversations?: boolean;
131
- /** The adapter this thread persists conversations through: an object of
132
- * three functions (`list`/`load`/`save`; `ConversationStore`, exported
133
- * from `@kitn.ai/ui`'s `primitives/conversation-store`). A JS PROPERTY
134
- * ONLY: `el.store = myAdapter`. It can never be an attribute, since a
135
- * function-bearing object has no HTML string form, the same reasoning
136
- * that keeps `messages`/`cardSchemas` property-only (the kai- contract:
137
- * array/object props are JS properties, never attributes). Two built-ins
138
- * ship: `localStorageStore(name, userId?)` and `fetchStore(url, userId?)`. */
139
- store?: ConversationStore;
140
- /** Turns on the widget home screen (Intercom-pattern): the panel boots into
141
- * a `home` view, with a greeting, most-recent-conversation card, a "new
142
- * conversation" CTA, and host-defined links, plus a Home/Messages tab bar
143
- * for switching back to the thread. An OBJECT, so it is a JS property only:
144
- * `el.home = { greeting: { title: 'Hey' }, links: [...] }`, never an
145
- * attribute (the kai- contract: array/object props are JS properties).
146
- * A `links` entry with no `href` fires `kai-home-link` with that entry when
147
- * tapped, rather than navigating; one WITH `href` opens it directly
148
- * (only when the URL passes the kit's own scheme allowlist). Omit for the
149
- * no-home widget (chat view only, unchanged). */
150
- home?: HomeConfig;
151
- };
152
-
153
- interface Events {
154
- /** User submitted a message. */
155
- 'kai-submit': { value: string; attachments: AttachmentData[] };
156
- /** Fired on every input change. */
157
- 'kai-value-change': { value: string };
158
- /** The staged attachments changed (file added or removed). Carries the full
159
- * current list so a consumer can react in real time. */
160
- 'kai-attachments-change': { attachments: AttachmentData[] };
161
- /** One or more picked files were refused because `accept` excluded them. The
162
- * element renders NO message of its own: it reports the facts (name, media
163
- * type, whether the kit could have sent it) and what the user should see is
164
- * the application's call. Only ever fires when `accept` is set. */
165
- 'kai-attachments-rejected': { rejected: RejectedAttachment[] };
166
- /** A suggestion chip was clicked (only in `suggestion-mode="fill"`). */
167
- 'kai-suggestion-click': { value: string };
168
- /** An action button on a message was clicked. `action` is the built-in name or
169
- * custom id. `state` is present only for the toggleable feedback votes:
170
- * `'on'` when a like/dislike is set, `'off'` when re-tapped to clear. */
171
- 'kai-message-action': { messageId: string; action: string; state?: 'on' | 'off' };
172
- /** The header model switcher changed. */
173
- 'kai-model-change': { modelId: string };
174
- /** The web-search (Globe) toolbar button was clicked. */
175
- 'kai-web-search': Record<string, never>;
176
- /** The Mic / voice button was clicked. */
177
- 'kai-voice': Record<string, never>;
178
- /** A conversation's history loaded: a row tap in the list, "new
179
- * conversation," or the visitor's own mount-time auto-restore of their
180
- * most recent thread (only fires when `conversations` is on and a `store`
181
- * is set). `detail.id` is that conversation's id, `undefined` for the
182
- * "new conversation" case (no id exists until the first message mints
183
- * one, C-6). Set `el.messages = event.detail.messages` (already a fresh
184
- * array) to actually render it, since this element does not do that for
185
- * you; `messages` stays your own state like everywhere else on this
186
- * element. */
187
- 'kai-conversation-load': { id: string | undefined; messages: ChatMessage[] };
188
- /** A `home.links` entry with no `href` was activated (tapped/clicked/Enter).
189
- * Meaningful only when `home` is set. */
190
- 'kai-home-link': { entry: HomeLinkEntry };
191
- }
192
-
193
- defineWebComponent<Props, Events>('kai-chat', {
194
- messages: [], value: undefined, placeholder: 'Send a message...', loading: false,
195
- suggestions: undefined, suggestionMode: 'submit', persistSuggestions: false, proseSize: 'sm',
196
- codeTheme: 'github-dark-dimmed', codeHighlight: true, chatTitle: undefined,
197
- models: undefined, currentModel: undefined, context: undefined, scrollButton: true,
198
- attach: true, webSearch: false, voice: false, triggers: undefined, kindIcons: undefined,
199
- actionsReveal: 'always', cardTypes: undefined, cardSchemas: undefined, accept: undefined,
200
- reasoning: undefined, reasoningOpen: undefined, conversations: false, store: undefined,
201
- home: undefined,
202
- }, (props, { dispatch, flag, reflectFlag, element, expose }) => {
203
- // `messages` is an untyped boundary: a consumer can hand it anything at
204
- // runtime (a pre-0.20.0 `{ id, role, content }` array, in particular). Skip
205
- // the invalid entries rather than let `groupMessageParts` throw deep inside a
206
- // render pass, which would blank the whole chat instead of one message.
207
- const validMessages = createMessagesGuard('kai-chat');
208
-
209
- // Slot detection is driven by the CHAT_SLOTS registry (single source of truth)
210
- // so slot names never drift between the view, the facade, and the docs.
211
- const [slots, setSlots] = createSignal<Record<string, boolean>>({});
212
- const slot = (name: string) => slots()[name] === true;
213
- onMount(() => {
214
- const read = () => setSlots(readSlots(element, CHAT_SLOTS));
215
- read();
216
- const observer = new MutationObserver(read);
217
- observer.observe(element, { childList: true });
218
- onCleanup(() => observer.disconnect());
219
- });
220
-
221
- // Reflect streaming state to a host attribute so slotted composer/notice CSS
222
- // can react without reading internals (e.g. :host([loading]) ::slotted(...)).
223
- // reflectFlag, not a hand-rolled toggleAttribute effect: the reflection is what
224
- // makes the property read back `undefined`, so the two belong in one call. See
225
- // WebComponentContext.reflectFlag.
226
- reflectFlag('loading');
227
-
228
- // Imperative method API — forward the chat-thread controller onto the host
229
- // (focus the composer, clear it, send programmatically, scroll the thread).
230
- let controller: ChatThreadController | undefined;
231
- expose({
232
- /** Focus the composer, meaning the contenteditable (or textarea) inside the
233
- * shadow root. A native `focus()` on the host lands on the host itself and
234
- * never reaches it, so this is the only way to focus the input
235
- * programmatically. */
236
- focus: (options?: FocusOptions) => controller?.focus(options),
237
- /** Blur whatever currently holds focus inside the shadow root. The companion
238
- * to `focus()`, for the same reason: a native `blur()` on the host misses
239
- * the real focus target. */
240
- blur: () => (element.shadowRoot?.activeElement as HTMLElement | null)?.blur(),
241
- /** Empty the COMPOSER: drops the draft text and every staged attachment, then
242
- * fires `kai-value-change` with `''`. It does NOT touch the thread. `messages`
243
- * is the consumer's own state, so clearing history stays the consumer's call. */
244
- clear: () => controller?.clear(),
245
- /** Submit whatever the composer currently holds, on the same path as Enter or
246
- * the send button: fires `kai-submit` with that value plus the staged
247
- * attachments, then drops the attachments. It takes no argument, so to send
248
- * text the user never typed, set `el.value` first. There is no empty-check,
249
- * so an empty composer still fires. The draft is cleared afterwards only when
250
- * `value` is uncontrolled; a controlled host owns its value and clears it
251
- * itself. Named `send`, not `submit`, to match the shared vocabulary. */
252
- send: () => controller?.send(),
253
- /** Scroll the message viewport to the newest message. Defaults to `'smooth'`;
254
- * pass `'instant'` to jump without animating. */
255
- scrollToBottom: (behavior?: ScrollBehavior) => controller?.scrollToBottom(behavior),
256
- });
257
-
258
- return (
259
- <ChatThread
260
- messages={validMessages(props.messages)} value={props.value as string | ComposerDoc | undefined} placeholder={props.placeholder as string}
261
- loading={flag('loading')} suggestions={props.suggestions as string[] | undefined}
262
- suggestionMode={props.suggestionMode as 'submit' | 'fill'} persistSuggestions={flag('persistSuggestions')}
263
- proseSize={props.proseSize as ProseSize}
264
- codeTheme={props.codeTheme as string} codeHighlight={flag('codeHighlight')}
265
- chatTitle={props.chatTitle as string | undefined} models={props.models as ModelOption[] | undefined}
266
- currentModel={props.currentModel as string | undefined} context={props.context as ChatThreadContextUsage | undefined}
267
- scrollButton={props.scrollButton !== false} attach={flag('attach')} webSearch={flag('webSearch')} voice={flag('voice')}
268
- reasoning={props.reasoning as 'full' | 'compact' | 'off' | undefined}
269
- reasoningOpen={flag('reasoningOpen')}
270
- triggers={props.triggers as TriggerDef[] | undefined}
271
- kindIcons={props.kindIcons as Record<string, string> | undefined}
272
- actionsReveal={props.actionsReveal as 'always' | 'hover'}
273
- cardTypes={cardComponentsFromTags(props.cardTypes as Record<string, string> | undefined, (props as { theme?: string }).theme)}
274
- cardSchemas={props.cardSchemas as Record<string, object> | undefined}
275
- conversations={flag('conversations')}
276
- store={props.store as ConversationStore | undefined}
277
- onConversationLoad={(messages, id) => dispatch('kai-conversation-load', { id, messages })}
278
- home={props.home as HomeConfig | undefined}
279
- onHomeLink={(entry) => dispatch('kai-home-link', { entry })}
280
- /* F-26: card parts emit off THIS element as the bubbling `kai-card` event,
281
- so `listenForCardEvents(el)` / addEventListener('kai-card') work. */
282
- cardHostElement={element}
283
- onValueChange={(value) => dispatch('kai-value-change', { value })}
284
- onSubmit={(detail) => dispatch('kai-submit', detail)}
285
- accept={props.accept as string | undefined}
286
- onAttachmentsChange={(attachments) => dispatch('kai-attachments-change', { attachments })}
287
- onAttachmentsRejected={(rejected) => dispatch('kai-attachments-rejected', { rejected })}
288
- onSuggestionClick={(value) => dispatch('kai-suggestion-click', { value })}
289
- onModelChange={(modelId) => dispatch('kai-model-change', { modelId })}
290
- onMessageAction={(detail) => dispatch('kai-message-action', detail)}
291
- onWebSearch={() => dispatch('kai-web-search', {})}
292
- onVoice={() => dispatch('kai-voice', {})}
293
- controllerRef={(c) => (controller = c)}
294
- headerStart={slot('header-start')}
295
- headerEnd={slot('header-end')}
296
- headerFull={slot('header')}
297
- sidebar={slot('sidebar')}
298
- empty={slot('empty')}
299
- composer={slot('composer')}
300
- composerActions={slot('composer-actions')}
301
- footer={slot('footer')}
302
- />
303
- );
304
- });