@kitn.ai/ui 0.25.1 → 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 +5 -7
- 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 +27 -7
- 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
|
@@ -237,12 +237,14 @@ export interface KaiAudioVisualizerElement extends HTMLElement {
|
|
|
237
237
|
complexity?: number;
|
|
238
238
|
/** Setting this makes the element an announced image (`role="img"`) instead of decorative (`aria-hidden`). Attribute: `label`. */
|
|
239
239
|
label?: string;
|
|
240
|
-
/** Live microphone or WebRTC audio to analyze. JS property only. */
|
|
240
|
+
/** 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. */
|
|
241
241
|
stream?: MediaStream;
|
|
242
|
-
/** An `<audio>` or `<video>` element to tap for its audio. JS property only. */
|
|
242
|
+
/** 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. */
|
|
243
243
|
audioElement?: HTMLMediaElement;
|
|
244
|
-
/** 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. */
|
|
244
|
+
/** 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. */
|
|
245
245
|
bands?: number[];
|
|
246
|
+
/** 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). */
|
|
247
|
+
listeningAmplitude?: boolean;
|
|
246
248
|
/** Custom fragment shader for `variant="custom"`. JS property only. */
|
|
247
249
|
shader?: { fragment: string; uniforms?: Record<string, { type: "1f" | "1i" | "1fv" | "2f" | "3f" | "3fv" | "4f" | "4fv" | "Matrix2fv" | "Matrix3fv" | "Matrix4fv"; value: number | number[] }> };
|
|
248
250
|
/** 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`. */
|
|
@@ -364,8 +366,6 @@ export interface KaiChainOfThoughtElement extends HTMLElement {
|
|
|
364
366
|
export interface KaiChatElement extends HTMLElement {
|
|
365
367
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
366
368
|
theme?: "light" | "dark" | "auto";
|
|
367
|
-
/** Show a Search (Globe) button in the input toolbar; fires a `search` event. */
|
|
368
|
-
search?: boolean;
|
|
369
369
|
/** 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. */
|
|
370
370
|
value?: string | ({ type: "text"; text: string } | { type: "entity"; entity: { kind: string; id: string; label: string; icon?: string; promptText?: string; data?: Record<string, unknown> } })[];
|
|
371
371
|
/** Placeholder text shown in the empty input. */
|
|
@@ -410,6 +410,8 @@ export interface KaiChatElement extends HTMLElement {
|
|
|
410
410
|
composerActions?: boolean;
|
|
411
411
|
/** INJECT: footer row below the composer (disclaimers, token meter, …). */
|
|
412
412
|
footer?: boolean;
|
|
413
|
+
/** Show a web-search (Globe) button in the input toolbar; calls `onWebSearch`. */
|
|
414
|
+
webSearch?: boolean;
|
|
413
415
|
/** Show a Voice (Mic) button in the input toolbar; fires a `voice` event. */
|
|
414
416
|
voice?: boolean;
|
|
415
417
|
/** 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. */
|
|
@@ -516,6 +518,8 @@ export interface KaiCodeBlockElement extends HTMLElement {
|
|
|
516
518
|
codeTheme?: string;
|
|
517
519
|
/** Disable syntax highlighting (renders plain text, no Shiki). */
|
|
518
520
|
codeHighlight?: boolean;
|
|
521
|
+
/** Show the copy button. **Defaults to ON**, because this element is documented as shipping one. Opt out with `copy="false"` or `el.copy = false`. */
|
|
522
|
+
copy?: boolean;
|
|
519
523
|
/** Code text sizing. */
|
|
520
524
|
proseSize?: "xs" | "sm" | "base" | "lg";
|
|
521
525
|
}
|
|
@@ -627,19 +631,32 @@ export interface KaiContextElement extends HTMLElement {
|
|
|
627
631
|
dangerThreshold?: number;
|
|
628
632
|
}
|
|
629
633
|
|
|
634
|
+
export interface KaiConversationItemElement extends HTMLElement {
|
|
635
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
636
|
+
theme?: "light" | "dark" | "auto";
|
|
637
|
+
/** 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). */
|
|
638
|
+
conversationId?: string;
|
|
639
|
+
/** 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`. */
|
|
640
|
+
active?: boolean;
|
|
641
|
+
/** Dense single-line row padding. */
|
|
642
|
+
compact?: boolean;
|
|
643
|
+
}
|
|
644
|
+
|
|
630
645
|
export interface KaiConversationsElement extends HTMLElement {
|
|
631
646
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
632
647
|
theme?: "light" | "dark" | "auto";
|
|
633
648
|
/** 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. */
|
|
634
649
|
groups: { id: string; userId?: string; teamId?: string; name: string; sortOrder: number; createdAt: string }[];
|
|
635
|
-
/** 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. */
|
|
636
|
-
conversations: { id: string; title: string; groupId?: string; scope
|
|
650
|
+
/** 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. */
|
|
651
|
+
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 }[];
|
|
637
652
|
/** The id of the currently-open conversation, highlighted in the list. */
|
|
638
653
|
activeId?: string;
|
|
639
654
|
/** 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. */
|
|
640
655
|
collapsed?: boolean;
|
|
641
656
|
/** Initial collapsed state when uncontrolled (default false). Use the `default-collapsed` attribute to start collapsed in plain HTML. */
|
|
642
657
|
defaultCollapsed?: boolean;
|
|
658
|
+
/** Dense single-line rows (a leading dot + title, no message count). */
|
|
659
|
+
compact?: boolean;
|
|
643
660
|
/** Focus the built-in search input inside the shadow root. */
|
|
644
661
|
focus(options?: FocusOptions): void;
|
|
645
662
|
/** Clear the internal search query (resets the list filter) and fire kai-search with an empty string. */
|
|
@@ -661,6 +678,8 @@ export interface KaiDialogElement extends HTMLElement {
|
|
|
661
678
|
open?: boolean;
|
|
662
679
|
/** Initial open state on mount (uncontrolled seed). */
|
|
663
680
|
defaultOpen?: boolean;
|
|
681
|
+
/** 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. */
|
|
682
|
+
label?: string;
|
|
664
683
|
/** Open it programmatically (no-op while disabled). */
|
|
665
684
|
show(): void;
|
|
666
685
|
/** Close it programmatically. */
|
|
@@ -671,6 +690,64 @@ export interface KaiDialogElement extends HTMLElement {
|
|
|
671
690
|
focus(options?: FocusOptions): void;
|
|
672
691
|
}
|
|
673
692
|
|
|
693
|
+
export interface KaiDockElement extends HTMLElement {
|
|
694
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
695
|
+
theme?: "light" | "dark" | "auto";
|
|
696
|
+
/** 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`. */
|
|
697
|
+
open?: boolean;
|
|
698
|
+
/** Initial open state on mount (uncontrolled seed). */
|
|
699
|
+
defaultOpen?: boolean;
|
|
700
|
+
/** Which corner the dock sits in. Logical, so `-end` follows the writing direction and an RTL page docks on the left. Attribute: `position`. */
|
|
701
|
+
position?: "bottom-end" | "bottom-start" | "top-end" | "top-start";
|
|
702
|
+
/** The widget's NAME. Derives the panel's accessible name and both launcher names (`Open ${label}` / `Close ${label}`). Defaults to `Chat`. */
|
|
703
|
+
label?: string;
|
|
704
|
+
/** i18n override for the launcher's name while closed (default `Open ${label}`). */
|
|
705
|
+
openLabel?: string;
|
|
706
|
+
/** i18n override for the launcher's name while open (default `Close ${label}`). */
|
|
707
|
+
closeLabel?: string;
|
|
708
|
+
/** 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. */
|
|
709
|
+
unread?: boolean;
|
|
710
|
+
/** Disable the launcher; `show()` and `toggle()` are gated on it. */
|
|
711
|
+
disabled?: boolean;
|
|
712
|
+
/** Where focus lands on open: `content` (default, the first element you slotted), `panel`, or `none`. Attribute: `focus-on-open`. */
|
|
713
|
+
focusOnOpen?: "content" | "panel" | "none";
|
|
714
|
+
/** Open it programmatically (no-op while disabled). */
|
|
715
|
+
show(): void;
|
|
716
|
+
/** Close it programmatically. */
|
|
717
|
+
hide(): void;
|
|
718
|
+
/** Flip the open state (closes while disabled). */
|
|
719
|
+
toggle(): void;
|
|
720
|
+
/** Move focus to the panel while open, or to the launcher while closed. */
|
|
721
|
+
focus(options?: FocusOptions): void;
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
export interface KaiDropdownElement extends HTMLElement {
|
|
725
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
726
|
+
theme?: "light" | "dark" | "auto";
|
|
727
|
+
/** Built-in trigger: leading icon (a named icon like `"plus"`, an image URL/data-URI, or text). A slotted `slot="trigger"` overrides it. */
|
|
728
|
+
triggerIcon?: string;
|
|
729
|
+
/** 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. */
|
|
730
|
+
triggerLabel?: string;
|
|
731
|
+
/** Built-in trigger: a trailing icon (e.g. `"chevron-down"` for a select look). */
|
|
732
|
+
triggerIconTrailing?: string;
|
|
733
|
+
/** 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. */
|
|
734
|
+
label?: string;
|
|
735
|
+
/** Stretch the trigger to the full width of its container (a block row). Attribute: `full`. */
|
|
736
|
+
full?: boolean;
|
|
737
|
+
/** 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`. */
|
|
738
|
+
open?: boolean;
|
|
739
|
+
/** Initial open state on mount (uncontrolled seed). */
|
|
740
|
+
defaultOpen?: boolean;
|
|
741
|
+
/** Disable the trigger: click/keyboard and `show()` no longer open the menu. */
|
|
742
|
+
disabled?: boolean;
|
|
743
|
+
/** Open it programmatically (no-op while disabled). */
|
|
744
|
+
show(): void;
|
|
745
|
+
/** Close it programmatically. */
|
|
746
|
+
hide(): void;
|
|
747
|
+
/** Flip the open state (closes while disabled). */
|
|
748
|
+
toggle(): void;
|
|
749
|
+
}
|
|
750
|
+
|
|
674
751
|
export interface KaiEditableLabelElement extends HTMLElement {
|
|
675
752
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
676
753
|
theme?: "light" | "dark" | "auto";
|
|
@@ -927,6 +1004,8 @@ export interface KaiMenuElement extends HTMLElement {
|
|
|
927
1004
|
triggerIconTrailing?: string;
|
|
928
1005
|
/** 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. */
|
|
929
1006
|
label?: string;
|
|
1007
|
+
/** 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`. */
|
|
1008
|
+
full?: boolean;
|
|
930
1009
|
/** 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`. */
|
|
931
1010
|
open?: boolean;
|
|
932
1011
|
/** Initial open state on mount (uncontrolled seed). */
|
|
@@ -1111,8 +1190,8 @@ export interface KaiPromptInputElement extends HTMLElement {
|
|
|
1111
1190
|
suggestions?: string[];
|
|
1112
1191
|
/** What clicking a suggestion does: `'submit'` (default) sends it immediately as if typed and submitted; `'fill'` just places it in the input. */
|
|
1113
1192
|
suggestionMode?: "submit" | "fill";
|
|
1114
|
-
/** Show a
|
|
1115
|
-
|
|
1193
|
+
/** Show a web-search (Globe) button in the left toolbar; clicking it fires a `kai-web-search` event. Attribute: `web-search`. */
|
|
1194
|
+
webSearch?: boolean;
|
|
1116
1195
|
/** Show a Voice (Mic) button in the left toolbar; clicking it fires a `voice` event. */
|
|
1117
1196
|
voice?: boolean;
|
|
1118
1197
|
/** 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`. */
|
|
@@ -1647,67 +1726,26 @@ export interface KaiVoiceOutputElement extends HTMLElement {
|
|
|
1647
1726
|
export interface KaiWorkspaceElement extends HTMLElement {
|
|
1648
1727
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
1649
1728
|
theme?: "light" | "dark" | "auto";
|
|
1650
|
-
/**
|
|
1651
|
-
|
|
1652
|
-
/**
|
|
1653
|
-
|
|
1654
|
-
/**
|
|
1655
|
-
|
|
1656
|
-
/**
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
placeholder?: string;
|
|
1660
|
-
loading?: boolean;
|
|
1661
|
-
suggestions?: string[];
|
|
1662
|
-
suggestionMode?: "submit" | "fill";
|
|
1663
|
-
proseSize?: "xs" | "sm" | "base" | "lg";
|
|
1664
|
-
codeTheme?: string;
|
|
1665
|
-
codeHighlight?: boolean;
|
|
1666
|
-
chatTitle?: string;
|
|
1667
|
-
models?: { id: string; name: string; provider?: string; description?: string; group?: string }[];
|
|
1668
|
-
currentModel?: string;
|
|
1669
|
-
context?: { usedTokens: number; maxTokens: number; inputTokens?: number; outputTokens?: number; estimatedCost?: number };
|
|
1670
|
-
scrollButton?: boolean;
|
|
1671
|
-
search?: boolean;
|
|
1672
|
-
voice?: boolean;
|
|
1673
|
-
/** Rich entity triggers (`/` skills, `@` agents/plugins) forwarded to the input. */
|
|
1674
|
-
triggers?: { char: string; kind: string; items?: { id: string; label: string; icon?: string; description?: string; group?: string; kind?: string; promptText?: string; data?: Record<string, unknown> }[] }[];
|
|
1675
|
-
/** Default icon per entity kind (kind → image src) forwarded to the input. */
|
|
1676
|
-
kindIcons?: Record<string, string>;
|
|
1677
|
-
/** Sidebar default width as a percent of the workspace (default 26). */
|
|
1678
|
-
sidebarWidth?: number;
|
|
1679
|
-
/** Sidebar min width in px (default 240). */
|
|
1680
|
-
sidebarMinWidth?: number;
|
|
1681
|
-
/** Sidebar max width in px (default 420). */
|
|
1682
|
-
sidebarMaxWidth?: number;
|
|
1683
|
-
/** 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). */
|
|
1684
|
-
sidebarCollapsed?: boolean;
|
|
1685
|
-
/** Initial collapsed state when uncontrolled (default false). Use the `default-sidebar-collapsed` attribute to start collapsed in plain HTML. */
|
|
1686
|
-
defaultSidebarCollapsed?: boolean;
|
|
1687
|
-
/** 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`. */
|
|
1729
|
+
/** 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). */
|
|
1730
|
+
startCollapsed?: boolean;
|
|
1731
|
+
/** Initial collapsed state of the start aside when uncontrolled (default false). Use the `default-start-collapsed` attribute to start collapsed in plain HTML. */
|
|
1732
|
+
defaultStartCollapsed?: boolean;
|
|
1733
|
+
/** 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). */
|
|
1734
|
+
endCollapsed?: boolean;
|
|
1735
|
+
/** Initial collapsed state of the end aside when uncontrolled (default false). Use the `default-end-collapsed` attribute to start collapsed in plain HTML. */
|
|
1736
|
+
defaultEndCollapsed?: boolean;
|
|
1737
|
+
/** 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`. */
|
|
1688
1738
|
collapseBelow?: number;
|
|
1689
|
-
/**
|
|
1739
|
+
/** 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`. */
|
|
1740
|
+
drawerBelow?: number;
|
|
1741
|
+
/** 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. */
|
|
1690
1742
|
compact?: boolean;
|
|
1691
|
-
/**
|
|
1692
|
-
|
|
1693
|
-
/**
|
|
1694
|
-
|
|
1695
|
-
/**
|
|
1696
|
-
|
|
1697
|
-
/** Collapse/expand the conversation sidebar and fire `kai-sidebar-toggle`. */
|
|
1698
|
-
toggleSidebar(): void;
|
|
1699
|
-
/** Force the conversation sidebar collapsed (fires `kai-sidebar-toggle`). */
|
|
1700
|
-
collapseSidebar(): void;
|
|
1701
|
-
/** Force the conversation sidebar expanded (fires `kai-sidebar-toggle`). */
|
|
1702
|
-
expandSidebar(): void;
|
|
1703
|
-
/** Focus the thread's composer. */
|
|
1704
|
-
focus(options?: FocusOptions): void;
|
|
1705
|
-
/** Clear the thread draft + staged attachments. */
|
|
1706
|
-
clear(): void;
|
|
1707
|
-
/** Submit the current thread draft programmatically (fires `kai-submit`). */
|
|
1708
|
-
send(): void;
|
|
1709
|
-
/** Scroll the thread to the newest message. */
|
|
1710
|
-
scrollToBottom(behavior?: "auto" | "instant" | "smooth"): void;
|
|
1743
|
+
/** Collapse/expand one aside (fires `kai-aside-toggle`). */
|
|
1744
|
+
toggleAside(side: "start" | "end"): void;
|
|
1745
|
+
/** Force one aside collapsed (fires `kai-aside-toggle`). */
|
|
1746
|
+
collapseAside(side: "start" | "end"): void;
|
|
1747
|
+
/** Force one aside expanded (fires `kai-aside-toggle`). */
|
|
1748
|
+
expandAside(side: "start" | "end"): void;
|
|
1711
1749
|
}
|
|
1712
1750
|
|
|
1713
1751
|
declare global {
|
|
@@ -1732,8 +1770,11 @@ declare global {
|
|
|
1732
1770
|
'kai-composer': KaiComposerElement;
|
|
1733
1771
|
'kai-confirm': KaiConfirmElement;
|
|
1734
1772
|
'kai-context': KaiContextElement;
|
|
1773
|
+
'kai-conversation-item': KaiConversationItemElement;
|
|
1735
1774
|
'kai-conversations': KaiConversationsElement;
|
|
1736
1775
|
'kai-dialog': KaiDialogElement;
|
|
1776
|
+
'kai-dock': KaiDockElement;
|
|
1777
|
+
'kai-dropdown': KaiDropdownElement;
|
|
1737
1778
|
'kai-editable-label': KaiEditableLabelElement;
|
|
1738
1779
|
'kai-embed': KaiEmbedElement;
|
|
1739
1780
|
'kai-empty': KaiEmptyElement;
|
|
@@ -1830,8 +1871,11 @@ declare module 'react' {
|
|
|
1830
1871
|
'kai-composer': KaiElementJsxProps;
|
|
1831
1872
|
'kai-confirm': KaiElementJsxProps;
|
|
1832
1873
|
'kai-context': KaiElementJsxProps;
|
|
1874
|
+
'kai-conversation-item': KaiElementJsxProps;
|
|
1833
1875
|
'kai-conversations': KaiElementJsxProps;
|
|
1834
1876
|
'kai-dialog': KaiElementJsxProps;
|
|
1877
|
+
'kai-dock': KaiElementJsxProps;
|
|
1878
|
+
'kai-dropdown': KaiElementJsxProps;
|
|
1835
1879
|
'kai-editable-label': KaiElementJsxProps;
|
|
1836
1880
|
'kai-embed': KaiElementJsxProps;
|
|
1837
1881
|
'kai-empty': KaiElementJsxProps;
|
|
@@ -1990,12 +2034,14 @@ export interface KaiAudioVisualizerElementProps {
|
|
|
1990
2034
|
complexity?: number;
|
|
1991
2035
|
/** Setting this makes the element an announced image (`role="img"`) instead of decorative (`aria-hidden`). Attribute: `label`. */
|
|
1992
2036
|
label?: string;
|
|
1993
|
-
/** Live microphone or WebRTC audio to analyze. JS property only. */
|
|
2037
|
+
/** 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. */
|
|
1994
2038
|
stream?: MediaStream;
|
|
1995
|
-
/** An `<audio>` or `<video>` element to tap for its audio. JS property only. */
|
|
2039
|
+
/** 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. */
|
|
1996
2040
|
audioElement?: HTMLMediaElement;
|
|
1997
|
-
/** 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. */
|
|
2041
|
+
/** 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. */
|
|
1998
2042
|
bands?: number[];
|
|
2043
|
+
/** 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). */
|
|
2044
|
+
listeningAmplitude?: boolean;
|
|
1999
2045
|
/** Custom fragment shader for `variant="custom"`. JS property only. */
|
|
2000
2046
|
shader?: { fragment: string; uniforms?: Record<string, { type: "1f" | "1i" | "1fv" | "2f" | "3f" | "3fv" | "4f" | "4fv" | "Matrix2fv" | "Matrix3fv" | "Matrix4fv"; value: number | number[] }> };
|
|
2001
2047
|
/** 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`. */
|
|
@@ -2099,8 +2145,6 @@ export interface KaiChainOfThoughtElementProps {
|
|
|
2099
2145
|
export interface KaiChatElementProps {
|
|
2100
2146
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
2101
2147
|
theme?: "light" | "dark" | "auto";
|
|
2102
|
-
/** Show a Search (Globe) button in the input toolbar; fires a `search` event. */
|
|
2103
|
-
search?: boolean;
|
|
2104
2148
|
/** 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. */
|
|
2105
2149
|
value?: string | ({ type: "text"; text: string } | { type: "entity"; entity: { kind: string; id: string; label: string; icon?: string; promptText?: string; data?: Record<string, unknown> } })[];
|
|
2106
2150
|
/** Placeholder text shown in the empty input. */
|
|
@@ -2145,6 +2189,8 @@ export interface KaiChatElementProps {
|
|
|
2145
2189
|
composerActions?: boolean;
|
|
2146
2190
|
/** INJECT: footer row below the composer (disclaimers, token meter, …). */
|
|
2147
2191
|
footer?: boolean;
|
|
2192
|
+
/** Show a web-search (Globe) button in the input toolbar; calls `onWebSearch`. */
|
|
2193
|
+
webSearch?: boolean;
|
|
2148
2194
|
/** Show a Voice (Mic) button in the input toolbar; fires a `voice` event. */
|
|
2149
2195
|
voice?: boolean;
|
|
2150
2196
|
/** 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. */
|
|
@@ -2225,6 +2271,8 @@ export interface KaiCodeBlockElementProps {
|
|
|
2225
2271
|
codeTheme?: string;
|
|
2226
2272
|
/** Disable syntax highlighting (renders plain text, no Shiki). */
|
|
2227
2273
|
codeHighlight?: boolean;
|
|
2274
|
+
/** Show the copy button. **Defaults to ON**, because this element is documented as shipping one. Opt out with `copy="false"` or `el.copy = false`. */
|
|
2275
|
+
copy?: boolean;
|
|
2228
2276
|
/** Code text sizing. */
|
|
2229
2277
|
proseSize?: "xs" | "sm" | "base" | "lg";
|
|
2230
2278
|
}
|
|
@@ -2308,19 +2356,32 @@ export interface KaiContextElementProps {
|
|
|
2308
2356
|
dangerThreshold?: number;
|
|
2309
2357
|
}
|
|
2310
2358
|
|
|
2359
|
+
export interface KaiConversationItemElementProps {
|
|
2360
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
2361
|
+
theme?: "light" | "dark" | "auto";
|
|
2362
|
+
/** 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). */
|
|
2363
|
+
conversationId?: string;
|
|
2364
|
+
/** 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`. */
|
|
2365
|
+
active?: boolean;
|
|
2366
|
+
/** Dense single-line row padding. */
|
|
2367
|
+
compact?: boolean;
|
|
2368
|
+
}
|
|
2369
|
+
|
|
2311
2370
|
export interface KaiConversationsElementProps {
|
|
2312
2371
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
2313
2372
|
theme?: "light" | "dark" | "auto";
|
|
2314
2373
|
/** 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. */
|
|
2315
2374
|
groups?: { id: string; userId?: string; teamId?: string; name: string; sortOrder: number; createdAt: string }[];
|
|
2316
|
-
/** 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. */
|
|
2317
|
-
conversations?: { id: string; title: string; groupId?: string; scope
|
|
2375
|
+
/** 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. */
|
|
2376
|
+
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 }[];
|
|
2318
2377
|
/** The id of the currently-open conversation, highlighted in the list. */
|
|
2319
2378
|
activeId?: string;
|
|
2320
2379
|
/** 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. */
|
|
2321
2380
|
collapsed?: boolean;
|
|
2322
2381
|
/** Initial collapsed state when uncontrolled (default false). Use the `default-collapsed` attribute to start collapsed in plain HTML. */
|
|
2323
2382
|
defaultCollapsed?: boolean;
|
|
2383
|
+
/** Dense single-line rows (a leading dot + title, no message count). */
|
|
2384
|
+
compact?: boolean;
|
|
2324
2385
|
}
|
|
2325
2386
|
|
|
2326
2387
|
export interface KaiDialogElementProps {
|
|
@@ -2330,6 +2391,52 @@ export interface KaiDialogElementProps {
|
|
|
2330
2391
|
open?: boolean;
|
|
2331
2392
|
/** Initial open state on mount (uncontrolled seed). */
|
|
2332
2393
|
defaultOpen?: boolean;
|
|
2394
|
+
/** 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. */
|
|
2395
|
+
label?: string;
|
|
2396
|
+
}
|
|
2397
|
+
|
|
2398
|
+
export interface KaiDockElementProps {
|
|
2399
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
2400
|
+
theme?: "light" | "dark" | "auto";
|
|
2401
|
+
/** 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`. */
|
|
2402
|
+
open?: boolean;
|
|
2403
|
+
/** Initial open state on mount (uncontrolled seed). */
|
|
2404
|
+
defaultOpen?: boolean;
|
|
2405
|
+
/** Which corner the dock sits in. Logical, so `-end` follows the writing direction and an RTL page docks on the left. Attribute: `position`. */
|
|
2406
|
+
position?: "bottom-end" | "bottom-start" | "top-end" | "top-start";
|
|
2407
|
+
/** The widget's NAME. Derives the panel's accessible name and both launcher names (`Open ${label}` / `Close ${label}`). Defaults to `Chat`. */
|
|
2408
|
+
label?: string;
|
|
2409
|
+
/** i18n override for the launcher's name while closed (default `Open ${label}`). */
|
|
2410
|
+
openLabel?: string;
|
|
2411
|
+
/** i18n override for the launcher's name while open (default `Close ${label}`). */
|
|
2412
|
+
closeLabel?: string;
|
|
2413
|
+
/** 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. */
|
|
2414
|
+
unread?: boolean;
|
|
2415
|
+
/** Disable the launcher; `show()` and `toggle()` are gated on it. */
|
|
2416
|
+
disabled?: boolean;
|
|
2417
|
+
/** Where focus lands on open: `content` (default, the first element you slotted), `panel`, or `none`. Attribute: `focus-on-open`. */
|
|
2418
|
+
focusOnOpen?: "content" | "panel" | "none";
|
|
2419
|
+
}
|
|
2420
|
+
|
|
2421
|
+
export interface KaiDropdownElementProps {
|
|
2422
|
+
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
2423
|
+
theme?: "light" | "dark" | "auto";
|
|
2424
|
+
/** Built-in trigger: leading icon (a named icon like `"plus"`, an image URL/data-URI, or text). A slotted `slot="trigger"` overrides it. */
|
|
2425
|
+
triggerIcon?: string;
|
|
2426
|
+
/** 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. */
|
|
2427
|
+
triggerLabel?: string;
|
|
2428
|
+
/** Built-in trigger: a trailing icon (e.g. `"chevron-down"` for a select look). */
|
|
2429
|
+
triggerIconTrailing?: string;
|
|
2430
|
+
/** 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. */
|
|
2431
|
+
label?: string;
|
|
2432
|
+
/** Stretch the trigger to the full width of its container (a block row). Attribute: `full`. */
|
|
2433
|
+
full?: boolean;
|
|
2434
|
+
/** 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`. */
|
|
2435
|
+
open?: boolean;
|
|
2436
|
+
/** Initial open state on mount (uncontrolled seed). */
|
|
2437
|
+
defaultOpen?: boolean;
|
|
2438
|
+
/** Disable the trigger: click/keyboard and `show()` no longer open the menu. */
|
|
2439
|
+
disabled?: boolean;
|
|
2333
2440
|
}
|
|
2334
2441
|
|
|
2335
2442
|
export interface KaiEditableLabelElementProps {
|
|
@@ -2558,6 +2665,8 @@ export interface KaiMenuElementProps {
|
|
|
2558
2665
|
triggerIconTrailing?: string;
|
|
2559
2666
|
/** 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. */
|
|
2560
2667
|
label?: string;
|
|
2668
|
+
/** 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`. */
|
|
2669
|
+
full?: boolean;
|
|
2561
2670
|
/** 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`. */
|
|
2562
2671
|
open?: boolean;
|
|
2563
2672
|
/** Initial open state on mount (uncontrolled seed). */
|
|
@@ -2716,8 +2825,8 @@ export interface KaiPromptInputElementProps {
|
|
|
2716
2825
|
suggestions?: string[];
|
|
2717
2826
|
/** What clicking a suggestion does: `'submit'` (default) sends it immediately as if typed and submitted; `'fill'` just places it in the input. */
|
|
2718
2827
|
suggestionMode?: "submit" | "fill";
|
|
2719
|
-
/** Show a
|
|
2720
|
-
|
|
2828
|
+
/** Show a web-search (Globe) button in the left toolbar; clicking it fires a `kai-web-search` event. Attribute: `web-search`. */
|
|
2829
|
+
webSearch?: boolean;
|
|
2721
2830
|
/** Show a Voice (Mic) button in the left toolbar; clicking it fires a `voice` event. */
|
|
2722
2831
|
voice?: boolean;
|
|
2723
2832
|
/** 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`. */
|
|
@@ -3170,53 +3279,20 @@ export interface KaiVoiceOutputElementProps {
|
|
|
3170
3279
|
export interface KaiWorkspaceElementProps {
|
|
3171
3280
|
/** Color mode (`auto` follows prefers-color-scheme). */
|
|
3172
3281
|
theme?: "light" | "dark" | "auto";
|
|
3173
|
-
/**
|
|
3174
|
-
|
|
3175
|
-
/**
|
|
3176
|
-
|
|
3177
|
-
/**
|
|
3178
|
-
|
|
3179
|
-
/**
|
|
3180
|
-
|
|
3181
|
-
|
|
3182
|
-
placeholder?: string;
|
|
3183
|
-
loading?: boolean;
|
|
3184
|
-
suggestions?: string[];
|
|
3185
|
-
suggestionMode?: "submit" | "fill";
|
|
3186
|
-
proseSize?: "xs" | "sm" | "base" | "lg";
|
|
3187
|
-
codeTheme?: string;
|
|
3188
|
-
codeHighlight?: boolean;
|
|
3189
|
-
chatTitle?: string;
|
|
3190
|
-
models?: { id: string; name: string; provider?: string; description?: string; group?: string }[];
|
|
3191
|
-
currentModel?: string;
|
|
3192
|
-
context?: { usedTokens: number; maxTokens: number; inputTokens?: number; outputTokens?: number; estimatedCost?: number };
|
|
3193
|
-
scrollButton?: boolean;
|
|
3194
|
-
search?: boolean;
|
|
3195
|
-
voice?: boolean;
|
|
3196
|
-
/** Rich entity triggers (`/` skills, `@` agents/plugins) forwarded to the input. */
|
|
3197
|
-
triggers?: { char: string; kind: string; items?: { id: string; label: string; icon?: string; description?: string; group?: string; kind?: string; promptText?: string; data?: Record<string, unknown> }[] }[];
|
|
3198
|
-
/** Default icon per entity kind (kind → image src) forwarded to the input. */
|
|
3199
|
-
kindIcons?: Record<string, string>;
|
|
3200
|
-
/** Sidebar default width as a percent of the workspace (default 26). */
|
|
3201
|
-
sidebarWidth?: number;
|
|
3202
|
-
/** Sidebar min width in px (default 240). */
|
|
3203
|
-
sidebarMinWidth?: number;
|
|
3204
|
-
/** Sidebar max width in px (default 420). */
|
|
3205
|
-
sidebarMaxWidth?: number;
|
|
3206
|
-
/** 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). */
|
|
3207
|
-
sidebarCollapsed?: boolean;
|
|
3208
|
-
/** Initial collapsed state when uncontrolled (default false). Use the `default-sidebar-collapsed` attribute to start collapsed in plain HTML. */
|
|
3209
|
-
defaultSidebarCollapsed?: boolean;
|
|
3210
|
-
/** 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`. */
|
|
3282
|
+
/** 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). */
|
|
3283
|
+
startCollapsed?: boolean;
|
|
3284
|
+
/** Initial collapsed state of the start aside when uncontrolled (default false). Use the `default-start-collapsed` attribute to start collapsed in plain HTML. */
|
|
3285
|
+
defaultStartCollapsed?: boolean;
|
|
3286
|
+
/** 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). */
|
|
3287
|
+
endCollapsed?: boolean;
|
|
3288
|
+
/** Initial collapsed state of the end aside when uncontrolled (default false). Use the `default-end-collapsed` attribute to start collapsed in plain HTML. */
|
|
3289
|
+
defaultEndCollapsed?: boolean;
|
|
3290
|
+
/** 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`. */
|
|
3211
3291
|
collapseBelow?: number;
|
|
3212
|
-
/**
|
|
3292
|
+
/** 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`. */
|
|
3293
|
+
drawerBelow?: number;
|
|
3294
|
+
/** 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. */
|
|
3213
3295
|
compact?: boolean;
|
|
3214
|
-
/** 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`. */
|
|
3215
|
-
noConversations?: boolean;
|
|
3216
|
-
/** 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. */
|
|
3217
|
-
cardTypes?: Record<string, string>;
|
|
3218
|
-
/** 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. */
|
|
3219
|
-
cardSchemas?: Record<string, object>;
|
|
3220
3296
|
}
|
|
3221
3297
|
|
|
3222
3298
|
export interface KaiAgentCardElementEvents {
|
|
@@ -3287,8 +3363,6 @@ export interface KaiChatElementEvents {
|
|
|
3287
3363
|
onKaiMessageAction?: (event: CustomEvent<{ messageId: string; action: string; state?: undefined | "on" | "off" }>) => void;
|
|
3288
3364
|
/** The header model switcher changed. */
|
|
3289
3365
|
onKaiModelChange?: (event: CustomEvent<{ modelId: string }>) => void;
|
|
3290
|
-
/** The Search button was clicked. */
|
|
3291
|
-
onKaiSearch?: (event: CustomEvent<Record<string, never>>) => void;
|
|
3292
3366
|
/** User submitted a message. */
|
|
3293
3367
|
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;
|
|
3294
3368
|
/** A suggestion chip was clicked (only in `suggestion-mode="fill"`). */
|
|
@@ -3297,6 +3371,8 @@ export interface KaiChatElementEvents {
|
|
|
3297
3371
|
onKaiValueChange?: (event: CustomEvent<{ value: string }>) => void;
|
|
3298
3372
|
/** The Mic / voice button was clicked. */
|
|
3299
3373
|
onKaiVoice?: (event: CustomEvent<Record<string, never>>) => void;
|
|
3374
|
+
/** The web-search (Globe) toolbar button was clicked. */
|
|
3375
|
+
onKaiWebSearch?: (event: CustomEvent<Record<string, never>>) => void;
|
|
3300
3376
|
}
|
|
3301
3377
|
|
|
3302
3378
|
export interface KaiCheckpointElementEvents {
|
|
@@ -3366,10 +3442,14 @@ export interface KaiContextElementEvents {
|
|
|
3366
3442
|
onKaiThresholdChange?: (event: CustomEvent<{ level: "ok" | "warn" | "danger" }>) => void;
|
|
3367
3443
|
}
|
|
3368
3444
|
|
|
3445
|
+
export interface KaiConversationItemElementEvents {
|
|
3446
|
+
|
|
3447
|
+
}
|
|
3448
|
+
|
|
3369
3449
|
export interface KaiConversationsElementEvents {
|
|
3370
3450
|
/** The rail was collapsed or expanded (via the toggle, the reopen button, or a `collapse()`/`expand()`/`toggle()` call). */
|
|
3371
3451
|
onKaiCollapseToggle?: (event: CustomEvent<{ collapsed: boolean }>) => void;
|
|
3372
|
-
/** A conversation was selected. */
|
|
3452
|
+
/** 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). */
|
|
3373
3453
|
onKaiConversationSelect?: (event: CustomEvent<{ id: string }>) => void;
|
|
3374
3454
|
/** The "New chat" button was clicked. */
|
|
3375
3455
|
onKaiNewChat?: (event: CustomEvent<Record<string, never>>) => void;
|
|
@@ -3384,6 +3464,16 @@ export interface KaiDialogElementEvents {
|
|
|
3384
3464
|
onKaiOpenChange?: (event: CustomEvent<{ open: boolean }>) => void;
|
|
3385
3465
|
}
|
|
3386
3466
|
|
|
3467
|
+
export interface KaiDockElementEvents {
|
|
3468
|
+
/** The dock opened or closed (the launcher, Escape, a driven `open`, or a method). */
|
|
3469
|
+
onKaiOpenChange?: (event: CustomEvent<{ open: boolean }>) => void;
|
|
3470
|
+
}
|
|
3471
|
+
|
|
3472
|
+
export interface KaiDropdownElementEvents {
|
|
3473
|
+
/** The menu opened or closed (click, keyboard, Escape, outside-click, or a method). */
|
|
3474
|
+
onKaiOpenChange?: (event: CustomEvent<{ open: boolean }>) => void;
|
|
3475
|
+
}
|
|
3476
|
+
|
|
3387
3477
|
export interface KaiEditableLabelElementEvents {
|
|
3388
3478
|
/** Edit was cancelled (Esc); the text is restored. */
|
|
3389
3479
|
onKaiCancel?: (event: CustomEvent<Record<string, never>>) => void;
|
|
@@ -3528,8 +3618,6 @@ export interface KaiPromptDockElementEvents {
|
|
|
3528
3618
|
export interface KaiPromptInputElementEvents {
|
|
3529
3619
|
/** 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). */
|
|
3530
3620
|
onKaiAttachmentsChange?: (event: CustomEvent<{ attachments: { id: string; type: "file" | "source-document"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[] }>) => void;
|
|
3531
|
-
/** The Search (Globe) toolbar button was clicked. */
|
|
3532
|
-
onKaiSearch?: (event: CustomEvent<Record<string, never>>) => void;
|
|
3533
3621
|
/** The Stop button was clicked while `stoppable` and `loading` are both true. */
|
|
3534
3622
|
onKaiStop?: (event: CustomEvent<Record<string, never>>) => void;
|
|
3535
3623
|
/** 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. */
|
|
@@ -3542,6 +3630,8 @@ export interface KaiPromptInputElementEvents {
|
|
|
3542
3630
|
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;
|
|
3543
3631
|
/** The Voice (Mic) toolbar button was clicked. */
|
|
3544
3632
|
onKaiVoice?: (event: CustomEvent<Record<string, never>>) => void;
|
|
3633
|
+
/** The web-search (Globe) toolbar button was clicked. */
|
|
3634
|
+
onKaiWebSearch?: (event: CustomEvent<Record<string, never>>) => void;
|
|
3545
3635
|
}
|
|
3546
3636
|
|
|
3547
3637
|
export interface KaiReasoningElementEvents {
|
|
@@ -3702,36 +3792,24 @@ export interface KaiVoiceInputElementEvents {
|
|
|
3702
3792
|
onKaiTranscriptInterim?: (event: CustomEvent<{ text: string }>) => void;
|
|
3703
3793
|
/** Final transcript: the `transcribe` property resolved, OR native `SpeechRecognition` produced final text (no `transcribe` set). */
|
|
3704
3794
|
onKaiTranscription?: (event: CustomEvent<{ text: string }>) => void;
|
|
3795
|
+
/** 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. */
|
|
3796
|
+
onKaiVoiceError?: (event: CustomEvent<{ source: "recognition"; error: string; message: string }>) => void;
|
|
3705
3797
|
}
|
|
3706
3798
|
|
|
3707
3799
|
export interface KaiVoiceOutputElementEvents {
|
|
3708
|
-
/** Playback started or stopped. Drive your own UI in sync. Fires on real transitions only (manual click and programmatic speak()/stop()), never on mount. */
|
|
3800
|
+
/** 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. */
|
|
3709
3801
|
onKaiSpeakingChange?: (event: CustomEvent<{ speaking: boolean }>) => void;
|
|
3710
3802
|
/** The model path (`synthesize`) resolved audio: the raw `Blob` before playback. */
|
|
3711
3803
|
onKaiSynthesized?: (event: CustomEvent<{ blob: Blob }>) => void;
|
|
3804
|
+
/** 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. */
|
|
3805
|
+
onKaiVoiceError?: (event: CustomEvent<{ source: "synthesis"; error: string; message: string }>) => void;
|
|
3712
3806
|
}
|
|
3713
3807
|
|
|
3714
3808
|
export interface KaiWorkspaceElementEvents {
|
|
3715
|
-
/**
|
|
3716
|
-
|
|
3717
|
-
/** An
|
|
3718
|
-
|
|
3719
|
-
/** The header model switcher changed. */
|
|
3720
|
-
onKaiModelChange?: (event: CustomEvent<{ modelId: string }>) => void;
|
|
3721
|
-
/** The "New chat" button was clicked. */
|
|
3722
|
-
onKaiNewChat?: (event: CustomEvent<Record<string, never>>) => void;
|
|
3723
|
-
/** The Search button was clicked. */
|
|
3724
|
-
onKaiSearch?: (event: CustomEvent<Record<string, never>>) => void;
|
|
3725
|
-
/** The sidebar was collapsed or expanded. */
|
|
3726
|
-
onKaiSidebarToggle?: (event: CustomEvent<{ collapsed: boolean }>) => void;
|
|
3727
|
-
/** User submitted a message. */
|
|
3728
|
-
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;
|
|
3729
|
-
/** A suggestion chip was clicked (only in `suggestion-mode="fill"`). */
|
|
3730
|
-
onKaiSuggestionClick?: (event: CustomEvent<{ value: string }>) => void;
|
|
3731
|
-
/** Fired on every input change. */
|
|
3732
|
-
onKaiValueChange?: (event: CustomEvent<{ value: string }>) => void;
|
|
3733
|
-
/** The Mic / voice button was clicked. */
|
|
3734
|
-
onKaiVoice?: (event: CustomEvent<Record<string, never>>) => void;
|
|
3809
|
+
/** The aside was resized (fires per drag step, keyboard nudge, or a handle double-click reset), width in px. */
|
|
3810
|
+
onKaiAsideResize?: (event: CustomEvent<{ side: "start" | "end"; width: number }>) => void;
|
|
3811
|
+
/** An aside collapsed or expanded (a method, the breakpoint, the drawer's Escape). */
|
|
3812
|
+
onKaiAsideToggle?: (event: CustomEvent<{ side: "start" | "end"; collapsed: boolean }>) => void;
|
|
3735
3813
|
}
|
|
3736
3814
|
|
|
3737
3815
|
/** Attributes every kai-* element tolerates in a Vue template on top of its own
|
|
@@ -3791,10 +3869,16 @@ declare module 'vue' {
|
|
|
3791
3869
|
KaiConfirm: KaiVueElement<KaiConfirmElementProps, KaiConfirmElementEvents>;
|
|
3792
3870
|
'kai-context': KaiVueElement<KaiContextElementProps, KaiContextElementEvents>;
|
|
3793
3871
|
KaiContext: KaiVueElement<KaiContextElementProps, KaiContextElementEvents>;
|
|
3872
|
+
'kai-conversation-item': KaiVueElement<KaiConversationItemElementProps, KaiConversationItemElementEvents>;
|
|
3873
|
+
KaiConversationItem: KaiVueElement<KaiConversationItemElementProps, KaiConversationItemElementEvents>;
|
|
3794
3874
|
'kai-conversations': KaiVueElement<KaiConversationsElementProps, KaiConversationsElementEvents>;
|
|
3795
3875
|
KaiConversations: KaiVueElement<KaiConversationsElementProps, KaiConversationsElementEvents>;
|
|
3796
3876
|
'kai-dialog': KaiVueElement<KaiDialogElementProps, KaiDialogElementEvents>;
|
|
3797
3877
|
KaiDialog: KaiVueElement<KaiDialogElementProps, KaiDialogElementEvents>;
|
|
3878
|
+
'kai-dock': KaiVueElement<KaiDockElementProps, KaiDockElementEvents>;
|
|
3879
|
+
KaiDock: KaiVueElement<KaiDockElementProps, KaiDockElementEvents>;
|
|
3880
|
+
'kai-dropdown': KaiVueElement<KaiDropdownElementProps, KaiDropdownElementEvents>;
|
|
3881
|
+
KaiDropdown: KaiVueElement<KaiDropdownElementProps, KaiDropdownElementEvents>;
|
|
3798
3882
|
'kai-editable-label': KaiVueElement<KaiEditableLabelElementProps, KaiEditableLabelElementEvents>;
|
|
3799
3883
|
KaiEditableLabel: KaiVueElement<KaiEditableLabelElementProps, KaiEditableLabelElementEvents>;
|
|
3800
3884
|
'kai-embed': KaiVueElement<KaiEmbedElementProps, KaiEmbedElementEvents>;
|