@kitn.ai/ui 0.28.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 (376) hide show
  1. package/README.md +1 -1
  2. package/dist/agent-tooling/construct/public.d.ts +15 -0
  3. package/dist/agent-tooling/construct/schema.d.ts +111 -0
  4. package/dist/construct-cli.es.js +3 -3
  5. package/dist/construct.d.ts +5 -0
  6. package/dist/construct.js +327 -0
  7. package/dist/core-C8fzo39E.js +1 -12
  8. package/dist/engine-javascript-C1x7zo1_.js +1 -141
  9. package/dist/mcp.es.js +1 -1
  10. package/package.json +16 -16
  11. package/bin/route.test.js +0 -58
  12. package/src/agent-tooling/README.md +0 -192
  13. package/src/agent-tooling/archetypes.ts +0 -205
  14. package/src/agent-tooling/catalog/README.md +0 -676
  15. package/src/agent-tooling/catalog/catalog-types.ts +0 -231
  16. package/src/agent-tooling/catalog/fabrications.ts +0 -96
  17. package/src/agent-tooling/catalog/invariants.ts +0 -284
  18. package/src/agent-tooling/catalog/labs-titles.ts +0 -114
  19. package/src/agent-tooling/catalog/scenarios.ts +0 -87
  20. package/src/agent-tooling/catalog/surfaces.ts +0 -347
  21. package/src/agent-tooling/construct/cli-entry.ts +0 -8
  22. package/src/agent-tooling/construct/cli.ts +0 -147
  23. package/src/agent-tooling/construct/codegen.ts +0 -1635
  24. package/src/agent-tooling/construct/construct.v1.schema.json +0 -319
  25. package/src/agent-tooling/construct/dev.ts +0 -148
  26. package/src/agent-tooling/construct/fixtures/demo-widget.construct.json +0 -7
  27. package/src/agent-tooling/construct/fixtures/ops-console.construct.json +0 -44
  28. package/src/agent-tooling/construct/fixtures/owner-widget.construct.json +0 -32
  29. package/src/agent-tooling/construct/schema.ts +0 -452
  30. package/src/agent-tooling/integrations/anthropic.ts +0 -442
  31. package/src/agent-tooling/integrations/cloudflare.ts +0 -218
  32. package/src/agent-tooling/integrations/langgraph.ts +0 -133
  33. package/src/agent-tooling/integrations/mastra.ts +0 -182
  34. package/src/agent-tooling/integrations/mock.ts +0 -148
  35. package/src/agent-tooling/integrations/ollama.ts +0 -97
  36. package/src/agent-tooling/integrations/openai.ts +0 -95
  37. package/src/agent-tooling/integrations/openrouter.ts +0 -82
  38. package/src/agent-tooling/integrations/pi.ts +0 -176
  39. package/src/agent-tooling/integrations/pydantic-ai.ts +0 -108
  40. package/src/agent-tooling/integrations/vercel-ai-sdk.ts +0 -398
  41. package/src/agent-tooling/mcp/css-raw.d.ts +0 -12
  42. package/src/agent-tooling/mcp/manifest.ts +0 -422
  43. package/src/agent-tooling/mcp/server.ts +0 -116
  44. package/src/agent-tooling/mcp/stdio.ts +0 -18
  45. package/src/agent-tooling/mcp/tools/construct.ts +0 -130
  46. package/src/agent-tooling/mcp/tools/debug.ts +0 -621
  47. package/src/agent-tooling/mcp/tools/reference.ts +0 -980
  48. package/src/agent-tooling/mcp/tools/scaffold.ts +0 -6708
  49. package/src/agent-tooling/mcp/tools/theme.ts +0 -456
  50. package/src/agent-tooling/mcp/tools/types.ts +0 -14
  51. package/src/agent-tooling/mcp/validate-args.ts +0 -141
  52. package/src/agent-tooling/recipes/composed-thread.ts +0 -714
  53. package/src/agent-tooling/recipes/index.ts +0 -22
  54. package/src/agent-tooling/recipes/types.ts +0 -32
  55. package/src/agent-tooling/registry.ts +0 -132
  56. package/src/agent-tooling/route-emit.ts +0 -305
  57. package/src/agent-tooling/types.ts +0 -390
  58. package/src/components/artifact-card.tsx +0 -120
  59. package/src/components/artifact.tsx +0 -914
  60. package/src/components/attachment-types.ts +0 -66
  61. package/src/components/attachments.tsx +0 -536
  62. package/src/components/audio-visualizer/audio-visualizer.voice-fixture.ts +0 -257
  63. package/src/components/audio-visualizer/aurora.glsl.ts +0 -330
  64. package/src/components/audio-visualizer/fit-scale.ts +0 -112
  65. package/src/components/audio-visualizer/index.tsx +0 -528
  66. package/src/components/audio-visualizer/labs/lab-choreography.ts +0 -187
  67. package/src/components/audio-visualizer/labs/lab-shaders.ts +0 -363
  68. package/src/components/audio-visualizer/labs/lab-visualizer.tsx +0 -102
  69. package/src/components/audio-visualizer/shader-canvas.tsx +0 -876
  70. package/src/components/audio-visualizer/sizes.ts +0 -54
  71. package/src/components/audio-visualizer/variant-aurora.tsx +0 -305
  72. package/src/components/audio-visualizer/variant-bar.tsx +0 -175
  73. package/src/components/audio-visualizer/variant-custom.tsx +0 -344
  74. package/src/components/audio-visualizer/variant-grid.tsx +0 -175
  75. package/src/components/audio-visualizer/variant-radial.tsx +0 -163
  76. package/src/components/audio-visualizer/variant-wave.tsx +0 -130
  77. package/src/components/audio-visualizer/wave.glsl.ts +0 -130
  78. package/src/components/card-fallback.tsx +0 -60
  79. package/src/components/card-renderer.tsx +0 -220
  80. package/src/components/card.tsx +0 -212
  81. package/src/components/chain-of-thought.tsx +0 -348
  82. package/src/components/chat-container.tsx +0 -89
  83. package/src/components/chat-scope-picker.tsx +0 -57
  84. package/src/components/chat-thread.tsx +0 -1014
  85. package/src/components/checkpoint.tsx +0 -88
  86. package/src/components/choice-card.tsx +0 -743
  87. package/src/components/coachmark.tsx +0 -249
  88. package/src/components/code-block.tsx +0 -181
  89. package/src/components/composer-dom.ts +0 -159
  90. package/src/components/composer-highlight.ts +0 -242
  91. package/src/components/composer-history.ts +0 -82
  92. package/src/components/composer.tsx +0 -1075
  93. package/src/components/confirm-card.tsx +0 -402
  94. package/src/components/context.tsx +0 -377
  95. package/src/components/conversation-item.tsx +0 -241
  96. package/src/components/conversation-list.tsx +0 -429
  97. package/src/components/conversation-panel.tsx +0 -118
  98. package/src/components/dismissed-stub.tsx +0 -80
  99. package/src/components/embed.tsx +0 -200
  100. package/src/components/empty.tsx +0 -177
  101. package/src/components/feedback-bar.tsx +0 -166
  102. package/src/components/file-tree.tsx +0 -530
  103. package/src/components/file-upload.tsx +0 -167
  104. package/src/components/form-widgets.tsx +0 -525
  105. package/src/components/form.tsx +0 -1296
  106. package/src/components/home-panel.tsx +0 -159
  107. package/src/components/image.tsx +0 -65
  108. package/src/components/link-preview.tsx +0 -195
  109. package/src/components/loader.tsx +0 -367
  110. package/src/components/markdown.tsx +0 -162
  111. package/src/components/message-skills.tsx +0 -40
  112. package/src/components/message.tsx +0 -765
  113. package/src/components/model-switcher.tsx +0 -132
  114. package/src/components/prompt-input.tsx +0 -188
  115. package/src/components/prompt-suggestion.tsx +0 -150
  116. package/src/components/reasoning.tsx +0 -293
  117. package/src/components/response-compare-types.ts +0 -152
  118. package/src/components/response-compare.tsx +0 -455
  119. package/src/components/response-stream.tsx +0 -109
  120. package/src/components/screen.tsx +0 -181
  121. package/src/components/scroll-button.tsx +0 -93
  122. package/src/components/source.tsx +0 -192
  123. package/src/components/tasks-card.tsx +0 -801
  124. package/src/components/text-shimmer.tsx +0 -37
  125. package/src/components/thinking-bar.tsx +0 -50
  126. package/src/components/thread.tsx +0 -228
  127. package/src/components/toast.tsx +0 -503
  128. package/src/components/tool-classify.ts +0 -26
  129. package/src/components/tool-types.ts +0 -49
  130. package/src/components/tool.tsx +0 -190
  131. package/src/components/use-card-resolution.ts +0 -44
  132. package/src/components/voice-input.tsx +0 -222
  133. package/src/components/voice-output.tsx +0 -242
  134. package/src/components/widget-tab-bar.tsx +0 -73
  135. package/src/components/workspace-shell.tsx +0 -285
  136. package/src/diagnostics/hook.ts +0 -352
  137. package/src/diagnostics/index.ts +0 -82
  138. package/src/diagnostics/report-request.ts +0 -296
  139. package/src/elements/agent-card.tsx +0 -67
  140. package/src/elements/artifact.tsx +0 -194
  141. package/src/elements/attachments.tsx +0 -140
  142. package/src/elements/audio-visualizer.tsx +0 -227
  143. package/src/elements/autoloader.ts +0 -89
  144. package/src/elements/avatar.tsx +0 -33
  145. package/src/elements/badge.tsx +0 -32
  146. package/src/elements/button.tsx +0 -149
  147. package/src/elements/card.tsx +0 -133
  148. package/src/elements/cards.tsx +0 -266
  149. package/src/elements/chain-of-thought.tsx +0 -141
  150. package/src/elements/chat-scope-picker.tsx +0 -65
  151. package/src/elements/chat-types.ts +0 -102
  152. package/src/elements/chat-workspace.tsx +0 -188
  153. package/src/elements/chat.tsx +0 -304
  154. package/src/elements/checkbox-group.tsx +0 -164
  155. package/src/elements/checkbox.tsx +0 -134
  156. package/src/elements/checkpoint.tsx +0 -47
  157. package/src/elements/choice.tsx +0 -100
  158. package/src/elements/coachmark.tsx +0 -90
  159. package/src/elements/code-block.tsx +0 -60
  160. package/src/elements/command.tsx +0 -197
  161. package/src/elements/compare.tsx +0 -111
  162. package/src/elements/compiled.css +0 -2
  163. package/src/elements/composer.tsx +0 -162
  164. package/src/elements/confirm-card.tsx +0 -76
  165. package/src/elements/context-meter.tsx +0 -107
  166. package/src/elements/conversation-item.tsx +0 -120
  167. package/src/elements/conversation-list.tsx +0 -203
  168. package/src/elements/css.ts +0 -5
  169. package/src/elements/default-input.tsx +0 -392
  170. package/src/elements/define-entry.ts +0 -12
  171. package/src/elements/define.tsx +0 -563
  172. package/src/elements/diagnostic-events.ts +0 -114
  173. package/src/elements/dialog.tsx +0 -145
  174. package/src/elements/disclosure.ts +0 -95
  175. package/src/elements/dock.tsx +0 -215
  176. package/src/elements/dropdown.tsx +0 -123
  177. package/src/elements/editable-label.tsx +0 -140
  178. package/src/elements/element-data-types.ts +0 -152
  179. package/src/elements/element-diagnostics.ts +0 -392
  180. package/src/elements/element-manifest.json +0 -354
  181. package/src/elements/element-nonscalar.json +0 -187
  182. package/src/elements/element-types.d.ts +0 -4353
  183. package/src/elements/embed.tsx +0 -35
  184. package/src/elements/empty.tsx +0 -29
  185. package/src/elements/feedback-bar.tsx +0 -66
  186. package/src/elements/file-tree.tsx +0 -62
  187. package/src/elements/file-upload.tsx +0 -44
  188. package/src/elements/form.tsx +0 -94
  189. package/src/elements/hover-card.tsx +0 -80
  190. package/src/elements/icon.tsx +0 -41
  191. package/src/elements/image.tsx +0 -32
  192. package/src/elements/input.tsx +0 -492
  193. package/src/elements/kbd.tsx +0 -45
  194. package/src/elements/link-preview.tsx +0 -34
  195. package/src/elements/loader.tsx +0 -25
  196. package/src/elements/markdown.tsx +0 -38
  197. package/src/elements/menu.tsx +0 -241
  198. package/src/elements/message-skills.tsx +0 -83
  199. package/src/elements/message.tsx +0 -361
  200. package/src/elements/model-switcher.tsx +0 -121
  201. package/src/elements/nav.tsx +0 -87
  202. package/src/elements/notice.tsx +0 -53
  203. package/src/elements/pane-grid.tsx +0 -111
  204. package/src/elements/pane-group.tsx +0 -119
  205. package/src/elements/pane.tsx +0 -129
  206. package/src/elements/popover.tsx +0 -81
  207. package/src/elements/progress-bar.tsx +0 -39
  208. package/src/elements/prompt-dock.tsx +0 -82
  209. package/src/elements/prompt-input.tsx +0 -240
  210. package/src/elements/prompt-suggestions.tsx +0 -113
  211. package/src/elements/radio-group.tsx +0 -129
  212. package/src/elements/reasoning.tsx +0 -71
  213. package/src/elements/register-impl.ts +0 -148
  214. package/src/elements/register.ts +0 -76
  215. package/src/elements/remote.tsx +0 -225
  216. package/src/elements/resizable.globals.d.ts +0 -36
  217. package/src/elements/resizable.tsx +0 -704
  218. package/src/elements/response-stream.tsx +0 -40
  219. package/src/elements/screen.tsx +0 -90
  220. package/src/elements/scroll-area.tsx +0 -33
  221. package/src/elements/scroll-button.tsx +0 -179
  222. package/src/elements/search.tsx +0 -185
  223. package/src/elements/segmented.tsx +0 -129
  224. package/src/elements/select.tsx +0 -165
  225. package/src/elements/separator.tsx +0 -36
  226. package/src/elements/setting-item.tsx +0 -50
  227. package/src/elements/settings-group.tsx +0 -37
  228. package/src/elements/skeleton.tsx +0 -45
  229. package/src/elements/slider.tsx +0 -171
  230. package/src/elements/slot-text.ts +0 -73
  231. package/src/elements/slots.ts +0 -787
  232. package/src/elements/source.tsx +0 -126
  233. package/src/elements/status.tsx +0 -42
  234. package/src/elements/styles.css +0 -328
  235. package/src/elements/switch.tsx +0 -118
  236. package/src/elements/tabs.tsx +0 -95
  237. package/src/elements/tasks.tsx +0 -103
  238. package/src/elements/text-shimmer.tsx +0 -28
  239. package/src/elements/thinking-bar.tsx +0 -43
  240. package/src/elements/thread.tsx +0 -139
  241. package/src/elements/toast.tsx +0 -106
  242. package/src/elements/tool.tsx +0 -78
  243. package/src/elements/tooltip.tsx +0 -85
  244. package/src/elements/validate-messages.ts +0 -76
  245. package/src/elements/voice-input.tsx +0 -100
  246. package/src/elements/voice-output.tsx +0 -82
  247. package/src/index.ts +0 -430
  248. package/src/primitives/audio-bands.ts +0 -174
  249. package/src/primitives/card-component-types.ts +0 -63
  250. package/src/primitives/card-contract.ts +0 -80
  251. package/src/primitives/card-data-types.ts +0 -361
  252. package/src/primitives/card-host.tsx +0 -37
  253. package/src/primitives/card-recovery.ts +0 -160
  254. package/src/primitives/card-registry.tsx +0 -78
  255. package/src/primitives/card-resolution.ts +0 -36
  256. package/src/primitives/card-routing.ts +0 -85
  257. package/src/primitives/card-schemas/artifact.schema.json +0 -92
  258. package/src/primitives/card-schemas/card-envelope.schema.json +0 -14
  259. package/src/primitives/card-schemas/card-event.schema.json +0 -12
  260. package/src/primitives/card-schemas/choice.schema.json +0 -75
  261. package/src/primitives/card-schemas/confirm.schema.json +0 -65
  262. package/src/primitives/card-schemas/embed.schema.json +0 -63
  263. package/src/primitives/card-schemas/form.result.schema.json +0 -7
  264. package/src/primitives/card-schemas/form.schema.json +0 -53
  265. package/src/primitives/card-schemas/link.schema.json +0 -54
  266. package/src/primitives/card-schemas/tasks.result.schema.json +0 -16
  267. package/src/primitives/card-schemas/tasks.schema.json +0 -83
  268. package/src/primitives/card-tags.ts +0 -61
  269. package/src/primitives/card-validate-cards.ts +0 -255
  270. package/src/primitives/card-validate-schemas.ts +0 -58
  271. package/src/primitives/card-validate.ts +0 -131
  272. package/src/primitives/chat-config.tsx +0 -103
  273. package/src/primitives/composer-model.ts +0 -49
  274. package/src/primitives/composer-triggers.ts +0 -35
  275. package/src/primitives/controllable.ts +0 -21
  276. package/src/primitives/conversation-store.ts +0 -248
  277. package/src/primitives/create-kai-chat.ts +0 -66
  278. package/src/primitives/create-tween.ts +0 -266
  279. package/src/primitives/embed-providers.ts +0 -254
  280. package/src/primitives/field-mask.ts +0 -256
  281. package/src/primitives/field-semantics.ts +0 -115
  282. package/src/primitives/highlighter.ts +0 -157
  283. package/src/primitives/input-mask.ts +0 -853
  284. package/src/primitives/link-preview.ts +0 -87
  285. package/src/primitives/message-feedback.ts +0 -124
  286. package/src/primitives/pdf-preview.ts +0 -121
  287. package/src/primitives/toast-store.ts +0 -338
  288. package/src/primitives/url-scheme-policy.ts +0 -70
  289. package/src/primitives/use-audio-analysis.ts +0 -340
  290. package/src/primitives/use-auto-resize.ts +0 -31
  291. package/src/primitives/use-resize-observer.ts +0 -45
  292. package/src/primitives/use-sequencer.ts +0 -72
  293. package/src/primitives/use-speech-recognition.ts +0 -146
  294. package/src/primitives/use-stick-to-bottom.ts +0 -75
  295. package/src/primitives/use-text-stream.ts +0 -143
  296. package/src/primitives/use-voice-recorder.ts +0 -62
  297. package/src/primitives/visualizer-sequences.ts +0 -350
  298. package/src/remote/host-embed.ts +0 -345
  299. package/src/remote/index.ts +0 -2
  300. package/src/remote/origin.ts +0 -30
  301. package/src/remote/provider-runtime.ts +0 -262
  302. package/src/remote/provider.ts +0 -2
  303. package/src/remote/validate.ts +0 -22
  304. package/src/remote/version.ts +0 -12
  305. package/src/remote/wire.ts +0 -48
  306. package/src/schemas/from-tool-call.ts +0 -151
  307. package/src/schemas/index.ts +0 -341
  308. package/src/schemas/provider-subsets.ts +0 -538
  309. package/src/schemas/registry.ts +0 -355
  310. package/src/schemas/tool-defs.ts +0 -793
  311. package/src/solid.ts +0 -173
  312. package/src/state/index.ts +0 -44
  313. package/src/state/messages.ts +0 -53
  314. package/src/state/mock.ts +0 -297
  315. package/src/state/parts.ts +0 -295
  316. package/src/state/persistence.ts +0 -180
  317. package/src/state/stream.ts +0 -246
  318. package/src/state/suggestions.ts +0 -9
  319. package/src/state/threads.ts +0 -142
  320. package/src/test-utils/fake-clock.ts +0 -88
  321. package/src/types.ts +0 -95
  322. package/src/ui/action-icons.ts +0 -53
  323. package/src/ui/agent-card.tsx +0 -218
  324. package/src/ui/avatar.tsx +0 -23
  325. package/src/ui/badge.tsx +0 -21
  326. package/src/ui/button.tsx +0 -49
  327. package/src/ui/card.tsx +0 -245
  328. package/src/ui/checkbox-group.tsx +0 -153
  329. package/src/ui/checkbox.tsx +0 -63
  330. package/src/ui/collapsible.tsx +0 -163
  331. package/src/ui/command.tsx +0 -103
  332. package/src/ui/dialog.tsx +0 -223
  333. package/src/ui/dock.tsx +0 -630
  334. package/src/ui/dropdown.tsx +0 -636
  335. package/src/ui/editable-label.tsx +0 -112
  336. package/src/ui/hover-card.tsx +0 -345
  337. package/src/ui/icon.tsx +0 -167
  338. package/src/ui/input.tsx +0 -391
  339. package/src/ui/kbd.tsx +0 -118
  340. package/src/ui/nav.tsx +0 -282
  341. package/src/ui/notice.tsx +0 -84
  342. package/src/ui/overlay.tsx +0 -277
  343. package/src/ui/pane-grid.tsx +0 -117
  344. package/src/ui/pane-group.tsx +0 -291
  345. package/src/ui/pane.tsx +0 -193
  346. package/src/ui/popover.tsx +0 -106
  347. package/src/ui/progress-bar.tsx +0 -83
  348. package/src/ui/prompt-dock.tsx +0 -145
  349. package/src/ui/radio.tsx +0 -150
  350. package/src/ui/resizable.tsx +0 -693
  351. package/src/ui/scroll-area.tsx +0 -26
  352. package/src/ui/segmented.tsx +0 -109
  353. package/src/ui/select.tsx +0 -168
  354. package/src/ui/separator.tsx +0 -10
  355. package/src/ui/settings-group.tsx +0 -67
  356. package/src/ui/skeleton.tsx +0 -73
  357. package/src/ui/slider.tsx +0 -178
  358. package/src/ui/status.tsx +0 -48
  359. package/src/ui/switch.tsx +0 -119
  360. package/src/ui/tabs.tsx +0 -168
  361. package/src/ui/textarea.tsx +0 -21
  362. package/src/ui/tooltip.tsx +0 -118
  363. package/src/utils/cn.ts +0 -30
  364. package/src/wire/chunk.ts +0 -248
  365. package/src/wire/consume.ts +0 -599
  366. package/src/wire/diagnostics.ts +0 -727
  367. package/src/wire/encode-probe.ts +0 -214
  368. package/src/wire/encode.ts +0 -947
  369. package/src/wire/files.ts +0 -342
  370. package/src/wire/formats/anthropic.ts +0 -274
  371. package/src/wire/formats/openai.ts +0 -228
  372. package/src/wire/index.ts +0 -95
  373. package/src/wire/media-types.ts +0 -344
  374. package/src/wire/read.ts +0 -396
  375. package/src/wire/sink-helpers.ts +0 -50
  376. package/src/wire/sse.ts +0 -153
