@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,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
- }