@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
@@ -1,85 +0,0 @@
1
- import { type Placement } from '@floating-ui/dom';
2
- import { Tooltip, type TooltipController } from '../ui/tooltip';
3
- import { defineWebComponent } from './define';
4
- import { wireDisclosure } from './disclosure';
5
-
6
- interface Props extends Record<string, unknown> {
7
- /** The hint text shown on hover/focus of the slotted trigger. */
8
- content?: string;
9
- /** Delay (ms) before the tooltip appears on hover. Defaults to 600. Focus
10
- * shows it immediately regardless. */
11
- openDelay?: number;
12
- /** Delay (ms) before it hides after the pointer leaves. Defaults to 0 (hides
13
- * immediately). */
14
- closeDelay?: number;
15
- /** Preferred placement: `'top' | 'bottom' | 'left' | 'right'` (+ optional
16
- * `-start`/`-end`). Defaults to `'top'`; flips to stay in view. */
17
- placement?: string;
18
- /** Drive/observe open state (Shoelace-style: settable + reflected to the `open`
19
- * attribute, the element still self-manages on hover/focus). Set `el.open = true`,
20
- * or `<kai-tooltip open>`; listen for `kai-open-change`. */
21
- open?: boolean;
22
- /** Initial open state on mount (uncontrolled seed). */
23
- defaultOpen?: boolean;
24
- /** Turn the tooltip off while keeping the trigger mounted (hover/focus and
25
- * `show()` no longer open it). */
26
- disabled?: boolean;
27
- }
28
-
29
- /** Events fired by `<kai-tooltip>`. */
30
- interface Events {
31
- /** The tooltip opened or closed (by hover/focus, outside-click, or a method). */
32
- 'kai-open-change': { open: boolean };
33
- }
34
-
35
- /**
36
- * `<kai-tooltip>` — wraps a trigger and shows a hint on hover/focus. Put the
37
- * trigger as light-DOM content; set the text via `content`. Positions itself and
38
- * dismisses on Escape/outside-click; the content is portaled inside the shadow
39
- * root so it isn't clipped.
40
- *
41
- * ```html
42
- * <kai-tooltip content="Voice input">
43
- * <kai-button variant="subtle" size="icon" icon="mic" label="Voice input"></kai-button>
44
- * </kai-tooltip>
45
- * ```
46
- */
47
- defineWebComponent<Props, Events>('kai-tooltip', {
48
- content: '',
49
- openDelay: undefined,
50
- closeDelay: undefined,
51
- placement: undefined,
52
- open: undefined,
53
- defaultOpen: undefined,
54
- disabled: undefined,
55
- }, (props, ctx) => {
56
- const { flag } = ctx;
57
- let api: TooltipController | undefined;
58
-
59
- // The standard overlay surface: settable+reflecting `open`, kai-open-change,
60
- // show/hide/toggle, disabled-gating. See ./disclosure.
61
- wireDisclosure(ctx, () => api, () => props.open);
62
-
63
- return (
64
- <>
65
- {/* The shared element base sets `:host{display:block}` (styles.css). A block
66
- host wraps the inline-flex trigger in a line box, so the font-descender
67
- strut makes the host taller than the control and pins the control to the
68
- top, so it reads off-center beside non-tooltipped siblings in a
69
- flex-items-center row. inline-flex (like kai-button) drops the line box so
70
- the host hugs the trigger and their centers line up. */}
71
- <style>{':host{display:inline-flex}'}</style>
72
- <Tooltip
73
- content={props.content ?? ''}
74
- openDelay={props.openDelay != null ? Number(props.openDelay) : undefined}
75
- closeDelay={props.closeDelay != null ? Number(props.closeDelay) : undefined}
76
- placement={(props.placement as Placement | undefined) ?? undefined}
77
- defaultOpen={flag('defaultOpen')}
78
- disabled={flag('disabled')}
79
- controllerRef={(a) => (api = a)}
80
- >
81
- <slot />
82
- </Tooltip>
83
- </>
84
- );
85
- });
@@ -1,76 +0,0 @@
1
- import type { ChatMessage } from './chat-types';
2
-
3
- /**
4
- * Boundary validation for the untyped `message` / `messages` properties.
5
- *
6
- * A web component's properties are an untyped boundary: nothing stops a consumer
7
- * from assigning the pre-0.20.0 `{ id, role, content }` shape, and TypeScript is
8
- * not there at runtime to catch it. `parts` is REQUIRED internally, so a message
9
- * without one throws inside a Solid render pass (`groupMessageParts` iterating
10
- * `undefined`), and an uncaught exception there blanks the WHOLE element, not
11
- * just the offending message. Validating here turns that into a skipped message
12
- * plus one clear console error naming the element and the expected shape.
13
- */
14
-
15
- /** True when `m` carries the required `parts` array. */
16
- export function hasParts(m: unknown): m is ChatMessage {
17
- return !!m && typeof m === 'object' && Array.isArray((m as { parts?: unknown }).parts);
18
- }
19
-
20
- /** Shared tail of every diagnostic, so all facades say the same thing. */
21
- const EXPECTED =
22
- "each entry needs a 'parts' array (e.g. parts: [{ type: 'text', text: 'Hi' }]). " +
23
- "The 'content' string field was removed in 0.20.0.";
24
-
25
- const EMPTY: ChatMessage[] = [];
26
-
27
- /**
28
- * Creates a per-element-instance validator for a `messages` array. Returns the
29
- * INPUT array unchanged when every entry is valid (no allocation, so streaming
30
- * identity checks upstream still hold), a filtered copy when some are not, and
31
- * `[]` when the property itself is not an array.
32
- *
33
- * Logs at most one `console.error` per validation pass, and never re-logs for a
34
- * message object it has already reported, so an unrelated re-render during
35
- * streaming does not spam the console.
36
- */
37
- export function createMessagesGuard(tag: string): (messages: unknown) => ChatMessage[] {
38
- const warned = new WeakSet<object>();
39
- // WeakSet only holds objects, so primitive entries (a stray string/null in the
40
- // array) get one shared latch instead.
41
- let warnedPrimitive = false;
42
- let warnedNonArray = false;
43
-
44
- return (messages: unknown): ChatMessage[] => {
45
- if (!Array.isArray(messages)) {
46
- if (messages != null && !warnedNonArray) {
47
- warnedNonArray = true;
48
- console.error(`<${tag}>: 'messages' must be an array. Ignoring it.`);
49
- }
50
- return EMPTY;
51
- }
52
- // Fast path: nothing to report, hand back the same reference.
53
- if (messages.every(hasParts)) return messages as ChatMessage[];
54
-
55
- let invalid = 0;
56
- let unreported = 0;
57
- for (const m of messages) {
58
- if (hasParts(m)) continue;
59
- invalid++;
60
- if (m !== null && typeof m === 'object') {
61
- if (warned.has(m as object)) continue;
62
- warned.add(m as object);
63
- } else {
64
- if (warnedPrimitive) continue;
65
- warnedPrimitive = true;
66
- }
67
- unreported++;
68
- }
69
- if (unreported > 0) {
70
- console.error(
71
- `<${tag}>: skipped ${invalid} of ${messages.length} messages: ${EXPECTED}`,
72
- );
73
- }
74
- return messages.filter(hasParts);
75
- };
76
- }
@@ -1,100 +0,0 @@
1
- import { defineWebComponent } from './define';
2
- import { VoiceInput, type VoiceInputController } from '../components/voice-input';
3
-
4
- interface Props extends Record<string, unknown> {
5
- /**
6
- * Transcriber the host supplies: records audio, returns the text. This is a
7
- * **function-valued property** (`el.transcribe = async blob => '...'`) because
8
- * a value-returning callback can't be modelled as a fire-and-forget event.
9
- */
10
- transcribe?: (audio: Blob) => Promise<string>;
11
- /** Disable the mic button (non-interactive). */
12
- disabled?: boolean;
13
- /**
14
- * BCP-47 language tag for the native `SpeechRecognition` path (e.g. `en-US`).
15
- * Attribute: `recognition-lang` (the plain `lang` attribute is reserved by
16
- * `HTMLElement` and can't be a custom-element property). No effect when
17
- * `transcribe` is set or the browser lacks SpeechRecognition.
18
- */
19
- recognitionLang?: string;
20
- /** Emit live partial transcripts (`kai-transcript-interim`) during native
21
- * recognition. Attribute: `interim`. No-op on the transcribe/fallback paths. */
22
- interim?: boolean;
23
- }
24
-
25
- /** Events fired by `<kai-voice-input>`. */
26
- interface Events {
27
- /** Raw audio captured (before transcription), for hosts that prefer to handle
28
- * transcription themselves instead of via the `transcribe` property. Also the
29
- * unsupported-fallback signal: no `transcribe`, no SpeechRecognition, so only
30
- * the blob is produced (no text). */
31
- 'kai-audio-captured': { blob: Blob };
32
- /** Final transcript: the `transcribe` property resolved, OR native
33
- * `SpeechRecognition` produced final text (no `transcribe` set). */
34
- 'kai-transcription': { text: string };
35
- /** Live partial transcript during native recognition (only when `interim` is
36
- * set). Fires repeatedly before the final `kai-transcription`. */
37
- 'kai-transcript-interim': { text: string };
38
- /** Recording started or stopped. Lets the host drive its own UI (waveform,
39
- * push-to-talk indicator) in sync with the mic. Fires on real transitions
40
- * only (manual click and programmatic start()/stop()), never on mount. */
41
- 'kai-recording-change': { recording: boolean };
42
- /** A voice session failed, so no failure is ever silent. `detail.source` names
43
- * the failing side (`recognition` on `<kai-voice-input>`, `synthesis` on
44
- * `<kai-voice-output>`), `detail.error` carries the platform error code, the
45
- * thrown exception's name, or `no-result` when recognition ended with no error
46
- * and no text (the user said nothing), and `detail.message` is human-readable.
47
- * Deliberate cancellation does not fire. */
48
- 'kai-voice-error': { source: 'recognition'; error: string; message: string };
49
- }
50
-
51
- /**
52
- * `<kai-voice-input>` — a mic button that records and transcribes. Works
53
- * natively by default: with no `transcribe` callback it uses the browser's
54
- * `SpeechRecognition` (Chrome/Safari; no Firefox — and cloud-based in Chrome).
55
- * Set `el.transcribe` to route audio through your own async transcriber instead.
56
- * Where neither is available it records the blob and emits `kai-audio-captured`
57
- * with no text. Also emits `kai-transcription` (final text), `kai-voice-error`
58
- * (a failed or empty session) and, with `interim`, `kai-transcript-interim`
59
- * (live partials).
60
- */
61
- defineWebComponent<Props, Events>('kai-voice-input', {
62
- transcribe: undefined,
63
- disabled: false,
64
- recognitionLang: undefined,
65
- interim: false,
66
- }, (props, { dispatch, flag, expose }) => {
67
- // Pattern C: the VoiceInput component owns useVoiceRecorder; it hands up a
68
- // start/stop controller and an onRecordingChange callback. The facade captures
69
- // the controller and exposes delegating methods (start/stop both run the same
70
- // record→transcribe path as the mic click, so manual + programmatic emit the
71
- // same kai-audio-captured/kai-transcription/kai-recording-change events).
72
- let controller: VoiceInputController | undefined;
73
- expose({
74
- /** Begin recording programmatically (e.g. push-to-talk bound to a global
75
- * key). Runs the same getUserMedia path as clicking the mic; no-ops if
76
- * already recording. */
77
- start: () => controller?.start(),
78
- /** Stop the in-progress recording, producing the blob (→ kai-audio-captured)
79
- * and running transcription. Pairs with start() for push-to-talk. */
80
- stop: () => controller?.stop(),
81
- });
82
-
83
- return (
84
- <VoiceInput
85
- disabled={flag('disabled')}
86
- hasTranscribe={typeof props.transcribe === 'function'}
87
- lang={props.recognitionLang}
88
- interim={flag('interim')}
89
- onTranscribe={async (blob) => {
90
- dispatch('kai-audio-captured', { blob });
91
- return props.transcribe ? props.transcribe(blob) : '';
92
- }}
93
- onTranscription={(text) => dispatch('kai-transcription', { text })}
94
- onInterim={(text) => dispatch('kai-transcript-interim', { text })}
95
- onRecordingChange={(recording) => dispatch('kai-recording-change', { recording })}
96
- onError={(detail) => dispatch('kai-voice-error', detail)}
97
- controllerRef={(c) => (controller = c)}
98
- />
99
- );
100
- });
@@ -1,82 +0,0 @@
1
- import { defineWebComponent } from './define';
2
- import { VoiceOutput, type VoiceOutputController } from '../components/voice-output';
3
-
4
- interface Props extends Record<string, unknown> {
5
- /** The utterance to read aloud. */
6
- text?: string;
7
- /** Speak automatically when `text` is set/changed. */
8
- autoplay?: boolean;
9
- /**
10
- * TTS model seam the host supplies: given text, returns an audio `Blob` to
11
- * play. This is a **function-valued property** (`el.synthesize = async text =>
12
- * blob`); when set, the native `speechSynthesis` path is bypassed. Mirrors
13
- * `<kai-voice-input>`'s `transcribe`. A value-returning callback can't be
14
- * modelled as a fire-and-forget event, hence a property.
15
- */
16
- synthesize?: (text: string) => Promise<Blob>;
17
- /** Disable the button (non-interactive). */
18
- disabled?: boolean;
19
- }
20
-
21
- /** Events fired by `<kai-voice-output>`. */
22
- interface Events {
23
- /** Playback started or stopped. Drive your own UI in sync. `speaking: true`
24
- * fires when audio actually starts (utterance.onstart natively; audio playback
25
- * beginning on the `synthesize` path), not when speak() is called; earlier
26
- * releases fired it optimistically inside speak() itself. Fires on real
27
- * transitions only (manual click and programmatic speak()/stop()), never on
28
- * mount. */
29
- 'kai-speaking-change': { speaking: boolean };
30
- /** The model path (`synthesize`) resolved audio: the raw `Blob` before playback. */
31
- 'kai-synthesized': { blob: Blob };
32
- /** A voice session failed, so no failure is ever silent. `detail.source` names
33
- * the failing side (`recognition` on `<kai-voice-input>`, `synthesis` on
34
- * `<kai-voice-output>`), `detail.error` carries the platform error code, the
35
- * thrown exception's name, or `no-result` when recognition ended with no error
36
- * and no text (the user said nothing), and `detail.message` is human-readable.
37
- * Deliberate cancellation does not fire. */
38
- 'kai-voice-error': { source: 'synthesis'; error: string; message: string };
39
- }
40
-
41
- /**
42
- * `<kai-voice-output>` — a speaker button that reads `text` aloud. Native by
43
- * default (`speechSynthesis`); set `el.synthesize` to route through your TTS
44
- * model instead. The output sibling of `<kai-voice-input>`. Emits
45
- * `kai-speaking-change`, `kai-voice-error` (a failed synthesis) and (model
46
- * path) `kai-synthesized`.
47
- */
48
- defineWebComponent<Props, Events>('kai-voice-output', {
49
- text: '',
50
- autoplay: false,
51
- synthesize: undefined,
52
- disabled: false,
53
- }, (props, { dispatch, flag, expose }) => {
54
- // Pattern C: the VoiceOutput component owns playback; it hands up a
55
- // speak/pause/resume/stop controller. The facade captures it and exposes
56
- // delegating methods (manual + programmatic run the same path, so both emit
57
- // the same kai-speaking-change / kai-synthesized events).
58
- let controller: VoiceOutputController | undefined;
59
- expose({
60
- /** Speak the current `text` (native, or via `synthesize` if set). */
61
- speak: () => controller?.speak(),
62
- /** Pause playback (resumable). */
63
- pause: () => controller?.pause(),
64
- /** Resume paused playback. */
65
- resume: () => controller?.resume(),
66
- /** Stop playback and reset. */
67
- stop: () => controller?.stop(),
68
- });
69
-
70
- return (
71
- <VoiceOutput
72
- text={(props.text as string | undefined) ?? ''}
73
- autoplay={flag('autoplay')}
74
- disabled={flag('disabled')}
75
- onSynthesize={props.synthesize ? (text) => props.synthesize!(text) : undefined}
76
- onSpeakingChange={(speaking) => dispatch('kai-speaking-change', { speaking })}
77
- onSynthesized={(blob) => dispatch('kai-synthesized', { blob })}
78
- onError={(detail) => dispatch('kai-voice-error', detail)}
79
- controllerRef={(c) => (controller = c)}
80
- />
81
- );
82
- });