package/src/index.ts DELETED
@@ -1,430 +0,0 @@
1
- // The package root entry (".").
2
- //
3
- // SCOPE — read before adding an export here.
4
- // -----------------------------------------
5
- // Every consumer of `@kitn.ai/ui` pays for this barrel, INCLUDING React/Vue/
6
- // Svelte consumers who never render a Solid component. It is therefore frozen at
7
- // the surface that shipped: adding a Solid component here taxes four frameworks
8
- // to serve one. Closing the element coverage gaps on this file grew it
9
- // 591,359 -> 705,031 bytes (+19.2%), which is what motivated the split. (That
10
- // measurement was taken at the then-79 elements; the catalog grows, the bytes
11
- // quoted do not — they are a record of the split, not a current reading.)
12
- //
13
- // The COMPLETE SolidJS surface — a component for EVERY registered element plus a
14
- // `<Name>Props` type for every public component — lives on `@kitn.ai/ui/solid`
15
- // (src/solid.ts), which is its own build target so only Solid consumers pay for
16
- // it. `npm run verify:solid-coverage` prints the element count and proves that
17
- // surface n/n on every run, which is why no count is restated here. `./solid`
18
- // re-exports this file, so it is a strict superset: anything here is reachable
19
- // there too, and a Solid consumer only ever needs the one import.
20
- //
21
- // Rule of thumb: a NEW Solid component export belongs in src/solid.ts.
22
- // Type-only exports are free (fully erased by the build) and may live in either.
23
-
24
- // Shared types (folded in from @tab-zen/shared)
25
- export type { ModelOption, SearchFilters, ConversationScope, ConversationSummary, ConversationGroup, HomeConfig, HomeLinkEntry } from './types';
26
-
27
- // Utilities
28
- export { cn } from './utils/cn';
29
-
30
- // Layer 1: Headless Primitives
31
- export { createKaiChat } from './primitives/create-kai-chat';
32
- export type { CreateKaiChatOptions, KaiChatStore } from './primitives/create-kai-chat';
33
- export { useAutoResize } from './primitives/use-auto-resize';
34
- export { useStickToBottom } from './primitives/use-stick-to-bottom';
35
- export { useTextStream } from './primitives/use-text-stream';
36
- export type { UseTextStreamOptions, TextStreamSegment } from './primitives/use-text-stream';
37
- export { useVoiceRecorder } from './primitives/use-voice-recorder';
38
- export type { UseVoiceRecorderOptions } from './primitives/use-voice-recorder';
39
- export { ChatConfig, useChatConfig, proseClass, textClass } from './primitives/chat-config';
40
- export type { ChatConfigValue, ProseSize, ChatConfigProps } from './primitives/chat-config';
41
- export { configureCodeHighlighting, isCodeHighlightingEnabled } from './primitives/highlighter';
42
- export type { CodeHighlightingOptions } from './primitives/highlighter';
43
- export { configurePdfPreview, isPdfPreviewEnabled } from './primitives/pdf-preview';
44
- export type { PdfPreviewOptions } from './primitives/pdf-preview';
45
- export { localStorageStore, fetchStore, byRecency, LEGACY_THREAD_MIGRATED_TITLE } from './primitives/conversation-store';
46
- export type { ConversationStore } from './primitives/conversation-store';
47
-
48
- // Toasts: imperative `toast()` API + the reactive store behind <kai-toast-region>
49
- export { toast, configureToasts, ensureMounted as ensureToastRegion, getToasts } from './primitives/toast-store';
50
- export type {
51
- ToastItem, ToastVariant, ToastAction, ToastOptions, ToastHandle, ToastFn, ToastConfig,
52
- } from './primitives/toast-store';
53
- export { Toast, ToastRegion } from './components/toast';
54
- export type {
55
- ToastProps, ToastRegionProps, ToastDismissReason, ToastPosition,
56
- } from './components/toast';
57
-
58
- // Card Contract (generative-UI foundation)
59
- export { CARD_CONTRACT_VERSION } from './primitives/card-contract';
60
- export type {
61
- CardEnvelope, CardContext, CardEvent, CardEventKind, CardResolution, CardHost, CardPolicy,
62
- } from './primitives/card-contract';
63
- export { applyResolution, resolutionFromEvent } from './primitives/card-resolution';
64
- export { CardProvider, useCardHost } from './primitives/card-host';
65
- export type { CardProviderProps } from './primitives/card-host';
66
- export { CARD_EVENT_NAME, emitCardEvent, routeCardEvent, listenForCardEvents } from './primitives/card-routing';
67
- export { dismissRecovery, defaultIsReopenable } from './primitives/card-recovery';
68
- export type {
69
- RecoveryToast, ReopenEnv, DismissRecoveryOptions,
70
- } from './primitives/card-recovery';
71
- export { validateAgainstSchema } from './primitives/card-validate';
72
- export type { JsonSchema, ValidationResult } from './primitives/card-validate';
73
-
74
- // Remote host SDK (iframe transport — host side only; provider runtime ships via ./provider subpath)
75
- export { mountRemoteCard } from './remote/host-embed';
76
- export type { MountRemoteCardOptions, RemoteCardHandle } from './remote/host-embed';
77
-
78
- // Card dispatcher (generative-UI host glue)
79
- export { CardRenderer, renderCard } from './components/card-renderer';
80
- export type { CardRendererProps } from './components/card-renderer';
81
- export { CardFallback } from './components/card-fallback';
82
- export type { CardFallbackProps } from './components/card-fallback';
83
- export {
84
- BUILTIN_CARD_TAGS, BUILTIN_CARD_COMPONENTS, mergeCardTags, mergeCardComponents,
85
- } from './primitives/card-registry';
86
- export type { CardComponent, CardComponentMap, CardTagMap } from './primitives/card-registry';
87
-
88
- // Card: kai-card (base shell) + kai-form (JSON-Schema form renderer)
89
- export { Card } from './components/card';
90
- export type { CardProps } from './components/card';
91
- export { DismissedStub, stubIntent } from './components/dismissed-stub';
92
- export type { DismissedStubProps, DismissedCardType } from './components/dismissed-stub';
93
- export { Form, validateForm, buildResult, widgetFor, orderedKeys, coerceValue } from './components/form';
94
- export type {
95
- FormProps,
96
- FormField,
97
- FormDefinition,
98
- FormCardEnvelope,
99
- FormValidation,
100
- WidgetKind,
101
- } from './components/form';
102
-
103
- // Card: kai-confirm (approval) + kai-tasks (selectable plan)
104
- export {
105
- ConfirmCard,
106
- CONFIRM_CARD_TYPE,
107
- buttonVariantForStyle,
108
- normalizeActions,
109
- defaultActionId,
110
- } from './components/confirm-card';
111
- export type {
112
- ConfirmCardProps,
113
- ConfirmAction,
114
- ConfirmActionStyle,
115
- ConfirmTone,
116
- ConfirmCardData,
117
- ConfirmCardEnvelope,
118
- } from './components/confirm-card';
119
- export {
120
- TasksCard,
121
- TASKS_CARD_TYPE,
122
- normalizeTasks,
123
- initialSelected,
124
- selectedInOrder,
125
- toggleableIds,
126
- selectAllState,
127
- showSelectAll,
128
- canConfirm,
129
- isMaxReached,
130
- confirmReason,
131
- } from './components/tasks-card';
132
- export type {
133
- TasksCardProps,
134
- TasksTask,
135
- TasksCardData,
136
- TasksCardResult,
137
- TasksCardEnvelope,
138
- SelectAllState,
139
- } from './components/tasks-card';
140
-
141
- // Card: kai-choice (single-select option card)
142
- export {
143
- ChoiceCard,
144
- CHOICE_CARD_TYPE,
145
- OTHER_ACTION,
146
- normalizeOptions,
147
- resolveOtherConfig,
148
- nextEnabledIndex,
149
- firstEnabledIndex,
150
- } from './components/choice-card';
151
- export type {
152
- ChoiceCardProps,
153
- ChoiceOption,
154
- ChoiceOptionMedia,
155
- ChoiceAllowOther,
156
- ChoiceCardData,
157
- ChoiceCardEnvelope,
158
- } from './components/choice-card';
159
-
160
- // Card: kai-link-preview (OG/link preview) + kai-embed (lazy media embed)
161
- export { LinkPreview } from './components/link-preview';
162
- export type { LinkPreviewProps } from './components/link-preview';
163
- export { Embed } from './components/embed';
164
- export type { EmbedProps } from './components/embed';
165
- export {
166
- configureLinkPreview,
167
- resolveLinkMetadata,
168
- hasLinkPreviewFetcher,
169
- LINK_PREVIEW_TYPE,
170
- } from './primitives/link-preview';
171
- export type { LinkPreviewData, LinkPreviewEnvelope, LinkMetadataFetcher } from './primitives/link-preview';
172
- export {
173
- resolveEmbed,
174
- parseYouTubeId,
175
- parseVimeoId,
176
- configureEmbedAllowlist,
177
- isGenericOriginAllowed,
178
- EMBED_CARD_TYPE,
179
- } from './primitives/embed-providers';
180
- export type { EmbedCardData, EmbedCardEnvelope, EmbedProvider, ResolvedEmbed } from './primitives/embed-providers';
181
-
182
- // Layer 2: UI Primitives
183
- export { Button, buttonVariants } from './ui/button';
184
- export type { ButtonProps } from './ui/button';
185
- export { Avatar } from './ui/avatar';
186
- export type { AvatarProps } from './ui/avatar';
187
- export { Tooltip } from './ui/tooltip';
188
- export type { TooltipProps, TooltipController } from './ui/tooltip';
189
- export { HoverCard } from './ui/hover-card';
190
- export type { HoverCardProps, HoverCardController } from './ui/hover-card';
191
- export { Collapsible, CollapsibleTrigger, CollapsibleContent } from './ui/collapsible';
192
- export type {
193
- CollapsibleProps, CollapsibleTriggerProps, CollapsibleContentProps, CollapsibleController,
194
- } from './ui/collapsible';
195
- export { ScrollArea } from './ui/scroll-area';
196
- export type { ScrollAreaProps, ScrollOrientation } from './ui/scroll-area';
197
- export { Dropdown, DropdownTrigger, DropdownContent, DropdownItem } from './ui/dropdown';
198
- export type {
199
- DropdownProps, DropdownTriggerProps, DropdownContentProps, DropdownItemProps, DropdownController,
200
- } from './ui/dropdown';
201
- export { Textarea } from './ui/textarea';
202
- export type { TextareaProps } from './ui/textarea';
203
- export { Badge } from './ui/badge';
204
- export type { BadgeProps } from './ui/badge';
205
- export { Separator } from './ui/separator';
206
- export type { SeparatorProps } from './ui/separator';
207
- export { ResizablePanelGroup, ResizablePanel, ResizableHandle, Resizable, normalizeSize, resolveToPx } from './ui/resizable';
208
- export type { ResizablePanelGroupProps, ResizablePanelProps, ResizableHandleProps, ResizableProps, SizeValue } from './ui/resizable';
209
- export { Skeleton } from './ui/skeleton';
210
- export type { SkeletonProps, SkeletonVariant } from './ui/skeleton';
211
- export { FileTree, buildFileTree } from './components/file-tree';
212
- export type {
213
- FileTreeProps, FileTreeFile, FileTreeNode, FileTreeFolderNode, FileTreeFileNode,
214
- } from './components/file-tree';
215
- export { Artifact } from './components/artifact';
216
- export type { ArtifactProps, ArtifactFile, ArtifactTab } from './components/artifact';
217
- export { ArtifactCard, DEFAULT_ARTIFACT_CARD_HEIGHT } from './components/artifact-card';
218
- // `ArtifactCardFile` is the SAME declaration `FileTreeFile` and `ArtifactFile`
219
- // alias, authored in primitives/card-data-types.ts because `ArtifactCardData.files`
220
- // reaches it and that module has to stay resolvable from a Node/no-DOM project.
221
- // It is exported here under its authored name because that is the name the
222
- // generated element metadata records for `kai-artifact.files` / `kai-file-tree.files`,
223
- // and tests/elements/prop-types-exported.ts requires every named prop type to be
224
- // importable from this entry. The two aliases stay exported above, unchanged.
225
- export type {
226
- ArtifactCardProps,
227
- ArtifactCardData,
228
- ArtifactCardEnvelope,
229
- ArtifactCardFile,
230
- ArtifactCardTab,
231
- } from './components/artifact-card';
232
-
233
- // Layer 3: AI/Feature Components
234
- export {
235
- ChatContainer, ChatContainerRoot, ChatContainerContent, ChatContainerScrollAnchor,
236
- useChatContainer,
237
- } from './components/chat-container';
238
- export type {
239
- ChatContainerProps, ChatContainerRootProps, ChatContainerContentProps, ChatContainerScrollAnchorProps,
240
- } from './components/chat-container';
241
- export { Message, MessageAvatar, MessageContent, MessageActions, MessageAction, MessageCopyButton, MessageBody } from './components/message';
242
- export type {
243
- MessageProps, MessageAvatarProps, MessageContentProps, MessageActionsProps,
244
- MessageActionProps, MessageCopyButtonProps, MessageBodyProps,
245
- } from './components/message';
246
- export { ResponseCompare, useResolved } from './components/response-compare';
247
- export type { ResponseCompareProps, CompareLayout, ResolvedController } from './components/response-compare';
248
- export {
249
- normalizeCandidates,
250
- buildSelection,
251
- isAnyStreaming,
252
- } from './components/response-compare';
253
- export type {
254
- CompareCandidate,
255
- ComparePair,
256
- CompareCollapse,
257
- ResponseCompareData,
258
- CompareSelection,
259
- } from './components/response-compare';
260
- export { MessageSkills } from './components/message-skills';
261
- export type { MessageSkillsProps, Skill as MessageSkill } from './components/message-skills';
262
- export {
263
- PromptInput, PromptInputTextarea, PromptInputActions, PromptInputAction,
264
- usePromptInput,
265
- } from './components/prompt-input';
266
- export type {
267
- PromptInputProps, PromptInputTextareaProps, PromptInputActionsProps, PromptInputActionProps,
268
- } from './components/prompt-input';
269
- export { ResponseStream } from './components/response-stream';
270
- export type { ResponseStreamProps } from './components/response-stream';
271
- export { Markdown } from './components/markdown';
272
- export type { MarkdownProps } from './components/markdown';
273
- export { CodeBlock, CodeBlockCode, CodeBlockGroup } from './components/code-block';
274
- export type { CodeBlockProps, CodeBlockCodeProps, CodeBlockGroupProps } from './components/code-block';
275
- export { Loader } from './components/loader';
276
- export type { LoaderVariant, LoaderSize, LoaderProps } from './components/loader';
277
- export {
278
- CircularLoader, ClassicLoader, PulseLoader, PulseDotLoader,
279
- DotsLoader, TypingLoader, WaveLoader, BarsLoader,
280
- TerminalLoader, TextBlinkLoader, TextShimmerLoader, TextDotsLoader,
281
- } from './components/loader';
282
- export type {
283
- LoaderShapeProps, LoaderTextProps,
284
- CircularLoaderProps, ClassicLoaderProps, PulseLoaderProps, PulseDotLoaderProps,
285
- DotsLoaderProps, TypingLoaderProps, WaveLoaderProps, BarsLoaderProps,
286
- TerminalLoaderProps, TextBlinkLoaderProps, TextShimmerLoaderProps, TextDotsLoaderProps,
287
- } from './components/loader';
288
- export { FeedbackBar, type FeedbackValue, type FeedbackDetail, type FeedbackBarProps } from './components/feedback-bar';
289
- export {
290
- ChainOfThought, ChainOfThoughtStep, ChainOfThoughtTrigger,
291
- ChainOfThoughtContent, ChainOfThoughtItem,
292
- } from './components/chain-of-thought';
293
- export type {
294
- ChainOfThoughtProps, ChainOfThoughtStepProps, ChainOfThoughtTriggerProps,
295
- ChainOfThoughtContentProps, ChainOfThoughtItemProps,
296
- ChainOfThoughtType, ChainOfThoughtStepData, ChainOfThoughtController,
297
- } from './components/chain-of-thought';
298
- export { Source, SourceTrigger, SourceContent, SourceList } from './components/source';
299
- export type { SourceProps, SourceTriggerProps, SourceContentProps, SourceListProps } from './components/source';
300
- export { PromptSuggestion } from './components/prompt-suggestion';
301
- export type { PromptSuggestionProps } from './components/prompt-suggestion';
302
- export {
303
- Empty, EmptyHeader, EmptyMedia, EmptyTitle, EmptyDescription, EmptyContent, emptyMediaVariants,
304
- } from './components/empty';
305
- export type {
306
- EmptyProps, EmptyHeaderProps, EmptyMediaProps, EmptyTitleProps, EmptyDescriptionProps, EmptyContentProps,
307
- } from './components/empty';
308
- export { ScrollButton } from './components/scroll-button';
309
- export type { ScrollButtonProps } from './components/scroll-button';
310
- export { TextShimmer } from './components/text-shimmer';
311
- export type { TextShimmerProps } from './components/text-shimmer';
312
- export { Checkpoint, CheckpointIcon, CheckpointTrigger } from './components/checkpoint';
313
- export type { CheckpointProps, CheckpointIconProps, CheckpointTriggerProps } from './components/checkpoint';
314
- export {
315
- Context,
316
- ContextTrigger,
317
- ContextContent,
318
- ContextContentHeader,
319
- ContextContentBody,
320
- ContextContentFooter,
321
- ContextInputUsage,
322
- ContextOutputUsage,
323
- ContextReasoningUsage,
324
- ContextCacheUsage,
325
- } from './components/context';
326
- export type {
327
- ContextProps,
328
- ContextTriggerProps,
329
- ContextContentProps,
330
- ContextContentHeaderProps,
331
- ContextContentBodyProps,
332
- ContextContentFooterProps,
333
- ContextUsageRowProps,
334
- ContextInputUsageProps,
335
- ContextOutputUsageProps,
336
- ContextReasoningUsageProps,
337
- ContextCacheUsageProps,
338
- } from './components/context';
339
- export { VoiceInput } from './components/voice-input';
340
- export type { VoiceInputProps, VoiceInputController } from './components/voice-input';
341
- export { ConversationList } from './components/conversation-list';
342
- export type { ConversationListProps, ConversationListController } from './components/conversation-list';
343
- export { ConversationItem } from './components/conversation-item';
344
- export { SlottedConversationItem } from './components/conversation-item';
345
- export type { SlottedConversationItemProps } from './components/conversation-item';
346
- export type { ConversationItemProps } from './components/conversation-item';
347
- export { ModelSwitcher } from './components/model-switcher';
348
- export type { ModelSwitcherProps } from './components/model-switcher';
349
- export { ChatScopePicker } from './components/chat-scope-picker';
350
- export type { ChatScopePickerProps } from './components/chat-scope-picker';
351
- export { Tool } from './components/tool';
352
- export type { ToolPart, ToolProps } from './components/tool';
353
- // ToolPart.kind's doc comment says "Derive with `classifyTool(type)`", so the
354
- // function has to be reachable from every entry that surfaces ToolPart. It is
355
- // total, deterministic and terminates in 'generic', so it is safe public API and
356
- // genuinely useful to anyone rendering tool calls themselves.
357
- export { classifyTool } from './components/tool-classify';
358
- export type { ToolKind } from './components/tool-classify';
359
- export { ThinkingBar } from './components/thinking-bar';
360
- export type { ThinkingBarProps } from './components/thinking-bar';
361
- export { Reasoning, ReasoningTrigger, ReasoningContent } from './components/reasoning';
362
- export type { ReasoningProps, ReasoningTriggerProps, ReasoningContentProps } from './components/reasoning';
363
- export { Image } from './components/image';
364
- export type { ImageProps, GeneratedImageLike } from './components/image';
365
- export { FileUpload, FileUploadTrigger, FileUploadContent } from './components/file-upload';
366
- export type { FileUploadProps, FileUploadTriggerProps, FileUploadContentProps } from './components/file-upload';
367
- export {
368
- Attachments, Attachment, AttachmentPreview, AttachmentInfo, AttachmentRemove,
369
- AttachmentHoverCard, AttachmentHoverCardTrigger, AttachmentHoverCardContent,
370
- AttachmentEmpty, getMediaCategory, getAttachmentLabel,
371
- useAttachmentsContext, useAttachmentContext,
372
- } from './components/attachments';
373
- export type {
374
- AttachmentData, AttachmentMediaCategory, AttachmentVariant,
375
- AttachmentsProps, AttachmentProps, AttachmentPreviewProps,
376
- AttachmentInfoProps, AttachmentRemoveProps, AttachmentEmptyProps,
377
- AttachmentHoverCardProps, AttachmentHoverCardTriggerProps, AttachmentHoverCardContentProps,
378
- } from './components/attachments';
379
-
380
- // Chat message types — public API for consumers who need to type their own message arrays.
381
- // NOTE: chat-types.ts also exports an unrelated `Source` interface (a citation), and
382
- // `Source` is already a public component export (./components/source, a citation
383
- // chip/trigger), so re-exporting both under that name is a duplicate-identifier error.
384
- // The citation type therefore ships under its alias `MessageSource`, which is also the
385
- // argument type of the public `AssistantStream.addSource(source)`.
386
- export type {
387
- ChatMessage, ChatMessageAction, CustomAction, AvatarData, FeedbackVote, MessagePart,
388
- MessageSource, RawOrigin,
389
- } from './elements/chat-types';
390
-
391
- // Composer document model. This belongs on "." rather than "./solid" because it
392
- // is part of the ELEMENT contract, not the Solid-only surface: `ComposerDoc` is
393
- // the non-string half of `kai-prompt-input` / `kai-composer` / `kai-default-input`'s
394
- // `value` property, and `doc` + `entities` on their `kai-submit` /
395
- // `kai-value-change` details. The shipped prop docs name `ComposerDoc` by name,
396
- // so a React or Vue consumer reading them has to be able to import it. Type-only,
397
- // so it is erased by the build and costs the root barrel nothing.
398
- export type { ComposerDoc, Segment, EntityRef } from './primitives/composer-model';
399
-
400
- // ---------------------------------------------------------------------------
401
- // Named types for the remaining kai-* array/object PROPERTIES.
402
- //
403
- // Same rationale as `ComposerDoc` above, applied to the whole class instead of
404
- // one instance: the generated `./elements` declarations and React wrappers expand
405
- // every prop type structurally (deliberately — see the `IMPORTS = {}` note in
406
- // scripts/gen-element-api.mjs), so a consumer who wants to NAME the shape had to
407
- // write `NonNullable<KaiPromptInputElementProps['triggers']>`. Every element-prop
408
- // type that has a name in source is now reachable from "." — the entry a React /
409
- // Vue / Svelte / vanilla consumer imports — not only from "./solid".
410
- //
411
- // Type-only, so the root barrel pays nothing at runtime.
412
- // Guarded by tests/elements/prop-types-exported.test.ts, which re-derives the
413
- // list from the facades with the TS checker and fails on a new unexported one.
414
- // ---------------------------------------------------------------------------
415
- export type { TriggerDef, TriggerItem } from './components/composer';
416
- export type { ChatThreadContextUsage } from './components/chat-thread';
417
- export type { Skill } from './components/message-skills';
418
- export type { AgentStatus } from './ui/agent-card';
419
- export type { KaiNavItem } from './ui/nav';
420
- export type { KaiTabItem } from './ui/tabs';
421
- export type { PaneStatus } from './ui/pane';
422
- export type { PaneTab } from './ui/pane-group';
423
- export type {
424
- KaiCheckboxOption, KaiCommandItem, KaiContextUsage, KaiMenuItem, KaiRadioOption, KaiSegmentedOption, KaiSelectOption,
425
- KaiSourceItem,
426
- } from './elements/element-data-types';
427
- // `kai-audio-visualizer.shader` takes a ShaderSpec. The element arrived from main
428
- // after this block was written, and prop-types-exported.test.ts caught it, which
429
- // is the point of deriving that list from the facades rather than maintaining it.
430
- export type { ShaderSpec } from './components/audio-visualizer';
@@ -1,174 +0,0 @@
1
- /**
2
- * Pure reductions from AnalyserNode output to the numbers a visualizer draws.
3
- *
4
- * Ported from livekit/components-js `packages/react/src/hooks/useTrackVolume.ts`
5
- * (Apache License 2.0). Both the dB normalization curve AND the band split
6
- * are carried over so our output matches theirs frame for frame: the split
7
- * is upstream's linear-proportional chunking (their PR #1265). An interim
8
- * revision here spaced the buckets geometrically to serve a wide raw-mic
9
- * window; both reverted together -- see `reduceToBands` below and the
10
- * DEFAULTS docstring in use-audio-analysis.ts for the full story.
11
- */
12
-
13
- /** dB floor of the normalization curve. Below this reads as silence. */
14
- const MIN_DB = -100;
15
- /** dB ceiling. Above this saturates. */
16
- const MAX_DB = -10;
17
-
18
- /**
19
- * Map one `getFloatFrequencyData` decibel value to 0..1.
20
- *
21
- * The `sqrt` at the end is a perceptual curve, not a normalization step: it
22
- * lifts quiet detail so low-level audio still moves the bars visibly.
23
- */
24
- export function normalizeDb(value: number): number {
25
- if (value === -Infinity) return 0;
26
- const clamped = Math.max(MIN_DB, Math.min(MAX_DB, value));
27
- return Math.sqrt(1 - (clamped * -1) / 100);
28
- }
29
-
30
- /**
31
- * Average a slice of the frequency spectrum into `bands` buckets.
32
- *
33
- * `loPass` / `hiPass` are BIN INDICES relative to `fftSize`, not frequencies.
34
- * Upstream's naming is misleading; the behavior is a plain array slice.
35
- *
36
- * Bucket edges are LINEAR-PROPORTIONAL across `[loPass, hiPass]` -- upstream
37
- * LiveKit's own distribution (`useMultibandTrackVolume`, useTrackVolume.ts
38
- * lines 141-153, rewritten to proportional chunking by their PR #1265): each
39
- * band averages an equal consecutive run of bins, `floor(i * total / bands)`
40
- * to `floor((i + 1) * total / bands)`, and a run that comes out empty reads
41
- * 0 (their `chunkLength === 0` branch). With the default window's 100 bins
42
- * and 5 bands, that is 20 bins averaged per band -- the averaging itself is
43
- * part of upstream's idle stillness, diluting any single flickering bin
44
- * 20:1 (noise-floor diagnosis, table B).
45
- *
46
- * An interim revision spaced these buckets geometrically so that a wide
47
- * raw-microphone window (bins 4-120) kept its upper buckets alive. That
48
- * concentrated the noisiest few low bins into band 0 undiluted, which the
49
- * centre-out mirror below then promoted to the CENTRE element -- the
50
- * measured core of the "white noise when the mic is on" defect (diagnosis
51
- * table B: geometric band 0 idled at 0.52 on real room tone where this
52
- * split reads 0.32 over the same wide window, and exactly 0 over the
53
- * default one). Reverted to upstream's split when the default window
54
- * reverted; the mirror stays, it is orthogonal.
55
- */
56
- export function reduceToBands(
57
- freq: Float32Array,
58
- bands: number,
59
- loPass: number,
60
- hiPass: number,
61
- ): number[] {
62
- // `slice` clamps both ends into the buffer and yields an empty window when
63
- // hiPass <= loPass -- every bucket then reads 0 below, no special case.
64
- const window = freq.slice(Math.max(0, loPass), Math.max(0, hiPass));
65
- const total = window.length;
66
- const out: number[] = [];
67
-
68
- for (let i = 0; i < bands; i++) {
69
- const start = Math.floor((i * total) / bands);
70
- const end = Math.floor(((i + 1) * total) / bands);
71
- if (end <= start) {
72
- out.push(0);
73
- continue;
74
- }
75
- let sum = 0;
76
- for (let j = start; j < end; j++) sum += normalizeDb(window[j] as number);
77
- out.push(sum / (end - start));
78
- }
79
-
80
- return out;
81
- }
82
-
83
- /** Root-mean-square of `getByteFrequencyData`, scaled to 0..1. */
84
- export function reduceToVolume(bytes: Uint8Array): number {
85
- if (bytes.length === 0) return 0;
86
- let sum = 0;
87
- for (let i = 0; i < bytes.length; i++) {
88
- const a = bytes[i] as number;
89
- sum += a * a;
90
- }
91
- return Math.sqrt(sum / bytes.length) / 255;
92
- }
93
-
94
- /**
95
- * Resize a caller-supplied band array to exactly `count` entries. Extra values
96
- * are dropped; a short array repeats its last value (0 when empty) so a
97
- * consumer passing the wrong length gets a sane picture instead of holes.
98
- */
99
- export function normalizeVolumeBands(bands: number[], count: number): number[] {
100
- if (bands.length === count) return bands;
101
- if (bands.length > count) return bands.slice(0, count);
102
- const last = bands[bands.length - 1] ?? 0;
103
- return [...bands, ...new Array(count - bands.length).fill(last)];
104
- }
105
-
106
- /**
107
- * Maps a smaller, ordered set of "half" band values (index 0 = loudest,
108
- * typically lowest frequency) onto `count` positions laid out in a straight
109
- * line -- a row of bars, or a row of grid columns -- centre-outward and
110
- * mirrored: band 0 lands on the centre (an odd `count`) or the centre PAIR
111
- * (an even one, both positions sharing band 0), band 1 on the pair either
112
- * side of that, and so on outward to the two ends.
113
- *
114
- * Every scripted state in this component is already centre-oriented
115
- * (`listening` blinks the centre bar, `connecting` sweeps inward from both
116
- * ends, `thinking` sweeps the middle row) -- `speaking` ramping left to
117
- * right, because it fed the analyser's raw band order straight across, was
118
- * the one state inconsistent with that. This closes that gap.
119
- *
120
- * `halfBands` should have exactly `Math.ceil(count / 2)` entries -- the
121
- * caller is responsible for requesting that many bands from
122
- * `useAudioAnalysis`, matching counts exactly rather than leaning on
123
- * `normalizeVolumeBands`'s pad-by-repeating-the-last-value, which would
124
- * produce a subtly wrong (not obviously broken) shape here. A shorter
125
- * `halfBands` still degrades sanely: the outermost positions repeat the last
126
- * value available rather than reading `undefined`.
127
- */
128
- export function mirrorBandsCenterOut(halfBands: number[], count: number): number[] {
129
- const center = (count - 1) / 2;
130
- const out: number[] = new Array(count);
131
- for (let i = 0; i < count; i++) {
132
- const ring = Math.floor(Math.abs(i - center));
133
- out[i] = halfBands[Math.min(ring, halfBands.length - 1)] ?? 0;
134
- }
135
- return out;
136
- }
137
-
138
- /**
139
- * Maps a smaller, ordered set of "half" band values onto `count` positions
140
- * arranged around a RING (radial's spokes), mirrored left-right across a
141
- * single vertical axis rather than fanned from a linear centre: index 0 and
142
- * index `count / 2` (for an even `count`; radial warns when `count` is not
143
- * divisible by 4, so this is the common case) are each their own fixed
144
- * point of the reflection and both land band 0, and every other index pairs
145
- * with its mirror partner at `count - i`, sharing a band.
146
- *
147
- * Radial's own geometry (`variant-radial.tsx`) places index 0 at the
148
- * BOTTOM of the ring (`rotate(0) translateY(radius)`, and CSS rotation is
149
- * clockwise for a positive angle), so band 0 (usually the loudest) reads at
150
- * the bottom, fading toward the top -- not band 0 at both the top AND the
151
- * bottom, which would need a second, horizontal mirror axis on top of this
152
- * one. Chosen over that fuller symmetry because it reuses the exact same
153
- * `Math.ceil(count / 2)` band request as the linear mirror above (one rule
154
- * for every variant, not a radial-specific band count), and because the
155
- * task's request was "spikes vary in length, not moving as one" -- this
156
- * already delivers that. If bottom-loud/top-quiet reads wrong in practice,
157
- * swapping to true 4-fold symmetry is a self-contained change here, not
158
- * elsewhere.
159
- *
160
- * For an even `count`, the antipodal index (`count / 2`) needs one more
161
- * distinct band than the linear mirror does (rings run 0..`count / 2`, not
162
- * 0..`count / 2 - 1`) -- with only `Math.ceil(count / 2)` bands available,
163
- * that one index clamps to the same value as its nearest neighbour rather
164
- * than getting a unique band. A minor, deliberate simplification for the
165
- * same one-rule-for-every-variant reason above.
166
- */
167
- export function mirrorBandsAroundRing(halfBands: number[], count: number): number[] {
168
- const out: number[] = new Array(count);
169
- for (let i = 0; i < count; i++) {
170
- const ring = Math.min(i, count - i);
171
- out[i] = halfBands[Math.min(ring, halfBands.length - 1)] ?? 0;
172
- }
173
- return out;
174
- }
@@ -1,63 +0,0 @@
1
- // src/primitives/card-component-types.ts
2
- // `CardEnvelope.type` -> the Solid component that renders it, as a TYPE.
3
- //
4
- // TYPES ONLY, AND THAT IS THE WHOLE FILE. `BUILTIN_CARD_COMPONENTS` and
5
- // `mergeCardComponents` stay in card-registry.tsx and cannot follow them here: they
6
- // ARE JSX. So this is not the same split card-tags.ts made — that one moved data and
7
- // its type; this one moves only the type, because the value half has nowhere else to
8
- // go. Do not try to "finish" the symmetry by dragging the component map over.
9
- //
10
- // WHY THE TYPES ARE ALONE IN A `.ts`
11
- // ----------------------------------
12
- // The same reason, one layer along, that card-tags.ts exists — read that file's header
13
- // first; this is the second instance of its problem, not a new one.
14
- //
15
- // `@kitn.ai/ui/schemas` is the server-safe entry, and src/schemas/registry.ts declares
16
- // `CustomCardSpec.component` and `CardRegistry.components` in terms of
17
- // `CardComponentMap`. That is a TYPE import and erases at runtime, but a type import
18
- // still has to RESOLVE, and while these two types lived in card-registry.tsx it
19
- // resolved to a `.tsx`. tsconfig.mcp.json has no `jsx` on purpose, so the `kai` MCP's
20
- // typecheck pass reported, on any tree that had not been built:
21
- //
22
- // src/schemas/registry.ts(61,51): error TS6142: Module '../primitives/card-registry'
23
- // was resolved to '.../card-registry.tsx', but '--jsx' is not set.
24
- //
25
- // Exactly one error, and the last one standing on an unbuilt tree. Moving the two type
26
- // aliases into this file takes that pass to 0. Measured on this tree, both directions.
27
- //
28
- // Relaxing tsconfig.mcp.json instead is not an option, and that is measured too, not
29
- // recalled: giving that project `jsx: "preserve"` + `jsxImportSource: "solid-js"` —
30
- // the settings the main tsconfig.json actually uses — takes it from 1 error to 130,
31
- // almost all `TS2304: Cannot find name 'HTMLDivElement' / 'window'`, because a `jsx`
32
- // setting drags the whole Solid component tree into a Node-only, `lib: ["ESNext"]`
33
- // pass. (`jsx: "preserve"` with no import source is worse still: 838.) card-tags.ts
34
- // records 1364 for the broader case. The figures differ because the reachable set
35
- // differs; the conclusion does not. The Node/no-DOM boundary is load-bearing.
36
- //
37
- // `import type { Component } from 'solid-js'` below does NOT reintroduce the problem
38
- // it just solved. Type-importing from solid-js resolves to a `.d.ts`, and a
39
- // declaration file needs no `jsx` to be read; `skipLibCheck` covers what is inside it.
40
- // It is resolving a `.tsx` SOURCE file that TS6142 objects to, and this file resolves
41
- // none.
42
- //
43
- // WHAT THIS SPLIT DOES NOT DO
44
- // ---------------------------
45
- // It changes nothing at runtime, and must not be sold as if it did. This module is
46
- // types only, so it compiles to nothing and there is no emitted module to compare:
47
- // `verify:ssr` and `verify:schemas` read the BUILT entry and cannot tell the two
48
- // arrangements apart even in principle. card-tags.ts records the same finding for its
49
- // own case from the harder direction, where there WAS a bundle to diff and it came out
50
- // byte-identical. The boundary this file defends is a compile-time one. The
51
- // discriminating check is `tsc --noEmit -p tsconfig.mcp.json` on an UNBUILT tree, and
52
- // nothing else is evidence for it.
53
-
54
- import type { Component } from 'solid-js';
55
- import type { CardEnvelope, CardHost } from './card-contract';
56
-
57
- /** Solid renderer for one envelope. `host` is the resolved CardHost so each wrapper
58
- * can bridge its card's emit convention (form/confirm/tasks take `host`;
59
- * link/embed take `onEmit`). */
60
- export type CardComponent = Component<{ envelope: CardEnvelope; host?: CardHost }>;
61
-
62
- /** Solid layer: envelope type → the component that draws it. */
63
- export type CardComponentMap = Record<string, CardComponent>;