@kitn.ai/ui 0.27.0 → 0.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (612) hide show
  1. package/README.md +10 -2
  2. package/dist/{Icon-BnFKqqtY.js → Icon-DObhsRtm.js} +1 -1
  3. package/dist/{action-icons-CBskfBMz.js → action-icons-CcgNN2oT.js} +1 -1
  4. package/dist/agent-tooling/construct/public.d.ts +15 -0
  5. package/dist/agent-tooling/construct/schema.d.ts +111 -0
  6. package/dist/arrow-down-CjRU3JgV.js +1 -0
  7. package/dist/arrow-left-Bnpb1UEW.js +1 -0
  8. package/dist/{artifact-CvXEm1lS.js → artifact-Bwt7OgcR.js} +1 -1
  9. package/dist/{attachments-C43ZegEq.js → attachments-Qr4kg-2b.js} +1 -1
  10. package/dist/{audio-visualizer-B-79y1Tj.js → audio-visualizer-DToYdfSc.js} +1 -1
  11. package/dist/{badge-BpUbq8c0.js → badge-CdEu_jn2.js} +1 -1
  12. package/dist/{bell-sn17Ip9v.js → bell-DQAAOpDz.js} +1 -1
  13. package/dist/{button-BH6rN0U-.js → button-DkuOnGLy.js} +1 -1
  14. package/dist/{card-renderer-Cb1gQmth.js → card-renderer-Jx70m6_l.js} +1 -1
  15. package/dist/{card-routing-DifQgS7n.js → card-routing-0YidER_3.js} +1 -1
  16. package/dist/check-njkVdZu2.js +1 -0
  17. package/dist/{checkbox-Dc9Yov_B.js → checkbox-D7iRB3nL.js} +1 -1
  18. package/dist/{checkbox-group-B1kDLLYk.js → checkbox-group-B2_rpoPM.js} +1 -1
  19. package/dist/chevron-down-B72s6PXR.js +1 -0
  20. package/dist/chevron-right-BatuHzUm.js +1 -0
  21. package/dist/{choice-card-BT3c1S8g.js → choice-card-m0BYqqOK.js} +1 -1
  22. package/dist/circle-check-B62pODB3.js +1 -0
  23. package/dist/{circle-x-wobWkoSx.js → circle-x-BPG0iPst.js} +1 -1
  24. package/dist/circle-zx0ByzY9.js +1 -0
  25. package/dist/code-block-ClMLKb7C.js +1 -0
  26. package/dist/{collapsible-CPJbf6FM.js → collapsible-B4DlWicL.js} +1 -1
  27. package/dist/components/chat-thread.d.ts +89 -1
  28. package/dist/components/conversation-item.d.ts +16 -0
  29. package/dist/components/conversation-panel.d.ts +29 -0
  30. package/dist/components/home-panel.d.ts +34 -0
  31. package/dist/components/widget-tab-bar.d.ts +16 -0
  32. package/dist/{composer-CjngLzal.js → composer-sQ0HcvyG.js} +3 -3
  33. package/dist/{confirm-card-DCx_A4bU.js → confirm-card-rQWDQsnC.js} +1 -1
  34. package/dist/construct-cli.es.js +185 -17
  35. package/dist/construct.d.ts +5 -0
  36. package/dist/construct.js +327 -0
  37. package/dist/{context-BY8V-Nlp.js → context-0kg4ZX1J.js} +1 -1
  38. package/dist/controllable-CnGpMF6r.js +1 -0
  39. package/dist/conversation-item-BxwQLaFJ.js +1 -0
  40. package/dist/conversation-list-BCfGN1JU.js +1 -0
  41. package/dist/{copy-B6DO4PqB.js → copy-n9u9rqpi.js} +1 -1
  42. package/dist/core-C8fzo39E.js +1 -12
  43. package/dist/{create-tween-CnMHviKB.js → create-tween-C-q-JCM-.js} +1 -1
  44. package/dist/{create-tween-D1aiGZZh.js → create-tween-CRrJXxBd.js} +1 -1
  45. package/dist/{create-tween-BPzaefTp.js → create-tween-DZ3RRDHD.js} +1 -1
  46. package/dist/{create-tween-DUSQUKpr.js → create-tween-uPkArjIG.js} +1 -1
  47. package/dist/custom-elements.json +51 -2
  48. package/dist/{default-input-CucQEOqH.js → default-input-CaMrJkgH.js} +1 -1
  49. package/dist/define-By-uL588.js +1 -0
  50. package/dist/define.js +2 -2
  51. package/dist/define.server.js +2 -2
  52. package/dist/{disclosure-CbLtajUQ.js → disclosure-WUImBbDv.js} +1 -1
  53. package/dist/{dropdown-BwhViJFd.js → dropdown-wZVeJOMd.js} +1 -1
  54. package/dist/elements/agent-card.js +1 -1
  55. package/dist/elements/artifact.js +1 -1
  56. package/dist/elements/attachments.js +1 -1
  57. package/dist/elements/audio-visualizer.js +1 -1
  58. package/dist/elements/avatar.js +1 -1
  59. package/dist/elements/badge.js +1 -1
  60. package/dist/elements/button.js +1 -1
  61. package/dist/elements/card.js +1 -1
  62. package/dist/elements/cards.js +1 -1
  63. package/dist/elements/chain-of-thought.js +1 -1
  64. package/dist/elements/chat-scope-picker.js +1 -1
  65. package/dist/elements/chat-workspace.js +1 -1
  66. package/dist/elements/chat.js +1 -1
  67. package/dist/elements/checkbox-group.js +1 -1
  68. package/dist/elements/checkbox.js +1 -1
  69. package/dist/elements/checkpoint.js +1 -1
  70. package/dist/elements/choice.js +1 -1
  71. package/dist/elements/coachmark.js +1 -1
  72. package/dist/elements/code-block.js +1 -1
  73. package/dist/elements/command.js +1 -1
  74. package/dist/elements/compare.js +1 -1
  75. package/dist/elements/composer.js +1 -1
  76. package/dist/elements/confirm-card.js +1 -1
  77. package/dist/elements/context-meter.js +1 -1
  78. package/dist/elements/conversation-item.js +1 -1
  79. package/dist/elements/conversation-list.js +1 -1
  80. package/dist/elements/dialog.js +1 -1
  81. package/dist/elements/dock.js +3 -3
  82. package/dist/elements/dropdown.js +1 -1
  83. package/dist/elements/editable-label.js +1 -1
  84. package/dist/elements/embed.js +1 -1
  85. package/dist/elements/empty.js +1 -1
  86. package/dist/elements/feedback-bar.js +1 -1
  87. package/dist/elements/file-tree.js +1 -1
  88. package/dist/elements/file-upload.js +1 -1
  89. package/dist/elements/form.js +1 -1
  90. package/dist/elements/hover-card.js +1 -1
  91. package/dist/elements/icon.js +1 -1
  92. package/dist/elements/image.js +1 -1
  93. package/dist/elements/input.js +1 -1
  94. package/dist/elements/kbd.js +1 -1
  95. package/dist/elements/link-preview.js +1 -1
  96. package/dist/elements/loader.js +1 -1
  97. package/dist/elements/markdown.js +1 -1
  98. package/dist/elements/menu.js +1 -1
  99. package/dist/elements/message-skills.js +1 -1
  100. package/dist/elements/message.js +1 -1
  101. package/dist/elements/model-switcher.js +1 -1
  102. package/dist/elements/nav.js +1 -1
  103. package/dist/elements/notice.js +1 -1
  104. package/dist/elements/pane-grid.js +1 -1
  105. package/dist/elements/pane-group.js +1 -1
  106. package/dist/elements/pane.js +1 -1
  107. package/dist/elements/popover.js +1 -1
  108. package/dist/elements/progress-bar.js +1 -1
  109. package/dist/elements/prompt-dock.js +1 -1
  110. package/dist/elements/prompt-input.js +1 -1
  111. package/dist/elements/prompt-suggestions.js +1 -1
  112. package/dist/elements/radio-group.js +1 -1
  113. package/dist/elements/reasoning.js +1 -1
  114. package/dist/elements/remote.js +1 -1
  115. package/dist/elements/resizable.js +1 -1
  116. package/dist/elements/response-stream.js +1 -1
  117. package/dist/elements/screen.js +1 -1
  118. package/dist/elements/scroll-area.js +1 -1
  119. package/dist/elements/scroll-button.js +1 -1
  120. package/dist/elements/search.js +1 -1
  121. package/dist/elements/segmented.js +1 -1
  122. package/dist/elements/select.js +1 -1
  123. package/dist/elements/separator.js +1 -1
  124. package/dist/elements/setting-item.js +1 -1
  125. package/dist/elements/settings-group.js +1 -1
  126. package/dist/elements/skeleton.js +1 -1
  127. package/dist/elements/slider.js +1 -1
  128. package/dist/elements/source.js +1 -1
  129. package/dist/elements/status.js +1 -1
  130. package/dist/elements/switch.js +1 -1
  131. package/dist/elements/tabs.js +1 -1
  132. package/dist/elements/tasks.js +1 -1
  133. package/dist/elements/text-shimmer.js +1 -1
  134. package/dist/elements/thinking-bar.js +1 -1
  135. package/dist/elements/thread.js +1 -1
  136. package/dist/elements/toast.js +1 -1
  137. package/dist/elements/tool.js +1 -1
  138. package/dist/elements/tooltip.js +1 -1
  139. package/dist/elements/voice-input.js +1 -1
  140. package/dist/elements/voice-output.js +1 -1
  141. package/dist/elements.d.ts +20 -4
  142. package/dist/{ellipsis-DFr4Vqr3.js → ellipsis-CbOpJnU3.js} +1 -1
  143. package/dist/{embed-5s_vU4J0.js → embed-CrfjkbUG.js} +1 -1
  144. package/dist/engine-javascript-C1x7zo1_.js +1 -141
  145. package/dist/{external-link-u9d85ORQ.js → external-link-ByXAwBBQ.js} +1 -1
  146. package/dist/{file-text-CX7_x42o.js → file-text-DMib2qwt.js} +1 -1
  147. package/dist/{file-tree-D3kBjXI5.js → file-tree-CJqM2aP7.js} +1 -1
  148. package/dist/{folder-V-YdIL8f.js → folder-_BAb929C.js} +1 -1
  149. package/dist/{form-BRNUMCN2.js → form-DSZgZQZk.js} +1 -1
  150. package/dist/{hover-card-DaeiYrTA.js → hover-card-BQbul9eq.js} +1 -1
  151. package/dist/{icon-BpixdZNq.js → icon-CdcfRhYI.js} +1 -1
  152. package/dist/index.d.ts +3 -1
  153. package/dist/index.js +2842 -2703
  154. package/dist/index.server.js +2820 -2681
  155. package/dist/{info-8mFsIjS3.js → info-DsFjGuI_.js} +1 -1
  156. package/dist/{input-d1Yuu-hz.js → input-DKbmkMos.js} +1 -1
  157. package/dist/kai.es.js +1 -1
  158. package/dist/{kbd-961zMPFB.js → kbd-PvdGhX4s.js} +1 -1
  159. package/dist/{link-preview-DIIbV2Sd.js → link-preview-DbM1866N.js} +1 -1
  160. package/dist/{link-DlZZBGaR.js → link-zF8PzWfF.js} +1 -1
  161. package/dist/{loader-YQszHFaW.js → loader-BM4CEz4G.js} +1 -1
  162. package/dist/{markdown-CVk1MPsj.js → markdown-LMvmAyBk.js} +7 -7
  163. package/dist/mcp.es.js +79 -5
  164. package/dist/{message-CwKVEdZg.js → message-BSsgvHvf.js} +1 -1
  165. package/dist/{message-DS8lzHc1.js → message-BYZECyek.js} +1 -1
  166. package/dist/message-circle-DruwObfX.js +1 -0
  167. package/dist/message-square-BG6q6mlm.js +1 -0
  168. package/dist/{minimize-2-UEZmP2QT.js → minimize-2-BQRoBV1V.js} +1 -1
  169. package/dist/{model-switcher-Kk1jEQ5t.js → model-switcher-CMpCOYcB.js} +1 -1
  170. package/dist/{overlay-C1od6LOz.js → overlay-Cb-MkyDa.js} +1 -1
  171. package/dist/{panel-right-ryET0yyn.js → panel-right-i8warFxT.js} +1 -1
  172. package/dist/{paperclip-BDNoZFJP.js → paperclip-ByY3UVO6.js} +1 -1
  173. package/dist/play-BvKKq3fX.js +1 -0
  174. package/dist/primitives/conversation-store.d.ts +54 -0
  175. package/dist/{progress-bar-BvYX0aoy.js → progress-bar-jVAHvMUf.js} +1 -1
  176. package/dist/{prompt-suggestion-BRFu2lcu.js → prompt-suggestion-CD-qtNgC.js} +1 -1
  177. package/dist/{radio-DcL23cNJ.js → radio-BsoBMhkF.js} +1 -1
  178. package/dist/react/index.d.ts +393 -0
  179. package/dist/react.js +20 -20
  180. package/dist/{reasoning-Cackq4Rh.js → reasoning-4kBPtlTx.js} +1 -1
  181. package/dist/register-impl-B1hLkrI8.js +424 -0
  182. package/dist/{resizable-Cp9HUYih.js → resizable-uPmY9VY-.js} +1 -1
  183. package/dist/{rotate-ccw-0DLRDHH5.js → rotate-ccw-B2xn93py.js} +1 -1
  184. package/dist/{rotate-cw-DOB9IGcU.js → rotate-cw-CMVLoCyH.js} +1 -1
  185. package/dist/{scroll-area-emVmWP4K.js → scroll-area-BqLUo8ZZ.js} +1 -1
  186. package/dist/{scroll-button-CeP_gv1x.js → scroll-button-DslXiJyL.js} +1 -1
  187. package/dist/{select-CWmu00tS.js → select-2cLRtPGT.js} +1 -1
  188. package/dist/{separator-CE6vly6z.js → separator-BWQtNJcM.js} +1 -1
  189. package/dist/{settings-CE-78SvZ.js → settings-BBR63jLg.js} +1 -1
  190. package/dist/{settings-group-ZFWNxFQR.js → settings-group-B2ciy-Iw.js} +1 -1
  191. package/dist/{skeleton-BebdP4mf.js → skeleton-CkHI-HgC.js} +1 -1
  192. package/dist/{slider-BAKRYUlz.js → slider-DDR9U-i0.js} +1 -1
  193. package/dist/{solid-BE5ui6sy.js → solid-BzCFdL25.js} +7720 -7058
  194. package/dist/{solid-DFhsce3O.js → solid-DruVOXnf.js} +5864 -5283
  195. package/dist/solid.d.ts +6 -2
  196. package/dist/solid.js +217 -210
  197. package/dist/solid.server.js +217 -210
  198. package/dist/{source-B0FlguSx.js → source-GEnFF528.js} +1 -1
  199. package/dist/{star-CBMZvLuN.js → star-CilHq8GP.js} +1 -1
  200. package/dist/store-Ciyk6eZG.js +1 -0
  201. package/dist/{switch-CViARZCy.js → switch-KkeQIbuH.js} +1 -1
  202. package/dist/{tasks-card-MjCcOhR_.js → tasks-card-BrN4bggJ.js} +1 -1
  203. package/dist/{text-shimmer-DKlwRF2G.js → text-shimmer-Dcj1MHuq.js} +1 -1
  204. package/dist/{textarea-3ay2Me2-.js → textarea-Dpvbngbg.js} +1 -1
  205. package/dist/theme.tokens.css +28 -0
  206. package/dist/{thumbs-up-DQcu2HMO.js → thumbs-up-CsT9Wzb9.js} +1 -1
  207. package/dist/{toast-store-C6yKOhbk.js → toast-store-tgK6MuMv.js} +1 -1
  208. package/dist/{tool-BCYNlfKy.js → tool-DzUjIBT8.js} +1 -1
  209. package/dist/{tooltip-05zI4hjs.js → tooltip-Bkkg_4t0.js} +1 -1
  210. package/dist/{trash-2-BR1RxGky.js → trash-2-jBKxjGGQ.js} +1 -1
  211. package/dist/{triangle-alert-DHohDOCy.js → triangle-alert-DlQ68ppf.js} +1 -1
  212. package/dist/types.d.ts +48 -3
  213. package/dist/ui/dock.d.ts +29 -0
  214. package/dist/{upload-BbGW6A_u.js → upload-TcAHXv9W.js} +1 -1
  215. package/dist/{url-scheme-policy-DHpoTJwB.js → url-scheme-policy-DR5DgvkM.js} +1 -1
  216. package/dist/{use-card-resolution-CJW4grFa.js → use-card-resolution-DaZqAdWf.js} +1 -1
  217. package/dist/{variant-aurora-xiMPty8f.js → variant-aurora-BhLuYxJR.js} +1 -1
  218. package/dist/{variant-aurora-BUOVgPOB.js → variant-aurora-CNmfHhcx.js} +2 -2
  219. package/dist/{variant-aurora-CUsUJvFI.js → variant-aurora-D6GsdTPA.js} +2 -2
  220. package/dist/{variant-aurora-CW2i4bfr.js → variant-aurora-DbW_OWL2.js} +1 -1
  221. package/dist/{variant-custom-D91HjAKz.js → variant-custom-BRvaNHSi.js} +1 -1
  222. package/dist/{variant-custom-BQtOnmeO.js → variant-custom-BvYHR62b.js} +1 -1
  223. package/dist/{variant-custom-CAnzzppW.js → variant-custom-DMTrEO5w.js} +2 -2
  224. package/dist/{variant-custom-CAm9L-E5.js → variant-custom-DV2x254s.js} +2 -2
  225. package/dist/{variant-wave-Ca1Ls4_y.js → variant-wave-BNMGrDfj.js} +2 -2
  226. package/dist/{variant-wave-uY5crU_K.js → variant-wave-BpDd8t3Z.js} +1 -1
  227. package/dist/{variant-wave-CxX39DKd.js → variant-wave-CyBueXj9.js} +2 -2
  228. package/dist/{variant-wave-DYyzIIZv.js → variant-wave-sp-qwsdI.js} +1 -1
  229. package/dist/x-Z5UntkIJ.js +1 -0
  230. package/frameworks/react/index.tsx +14 -4
  231. package/llms-full.txt +7 -2
  232. package/package.json +16 -16
  233. package/src/elements/element-meta.json +49 -6
  234. package/theme.css +28 -0
  235. package/bin/route.test.js +0 -58
  236. package/dist/arrow-down-Br0qtpsz.js +0 -1
  237. package/dist/arrow-left-Dj7xgE12.js +0 -1
  238. package/dist/check-DPeeMUYx.js +0 -1
  239. package/dist/chevron-down-CHSWk7ZT.js +0 -1
  240. package/dist/chevron-right-B7l_fMgx.js +0 -1
  241. package/dist/circle-Bb0yOpqM.js +0 -1
  242. package/dist/circle-check-BGZpCiz7.js +0 -1
  243. package/dist/code-block-CUQ5mtv0.js +0 -1
  244. package/dist/controllable-D43BKmtX.js +0 -1
  245. package/dist/conversation-list-D4lLU_yS.js +0 -1
  246. package/dist/define-CGGX-7Vg.js +0 -1
  247. package/dist/message-circle-Xf8Q-vZp.js +0 -1
  248. package/dist/message-square-Cxnwgkns.js +0 -1
  249. package/dist/play-OFIvYXUQ.js +0 -1
  250. package/dist/register-impl-C7rENvPK.js +0 -424
  251. package/dist/store-7eoadydQ.js +0 -1
  252. package/dist/x-C5m1JFgi.js +0 -1
  253. package/src/agent-tooling/archetypes.ts +0 -205
  254. package/src/agent-tooling/catalog/README.md +0 -676
  255. package/src/agent-tooling/catalog/catalog-types.ts +0 -231
  256. package/src/agent-tooling/catalog/fabrications.ts +0 -96
  257. package/src/agent-tooling/catalog/invariants.ts +0 -284
  258. package/src/agent-tooling/catalog/labs-titles.ts +0 -114
  259. package/src/agent-tooling/catalog/scenarios.ts +0 -87
  260. package/src/agent-tooling/catalog/surfaces.ts +0 -347
  261. package/src/agent-tooling/construct/cli-entry.ts +0 -8
  262. package/src/agent-tooling/construct/cli.ts +0 -131
  263. package/src/agent-tooling/construct/codegen.ts +0 -1353
  264. package/src/agent-tooling/construct/construct.v1.schema.json +0 -250
  265. package/src/agent-tooling/construct/dev.ts +0 -148
  266. package/src/agent-tooling/construct/fixtures/demo-widget.construct.json +0 -7
  267. package/src/agent-tooling/construct/fixtures/ops-console.construct.json +0 -44
  268. package/src/agent-tooling/construct/fixtures/owner-widget.construct.json +0 -23
  269. package/src/agent-tooling/construct/schema.ts +0 -371
  270. package/src/agent-tooling/integrations/anthropic.ts +0 -442
  271. package/src/agent-tooling/integrations/cloudflare.ts +0 -218
  272. package/src/agent-tooling/integrations/langgraph.ts +0 -133
  273. package/src/agent-tooling/integrations/mastra.ts +0 -182
  274. package/src/agent-tooling/integrations/mock.ts +0 -148
  275. package/src/agent-tooling/integrations/ollama.ts +0 -97
  276. package/src/agent-tooling/integrations/openai.ts +0 -95
  277. package/src/agent-tooling/integrations/openrouter.ts +0 -82
  278. package/src/agent-tooling/integrations/pi.ts +0 -176
  279. package/src/agent-tooling/integrations/pydantic-ai.ts +0 -108
  280. package/src/agent-tooling/integrations/vercel-ai-sdk.ts +0 -398
  281. package/src/agent-tooling/mcp/css-raw.d.ts +0 -12
  282. package/src/agent-tooling/mcp/manifest.ts +0 -422
  283. package/src/agent-tooling/mcp/server.ts +0 -116
  284. package/src/agent-tooling/mcp/stdio.ts +0 -18
  285. package/src/agent-tooling/mcp/tools/construct.ts +0 -130
  286. package/src/agent-tooling/mcp/tools/debug.ts +0 -621
  287. package/src/agent-tooling/mcp/tools/reference.ts +0 -980
  288. package/src/agent-tooling/mcp/tools/scaffold.ts +0 -6708
  289. package/src/agent-tooling/mcp/tools/theme.ts +0 -456
  290. package/src/agent-tooling/mcp/tools/types.ts +0 -14
  291. package/src/agent-tooling/mcp/validate-args.ts +0 -141
  292. package/src/agent-tooling/recipes/composed-thread.ts +0 -714
  293. package/src/agent-tooling/recipes/index.ts +0 -22
  294. package/src/agent-tooling/recipes/types.ts +0 -32
  295. package/src/agent-tooling/registry.ts +0 -132
  296. package/src/agent-tooling/route-emit.ts +0 -305
  297. package/src/agent-tooling/types.ts +0 -390
  298. package/src/components/artifact-card.tsx +0 -120
  299. package/src/components/artifact.tsx +0 -914
  300. package/src/components/attachment-types.ts +0 -66
  301. package/src/components/attachments.tsx +0 -536
  302. package/src/components/audio-visualizer/audio-visualizer.voice-fixture.ts +0 -257
  303. package/src/components/audio-visualizer/aurora.glsl.ts +0 -330
  304. package/src/components/audio-visualizer/fit-scale.ts +0 -112
  305. package/src/components/audio-visualizer/index.tsx +0 -528
  306. package/src/components/audio-visualizer/labs/lab-choreography.ts +0 -187
  307. package/src/components/audio-visualizer/labs/lab-shaders.ts +0 -363
  308. package/src/components/audio-visualizer/labs/lab-visualizer.tsx +0 -102
  309. package/src/components/audio-visualizer/shader-canvas.tsx +0 -876
  310. package/src/components/audio-visualizer/sizes.ts +0 -54
  311. package/src/components/audio-visualizer/variant-aurora.tsx +0 -305
  312. package/src/components/audio-visualizer/variant-bar.tsx +0 -175
  313. package/src/components/audio-visualizer/variant-custom.tsx +0 -344
  314. package/src/components/audio-visualizer/variant-grid.tsx +0 -175
  315. package/src/components/audio-visualizer/variant-radial.tsx +0 -163
  316. package/src/components/audio-visualizer/variant-wave.tsx +0 -130
  317. package/src/components/audio-visualizer/wave.glsl.ts +0 -130
  318. package/src/components/card-fallback.tsx +0 -60
  319. package/src/components/card-renderer.tsx +0 -220
  320. package/src/components/card.tsx +0 -212
  321. package/src/components/chain-of-thought.tsx +0 -348
  322. package/src/components/chat-container.tsx +0 -89
  323. package/src/components/chat-scope-picker.tsx +0 -57
  324. package/src/components/chat-thread.tsx +0 -518
  325. package/src/components/checkpoint.tsx +0 -88
  326. package/src/components/choice-card.tsx +0 -743
  327. package/src/components/coachmark.tsx +0 -249
  328. package/src/components/code-block.tsx +0 -181
  329. package/src/components/composer-dom.ts +0 -159
  330. package/src/components/composer-highlight.ts +0 -242
  331. package/src/components/composer-history.ts +0 -82
  332. package/src/components/composer.tsx +0 -1075
  333. package/src/components/confirm-card.tsx +0 -402
  334. package/src/components/context.tsx +0 -377
  335. package/src/components/conversation-item.tsx +0 -218
  336. package/src/components/conversation-list.tsx +0 -429
  337. package/src/components/dismissed-stub.tsx +0 -80
  338. package/src/components/embed.tsx +0 -200
  339. package/src/components/empty.tsx +0 -177
  340. package/src/components/feedback-bar.tsx +0 -166
  341. package/src/components/file-tree.tsx +0 -530
  342. package/src/components/file-upload.tsx +0 -167
  343. package/src/components/form-widgets.tsx +0 -525
  344. package/src/components/form.tsx +0 -1296
  345. package/src/components/image.tsx +0 -65
  346. package/src/components/link-preview.tsx +0 -195
  347. package/src/components/loader.tsx +0 -367
  348. package/src/components/markdown.tsx +0 -162
  349. package/src/components/message-skills.tsx +0 -40
  350. package/src/components/message.tsx +0 -765
  351. package/src/components/model-switcher.tsx +0 -132
  352. package/src/components/prompt-input.tsx +0 -188
  353. package/src/components/prompt-suggestion.tsx +0 -150
  354. package/src/components/reasoning.tsx +0 -293
  355. package/src/components/response-compare-types.ts +0 -152
  356. package/src/components/response-compare.tsx +0 -455
  357. package/src/components/response-stream.tsx +0 -109
  358. package/src/components/screen.tsx +0 -181
  359. package/src/components/scroll-button.tsx +0 -93
  360. package/src/components/source.tsx +0 -192
  361. package/src/components/tasks-card.tsx +0 -801
  362. package/src/components/text-shimmer.tsx +0 -37
  363. package/src/components/thinking-bar.tsx +0 -50
  364. package/src/components/thread.tsx +0 -228
  365. package/src/components/toast.tsx +0 -503
  366. package/src/components/tool-classify.ts +0 -26
  367. package/src/components/tool-types.ts +0 -49
  368. package/src/components/tool.tsx +0 -190
  369. package/src/components/use-card-resolution.ts +0 -44
  370. package/src/components/voice-input.tsx +0 -222
  371. package/src/components/voice-output.tsx +0 -242
  372. package/src/components/workspace-shell.tsx +0 -285
  373. package/src/diagnostics/hook.ts +0 -352
  374. package/src/diagnostics/index.ts +0 -82
  375. package/src/diagnostics/report-request.ts +0 -296
  376. package/src/elements/agent-card.tsx +0 -67
  377. package/src/elements/artifact.tsx +0 -194
  378. package/src/elements/attachments.tsx +0 -140
  379. package/src/elements/audio-visualizer.tsx +0 -227
  380. package/src/elements/autoloader.ts +0 -89
  381. package/src/elements/avatar.tsx +0 -33
  382. package/src/elements/badge.tsx +0 -32
  383. package/src/elements/button.tsx +0 -149
  384. package/src/elements/card.tsx +0 -133
  385. package/src/elements/cards.tsx +0 -266
  386. package/src/elements/chain-of-thought.tsx +0 -141
  387. package/src/elements/chat-scope-picker.tsx +0 -65
  388. package/src/elements/chat-types.ts +0 -102
  389. package/src/elements/chat-workspace.tsx +0 -188
  390. package/src/elements/chat.tsx +0 -212
  391. package/src/elements/checkbox-group.tsx +0 -164
  392. package/src/elements/checkbox.tsx +0 -134
  393. package/src/elements/checkpoint.tsx +0 -47
  394. package/src/elements/choice.tsx +0 -100
  395. package/src/elements/coachmark.tsx +0 -90
  396. package/src/elements/code-block.tsx +0 -60
  397. package/src/elements/command.tsx +0 -197
  398. package/src/elements/compare.tsx +0 -111
  399. package/src/elements/compiled.css +0 -2
  400. package/src/elements/composer.tsx +0 -162
  401. package/src/elements/confirm-card.tsx +0 -76
  402. package/src/elements/context-meter.tsx +0 -107
  403. package/src/elements/conversation-item.tsx +0 -120
  404. package/src/elements/conversation-list.tsx +0 -203
  405. package/src/elements/css.ts +0 -5
  406. package/src/elements/default-input.tsx +0 -392
  407. package/src/elements/define-entry.ts +0 -12
  408. package/src/elements/define.tsx +0 -563
  409. package/src/elements/diagnostic-events.ts +0 -114
  410. package/src/elements/dialog.tsx +0 -145
  411. package/src/elements/disclosure.ts +0 -95
  412. package/src/elements/dock.tsx +0 -215
  413. package/src/elements/dropdown.tsx +0 -123
  414. package/src/elements/editable-label.tsx +0 -140
  415. package/src/elements/element-data-types.ts +0 -152
  416. package/src/elements/element-diagnostics.ts +0 -392
  417. package/src/elements/element-manifest.json +0 -354
  418. package/src/elements/element-nonscalar.json +0 -185
  419. package/src/elements/element-types.d.ts +0 -4337
  420. package/src/elements/embed.tsx +0 -35
  421. package/src/elements/empty.tsx +0 -29
  422. package/src/elements/feedback-bar.tsx +0 -66
  423. package/src/elements/file-tree.tsx +0 -62
  424. package/src/elements/file-upload.tsx +0 -44
  425. package/src/elements/form.tsx +0 -94
  426. package/src/elements/hover-card.tsx +0 -80
  427. package/src/elements/icon.tsx +0 -41
  428. package/src/elements/image.tsx +0 -32
  429. package/src/elements/input.tsx +0 -492
  430. package/src/elements/kbd.tsx +0 -45
  431. package/src/elements/link-preview.tsx +0 -34
  432. package/src/elements/loader.tsx +0 -25
  433. package/src/elements/markdown.tsx +0 -38
  434. package/src/elements/menu.tsx +0 -241
  435. package/src/elements/message-skills.tsx +0 -83
  436. package/src/elements/message.tsx +0 -361
  437. package/src/elements/model-switcher.tsx +0 -121
  438. package/src/elements/nav.tsx +0 -87
  439. package/src/elements/notice.tsx +0 -53
  440. package/src/elements/pane-grid.tsx +0 -111
  441. package/src/elements/pane-group.tsx +0 -119
  442. package/src/elements/pane.tsx +0 -129
  443. package/src/elements/popover.tsx +0 -81
  444. package/src/elements/progress-bar.tsx +0 -39
  445. package/src/elements/prompt-dock.tsx +0 -82
  446. package/src/elements/prompt-input.tsx +0 -240
  447. package/src/elements/prompt-suggestions.tsx +0 -113
  448. package/src/elements/radio-group.tsx +0 -129
  449. package/src/elements/reasoning.tsx +0 -71
  450. package/src/elements/register-impl.ts +0 -148
  451. package/src/elements/register.ts +0 -76
  452. package/src/elements/remote.tsx +0 -225
  453. package/src/elements/resizable.globals.d.ts +0 -36
  454. package/src/elements/resizable.tsx +0 -704
  455. package/src/elements/response-stream.tsx +0 -40
  456. package/src/elements/screen.tsx +0 -90
  457. package/src/elements/scroll-area.tsx +0 -33
  458. package/src/elements/scroll-button.tsx +0 -179
  459. package/src/elements/search.tsx +0 -185
  460. package/src/elements/segmented.tsx +0 -129
  461. package/src/elements/select.tsx +0 -165
  462. package/src/elements/separator.tsx +0 -36
  463. package/src/elements/setting-item.tsx +0 -50
  464. package/src/elements/settings-group.tsx +0 -37
  465. package/src/elements/skeleton.tsx +0 -45
  466. package/src/elements/slider.tsx +0 -171
  467. package/src/elements/slot-text.ts +0 -73
  468. package/src/elements/slots.ts +0 -787
  469. package/src/elements/source.tsx +0 -126
  470. package/src/elements/status.tsx +0 -42
  471. package/src/elements/styles.css +0 -328
  472. package/src/elements/switch.tsx +0 -118
  473. package/src/elements/tabs.tsx +0 -95
  474. package/src/elements/tasks.tsx +0 -103
  475. package/src/elements/text-shimmer.tsx +0 -28
  476. package/src/elements/thinking-bar.tsx +0 -43
  477. package/src/elements/thread.tsx +0 -139
  478. package/src/elements/toast.tsx +0 -106
  479. package/src/elements/tool.tsx +0 -78
  480. package/src/elements/tooltip.tsx +0 -85
  481. package/src/elements/validate-messages.ts +0 -76
  482. package/src/elements/voice-input.tsx +0 -100
  483. package/src/elements/voice-output.tsx +0 -82
  484. package/src/index.ts +0 -428
  485. package/src/primitives/audio-bands.ts +0 -174
  486. package/src/primitives/card-component-types.ts +0 -63
  487. package/src/primitives/card-contract.ts +0 -80
  488. package/src/primitives/card-data-types.ts +0 -361
  489. package/src/primitives/card-host.tsx +0 -37
  490. package/src/primitives/card-recovery.ts +0 -160
  491. package/src/primitives/card-registry.tsx +0 -78
  492. package/src/primitives/card-resolution.ts +0 -36
  493. package/src/primitives/card-routing.ts +0 -85
  494. package/src/primitives/card-schemas/artifact.schema.json +0 -92
  495. package/src/primitives/card-schemas/card-envelope.schema.json +0 -14
  496. package/src/primitives/card-schemas/card-event.schema.json +0 -12
  497. package/src/primitives/card-schemas/choice.schema.json +0 -75
  498. package/src/primitives/card-schemas/confirm.schema.json +0 -65
  499. package/src/primitives/card-schemas/embed.schema.json +0 -63
  500. package/src/primitives/card-schemas/form.result.schema.json +0 -7
  501. package/src/primitives/card-schemas/form.schema.json +0 -53
  502. package/src/primitives/card-schemas/link.schema.json +0 -54
  503. package/src/primitives/card-schemas/tasks.result.schema.json +0 -16
  504. package/src/primitives/card-schemas/tasks.schema.json +0 -83
  505. package/src/primitives/card-tags.ts +0 -61
  506. package/src/primitives/card-validate-cards.ts +0 -255
  507. package/src/primitives/card-validate-schemas.ts +0 -58
  508. package/src/primitives/card-validate.ts +0 -131
  509. package/src/primitives/chat-config.tsx +0 -103
  510. package/src/primitives/composer-model.ts +0 -49
  511. package/src/primitives/composer-triggers.ts +0 -35
  512. package/src/primitives/controllable.ts +0 -21
  513. package/src/primitives/create-kai-chat.ts +0 -66
  514. package/src/primitives/create-tween.ts +0 -266
  515. package/src/primitives/embed-providers.ts +0 -254
  516. package/src/primitives/field-mask.ts +0 -256
  517. package/src/primitives/field-semantics.ts +0 -115
  518. package/src/primitives/highlighter.ts +0 -157
  519. package/src/primitives/input-mask.ts +0 -853
  520. package/src/primitives/link-preview.ts +0 -87
  521. package/src/primitives/message-feedback.ts +0 -124
  522. package/src/primitives/pdf-preview.ts +0 -121
  523. package/src/primitives/toast-store.ts +0 -338
  524. package/src/primitives/url-scheme-policy.ts +0 -70
  525. package/src/primitives/use-audio-analysis.ts +0 -340
  526. package/src/primitives/use-auto-resize.ts +0 -31
  527. package/src/primitives/use-resize-observer.ts +0 -45
  528. package/src/primitives/use-sequencer.ts +0 -72
  529. package/src/primitives/use-speech-recognition.ts +0 -146
  530. package/src/primitives/use-stick-to-bottom.ts +0 -75
  531. package/src/primitives/use-text-stream.ts +0 -143
  532. package/src/primitives/use-voice-recorder.ts +0 -62
  533. package/src/primitives/visualizer-sequences.ts +0 -350
  534. package/src/remote/host-embed.ts +0 -345
  535. package/src/remote/index.ts +0 -2
  536. package/src/remote/origin.ts +0 -30
  537. package/src/remote/provider-runtime.ts +0 -262
  538. package/src/remote/provider.ts +0 -2
  539. package/src/remote/validate.ts +0 -22
  540. package/src/remote/version.ts +0 -12
  541. package/src/remote/wire.ts +0 -48
  542. package/src/schemas/from-tool-call.ts +0 -151
  543. package/src/schemas/index.ts +0 -341
  544. package/src/schemas/provider-subsets.ts +0 -538
  545. package/src/schemas/registry.ts +0 -355
  546. package/src/schemas/tool-defs.ts +0 -793
  547. package/src/solid.ts +0 -165
  548. package/src/state/index.ts +0 -44
  549. package/src/state/messages.ts +0 -53
  550. package/src/state/mock.ts +0 -297
  551. package/src/state/parts.ts +0 -295
  552. package/src/state/persistence.ts +0 -180
  553. package/src/state/stream.ts +0 -246
  554. package/src/state/suggestions.ts +0 -9
  555. package/src/state/threads.ts +0 -142
  556. package/src/test-utils/fake-clock.ts +0 -88
  557. package/src/types.ts +0 -53
  558. package/src/ui/action-icons.ts +0 -53
  559. package/src/ui/agent-card.tsx +0 -218
  560. package/src/ui/avatar.tsx +0 -23
  561. package/src/ui/badge.tsx +0 -21
  562. package/src/ui/button.tsx +0 -49
  563. package/src/ui/card.tsx +0 -245
  564. package/src/ui/checkbox-group.tsx +0 -153
  565. package/src/ui/checkbox.tsx +0 -63
  566. package/src/ui/collapsible.tsx +0 -163
  567. package/src/ui/command.tsx +0 -103
  568. package/src/ui/dialog.tsx +0 -223
  569. package/src/ui/dock.tsx +0 -584
  570. package/src/ui/dropdown.tsx +0 -636
  571. package/src/ui/editable-label.tsx +0 -112
  572. package/src/ui/hover-card.tsx +0 -345
  573. package/src/ui/icon.tsx +0 -167
  574. package/src/ui/input.tsx +0 -391
  575. package/src/ui/kbd.tsx +0 -118
  576. package/src/ui/nav.tsx +0 -282
  577. package/src/ui/notice.tsx +0 -84
  578. package/src/ui/overlay.tsx +0 -277
  579. package/src/ui/pane-grid.tsx +0 -117
  580. package/src/ui/pane-group.tsx +0 -291
  581. package/src/ui/pane.tsx +0 -193
  582. package/src/ui/popover.tsx +0 -106
  583. package/src/ui/progress-bar.tsx +0 -83
  584. package/src/ui/prompt-dock.tsx +0 -145
  585. package/src/ui/radio.tsx +0 -150
  586. package/src/ui/resizable.tsx +0 -693
  587. package/src/ui/scroll-area.tsx +0 -26
  588. package/src/ui/segmented.tsx +0 -109
  589. package/src/ui/select.tsx +0 -168
  590. package/src/ui/separator.tsx +0 -10
  591. package/src/ui/settings-group.tsx +0 -67
  592. package/src/ui/skeleton.tsx +0 -73
  593. package/src/ui/slider.tsx +0 -178
  594. package/src/ui/status.tsx +0 -48
  595. package/src/ui/switch.tsx +0 -119
  596. package/src/ui/tabs.tsx +0 -168
  597. package/src/ui/textarea.tsx +0 -21
  598. package/src/ui/tooltip.tsx +0 -118
  599. package/src/utils/cn.ts +0 -30
  600. package/src/wire/chunk.ts +0 -248
  601. package/src/wire/consume.ts +0 -599
  602. package/src/wire/diagnostics.ts +0 -727
  603. package/src/wire/encode-probe.ts +0 -214
  604. package/src/wire/encode.ts +0 -947
  605. package/src/wire/files.ts +0 -342
  606. package/src/wire/formats/anthropic.ts +0 -274
  607. package/src/wire/formats/openai.ts +0 -228
  608. package/src/wire/index.ts +0 -95
  609. package/src/wire/media-types.ts +0 -344
  610. package/src/wire/read.ts +0 -396
  611. package/src/wire/sink-helpers.ts +0 -50
  612. package/src/wire/sse.ts +0 -153
