@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
|
@@ -145,12 +145,14 @@ export interface AudioVisualizerProps extends WebComponentProps {
|
|
|
145
145
|
complexity?: number;
|
|
146
146
|
/** Setting this makes the element an announced image (`role="img"`) instead of decorative (`aria-hidden`). Attribute: `label`. */
|
|
147
147
|
label?: string;
|
|
148
|
-
/** Live microphone or WebRTC audio to analyze. JS property only. */
|
|
148
|
+
/** 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. */
|
|
149
149
|
stream?: MediaStream;
|
|
150
|
-
/** An `<audio>` or `<video>` element to tap for its audio. JS property only. */
|
|
150
|
+
/** 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. */
|
|
151
151
|
audioElement?: HTMLMediaElement;
|
|
152
|
-
/** 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. */
|
|
152
|
+
/** 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. */
|
|
153
153
|
bands?: number[];
|
|
154
|
+
/** 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). */
|
|
155
|
+
listeningAmplitude?: boolean;
|
|
154
156
|
/** Custom fragment shader for `variant="custom"`. JS property only. */
|
|
155
157
|
shader?: { fragment: string; uniforms?: Record<string, { type: "1f" | "1i" | "1fv" | "2f" | "3f" | "3fv" | "4f" | "4fv" | "Matrix2fv" | "Matrix3fv" | "Matrix4fv"; value: number | number[] }> };
|
|
156
158
|
/** 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`. */
|
|
@@ -159,7 +161,7 @@ export interface AudioVisualizerProps extends WebComponentProps {
|
|
|
159
161
|
|
|
160
162
|
export const AudioVisualizer = /*#__PURE__*/ createWebComponent<AudioVisualizerProps>(
|
|
161
163
|
'kai-audio-visualizer',
|
|
162
|
-
["theme","variant","state","size","barCount","count","radius","spread","interval","color","complexity","label","stream","audioElement","bands","shader","animateWhenNotVisible"],
|
|
164
|
+
["theme","variant","state","size","barCount","count","radius","spread","interval","color","complexity","label","stream","audioElement","bands","listeningAmplitude","shader","animateWhenNotVisible"],
|
|
163
165
|
{ },
|
|
164
166
|
() => import('@kitn.ai/ui/elements/audio-visualizer'),
|
|
165
167
|
);
|
|
@@ -299,8 +301,6 @@ export const ChainOfThought = /*#__PURE__*/ createWebComponent<ChainOfThoughtPro
|
|
|
299
301
|
);
|
|
300
302
|
|
|
301
303
|
export interface ChatProps extends WebComponentProps {
|
|
302
|
-
/** Show a Search (Globe) button in the input toolbar; fires a `search` event. */
|
|
303
|
-
search?: boolean;
|
|
304
304
|
/** 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. */
|
|
305
305
|
value?: string | ({ type: "text"; text: string } | { type: "entity"; entity: { kind: string; id: string; label: string; icon?: string; promptText?: string; data?: Record<string, unknown> } })[];
|
|
306
306
|
/** Placeholder text shown in the empty input. */
|
|
@@ -345,6 +345,8 @@ export interface ChatProps extends WebComponentProps {
|
|
|
345
345
|
composerActions?: boolean;
|
|
346
346
|
/** INJECT: footer row below the composer (disclaimers, token meter, …). */
|
|
347
347
|
footer?: boolean;
|
|
348
|
+
/** Show a web-search (Globe) button in the input toolbar; calls `onWebSearch`. */
|
|
349
|
+
webSearch?: boolean;
|
|
348
350
|
/** Show a Voice (Mic) button in the input toolbar; fires a `voice` event. */
|
|
349
351
|
voice?: boolean;
|
|
350
352
|
/** 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. */
|
|
@@ -369,8 +371,6 @@ export interface ChatProps extends WebComponentProps {
|
|
|
369
371
|
onMessageAction?: (event: CustomEvent<{ messageId: string; action: string; state?: undefined | "on" | "off" }>) => void;
|
|
370
372
|
/** The header model switcher changed. */
|
|
371
373
|
onModelChange?: (event: CustomEvent<{ modelId: string }>) => void;
|
|
372
|
-
/** The Search button was clicked. */
|
|
373
|
-
onSearch?: (event: CustomEvent<Record<string, never>>) => void;
|
|
374
374
|
/** User submitted a message. */
|
|
375
375
|
onSubmit?: (event: CustomEvent<{ value: string; attachments: { id: string; type: "file" | "source-document"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[] }>) => void;
|
|
376
376
|
/** A suggestion chip was clicked (only in `suggestion-mode="fill"`). */
|
|
@@ -379,12 +379,14 @@ export interface ChatProps extends WebComponentProps {
|
|
|
379
379
|
onValueChange?: (event: CustomEvent<{ value: string }>) => void;
|
|
380
380
|
/** The Mic / voice button was clicked. */
|
|
381
381
|
onVoice?: (event: CustomEvent<Record<string, never>>) => void;
|
|
382
|
+
/** The web-search (Globe) toolbar button was clicked. */
|
|
383
|
+
onWebSearch?: (event: CustomEvent<Record<string, never>>) => void;
|
|
382
384
|
}
|
|
383
385
|
|
|
384
386
|
export const Chat = /*#__PURE__*/ createWebComponent<ChatProps>(
|
|
385
387
|
'kai-chat',
|
|
386
|
-
["theme","
|
|
387
|
-
{ onAttachmentsChange: 'kai-attachments-change', onAttachmentsRejected: 'kai-attachments-rejected', onMessageAction: 'kai-message-action', onModelChange: 'kai-model-change',
|
|
388
|
+
["theme","value","placeholder","loading","suggestions","suggestionMode","persistSuggestions","proseSize","codeTheme","codeHighlight","chatTitle","models","currentModel","context","scrollButton","headerStart","headerEnd","headerFull","sidebar","empty","composer","composerActions","footer","webSearch","voice","triggers","kindIcons","actionsReveal","accept","messages","cardTypes","cardSchemas"],
|
|
389
|
+
{ onAttachmentsChange: 'kai-attachments-change', onAttachmentsRejected: 'kai-attachments-rejected', onMessageAction: 'kai-message-action', onModelChange: 'kai-model-change', onSubmit: 'kai-submit', onSuggestionClick: 'kai-suggestion-click', onValueChange: 'kai-value-change', onVoice: 'kai-voice', onWebSearch: 'kai-web-search' },
|
|
388
390
|
() => import('@kitn.ai/ui/elements/chat'),
|
|
389
391
|
);
|
|
390
392
|
|
|
@@ -471,13 +473,15 @@ export interface CodeBlockProps extends WebComponentProps {
|
|
|
471
473
|
codeTheme?: string;
|
|
472
474
|
/** Disable syntax highlighting (renders plain text, no Shiki). */
|
|
473
475
|
codeHighlight?: boolean;
|
|
476
|
+
/** Show the copy button. **Defaults to ON**, because this element is documented as shipping one. Opt out with `copy="false"` or `el.copy = false`. */
|
|
477
|
+
copy?: boolean;
|
|
474
478
|
/** Code text sizing. */
|
|
475
479
|
proseSize?: "xs" | "sm" | "base" | "lg";
|
|
476
480
|
}
|
|
477
481
|
|
|
478
482
|
export const CodeBlock = /*#__PURE__*/ createWebComponent<CodeBlockProps>(
|
|
479
483
|
'kai-code-block',
|
|
480
|
-
["theme","code","language","codeTheme","codeHighlight","proseSize"],
|
|
484
|
+
["theme","code","language","codeTheme","codeHighlight","copy","proseSize"],
|
|
481
485
|
{ },
|
|
482
486
|
() => import('@kitn.ai/ui/elements/code-block'),
|
|
483
487
|
);
|
|
@@ -616,20 +620,38 @@ export const Context = /*#__PURE__*/ createWebComponent<ContextProps>(
|
|
|
616
620
|
() => import('@kitn.ai/ui/elements/context-meter'),
|
|
617
621
|
);
|
|
618
622
|
|
|
623
|
+
export interface ConversationItemProps extends WebComponentProps {
|
|
624
|
+
/** 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). */
|
|
625
|
+
conversationId?: string;
|
|
626
|
+
/** 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`. */
|
|
627
|
+
active?: boolean;
|
|
628
|
+
/** Dense single-line row padding. */
|
|
629
|
+
compact?: boolean;
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
export const ConversationItem = /*#__PURE__*/ createWebComponent<ConversationItemProps>(
|
|
633
|
+
'kai-conversation-item',
|
|
634
|
+
["theme","conversationId","active","compact"],
|
|
635
|
+
{ },
|
|
636
|
+
() => import('@kitn.ai/ui/elements/conversation-item'),
|
|
637
|
+
);
|
|
638
|
+
|
|
619
639
|
export interface ConversationsProps extends WebComponentProps {
|
|
620
640
|
/** 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. */
|
|
621
641
|
groups?: { id: string; userId?: string; teamId?: string; name: string; sortOrder: number; createdAt: string }[];
|
|
622
|
-
/** 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. */
|
|
623
|
-
conversations?: { id: string; title: string; groupId?: string; scope
|
|
642
|
+
/** 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. */
|
|
643
|
+
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 }[];
|
|
624
644
|
/** The id of the currently-open conversation, highlighted in the list. */
|
|
625
645
|
activeId?: string;
|
|
626
646
|
/** 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. */
|
|
627
647
|
collapsed?: boolean;
|
|
628
648
|
/** Initial collapsed state when uncontrolled (default false). Use the `default-collapsed` attribute to start collapsed in plain HTML. */
|
|
629
649
|
defaultCollapsed?: boolean;
|
|
650
|
+
/** Dense single-line rows (a leading dot + title, no message count). */
|
|
651
|
+
compact?: boolean;
|
|
630
652
|
/** The rail was collapsed or expanded (via the toggle, the reopen button, or a `collapse()`/`expand()`/`toggle()` call). */
|
|
631
653
|
onCollapseToggle?: (event: CustomEvent<{ collapsed: boolean }>) => void;
|
|
632
|
-
/** A conversation was selected. */
|
|
654
|
+
/** 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). */
|
|
633
655
|
onConversationSelect?: (event: CustomEvent<{ id: string }>) => void;
|
|
634
656
|
/** The "New chat" button was clicked. */
|
|
635
657
|
onNewChat?: (event: CustomEvent<Record<string, never>>) => void;
|
|
@@ -641,7 +663,7 @@ export interface ConversationsProps extends WebComponentProps {
|
|
|
641
663
|
|
|
642
664
|
export const Conversations = /*#__PURE__*/ createWebComponent<ConversationsProps>(
|
|
643
665
|
'kai-conversations',
|
|
644
|
-
["theme","groups","conversations","activeId","collapsed","defaultCollapsed"],
|
|
666
|
+
["theme","groups","conversations","activeId","collapsed","defaultCollapsed","compact"],
|
|
645
667
|
{ onCollapseToggle: 'kai-collapse-toggle', onConversationSelect: 'kai-conversation-select', onNewChat: 'kai-new-chat', onSearch: 'kai-search', onToggleSidebar: 'kai-toggle-sidebar' },
|
|
646
668
|
() => import('@kitn.ai/ui/elements/conversation-list'),
|
|
647
669
|
);
|
|
@@ -651,17 +673,77 @@ export interface DialogProps extends WebComponentProps {
|
|
|
651
673
|
open?: boolean;
|
|
652
674
|
/** Initial open state on mount (uncontrolled seed). */
|
|
653
675
|
defaultOpen?: boolean;
|
|
676
|
+
/** 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. */
|
|
677
|
+
label?: string;
|
|
654
678
|
/** The dialog opened or closed (Escape, backdrop click, a driven `open`, or a method). */
|
|
655
679
|
onOpenChange?: (event: CustomEvent<{ open: boolean }>) => void;
|
|
656
680
|
}
|
|
657
681
|
|
|
658
682
|
export const Dialog = /*#__PURE__*/ createWebComponent<DialogProps>(
|
|
659
683
|
'kai-dialog',
|
|
660
|
-
["theme","open","defaultOpen"],
|
|
684
|
+
["theme","open","defaultOpen","label"],
|
|
661
685
|
{ onOpenChange: 'kai-open-change' },
|
|
662
686
|
() => import('@kitn.ai/ui/elements/dialog'),
|
|
663
687
|
);
|
|
664
688
|
|
|
689
|
+
export interface DockProps extends WebComponentProps {
|
|
690
|
+
/** 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`. */
|
|
691
|
+
open?: boolean;
|
|
692
|
+
/** Initial open state on mount (uncontrolled seed). */
|
|
693
|
+
defaultOpen?: boolean;
|
|
694
|
+
/** Which corner the dock sits in. Logical, so `-end` follows the writing direction and an RTL page docks on the left. Attribute: `position`. */
|
|
695
|
+
position?: "bottom-end" | "bottom-start" | "top-end" | "top-start";
|
|
696
|
+
/** The widget's NAME. Derives the panel's accessible name and both launcher names (`Open ${label}` / `Close ${label}`). Defaults to `Chat`. */
|
|
697
|
+
label?: string;
|
|
698
|
+
/** i18n override for the launcher's name while closed (default `Open ${label}`). */
|
|
699
|
+
openLabel?: string;
|
|
700
|
+
/** i18n override for the launcher's name while open (default `Close ${label}`). */
|
|
701
|
+
closeLabel?: string;
|
|
702
|
+
/** 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. */
|
|
703
|
+
unread?: boolean;
|
|
704
|
+
/** Disable the launcher; `show()` and `toggle()` are gated on it. */
|
|
705
|
+
disabled?: boolean;
|
|
706
|
+
/** Where focus lands on open: `content` (default, the first element you slotted), `panel`, or `none`. Attribute: `focus-on-open`. */
|
|
707
|
+
focusOnOpen?: "content" | "panel" | "none";
|
|
708
|
+
/** The dock opened or closed (the launcher, Escape, a driven `open`, or a method). */
|
|
709
|
+
onOpenChange?: (event: CustomEvent<{ open: boolean }>) => void;
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
export const Dock = /*#__PURE__*/ createWebComponent<DockProps>(
|
|
713
|
+
'kai-dock',
|
|
714
|
+
["theme","open","defaultOpen","position","label","openLabel","closeLabel","unread","disabled","focusOnOpen"],
|
|
715
|
+
{ onOpenChange: 'kai-open-change' },
|
|
716
|
+
() => import('@kitn.ai/ui/elements/dock'),
|
|
717
|
+
);
|
|
718
|
+
|
|
719
|
+
export interface DropdownProps extends WebComponentProps {
|
|
720
|
+
/** Built-in trigger: leading icon (a named icon like `"plus"`, an image URL/data-URI, or text). A slotted `slot="trigger"` overrides it. */
|
|
721
|
+
triggerIcon?: string;
|
|
722
|
+
/** 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. */
|
|
723
|
+
triggerLabel?: string;
|
|
724
|
+
/** Built-in trigger: a trailing icon (e.g. `"chevron-down"` for a select look). */
|
|
725
|
+
triggerIconTrailing?: string;
|
|
726
|
+
/** 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. */
|
|
727
|
+
label?: string;
|
|
728
|
+
/** Stretch the trigger to the full width of its container (a block row). Attribute: `full`. */
|
|
729
|
+
full?: boolean;
|
|
730
|
+
/** 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`. */
|
|
731
|
+
open?: boolean;
|
|
732
|
+
/** Initial open state on mount (uncontrolled seed). */
|
|
733
|
+
defaultOpen?: boolean;
|
|
734
|
+
/** Disable the trigger: click/keyboard and `show()` no longer open the menu. */
|
|
735
|
+
disabled?: boolean;
|
|
736
|
+
/** The menu opened or closed (click, keyboard, Escape, outside-click, or a method). */
|
|
737
|
+
onOpenChange?: (event: CustomEvent<{ open: boolean }>) => void;
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
export const Dropdown = /*#__PURE__*/ createWebComponent<DropdownProps>(
|
|
741
|
+
'kai-dropdown',
|
|
742
|
+
["theme","triggerIcon","triggerLabel","triggerIconTrailing","label","full","open","defaultOpen","disabled"],
|
|
743
|
+
{ onOpenChange: 'kai-open-change' },
|
|
744
|
+
() => import('@kitn.ai/ui/elements/dropdown'),
|
|
745
|
+
);
|
|
746
|
+
|
|
665
747
|
export interface EditableLabelProps extends WebComponentProps {
|
|
666
748
|
/** The label text. Settable and reflected to the `value` attribute. Read `el.value` for live state. */
|
|
667
749
|
value?: string;
|
|
@@ -983,6 +1065,8 @@ export interface MenuProps extends WebComponentProps {
|
|
|
983
1065
|
triggerIconTrailing?: string;
|
|
984
1066
|
/** 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. */
|
|
985
1067
|
label?: string;
|
|
1068
|
+
/** 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`. */
|
|
1069
|
+
full?: boolean;
|
|
986
1070
|
/** 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`. */
|
|
987
1071
|
open?: boolean;
|
|
988
1072
|
/** Initial open state on mount (uncontrolled seed). */
|
|
@@ -997,7 +1081,7 @@ export interface MenuProps extends WebComponentProps {
|
|
|
997
1081
|
|
|
998
1082
|
export const Menu = /*#__PURE__*/ createWebComponent<MenuProps>(
|
|
999
1083
|
'kai-menu',
|
|
1000
|
-
["theme","items","placement","triggerIcon","triggerLabel","triggerIconTrailing","label","open","defaultOpen","disabled"],
|
|
1084
|
+
["theme","items","placement","triggerIcon","triggerLabel","triggerIconTrailing","label","full","open","defaultOpen","disabled"],
|
|
1001
1085
|
{ onOpenChange: 'kai-open-change', onSelect: 'kai-select' },
|
|
1002
1086
|
() => import('@kitn.ai/ui/elements/menu'),
|
|
1003
1087
|
);
|
|
@@ -1225,8 +1309,8 @@ export interface PromptInputProps extends WebComponentProps {
|
|
|
1225
1309
|
suggestions?: string[];
|
|
1226
1310
|
/** What clicking a suggestion does: `'submit'` (default) sends it immediately as if typed and submitted; `'fill'` just places it in the input. */
|
|
1227
1311
|
suggestionMode?: "submit" | "fill";
|
|
1228
|
-
/** Show a
|
|
1229
|
-
|
|
1312
|
+
/** Show a web-search (Globe) button in the left toolbar; clicking it fires a `kai-web-search` event. Attribute: `web-search`. */
|
|
1313
|
+
webSearch?: boolean;
|
|
1230
1314
|
/** Show a Voice (Mic) button in the left toolbar; clicking it fires a `voice` event. */
|
|
1231
1315
|
voice?: boolean;
|
|
1232
1316
|
/** 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`. */
|
|
@@ -1243,8 +1327,6 @@ export interface PromptInputProps extends WebComponentProps {
|
|
|
1243
1327
|
kindIcons?: Record<string, string>;
|
|
1244
1328
|
/** 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). */
|
|
1245
1329
|
onAttachmentsChange?: (event: CustomEvent<{ attachments: { id: string; type: "file" | "source-document"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[] }>) => void;
|
|
1246
|
-
/** The Search (Globe) toolbar button was clicked. */
|
|
1247
|
-
onSearch?: (event: CustomEvent<Record<string, never>>) => void;
|
|
1248
1330
|
/** The Stop button was clicked while `stoppable` and `loading` are both true. */
|
|
1249
1331
|
onStop?: (event: CustomEvent<Record<string, never>>) => void;
|
|
1250
1332
|
/** 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. */
|
|
@@ -1257,12 +1339,14 @@ export interface PromptInputProps extends WebComponentProps {
|
|
|
1257
1339
|
onValueChange?: (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;
|
|
1258
1340
|
/** The Voice (Mic) toolbar button was clicked. */
|
|
1259
1341
|
onVoice?: (event: CustomEvent<Record<string, never>>) => void;
|
|
1342
|
+
/** The web-search (Globe) toolbar button was clicked. */
|
|
1343
|
+
onWebSearch?: (event: CustomEvent<Record<string, never>>) => void;
|
|
1260
1344
|
}
|
|
1261
1345
|
|
|
1262
1346
|
export const PromptInput = /*#__PURE__*/ createWebComponent<PromptInputProps>(
|
|
1263
1347
|
'kai-prompt-input',
|
|
1264
|
-
["theme","value","placeholder","disabled","loading","suggestions","suggestionMode","
|
|
1265
|
-
{ onAttachmentsChange: 'kai-attachments-change',
|
|
1348
|
+
["theme","value","placeholder","disabled","loading","suggestions","suggestionMode","webSearch","voice","stoppable","submit","attach","attachments","triggers","kindIcons"],
|
|
1349
|
+
{ onAttachmentsChange: 'kai-attachments-change', onStop: 'kai-stop', onSubmit: 'kai-submit', onSuggestionClick: 'kai-suggestion-click', onToolbarAction: 'kai-toolbar-action', onValueChange: 'kai-value-change', onVoice: 'kai-voice', onWebSearch: 'kai-web-search' },
|
|
1266
1350
|
() => import('@kitn.ai/ui/elements/prompt-input'),
|
|
1267
1351
|
);
|
|
1268
1352
|
|
|
@@ -1886,12 +1970,14 @@ export interface VoiceInputProps extends WebComponentProps {
|
|
|
1886
1970
|
onTranscriptInterim?: (event: CustomEvent<{ text: string }>) => void;
|
|
1887
1971
|
/** Final transcript: the `transcribe` property resolved, OR native `SpeechRecognition` produced final text (no `transcribe` set). */
|
|
1888
1972
|
onTranscription?: (event: CustomEvent<{ text: string }>) => void;
|
|
1973
|
+
/** 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. */
|
|
1974
|
+
onVoiceError?: (event: CustomEvent<{ source: "recognition"; error: string; message: string }>) => void;
|
|
1889
1975
|
}
|
|
1890
1976
|
|
|
1891
1977
|
export const VoiceInput = /*#__PURE__*/ createWebComponent<VoiceInputProps>(
|
|
1892
1978
|
'kai-voice-input',
|
|
1893
1979
|
["theme","transcribe","disabled","recognitionLang","interim"],
|
|
1894
|
-
{ onAudioCaptured: 'kai-audio-captured', onRecordingChange: 'kai-recording-change', onTranscriptInterim: 'kai-transcript-interim', onTranscription: 'kai-transcription' },
|
|
1980
|
+
{ onAudioCaptured: 'kai-audio-captured', onRecordingChange: 'kai-recording-change', onTranscriptInterim: 'kai-transcript-interim', onTranscription: 'kai-transcription', onVoiceError: 'kai-voice-error' },
|
|
1895
1981
|
() => import('@kitn.ai/ui/elements/voice-input'),
|
|
1896
1982
|
);
|
|
1897
1983
|
|
|
@@ -1904,92 +1990,45 @@ export interface VoiceOutputProps extends WebComponentProps {
|
|
|
1904
1990
|
synthesize?: (text: string) => Promise<Blob>;
|
|
1905
1991
|
/** Disable the button (non-interactive). */
|
|
1906
1992
|
disabled?: boolean;
|
|
1907
|
-
/** Playback started or stopped. Drive your own UI in sync. Fires on real transitions only (manual click and programmatic speak()/stop()), never on mount. */
|
|
1993
|
+
/** 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. */
|
|
1908
1994
|
onSpeakingChange?: (event: CustomEvent<{ speaking: boolean }>) => void;
|
|
1909
1995
|
/** The model path (`synthesize`) resolved audio: the raw `Blob` before playback. */
|
|
1910
1996
|
onSynthesized?: (event: CustomEvent<{ blob: Blob }>) => void;
|
|
1997
|
+
/** 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. */
|
|
1998
|
+
onVoiceError?: (event: CustomEvent<{ source: "synthesis"; error: string; message: string }>) => void;
|
|
1911
1999
|
}
|
|
1912
2000
|
|
|
1913
2001
|
export const VoiceOutput = /*#__PURE__*/ createWebComponent<VoiceOutputProps>(
|
|
1914
2002
|
'kai-voice-output',
|
|
1915
2003
|
["theme","text","autoplay","synthesize","disabled"],
|
|
1916
|
-
{ onSpeakingChange: 'kai-speaking-change', onSynthesized: 'kai-synthesized' },
|
|
2004
|
+
{ onSpeakingChange: 'kai-speaking-change', onSynthesized: 'kai-synthesized', onVoiceError: 'kai-voice-error' },
|
|
1917
2005
|
() => import('@kitn.ai/ui/elements/voice-output'),
|
|
1918
2006
|
);
|
|
1919
2007
|
|
|
1920
2008
|
export interface WorkspaceProps extends WebComponentProps {
|
|
1921
|
-
/**
|
|
1922
|
-
|
|
1923
|
-
/**
|
|
1924
|
-
|
|
1925
|
-
/**
|
|
1926
|
-
|
|
1927
|
-
/**
|
|
1928
|
-
|
|
1929
|
-
|
|
1930
|
-
placeholder?: string;
|
|
1931
|
-
loading?: boolean;
|
|
1932
|
-
suggestions?: string[];
|
|
1933
|
-
suggestionMode?: "submit" | "fill";
|
|
1934
|
-
proseSize?: "xs" | "sm" | "base" | "lg";
|
|
1935
|
-
codeTheme?: string;
|
|
1936
|
-
codeHighlight?: boolean;
|
|
1937
|
-
chatTitle?: string;
|
|
1938
|
-
models?: { id: string; name: string; provider?: string; description?: string; group?: string }[];
|
|
1939
|
-
currentModel?: string;
|
|
1940
|
-
context?: { usedTokens: number; maxTokens: number; inputTokens?: number; outputTokens?: number; estimatedCost?: number };
|
|
1941
|
-
scrollButton?: boolean;
|
|
1942
|
-
search?: boolean;
|
|
1943
|
-
voice?: boolean;
|
|
1944
|
-
/** Rich entity triggers (`/` skills, `@` agents/plugins) forwarded to the input. */
|
|
1945
|
-
triggers?: { char: string; kind: string; items?: { id: string; label: string; icon?: string; description?: string; group?: string; kind?: string; promptText?: string; data?: Record<string, unknown> }[] }[];
|
|
1946
|
-
/** Default icon per entity kind (kind → image src) forwarded to the input. */
|
|
1947
|
-
kindIcons?: Record<string, string>;
|
|
1948
|
-
/** Sidebar default width as a percent of the workspace (default 26). */
|
|
1949
|
-
sidebarWidth?: number;
|
|
1950
|
-
/** Sidebar min width in px (default 240). */
|
|
1951
|
-
sidebarMinWidth?: number;
|
|
1952
|
-
/** Sidebar max width in px (default 420). */
|
|
1953
|
-
sidebarMaxWidth?: number;
|
|
1954
|
-
/** 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). */
|
|
1955
|
-
sidebarCollapsed?: boolean;
|
|
1956
|
-
/** Initial collapsed state when uncontrolled (default false). Use the `default-sidebar-collapsed` attribute to start collapsed in plain HTML. */
|
|
1957
|
-
defaultSidebarCollapsed?: boolean;
|
|
1958
|
-
/** 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`. */
|
|
2009
|
+
/** 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). */
|
|
2010
|
+
startCollapsed?: boolean;
|
|
2011
|
+
/** Initial collapsed state of the start aside when uncontrolled (default false). Use the `default-start-collapsed` attribute to start collapsed in plain HTML. */
|
|
2012
|
+
defaultStartCollapsed?: boolean;
|
|
2013
|
+
/** 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). */
|
|
2014
|
+
endCollapsed?: boolean;
|
|
2015
|
+
/** Initial collapsed state of the end aside when uncontrolled (default false). Use the `default-end-collapsed` attribute to start collapsed in plain HTML. */
|
|
2016
|
+
defaultEndCollapsed?: boolean;
|
|
2017
|
+
/** 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`. */
|
|
1959
2018
|
collapseBelow?: number;
|
|
1960
|
-
/**
|
|
2019
|
+
/** 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`. */
|
|
2020
|
+
drawerBelow?: number;
|
|
2021
|
+
/** 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. */
|
|
1961
2022
|
compact?: boolean;
|
|
1962
|
-
/**
|
|
1963
|
-
|
|
1964
|
-
/**
|
|
1965
|
-
|
|
1966
|
-
/** 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. */
|
|
1967
|
-
cardSchemas?: Record<string, object>;
|
|
1968
|
-
/** A conversation was selected in the sidebar. */
|
|
1969
|
-
onConversationSelect?: (event: CustomEvent<{ id: string }>) => void;
|
|
1970
|
-
/** An action button on a message was clicked. `state` is present only for the toggleable feedback votes: `'on'` when a like/dislike is set, `'off'` when re-tapped to clear. */
|
|
1971
|
-
onMessageAction?: (event: CustomEvent<{ messageId: string; action: string; state?: undefined | "on" | "off" }>) => void;
|
|
1972
|
-
/** The header model switcher changed. */
|
|
1973
|
-
onModelChange?: (event: CustomEvent<{ modelId: string }>) => void;
|
|
1974
|
-
/** The "New chat" button was clicked. */
|
|
1975
|
-
onNewChat?: (event: CustomEvent<Record<string, never>>) => void;
|
|
1976
|
-
/** The Search button was clicked. */
|
|
1977
|
-
onSearch?: (event: CustomEvent<Record<string, never>>) => void;
|
|
1978
|
-
/** The sidebar was collapsed or expanded. */
|
|
1979
|
-
onSidebarToggle?: (event: CustomEvent<{ collapsed: boolean }>) => void;
|
|
1980
|
-
/** User submitted a message. */
|
|
1981
|
-
onSubmit?: (event: CustomEvent<{ value: string; attachments: { id: string; type: "file" | "source-document"; filename?: undefined | string; mediaType?: undefined | string; url?: undefined | string; title?: undefined | string }[] }>) => void;
|
|
1982
|
-
/** A suggestion chip was clicked (only in `suggestion-mode="fill"`). */
|
|
1983
|
-
onSuggestionClick?: (event: CustomEvent<{ value: string }>) => void;
|
|
1984
|
-
/** Fired on every input change. */
|
|
1985
|
-
onValueChange?: (event: CustomEvent<{ value: string }>) => void;
|
|
1986
|
-
/** The Mic / voice button was clicked. */
|
|
1987
|
-
onVoice?: (event: CustomEvent<Record<string, never>>) => void;
|
|
2023
|
+
/** The aside was resized (fires per drag step, keyboard nudge, or a handle double-click reset), width in px. */
|
|
2024
|
+
onAsideResize?: (event: CustomEvent<{ side: "start" | "end"; width: number }>) => void;
|
|
2025
|
+
/** An aside collapsed or expanded (a method, the breakpoint, the drawer's Escape). */
|
|
2026
|
+
onAsideToggle?: (event: CustomEvent<{ side: "start" | "end"; collapsed: boolean }>) => void;
|
|
1988
2027
|
}
|
|
1989
2028
|
|
|
1990
2029
|
export const Workspace = /*#__PURE__*/ createWebComponent<WorkspaceProps>(
|
|
1991
2030
|
'kai-workspace',
|
|
1992
|
-
["theme","
|
|
1993
|
-
{
|
|
2031
|
+
["theme","startCollapsed","defaultStartCollapsed","endCollapsed","defaultEndCollapsed","collapseBelow","drawerBelow","compact"],
|
|
2032
|
+
{ onAsideResize: 'kai-aside-resize', onAsideToggle: 'kai-aside-toggle' },
|
|
1994
2033
|
() => import('@kitn.ai/ui/elements/chat-workspace'),
|
|
1995
2034
|
);
|