@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,70 +0,0 @@
1
- // src/primitives/url-scheme-policy.ts
2
- // The kit's one URL-scheme allow/deny policy, split out of card-routing.ts so it
3
- // has NO DOM dependency (`URL` is a global in both the browser and Node — the
4
- // rest of card-routing.ts uses HTMLElement/window/CustomEvent, which aren't).
5
- // That split matters beyond tidiness: this schema.ts (agent-tooling/construct)
6
- // runs under tsconfig.mcp.json's Node-only, no-DOM-lib pass (it's imported
7
- // transitively via mcp/tools/construct.ts), and importing anything from
8
- // card-routing.ts there drags its HTMLElement/window/Document/CustomEvent
9
- // references into that compile and breaks it — even though only isSafeUrl is
10
- // used. card-routing.ts re-exports everything here so its own public surface
11
- // (isSafeUrl/isScriptUrl, used by markdown.tsx/artifact.tsx/source.tsx) is
12
- // unchanged; this is a location split, not a second policy.
13
-
14
- const SAFE_SCHEMES = ['http:', 'https:', 'mailto:'];
15
- const SCRIPT_SCHEMES = ['javascript:', 'vbscript:'];
16
-
17
- /** The scheme the WHATWG parser reads out of `url`, resolved against a base so a
18
- * relative input inherits `http:`. `undefined` when it will not parse at all.
19
- *
20
- * ONE parser for the two questions below, deliberately: the parsing is where
21
- * the subtlety lives (it strips embedded tabs/newlines and trims surrounding
22
- * whitespace before reading the scheme, so `java\nscript:` and
23
- * ` javascript:... ` are both read as `javascript:` -- which a regex over the
24
- * raw string would miss). Two predicates over one parse cannot drift on that;
25
- * two hand-rolled parsers would. */
26
- function schemeOf(url: string): string | undefined {
27
- try { return new URL(url, 'http://_invalid_base').protocol; } catch { return undefined; }
28
- }
29
-
30
- /** True when `url` is safe to put in an href / hand to `window.open` / an `<img src>`.
31
- *
32
- * Exported so the MARKDOWN renderer, the ARTIFACT viewer and the construct
33
- * format's `widget.launcherIcon` reuse this exact guard rather than growing a
34
- * second scheme list that can drift from this one.
35
- *
36
- * Resolving against a base is deliberate and is what makes it correct for
37
- * markdown: a relative or fragment link (`/docs`, `#section`, `./rel`) is
38
- * ordinary markdown, and resolving it inherits the base's `http:` so it
39
- * passes, while `javascript:`/`data:`/`vbscript:` keep their own protocol and
40
- * fail. It is correct for the artifact viewer for the same reason: a file with
41
- * no `src` to resolve against yields a bare relative path (`docs/report.pdf`),
42
- * which is a legitimate artifact address. Contrast `isRenderableLink` in
43
- * `primitives/link-preview.ts`, which takes NO base and so demands an absolute
44
- * http(s) URL: that is the right guard for a model-supplied citation -- a
45
- * reference to a page on the public web -- this one for markdown body links,
46
- * artifact file addresses, and a construct's launcher icon. */
47
- export function isSafeUrl(url: string): boolean {
48
- const scheme = schemeOf(url);
49
- return scheme !== undefined && SAFE_SCHEMES.includes(scheme);
50
- }
51
-
52
- /** True when navigating to `url` would EXECUTE it as script in the initiating
53
- * document's origin.
54
- *
55
- * Strictly narrower than `!isSafeUrl(url)`, and not a competing policy: it
56
- * answers a different question, for the one sink where the allowlist is the
57
- * wrong tool. An `<iframe src>` legitimately takes `data:` and `blob:` (a
58
- * `data:` blob artifact is a documented `<kai-artifact>` use -- it is what
59
- * `displayUrl` exists for) and both get an OPAQUE origin in every modern
60
- * browser, so neither can reach the host page. `javascript:`/`vbscript:` are
61
- * the schemes that run in the EMBEDDER's origin, and they are the whole risk:
62
- * the default sandbox (no `allow-same-origin`) already makes the browser refuse
63
- * them, but a consumer who sets `allow-same-origin` turns a model-supplied
64
- * `src` into host-origin script execution. The artifact viewer used to suggest
65
- * that setting for "an artifact you trust"; it no longer does, and this guard
66
- * is what protects the consumers who took the old advice. */
67
- export function isScriptUrl(url: string): boolean {
68
- const scheme = schemeOf(url);
69
- return scheme !== undefined && SCRIPT_SCHEMES.includes(scheme);
70
- }
@@ -1,340 +0,0 @@
1
- import { createSignal, createEffect, onCleanup, type Accessor } from 'solid-js';
2
- import { reduceToBands, reduceToVolume } from './audio-bands';
3
-
4
- export interface AudioAnalysisOptions {
5
- /**
6
- * Number of frequency buckets to produce, or a live accessor for it.
7
- * Default 5.
8
- *
9
- * An accessor is resolved INSIDE the analysis effect, so a change to
10
- * whatever signal backs it (e.g. a caller's variant or size switching)
11
- * rebuilds the analyser at the new bucket count instead of silently
12
- * leaving `bands()` padded or truncated to a stale size.
13
- */
14
- bands?: number | (() => number);
15
- /**
16
- * Low bin index of the pass window. NOT a frequency. Default 100 --
17
- * upstream LiveKit's component value (see DEFAULTS below).
18
- */
19
- loPass?: number;
20
- /**
21
- * High bin index of the pass window. NOT a frequency. Default 200 --
22
- * upstream LiveKit's component value (see DEFAULTS below).
23
- *
24
- * Legitimately input-dependent, unlike `fftSize`/`smoothingTimeConstant`:
25
- * the default window expects PROCESSED speech (an agent's TTS track, or a
26
- * mic captured with AGC/noise suppression on). For raw, unprocessed input
27
- * -- an un-gained recording, music, ambience -- a wide low window such as
28
- * `loPass: 4, hiPass: 120` reads energy the default deliberately gates
29
- * out; see DEFAULTS below for the trade both ways.
30
- */
31
- hiPass?: number;
32
- /** Minimum ms between updates. Default 32 (about 30fps). */
33
- updateInterval?: number;
34
- }
35
-
36
- /**
37
- * The default window is upstream LiveKit's COMPONENT window, bins 100-200:
38
- * every shipped agents-ui visualizer passes `{ loPass: 100, hiPass: 200 }`
39
- * (agent-audio-visualizer-bar.tsx:181-183, grid.tsx:279-281,
40
- * radial.tsx:142-144 -- radial's loPass was 80 until their PR #1265). Their
41
- * HOOK's own default is 100-600 (useTrackVolume.ts:95-101), but no shipped
42
- * component uses it, so parity means matching the components.
43
- *
44
- * At fftSize 2048 that is ~2.34-4.69kHz at 48kHz (2.15-4.31kHz at 44.1kHz):
45
- * the sibilance band, ABOVE where a room's noise floor lives. Everything at
46
- * or below -100dB normalizes to exactly 0 (see normalizeDb), and a real
47
- * room's tone measures ~17dB BELOW that floor across this window while
48
- * sitting ~27dB ABOVE it across 86-258Hz (noise-floor diagnosis, table A).
49
- * The narrow high window plus the hard -100dB floor IS upstream's noise
50
- * gate -- there is no explicit gate anywhere in their pipeline -- and it is
51
- * what keeps their idle bars perfectly still where a wide window shows the
52
- * room breathing.
53
- *
54
- * The trade, measured on a real un-processed recording ("this is a test,
55
- * testing one two three, hello world"): through 100-200, quiet
56
- * natural-volume speech frames read all-zero (54% of that clip's frames;
57
- * consonants and sibilance still register on the louder ones). Upstream
58
- * lives with that because their input is conditioned before analysis -- an
59
- * agent's loud TTS track, or a local mic captured with autoGainControl +
60
- * noiseSuppression + echoCancellation + voiceIsolation (livekit-client
61
- * defaults.ts:27-30) that lifts speech toward target level. Ours follows:
62
- * the mic stories request the same constraint set. For RAW input where that
63
- * trade reads wrong (un-gained recordings, music), `loPass: 4, hiPass: 120`
64
- * (86Hz-2.6kHz: fundamental + first two formants) remains the measured
65
- * opt-in -- it read those same quiet frames at mean 0.234 with only true
66
- * silence at zero -- at the documented cost of visualizing the room's noise
67
- * floor on the centre elements (the defect that reverted this default).
68
- */
69
- export const DEFAULTS = {
70
- bands: 5,
71
- loPass: 100,
72
- hiPass: 200,
73
- updateInterval: 32,
74
- } as const;
75
-
76
- /**
77
- * `fftSize`/`smoothingTimeConstant` are deliberately NOT caller-configurable
78
- * options, unlike everything above. They exist in two different, non-tunable
79
- * shapes below instead: one AnalyserNode per reduction, each matching
80
- * upstream LiveKit's own hook for that reduction. A single flat
81
- * `smoothingTimeConstant` option (this hook's original design) is exactly
82
- * the bug that made bars snap back to rest instead of easing like upstream's
83
- * do: one value silently applied to both a fast reduction and a slow one.
84
- * Hard-coding removes the only way a caller (or a future edit here) could
85
- * reintroduce that.
86
- *
87
- * These analyser shapes (and DEFAULTS above) are EXPORTED as the kit's
88
- * analysis-settings contract: external instrumentation -- the
89
- * examples/internal/livekit-parity probe -- imports them instead of
90
- * restating the numbers, so a change here propagates instead of drifting.
91
- */
92
-
93
- /**
94
- * Matches upstream's `useMultibandTrackVolume`, which drives the DOM
95
- * bar/grid/radial variants: `{ fftSize: 2048 }`, no `smoothingTimeConstant`
96
- * given, so the AnalyserNode uses the Web Audio spec default of 0.8. That
97
- * slow decay (roughly 330ms to fall to 10% of a peak, at this hook's 32ms
98
- * sample interval) is what makes bars ease back to rest after speech stops
99
- * instead of snapping.
100
- */
101
- export const BANDS_ANALYSER = {
102
- fftSize: 2048,
103
- smoothingTimeConstant: 0.8,
104
- } as const;
105
-
106
- /**
107
- * Matches upstream's `useTrackVolume` as the wave/aura hooks call it:
108
- * `{ fftSize: 512, smoothingTimeConstant: 0.55 }`
109
- * (use-agent-audio-visualizer-wave.ts:55-56, aura.ts:62-63). Faster decay
110
- * (roughly 123ms to 10% of peak) keeps the shaders' reactivity within the
111
- * ~33ms lag the aurora variant was tuned against; the bands' slower 0.8
112
- * here would make the shaders visibly sluggish. Upstream reaches the same
113
- * two-analyser structure differently -- two hooks, each with its own
114
- * analyser (and its own AudioContext) -- but the constants match ours
115
- * exactly.
116
- *
117
- * `minDecibels`/`maxDecibels` are upstream's `createAudioAnalyser` defaults
118
- * (livekit-client src/room/utils.ts:548-553), NOT the Web Audio spec's
119
- * -100/-30. They only rescale getByteFrequencyData -- this analyser's whole
120
- * output -- mapping the byte range over a 20dB window that saturates at
121
- * -80dB. That is what makes upstream's volume scalar run hot (speech
122
- * ~0.5-0.9) and their wave/aura feel alive; on the spec scale the same
123
- * speech read ~3x colder here (0.31 vs 0.80, noise-floor diagnosis,
124
- * addendum 1), leaving our shaders under-reacting. The BANDS analyser gets
125
- * no such pair: it is read with getFloatFrequencyData, where these two
126
- * properties have no effect at all.
127
- */
128
- export const VOLUME_ANALYSER = {
129
- fftSize: 512,
130
- smoothingTimeConstant: 0.55,
131
- minDecibels: -100,
132
- maxDecibels: -80,
133
- } as const;
134
-
135
- /** `bands` accepts a plain number or a live accessor; read whichever was given. */
136
- function resolveBandCount(bands: number | (() => number)): number {
137
- return typeof bands === 'function' ? bands() : bands;
138
- }
139
-
140
- /**
141
- * One AudioContext for the whole page. Contexts are expensive and browsers cap
142
- * how many can exist, so a per-mount context would break a page with several
143
- * visualizers on it.
144
- */
145
- let sharedContext: AudioContext | undefined;
146
-
147
- function getContext(): AudioContext | undefined {
148
- if (typeof AudioContext === 'undefined') return undefined;
149
- sharedContext ??= new AudioContext();
150
- return sharedContext;
151
- }
152
-
153
- /**
154
- * `createMediaElementSource` THROWS if called twice for the same element, and
155
- * there is no API to ask whether an element already has a source node. Cache
156
- * them. A WeakMap so a removed <audio> can still be collected.
157
- */
158
- const elementSources = new WeakMap<HTMLMediaElement, MediaElementAudioSourceNode>();
159
-
160
- /**
161
- * `createMediaStreamSource` does NOT throw on a second call for the same
162
- * stream, unlike the element API above -- it is legal per spec to build
163
- * several independent source nodes from one MediaStream. In practice several
164
- * simultaneous nodes reading the same stream is a known source of
165
- * intermittent silent data loss in Chromium (observed here as `volume`
166
- * sticking at 0 for several seconds with three or more visualizers on one
167
- * live microphone). Cache and share one node per stream, exactly like the
168
- * element path, so N consumers is one node with N analyser taps rather than
169
- * N nodes racing each other.
170
- */
171
- const streamSources = new WeakMap<MediaStream, MediaStreamAudioSourceNode>();
172
-
173
- /**
174
- * `instanceof MediaStream` is not usable here: that global does not exist in
175
- * every environment (jsdom included), and referencing it throws a
176
- * ReferenceError instead of returning false. Every DOM element carries a
177
- * `tagName`; a MediaStream never does, so it is a safe, environment-agnostic
178
- * discriminator between the two accepted source types.
179
- */
180
- function isMediaElement(src: MediaStream | HTMLMediaElement): src is HTMLMediaElement {
181
- return 'tagName' in src;
182
- }
183
-
184
- /** Resume a context parked by the autoplay policy, on the first user gesture. */
185
- function resumeOnGesture(ctx: AudioContext): () => void {
186
- if (ctx.state !== 'suspended') return () => {};
187
- if (typeof document === 'undefined') return () => {};
188
-
189
- const resume = () => void ctx.resume().catch(() => {});
190
- const events = ['pointerdown', 'keydown', 'touchstart'] as const;
191
- events.forEach((e) => document.addEventListener(e, resume, { once: true, passive: true }));
192
- return () => events.forEach((e) => document.removeEventListener(e, resume));
193
- }
194
-
195
- /**
196
- * Turn a live audio source into numbers a visualizer can draw.
197
- *
198
- * Runs TWO analysers off one source node: `bands` for the DOM variants and a
199
- * scalar `volume` for the shader ones, each with its own `fftSize` and
200
- * `smoothingTimeConstant` matching upstream's two separate hooks (see
201
- * BANDS_ANALYSER / VOLUME_ANALYSER above). An earlier version of this hook
202
- * shared a single analyser between both reductions as an optimization; that
203
- * silently forced one smoothing behavior onto both and made bars snap back
204
- * to rest instead of easing like upstream's do. What this still saves over
205
- * upstream: one shared, cached source node per element/stream (see
206
- * elementSources/streamSources below) instead of a fresh one per hook
207
- * instance, and one requestAnimationFrame loop reading both analysers each
208
- * tick instead of two independent timers.
209
- *
210
- * Safe to call with no source: it emits zeros and never constructs a context,
211
- * which is what makes the state-driven (no audio) mode work.
212
- */
213
- export function useAudioAnalysis(
214
- source: () => MediaStream | HTMLMediaElement | undefined,
215
- options: AudioAnalysisOptions = {},
216
- ): { bands: Accessor<number[]>; volume: Accessor<number> } {
217
- const opts = { ...DEFAULTS, ...options };
218
- const [bands, setBands] = createSignal<number[]>(new Array(resolveBandCount(opts.bands)).fill(0));
219
- const [volume, setVolume] = createSignal(0);
220
-
221
- createEffect(() => {
222
- const src = source();
223
- // Read INSIDE the effect, not from the outer `opts.bands` closure: when
224
- // this is an accessor, calling it here is what makes the effect track it,
225
- // so a later change reruns this whole setup (new analyser, right-sized
226
- // arrays) instead of leaving the old bucket count wired up forever.
227
- const bandCount = resolveBandCount(opts.bands);
228
-
229
- // Reset to a correctly-sized zero array whenever the source or the band
230
- // count changes, so a stale picture never lingers after the mic stops or
231
- // the requested resolution changes.
232
- setBands(new Array(bandCount).fill(0));
233
- setVolume(0);
234
-
235
- if (!src) return;
236
-
237
- const ctx = getContext();
238
- if (!ctx) return; // SSR, or a browser without Web Audio.
239
- if (typeof requestAnimationFrame === 'undefined') return;
240
- if (typeof cancelAnimationFrame === 'undefined') return;
241
-
242
- // Captured at SETUP and closed over, never re-resolved as a global inside
243
- // `onCleanup`: cleanup can run after the host removed the DOM globals (a
244
- // `kai-*` release is deferred one microtask past detachment, so an
245
- // environment teardown gets in between), and a bare `cancelAnimationFrame`
246
- // there throws -- from a promise nobody holds, so it lands as an unhandled
247
- // rejection that fails the run while every test passes.
248
- // See tests/components/teardown-without-dom-globals.test.tsx.
249
- //
250
- // The FUNCTION, not the view. The `const win = window` capture that fixes a
251
- // bare `document` does nothing here: `window === globalThis` -- measured, in
252
- // jsdom and in real Chromium/WebKit alike -- and the teardown deletes these
253
- // keys off that very object, so `win.cancelAnimationFrame` is undefined by
254
- // the time cleanup runs. It only trades the ReferenceError for a TypeError.
255
- // `.bind` pins the receiver the WebIDL operation is specified on; Chromium
256
- // and WebKit both accept a detached call (measured), so the bind is belt and
257
- // braces against an engine that does not, at zero cost.
258
- const cancelFrame = cancelAnimationFrame.bind(globalThis);
259
-
260
- const stopResume = resumeOnGesture(ctx);
261
-
262
- let node: AudioNode;
263
- if (!isMediaElement(src)) {
264
- let streamNode = streamSources.get(src);
265
- if (!streamNode) {
266
- streamNode = ctx.createMediaStreamSource(src);
267
- streamSources.set(src, streamNode);
268
- }
269
- node = streamNode;
270
- // Deliberately NOT connected to destination: that would echo the mic.
271
- // Unlike the element path below, a stream source NEVER reaches
272
- // destination, cached or not.
273
- } else {
274
- const el = src;
275
- let elNode = elementSources.get(el);
276
- if (!elNode) {
277
- elNode = ctx.createMediaElementSource(el);
278
- // Connect to destination exactly once, right here at creation, so the
279
- // audio path does not depend on how many visualizers attach. Both
280
- // analysers below are terminal side-taps: an AnalyserNode still
281
- // receives data with nothing connected downstream of it, so neither
282
- // one also connects to destination. If either did, N consumers on
283
- // one element would sum to N times the amplitude.
284
- elNode.connect(ctx.destination);
285
- elementSources.set(el, elNode);
286
- }
287
- node = elNode;
288
- }
289
-
290
- // Two analysers off the same source node, not one: see BANDS_ANALYSER /
291
- // VOLUME_ANALYSER above for why they cannot share a smoothingTimeConstant.
292
- const bandsAnalyser = ctx.createAnalyser();
293
- bandsAnalyser.fftSize = BANDS_ANALYSER.fftSize;
294
- bandsAnalyser.smoothingTimeConstant = BANDS_ANALYSER.smoothingTimeConstant;
295
-
296
- const volumeAnalyser = ctx.createAnalyser();
297
- volumeAnalyser.fftSize = VOLUME_ANALYSER.fftSize;
298
- volumeAnalyser.smoothingTimeConstant = VOLUME_ANALYSER.smoothingTimeConstant;
299
- // Byte-scale rescale, volume analyser ONLY -- see VOLUME_ANALYSER above.
300
- volumeAnalyser.minDecibels = VOLUME_ANALYSER.minDecibels;
301
- volumeAnalyser.maxDecibels = VOLUME_ANALYSER.maxDecibels;
302
-
303
- node.connect(bandsAnalyser);
304
- node.connect(volumeAnalyser);
305
-
306
- const freq = new Float32Array(bandsAnalyser.frequencyBinCount);
307
- const bytes = new Uint8Array(volumeAnalyser.frequencyBinCount);
308
-
309
- let raf = 0;
310
- let last = 0;
311
- const step = (now: number) => {
312
- if (now - last >= opts.updateInterval) {
313
- bandsAnalyser.getFloatFrequencyData(freq);
314
- volumeAnalyser.getByteFrequencyData(bytes);
315
- setBands(reduceToBands(freq, bandCount, opts.loPass, opts.hiPass));
316
- setVolume(reduceToVolume(bytes));
317
- last = now;
318
- }
319
- raf = requestAnimationFrame(step);
320
- };
321
- raf = requestAnimationFrame(step);
322
-
323
- onCleanup(() => {
324
- cancelFrame(raf);
325
- stopResume();
326
- bandsAnalyser.disconnect();
327
- volumeAnalyser.disconnect();
328
- // Both the element and stream source nodes above are cached and shared
329
- // across every consumer of the same element/stream: another consumer
330
- // may still be using this one, and it can never be recreated. Drop
331
- // only this consumer's own taps into it (the two-argument form, once
332
- // per analyser), never the no-argument node.disconnect() -- that would
333
- // tear the source down for everyone still using it.
334
- node.disconnect(bandsAnalyser);
335
- node.disconnect(volumeAnalyser);
336
- });
337
- });
338
-
339
- return { bands, volume };
340
- }
@@ -1,31 +0,0 @@
1
- import { onCleanup } from 'solid-js';
2
-
3
- interface UseAutoResizeOptions {
4
- maxHeight?: number;
5
- }
6
-
7
- export function useAutoResize(options: UseAutoResizeOptions = {}) {
8
- let textareaEl: HTMLTextAreaElement | undefined;
9
-
10
- function resize() {
11
- if (!textareaEl) return;
12
- textareaEl.style.height = 'auto';
13
- const scrollHeight = textareaEl.scrollHeight;
14
- if (options.maxHeight && scrollHeight > options.maxHeight) {
15
- textareaEl.style.height = `${options.maxHeight}px`;
16
- textareaEl.style.overflowY = 'auto';
17
- } else {
18
- textareaEl.style.height = `${scrollHeight}px`;
19
- textareaEl.style.overflowY = 'hidden';
20
- }
21
- }
22
-
23
- function ref(el: HTMLTextAreaElement) {
24
- textareaEl = el;
25
- el.addEventListener('input', resize);
26
- requestAnimationFrame(resize);
27
- onCleanup(() => el.removeEventListener('input', resize));
28
- }
29
-
30
- return { ref, resize };
31
- }
@@ -1,45 +0,0 @@
1
- /** Observe an element's content height; invoke `onHeight` when it changes by more than
2
- * THRESHOLD px (hysteresis kills sub-pixel oscillation — H-J). Returns a disposer. */
3
- const THRESHOLD = 1;
4
- export function observeContentHeight(el: Element, onHeight: (height: number) => void): () => void {
5
- let last = -1;
6
- const ro = new ResizeObserver((entries) => {
7
- const h = entries[entries.length - 1]?.contentRect.height ?? el.getBoundingClientRect().height;
8
- if (last < 0 || Math.abs(h - last) > THRESHOLD) { last = h; onHeight(h); }
9
- });
10
- ro.observe(el);
11
- return () => ro.disconnect();
12
- }
13
-
14
- /** Observe an element's resizes but report the FULL rendered document height (not the
15
- * observed element's own content-box) — `document.body.scrollHeight`.
16
- *
17
- * Used by the remote-card provider runtime to size the host iframe:
18
- * `observeContentHeight` reports the ResizeObserver content-box of
19
- * the observed root, which drops that root's OWN padding/border and any ancestor
20
- * (e.g. `<body>`) padding above it — the host then clips the bottom of the card by
21
- * exactly those lost pixels. `scrollHeight` is the full padding-box height as actually
22
- * rendered, so it stays correct no matter which element in the ancestor chain carries
23
- * the padding/border, including if the provider page's own styles change later —
24
- * reading contentRect off one fixed element, or hand-summing computed padding/border
25
- * off a fixed list of ancestors, would both need updating every time that chain does.
26
- *
27
- * Deliberately `document.body.scrollHeight`, NOT `document.documentElement.scrollHeight`
28
- * (N1, task-10-report.md "Fix-wave re-review"): the CSSOM View spec special-cases the
29
- * scrollHeight of the ROOT element to be `max(viewport scrolling area, viewport
30
- * height)` — and the host sets the iframe's viewport FROM this very measurement
31
- * (`host-embed.ts` `sizeIframe`), so `documentElement.scrollHeight` can only grow for
32
- * the life of the frame: once the iframe is tall, the root's own scrollHeight is
33
- * floored at that height even after the card's content shrinks. `<body>` carries no
34
- * such floor — its scrollHeight is a plain padding-box measurement of body's own
35
- * content, so it shrinks along with the card. */
36
- export function observeDocumentHeight(el: Element, onHeight: (height: number) => void): () => void {
37
- let last = -1;
38
- const ro = new ResizeObserver(() => {
39
- const doc = el.ownerDocument;
40
- const h = doc?.body?.scrollHeight ?? doc?.documentElement?.scrollHeight ?? el.getBoundingClientRect().height;
41
- if (last < 0 || Math.abs(h - last) > THRESHOLD) { last = h; onHeight(h); }
42
- });
43
- ro.observe(el);
44
- return () => ro.disconnect();
45
- }
@@ -1,72 +0,0 @@
1
- import { createSignal, createEffect, onCleanup, createMemo, type Accessor } from 'solid-js';
2
-
3
- /**
4
- * One requestAnimationFrame loop emitting a monotonically increasing tick
5
- * whenever `interval()` milliseconds have elapsed.
6
- *
7
- * RAF rather than setInterval: the browser parks it on hidden tabs, so an
8
- * off-screen visualizer costs nothing. Upstream leaks a timer here.
9
- *
10
- * An interval of `Infinity` (or anything non-finite) parks the loop entirely
11
- * and holds the tick at 0. The radial variant uses that while `thinking`,
12
- * where a CSS spin drives the motion instead.
13
- */
14
- export function useSequencer(interval: () => number): Accessor<number> {
15
- const [tick, setTick] = createSignal(0);
16
-
17
- // Memoize the interval VALUE to isolate the effect from whatever else the
18
- // interval getter might be transitively subscribed to (e.g. a props proxy
19
- // that includes unrelated signals like `bands`). The memo only notifies
20
- // downstream when the number itself changes, not when intermediate accessors
21
- // that feed it change to the same final value. This is the same pattern as
22
- // `uniformShapeKey` in `shader-canvas.tsx`.
23
- const intervalMs = createMemo(() => interval());
24
-
25
- createEffect(() => {
26
- const ms = intervalMs();
27
-
28
- // Reset on every interval change so a state transition restarts the
29
- // sequence from its first frame rather than resuming mid-pattern.
30
- // With the memo, this only fires on real changes (the interval VALUE),
31
- // not on spurious re-runs from unrelated props churn.
32
- setTick(0);
33
-
34
- if (!Number.isFinite(ms) || ms <= 0) return;
35
- if (typeof requestAnimationFrame === 'undefined') return;
36
- if (typeof cancelAnimationFrame === 'undefined') return;
37
-
38
- // Captured at SETUP and closed over, never re-resolved as a global inside
39
- // `onCleanup`: cleanup can run after the host removed the DOM globals (a
40
- // `kai-*` release is deferred one microtask past detachment, so an
41
- // environment teardown gets in between), and a bare `cancelAnimationFrame`
42
- // there throws -- from a promise nobody holds, so it lands as an unhandled
43
- // rejection that fails the run while every test passes.
44
- // See tests/components/teardown-without-dom-globals.test.tsx.
45
- //
46
- // The FUNCTION, not the view. The `const win = window` capture that fixes a
47
- // bare `document` does nothing here: `window === globalThis` -- measured, in
48
- // jsdom and in real Chromium/WebKit alike -- and the teardown deletes these
49
- // keys off that very object, so `win.cancelAnimationFrame` is undefined by
50
- // the time cleanup runs. It only trades the ReferenceError for a TypeError.
51
- // `.bind` pins the receiver the WebIDL operation is specified on; Chromium
52
- // and WebKit both accept a detached call (measured), so the bind is belt and
53
- // braces against an engine that does not, at zero cost.
54
- const cancelFrame = cancelAnimationFrame.bind(globalThis);
55
-
56
- let raf = 0;
57
- let last = performance.now();
58
-
59
- const step = (now: number) => {
60
- if (now - last >= ms) {
61
- setTick((t) => t + 1);
62
- last = now;
63
- }
64
- raf = requestAnimationFrame(step);
65
- };
66
-
67
- raf = requestAnimationFrame(step);
68
- onCleanup(() => cancelFrame(raf));
69
- });
70
-
71
- return tick;
72
- }