@@ -1,103 +0,0 @@
1
- import { createContext, useContext, type Accessor, type JSX } from 'solid-js';
2
-
3
- export type ProseSize = 'xs' | 'sm' | 'base' | 'lg';
4
-
5
- export interface ChatConfigValue {
6
- /** Prose/text size for messages, markdown, and UI elements */
7
- proseSize: Accessor<ProseSize>;
8
- /** Shiki theme for code blocks */
9
- codeTheme: Accessor<string>;
10
- /** Node the kit's overlays portal into; undefined → document.body */
11
- portalMount: Accessor<HTMLElement | undefined>;
12
- /** Whether code blocks are syntax-highlighted; false → plain text, no Shiki loaded */
13
- codeHighlight: Accessor<boolean>;
14
- }
15
-
16
- const defaultConfig: ChatConfigValue = {
17
- proseSize: () => 'sm' as ProseSize,
18
- codeTheme: () => 'github-dark-dimmed',
19
- portalMount: () => undefined,
20
- codeHighlight: () => true,
21
- };
22
-
23
- const ChatConfigContext = createContext<ChatConfigValue>(defaultConfig);
24
-
25
- export interface ChatConfigProps {
26
- proseSize?: ProseSize;
27
- codeTheme?: string;
28
- portalMount?: HTMLElement;
29
- codeHighlight?: boolean;
30
- children: JSX.Element;
31
- }
32
-
33
- /**
34
- * Provides chat-wide appearance settings to all child components.
35
- * Set once at the top level — MessageContent, Markdown, CodeBlock,
36
- * ConversationList, and PromptInput all read from this.
37
- */
38
- export function ChatConfig(props: ChatConfigProps) {
39
- const value: ChatConfigValue = {
40
- proseSize: () => props.proseSize ?? 'sm',
41
- codeTheme: () => props.codeTheme ?? 'github-dark-dimmed',
42
- portalMount: () => props.portalMount,
43
- codeHighlight: () => props.codeHighlight ?? true,
44
- };
45
-
46
- return (
47
- <ChatConfigContext.Provider value={value}>
48
- {props.children}
49
- </ChatConfigContext.Provider>
50
- );
51
- }
52
-
53
- /** Read the current chat config. Returns defaults if no provider is present. */
54
- export function useChatConfig(): ChatConfigValue {
55
- return useContext(ChatConfigContext)!;
56
- }
57
-
58
- /**
59
- * Maps prose size to the Tailwind Typography *size modifier* for consumers who
60
- * render their own `prose` block.
61
- *
62
- * The `prose-*` names are deliberately NOT re-pointed at the --kai-text-* scale.
63
- * They are not font sizes: each is a plugin-generated bundle of proportional
64
- * margins, list indents, heading ratios and line-heights for every nested
65
- * element, keyed to hardcoded rems, and they only do anything alongside `prose`
66
- * itself. There is no `prose-body` to alias them to, and collapsing them to a
67
- * bare font-size would throw away the vertical rhythm that is their whole job.
68
- * The kit's own markdown does not go through them at all — it renders through
69
- * `.chat-markdown` (theme.css), which is em-relative and therefore already
70
- * scales off whatever `textClass` sets.
71
- *
72
- * The one raw font-size here (`xs`) DOES join the semantic scale, so it stays in
73
- * step with `textClass('xs')`.
74
- */
75
- export function proseClass(size: ProseSize): string {
76
- switch (size) {
77
- case 'xs': return 'prose-sm text-meta';
78
- case 'sm': return 'prose-sm';
79
- case 'base': return '';
80
- case 'lg': return 'prose-lg';
81
- }
82
- }
83
-
84
- /**
85
- * Maps prose size to a text class for message content, markdown, and non-prose
86
- * chrome (sidebar, input).
87
- *
88
- * These are the kit's SEMANTIC type-scale utilities, not Tailwind's raw scale:
89
- * each resolves through a namespaced --kai-text-* token in theme.css, so a
90
- * consumer setting `--kai-text-body` moves the reading text. The public
91
- * `proseSize` strings ('xs' | 'sm' | 'base' | 'lg') are unchanged — this is an
92
- * internal re-point only. Sizes are byte-identical to the Tailwind classes they
93
- * replace (text-meta ≡ text-xs, text-body ≡ text-sm, text-title ≡ text-base),
94
- * so nothing moves until a token is actually overridden.
95
- */
96
- export function textClass(size: ProseSize): string {
97
- switch (size) {
98
- case 'xs': return 'text-meta';
99
- case 'sm': return 'text-body';
100
- case 'base': return 'text-title';
101
- case 'lg': return 'text-lg';
102
- }
103
- }
@@ -1,49 +0,0 @@
1
- export interface EntityRef {
2
- kind: string;
3
- id: string;
4
- label: string;
5
- icon?: string;
6
- promptText?: string;
7
- data?: Record<string, unknown>;
8
- }
9
- export type Segment =
10
- | { type: 'text'; text: string }
11
- | { type: 'entity'; entity: EntityRef };
12
- export type ComposerDoc = Segment[];
13
-
14
- export function normalizeValue(value: string | ComposerDoc | null | undefined): ComposerDoc {
15
- if (value == null) return [];
16
- if (typeof value === 'string') return value.length ? [{ type: 'text', text: value }] : [];
17
- const out: ComposerDoc = [];
18
- for (const seg of value) {
19
- if (seg.type === 'text') {
20
- if (!seg.text) continue;
21
- const last = out[out.length - 1];
22
- // Replace (don't mutate) the prior segment so every object in the returned
23
- // doc is freshly built and never an aliased/held reference.
24
- if (last && last.type === 'text') out[out.length - 1] = { type: 'text', text: last.text + seg.text };
25
- else out.push({ type: 'text', text: seg.text });
26
- } else {
27
- out.push({ type: 'entity', entity: seg.entity });
28
- }
29
- }
30
- return out;
31
- }
32
-
33
- export function serializeToText(
34
- doc: ComposerDoc,
35
- opts?: { entity?: (e: EntityRef) => string },
36
- ): string {
37
- let out = '';
38
- for (const seg of doc) {
39
- if (seg.type === 'text') out += seg.text;
40
- else out += opts?.entity ? opts.entity(seg.entity) : (seg.entity.promptText ?? seg.entity.label);
41
- }
42
- return out;
43
- }
44
- export function entitiesOf(doc: ComposerDoc): EntityRef[] {
45
- return doc.filter((s): s is Extract<Segment, { type: 'entity' }> => s.type === 'entity').map((s) => s.entity);
46
- }
47
- export function docIsEmpty(doc: ComposerDoc): boolean {
48
- return doc.every((s) => s.type === 'text' && s.text.length === 0);
49
- }
@@ -1,35 +0,0 @@
1
- export interface ActiveTrigger { char: string; query: string; start: number; }
2
-
3
- export function detectTrigger(text: string, caret: number, chars: string[]): ActiveTrigger | null {
4
- // Caret is a position within `text` (0..text.length). Out-of-range = no trigger.
5
- if (caret < 0 || caret > text.length) return null;
6
- for (let i = caret - 1; i >= 0; i--) {
7
- const c = text[i];
8
- if (/\s/.test(c)) return null; // hit whitespace before any trigger char
9
- if (chars.includes(c)) {
10
- const boundaryOk = i === 0 || /\s/.test(text[i - 1]);
11
- if (!boundaryOk) return null;
12
- return { char: c, query: text.slice(i + 1, caret), start: i };
13
- }
14
- }
15
- return null;
16
- }
17
-
18
- /**
19
- * Wraps detectTrigger with a list of trigger definitions.
20
- * Returns { def, query, start } when a trigger is active, else null.
21
- * Accepts generic defs so it does not import from composer.tsx (no cycle).
22
- */
23
- export function activeTriggerFor<T extends { char: string; kind: string }>(
24
- text: string,
25
- caret: number,
26
- defs: T[],
27
- ): { def: T; query: string; start: number } | null {
28
- if (!defs.length) return null;
29
- const chars = defs.map((d) => d.char);
30
- const hit = detectTrigger(text, caret, chars);
31
- if (!hit) return null;
32
- const def = defs.find((d) => d.char === hit.char);
33
- if (!def) return null;
34
- return { def, query: hit.query, start: hit.start };
35
- }
@@ -1,21 +0,0 @@
1
- import { createSignal, type Accessor } from 'solid-js';
2
-
3
- /**
4
- * The controlled/uncontrolled state pattern, as a reusable signal.
5
- *
6
- * `controlled` is an accessor for the controlling prop: when it returns a value,
7
- * that value wins (controlled mode); when it returns `undefined`, the component
8
- * manages its own state seeded from `initial` (uncontrolled mode). The returned
9
- * setter always writes the internal value — harmless (masked) while controlled,
10
- * authoritative while uncontrolled — so a single call site works in both modes.
11
- *
12
- * Mirrors `props.value ?? internal()` used elsewhere in the kit, without effects.
13
- */
14
- export function createControllableSignal(
15
- controlled: Accessor<boolean | undefined>,
16
- initial: boolean,
17
- ): [Accessor<boolean>, (value: boolean) => void] {
18
- const [internal, setInternal] = createSignal(initial);
19
- const value: Accessor<boolean> = () => controlled() ?? internal();
20
- return [value, (v: boolean) => setInternal(v)];
21
- }
@@ -1,66 +0,0 @@
1
- // src/primitives/create-kai-chat.ts
2
- import { createSignal } from 'solid-js';
3
- import type { ChatMessage } from '../elements/chat-types';
4
- import type { AttachmentData } from '../components/attachments';
5
- import {
6
- appendMessage, updateMessage, removeMessage, addSuggestion, removeSuggestion,
7
- createAssistantStream, onStreamSettled, type AssistantStream, type SetMessages,
8
- } from '../state';
9
-
10
- export interface CreateKaiChatOptions {
11
- /** Seed messages, read once at creation and copied. Later changes are ignored — drive updates through the returned ops. */
12
- initialMessages?: ChatMessage[];
13
- /** Seed suggestions, read once at creation and copied. Later changes are ignored. */
14
- initialSuggestions?: string[];
15
- onSubmit?: (detail: { value: string; attachments: AttachmentData[] }) => void | Promise<void>;
16
- }
17
-
18
- /** Solid store: consumer-owned chat state + the same ergonomic ops as `useKaiChat`. */
19
- export interface KaiChatStore {
20
- messages: () => ChatMessage[];
21
- setMessages: SetMessages;
22
- suggestions: () => string[];
23
- loading: () => boolean;
24
- append: (msg: ChatMessage) => void;
25
- update: (id: string, patch: Partial<ChatMessage> | ((m: ChatMessage) => ChatMessage)) => void;
26
- remove: (id: string) => void;
27
- addSuggestion: (s: string) => void;
28
- removeSuggestion: (s: string) => void;
29
- clearSuggestions: () => void;
30
- streamAssistant: (init?: Partial<ChatMessage>) => AssistantStream;
31
- handleSubmit: (event: CustomEvent<{ value: string; attachments: AttachmentData[] }>) => void;
32
- /** Spread onto `<kai-chat {...chat.bind} />` (reactive getters). Wire submit via `on:kai-submit={chat.handleSubmit}`. */
33
- bind: { readonly messages: ChatMessage[]; readonly loading: boolean; readonly suggestions: string[] };
34
- }
35
-
36
- export function createKaiChat(options: CreateKaiChatOptions = {}): KaiChatStore {
37
- // Copy the seed arrays so a caller mutating the array it passed in can't reach our state.
38
- const [messages, setMessagesSignal] = createSignal<ChatMessage[]>([...(options.initialMessages ?? [])]);
39
- const [suggestions, setSuggestions] = createSignal<string[]>([...(options.initialSuggestions ?? [])]);
40
- const [loading, setLoading] = createSignal(false);
41
-
42
- const setMessages: SetMessages = (updater) => setMessagesSignal((prev) => updater(prev));
43
-
44
- return {
45
- messages,
46
- setMessages,
47
- suggestions,
48
- loading,
49
- append: (msg) => setMessages((prev) => appendMessage(prev, msg)),
50
- update: (id, patch) => setMessages((prev) => updateMessage(prev, id, patch)),
51
- remove: (id) => setMessages((prev) => removeMessage(prev, id)),
52
- addSuggestion: (s) => setSuggestions((prev) => addSuggestion(prev, s)),
53
- removeSuggestion: (s) => setSuggestions((prev) => removeSuggestion(prev, s)),
54
- clearSuggestions: () => setSuggestions([]),
55
- streamAssistant: (init) => {
56
- setLoading(true);
57
- return onStreamSettled(createAssistantStream(setMessages, init), () => setLoading(false));
58
- },
59
- handleSubmit: (event) => { void options.onSubmit?.(event.detail); },
60
- bind: {
61
- get messages() { return messages(); },
62
- get loading() { return loading(); },
63
- get suggestions() { return suggestions(); },
64
- },
65
- };
66
- }
@@ -1,266 +0,0 @@
1
- import { createSignal, onCleanup, untrack, type Accessor } from 'solid-js';
2
-
3
- export type Transition =
4
- | { duration: number; ease?: 'linear' | 'easeIn' | 'easeOut' | 'easeInOut' }
5
- | { type: 'spring'; duration: number; bounce: number };
6
-
7
- /**
8
- * Builds an easing function from a CSS-style cubic bezier. The curve's
9
- * endpoints are fixed at (0, 0) and (1, 1); (x1, y1) and (x2, y2) are the
10
- * two control points. Given a progress value `t` used as the curve's `x`,
11
- * solves `X(s) === t` for the curve parameter `s` via Newton-Raphson (a
12
- * handful of iterations converges for these curves), falls back to
13
- * bisection if the derivative gets too small or a step would leave
14
- * [0, 1], then returns `Y(s)`.
15
- */
16
- function cubicBezier(x1: number, y1: number, x2: number, y2: number): (t: number) => number {
17
- const x = (s: number) => 3 * (1 - s) * (1 - s) * s * x1 + 3 * (1 - s) * s * s * x2 + s * s * s;
18
- const y = (s: number) => 3 * (1 - s) * (1 - s) * s * y1 + 3 * (1 - s) * s * s * y2 + s * s * s;
19
- const xDerivative = (s: number) =>
20
- 3 * (1 - s) * (1 - s) * x1 + 6 * (1 - s) * s * (x2 - x1) + 3 * s * s * (1 - x2);
21
-
22
- function bisect(t: number): number {
23
- let lo = 0;
24
- let hi = 1;
25
- for (let i = 0; i < 30; i++) {
26
- const mid = (lo + hi) / 2;
27
- if (x(mid) < t) lo = mid;
28
- else hi = mid;
29
- }
30
- return (lo + hi) / 2;
31
- }
32
-
33
- return (t: number) => {
34
- if (t <= 0) return 0;
35
- if (t >= 1) return 1;
36
-
37
- let s = t;
38
- for (let i = 0; i < 8; i++) {
39
- const derivative = xDerivative(s);
40
- if (Math.abs(derivative) < 1e-6) return y(bisect(t));
41
-
42
- const next = s - (x(s) - t) / derivative;
43
- if (next <= 0 || next >= 1) return y(bisect(t));
44
-
45
- s = next;
46
- }
47
- return y(s);
48
- };
49
- }
50
-
51
- // Matches motion's named curves so the visualizers feel like their LiveKit
52
- // counterparts rather than a plausible-looking approximation.
53
- //
54
- // Every easing here is TOTAL: it clamps `t` into [0, 1] itself rather than
55
- // trusting its caller. `cubicBezier` already did (its Newton solve needs `t`
56
- // in range to converge); `linear` was the bare identity and passed anything
57
- // straight through. `step()` below clamps the top but not the bottom, so a
58
- // frame timestamp EARLIER than the origin `to()` captured yields a negative
59
- // `t` and, through an unclamped easing, a tween that runs backwards.
60
- //
61
- // That timestamp cannot occur in a browser -- requestAnimationFrame's
62
- // timestamp and `performance.now()` share a time origin per spec -- so this is
63
- // robustness, not a live bug. It does occur under vitest + jsdom, where the
64
- // two do not share an origin. The clamp lives in the easings rather than at
65
- // the `step()` call site so the tests can drive a negative `t` through each
66
- // curve individually and prove which ones guard.
67
- const EASINGS = {
68
- linear: (t: number) => Math.min(1, Math.max(0, t)),
69
- easeIn: cubicBezier(0.42, 0, 1, 1),
70
- easeOut: cubicBezier(0, 0, 0.58, 1),
71
- easeInOut: cubicBezier(0.42, 0, 0.58, 1),
72
- } as const;
73
-
74
- /**
75
- * Damped-spring position at normalized time `t` (0..1), settling at 1.
76
- *
77
- * `bounce` maps to the damping ratio: 0 is critically damped (no overshoot),
78
- * higher values overshoot more. Matches the feel of motion's spring defaults
79
- * closely enough for shader uniforms, without the dependency.
80
- *
81
- * `t` is clamped at 0 for the same reason the named easings are (see EASINGS),
82
- * and the failure here is far louder than theirs: the decay term is
83
- * `Math.exp(-zeta * omega * t)`, so a negative `t` makes it GROW rather than
84
- * decay. At t = -0.25 with bounce 0.4 this returned ~5.9 instead of something
85
- * in [0, ~1.3]. No top clamp: overshooting past 1 is what a spring is for.
86
- */
87
- function spring(t: number, bounce: number): number {
88
- t = Math.max(0, t);
89
- const zeta = Math.max(0.05, 1 - Math.min(0.95, bounce));
90
- const omega = 10;
91
- const damped = omega * Math.sqrt(Math.max(0, 1 - zeta * zeta));
92
- return (
93
- 1 -
94
- Math.exp(-zeta * omega * t) *
95
- (Math.cos(damped * t) + ((zeta * omega) / (damped || 1)) * Math.sin(damped * t))
96
- );
97
- }
98
-
99
- function isSpring(tr: Transition): tr is { type: 'spring'; duration: number; bounce: number } {
100
- return 'type' in tr && tr.type === 'spring';
101
- }
102
-
103
- /**
104
- * A tweened number driven by requestAnimationFrame.
105
- *
106
- * Exists so shader uniforms can animate without pulling in a motion library.
107
- * CSS transitions cannot help here: uniforms are plain JS numbers handed to
108
- * WebGL every frame.
109
- *
110
- * `to()` interrupts whatever is in flight. An array target ping-pongs between
111
- * its two values forever, which is how the listening and thinking pulses read.
112
- * `duration: 0` (or no transition) sets instantly, which live volume needs so
113
- * the picture never lags the audio.
114
- *
115
- * `animating` is true exactly while a frame loop is armed: from an animated
116
- * `to()` until it lands (a ping-pong never lands, so it stays true), false
117
- * for instant sets and after dispose. It is a real signal on purpose -- the
118
- * aurora variant's volume-override effect reads it as its upstream-parity
119
- * "scale tween idle" guard, and being reactive means that effect re-runs
120
- * the moment a landing settles instead of waiting for the next volume tick.
121
- */
122
- export function createTween(initial: number): {
123
- value: Accessor<number>;
124
- animating: Accessor<boolean>;
125
- to(target: number | [number, number], transition?: Transition): void;
126
- } {
127
- const [value, setValue] = createSignal(initial);
128
- const [animating, setAnimating] = createSignal(false);
129
- let raf = 0;
130
- let disposed = false;
131
-
132
- /**
133
- * `cancelAnimationFrame`, captured at SETUP.
134
- *
135
- * `stop()` below runs at dispose, and dispose is not guaranteed to happen
136
- * while the page that mounted this tween is still standing -- a host can tear
137
- * its DOM globals down in between (`component-register`'s
138
- * `disconnectedCallback` defers a microtask; a test environment deletes the
139
- * globals synchronously right after detaching). A bare `cancelAnimationFrame`
140
- * there throws from a promise nobody holds, so it surfaces as an unhandled
141
- * rejection that fails a run in which every test passed. See
142
- * tests/components/teardown-without-dom-globals.test.tsx.
143
- *
144
- * The FUNCTION, not the view. The `const win = window` capture that fixes a
145
- * bare `document` does nothing here: `window === globalThis` -- measured, in
146
- * jsdom and in real Chromium/WebKit alike -- and the teardown deletes these
147
- * keys off that very object, so `win.cancelAnimationFrame` is undefined by
148
- * the time cleanup runs. It only trades the ReferenceError for a TypeError.
149
- * `.bind` pins the receiver the WebIDL operation is specified on; Chromium
150
- * and WebKit both accept a detached call (measured), so the bind is belt and
151
- * braces against an engine that does not, at zero cost.
152
- *
153
- * GUARDED because "setup" for this primitive is the component body, and a
154
- * server render executes component bodies. Node has no `cancelAnimationFrame`
155
- * at all, so an unguarded capture here would trade the disposal crash for an
156
- * SSR crash -- measured, not hypothesised. Nothing can be scheduled without
157
- * `requestAnimationFrame` either, so the no-op fallback is exactly right.
158
- */
159
- const cancelFrame = typeof cancelAnimationFrame === 'function'
160
- ? cancelAnimationFrame.bind(globalThis)
161
- : () => {};
162
-
163
- const stop = () => {
164
- if (raf) cancelFrame(raf);
165
- raf = 0;
166
- };
167
-
168
- onCleanup(() => {
169
- disposed = true;
170
- stop();
171
- setAnimating(false);
172
- });
173
-
174
- function to(target: number | [number, number], transition?: Transition) {
175
- stop();
176
- if (disposed) return;
177
-
178
- const pingPong = Array.isArray(target);
179
- // Untracked: `.to()` is an imperative command ("animate to this
180
- // target"), not a reactive read. Its normal caller is a createEffect
181
- // reacting to some OTHER signal (e.g. state changing); reading this
182
- // tween's own `value()` here without untrack() would make that effect
183
- // implicitly depend on the tween's own signal too. That is invisible
184
- // for a single tween (it would just restart itself every frame and
185
- // still crawl toward the target) but is fatal the moment a caller
186
- // creates a SECOND tween and `.to()`'s both from the same effect (see
187
- // the wave shader variant, which does exactly this for amplitude and
188
- // frequency): a browser fires one frame's queued
189
- // requestAnimationFrame callbacks in the order they were registered, so
190
- // the FIRST tween's step -- which runs first, and whose `setValue`
191
- // synchronously re-triggers the (now-dependent) effect -- cancels the
192
- // SECOND tween's already-queued step before the browser ever reaches
193
- // it. That repeats identically every single frame, so the second
194
- // tween's `step` never fires even once and its value never leaves its
195
- // initial one, permanently, no matter how long the effect keeps
196
- // "restarting" it.
197
- const [a, b] = pingPong ? target : [untrack(value), target];
198
-
199
- if (!transition || (!isSpring(transition) && transition.duration === 0)) {
200
- setAnimating(false);
201
- setValue(pingPong ? a : b);
202
- return;
203
- }
204
-
205
- const durationMs = transition.duration * 1000;
206
- if (durationMs <= 0) {
207
- setAnimating(false);
208
- setValue(b);
209
- return;
210
- }
211
-
212
- if (typeof requestAnimationFrame === 'undefined') {
213
- setAnimating(false);
214
- setValue(b);
215
- return;
216
- }
217
-
218
- const ease = isSpring(transition)
219
- ? (t: number) => spring(t, transition.bounce)
220
- : EASINGS[transition.ease ?? 'easeOut'];
221
-
222
- // A ping-pong starts from its first value rather than wherever it was, so
223
- // the pulse reads the same every time it restarts. `a` is already an
224
- // untracked read of the current value (or the ping-pong's first target
225
- // value) from above -- reused here instead of reading `value()` again.
226
- let from = a;
227
- let to_ = b;
228
- if (pingPong) setValue(a);
229
-
230
- // requestAnimationFrame's timestamp and performance.now() share a time
231
- // origin per spec, so capturing the origin here, at the moment to() is
232
- // called, is directly comparable to the `now` a later frame reports.
233
- // That means elapsed time is measured from when this leg actually
234
- // started, correct on the very first frame with no lazy-capture dance
235
- // and no risk of an idle gap since the last tween being charged against
236
- // this one.
237
- let legStart = performance.now();
238
- const step = (now: number) => {
239
- const t = Math.min(1, (now - legStart) / durationMs);
240
- setValue(from + (to_ - from) * ease(t));
241
-
242
- if (t < 1) {
243
- raf = requestAnimationFrame(step);
244
- return;
245
- }
246
-
247
- if (!pingPong) {
248
- setValue(to_);
249
- raf = 0;
250
- setAnimating(false);
251
- return;
252
- }
253
-
254
- // Reverse and run again, from a fresh origin for the new leg.
255
- setValue(to_);
256
- [from, to_] = [to_, from];
257
- legStart = performance.now();
258
- raf = requestAnimationFrame(step);
259
- };
260
-
261
- setAnimating(true);
262
- raf = requestAnimationFrame(step);
263
- }
264
-
265
- return { value, animating, to };
266
- }