@kitn.ai/ui 0.25.2 → 0.26.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.
- package/README.md +2 -2
- package/dist/components/attachment-types.d.ts +46 -1
- package/dist/components/attachments.d.ts +31 -0
- package/dist/components/audio-visualizer/fit-scale.d.ts +50 -0
- package/dist/components/audio-visualizer/index.d.ts +15 -1
- package/dist/components/audio-visualizer/variant-bar.d.ts +24 -1
- package/dist/components/chat-thread.d.ts +3 -41
- package/dist/components/code-block.d.ts +22 -0
- package/dist/components/conversation-item.d.ts +54 -1
- package/dist/components/conversation-list.d.ts +65 -0
- package/dist/components/form.d.ts +42 -0
- package/dist/components/message.d.ts +7 -0
- package/dist/components/toast.d.ts +2 -1
- package/dist/components/voice-input.d.ts +8 -0
- package/dist/components/voice-output.d.ts +12 -1
- package/dist/components/workspace-shell.d.ts +87 -0
- package/dist/{create-tween-B5Y4Im8G.js → create-tween-BFT6c-Y8.js} +1 -1
- package/dist/{create-tween-4z1XYLkR.js → create-tween-CJNlzoaO.js} +1 -1
- package/dist/{create-tween-CUzOlaMS.js → create-tween-CQED4T0g.js} +1 -1
- package/dist/custom-elements.json +2931 -2572
- package/dist/diagnostics/hook.d.ts +81 -0
- package/dist/diagnostics/index.d.ts +7 -0
- package/dist/diagnostics/report-request.d.ts +61 -0
- package/dist/diagnostics.d.ts +5 -0
- package/dist/diagnostics.js +209 -0
- package/dist/elements/agent-card.js +1 -1
- package/dist/elements/artifact.js +1 -1
- package/dist/elements/attachments.js +1 -1
- package/dist/elements/audio-visualizer.js +1 -1
- package/dist/elements/autoloader.js +1 -1
- package/dist/elements/avatar.js +1 -1
- package/dist/elements/badge.js +1 -1
- package/dist/elements/button.js +1 -1
- package/dist/elements/card.js +1 -1
- package/dist/elements/cards.js +1 -1
- package/dist/elements/chain-of-thought.js +1 -1
- package/dist/elements/chat-scope-picker.js +1 -1
- package/dist/elements/chat-workspace.js +1 -1
- package/dist/elements/chat.js +1 -1
- package/dist/elements/checkpoint.js +1 -1
- package/dist/elements/choice.js +1 -1
- package/dist/elements/chunks/{Icon-b5A8hlHs.js → Icon--Y8vsFal.js} +1 -1
- package/dist/elements/chunks/action-icons-D9u3OzYW.js +1 -0
- package/dist/elements/chunks/arrow-left-CVh1TeN7.js +1 -0
- package/dist/elements/chunks/{artifact-BSuPYFHY.js → artifact-BkYcfIlZ.js} +1 -1
- package/dist/elements/chunks/attachments-DwfNlubq.js +1 -0
- package/dist/elements/chunks/audio-visualizer-D7lB6mvR.js +1 -0
- package/dist/elements/chunks/{badge-TIMiJFKc.js → badge-Q0-Cmwzz.js} +1 -1
- package/dist/elements/chunks/{button-B9okqG73.js → button-flUbeufF.js} +1 -1
- package/dist/elements/chunks/{card-renderer-CSoTL_e1.js → card-renderer-3Dyl-FpN.js} +1 -1
- package/dist/elements/chunks/check-B5kBPKeo.js +1 -0
- package/dist/elements/chunks/chevron-down-DZ1GS39h.js +1 -0
- package/dist/elements/chunks/chevron-right-CvP7OUd2.js +1 -0
- package/dist/elements/chunks/{choice-card-CGMc3kek.js → choice-card-D4QUIOWZ.js} +1 -1
- package/dist/elements/chunks/circle-CDf9g6MQ.js +1 -0
- package/dist/elements/chunks/circle-check-CA47Nqbz.js +1 -0
- package/dist/elements/chunks/{circle-x-mhH7pOK2.js → circle-x-CJ_HVbC8.js} +1 -1
- package/dist/elements/chunks/code-block-BdLiTitd.js +1 -0
- package/dist/elements/chunks/collapsible-BzbXpPzr.js +1 -0
- package/dist/elements/chunks/{composer-CZZmtYOT.js → composer-Byve-n8K.js} +2 -2
- package/dist/elements/chunks/{confirm-card-BWjf2-xo.js → confirm-card-B0flE3MN.js} +1 -1
- package/dist/elements/chunks/context-VLIL3sJ-.js +1 -0
- package/dist/elements/chunks/controllable-DTwTIlwp.js +1 -0
- package/dist/elements/chunks/conversation-item-BDztezOG.js +1 -0
- package/dist/elements/chunks/copy-Nf-kqxXH.js +1 -0
- package/dist/elements/chunks/{create-tween-CUrM6D_o.js → create-tween-c4Z8TDYz.js} +2 -2
- package/dist/elements/chunks/default-input-C2iLFq0b.js +1 -0
- package/dist/elements/chunks/define-wjHR1MkU.js +1 -0
- package/dist/elements/chunks/disclosure-CcNbyLy0.js +1 -0
- package/dist/elements/chunks/{download-DnCyWFJE.js → download-C4V7tBdb.js} +1 -1
- package/dist/elements/chunks/dropdown-BgWTthUx.js +1 -0
- package/dist/elements/chunks/{ellipsis-CVxqfsDZ.js → ellipsis-7gU33mL2.js} +1 -1
- package/dist/elements/chunks/embed-D3KewsIJ.js +1 -0
- package/dist/elements/chunks/{external-link-DG2sRdQL.js → external-link-CSOEsNlx.js} +1 -1
- package/dist/elements/chunks/{file-text-D0J9F6M7.js → file-text-D1G8khle.js} +1 -1
- package/dist/elements/chunks/{file-tree-yGWNK0Js.js → file-tree-zvB2i7P9.js} +1 -1
- package/dist/elements/chunks/{folder-NV1pi_ud.js → folder-WW2LGLid.js} +1 -1
- package/dist/elements/chunks/form-CQirdC4W.js +1 -0
- package/dist/elements/chunks/hover-card-CJJkfHTK.js +1 -0
- package/dist/elements/chunks/icon-Cfgmf4fa.js +1 -0
- package/dist/elements/chunks/{info-C8r5Q6cc.js → info-DX3YMOt6.js} +1 -1
- package/dist/elements/chunks/input-BtW9U6Sq.js +1 -0
- package/dist/elements/chunks/{kbd-OGJDUT-O.js → kbd-LGXwuT_V.js} +1 -1
- package/dist/elements/chunks/{link-BdsfLB7b.js → link-2My69BqT.js} +1 -1
- package/dist/elements/chunks/{link-preview-Cf5KOP-i.js → link-preview-OQ9IEq0f.js} +1 -1
- package/dist/elements/chunks/{loader-B5QzK_8_.js → loader-iOxc_Tu-.js} +1 -1
- package/dist/elements/chunks/{markdown-DbozyYqa.js → markdown-DgBFaGAz.js} +1 -1
- package/dist/elements/chunks/{message-DtXKPqiR.js → message-VMZohrXx.js} +1 -1
- package/dist/elements/chunks/message-circle-CpXMM-_n.js +1 -0
- package/dist/elements/chunks/message-square-DxcWtETQ.js +1 -0
- package/dist/elements/chunks/message-tZmV2A3p.js +1 -0
- package/dist/elements/chunks/{minimize-2-SegJ_oku.js → minimize-2-DPIUKTrT.js} +1 -1
- package/dist/elements/chunks/{model-switcher-D7JrFFHp.js → model-switcher-DsT8tFB0.js} +1 -1
- package/dist/elements/chunks/{overlay-CV7z2YuX.js → overlay-DuiwdXjm.js} +1 -1
- package/dist/elements/chunks/{paperclip-Bg0ITU3b.js → paperclip-CRZVp4z_.js} +1 -1
- package/dist/elements/chunks/{progress-bar-D1_rzt6N.js → progress-bar-DNy66e_E.js} +1 -1
- package/dist/elements/chunks/{prompt-suggestion-D5Sm8xF1.js → prompt-suggestion-Bn64Nl7L.js} +1 -1
- package/dist/elements/chunks/reasoning-Emn9N4-T.js +1 -0
- package/dist/elements/chunks/{resizable-Dpzjlvp4.js → resizable-D181b4fM.js} +1 -1
- package/dist/elements/chunks/{rotate-cw-DzVDJOA1.js → rotate-cw-CPWe37D9.js} +1 -1
- package/dist/elements/chunks/{scroll-area-93A1bbeG.js → scroll-area-ClZkZxIk.js} +1 -1
- package/dist/elements/chunks/scroll-button-DPE-t3x_.js +1 -0
- package/dist/elements/chunks/{separator-DH2r_ZSZ.js → separator-CeJHQqLW.js} +1 -1
- package/dist/elements/chunks/{settings-BFMOd6yB.js → settings-CqaHgJF9.js} +1 -1
- package/dist/elements/chunks/{settings-group-B3VZKIcz.js → settings-group-CjqjLCOn.js} +1 -1
- package/dist/elements/chunks/share-CyfnNEqp.js +1 -0
- package/dist/elements/chunks/{skeleton-N8BuWYmf.js → skeleton-D8akBnKS.js} +1 -1
- package/dist/elements/chunks/slots-DaNjX0rc.js +1 -0
- package/dist/elements/chunks/{source-w9V0NnBn.js → source-UWCvmVak.js} +1 -1
- package/dist/elements/chunks/{star-DHvACxtm.js → star-DoHFAikQ.js} +1 -1
- package/dist/elements/chunks/store-Cjq0qwYN.js +1 -0
- package/dist/elements/chunks/{tasks-card-lPxoodlA.js → tasks-card-CmZ5xh6v.js} +1 -1
- package/dist/elements/chunks/{text-shimmer-BY_rI3s5.js → text-shimmer-DYn09zrz.js} +1 -1
- package/dist/elements/chunks/textarea-skiGHURM.js +1 -0
- package/dist/elements/chunks/{thumbs-up-DQe0hvkZ.js → thumbs-up-DX2Ijk3H.js} +1 -1
- package/dist/elements/chunks/{toast-store-VUZZBhzH.js → toast-store-CFnQpThX.js} +1 -1
- package/dist/elements/chunks/{tool-C1YtxwPu.js → tool-DKQ2D1DP.js} +1 -1
- package/dist/elements/chunks/{tooltip-BqwnFWhn.js → tooltip-B0G99y8w.js} +1 -1
- package/dist/elements/chunks/{triangle-alert-B6or7F5u.js → triangle-alert-F9cyUEyy.js} +1 -1
- package/dist/elements/chunks/{use-card-resolution-DJg32jGH.js → use-card-resolution-DoA2f_EU.js} +1 -1
- package/dist/elements/chunks/{variant-aurora-QXTZPyST.js → variant-aurora-qt6Zct8M.js} +2 -2
- package/dist/elements/chunks/variant-custom-tJp22_BQ.js +1 -0
- package/dist/{variant-wave-BwzrHD1s.js → elements/chunks/variant-wave-CaQ5ti39.js} +2 -2
- package/dist/elements/chunks/x-B6UnOiLw.js +1 -0
- package/dist/elements/coachmark.js +1 -1
- package/dist/elements/code-block.js +1 -1
- package/dist/elements/command.js +1 -1
- package/dist/elements/compare.js +1 -1
- package/dist/elements/composer.js +1 -1
- package/dist/elements/confirm-card.js +1 -1
- package/dist/elements/context-meter.js +1 -1
- package/dist/elements/conversation-item.d.ts +1 -0
- package/dist/elements/conversation-item.js +1 -0
- package/dist/elements/conversation-list.js +1 -1
- package/dist/elements/default-input.d.ts +3 -3
- package/dist/elements/define.d.ts +27 -0
- package/dist/elements/diagnostic-events.d.ts +74 -0
- package/dist/elements/dialog.js +1 -1
- package/dist/elements/dock.d.ts +1 -0
- package/dist/elements/dock.js +149 -0
- package/dist/elements/dropdown.d.ts +1 -0
- package/dist/elements/dropdown.js +1 -0
- package/dist/elements/editable-label.js +1 -1
- package/dist/elements/element-diagnostics.d.ts +81 -0
- package/dist/elements/embed.js +1 -1
- package/dist/elements/empty.js +1 -1
- package/dist/elements/feedback-bar.js +1 -1
- package/dist/elements/file-tree.js +1 -1
- package/dist/elements/file-upload.js +1 -1
- package/dist/elements/form.js +1 -1
- package/dist/elements/hover-card.js +1 -1
- package/dist/elements/icon.js +1 -1
- package/dist/elements/image.js +1 -1
- package/dist/elements/input.js +1 -1
- package/dist/elements/kbd.js +1 -1
- package/dist/elements/link-preview.js +1 -1
- package/dist/elements/loader.js +1 -1
- package/dist/elements/markdown.js +1 -1
- package/dist/elements/menu.js +1 -1
- package/dist/elements/message-skills.js +1 -1
- package/dist/elements/message.js +1 -1
- package/dist/elements/model-switcher.js +1 -1
- package/dist/elements/nav.js +1 -1
- package/dist/elements/notice.js +1 -1
- package/dist/elements/pane-group.js +1 -1
- package/dist/elements/pane.js +1 -1
- package/dist/elements/popover.js +1 -1
- package/dist/elements/progress-bar.js +1 -1
- package/dist/elements/prompt-dock.js +1 -1
- package/dist/elements/prompt-input.js +1 -1
- package/dist/elements/prompt-suggestions.js +1 -1
- package/dist/elements/reasoning.js +1 -1
- package/dist/elements/register.d.ts +2 -0
- package/dist/elements/remote.js +1 -1
- package/dist/elements/resizable.js +1 -1
- package/dist/elements/response-stream.js +3 -3
- package/dist/elements/screen.js +1 -1
- package/dist/elements/scroll-area.js +1 -1
- package/dist/elements/scroll-button.js +1 -1
- package/dist/elements/search.js +1 -1
- package/dist/elements/segmented.js +1 -1
- package/dist/elements/separator.js +1 -1
- package/dist/elements/setting-item.js +1 -1
- package/dist/elements/settings-group.js +1 -1
- package/dist/elements/skeleton.js +1 -1
- package/dist/elements/slots.d.ts +35 -3
- package/dist/elements/source.js +1 -1
- package/dist/elements/status.js +1 -1
- package/dist/elements/switch.js +1 -1
- package/dist/elements/tabs.js +1 -1
- package/dist/elements/tasks.js +1 -1
- package/dist/elements/text-shimmer.js +1 -1
- package/dist/elements/thinking-bar.js +1 -1
- package/dist/elements/thread.js +1 -1
- package/dist/elements/toast.js +1 -1
- package/dist/elements/tool.js +1 -1
- package/dist/elements/tooltip.js +1 -1
- package/dist/elements/voice-input.js +1 -1
- package/dist/elements/voice-output.js +1 -1
- package/dist/elements.d.ts +232 -148
- package/dist/index.d.ts +2 -0
- package/dist/index.js +5456 -4931
- package/dist/index.server.js +4142 -3669
- package/dist/kai-provider.es.js +40 -40
- package/dist/kai.es.js +1 -1
- package/dist/llms/llms-full.txt +184 -69
- package/dist/llms/llms.txt +3 -3
- package/dist/mcp.es.js +2669 -546
- package/dist/primitives/use-resize-observer.d.ts +23 -0
- package/dist/primitives/use-speech-recognition.d.ts +8 -0
- package/dist/primitives/use-text-stream.d.ts +5 -0
- package/dist/react/index.d.ts +115 -266
- package/dist/react.js +247 -221
- package/dist/register-impl-DpE7icIb.js +293 -0
- package/dist/schemas/index.d.ts +1 -1
- package/dist/schemas/tool-defs.d.ts +35 -0
- package/dist/schemas.js +403 -310
- package/dist/{solid-BMuDmFo_.js → solid-BtdqNZI7.js} +8435 -7394
- package/dist/{solid-CGYNdLRR.js → solid-CnavwBye.js} +5987 -5035
- package/dist/solid.d.ts +5 -0
- package/dist/solid.js +210 -203
- package/dist/solid.server.js +210 -203
- package/dist/state/index.d.ts +4 -0
- package/dist/state/persistence.d.ts +51 -0
- package/dist/state/stream.d.ts +50 -0
- package/dist/state/threads.d.ts +71 -0
- package/dist/state.js +269 -169
- package/dist/types.d.ts +4 -2
- package/dist/ui/dock.d.ts +109 -0
- package/dist/ui/hover-card.d.ts +44 -0
- package/dist/{variant-aurora-DwSOfraQ.js → variant-aurora-B8II3-I1.js} +27 -27
- package/dist/{variant-aurora-wKvAQ5wp.js → variant-aurora-CMNWOSJR.js} +28 -28
- package/dist/{variant-aurora-XEkPT0_z.js → variant-aurora-CcuDMWwQ.js} +2 -2
- package/dist/{variant-custom-eFIg2XWQ.js → variant-custom-BdvYC7af.js} +40 -40
- package/dist/{variant-custom-BhS9wIpU.js → variant-custom-C714mqKl.js} +65 -65
- package/dist/variant-custom-L16JLLZy.js +1 -0
- package/dist/{elements/chunks/variant-wave-DDCwhLas.js → variant-wave-2S4La2Ka.js} +2 -2
- package/dist/{variant-wave-CbVsmgwT.js → variant-wave-D7ruiA1W.js} +25 -25
- package/dist/{variant-wave-CUWGx9Bn.js → variant-wave-ecwykeyL.js} +21 -21
- package/dist/wire/chunk.d.ts +47 -0
- package/dist/wire/diagnostics.d.ts +575 -0
- package/dist/wire/encode-probe.d.ts +70 -0
- package/dist/wire/encode.d.ts +24 -0
- package/dist/wire/index.d.ts +2 -0
- package/dist/wire/sse.d.ts +10 -2
- package/dist/wire.js +917 -480
- package/frameworks/react/index.tsx +132 -93
- package/llms-full.txt +184 -69
- package/llms.txt +3 -3
- package/package.json +26 -6
- package/src/agent-tooling/archetypes.ts +41 -9
- package/src/agent-tooling/catalog/README.md +676 -0
- package/src/agent-tooling/catalog/catalog-types.ts +231 -0
- package/src/agent-tooling/catalog/fabrications.ts +96 -0
- package/src/agent-tooling/catalog/invariants.ts +284 -0
- package/src/agent-tooling/catalog/labs-titles.ts +114 -0
- package/src/agent-tooling/catalog/scenarios.ts +87 -0
- package/src/agent-tooling/catalog/surfaces.ts +275 -0
- package/src/agent-tooling/integrations/anthropic.ts +7 -1
- package/src/agent-tooling/integrations/cloudflare.ts +43 -2
- package/src/agent-tooling/integrations/langgraph.ts +7 -1
- package/src/agent-tooling/integrations/mastra.ts +7 -1
- package/src/agent-tooling/integrations/mock.ts +92 -17
- package/src/agent-tooling/integrations/ollama.ts +7 -1
- package/src/agent-tooling/integrations/openai.ts +7 -1
- package/src/agent-tooling/integrations/openrouter.ts +7 -1
- package/src/agent-tooling/integrations/pi.ts +56 -1
- package/src/agent-tooling/integrations/vercel-ai-sdk.ts +7 -1
- package/src/agent-tooling/mcp/css-raw.d.ts +12 -0
- package/src/agent-tooling/mcp/manifest.ts +100 -1
- package/src/agent-tooling/mcp/server.ts +61 -5
- package/src/agent-tooling/mcp/tools/reference.ts +440 -4
- package/src/agent-tooling/mcp/tools/scaffold.ts +1834 -307
- package/src/agent-tooling/mcp/tools/theme.ts +146 -30
- package/src/agent-tooling/mcp/validate-args.ts +141 -0
- package/src/agent-tooling/registry.ts +19 -7
- package/src/agent-tooling/route-emit.ts +26 -2
- package/src/components/attachment-types.ts +47 -1
- package/src/components/attachments.tsx +169 -22
- package/src/components/audio-visualizer/fit-scale.ts +112 -0
- package/src/components/audio-visualizer/index.tsx +80 -3
- package/src/components/audio-visualizer/variant-aurora.tsx +10 -4
- package/src/components/audio-visualizer/variant-bar.tsx +38 -6
- package/src/components/audio-visualizer/variant-custom.tsx +8 -2
- package/src/components/audio-visualizer/variant-grid.tsx +16 -11
- package/src/components/audio-visualizer/variant-radial.tsx +15 -10
- package/src/components/audio-visualizer/variant-wave.tsx +7 -2
- package/src/components/chat-container.tsx +4 -1
- package/src/components/chat-thread.tsx +36 -7
- package/src/components/code-block.tsx +79 -3
- package/src/components/composer.tsx +8 -1
- package/src/components/conversation-item.tsx +114 -4
- package/src/components/conversation-list.tsx +212 -12
- package/src/components/embed.tsx +4 -0
- package/src/components/form.tsx +41 -14
- package/src/components/message.tsx +75 -5
- package/src/components/response-stream.tsx +13 -7
- package/src/components/screen.tsx +5 -0
- package/src/components/scroll-button.tsx +7 -0
- package/src/components/toast.tsx +11 -5
- package/src/components/voice-input.tsx +35 -3
- package/src/components/voice-output.tsx +46 -6
- package/src/components/workspace-shell.tsx +285 -0
- package/src/diagnostics/hook.ts +352 -0
- package/src/diagnostics/index.ts +82 -0
- package/src/diagnostics/report-request.ts +296 -0
- package/src/elements/attachments.tsx +6 -7
- package/src/elements/audio-visualizer.tsx +48 -4
- package/src/elements/chat-workspace.tsx +159 -287
- package/src/elements/chat.tsx +12 -9
- package/src/elements/code-block.tsx +19 -1
- package/src/elements/command.tsx +4 -1
- package/src/elements/compiled.css +1 -1
- package/src/elements/conversation-item.tsx +80 -0
- package/src/elements/conversation-list.tsx +60 -11
- package/src/elements/default-input.tsx +5 -5
- package/src/elements/define.tsx +168 -8
- package/src/elements/diagnostic-events.ts +114 -0
- package/src/elements/dialog.tsx +47 -0
- package/src/elements/disclosure.ts +34 -12
- package/src/elements/dock.tsx +204 -0
- package/src/elements/dropdown.tsx +123 -0
- package/src/elements/element-diagnostics.ts +392 -0
- package/src/elements/element-manifest.json +12 -0
- package/src/elements/element-meta.json +672 -439
- package/src/elements/element-nonscalar.json +170 -0
- package/src/elements/element-types.d.ts +232 -148
- package/src/elements/menu.tsx +13 -0
- package/src/elements/prompt-dock.tsx +2 -1
- package/src/elements/prompt-input.tsx +8 -8
- package/src/elements/register-impl.ts +46 -0
- package/src/elements/register.ts +28 -0
- package/src/elements/resizable.tsx +52 -25
- package/src/elements/scroll-button.tsx +5 -0
- package/src/elements/slots.ts +107 -12
- package/src/elements/styles.css +30 -6
- package/src/elements/thinking-bar.tsx +16 -7
- package/src/elements/toast.tsx +3 -0
- package/src/elements/tool.tsx +26 -5
- package/src/elements/voice-input.tsx +11 -2
- package/src/elements/voice-output.tsx +16 -3
- package/src/index.ts +2 -0
- package/src/primitives/use-resize-observer.ts +33 -0
- package/src/primitives/use-speech-recognition.ts +12 -1
- package/src/primitives/use-stick-to-bottom.ts +34 -2
- package/src/primitives/use-text-stream.ts +33 -2
- package/src/remote/provider-runtime.ts +6 -3
- package/src/schemas/index.ts +1 -0
- package/src/schemas/tool-defs.ts +297 -6
- package/src/solid.ts +5 -0
- package/src/state/index.ts +12 -0
- package/src/state/persistence.ts +180 -0
- package/src/state/stream.ts +71 -4
- package/src/state/threads.ts +142 -0
- package/src/types.ts +4 -2
- package/src/ui/dialog.tsx +6 -0
- package/src/ui/dock.tsx +445 -0
- package/src/ui/dropdown.tsx +67 -23
- package/src/ui/hover-card.tsx +156 -6
- package/src/ui/input.tsx +29 -10
- package/src/ui/resizable.tsx +11 -0
- package/src/wire/chunk.ts +47 -0
- package/src/wire/consume.ts +185 -26
- package/src/wire/diagnostics.ts +727 -0
- package/src/wire/encode-probe.ts +214 -0
- package/src/wire/encode.ts +267 -14
- package/src/wire/formats/anthropic.ts +8 -1
- package/src/wire/formats/openai.ts +5 -0
- package/src/wire/index.ts +22 -0
- package/src/wire/read.ts +250 -6
- package/src/wire/sse.ts +16 -3
- package/dist/elements/chunks/action-icons-DW9muWrY.js +0 -1
- package/dist/elements/chunks/arrow-left-iJVnQmxA.js +0 -1
- package/dist/elements/chunks/attachments-CL6TaqIb.js +0 -1
- package/dist/elements/chunks/audio-visualizer-BuUqQmaO.js +0 -1
- package/dist/elements/chunks/chat-thread-DxoKaStk.js +0 -1
- package/dist/elements/chunks/check-MdLzbxrm.js +0 -1
- package/dist/elements/chunks/chevron-down-MK7IzDqe.js +0 -1
- package/dist/elements/chunks/chevron-right-C5jXhmtV.js +0 -1
- package/dist/elements/chunks/circle-BG7VkPep.js +0 -1
- package/dist/elements/chunks/circle-check-GqvO2UBs.js +0 -1
- package/dist/elements/chunks/code-block-ClhQO9RW.js +0 -1
- package/dist/elements/chunks/collapsible-DBcBkFPh.js +0 -1
- package/dist/elements/chunks/context-hKjNqiyQ.js +0 -1
- package/dist/elements/chunks/conversation-list-CsGJjSKG.js +0 -1
- package/dist/elements/chunks/default-input-B1Mem5wu.js +0 -1
- package/dist/elements/chunks/define-B_tXMYRm.js +0 -1
- package/dist/elements/chunks/disclosure-DAoYOKew.js +0 -1
- package/dist/elements/chunks/dropdown-CmNna5lT.js +0 -1
- package/dist/elements/chunks/embed-CjAD2jSi.js +0 -1
- package/dist/elements/chunks/form-Cp8Y00Wn.js +0 -1
- package/dist/elements/chunks/hover-card-6KtXpLwT.js +0 -1
- package/dist/elements/chunks/icon-97R8SR2p.js +0 -1
- package/dist/elements/chunks/input-DrseEjhp.js +0 -1
- package/dist/elements/chunks/message-CE4k-qaj.js +0 -1
- package/dist/elements/chunks/message-square-C9ovmtOo.js +0 -1
- package/dist/elements/chunks/reasoning-BrxQfpfI.js +0 -1
- package/dist/elements/chunks/scroll-button-CrTo7wm4.js +0 -1
- package/dist/elements/chunks/share-DgNbkJKY.js +0 -1
- package/dist/elements/chunks/slots-CIw9RlAe.js +0 -1
- package/dist/elements/chunks/store-HIPGhNz9.js +0 -1
- package/dist/elements/chunks/textarea-DPfuhswM.js +0 -1
- package/dist/elements/chunks/variant-custom-D5ZlmziF.js +0 -1
- package/dist/elements/chunks/video-Bb86fVYI.js +0 -1
- package/dist/elements/chunks/x-BOhjBeOd.js +0 -1
- package/dist/primitives/card-validate-generator.testlib.d.ts +0 -20
- package/dist/register-impl-DGmGzrEM.js +0 -145
- package/dist/variant-custom-MkTNTycd.js +0 -1
- package/src/primitives/card-validate-generator.testlib.ts +0 -38
package/dist/elements.d.ts
CHANGED
|
@@ -344,12 +344,14 @@ export interface KaiAudioVisualizerElement extends HTMLElement {
|
|
|
344
344
|
complexity?: number;
|
|
345
345
|
/** Setting this makes the element an announced image (`role="img"`) instead of decorative (`aria-hidden`). Attribute: `label`. */
|
|
346
346
|
label?: string;
|
|
347
|
-
/** Live microphone or WebRTC audio to analyze. JS property only. */
|
|
347
|
+
/** Live microphone or WebRTC audio to analyze. JS property only. NOTE: amplitude renders only while state is "speaking" unless listening-amplitude is set; every other state plays its scripted animation and ignores the audio. */
|
|
348
348
|
stream?: MediaStream;
|
|
349
|
-
/** An `<audio>` or `<video>` element to tap for its audio. JS property only. */
|
|
349
|
+
/** An `<audio>` or `<video>` element to tap for its audio. JS property only. NOTE: amplitude renders only while state is "speaking" unless listening-amplitude is set; every other state plays its scripted animation and ignores the audio. */
|
|
350
350
|
audioElement?: HTMLMediaElement;
|
|
351
|
-
/** Pre-computed levels, 0..1. Set this and no AudioContext is ever built, which is what keeps headless/SSR rendering and browser-speech-synthesis playback (which exposes no audio node) free of Web Audio entirely. JS property only. A new array reference is required for each update; mutating the existing array in place will not re-render. */
|
|
351
|
+
/** Pre-computed levels, 0..1. Set this and no AudioContext is ever built, which is what keeps headless/SSR rendering and browser-speech-synthesis playback (which exposes no audio node) free of Web Audio entirely. JS property only. A new array reference is required for each update; mutating the existing array in place will not re-render. NOTE: amplitude renders only while state is "speaking" unless listening-amplitude is set; every other state plays its scripted animation and ignores the audio. */
|
|
352
352
|
bands?: number[];
|
|
353
|
+
/** Render live amplitude during the listening state as well, using the same presentation as speaking. Off by default, which keeps LiveKit parity: amplitude from stream, audio-element or bands renders only while state is "speaking". Set it to show a real mic-level picture while the user is the one talking. Boolean. Attribute: `listening-amplitude` (a bare attribute means true; reflected, so the property reads back what the attribute set). */
|
|
354
|
+
listeningAmplitude?: boolean;
|
|
353
355
|
/** Custom fragment shader for `variant="custom"`. JS property only. */
|
|
354
356
|
shader?: { fragment: string; uniforms?: Record<string, { type: "1f" | "1i" | "1fv" | "2f" | "3f" | "3fv" | "4f" | "4fv" | "Matrix2fv" | "Matrix3fv" | "Matrix4fv"; value: number | number[] }> };
|
|
355
357
|
/** Shader variants only: keep animating while scrolled off screen. Off by default, which stops drawing and releases the WebGL context until the element comes back (browsers ration contexts to roughly 16 a page). Does not override `prefers-reduced-motion`. Attribute: `animate-when-not-visible`. */
|
|
@@ -471,8 +473,6 @@ export interface KaiChainOfThoughtElement extends HTMLElement {
|
|
|
471
473
|
export interface KaiChatElement extends HTMLElement {
|
|
472
474
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
473
475
|
theme?: "light" | "dark" | "auto";
|
|
474
|
-
/** Show a Search (Globe) button in the input toolbar; fires a `search` event. */
|
|
475
|
-
search?: boolean;
|
|
476
476
|
/** Value of the input. A **string** is controlled (the host owns the text and updates it on `kai-value-change`). A **ComposerDoc** is a one-time seed that pre-populates pills; the user then edits freely. Leave unset for uncontrolled. */
|
|
477
477
|
value?: string | ({ type: "text"; text: string } | { type: "entity"; entity: { kind: string; id: string; label: string; icon?: string; promptText?: string; data?: Record<string, unknown> } })[];
|
|
478
478
|
/** Placeholder text shown in the empty input. */
|
|
@@ -517,6 +517,8 @@ export interface KaiChatElement extends HTMLElement {
|
|
|
517
517
|
composerActions?: boolean;
|
|
518
518
|
/** INJECT: footer row below the composer (disclaimers, token meter, …). */
|
|
519
519
|
footer?: boolean;
|
|
520
|
+
/** Show a web-search (Globe) button in the input toolbar; calls `onWebSearch`. */
|
|
521
|
+
webSearch?: boolean;
|
|
520
522
|
/** Show a Voice (Mic) button in the input toolbar; fires a `voice` event. */
|
|
521
523
|
voice?: boolean;
|
|
522
524
|
/** Rich entity triggers. Each `{ char, kind, items }` opens a caret-anchored menu that inserts an atomic pill (`/` skills, `@` agents/plugins). Set as a JS property; forwarded to the input. */
|
|
@@ -623,6 +625,8 @@ export interface KaiCodeBlockElement extends HTMLElement {
|
|
|
623
625
|
codeTheme?: string;
|
|
624
626
|
/** Disable syntax highlighting (renders plain text, no Shiki). */
|
|
625
627
|
codeHighlight?: boolean;
|
|
628
|
+
/** Show the copy button. **Defaults to ON**, because this element is documented as shipping one. Opt out with `copy="false"` or `el.copy = false`. */
|
|
629
|
+
copy?: boolean;
|
|
626
630
|
/** Code text sizing. */
|
|
627
631
|
proseSize?: "xs" | "sm" | "base" | "lg";
|
|
628
632
|
}
|
|
@@ -734,19 +738,32 @@ export interface KaiContextElement extends HTMLElement {
|
|
|
734
738
|
dangerThreshold?: number;
|
|
735
739
|
}
|
|
736
740
|
|
|
741
|
+
export interface KaiConversationItemElement extends HTMLElement {
|
|
742
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
743
|
+
theme?: "light" | "dark" | "auto";
|
|
744
|
+
/** The row's identity, handed to the container's selection contract. In the element this is the `conversation-id` attribute (host `id` is the fallback). */
|
|
745
|
+
conversationId?: string;
|
|
746
|
+
/** Selected state. Reflected as `aria-current` on the row body and a `data-active` styling hook on the row; the container drives it from its `activeId`. */
|
|
747
|
+
active?: boolean;
|
|
748
|
+
/** Dense single-line row padding. */
|
|
749
|
+
compact?: boolean;
|
|
750
|
+
}
|
|
751
|
+
|
|
737
752
|
export interface KaiConversationsElement extends HTMLElement {
|
|
738
753
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
739
754
|
theme?: "light" | "dark" | "auto";
|
|
740
755
|
/** The list's section headers (`{ id, name, sortOrder, createdAt }`), rendered in array order. A group carries no conversations of its own; it is matched against `conversations` by id, so the two props are complementary rather than alternatives. Omit for an ungrouped list. Set as a JS property. */
|
|
741
756
|
groups: { id: string; userId?: string; teamId?: string; name: string; sortOrder: number; createdAt: string }[];
|
|
742
|
-
/** Every conversation the list renders, flat. Each one is filed under the group whose `id` equals its `groupId`; one with no `groupId`, or with a `groupId` matching no entry in `groups`, falls into a trailing "Ungrouped" section, so nothing you pass in is ever dropped. There is no recency bucketing. Set as a JS property. Omit to supply them as `<kai-conversation>` light-DOM children instead, or for the empty state. */
|
|
743
|
-
conversations: { id: string; title: string; groupId?: string; scope
|
|
757
|
+
/** Every conversation the list renders, flat. Each one is filed under the group whose `id` equals its `groupId`; one with no `groupId`, or with a `groupId` matching no entry in `groups`, falls into a trailing "Ungrouped" section, so nothing you pass in is ever dropped. There is no recency bucketing. Set as a JS property. Omit to supply them as `<kai-conversation>` light-DOM children instead, or for the empty state. A search query that matches nothing shows a visible "No conversations match your search" state, distinct from the zero-conversations empty state. Slotted `<kai-conversation-item>` children switch the list into item mode instead: your own rows win and this array is not rendered. */
|
|
758
|
+
conversations: { id: string; title: string; groupId?: string; scope?: { type: "document" | "collection"; documentId?: string; filters?: { tags?: string[]; authors?: string[]; contentType?: "transcript" | "markdown"; dateRange?: { from: string; to: string } } }; messageCount: number; lastMessageAt?: string; updatedAt: string; trailing?: string }[];
|
|
744
759
|
/** The id of the currently-open conversation, highlighted in the list. */
|
|
745
760
|
activeId?: string;
|
|
746
761
|
/** Controlled collapsed state. Set as a JS property (`el.collapsed = true`) to drive the rail from your app, updating it in response to `kai-collapse-toggle`. Omit for uncontrolled (the element manages it). Collapsed shrinks the rail to a floating reopen button. */
|
|
747
762
|
collapsed?: boolean;
|
|
748
763
|
/** Initial collapsed state when uncontrolled (default false). Use the `default-collapsed` attribute to start collapsed in plain HTML. */
|
|
749
764
|
defaultCollapsed?: boolean;
|
|
765
|
+
/** Dense single-line rows (a leading dot + title, no message count). */
|
|
766
|
+
compact?: boolean;
|
|
750
767
|
/** Focus the built-in search input inside the shadow root. */
|
|
751
768
|
focus(options?: FocusOptions): void;
|
|
752
769
|
/** Clear the internal search query (resets the list filter) and fire kai-search with an empty string. */
|
|
@@ -768,6 +785,8 @@ export interface KaiDialogElement extends HTMLElement {
|
|
|
768
785
|
open?: boolean;
|
|
769
786
|
/** Initial open state on mount (uncontrolled seed). */
|
|
770
787
|
defaultOpen?: boolean;
|
|
788
|
+
/** Accessible name for the modal, used when no `header` slot is projected: `<kai-dialog label="Delete workspace">`. A projected `header` WINS over this (it becomes `aria-labelledby`), because ARIA resolves `aria-labelledby` ahead of `aria-label` and the visible heading is the name both a sighted and a screen-reader user can be talked through. Defaults to `Dialog` so a modal is never nameless. */
|
|
789
|
+
label?: string;
|
|
771
790
|
/** Open it programmatically (no-op while disabled). */
|
|
772
791
|
show(): void;
|
|
773
792
|
/** Close it programmatically. */
|
|
@@ -778,6 +797,64 @@ export interface KaiDialogElement extends HTMLElement {
|
|
|
778
797
|
focus(options?: FocusOptions): void;
|
|
779
798
|
}
|
|
780
799
|
|
|
800
|
+
export interface KaiDockElement extends HTMLElement {
|
|
801
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
802
|
+
theme?: "light" | "dark" | "auto";
|
|
803
|
+
/** Drive/observe open state (Shoelace-style: settable + reflected to the `open` attribute; the element still self-manages on the launcher and Escape). Set `el.open = true`, or `<kai-dock open>`; listen for `kai-open-change`. */
|
|
804
|
+
open?: boolean;
|
|
805
|
+
/** Initial open state on mount (uncontrolled seed). */
|
|
806
|
+
defaultOpen?: boolean;
|
|
807
|
+
/** Which corner the dock sits in. Logical, so `-end` follows the writing direction and an RTL page docks on the left. Attribute: `position`. */
|
|
808
|
+
position?: "bottom-end" | "bottom-start" | "top-end" | "top-start";
|
|
809
|
+
/** The widget's NAME. Derives the panel's accessible name and both launcher names (`Open ${label}` / `Close ${label}`). Defaults to `Chat`. */
|
|
810
|
+
label?: string;
|
|
811
|
+
/** i18n override for the launcher's name while closed (default `Open ${label}`). */
|
|
812
|
+
openLabel?: string;
|
|
813
|
+
/** i18n override for the launcher's name while open (default `Close ${label}`). */
|
|
814
|
+
closeLabel?: string;
|
|
815
|
+
/** Show the unread dot. YOURS: it renders only while closed, and the dock never writes it back. Clear it in your `kai-open-change` handler. */
|
|
816
|
+
unread?: boolean;
|
|
817
|
+
/** Disable the launcher; `show()` and `toggle()` are gated on it. */
|
|
818
|
+
disabled?: boolean;
|
|
819
|
+
/** Where focus lands on open: `content` (default, the first element you slotted), `panel`, or `none`. Attribute: `focus-on-open`. */
|
|
820
|
+
focusOnOpen?: "content" | "panel" | "none";
|
|
821
|
+
/** Open it programmatically (no-op while disabled). */
|
|
822
|
+
show(): void;
|
|
823
|
+
/** Close it programmatically. */
|
|
824
|
+
hide(): void;
|
|
825
|
+
/** Flip the open state (closes while disabled). */
|
|
826
|
+
toggle(): void;
|
|
827
|
+
/** Move focus to the panel while open, or to the launcher while closed. */
|
|
828
|
+
focus(options?: FocusOptions): void;
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
export interface KaiDropdownElement extends HTMLElement {
|
|
832
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
833
|
+
theme?: "light" | "dark" | "auto";
|
|
834
|
+
/** Built-in trigger: leading icon (a named icon like `"plus"`, an image URL/data-URI, or text). A slotted `slot="trigger"` overrides it. */
|
|
835
|
+
triggerIcon?: string;
|
|
836
|
+
/** Built-in trigger: a text label. This is the trigger's VISIBLE text, so it is also its accessible name, and `label` does not override it: an accessible name that does not contain the visible text is unreachable by speech input (WCAG 2.5.3, Label in Name). Same rule `kai-menu` follows. */
|
|
837
|
+
triggerLabel?: string;
|
|
838
|
+
/** Built-in trigger: a trailing icon (e.g. `"chevron-down"` for a select look). */
|
|
839
|
+
triggerIconTrailing?: string;
|
|
840
|
+
/** Accessible name for a trigger with no visible label. Ignored when `triggerLabel` is set, which is already the visible name. It DOES name a slotted `slot="trigger"`, which is VISUAL content with the name supplied separately: the same two-slot distinction `kai-menu` documents. */
|
|
841
|
+
label?: string;
|
|
842
|
+
/** Stretch the trigger to the full width of its container (a block row). Attribute: `full`. */
|
|
843
|
+
full?: boolean;
|
|
844
|
+
/** Drive/observe open state (Shoelace-style: settable + reflected to the `open` attribute, the menu still self-manages on click/keyboard). Set `el.open = true`, or `<kai-dropdown open>`; listen for `kai-open-change`. */
|
|
845
|
+
open?: boolean;
|
|
846
|
+
/** Initial open state on mount (uncontrolled seed). */
|
|
847
|
+
defaultOpen?: boolean;
|
|
848
|
+
/** Disable the trigger: click/keyboard and `show()` no longer open the menu. */
|
|
849
|
+
disabled?: boolean;
|
|
850
|
+
/** Open it programmatically (no-op while disabled). */
|
|
851
|
+
show(): void;
|
|
852
|
+
/** Close it programmatically. */
|
|
853
|
+
hide(): void;
|
|
854
|
+
/** Flip the open state (closes while disabled). */
|
|
855
|
+
toggle(): void;
|
|
856
|
+
}
|
|
857
|
+
|
|
781
858
|
export interface KaiEditableLabelElement extends HTMLElement {
|
|
782
859
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
783
860
|
theme?: "light" | "dark" | "auto";
|
|
@@ -1034,6 +1111,8 @@ export interface KaiMenuElement extends HTMLElement {
|
|
|
1034
1111
|
triggerIconTrailing?: string;
|
|
1035
1112
|
/** Accessible name for a trigger with no visible label. Ignored when `triggerLabel` is set, which is already the visible name. It DOES name a slotted `slot="trigger"`, and that is a difference in what the two slots MEAN, not a limitation. `<kai-button>`'s slot IS the button's label, so text slotted there is the name and `label` steps aside. This slot is VISUAL content, a `+` or an `<svg>`, with the name supplied separately: decoration beside a name, never a second name competing with one. So `label` names the trigger here by design. Slotting a real WORD rather than a glyph makes that word a visible label, and an accessible name has to contain the visible text. Then either drop `label` or make it contain the word you slotted. */
|
|
1036
1113
|
label?: string;
|
|
1114
|
+
/** Stretch the trigger to the full width of the menu's container (a block row), e.g. a sidebar-footer account row. Same affordance as `<kai-button full>`. Attribute: `full`. */
|
|
1115
|
+
full?: boolean;
|
|
1037
1116
|
/** Drive/observe open state (Shoelace-style: settable + reflected to the `open` attribute, the menu still self-manages on click/keyboard). Set `el.open = true`, or `<kai-menu open>`; listen for `kai-open-change`. */
|
|
1038
1117
|
open?: boolean;
|
|
1039
1118
|
/** Initial open state on mount (uncontrolled seed). */
|
|
@@ -1218,8 +1297,8 @@ export interface KaiPromptInputElement extends HTMLElement {
|
|
|
1218
1297
|
suggestions?: string[];
|
|
1219
1298
|
/** What clicking a suggestion does: `'submit'` (default) sends it immediately as if typed and submitted; `'fill'` just places it in the input. */
|
|
1220
1299
|
suggestionMode?: "submit" | "fill";
|
|
1221
|
-
/** Show a
|
|
1222
|
-
|
|
1300
|
+
/** Show a web-search (Globe) button in the left toolbar; clicking it fires a `kai-web-search` event. Attribute: `web-search`. */
|
|
1301
|
+
webSearch?: boolean;
|
|
1223
1302
|
/** Show a Voice (Mic) button in the left toolbar; clicking it fires a `voice` event. */
|
|
1224
1303
|
voice?: boolean;
|
|
1225
1304
|
/** When set and `loading` is true, the send button is replaced by a Stop button (square icon, "Stop" aria-label). Clicking it fires `kai-stop`. */
|
|
@@ -1754,67 +1833,26 @@ export interface KaiVoiceOutputElement extends HTMLElement {
|
|
|
1754
1833
|
export interface KaiWorkspaceElement extends HTMLElement {
|
|
1755
1834
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
1756
1835
|
theme?: "light" | "dark" | "auto";
|
|
1757
|
-
/**
|
|
1758
|
-
|
|
1759
|
-
/**
|
|
1760
|
-
|
|
1761
|
-
/**
|
|
1762
|
-
|
|
1763
|
-
/**
|
|
1764
|
-
|
|
1765
|
-
|
|
1766
|
-
placeholder?: string;
|
|
1767
|
-
loading?: boolean;
|
|
1768
|
-
suggestions?: string[];
|
|
1769
|
-
suggestionMode?: "submit" | "fill";
|
|
1770
|
-
proseSize?: "xs" | "sm" | "base" | "lg";
|
|
1771
|
-
codeTheme?: string;
|
|
1772
|
-
codeHighlight?: boolean;
|
|
1773
|
-
chatTitle?: string;
|
|
1774
|
-
models?: { id: string; name: string; provider?: string; description?: string; group?: string }[];
|
|
1775
|
-
currentModel?: string;
|
|
1776
|
-
context?: { usedTokens: number; maxTokens: number; inputTokens?: number; outputTokens?: number; estimatedCost?: number };
|
|
1777
|
-
scrollButton?: boolean;
|
|
1778
|
-
search?: boolean;
|
|
1779
|
-
voice?: boolean;
|
|
1780
|
-
/** Rich entity triggers (`/` skills, `@` agents/plugins) forwarded to the input. */
|
|
1781
|
-
triggers?: { char: string; kind: string; items?: { id: string; label: string; icon?: string; description?: string; group?: string; kind?: string; promptText?: string; data?: Record<string, unknown> }[] }[];
|
|
1782
|
-
/** Default icon per entity kind (kind → image src) forwarded to the input. */
|
|
1783
|
-
kindIcons?: Record<string, string>;
|
|
1784
|
-
/** Sidebar default width as a percent of the workspace (default 26). */
|
|
1785
|
-
sidebarWidth?: number;
|
|
1786
|
-
/** Sidebar min width in px (default 240). */
|
|
1787
|
-
sidebarMinWidth?: number;
|
|
1788
|
-
/** Sidebar max width in px (default 420). */
|
|
1789
|
-
sidebarMaxWidth?: number;
|
|
1790
|
-
/** Controlled collapsed state. Set this as a JS property (`el.sidebarCollapsed = true`) to drive the sidebar from your app, updating it in response to the `kai-sidebar-toggle` event. Omit for uncontrolled (the element manages it). */
|
|
1791
|
-
sidebarCollapsed?: boolean;
|
|
1792
|
-
/** Initial collapsed state when uncontrolled (default false). Use the `default-sidebar-collapsed` attribute to start collapsed in plain HTML. */
|
|
1793
|
-
defaultSidebarCollapsed?: boolean;
|
|
1794
|
-
/** Auto-collapse the rail when the workspace's own width drops below this many px, and re-expand when it grows back above. Uncontrolled only (it never fights an app-driven `sidebarCollapsed`); omit to disable. Fires `kai-sidebar-toggle`. Attribute: `collapse-below`. */
|
|
1836
|
+
/** Controlled collapsed state of the start aside. Set this as a JS property (`el.startCollapsed = true`) to drive the aside from your app, updating it in response to the `kai-aside-toggle` event. Omit for uncontrolled (the element manages it). */
|
|
1837
|
+
startCollapsed?: boolean;
|
|
1838
|
+
/** Initial collapsed state of the start aside when uncontrolled (default false). Use the `default-start-collapsed` attribute to start collapsed in plain HTML. */
|
|
1839
|
+
defaultStartCollapsed?: boolean;
|
|
1840
|
+
/** Controlled collapsed state of the end aside. Set this as a JS property (`el.endCollapsed = true`) to drive the aside from your app, updating it in response to the `kai-aside-toggle` event. Omit for uncontrolled (the element manages it). */
|
|
1841
|
+
endCollapsed?: boolean;
|
|
1842
|
+
/** Initial collapsed state of the end aside when uncontrolled (default false). Use the `default-end-collapsed` attribute to start collapsed in plain HTML. */
|
|
1843
|
+
defaultEndCollapsed?: boolean;
|
|
1844
|
+
/** Auto-collapse both asides when the shell's own width drops below this many px, and re-expand when it grows back above. Applies to uncontrolled asides only (it never fights an app-driven collapsed prop); omit to disable. Fires `kai-aside-toggle`. Attribute: `collapse-below`. */
|
|
1795
1845
|
collapseBelow?: number;
|
|
1796
|
-
/**
|
|
1846
|
+
/** Below this shell width in px, an expanded aside renders as an overlay drawer over the main region instead of a column beside it. Escape inside the drawer closes it and returns focus to the element focused before it opened. Omit to disable. Attribute: `drawer-below`. */
|
|
1847
|
+
drawerBelow?: number;
|
|
1848
|
+
/** Density hint. Reflected as a `data-compact` hook on the root (and as the `compact` attribute on the element) for your CSS and slotted content; the shell itself keeps no other opinion about density. */
|
|
1797
1849
|
compact?: boolean;
|
|
1798
|
-
/**
|
|
1799
|
-
|
|
1800
|
-
/**
|
|
1801
|
-
|
|
1802
|
-
/**
|
|
1803
|
-
|
|
1804
|
-
/** Collapse/expand the conversation sidebar and fire `kai-sidebar-toggle`. */
|
|
1805
|
-
toggleSidebar(): void;
|
|
1806
|
-
/** Force the conversation sidebar collapsed (fires `kai-sidebar-toggle`). */
|
|
1807
|
-
collapseSidebar(): void;
|
|
1808
|
-
/** Force the conversation sidebar expanded (fires `kai-sidebar-toggle`). */
|
|
1809
|
-
expandSidebar(): void;
|
|
1810
|
-
/** Focus the thread's composer. */
|
|
1811
|
-
focus(options?: FocusOptions): void;
|
|
1812
|
-
/** Clear the thread draft + staged attachments. */
|
|
1813
|
-
clear(): void;
|
|
1814
|
-
/** Submit the current thread draft programmatically (fires `kai-submit`). */
|
|
1815
|
-
send(): void;
|
|
1816
|
-
/** Scroll the thread to the newest message. */
|
|
1817
|
-
scrollToBottom(behavior?: "auto" | "instant" | "smooth"): void;
|
|
1850
|
+
/** Collapse/expand one aside (fires `kai-aside-toggle`). */
|
|
1851
|
+
toggleAside(side: "start" | "end"): void;
|
|
1852
|
+
/** Force one aside collapsed (fires `kai-aside-toggle`). */
|
|
1853
|
+
collapseAside(side: "start" | "end"): void;
|
|
1854
|
+
/** Force one aside expanded (fires `kai-aside-toggle`). */
|
|
1855
|
+
expandAside(side: "start" | "end"): void;
|
|
1818
1856
|
}
|
|
1819
1857
|
|
|
1820
1858
|
declare global {
|
|
@@ -1839,8 +1877,11 @@ declare global {
|
|
|
1839
1877
|
'kai-composer': KaiComposerElement;
|
|
1840
1878
|
'kai-confirm': KaiConfirmElement;
|
|
1841
1879
|
'kai-context': KaiContextElement;
|
|
1880
|
+
'kai-conversation-item': KaiConversationItemElement;
|
|
1842
1881
|
'kai-conversations': KaiConversationsElement;
|
|
1843
1882
|
'kai-dialog': KaiDialogElement;
|
|
1883
|
+
'kai-dock': KaiDockElement;
|
|
1884
|
+
'kai-dropdown': KaiDropdownElement;
|
|
1844
1885
|
'kai-editable-label': KaiEditableLabelElement;
|
|
1845
1886
|
'kai-embed': KaiEmbedElement;
|
|
1846
1887
|
'kai-empty': KaiEmptyElement;
|
|
@@ -1937,8 +1978,11 @@ declare module 'react' {
|
|
|
1937
1978
|
'kai-composer': KaiElementJsxProps;
|
|
1938
1979
|
'kai-confirm': KaiElementJsxProps;
|
|
1939
1980
|
'kai-context': KaiElementJsxProps;
|
|
1981
|
+
'kai-conversation-item': KaiElementJsxProps;
|
|
1940
1982
|
'kai-conversations': KaiElementJsxProps;
|
|
1941
1983
|
'kai-dialog': KaiElementJsxProps;
|
|
1984
|
+
'kai-dock': KaiElementJsxProps;
|
|
1985
|
+
'kai-dropdown': KaiElementJsxProps;
|
|
1942
1986
|
'kai-editable-label': KaiElementJsxProps;
|
|
1943
1987
|
'kai-embed': KaiElementJsxProps;
|
|
1944
1988
|
'kai-empty': KaiElementJsxProps;
|
|
@@ -2097,12 +2141,14 @@ export interface KaiAudioVisualizerElementProps {
|
|
|
2097
2141
|
complexity?: number;
|
|
2098
2142
|
/** Setting this makes the element an announced image (`role="img"`) instead of decorative (`aria-hidden`). Attribute: `label`. */
|
|
2099
2143
|
label?: string;
|
|
2100
|
-
/** Live microphone or WebRTC audio to analyze. JS property only. */
|
|
2144
|
+
/** Live microphone or WebRTC audio to analyze. JS property only. NOTE: amplitude renders only while state is "speaking" unless listening-amplitude is set; every other state plays its scripted animation and ignores the audio. */
|
|
2101
2145
|
stream?: MediaStream;
|
|
2102
|
-
/** An `<audio>` or `<video>` element to tap for its audio. JS property only. */
|
|
2146
|
+
/** An `<audio>` or `<video>` element to tap for its audio. JS property only. NOTE: amplitude renders only while state is "speaking" unless listening-amplitude is set; every other state plays its scripted animation and ignores the audio. */
|
|
2103
2147
|
audioElement?: HTMLMediaElement;
|
|
2104
|
-
/** Pre-computed levels, 0..1. Set this and no AudioContext is ever built, which is what keeps headless/SSR rendering and browser-speech-synthesis playback (which exposes no audio node) free of Web Audio entirely. JS property only. A new array reference is required for each update; mutating the existing array in place will not re-render. */
|
|
2148
|
+
/** Pre-computed levels, 0..1. Set this and no AudioContext is ever built, which is what keeps headless/SSR rendering and browser-speech-synthesis playback (which exposes no audio node) free of Web Audio entirely. JS property only. A new array reference is required for each update; mutating the existing array in place will not re-render. NOTE: amplitude renders only while state is "speaking" unless listening-amplitude is set; every other state plays its scripted animation and ignores the audio. */
|
|
2105
2149
|
bands?: number[];
|
|
2150
|
+
/** Render live amplitude during the listening state as well, using the same presentation as speaking. Off by default, which keeps LiveKit parity: amplitude from stream, audio-element or bands renders only while state is "speaking". Set it to show a real mic-level picture while the user is the one talking. Boolean. Attribute: `listening-amplitude` (a bare attribute means true; reflected, so the property reads back what the attribute set). */
|
|
2151
|
+
listeningAmplitude?: boolean;
|
|
2106
2152
|
/** Custom fragment shader for `variant="custom"`. JS property only. */
|
|
2107
2153
|
shader?: { fragment: string; uniforms?: Record<string, { type: "1f" | "1i" | "1fv" | "2f" | "3f" | "3fv" | "4f" | "4fv" | "Matrix2fv" | "Matrix3fv" | "Matrix4fv"; value: number | number[] }> };
|
|
2108
2154
|
/** Shader variants only: keep animating while scrolled off screen. Off by default, which stops drawing and releases the WebGL context until the element comes back (browsers ration contexts to roughly 16 a page). Does not override `prefers-reduced-motion`. Attribute: `animate-when-not-visible`. */
|
|
@@ -2206,8 +2252,6 @@ export interface KaiChainOfThoughtElementProps {
|
|
|
2206
2252
|
export interface KaiChatElementProps {
|
|
2207
2253
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
2208
2254
|
theme?: "light" | "dark" | "auto";
|
|
2209
|
-
/** Show a Search (Globe) button in the input toolbar; fires a `search` event. */
|
|
2210
|
-
search?: boolean;
|
|
2211
2255
|
/** Value of the input. A **string** is controlled (the host owns the text and updates it on `kai-value-change`). A **ComposerDoc** is a one-time seed that pre-populates pills; the user then edits freely. Leave unset for uncontrolled. */
|
|
2212
2256
|
value?: string | ({ type: "text"; text: string } | { type: "entity"; entity: { kind: string; id: string; label: string; icon?: string; promptText?: string; data?: Record<string, unknown> } })[];
|
|
2213
2257
|
/** Placeholder text shown in the empty input. */
|
|
@@ -2252,6 +2296,8 @@ export interface KaiChatElementProps {
|
|
|
2252
2296
|
composerActions?: boolean;
|
|
2253
2297
|
/** INJECT: footer row below the composer (disclaimers, token meter, …). */
|
|
2254
2298
|
footer?: boolean;
|
|
2299
|
+
/** Show a web-search (Globe) button in the input toolbar; calls `onWebSearch`. */
|
|
2300
|
+
webSearch?: boolean;
|
|
2255
2301
|
/** Show a Voice (Mic) button in the input toolbar; fires a `voice` event. */
|
|
2256
2302
|
voice?: boolean;
|
|
2257
2303
|
/** Rich entity triggers. Each `{ char, kind, items }` opens a caret-anchored menu that inserts an atomic pill (`/` skills, `@` agents/plugins). Set as a JS property; forwarded to the input. */
|
|
@@ -2332,6 +2378,8 @@ export interface KaiCodeBlockElementProps {
|
|
|
2332
2378
|
codeTheme?: string;
|
|
2333
2379
|
/** Disable syntax highlighting (renders plain text, no Shiki). */
|
|
2334
2380
|
codeHighlight?: boolean;
|
|
2381
|
+
/** Show the copy button. **Defaults to ON**, because this element is documented as shipping one. Opt out with `copy="false"` or `el.copy = false`. */
|
|
2382
|
+
copy?: boolean;
|
|
2335
2383
|
/** Code text sizing. */
|
|
2336
2384
|
proseSize?: "xs" | "sm" | "base" | "lg";
|
|
2337
2385
|
}
|
|
@@ -2415,19 +2463,32 @@ export interface KaiContextElementProps {
|
|
|
2415
2463
|
dangerThreshold?: number;
|
|
2416
2464
|
}
|
|
2417
2465
|
|
|
2466
|
+
export interface KaiConversationItemElementProps {
|
|
2467
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
2468
|
+
theme?: "light" | "dark" | "auto";
|
|
2469
|
+
/** The row's identity, handed to the container's selection contract. In the element this is the `conversation-id` attribute (host `id` is the fallback). */
|
|
2470
|
+
conversationId?: string;
|
|
2471
|
+
/** Selected state. Reflected as `aria-current` on the row body and a `data-active` styling hook on the row; the container drives it from its `activeId`. */
|
|
2472
|
+
active?: boolean;
|
|
2473
|
+
/** Dense single-line row padding. */
|
|
2474
|
+
compact?: boolean;
|
|
2475
|
+
}
|
|
2476
|
+
|
|
2418
2477
|
export interface KaiConversationsElementProps {
|
|
2419
2478
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
2420
2479
|
theme?: "light" | "dark" | "auto";
|
|
2421
2480
|
/** The list's section headers (`{ id, name, sortOrder, createdAt }`), rendered in array order. A group carries no conversations of its own; it is matched against `conversations` by id, so the two props are complementary rather than alternatives. Omit for an ungrouped list. Set as a JS property. */
|
|
2422
2481
|
groups?: { id: string; userId?: string; teamId?: string; name: string; sortOrder: number; createdAt: string }[];
|
|
2423
|
-
/** Every conversation the list renders, flat. Each one is filed under the group whose `id` equals its `groupId`; one with no `groupId`, or with a `groupId` matching no entry in `groups`, falls into a trailing "Ungrouped" section, so nothing you pass in is ever dropped. There is no recency bucketing. Set as a JS property. Omit to supply them as `<kai-conversation>` light-DOM children instead, or for the empty state. */
|
|
2424
|
-
conversations?: { id: string; title: string; groupId?: string; scope
|
|
2482
|
+
/** Every conversation the list renders, flat. Each one is filed under the group whose `id` equals its `groupId`; one with no `groupId`, or with a `groupId` matching no entry in `groups`, falls into a trailing "Ungrouped" section, so nothing you pass in is ever dropped. There is no recency bucketing. Set as a JS property. Omit to supply them as `<kai-conversation>` light-DOM children instead, or for the empty state. A search query that matches nothing shows a visible "No conversations match your search" state, distinct from the zero-conversations empty state. Slotted `<kai-conversation-item>` children switch the list into item mode instead: your own rows win and this array is not rendered. */
|
|
2483
|
+
conversations?: { id: string; title: string; groupId?: string; scope?: { type: "document" | "collection"; documentId?: string; filters?: { tags?: string[]; authors?: string[]; contentType?: "transcript" | "markdown"; dateRange?: { from: string; to: string } } }; messageCount: number; lastMessageAt?: string; updatedAt: string; trailing?: string }[];
|
|
2425
2484
|
/** The id of the currently-open conversation, highlighted in the list. */
|
|
2426
2485
|
activeId?: string;
|
|
2427
2486
|
/** Controlled collapsed state. Set as a JS property (`el.collapsed = true`) to drive the rail from your app, updating it in response to `kai-collapse-toggle`. Omit for uncontrolled (the element manages it). Collapsed shrinks the rail to a floating reopen button. */
|
|
2428
2487
|
collapsed?: boolean;
|
|
2429
2488
|
/** Initial collapsed state when uncontrolled (default false). Use the `default-collapsed` attribute to start collapsed in plain HTML. */
|
|
2430
2489
|
defaultCollapsed?: boolean;
|
|
2490
|
+
/** Dense single-line rows (a leading dot + title, no message count). */
|
|
2491
|
+
compact?: boolean;
|
|
2431
2492
|
}
|
|
2432
2493
|
|
|
2433
2494
|
export interface KaiDialogElementProps {
|
|
@@ -2437,6 +2498,52 @@ export interface KaiDialogElementProps {
|
|
|
2437
2498
|
open?: boolean;
|
|
2438
2499
|
/** Initial open state on mount (uncontrolled seed). */
|
|
2439
2500
|
defaultOpen?: boolean;
|
|
2501
|
+
/** Accessible name for the modal, used when no `header` slot is projected: `<kai-dialog label="Delete workspace">`. A projected `header` WINS over this (it becomes `aria-labelledby`), because ARIA resolves `aria-labelledby` ahead of `aria-label` and the visible heading is the name both a sighted and a screen-reader user can be talked through. Defaults to `Dialog` so a modal is never nameless. */
|
|
2502
|
+
label?: string;
|
|
2503
|
+
}
|
|
2504
|
+
|
|
2505
|
+
export interface KaiDockElementProps {
|
|
2506
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
2507
|
+
theme?: "light" | "dark" | "auto";
|
|
2508
|
+
/** Drive/observe open state (Shoelace-style: settable + reflected to the `open` attribute; the element still self-manages on the launcher and Escape). Set `el.open = true`, or `<kai-dock open>`; listen for `kai-open-change`. */
|
|
2509
|
+
open?: boolean;
|
|
2510
|
+
/** Initial open state on mount (uncontrolled seed). */
|
|
2511
|
+
defaultOpen?: boolean;
|
|
2512
|
+
/** Which corner the dock sits in. Logical, so `-end` follows the writing direction and an RTL page docks on the left. Attribute: `position`. */
|
|
2513
|
+
position?: "bottom-end" | "bottom-start" | "top-end" | "top-start";
|
|
2514
|
+
/** The widget's NAME. Derives the panel's accessible name and both launcher names (`Open ${label}` / `Close ${label}`). Defaults to `Chat`. */
|
|
2515
|
+
label?: string;
|
|
2516
|
+
/** i18n override for the launcher's name while closed (default `Open ${label}`). */
|
|
2517
|
+
openLabel?: string;
|
|
2518
|
+
/** i18n override for the launcher's name while open (default `Close ${label}`). */
|
|
2519
|
+
closeLabel?: string;
|
|
2520
|
+
/** Show the unread dot. YOURS: it renders only while closed, and the dock never writes it back. Clear it in your `kai-open-change` handler. */
|
|
2521
|
+
unread?: boolean;
|
|
2522
|
+
/** Disable the launcher; `show()` and `toggle()` are gated on it. */
|
|
2523
|
+
disabled?: boolean;
|
|
2524
|
+
/** Where focus lands on open: `content` (default, the first element you slotted), `panel`, or `none`. Attribute: `focus-on-open`. */
|
|
2525
|
+
focusOnOpen?: "content" | "panel" | "none";
|
|
2526
|
+
}
|
|
2527
|
+
|
|
2528
|
+
export interface KaiDropdownElementProps {
|
|
2529
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
2530
|
+
theme?: "light" | "dark" | "auto";
|
|
2531
|
+
/** Built-in trigger: leading icon (a named icon like `"plus"`, an image URL/data-URI, or text). A slotted `slot="trigger"` overrides it. */
|
|
2532
|
+
triggerIcon?: string;
|
|
2533
|
+
/** Built-in trigger: a text label. This is the trigger's VISIBLE text, so it is also its accessible name, and `label` does not override it: an accessible name that does not contain the visible text is unreachable by speech input (WCAG 2.5.3, Label in Name). Same rule `kai-menu` follows. */
|
|
2534
|
+
triggerLabel?: string;
|
|
2535
|
+
/** Built-in trigger: a trailing icon (e.g. `"chevron-down"` for a select look). */
|
|
2536
|
+
triggerIconTrailing?: string;
|
|
2537
|
+
/** Accessible name for a trigger with no visible label. Ignored when `triggerLabel` is set, which is already the visible name. It DOES name a slotted `slot="trigger"`, which is VISUAL content with the name supplied separately: the same two-slot distinction `kai-menu` documents. */
|
|
2538
|
+
label?: string;
|
|
2539
|
+
/** Stretch the trigger to the full width of its container (a block row). Attribute: `full`. */
|
|
2540
|
+
full?: boolean;
|
|
2541
|
+
/** Drive/observe open state (Shoelace-style: settable + reflected to the `open` attribute, the menu still self-manages on click/keyboard). Set `el.open = true`, or `<kai-dropdown open>`; listen for `kai-open-change`. */
|
|
2542
|
+
open?: boolean;
|
|
2543
|
+
/** Initial open state on mount (uncontrolled seed). */
|
|
2544
|
+
defaultOpen?: boolean;
|
|
2545
|
+
/** Disable the trigger: click/keyboard and `show()` no longer open the menu. */
|
|
2546
|
+
disabled?: boolean;
|
|
2440
2547
|
}
|
|
2441
2548
|
|
|
2442
2549
|
export interface KaiEditableLabelElementProps {
|
|
@@ -2665,6 +2772,8 @@ export interface KaiMenuElementProps {
|
|
|
2665
2772
|
triggerIconTrailing?: string;
|
|
2666
2773
|
/** Accessible name for a trigger with no visible label. Ignored when `triggerLabel` is set, which is already the visible name. It DOES name a slotted `slot="trigger"`, and that is a difference in what the two slots MEAN, not a limitation. `<kai-button>`'s slot IS the button's label, so text slotted there is the name and `label` steps aside. This slot is VISUAL content, a `+` or an `<svg>`, with the name supplied separately: decoration beside a name, never a second name competing with one. So `label` names the trigger here by design. Slotting a real WORD rather than a glyph makes that word a visible label, and an accessible name has to contain the visible text. Then either drop `label` or make it contain the word you slotted. */
|
|
2667
2774
|
label?: string;
|
|
2775
|
+
/** Stretch the trigger to the full width of the menu's container (a block row), e.g. a sidebar-footer account row. Same affordance as `<kai-button full>`. Attribute: `full`. */
|
|
2776
|
+
full?: boolean;
|
|
2668
2777
|
/** Drive/observe open state (Shoelace-style: settable + reflected to the `open` attribute, the menu still self-manages on click/keyboard). Set `el.open = true`, or `<kai-menu open>`; listen for `kai-open-change`. */
|
|
2669
2778
|
open?: boolean;
|
|
2670
2779
|
/** Initial open state on mount (uncontrolled seed). */
|
|
@@ -2823,8 +2932,8 @@ export interface KaiPromptInputElementProps {
|
|
|
2823
2932
|
suggestions?: string[];
|
|
2824
2933
|
/** What clicking a suggestion does: `'submit'` (default) sends it immediately as if typed and submitted; `'fill'` just places it in the input. */
|
|
2825
2934
|
suggestionMode?: "submit" | "fill";
|
|
2826
|
-
/** Show a
|
|
2827
|
-
|
|
2935
|
+
/** Show a web-search (Globe) button in the left toolbar; clicking it fires a `kai-web-search` event. Attribute: `web-search`. */
|
|
2936
|
+
webSearch?: boolean;
|
|
2828
2937
|
/** Show a Voice (Mic) button in the left toolbar; clicking it fires a `voice` event. */
|
|
2829
2938
|
voice?: boolean;
|
|
2830
2939
|
/** When set and `loading` is true, the send button is replaced by a Stop button (square icon, "Stop" aria-label). Clicking it fires `kai-stop`. */
|
|
@@ -3277,53 +3386,20 @@ export interface KaiVoiceOutputElementProps {
|
|
|
3277
3386
|
export interface KaiWorkspaceElementProps {
|
|
3278
3387
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
3279
3388
|
theme?: "light" | "dark" | "auto";
|
|
3280
|
-
/**
|
|
3281
|
-
|
|
3282
|
-
/**
|
|
3283
|
-
|
|
3284
|
-
/**
|
|
3285
|
-
|
|
3286
|
-
/**
|
|
3287
|
-
|
|
3288
|
-
|
|
3289
|
-
placeholder?: string;
|
|
3290
|
-
loading?: boolean;
|
|
3291
|
-
suggestions?: string[];
|
|
3292
|
-
suggestionMode?: "submit" | "fill";
|
|
3293
|
-
proseSize?: "xs" | "sm" | "base" | "lg";
|
|
3294
|
-
codeTheme?: string;
|
|
3295
|
-
codeHighlight?: boolean;
|
|
3296
|
-
chatTitle?: string;
|
|
3297
|
-
models?: { id: string; name: string; provider?: string; description?: string; group?: string }[];
|
|
3298
|
-
currentModel?: string;
|
|
3299
|
-
context?: { usedTokens: number; maxTokens: number; inputTokens?: number; outputTokens?: number; estimatedCost?: number };
|
|
3300
|
-
scrollButton?: boolean;
|
|
3301
|
-
search?: boolean;
|
|
3302
|
-
voice?: boolean;
|
|
3303
|
-
/** Rich entity triggers (`/` skills, `@` agents/plugins) forwarded to the input. */
|
|
3304
|
-
triggers?: { char: string; kind: string; items?: { id: string; label: string; icon?: string; description?: string; group?: string; kind?: string; promptText?: string; data?: Record<string, unknown> }[] }[];
|
|
3305
|
-
/** Default icon per entity kind (kind → image src) forwarded to the input. */
|
|
3306
|
-
kindIcons?: Record<string, string>;
|
|
3307
|
-
/** Sidebar default width as a percent of the workspace (default 26). */
|
|
3308
|
-
sidebarWidth?: number;
|
|
3309
|
-
/** Sidebar min width in px (default 240). */
|
|
3310
|
-
sidebarMinWidth?: number;
|
|
3311
|
-
/** Sidebar max width in px (default 420). */
|
|
3312
|
-
sidebarMaxWidth?: number;
|
|
3313
|
-
/** Controlled collapsed state. Set this as a JS property (`el.sidebarCollapsed = true`) to drive the sidebar from your app, updating it in response to the `kai-sidebar-toggle` event. Omit for uncontrolled (the element manages it). */
|
|
3314
|
-
sidebarCollapsed?: boolean;
|
|
3315
|
-
/** Initial collapsed state when uncontrolled (default false). Use the `default-sidebar-collapsed` attribute to start collapsed in plain HTML. */
|
|
3316
|
-
defaultSidebarCollapsed?: boolean;
|
|
3317
|
-
/** Auto-collapse the rail when the workspace's own width drops below this many px, and re-expand when it grows back above. Uncontrolled only (it never fights an app-driven `sidebarCollapsed`); omit to disable. Fires `kai-sidebar-toggle`. Attribute: `collapse-below`. */
|
|
3389
|
+
/** Controlled collapsed state of the start aside. Set this as a JS property (`el.startCollapsed = true`) to drive the aside from your app, updating it in response to the `kai-aside-toggle` event. Omit for uncontrolled (the element manages it). */
|
|
3390
|
+
startCollapsed?: boolean;
|
|
3391
|
+
/** Initial collapsed state of the start aside when uncontrolled (default false). Use the `default-start-collapsed` attribute to start collapsed in plain HTML. */
|
|
3392
|
+
defaultStartCollapsed?: boolean;
|
|
3393
|
+
/** Controlled collapsed state of the end aside. Set this as a JS property (`el.endCollapsed = true`) to drive the aside from your app, updating it in response to the `kai-aside-toggle` event. Omit for uncontrolled (the element manages it). */
|
|
3394
|
+
endCollapsed?: boolean;
|
|
3395
|
+
/** Initial collapsed state of the end aside when uncontrolled (default false). Use the `default-end-collapsed` attribute to start collapsed in plain HTML. */
|
|
3396
|
+
defaultEndCollapsed?: boolean;
|
|
3397
|
+
/** Auto-collapse both asides when the shell's own width drops below this many px, and re-expand when it grows back above. Applies to uncontrolled asides only (it never fights an app-driven collapsed prop); omit to disable. Fires `kai-aside-toggle`. Attribute: `collapse-below`. */
|
|
3318
3398
|
collapseBelow?: number;
|
|
3319
|
-
/**
|
|
3399
|
+
/** Below this shell width in px, an expanded aside renders as an overlay drawer over the main region instead of a column beside it. Escape inside the drawer closes it and returns focus to the element focused before it opened. Omit to disable. Attribute: `drawer-below`. */
|
|
3400
|
+
drawerBelow?: number;
|
|
3401
|
+
/** Density hint. Reflected as a `data-compact` hook on the root (and as the `compact` attribute on the element) for your CSS and slotted content; the shell itself keeps no other opinion about density. */
|
|
3320
3402
|
compact?: boolean;
|
|
3321
|
-
/** Suppress the built-in ConversationList so the `sidebar-header` slot owns the whole rail flex region (for apps that supply their own rail nav). Default false. Attribute: `no-conversations`. */
|
|
3322
|
-
noConversations?: boolean;
|
|
3323
|
-
/** Optional card type -> custom-element tag overrides/additions for `card` parts (merged over the built-ins). Property: `el.cardTypes`. Typed as a plain string map (not the `CardTagMap` alias) so the generated React wrapper inlines it instead of emitting an unresolved named type. */
|
|
3324
|
-
cardTypes?: Record<string, string>;
|
|
3325
|
-
/** JSON Schemas for the card types this app renders, keyed by envelope type. The companion of `cardTypes`, which says what DRAWS a card while this says what a VALID one looks like. An OBJECT, so it is a JS property only: `el.cardSchemas = { 'pricing-table': pricingSchema }`, never an attribute. `createCardRegistry(...).validationSchemas` is exactly this shape. Without it the kit validates its own seven built-ins and leaves your own card type, the one your app actually cares about, as the only unchecked thing on screen. A schema here WINS over a built-in of the same name. Typed `Record<string, object>` rather than `Record<string, JsonSchema>` deliberately: an imported `.json` schema widens `"type"` to `string`, and an authored one carries `$schema`/`title`/`description`/`additionalProperties`, so the tighter type would reject both of the normal ways to supply one. */
|
|
3326
|
-
cardSchemas?: Record<string, object>;
|
|
3327
3403
|
}
|
|
3328
3404
|
|
|
3329
3405
|
export interface KaiAgentCardElementEvents {
|
|
@@ -3394,8 +3470,6 @@ export interface KaiChatElementEvents {
|
|
|
3394
3470
|
onKaiMessageAction?: (event: CustomEvent<{ messageId: string; action: string; state?: undefined | "on" | "off" }>) => void;
|
|
3395
3471
|
/** The header model switcher changed. */
|
|
3396
3472
|
onKaiModelChange?: (event: CustomEvent<{ modelId: string }>) => void;
|
|
3397
|
-
/** The Search button was clicked. */
|
|
3398
|
-
onKaiSearch?: (event: CustomEvent<Record<string, never>>) => void;
|
|
3399
3473
|
/** User submitted a message. */
|
|
3400
3474
|
onKaiSubmit?: (event: CustomEvent<{ value: string; attachments: { id: string; type: "file" | "source-document"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[] }>) => void;
|
|
3401
3475
|
/** A suggestion chip was clicked (only in `suggestion-mode="fill"`). */
|
|
@@ -3404,6 +3478,8 @@ export interface KaiChatElementEvents {
|
|
|
3404
3478
|
onKaiValueChange?: (event: CustomEvent<{ value: string }>) => void;
|
|
3405
3479
|
/** The Mic / voice button was clicked. */
|
|
3406
3480
|
onKaiVoice?: (event: CustomEvent<Record<string, never>>) => void;
|
|
3481
|
+
/** The web-search (Globe) toolbar button was clicked. */
|
|
3482
|
+
onKaiWebSearch?: (event: CustomEvent<Record<string, never>>) => void;
|
|
3407
3483
|
}
|
|
3408
3484
|
|
|
3409
3485
|
export interface KaiCheckpointElementEvents {
|
|
@@ -3473,10 +3549,14 @@ export interface KaiContextElementEvents {
|
|
|
3473
3549
|
onKaiThresholdChange?: (event: CustomEvent<{ level: "ok" | "warn" | "danger" }>) => void;
|
|
3474
3550
|
}
|
|
3475
3551
|
|
|
3552
|
+
export interface KaiConversationItemElementEvents {
|
|
3553
|
+
|
|
3554
|
+
}
|
|
3555
|
+
|
|
3476
3556
|
export interface KaiConversationsElementEvents {
|
|
3477
3557
|
/** The rail was collapsed or expanded (via the toggle, the reopen button, or a `collapse()`/`expand()`/`toggle()` call). */
|
|
3478
3558
|
onKaiCollapseToggle?: (event: CustomEvent<{ collapsed: boolean }>) => void;
|
|
3479
|
-
/** A conversation was selected. */
|
|
3559
|
+
/** A conversation was selected. The selection event in BOTH modes: a batteries data row, or an activated `<kai-conversation-item>` child (click, Enter or Space). */
|
|
3480
3560
|
onKaiConversationSelect?: (event: CustomEvent<{ id: string }>) => void;
|
|
3481
3561
|
/** The "New chat" button was clicked. */
|
|
3482
3562
|
onKaiNewChat?: (event: CustomEvent<Record<string, never>>) => void;
|
|
@@ -3491,6 +3571,16 @@ export interface KaiDialogElementEvents {
|
|
|
3491
3571
|
onKaiOpenChange?: (event: CustomEvent<{ open: boolean }>) => void;
|
|
3492
3572
|
}
|
|
3493
3573
|
|
|
3574
|
+
export interface KaiDockElementEvents {
|
|
3575
|
+
/** The dock opened or closed (the launcher, Escape, a driven `open`, or a method). */
|
|
3576
|
+
onKaiOpenChange?: (event: CustomEvent<{ open: boolean }>) => void;
|
|
3577
|
+
}
|
|
3578
|
+
|
|
3579
|
+
export interface KaiDropdownElementEvents {
|
|
3580
|
+
/** The menu opened or closed (click, keyboard, Escape, outside-click, or a method). */
|
|
3581
|
+
onKaiOpenChange?: (event: CustomEvent<{ open: boolean }>) => void;
|
|
3582
|
+
}
|
|
3583
|
+
|
|
3494
3584
|
export interface KaiEditableLabelElementEvents {
|
|
3495
3585
|
/** Edit was cancelled (Esc); the text is restored. */
|
|
3496
3586
|
onKaiCancel?: (event: CustomEvent<Record<string, never>>) => void;
|
|
@@ -3635,8 +3725,6 @@ export interface KaiPromptDockElementEvents {
|
|
|
3635
3725
|
export interface KaiPromptInputElementEvents {
|
|
3636
3726
|
/** The staged attachments changed: a file was added (via the paperclip) or removed (per-chip ×). Carries the full current list so a consumer can react in real time (validate, show upload progress, toggle the send button). */
|
|
3637
3727
|
onKaiAttachmentsChange?: (event: CustomEvent<{ attachments: { id: string; type: "file" | "source-document"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[] }>) => void;
|
|
3638
|
-
/** The Search (Globe) toolbar button was clicked. */
|
|
3639
|
-
onKaiSearch?: (event: CustomEvent<Record<string, never>>) => void;
|
|
3640
3728
|
/** The Stop button was clicked while `stoppable` and `loading` are both true. */
|
|
3641
3729
|
onKaiStop?: (event: CustomEvent<Record<string, never>>) => void;
|
|
3642
3730
|
/** The user submitted the prompt (Enter or send button). `value` is the flattened text (back-compat); `doc` is the structured document and `entities` the inserted pills (skills/agents) for downstream expansion. */
|
|
@@ -3649,6 +3737,8 @@ export interface KaiPromptInputElementEvents {
|
|
|
3649
3737
|
onKaiValueChange?: (event: CustomEvent<{ value: string; doc: ({ type: "text"; text: string } | { type: "entity"; entity: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> } })[]; entities: { kind: string; id: string; label: string; icon?: undefined | string; promptText?: undefined | string; data?: undefined | Record<string, unknown> }[] }>) => void;
|
|
3650
3738
|
/** The Voice (Mic) toolbar button was clicked. */
|
|
3651
3739
|
onKaiVoice?: (event: CustomEvent<Record<string, never>>) => void;
|
|
3740
|
+
/** The web-search (Globe) toolbar button was clicked. */
|
|
3741
|
+
onKaiWebSearch?: (event: CustomEvent<Record<string, never>>) => void;
|
|
3652
3742
|
}
|
|
3653
3743
|
|
|
3654
3744
|
export interface KaiReasoningElementEvents {
|
|
@@ -3809,36 +3899,24 @@ export interface KaiVoiceInputElementEvents {
|
|
|
3809
3899
|
onKaiTranscriptInterim?: (event: CustomEvent<{ text: string }>) => void;
|
|
3810
3900
|
/** Final transcript: the `transcribe` property resolved, OR native `SpeechRecognition` produced final text (no `transcribe` set). */
|
|
3811
3901
|
onKaiTranscription?: (event: CustomEvent<{ text: string }>) => void;
|
|
3902
|
+
/** A voice session failed, so no failure is ever silent. `detail.source` names the failing side (`recognition` on `<kai-voice-input>`, `synthesis` on `<kai-voice-output>`), `detail.error` carries the platform error code, the thrown exception's name, or `no-result` when recognition ended with no error and no text (the user said nothing), and `detail.message` is human-readable. Deliberate cancellation does not fire. */
|
|
3903
|
+
onKaiVoiceError?: (event: CustomEvent<{ source: "recognition"; error: string; message: string }>) => void;
|
|
3812
3904
|
}
|
|
3813
3905
|
|
|
3814
3906
|
export interface KaiVoiceOutputElementEvents {
|
|
3815
|
-
/** Playback started or stopped. Drive your own UI in sync. Fires on real transitions only (manual click and programmatic speak()/stop()), never on mount. */
|
|
3907
|
+
/** Playback started or stopped. Drive your own UI in sync. `speaking: true` fires when audio actually starts (utterance.onstart natively; audio playback beginning on the `synthesize` path), not when speak() is called; earlier releases fired it optimistically inside speak() itself. Fires on real transitions only (manual click and programmatic speak()/stop()), never on mount. */
|
|
3816
3908
|
onKaiSpeakingChange?: (event: CustomEvent<{ speaking: boolean }>) => void;
|
|
3817
3909
|
/** The model path (`synthesize`) resolved audio: the raw `Blob` before playback. */
|
|
3818
3910
|
onKaiSynthesized?: (event: CustomEvent<{ blob: Blob }>) => void;
|
|
3911
|
+
/** A voice session failed, so no failure is ever silent. `detail.source` names the failing side (`recognition` on `<kai-voice-input>`, `synthesis` on `<kai-voice-output>`), `detail.error` carries the platform error code, the thrown exception's name, or `no-result` when recognition ended with no error and no text (the user said nothing), and `detail.message` is human-readable. Deliberate cancellation does not fire. */
|
|
3912
|
+
onKaiVoiceError?: (event: CustomEvent<{ source: "synthesis"; error: string; message: string }>) => void;
|
|
3819
3913
|
}
|
|
3820
3914
|
|
|
3821
3915
|
export interface KaiWorkspaceElementEvents {
|
|
3822
|
-
/**
|
|
3823
|
-
|
|
3824
|
-
/** An
|
|
3825
|
-
|
|
3826
|
-
/** The header model switcher changed. */
|
|
3827
|
-
onKaiModelChange?: (event: CustomEvent<{ modelId: string }>) => void;
|
|
3828
|
-
/** The "New chat" button was clicked. */
|
|
3829
|
-
onKaiNewChat?: (event: CustomEvent<Record<string, never>>) => void;
|
|
3830
|
-
/** The Search button was clicked. */
|
|
3831
|
-
onKaiSearch?: (event: CustomEvent<Record<string, never>>) => void;
|
|
3832
|
-
/** The sidebar was collapsed or expanded. */
|
|
3833
|
-
onKaiSidebarToggle?: (event: CustomEvent<{ collapsed: boolean }>) => void;
|
|
3834
|
-
/** User submitted a message. */
|
|
3835
|
-
onKaiSubmit?: (event: CustomEvent<{ value: string; attachments: { id: string; type: "file" | "source-document"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[] }>) => void;
|
|
3836
|
-
/** A suggestion chip was clicked (only in `suggestion-mode="fill"`). */
|
|
3837
|
-
onKaiSuggestionClick?: (event: CustomEvent<{ value: string }>) => void;
|
|
3838
|
-
/** Fired on every input change. */
|
|
3839
|
-
onKaiValueChange?: (event: CustomEvent<{ value: string }>) => void;
|
|
3840
|
-
/** The Mic / voice button was clicked. */
|
|
3841
|
-
onKaiVoice?: (event: CustomEvent<Record<string, never>>) => void;
|
|
3916
|
+
/** The aside was resized (fires per drag step, keyboard nudge, or a handle double-click reset), width in px. */
|
|
3917
|
+
onKaiAsideResize?: (event: CustomEvent<{ side: "start" | "end"; width: number }>) => void;
|
|
3918
|
+
/** An aside collapsed or expanded (a method, the breakpoint, the drawer's Escape). */
|
|
3919
|
+
onKaiAsideToggle?: (event: CustomEvent<{ side: "start" | "end"; collapsed: boolean }>) => void;
|
|
3842
3920
|
}
|
|
3843
3921
|
|
|
3844
3922
|
/** Attributes every kai-* element tolerates in a Vue template on top of its own
|
|
@@ -3898,10 +3976,16 @@ declare module 'vue' {
|
|
|
3898
3976
|
KaiConfirm: KaiVueElement<KaiConfirmElementProps, KaiConfirmElementEvents>;
|
|
3899
3977
|
'kai-context': KaiVueElement<KaiContextElementProps, KaiContextElementEvents>;
|
|
3900
3978
|
KaiContext: KaiVueElement<KaiContextElementProps, KaiContextElementEvents>;
|
|
3979
|
+
'kai-conversation-item': KaiVueElement<KaiConversationItemElementProps, KaiConversationItemElementEvents>;
|
|
3980
|
+
KaiConversationItem: KaiVueElement<KaiConversationItemElementProps, KaiConversationItemElementEvents>;
|
|
3901
3981
|
'kai-conversations': KaiVueElement<KaiConversationsElementProps, KaiConversationsElementEvents>;
|
|
3902
3982
|
KaiConversations: KaiVueElement<KaiConversationsElementProps, KaiConversationsElementEvents>;
|
|
3903
3983
|
'kai-dialog': KaiVueElement<KaiDialogElementProps, KaiDialogElementEvents>;
|
|
3904
3984
|
KaiDialog: KaiVueElement<KaiDialogElementProps, KaiDialogElementEvents>;
|
|
3985
|
+
'kai-dock': KaiVueElement<KaiDockElementProps, KaiDockElementEvents>;
|
|
3986
|
+
KaiDock: KaiVueElement<KaiDockElementProps, KaiDockElementEvents>;
|
|
3987
|
+
'kai-dropdown': KaiVueElement<KaiDropdownElementProps, KaiDropdownElementEvents>;
|
|
3988
|
+
KaiDropdown: KaiVueElement<KaiDropdownElementProps, KaiDropdownElementEvents>;
|
|
3905
3989
|
'kai-editable-label': KaiVueElement<KaiEditableLabelElementProps, KaiEditableLabelElementEvents>;
|
|
3906
3990
|
KaiEditableLabel: KaiVueElement<KaiEditableLabelElementProps, KaiEditableLabelElementEvents>;
|
|
3907
3991
|
'kai-embed': KaiVueElement<KaiEmbedElementProps, KaiEmbedElementEvents>;
|