@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,344 +0,0 @@
1
- import { createEffect, createMemo, Show, type JSX } from 'solid-js';
2
- import { ShaderCanvas, hexToRgb, DEFAULT_SHADER_COLOR, type UniformSpec, type UniformType } from './shader-canvas';
3
- import { createTween } from '../../primitives/create-tween';
4
- import { shaderTargets } from '../../primitives/visualizer-sequences';
5
- import { CONTAINER_HEIGHT } from './sizes';
6
- import { amplitudeRenderState } from './variant-bar';
7
- import type { ShaderVariantProps } from './index';
8
-
9
- /**
10
- * Every `UniformType` shader-canvas.tsx knows how to declare and push to the
11
- * GPU, duplicated here because that module does not export its `GLSL_TYPE`
12
- * map. `ShaderSpec.uniforms` narrows `type` to `UniformType` at the TS level
13
- * (see `index.tsx`), but a consumer can still reach this component through
14
- * the `<kai-audio-visualizer>` custom element with a plain JS object cast
15
- * past that check (`el.shader = {...}`), or any attribute-driven wrapper
16
- * that never touches TypeScript at all -- so an unrecognized `type` string
17
- * is checked again here, at runtime, against genuinely untrusted input.
18
- *
19
- * A `Record<UniformType, true>` literal, not a `Set`: if `UniformType` ever
20
- * grows a member, this object literal fails to typecheck until a matching
21
- * key is added here too, so the two cannot silently drift apart. Same
22
- * compiler-enforced-completeness technique as `effectiveArraySize` in
23
- * shader-canvas.tsx. Membership is checked with a strict `=== true` value
24
- * comparison (`uniformProblem` below), not `in` or `.hasOwnProperty`: a
25
- * bracket lookup with an untrusted key can resolve to an INHERITED
26
- * `Object.prototype` member (e.g. `spec.type === 'toString'`), and `in`
27
- * would treat that as present. Comparing the looked-up VALUE to `true`
28
- * rejects that case too, since `Object.prototype.toString` is a function,
29
- * never `true`.
30
- */
31
- const KNOWN_UNIFORM_TYPES: Record<UniformType, true> = {
32
- '1f': true, '1i': true, '1fv': true, '2f': true, '3f': true, '3fv': true,
33
- '4f': true, '4fv': true, Matrix2fv: true, Matrix3fv: true, Matrix4fv: true,
34
- };
35
-
36
- /** `1f` and `1i` take a plain number. Every other type takes an array. */
37
- const SCALAR_UNIFORM_TYPES = new Set<UniformType>(['1f', '1i']);
38
-
39
- /**
40
- * Exact element count for the uniform types whose arity is a fixed constant
41
- * of the type name -- `2f` a vec2 (2), `3f` a vec3 (3), `4f` a vec4 (4), and
42
- * `Matrix2fv`/`Matrix3fv`/`Matrix4fv` a 2x2/3x3/4x4 matrix (4/9/16) -- and
43
- * needs no import from shader-canvas.tsx's private unit-size table to know.
44
- *
45
- * Deliberately excludes `1fv`/`3fv`/`4fv`: shader-canvas.tsx's own
46
- * `inferArraySize` treats THOSE three as a legitimate multi-instance array
47
- * whenever `value.length` is a multiple of their unit greater than one, with
48
- * no explicit `arraySize` required to opt in -- `uBands` below is exactly
49
- * that pattern (`1fv`, an unbounded length). A fixed-length check on them
50
- * would reject a consumer's genuinely valid array uniform, not just a
51
- * mistake. A matrix ARRAY is technically eligible for the same inference in
52
- * shader-canvas.tsx, but has no legitimate use in this component's
53
- * single-pass ShaderToy-style shader model, and `ShaderSpec.uniforms`
54
- * exposes no `arraySize` a consumer could use to request one deliberately --
55
- * so treating a matrix uniform as always-one-instance here is a reasonable,
56
- * simpler default. A consumer who genuinely needs an array of matrices is
57
- * not served by this check; see the task report for that tradeoff.
58
- */
59
- const FIXED_ARITY: Partial<Record<UniformType, number>> = {
60
- '2f': 2, '3f': 3, '4f': 4,
61
- Matrix2fv: 4, Matrix3fv: 9, Matrix4fv: 16,
62
- };
63
-
64
- /**
65
- * Checks one consumer-declared uniform's `value` against its `type`,
66
- * returning a problem description, or `undefined` if it is safe to hand to
67
- * WebGL.
68
- *
69
- * The scalar-vs-array check is what matters most for safety: a `1f` handed
70
- * an array, or a `3fv` handed a bare number, is what makes WebGL's
71
- * `uniform*` setters throw a `TypeError` -- the WebIDL binding fails to
72
- * convert the argument at all. The fixed-arity check below it is a
73
- * correctness improvement on top of that, not a safety one: an array of the
74
- * wrong length for a type WebGL treats as fixed-size is a GL-level
75
- * `INVALID_OPERATION` recorded on the context, not a JS exception -- it
76
- * degrades the picture rather than crashing the render loop -- but it is
77
- * cheap to catch here with a clear message instead of a silent blank patch
78
- * on screen.
79
- */
80
- function uniformProblem(name: string, spec: UniformSpec): string | undefined {
81
- if (spec == null || typeof spec !== 'object') {
82
- return `uniform "${name}" is not a valid declaration (expected an object with "type" and "value").`;
83
- }
84
- if (KNOWN_UNIFORM_TYPES[spec.type] !== true) {
85
- return `uniform "${name}" has an unrecognized type "${String(spec.type)}".`;
86
- }
87
- if (SCALAR_UNIFORM_TYPES.has(spec.type)) {
88
- if (typeof spec.value !== 'number' || !Number.isFinite(spec.value)) {
89
- return `uniform "${name}" is declared "${spec.type}" (a number) but its value is not a finite number.`;
90
- }
91
- return undefined;
92
- }
93
- if (
94
- !Array.isArray(spec.value) ||
95
- spec.value.some((v) => typeof v !== 'number' || !Number.isFinite(v))
96
- ) {
97
- return `uniform "${name}" is declared "${spec.type}" (an array) but its value is not an array of finite numbers.`;
98
- }
99
- const arity = FIXED_ARITY[spec.type];
100
- if (arity !== undefined && spec.value.length !== arity) {
101
- return `uniform "${name}" is declared "${spec.type}", which takes exactly ${arity} numbers, but its value has ${spec.value.length}.`;
102
- }
103
- return undefined;
104
- }
105
-
106
- /**
107
- * Uniforms every custom shader receives without asking: the standard set
108
- * (`uColor`, `uIntensity`, `uSpeed`, `uComplexity`) plus the audio pair that
109
- * ONLY this variant gets. Upstream's shader path only ever hands a shader a
110
- * scalar volume; `uBands` -- a per-band `float` array -- has no equivalent
111
- * there, so a spectrum-reactive custom shader is possible here and not
112
- * there. `iTime`/`iResolution`/`iMouse`/`iFrame`/`iDate` are declared by
113
- * `ShaderCanvas` itself for every shader, custom or not, so they are not
114
- * repeated here.
115
- *
116
- * `extra` is a consumer's `ShaderSpec.uniforms` -- untrusted input. Every
117
- * entry is checked with `uniformProblem` before being merged in; a bad
118
- * `type`/`value` pairing throws rather than being handed to `ShaderCanvas`,
119
- * where the mismatch would otherwise throw a `TypeError` inside WebGL's
120
- * `uniform*` setters, called from `ShaderCanvas`'s OWN
121
- * `requestAnimationFrame` loop, where nothing catches it and the canvas
122
- * silently stops animating. `CustomVisualizer` below is what turns that
123
- * throw into the same `onUnavailable` seam every other shader failure uses
124
- * -- see its own doc for how.
125
- *
126
- * Pure and synchronous: reads no signals, schedules nothing. Task 15 reuses
127
- * it as-is.
128
- */
129
- export function customUniforms(
130
- values: {
131
- color: string;
132
- intensity: number;
133
- speed: number;
134
- complexity: number;
135
- volume: number;
136
- bands: number[];
137
- },
138
- extra?: Record<string, UniformSpec>,
139
- ): Record<string, UniformSpec> {
140
- // GLSL has no zero-length arrays, so an empty band list still declares
141
- // one -- and the declared length always comes from THIS array's own
142
- // length (`arraySize: bands.length`), never a separately tracked count,
143
- // so the declaration and the value pushed to the GPU can never disagree.
144
- const bands = values.bands.length ? values.bands : [0];
145
-
146
- const standard: Record<string, UniformSpec> = {
147
- uColor: { type: '3fv', value: hexToRgb(values.color) },
148
- uIntensity: { type: '1f', value: values.intensity },
149
- uSpeed: { type: '1f', value: values.speed },
150
- uComplexity: { type: '1f', value: values.complexity },
151
- uVolume: { type: '1f', value: values.volume },
152
- uBands: { type: '1fv', value: bands, arraySize: bands.length },
153
- };
154
-
155
- if (!extra) return standard;
156
-
157
- for (const [name, spec] of Object.entries(extra)) {
158
- const problem = uniformProblem(name, spec);
159
- if (problem) throw new Error(problem);
160
- }
161
-
162
- return { ...standard, ...extra };
163
- }
164
-
165
- /**
166
- * Renders a consumer-supplied fragment shader.
167
- *
168
- * The shader must define `mainImage(out vec4 fragColor, in vec2 fragCoord)`
169
- * and gets the five ShaderToy built-ins (`iTime`, `iResolution`, `iMouse`,
170
- * `iFrame`, `iDate`) plus every uniform `customUniforms` above declares.
171
- * `ShaderCanvas` DECLARES all of them for you -- declaring the SAME name
172
- * again inside the shader body is a GLSL redefinition and fails to compile.
173
- *
174
- * `fragColor` MUST be premultiplied: `vec4(rgb * alpha, alpha)`, never
175
- * `vec4(rgb, alpha)`. The canvas composites using the browser's default
176
- * `premultipliedAlpha: true`; a translucent edge written the natural
177
- * (straight-alpha) way gets a dark fringe where it meets a light page. For
178
- * example, a shader painting a soft circle that fades to transparent at its
179
- * edge:
180
- *
181
- * ```glsl
182
- * void mainImage(out vec4 fragColor, in vec2 fragCoord) {
183
- * vec2 uv = fragCoord / iResolution.xy;
184
- * float alpha = smoothstep(1.0, 0.0, length(uv - 0.5) * 2.0) * uIntensity;
185
- * fragColor = vec4(uColor * alpha, alpha); // premultiplied -- NOT vec4(uColor, alpha)
186
- * }
187
- * ```
188
- *
189
- * `uVolume` (scalar) and `uBands` (a `float[N]` array, `N` tracking the
190
- * visualizer's actual band count) are this task's differentiating feature:
191
- * upstream's shader path only ever hands a shader a scalar, so a
192
- * spectrum-reactive custom shader is only possible here.
193
- *
194
- * A bad `props.shader.uniforms` entry (an unrecognized `type`, or a `value`
195
- * that does not match it) is logged loudly via `console.error` -- it is a
196
- * bug in the consumer's shader spec they need to see -- and routed through
197
- * `props.onUnavailable`, same as a shader compile or link failure. A
198
- * missing WebGL context logs quietly via `console.warn`: that is an
199
- * expected environment limitation, not a bug. `props.shader` being absent
200
- * entirely is neither: it renders an empty placeholder and does not call
201
- * `onUnavailable` at all, since nothing was ever asked to render.
202
- */
203
- export default function CustomVisualizer(props: ShaderVariantProps): JSX.Element {
204
- const intensity = createTween(0.3);
205
- const speed = createTween(1);
206
-
207
- // The state the rendering follows: `listeningAmplitude` folds `listening`
208
- // into the speaking presentation (live-volume intensity). See
209
- // amplitudeRenderState in variant-bar. `data-kai-state` keeps the real state.
210
- const renderState = () => amplitudeRenderState(props.state, props.listeningAmplitude);
211
-
212
- // Intensity has exactly ONE writer -- this effect -- on purpose. The
213
- // volume override used to live in a second effect ("if speaking,
214
- // intensity.to(0.3 + 0.7v, instant)") alongside this one's 0.5s tween
215
- // toward the state base; both re-ran on a state flip, and Solid re-runs
216
- // sibling effects in the order they sit in the signal's observer list,
217
- // which reorders as effects re-subscribe over their lifetimes. Under the
218
- // adverse ordering the base tween landed AFTER the override and parked a
219
- // speaking shader at the 0.3 base until the next volume change -- which
220
- // never comes under static `bands`/`volume` prop drive. The same
221
- // two-writer race variant-wave.tsx carried (measured there on the parity
222
- // harness; latent here). NOT the benign disjoint-writer two-effect shape
223
- // the Task 12 review accepted -- these two wrote the SAME tween. See the
224
- // wave variant's twin comment; same effect-race class as b5795ac.
225
- createEffect(() => {
226
- const t = shaderTargets(renderState());
227
- if (renderState() === 'speaking') {
228
- // Live volume takes over intensity while speaking, with no easing so
229
- // the picture tracks the audio exactly -- and lands immediately on
230
- // re-entry regardless of effect ordering. `volume` is only tracked
231
- // in this branch, so volume ticks skip the base-target path below.
232
- intensity.to(0.3 + 0.7 * props.volume, { duration: 0 });
233
- } else {
234
- const transition = props.frozen ? { duration: 0 } : { duration: 0.5, ease: 'easeOut' as const };
235
- intensity.to(Array.isArray(t.intensity) && props.frozen ? t.intensity[0] : t.intensity, transition);
236
- }
237
- // `iTime` is never frozen by ShaderCanvas itself -- it is the raw clock,
238
- // always advancing. A custom shader written the conventional way
239
- // (`iTime * uSpeed`) is the ONLY thing that can honour reduced motion,
240
- // and only if `uSpeed` is actually pinned at 0 here. Matches
241
- // variant-aurora.tsx's `speed.to(props.frozen ? 0 : t.speed, ...)`.
242
- speed.to(props.frozen ? 0 : t.speed, { duration: 0 });
243
- });
244
-
245
- // Recomputed whenever a dependency changes -- same as every other shader
246
- // variant's uniforms object; see ShaderCanvas's reactivity note on why
247
- // that is fine (only STRUCTURE triggers a recompile, not a value change).
248
- // The try/catch is what keeps a bad `props.shader.uniforms` entry from
249
- // ever reaching ShaderCanvas: without it, `customUniforms`'s throw (see
250
- // its own doc) would happen wherever THIS expression gets evaluated,
251
- // which includes ShaderCanvas's own requestAnimationFrame loop -- a raw
252
- // browser callback nothing else catches.
253
- //
254
- // Deliberately kept a PURE derivation (no console/onUnavailable calls
255
- // here): those are side effects, and belong in the createEffect below,
256
- // not in a memo whose body should be safe to (re)run purely for its
257
- // return value.
258
- const result = createMemo<{ uniforms?: Record<string, UniformSpec>; error?: string }>(() => {
259
- try {
260
- const uniforms = customUniforms(
261
- {
262
- color: props.color ?? DEFAULT_SHADER_COLOR,
263
- intensity: intensity.value(),
264
- speed: speed.value(),
265
- complexity: props.complexity ?? 0.5,
266
- volume: props.volume,
267
- bands: props.bands,
268
- },
269
- props.shader?.uniforms,
270
- );
271
- return { uniforms };
272
- } catch (err) {
273
- return { error: err instanceof Error ? err.message : String(err) };
274
- }
275
- });
276
-
277
- // Guards against reporting the SAME failure more than once: ShaderCanvas
278
- // reads `uniforms` fresh every animation frame (see its own reactivity
279
- // note), so `result` above can keep re-evaluating to the same error more
280
- // than once before the `Show` below actually unmounts it. Reset on a
281
- // successful `result` (not left permanently `true` once tripped): the
282
- // dispatcher's own `unavailable` flag is permanent for a mount, but this
283
- // component is a public default export usable standalone (e.g. a shader
284
- // editor or a Storybook control surface) where `props.shader` can change
285
- // after mount -- a consumer who fixes one bad uniform and then introduces
286
- // a DIFFERENT one in the same mount must still see and hear about the
287
- // second mistake, not silence because the first one already fired.
288
- let reported = false;
289
- createEffect(() => {
290
- const { error } = result();
291
- if (!error) {
292
- reported = false;
293
- return;
294
- }
295
- if (reported) return;
296
- reported = true;
297
- console.error(`<kai-audio-visualizer variant="custom">: ${error}`);
298
- props.onUnavailable();
299
- });
300
-
301
- const containerStyle = (): JSX.CSSProperties => ({
302
- height: `${CONTAINER_HEIGHT[props.size]}px`,
303
- 'aspect-ratio': '1',
304
- });
305
-
306
- return (
307
- <Show
308
- when={props.shader?.fragment}
309
- fallback={<div data-kai-state={props.state} class={props.class} style={containerStyle()} />}
310
- >
311
- {(fragment) => (
312
- <Show
313
- when={result().uniforms}
314
- fallback={<div data-kai-state={props.state} class={props.class} style={containerStyle()} />}
315
- >
316
- {(u) => (
317
- <div data-kai-state={props.state} class={props.class} style={containerStyle()}>
318
- <ShaderCanvas
319
- fragment={fragment()}
320
- precision={props.size === 'icon' || props.size === 'sm' ? 'mediump' : 'highp'}
321
- uniforms={u()}
322
- animateWhenNotVisible={props.animateWhenNotVisible}
323
- onError={(message) => {
324
- // "not available" is ShaderCanvas's literal wording for a
325
- // missing WebGL context (see its own doc) -- an expected
326
- // environment limitation, not a bug, so it logs quietly.
327
- // Anything else is a compile or link failure IN THE
328
- // CONSUMER'S SHADER, which they need to see, so it is loud.
329
- const missingContext = /not available/i.test(message);
330
- if (missingContext) {
331
- console.warn('<kai-audio-visualizer variant="custom">: shader unavailable', message);
332
- } else {
333
- console.error('<kai-audio-visualizer variant="custom">: shader error', message);
334
- }
335
- props.onUnavailable();
336
- }}
337
- />
338
- </div>
339
- )}
340
- </Show>
341
- )}
342
- </Show>
343
- );
344
- }
@@ -1,175 +0,0 @@
1
- import { Index, type JSX } from 'solid-js';
2
- import { cn } from '../../utils/cn';
3
- import { normalizeVolumeBands } from '../../primitives/audio-bands';
4
- import { useSequencer } from '../../primitives/use-sequencer';
5
- import { gridSequence } from '../../primitives/visualizer-sequences';
6
- import { GRID_CELL, GRID_GAP, defaultGridCount } from './sizes';
7
- import { amplitudeRenderState, type VariantProps } from './variant-bar';
8
-
9
- /*
10
- * NOTE: The speaking thresholds below DIVERGE from upstream's GridCell math,
11
- * deliberately (Rob, 2026-08-09). Upstream computes
12
- * `threshold = |mid - y| * 1/(mid + 1)`, spreading the row thresholds evenly
13
- * across 0..1 (5 rows: 0, 1/3, 2/3). Two blind spots our element actually
14
- * exposes:
15
- *
16
- * (1) Real speech through the aligned analysis pipeline peaks at 0.51-0.54
17
- * (0.68 on the recorded fixture), so distance-2 rows (top/bottom of a
18
- * 5-row grid) NEVER light — measured zero times across 139 speech
19
- * samples, on upstream's own grid as well as ours.
20
- * (2) The middle row's threshold is 0, so it stays lit in the speaking state
21
- * even on a silent mic.
22
- *
23
- * Rob asked for both fixed: outer rows reachable by real speech (the grid
24
- * fills centre-outward as a cross) and an empty grid when the mic is silent.
25
- * So the ramp is scaled to the realistic speech ceiling, and the would-be-0
26
- * centre threshold becomes a small silence floor. 5 rows now: 0.02, ~0.217,
27
- * ~0.433 (3 rows: 0.02, 0.325; 7 rows: 0.02, ~0.163, 0.325, ~0.488).
28
- *
29
- * (3) A third divergence, also Rob's request (2026-08-09): at IDLE the grid
30
- * highlights nothing. Upstream (and we, until now — audit-verified on
31
- * both) rested one stationary centre cell there, gridSequence's default
32
- * frame. Grid only: bar and radial already idle dark (their idle
33
- * sequences are empty), so this also makes the family consistent.
34
- */
35
- /** Realistic top of the aligned pipeline's speech range (measured 0.51-0.54 live, 0.68 fixture). */
36
- const SPEECH_LEVEL_CEILING = 0.65;
37
- /** Real speech bands sit at ~0.1 and up; true silence idles at ~0, so this splits them cleanly. */
38
- const SILENCE_FLOOR = 0.02;
39
-
40
- /**
41
- * A grid of dots that pulses with the audio.
42
- *
43
- * Ported from livekit/components-js
44
- * `packages/shadcn/components/agents-ui/agent-audio-visualizer-grid.tsx`
45
- * (Apache License 2.0), except the speaking threshold remap — see the
46
- * divergence note above.
47
- */
48
- export function GridVisualizer(
49
- props: VariantProps & {
50
- /** Rows AND columns of the (always square) grid. Default from the size
51
- * preset. Replaced the former independent rowCount/columnCount pre-1.0:
52
- * columns alone carry the audio signal, so a non-square grid only ever
53
- * changed threshold-ring resolution — never expression (Rob, 2026-08-09;
54
- * upstream is square-by-default via `rowCount ?? columnCount` too). */
55
- count?: number;
56
- /** Ring distance from center for the connecting animation, in cells. */
57
- spread?: number;
58
- /** Ms between scripted frames. Default 100. */
59
- interval?: number;
60
- },
61
- ): JSX.Element {
62
- const rows = () => props.count ?? defaultGridCount(props.size);
63
- const cols = () => rows();
64
- const interval = () => props.interval ?? 100;
65
- const items = () => Array.from({ length: rows() * cols() }, (_, i) => i);
66
-
67
- // The state the rendering follows: `listeningAmplitude` folds `listening`
68
- // into the speaking presentation. See amplitudeRenderState in variant-bar.
69
- const renderState = () => amplitudeRenderState(props.state, props.listeningAmplitude);
70
-
71
- const tick = useSequencer(() =>
72
- // Speaking is driven by audio, not the clock; freezing also parks it.
73
- props.frozen || renderState() === 'speaking' ? Infinity : interval(),
74
- );
75
-
76
- const sequence = () => gridSequence(renderState(), rows(), cols(), props.spread);
77
- const active = () => sequence()[tick() % sequence().length] ?? { x: -1, y: -1 };
78
-
79
- // Bands only mean anything while speaking (or listening under the
80
- // `listeningAmplitude` opt-in, folded in by renderState). Everywhere else
81
- // the sequence is the whole story, so a stale level never leaks into a
82
- // scripted state (same guard as BarVisualizer, so the render-prop's `value`
83
- // means one thing across every variant).
84
- const levels = () =>
85
- renderState() === 'speaking' ? normalizeVolumeBands(props.bands, cols()) : new Array(cols()).fill(0);
86
-
87
- /**
88
- * While speaking, a cell lights when its column's level clears a threshold
89
- * that grows with distance from the middle row: the column fills
90
- * centre-outward, so the grid reads as a spectrum. A silent column shows
91
- * nothing (the floor), a loud one reaches the edges (the scaled ramp) —
92
- * both per the divergence note at the top of this file.
93
- */
94
- function isLit(index: number): boolean {
95
- if (renderState() === 'speaking') {
96
- const y = Math.floor(index / cols());
97
- const mid = Math.floor(rows() / 2);
98
- const scaled = (Math.abs(mid - y) / (mid + 1)) * SPEECH_LEVEL_CEILING;
99
- // max() applies the floor exactly where the ramp would be 0 (the middle
100
- // row); every other threshold already clears it.
101
- const threshold = Math.max(scaled, SILENCE_FLOOR);
102
- return (levels()[index % cols()] ?? 0) >= threshold;
103
- }
104
- // Idle shows a fully dark grid (Rob, 2026-08-09) — divergence (3) above;
105
- // upstream rests one stationary centre cell here. 'disconnected' (first-
106
- // class 2026-08-10) mirrors idle's dark grid for now, pending the LiveKit
107
- // disconnected-state measurement.
108
- if (renderState() === 'idle' || renderState() === 'disconnected') return false;
109
- return active().x === index % cols() && active().y === Math.floor(index / cols());
110
- }
111
-
112
- /** Snap on, fade off: highlighted cells transition 10x faster than they decay. */
113
- function transition(index: number): string {
114
- if (renderState() === 'speaking') return '150ms';
115
- return `${interval() / (isLit(index) ? 1000 : 100)}s`;
116
- }
117
-
118
- return (
119
- <div
120
- data-kai-state={props.state}
121
- class={cn('grid', props.class)}
122
- style={{
123
- 'grid-template-columns': `repeat(${cols()}, 1fr)`,
124
- gap: `${GRID_GAP[props.size]}px`,
125
- ...(props.color ? { color: props.color } : {}),
126
- }}
127
- >
128
- {/*
129
- <Index>, not <For>, matching BarVisualizer: `items()` positions are
130
- stable, but mapping by POSITION (rather than by `===` on the array
131
- value) is the correct primitive here too, and it keeps the render-prop
132
- contract identical across variants. See the note in variant-bar.tsx.
133
- */}
134
- <Index each={items()}>
135
- {(_value, index) => {
136
- // Every column repeats down every row, so a cell's level comes from
137
- // its column band, not its flat position: index % cols(), not index.
138
- // `highlighted`/`value` are live accessors: the callback below runs
139
- // once per position, so a consumer's render-prop must call them
140
- // itself to stay current rather than close over a one-time snapshot.
141
- const item = {
142
- index,
143
- highlighted: () => isLit(index),
144
- value: () => levels()[index % cols()] ?? 0,
145
- };
146
- return (
147
- props.children?.(item) ?? (
148
- // The lit state is a SECOND part TOKEN (`part(cell highlighted)`),
149
- // not a `data-*` attribute selector on `::part(cell)`: a CSS
150
- // attribute selector cannot follow a pseudo-element, so
151
- // `::part(cell)[data-kai-highlighted="true"]` never matches
152
- // anything from outside the shadow root. `data-kai-highlighted`
153
- // stays on the element for the render-prop and for styling from
154
- // inside the shadow root; `part` is the external seam.
155
- <div
156
- part={item.highlighted() ? 'cell highlighted' : 'cell'}
157
- data-kai-index={item.index}
158
- data-kai-highlighted={item.highlighted()}
159
- class={cn(
160
- 'place-self-center rounded-full bg-current/10 transition-all ease-out',
161
- 'data-[kai-highlighted=true]:bg-current',
162
- )}
163
- style={{
164
- width: `${GRID_CELL[props.size]}px`,
165
- height: `${GRID_CELL[props.size]}px`,
166
- 'transition-duration': transition(index),
167
- }}
168
- />
169
- )
170
- );
171
- }}
172
- </Index>
173
- </div>
174
- );
175
- }