@kitn.ai/ui 0.20.1 → 0.22.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 +44 -45
- package/dist/components/artifact-card.d.ts +51 -0
- package/dist/components/artifact.d.ts +1 -1
- package/dist/components/attachments.d.ts +2 -2
- package/dist/components/audio-visualizer/index.d.ts +3 -3
- package/dist/components/audio-visualizer/labs/lab-choreography.d.ts +59 -0
- package/dist/components/audio-visualizer/labs/lab-shaders.d.ts +22 -0
- package/dist/components/audio-visualizer/labs/lab-visualizer.d.ts +18 -0
- package/dist/components/audio-visualizer/variant-aurora.d.ts +2 -2
- package/dist/components/audio-visualizer/variant-bar.d.ts +2 -2
- package/dist/components/audio-visualizer/variant-custom.d.ts +2 -2
- package/dist/components/audio-visualizer/variant-grid.d.ts +1 -1
- package/dist/components/audio-visualizer/variant-radial.d.ts +1 -1
- package/dist/components/audio-visualizer/variant-wave.d.ts +1 -1
- package/dist/components/card-fallback.d.ts +12 -2
- package/dist/components/card-renderer.d.ts +63 -2
- package/dist/components/chat-container.d.ts +3 -0
- package/dist/components/chat-scope-picker.d.ts +2 -2
- package/dist/components/chat-thread.d.ts +77 -18
- package/dist/components/choice-card.d.ts +3 -28
- package/dist/components/composer-dom.d.ts +1 -1
- package/dist/components/composer-highlight.d.ts +1 -1
- package/dist/components/composer-history.d.ts +1 -1
- package/dist/components/composer.d.ts +1 -1
- package/dist/components/confirm-card.d.ts +3 -18
- package/dist/components/context.d.ts +8 -4
- package/dist/components/conversation-item.d.ts +1 -1
- package/dist/components/conversation-list.d.ts +4 -3
- package/dist/components/embed.d.ts +3 -3
- package/dist/components/file-tree.d.ts +11 -22
- package/dist/components/form-widgets.d.ts +1 -1
- package/dist/components/form.d.ts +3 -44
- package/dist/components/link-preview.d.ts +3 -3
- package/dist/components/loader.d.ts +30 -48
- package/dist/components/message-skills.d.ts +4 -0
- package/dist/components/message.d.ts +84 -21
- package/dist/components/model-switcher.d.ts +2 -2
- package/dist/components/prompt-input.d.ts +2 -2
- package/dist/components/response-compare-types.d.ts +11 -2
- package/dist/components/response-compare.d.ts +3 -3
- package/dist/components/source.d.ts +12 -3
- package/dist/components/tasks-card.d.ts +3 -31
- package/dist/components/thread.d.ts +17 -5
- package/dist/components/toast.d.ts +2 -2
- package/dist/components/tool-classify.d.ts +8 -0
- package/dist/components/tool-types.d.ts +29 -1
- package/dist/components/tool.d.ts +3 -3
- package/dist/components/use-card-resolution.d.ts +1 -1
- package/dist/create-tween-COnPwAQN.js +338 -0
- package/dist/create-tween-DmTUaXWE.js +341 -0
- package/dist/create-tween-qs-jjvNA.js +7 -0
- package/dist/custom-elements.json +1726 -463
- 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/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-types.d.ts +70 -10
- 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-Tj58ES_d.js → Icon-CHG5z5L7.js} +1 -1
- package/dist/elements/chunks/{action-icons-ns1Fnedj.js → action-icons-BAtCEEgg.js} +1 -1
- package/dist/elements/chunks/arrow-left-CFPTeL1Y.js +1 -0
- package/dist/elements/chunks/artifact-fBZOE4SO.js +1 -0
- package/dist/elements/chunks/{attachments-mCB5F1Fq.js → attachments-DpYMe5VQ.js} +1 -1
- package/dist/elements/chunks/audio-visualizer-DFwzAcuL.js +1 -0
- package/dist/elements/chunks/{badge-B4Zuajl2.js → badge-D6zodm6E.js} +1 -1
- package/dist/elements/chunks/{button-ZWNif3--.js → button-C42vrGvO.js} +1 -1
- package/dist/elements/chunks/card-renderer-DMZsSuvU.js +1 -0
- package/dist/elements/chunks/card-tags-D8lZ-C_U.js +1 -0
- package/dist/elements/chunks/chat-thread-CNNEhol-.js +1 -0
- package/dist/elements/chunks/check-7Q3K-iXE.js +1 -0
- package/dist/elements/chunks/chevron-down-CpNYLn7E.js +1 -0
- package/dist/elements/chunks/chevron-right-DrH85Fha.js +1 -0
- package/dist/elements/chunks/choice-card-YoWjpsFV.js +1 -0
- package/dist/elements/chunks/circle-C9KRjKYv.js +1 -0
- package/dist/elements/chunks/circle-check-Dmi7Y4zw.js +1 -0
- package/dist/elements/chunks/{circle-x-B7faJFlY.js → circle-x-QIxXda6k.js} +1 -1
- package/dist/elements/chunks/code-block-CqeugReY.js +1 -0
- package/dist/elements/chunks/{collapsible-DM1Ckd4e.js → collapsible-sTv-_5lF.js} +1 -1
- package/dist/elements/chunks/{composer-BguS0QL_.js → composer-ldQyeVEB.js} +2 -2
- package/dist/elements/chunks/confirm-card-C0RNOwfn.js +1 -0
- package/dist/elements/chunks/context-5qgypNHC.js +1 -0
- package/dist/elements/chunks/conversation-list-DLzOacXz.js +1 -0
- package/dist/elements/chunks/create-tween-V4TXZ93X.js +7 -0
- package/dist/elements/chunks/default-input-DeeRSDHc.js +1 -0
- package/dist/elements/chunks/define-lE-QvQFn.js +1 -0
- package/dist/elements/chunks/{disclosure-CIZ5c8nO.js → disclosure-DZSa9jog.js} +1 -1
- package/dist/elements/chunks/{download-Dsbg3ste.js → download-B2ZmnGqW.js} +1 -1
- package/dist/elements/chunks/{dropdown-BDd1-Zgi.js → dropdown-R3B7cSRE.js} +1 -1
- package/dist/elements/chunks/{ellipsis-Dw6qrss-.js → ellipsis-BmxceY4l.js} +1 -1
- package/dist/elements/chunks/embed-BVrtTZPo.js +1 -0
- package/dist/elements/chunks/{external-link-Vt74zAoL.js → external-link-BbdR7YO7.js} +1 -1
- package/dist/elements/chunks/{file-text-CZrZF6_v.js → file-text-D7dijo1A.js} +1 -1
- package/dist/elements/chunks/{file-tree-DF4okKyo.js → file-tree-0upJ5jeb.js} +1 -1
- package/dist/elements/chunks/{folder-glP5rha4.js → folder-D8z58t7B.js} +1 -1
- package/dist/elements/chunks/form-p5BKJNw5.js +1 -0
- package/dist/elements/chunks/hover-card-CN9s2md5.js +1 -0
- package/dist/elements/chunks/{icon-BLb8beoi.js → icon-CNiKP37E.js} +1 -1
- package/dist/elements/chunks/{info-CIsv92JK.js → info-BSnuJiHI.js} +1 -1
- package/dist/elements/chunks/{input-Dds1kFyt.js → input-BauDmzxX.js} +1 -1
- package/dist/elements/chunks/{kbd-De_xbgi9.js → kbd-BlHJaP9b.js} +1 -1
- package/dist/elements/chunks/{link-i4r_k7z4.js → link-DEi5iUWC.js} +1 -1
- package/dist/elements/chunks/link-preview-BaHyM6W4.js +1 -0
- package/dist/elements/chunks/{loader-BmQH4s3V.js → loader-CmJG_Fkq.js} +1 -1
- package/dist/elements/chunks/{markdown-Zi21WhUz.js → markdown-D2jaMpCN.js} +1 -1
- package/dist/elements/chunks/message-C5UfXZ2Z.js +1 -0
- package/dist/elements/chunks/message-CXWLmmLn.js +1 -0
- package/dist/elements/chunks/message-square-hXylwsy0.js +1 -0
- package/dist/elements/chunks/{minimize-2--ifeCGrl.js → minimize-2-C9ytZFMU.js} +1 -1
- package/dist/elements/chunks/model-switcher-CivGfD7-.js +1 -0
- package/dist/elements/chunks/{overlay-kD8dwRv_.js → overlay-DJL_sbOm.js} +1 -1
- package/dist/elements/chunks/{paperclip-q21dYOSK.js → paperclip-CFaB8naM.js} +1 -1
- package/dist/elements/chunks/{progress-bar-BrAIIaaJ.js → progress-bar-Br5SksfR.js} +1 -1
- package/dist/elements/chunks/{prompt-suggestion-Bjn2K-fR.js → prompt-suggestion-CMIvtAhU.js} +1 -1
- package/dist/elements/chunks/reasoning-DpZcNzLq.js +1 -0
- package/dist/elements/chunks/{resizable-Dp4JExql.js → resizable-Q8i3T9a_.js} +1 -1
- package/dist/elements/chunks/{rotate-cw-CFWWkpj2.js → rotate-cw-B5IHCBFV.js} +1 -1
- package/dist/elements/chunks/{scroll-area-Bb0kHH1j.js → scroll-area-eLeydBje.js} +1 -1
- package/dist/elements/chunks/scroll-button-DWbz0yA1.js +1 -0
- package/dist/elements/chunks/{separator-9kRgr1X9.js → separator-Xic78AD_.js} +1 -1
- package/dist/elements/chunks/{settings-B8lmec4D.js → settings-B8H51pAx.js} +1 -1
- package/dist/elements/chunks/{settings-group-I0hEuXiN.js → settings-group-CsG9eYLe.js} +1 -1
- package/dist/elements/chunks/{share-C3lTiYGt.js → share-CNTx0z__.js} +1 -1
- package/dist/elements/chunks/skeleton-CLlHTcMI.js +1 -0
- package/dist/elements/chunks/slots-CIw9RlAe.js +1 -0
- package/dist/elements/chunks/source-BoVcU5ok.js +1 -0
- package/dist/elements/chunks/{star-CSJtGxgv.js → star-CxQVTVhI.js} +1 -1
- package/dist/elements/chunks/{store-CHyW95TP.js → store-CLtS5CUG.js} +1 -1
- package/dist/elements/chunks/tasks-card-CzlkLmUt.js +1 -0
- package/dist/elements/chunks/{text-shimmer-Cn9TmNpI.js → text-shimmer-D5NhpIQ1.js} +1 -1
- package/dist/elements/chunks/textarea-x5Uxsmtm.js +1 -0
- package/dist/elements/chunks/{thumbs-up-PNVVThEF.js → thumbs-up-UobcJnx9.js} +1 -1
- package/dist/elements/chunks/{toast-store-DKbQn3Wn.js → toast-store-BOfs9eXq.js} +1 -1
- package/dist/elements/chunks/{tool-DjTRpIpl.js → tool-Be6Dh_dt.js} +1 -1
- package/dist/elements/chunks/tooltip-RxMxyCLF.js +1 -0
- package/dist/elements/chunks/{triangle-alert-DsHTHCPm.js → triangle-alert-C4yxH2XN.js} +1 -1
- package/dist/elements/chunks/use-card-resolution-jva9ehH6.js +1 -0
- package/dist/elements/chunks/{variant-aurora-Dc4nQUia.js → variant-aurora-Dx4VRcjS.js} +2 -2
- package/dist/elements/chunks/{variant-custom-y_3kVQhS.js → variant-custom-Y1ZTWgEa.js} +1 -1
- package/dist/elements/chunks/{variant-wave-D5OR1-9Z.js → variant-wave-B9gml9Cg.js} +2 -2
- package/dist/elements/chunks/{video-B7vmenoC.js → video-CrPHsytT.js} +1 -1
- package/dist/elements/chunks/x-_-OPHept.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-list.js +1 -1
- package/dist/elements/default-input.d.ts +34 -7
- package/dist/elements/define.d.ts +1 -0
- package/dist/elements/dialog.js +1 -1
- package/dist/elements/disclosure.d.ts +1 -1
- package/dist/elements/editable-label.js +1 -1
- package/dist/elements/element-data-types.d.ts +107 -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 +8 -6
- package/dist/elements/remote.js +1 -1
- package/dist/elements/resizable.js +1 -1
- package/dist/elements/response-stream.js +1 -1
- 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/slot-text.d.ts +51 -0
- package/dist/elements/slots.d.ts +21 -0
- 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/validate-messages.d.ts +25 -0
- package/dist/elements/voice-input.js +1 -1
- package/dist/elements/voice-output.js +1 -1
- package/dist/elements.d.ts +2734 -217
- package/dist/index.d.ts +163 -125
- package/dist/index.js +6572 -5990
- package/dist/index.server.d.ts +5 -0
- package/dist/index.server.js +5403 -4860
- package/dist/kai-provider.es.d.ts +5 -0
- package/dist/kai-provider.es.js +79 -77
- package/dist/kai.es.d.ts +5 -0
- package/dist/kai.es.js +1 -1
- package/dist/llms/llms-full.txt +774 -151
- package/dist/llms/llms.txt +57 -5
- package/dist/mcp.es.js +4756 -782
- package/dist/primitives/card-component-types.d.ts +11 -0
- package/dist/primitives/card-data-types.d.ts +196 -0
- package/dist/primitives/card-host.d.ts +1 -1
- package/dist/primitives/card-recovery.d.ts +3 -3
- package/dist/primitives/card-registry.d.ts +4 -14
- package/dist/primitives/card-resolution.d.ts +1 -1
- package/dist/primitives/card-routing.d.ts +1 -1
- package/dist/primitives/card-tags.d.ts +11 -0
- package/dist/primitives/card-validate-cards.d.ts +57 -0
- package/dist/primitives/card-validate-generator.testlib.d.ts +20 -0
- package/dist/primitives/card-validate-schemas.d.ts +17 -0
- package/dist/primitives/card-validate.d.ts +24 -0
- package/dist/primitives/create-kai-chat.d.ts +3 -3
- package/dist/primitives/embed-providers.d.ts +1 -1
- package/dist/primitives/link-preview.d.ts +1 -1
- package/dist/primitives/message-feedback.d.ts +2 -2
- package/dist/primitives/toast-store.d.ts +1 -1
- package/dist/react/index.d.ts +730 -302
- package/dist/react/use-kai-chat.d.ts +8 -4
- package/dist/react.d.ts +5 -0
- package/dist/react.js +418 -317
- package/dist/register-impl-AxIlqjo7.js +145 -0
- package/dist/remote/host-embed.d.ts +1 -1
- package/dist/remote/index.d.ts +2 -2
- package/dist/remote/provider-runtime.d.ts +2 -2
- package/dist/remote/provider.d.ts +2 -2
- package/dist/remote/validate.d.ts +1 -1
- package/dist/remote/wire.d.ts +1 -1
- package/dist/schemas/artifact.schema.json +92 -0
- package/dist/schemas/embed.schema.json +0 -2
- package/dist/schemas/from-tool-call.d.ts +48 -0
- package/dist/schemas/index.d.ts +48 -0
- package/dist/schemas/link.schema.json +0 -2
- package/dist/schemas/provider-subsets.d.ts +136 -0
- package/dist/schemas/registry.d.ts +140 -0
- package/dist/schemas/tool-defs.d.ts +121 -0
- package/dist/schemas.d.ts +5 -0
- package/dist/schemas.js +717 -0
- package/dist/solid-BGYSJyHG.js +22960 -0
- package/dist/solid-Dt2nEwfl.js +20194 -0
- package/dist/solid.d.ts +66 -0
- package/dist/solid.js +261 -0
- package/dist/solid.server.d.ts +5 -0
- package/dist/solid.server.js +261 -0
- package/dist/state/index.d.ts +14 -4
- package/dist/state/messages.d.ts +8 -3
- package/dist/state/mock.d.ts +46 -0
- package/dist/state/parts.d.ts +85 -0
- package/dist/state/stream.d.ts +15 -9
- package/dist/state.d.ts +5 -0
- package/dist/state.js +253 -84
- package/dist/ui/action-icons.d.ts +1 -1
- package/dist/ui/collapsible.d.ts +11 -6
- package/dist/ui/dropdown.d.ts +47 -42
- package/dist/ui/pane-group.d.ts +1 -1
- package/dist/{variant-aurora-DVtGqVH6.js → variant-aurora-B44X69AG.js} +1 -1
- package/dist/variant-aurora-BRhV8Flk.js +391 -0
- package/dist/variant-aurora-Ds5ou9BH.js +381 -0
- package/dist/variant-custom-B20FhtYj.js +170 -0
- package/dist/{variant-custom-Dif-IV4u.js → variant-custom-BvA1Schl.js} +1 -1
- package/dist/variant-custom-D6Rtvneb.js +200 -0
- package/dist/{variant-wave-DbfNdvSi.js → variant-wave-BUQtkryq.js} +1 -1
- package/dist/variant-wave-BVYnqy9L.js +218 -0
- package/dist/variant-wave-DXC6_LcH.js +208 -0
- package/dist/wire/chunk.d.ts +171 -0
- package/dist/wire/consume.d.ts +26 -0
- package/dist/wire/encode.d.ts +221 -0
- package/dist/wire/files.d.ts +116 -0
- package/dist/wire/formats/anthropic.d.ts +2 -0
- package/dist/wire/formats/openai.d.ts +5 -0
- package/dist/wire/index.d.ts +16 -0
- package/dist/wire/media-types.d.ts +106 -0
- package/dist/wire/read.d.ts +26 -0
- package/dist/wire/sink-helpers.d.ts +21 -0
- package/dist/wire/sse.d.ts +33 -0
- package/dist/wire.d.ts +5 -53
- package/dist/wire.js +1126 -0
- package/frameworks/react/index.tsx +191 -158
- package/frameworks/react/runtime.tsx +21 -1
- package/frameworks/react/use-kai-chat.tsx +11 -1
- package/llms-full.txt +774 -151
- package/llms.txt +57 -5
- package/package.json +62 -8
- package/src/agent-tooling/archetypes.ts +127 -0
- package/src/agent-tooling/integrations/anthropic.ts +436 -0
- package/src/agent-tooling/integrations/cloudflare.ts +141 -52
- package/src/agent-tooling/integrations/langgraph.ts +80 -13
- package/src/agent-tooling/integrations/mastra.ts +161 -12
- package/src/agent-tooling/integrations/mock.ts +47 -8
- package/src/agent-tooling/integrations/ollama.ts +68 -24
- package/src/agent-tooling/integrations/openai.ts +89 -0
- package/src/agent-tooling/integrations/openrouter.ts +58 -8
- package/src/agent-tooling/integrations/pi.ts +104 -23
- package/src/agent-tooling/integrations/pydantic-ai.ts +61 -5
- package/src/agent-tooling/integrations/vercel-ai-sdk.ts +120 -13
- package/src/agent-tooling/mcp/manifest.ts +206 -25
- package/src/agent-tooling/mcp/tools/debug.ts +13 -7
- package/src/agent-tooling/mcp/tools/reference.ts +285 -6
- package/src/agent-tooling/mcp/tools/scaffold.ts +4152 -661
- package/src/agent-tooling/registry.ts +74 -0
- package/src/agent-tooling/types.ts +361 -1
- package/src/components/artifact-card.tsx +120 -0
- package/src/components/audio-visualizer/index.tsx +9 -0
- package/src/components/audio-visualizer/labs/lab-choreography.ts +187 -0
- package/src/components/audio-visualizer/labs/lab-shaders.ts +363 -0
- package/src/components/audio-visualizer/labs/lab-visualizer.tsx +102 -0
- package/src/components/audio-visualizer/shader-canvas.tsx +31 -1
- package/src/components/card-fallback.tsx +42 -10
- package/src/components/card-renderer.tsx +146 -9
- package/src/components/chat-container.tsx +4 -0
- package/src/components/chat-thread.tsx +128 -52
- package/src/components/choice-card.tsx +17 -29
- package/src/components/composer.tsx +12 -2
- package/src/components/confirm-card.tsx +24 -20
- package/src/components/context.tsx +30 -16
- package/src/components/conversation-item.tsx +6 -0
- package/src/components/conversation-list.tsx +18 -2
- package/src/components/file-tree.tsx +11 -22
- package/src/components/file-upload.tsx +14 -8
- package/src/components/form.tsx +14 -47
- package/src/components/loader.tsx +39 -12
- package/src/components/message-skills.tsx +4 -0
- package/src/components/message.tsx +294 -46
- package/src/components/model-switcher.tsx +38 -8
- package/src/components/reasoning.tsx +92 -5
- package/src/components/response-compare-types.ts +25 -0
- package/src/components/response-compare.tsx +4 -9
- package/src/components/source.tsx +50 -24
- package/src/components/tasks-card.tsx +10 -33
- package/src/components/thread.tsx +84 -42
- package/src/components/toast.tsx +17 -6
- package/src/components/tool-classify.ts +26 -0
- package/src/components/tool-types.ts +31 -1
- package/src/elements/agent-card.tsx +11 -11
- package/src/elements/artifact.tsx +15 -7
- package/src/elements/attachments.tsx +6 -4
- package/src/elements/avatar.tsx +1 -1
- package/src/elements/button.tsx +29 -6
- package/src/elements/card.tsx +2 -2
- package/src/elements/cards.tsx +109 -14
- package/src/elements/chain-of-thought.tsx +14 -10
- package/src/elements/chat-scope-picker.tsx +9 -7
- package/src/elements/chat-types.ts +59 -6
- package/src/elements/chat-workspace.tsx +50 -9
- package/src/elements/chat.tsx +90 -3
- package/src/elements/choice.tsx +8 -8
- package/src/elements/coachmark.tsx +1 -1
- package/src/elements/command.tsx +8 -23
- package/src/elements/compare.tsx +7 -6
- package/src/elements/compiled.css +1 -1
- package/src/elements/composer.tsx +8 -8
- package/src/elements/confirm-card.tsx +9 -9
- package/src/elements/context-meter.tsx +4 -18
- package/src/elements/conversation-list.tsx +14 -9
- package/src/elements/default-input.tsx +131 -8
- package/src/elements/define.tsx +178 -43
- package/src/elements/editable-label.tsx +17 -2
- package/src/elements/element-data-types.ts +112 -0
- package/src/elements/element-meta.json +1624 -306
- package/src/elements/element-types.d.ts +2645 -214
- package/src/elements/feedback-bar.tsx +1 -1
- package/src/elements/file-tree.tsx +1 -1
- package/src/elements/file-upload.tsx +1 -1
- package/src/elements/form.tsx +14 -6
- package/src/elements/input.tsx +1 -1
- package/src/elements/kbd.tsx +1 -1
- package/src/elements/menu.tsx +40 -32
- package/src/elements/message-skills.tsx +7 -9
- package/src/elements/message.tsx +200 -32
- package/src/elements/model-switcher.tsx +5 -3
- package/src/elements/pane.tsx +1 -1
- package/src/elements/prompt-dock.tsx +8 -8
- package/src/elements/prompt-input.tsx +10 -10
- package/src/elements/prompt-suggestions.tsx +7 -4
- package/src/elements/reasoning.tsx +1 -1
- package/src/elements/register.ts +9 -0
- package/src/elements/resizable.globals.d.ts +36 -0
- package/src/elements/resizable.tsx +24 -13
- package/src/elements/response-stream.tsx +1 -1
- package/src/elements/scroll-button.tsx +1 -1
- package/src/elements/search.tsx +6 -1
- package/src/elements/segmented.tsx +5 -11
- package/src/elements/separator.tsx +1 -1
- package/src/elements/slot-text.ts +73 -0
- package/src/elements/slots.ts +67 -24
- package/src/elements/source.tsx +21 -22
- package/src/elements/switch.tsx +3 -3
- package/src/elements/tasks.tsx +5 -4
- package/src/elements/thread.tsx +36 -4
- package/src/elements/toast.tsx +3 -2
- package/src/elements/tool.tsx +1 -1
- package/src/elements/validate-messages.ts +76 -0
- package/src/elements/voice-input.tsx +7 -7
- package/src/elements/voice-output.tsx +4 -4
- package/src/index.ts +145 -6
- package/src/primitives/card-component-types.ts +63 -0
- package/src/primitives/card-data-types.ts +312 -0
- package/src/primitives/card-recovery.ts +13 -2
- package/src/primitives/card-registry.tsx +34 -23
- package/src/primitives/card-schemas/artifact.schema.json +92 -0
- package/src/primitives/card-schemas/embed.schema.json +0 -2
- package/src/primitives/card-schemas/link.schema.json +0 -2
- package/src/primitives/card-tags.ts +61 -0
- package/src/primitives/card-validate-cards.ts +255 -0
- package/src/primitives/card-validate-generator.testlib.ts +38 -0
- package/src/primitives/card-validate-schemas.ts +58 -0
- package/src/primitives/card-validate.ts +48 -20
- package/src/primitives/create-tween.ts +54 -2
- package/src/primitives/message-feedback.ts +3 -2
- package/src/primitives/use-audio-analysis.ts +20 -1
- package/src/primitives/use-sequencer.ts +20 -1
- package/src/schemas/from-tool-call.ts +151 -0
- package/src/schemas/index.ts +340 -0
- package/src/schemas/provider-subsets.ts +538 -0
- package/src/schemas/registry.ts +355 -0
- package/src/schemas/tool-defs.ts +492 -0
- package/src/solid.ts +150 -0
- package/src/state/index.ts +27 -1
- package/src/state/messages.ts +21 -4
- package/src/state/mock.ts +211 -0
- package/src/state/parts.ts +295 -0
- package/src/state/stream.ts +56 -58
- package/src/ui/collapsible.tsx +17 -5
- package/src/ui/dropdown.tsx +46 -12
- package/src/ui/overlay.tsx +10 -4
- package/src/wire/chunk.ts +201 -0
- package/src/wire/consume.ts +440 -0
- package/src/wire/encode.ts +689 -0
- package/src/wire/files.ts +342 -0
- package/src/wire/formats/anthropic.ts +267 -0
- package/src/wire/formats/openai.ts +187 -0
- package/src/wire/index.ts +73 -0
- package/src/wire/media-types.ts +344 -0
- package/src/wire/read.ts +152 -0
- package/src/wire/sink-helpers.ts +50 -0
- package/src/wire/sse.ts +140 -0
- package/dist/create-tween-hvpmSuwW.js +0 -7
- package/dist/elements/chunks/arrow-left-DQocUFvy.js +0 -1
- package/dist/elements/chunks/audio-visualizer-BqNy7dfm.js +0 -1
- package/dist/elements/chunks/card-BkHbp4BA.js +0 -1
- package/dist/elements/chunks/chat-thread-CkRN6pZ7.js +0 -1
- package/dist/elements/chunks/check-B9-gn6SS.js +0 -1
- package/dist/elements/chunks/chevron-down-BNsxc2hk.js +0 -1
- package/dist/elements/chunks/chevron-right-Hv00StBO.js +0 -1
- package/dist/elements/chunks/circle-0e3KJTDr.js +0 -1
- package/dist/elements/chunks/circle-check-BNAS0JEy.js +0 -1
- package/dist/elements/chunks/code-block-BFUHn6Va.js +0 -1
- package/dist/elements/chunks/context-Cb7k4F-v.js +0 -1
- package/dist/elements/chunks/conversation-list-CvoAkWhN.js +0 -1
- package/dist/elements/chunks/create-tween-oVvAIG8r.js +0 -7
- package/dist/elements/chunks/default-input-Cqqilg9t.js +0 -1
- package/dist/elements/chunks/define-D1din7Ld.js +0 -1
- package/dist/elements/chunks/hover-card-Cmm6Q53m.js +0 -1
- package/dist/elements/chunks/message-BqyXDN3-.js +0 -1
- package/dist/elements/chunks/message-feedback-Djr3z6Yb.js +0 -1
- package/dist/elements/chunks/message-square-vFAgbDaX.js +0 -1
- package/dist/elements/chunks/model-switcher-B94YAKsM.js +0 -1
- package/dist/elements/chunks/reasoning-DTpCGtnY.js +0 -1
- package/dist/elements/chunks/scroll-button-B0cH5fXf.js +0 -1
- package/dist/elements/chunks/skeleton-DSXW5Yya.js +0 -1
- package/dist/elements/chunks/slots--V19HwUb.js +0 -1
- package/dist/elements/chunks/textarea-CUwqAX0G.js +0 -1
- package/dist/elements/chunks/tooltip-CgBZCVKp.js +0 -1
- package/dist/elements/chunks/use-card-resolution-BSu_XHjH.js +0 -1
- package/dist/elements/chunks/x-GRUeeQFT.js +0 -1
- package/dist/host-embed.d.ts +0 -33
- package/dist/kai-provider.d.ts +0 -2
- package/dist/origin.d.ts +0 -5
- package/dist/provider-runtime.d.ts +0 -27
- package/dist/register-impl-DQyejdfb.js +0 -145
- package/dist/validate.d.ts +0 -4
- package/dist/version.d.ts +0 -4
- package/src/components/component-meta.json +0 -4550
- package/src/elements/card-media.jpg +0 -0
- package/src/elements/resizable.d.ts +0 -27
- package/src/elements/video-poster.jpg +0 -0
package/src/elements/tasks.tsx
CHANGED
|
@@ -6,7 +6,7 @@ interface Props extends Record<string, unknown> {
|
|
|
6
6
|
/** The tasks definition (the CardEnvelope.data). Set as a JS PROPERTY:
|
|
7
7
|
* `el.data = { tasks:[…], selectAll, confirmLabel, … }`. Import
|
|
8
8
|
* `TasksCardData` from `@kitn.ai/ui` for the full shape. */
|
|
9
|
-
data?:
|
|
9
|
+
data?: TasksCardData;
|
|
10
10
|
/** Stable card id correlating every emitted CardEvent. Attribute: `card-id`. */
|
|
11
11
|
cardId?: string;
|
|
12
12
|
/** Heading rendered in the card chrome (= CardEnvelope.title). Attribute: `heading`. */
|
|
@@ -29,7 +29,8 @@ interface Props extends Record<string, unknown> {
|
|
|
29
29
|
* contract event — `kai-value-change` is the live selection signal, distinct from
|
|
30
30
|
* the terminal submit.) */
|
|
31
31
|
interface Events {
|
|
32
|
-
/** The selection changed on a toggle
|
|
32
|
+
/** The selection changed on a toggle. Carries the selected ids in input
|
|
33
|
+
* order. */
|
|
33
34
|
'kai-value-change': { value: string[] };
|
|
34
35
|
}
|
|
35
36
|
|
|
@@ -72,7 +73,7 @@ defineWebComponent<Props, Events>(
|
|
|
72
73
|
select: (taskIds?: string[]) => controller?.select(taskIds),
|
|
73
74
|
/** Toggle one task by id, honoring the max gate (no `checked` = flip). */
|
|
74
75
|
toggle: (taskId: string, checked?: boolean) => controller?.toggle(taskId, checked),
|
|
75
|
-
/** Confirm the current selection
|
|
76
|
+
/** Confirm the current selection: emits the `submit` CardEvent + resolves
|
|
76
77
|
* (only when the min/max gate passes). Named `send`, not `submit`. */
|
|
77
78
|
send: () => controller?.send(),
|
|
78
79
|
/** Focus the task group (select-all checkbox if shown, else the first row). */
|
|
@@ -85,7 +86,7 @@ defineWebComponent<Props, Events>(
|
|
|
85
86
|
|
|
86
87
|
return (
|
|
87
88
|
<TasksCard
|
|
88
|
-
data={props.data
|
|
89
|
+
data={props.data}
|
|
89
90
|
cardId={props.cardId ?? (element.id || 'kai-tasks')}
|
|
90
91
|
heading={props.heading}
|
|
91
92
|
resolution={props.resolution as CardResolution | undefined}
|
package/src/elements/thread.tsx
CHANGED
|
@@ -2,17 +2,19 @@ import { createSignal, onMount, onCleanup } from 'solid-js';
|
|
|
2
2
|
import { defineWebComponent } from './define';
|
|
3
3
|
import { readSlots, THREAD_SLOTS } from './slots';
|
|
4
4
|
import { Thread, type ThreadController } from '../components/thread';
|
|
5
|
+
import { cardComponentsFromTags } from './message';
|
|
6
|
+
import { createMessagesGuard } from './validate-messages';
|
|
5
7
|
import type { ChatMessage } from './chat-types';
|
|
6
8
|
import type { ProseSize } from '../primitives/chat-config';
|
|
7
9
|
|
|
8
10
|
interface Props extends Record<string, unknown> {
|
|
9
11
|
/** The full message thread to render, newest last. Each entry carries its role,
|
|
10
|
-
*
|
|
12
|
+
* ordered `parts`, and optional actions/avatar/feedback. Set as a JS
|
|
11
13
|
* property (`el.messages = [...]`); a NEW array reference per streaming chunk
|
|
12
14
|
* re-renders (mutating in place does not). */
|
|
13
15
|
messages?: ChatMessage[];
|
|
14
|
-
/** Show a typing indicator on the pending assistant turn
|
|
15
|
-
* the assistant's reply. */
|
|
16
|
+
/** Show a typing indicator on the pending assistant turn. Set it while
|
|
17
|
+
* awaiting the assistant's reply. */
|
|
16
18
|
loading?: boolean;
|
|
17
19
|
/** Body/prose font scale for rendered markdown (`'xs' | 'sm' | 'base' | 'lg'`).
|
|
18
20
|
* Defaults to `'sm'`. */
|
|
@@ -30,6 +32,26 @@ interface Props extends Record<string, unknown> {
|
|
|
30
32
|
scrollButton?: boolean;
|
|
31
33
|
/** Extra classes applied to the thread's inner root. */
|
|
32
34
|
class?: string;
|
|
35
|
+
/** Optional card type -> custom-element tag overrides/additions for `card`
|
|
36
|
+
* parts (merged over the built-ins). Property: `el.cardTypes`. Typed as a
|
|
37
|
+
* plain string map (not the `CardTagMap` alias) so the generated React
|
|
38
|
+
* wrapper inlines it instead of emitting an unresolved named type. */
|
|
39
|
+
cardTypes?: Record<string, string>;
|
|
40
|
+
/** JSON Schemas for the card types this app renders, keyed by envelope type. The
|
|
41
|
+
* companion of `cardTypes`, which says what DRAWS a card while this says what a
|
|
42
|
+
* VALID one looks like. An OBJECT, so it is a JS property only: `el.cardSchemas
|
|
43
|
+
* = { 'pricing-table': pricingSchema }`, never an attribute.
|
|
44
|
+
* `createCardRegistry(...).validationSchemas` is exactly this shape.
|
|
45
|
+
*
|
|
46
|
+
* Without it the kit validates its own seven built-ins and leaves your own card
|
|
47
|
+
* type, the one your app actually cares about, as the only unchecked thing on
|
|
48
|
+
* screen. A schema here WINS over a built-in of the same name.
|
|
49
|
+
*
|
|
50
|
+
* Typed `Record<string, object>` rather than `Record<string, JsonSchema>`
|
|
51
|
+
* deliberately: an imported `.json` schema widens `"type"` to `string`, and an
|
|
52
|
+
* authored one carries `$schema`/`title`/`description`/`additionalProperties`,
|
|
53
|
+
* so the tighter type would reject both of the normal ways to supply one. */
|
|
54
|
+
cardSchemas?: Record<string, object>;
|
|
33
55
|
}
|
|
34
56
|
|
|
35
57
|
/** Events fired by `<kai-thread>`. */
|
|
@@ -61,9 +83,17 @@ defineWebComponent<Props, Events>('kai-thread', {
|
|
|
61
83
|
actionsReveal: 'always',
|
|
62
84
|
scrollButton: true,
|
|
63
85
|
class: undefined,
|
|
86
|
+
cardTypes: undefined,
|
|
87
|
+
cardSchemas: undefined,
|
|
64
88
|
}, (props, { element, dispatch, flag, expose }) => {
|
|
65
89
|
let controller: ThreadController | undefined;
|
|
66
90
|
|
|
91
|
+
// `messages` is an untyped boundary: a consumer can hand it anything at
|
|
92
|
+
// runtime (a pre-0.20.0 `{ id, role, content }` array, in particular). Skip
|
|
93
|
+
// the invalid entries rather than let `groupMessageParts` throw deep inside a
|
|
94
|
+
// render pass, which would blank the whole element instead of one message.
|
|
95
|
+
const validMessages = createMessagesGuard('kai-thread');
|
|
96
|
+
|
|
67
97
|
// Detect whether the consumer projected `slot="empty"` content, so the built-in
|
|
68
98
|
// default only renders when they did NOT.
|
|
69
99
|
const [slots, setSlots] = createSignal<Record<string, boolean>>({});
|
|
@@ -89,13 +119,15 @@ defineWebComponent<Props, Events>('kai-thread', {
|
|
|
89
119
|
<style>{':host{display:block;height:100%}'}</style>
|
|
90
120
|
<Thread
|
|
91
121
|
class={props.class as string | undefined}
|
|
92
|
-
messages={(props.messages
|
|
122
|
+
messages={validMessages(props.messages)}
|
|
93
123
|
loading={flag('loading')}
|
|
94
124
|
proseSize={props.proseSize as ProseSize}
|
|
95
125
|
codeTheme={props.codeTheme as string}
|
|
96
126
|
codeHighlight={flag('codeHighlight')}
|
|
97
127
|
actionsReveal={props.actionsReveal as 'always' | 'hover'}
|
|
98
128
|
scrollButton={props.scrollButton !== false}
|
|
129
|
+
cardTypes={cardComponentsFromTags(props.cardTypes as Record<string, string> | undefined, (props as { theme?: string }).theme)}
|
|
130
|
+
cardSchemas={props.cardSchemas as Record<string, object> | undefined}
|
|
99
131
|
empty={slots()['empty'] ? <slot name="empty" /> : undefined}
|
|
100
132
|
onMessageAction={(detail) => dispatch('kai-message-action', detail)}
|
|
101
133
|
controllerRef={(c) => (controller = c)}
|
package/src/elements/toast.tsx
CHANGED
|
@@ -4,8 +4,9 @@ import { toast as toastStore, type ToastItem } from '../primitives/toast-store';
|
|
|
4
4
|
|
|
5
5
|
interface Props extends Record<string, unknown> {
|
|
6
6
|
/** The toasts to render. Newest is shown on top. Set as a JS property (array);
|
|
7
|
-
* pass a new array reference to update.
|
|
8
|
-
|
|
7
|
+
* pass a new array reference to update. Omit for an empty region, which is
|
|
8
|
+
* the normal resting state and how the imperative `toast()` API starts. */
|
|
9
|
+
toasts?: ToastItem[];
|
|
9
10
|
/** Stack anchor: `'top-center'` (default), `'top-right'`, `'bottom-center'`, … */
|
|
10
11
|
position?: ToastPosition;
|
|
11
12
|
/** Max simultaneously-visible toasts; the rest queue. Defaults to `3`. */
|
package/src/elements/tool.tsx
CHANGED
|
@@ -13,7 +13,7 @@ interface Props extends Record<string, unknown> {
|
|
|
13
13
|
open?: boolean;
|
|
14
14
|
/** Initial open state on mount (uncontrolled seed). */
|
|
15
15
|
defaultOpen?: boolean;
|
|
16
|
-
/** Gate the disclosure trigger
|
|
16
|
+
/** Gate the disclosure trigger: programmatic `show()/hide()/toggle()` still
|
|
17
17
|
* work, but the trigger click no longer toggles. */
|
|
18
18
|
disabled?: boolean;
|
|
19
19
|
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import type { ChatMessage } from './chat-types';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Boundary validation for the untyped `message` / `messages` properties.
|
|
5
|
+
*
|
|
6
|
+
* A web component's properties are an untyped boundary: nothing stops a consumer
|
|
7
|
+
* from assigning the pre-0.20.0 `{ id, role, content }` shape, and TypeScript is
|
|
8
|
+
* not there at runtime to catch it. `parts` is REQUIRED internally, so a message
|
|
9
|
+
* without one throws inside a Solid render pass (`groupMessageParts` iterating
|
|
10
|
+
* `undefined`), and an uncaught exception there blanks the WHOLE element, not
|
|
11
|
+
* just the offending message. Validating here turns that into a skipped message
|
|
12
|
+
* plus one clear console error naming the element and the expected shape.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
/** True when `m` carries the required `parts` array. */
|
|
16
|
+
export function hasParts(m: unknown): m is ChatMessage {
|
|
17
|
+
return !!m && typeof m === 'object' && Array.isArray((m as { parts?: unknown }).parts);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** Shared tail of every diagnostic, so all facades say the same thing. */
|
|
21
|
+
const EXPECTED =
|
|
22
|
+
"each entry needs a 'parts' array (e.g. parts: [{ type: 'text', text: 'Hi' }]). " +
|
|
23
|
+
"The 'content' string field was removed in 0.20.0.";
|
|
24
|
+
|
|
25
|
+
const EMPTY: ChatMessage[] = [];
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Creates a per-element-instance validator for a `messages` array. Returns the
|
|
29
|
+
* INPUT array unchanged when every entry is valid (no allocation, so streaming
|
|
30
|
+
* identity checks upstream still hold), a filtered copy when some are not, and
|
|
31
|
+
* `[]` when the property itself is not an array.
|
|
32
|
+
*
|
|
33
|
+
* Logs at most one `console.error` per validation pass, and never re-logs for a
|
|
34
|
+
* message object it has already reported, so an unrelated re-render during
|
|
35
|
+
* streaming does not spam the console.
|
|
36
|
+
*/
|
|
37
|
+
export function createMessagesGuard(tag: string): (messages: unknown) => ChatMessage[] {
|
|
38
|
+
const warned = new WeakSet<object>();
|
|
39
|
+
// WeakSet only holds objects, so primitive entries (a stray string/null in the
|
|
40
|
+
// array) get one shared latch instead.
|
|
41
|
+
let warnedPrimitive = false;
|
|
42
|
+
let warnedNonArray = false;
|
|
43
|
+
|
|
44
|
+
return (messages: unknown): ChatMessage[] => {
|
|
45
|
+
if (!Array.isArray(messages)) {
|
|
46
|
+
if (messages != null && !warnedNonArray) {
|
|
47
|
+
warnedNonArray = true;
|
|
48
|
+
console.error(`<${tag}>: 'messages' must be an array. Ignoring it.`);
|
|
49
|
+
}
|
|
50
|
+
return EMPTY;
|
|
51
|
+
}
|
|
52
|
+
// Fast path: nothing to report, hand back the same reference.
|
|
53
|
+
if (messages.every(hasParts)) return messages as ChatMessage[];
|
|
54
|
+
|
|
55
|
+
let invalid = 0;
|
|
56
|
+
let unreported = 0;
|
|
57
|
+
for (const m of messages) {
|
|
58
|
+
if (hasParts(m)) continue;
|
|
59
|
+
invalid++;
|
|
60
|
+
if (m !== null && typeof m === 'object') {
|
|
61
|
+
if (warned.has(m as object)) continue;
|
|
62
|
+
warned.add(m as object);
|
|
63
|
+
} else {
|
|
64
|
+
if (warnedPrimitive) continue;
|
|
65
|
+
warnedPrimitive = true;
|
|
66
|
+
}
|
|
67
|
+
unreported++;
|
|
68
|
+
}
|
|
69
|
+
if (unreported > 0) {
|
|
70
|
+
console.error(
|
|
71
|
+
`<${tag}>: skipped ${invalid} of ${messages.length} messages: ${EXPECTED}`,
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
return messages.filter(hasParts);
|
|
75
|
+
};
|
|
76
|
+
}
|
|
@@ -3,7 +3,7 @@ import { VoiceInput, type VoiceInputController } from '../components/voice-input
|
|
|
3
3
|
|
|
4
4
|
interface Props extends Record<string, unknown> {
|
|
5
5
|
/**
|
|
6
|
-
* Transcriber the host supplies
|
|
6
|
+
* Transcriber the host supplies: records audio, returns the text. This is a
|
|
7
7
|
* **function-valued property** (`el.transcribe = async blob => '...'`) because
|
|
8
8
|
* a value-returning callback can't be modelled as a fire-and-forget event.
|
|
9
9
|
*/
|
|
@@ -24,18 +24,18 @@ interface Props extends Record<string, unknown> {
|
|
|
24
24
|
|
|
25
25
|
/** Events fired by `<kai-voice-input>`. */
|
|
26
26
|
interface Events {
|
|
27
|
-
/** Raw audio captured (before transcription)
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
27
|
+
/** Raw audio captured (before transcription), for hosts that prefer to handle
|
|
28
|
+
* transcription themselves instead of via the `transcribe` property. Also the
|
|
29
|
+
* unsupported-fallback signal: no `transcribe`, no SpeechRecognition, so only
|
|
30
|
+
* the blob is produced (no text). */
|
|
31
31
|
'kai-audio-captured': { blob: Blob };
|
|
32
|
-
/** Final transcript
|
|
32
|
+
/** Final transcript: the `transcribe` property resolved, OR native
|
|
33
33
|
* `SpeechRecognition` produced final text (no `transcribe` set). */
|
|
34
34
|
'kai-transcription': { text: string };
|
|
35
35
|
/** Live partial transcript during native recognition (only when `interim` is
|
|
36
36
|
* set). Fires repeatedly before the final `kai-transcription`. */
|
|
37
37
|
'kai-transcript-interim': { text: string };
|
|
38
|
-
/** Recording started or stopped
|
|
38
|
+
/** Recording started or stopped. Lets the host drive its own UI (waveform,
|
|
39
39
|
* push-to-talk indicator) in sync with the mic. Fires on real transitions
|
|
40
40
|
* only (manual click and programmatic start()/stop()), never on mount. */
|
|
41
41
|
'kai-recording-change': { recording: boolean };
|
|
@@ -7,7 +7,7 @@ interface Props extends Record<string, unknown> {
|
|
|
7
7
|
/** Speak automatically when `text` is set/changed. */
|
|
8
8
|
autoplay?: boolean;
|
|
9
9
|
/**
|
|
10
|
-
* TTS model seam the host supplies
|
|
10
|
+
* TTS model seam the host supplies: given text, returns an audio `Blob` to
|
|
11
11
|
* play. This is a **function-valued property** (`el.synthesize = async text =>
|
|
12
12
|
* blob`); when set, the native `speechSynthesis` path is bypassed. Mirrors
|
|
13
13
|
* `<kai-voice-input>`'s `transcribe`. A value-returning callback can't be
|
|
@@ -20,10 +20,10 @@ interface Props extends Record<string, unknown> {
|
|
|
20
20
|
|
|
21
21
|
/** Events fired by `<kai-voice-output>`. */
|
|
22
22
|
interface Events {
|
|
23
|
-
/** Playback started or stopped
|
|
24
|
-
*
|
|
23
|
+
/** Playback started or stopped. Drive your own UI in sync. Fires on real transitions
|
|
24
|
+
* only (manual click and programmatic speak()/stop()), never on mount. */
|
|
25
25
|
'kai-speaking-change': { speaking: boolean };
|
|
26
|
-
/** The model path (`synthesize`) resolved audio
|
|
26
|
+
/** The model path (`synthesize`) resolved audio: the raw `Blob` before playback. */
|
|
27
27
|
'kai-synthesized': { blob: Blob };
|
|
28
28
|
}
|
|
29
29
|
|
package/src/index.ts
CHANGED
|
@@ -1,3 +1,26 @@
|
|
|
1
|
+
// The package root entry (".").
|
|
2
|
+
//
|
|
3
|
+
// SCOPE — read before adding an export here.
|
|
4
|
+
// -----------------------------------------
|
|
5
|
+
// Every consumer of `@kitn.ai/ui` pays for this barrel, INCLUDING React/Vue/
|
|
6
|
+
// Svelte consumers who never render a Solid component. It is therefore frozen at
|
|
7
|
+
// the surface that shipped: adding a Solid component here taxes four frameworks
|
|
8
|
+
// to serve one. Closing the element coverage gaps on this file grew it
|
|
9
|
+
// 591,359 -> 705,031 bytes (+19.2%), which is what motivated the split. (That
|
|
10
|
+
// measurement was taken at the then-79 elements; the catalog grows, the bytes
|
|
11
|
+
// quoted do not — they are a record of the split, not a current reading.)
|
|
12
|
+
//
|
|
13
|
+
// The COMPLETE SolidJS surface — a component for EVERY registered element plus a
|
|
14
|
+
// `<Name>Props` type for every public component — lives on `@kitn.ai/ui/solid`
|
|
15
|
+
// (src/solid.ts), which is its own build target so only Solid consumers pay for
|
|
16
|
+
// it. `npm run verify:solid-coverage` prints the element count and proves that
|
|
17
|
+
// surface n/n on every run, which is why no count is restated here. `./solid`
|
|
18
|
+
// re-exports this file, so it is a strict superset: anything here is reachable
|
|
19
|
+
// there too, and a Solid consumer only ever needs the one import.
|
|
20
|
+
//
|
|
21
|
+
// Rule of thumb: a NEW Solid component export belongs in src/solid.ts.
|
|
22
|
+
// Type-only exports are free (fully erased by the build) and may live in either.
|
|
23
|
+
|
|
1
24
|
// Shared types (folded in from @tab-zen/shared)
|
|
2
25
|
export type { ModelOption, SearchFilters, ConversationScope, ConversationSummary, ConversationGroup } from './types';
|
|
3
26
|
|
|
@@ -27,7 +50,7 @@ export type {
|
|
|
27
50
|
} from './primitives/toast-store';
|
|
28
51
|
export { Toast, ToastRegion } from './components/toast';
|
|
29
52
|
export type {
|
|
30
|
-
ToastRegionProps, ToastDismissReason, ToastPosition,
|
|
53
|
+
ToastProps, ToastRegionProps, ToastDismissReason, ToastPosition,
|
|
31
54
|
} from './components/toast';
|
|
32
55
|
|
|
33
56
|
// Card Contract (generative-UI foundation)
|
|
@@ -160,32 +183,64 @@ export type { ButtonProps } from './ui/button';
|
|
|
160
183
|
export { Avatar } from './ui/avatar';
|
|
161
184
|
export type { AvatarProps } from './ui/avatar';
|
|
162
185
|
export { Tooltip } from './ui/tooltip';
|
|
186
|
+
export type { TooltipProps, TooltipController } from './ui/tooltip';
|
|
163
187
|
export { HoverCard } from './ui/hover-card';
|
|
188
|
+
export type { HoverCardProps, HoverCardController } from './ui/hover-card';
|
|
164
189
|
export { Collapsible, CollapsibleTrigger, CollapsibleContent } from './ui/collapsible';
|
|
190
|
+
export type {
|
|
191
|
+
CollapsibleProps, CollapsibleTriggerProps, CollapsibleContentProps, CollapsibleController,
|
|
192
|
+
} from './ui/collapsible';
|
|
165
193
|
export { ScrollArea } from './ui/scroll-area';
|
|
194
|
+
export type { ScrollAreaProps, ScrollOrientation } from './ui/scroll-area';
|
|
166
195
|
export { Dropdown, DropdownTrigger, DropdownContent, DropdownItem } from './ui/dropdown';
|
|
196
|
+
export type {
|
|
197
|
+
DropdownProps, DropdownTriggerProps, DropdownContentProps, DropdownItemProps, DropdownController,
|
|
198
|
+
} from './ui/dropdown';
|
|
167
199
|
export { Textarea } from './ui/textarea';
|
|
168
200
|
export type { TextareaProps } from './ui/textarea';
|
|
169
201
|
export { Badge } from './ui/badge';
|
|
170
202
|
export type { BadgeProps } from './ui/badge';
|
|
171
203
|
export { Separator } from './ui/separator';
|
|
204
|
+
export type { SeparatorProps } from './ui/separator';
|
|
172
205
|
export { ResizablePanelGroup, ResizablePanel, ResizableHandle, Resizable, normalizeSize, resolveToPx } from './ui/resizable';
|
|
173
206
|
export type { ResizablePanelGroupProps, ResizablePanelProps, ResizableHandleProps, ResizableProps, SizeValue } from './ui/resizable';
|
|
174
207
|
export { Skeleton } from './ui/skeleton';
|
|
208
|
+
export type { SkeletonProps, SkeletonVariant } from './ui/skeleton';
|
|
175
209
|
export { FileTree, buildFileTree } from './components/file-tree';
|
|
176
210
|
export type {
|
|
177
211
|
FileTreeProps, FileTreeFile, FileTreeNode, FileTreeFolderNode, FileTreeFileNode,
|
|
178
212
|
} from './components/file-tree';
|
|
179
213
|
export { Artifact } from './components/artifact';
|
|
180
214
|
export type { ArtifactProps, ArtifactFile, ArtifactTab } from './components/artifact';
|
|
215
|
+
export { ArtifactCard, DEFAULT_ARTIFACT_CARD_HEIGHT } from './components/artifact-card';
|
|
216
|
+
// `ArtifactCardFile` is the SAME declaration `FileTreeFile` and `ArtifactFile`
|
|
217
|
+
// alias, authored in primitives/card-data-types.ts because `ArtifactCardData.files`
|
|
218
|
+
// reaches it and that module has to stay resolvable from a Node/no-DOM project.
|
|
219
|
+
// It is exported here under its authored name because that is the name the
|
|
220
|
+
// generated element metadata records for `kai-artifact.files` / `kai-file-tree.files`,
|
|
221
|
+
// and tests/elements/prop-types-exported.ts requires every named prop type to be
|
|
222
|
+
// importable from this entry. The two aliases stay exported above, unchanged.
|
|
223
|
+
export type {
|
|
224
|
+
ArtifactCardProps,
|
|
225
|
+
ArtifactCardData,
|
|
226
|
+
ArtifactCardEnvelope,
|
|
227
|
+
ArtifactCardFile,
|
|
228
|
+
ArtifactCardTab,
|
|
229
|
+
} from './components/artifact-card';
|
|
181
230
|
|
|
182
231
|
// Layer 3: AI/Feature Components
|
|
183
232
|
export {
|
|
184
233
|
ChatContainer, ChatContainerRoot, ChatContainerContent, ChatContainerScrollAnchor,
|
|
185
234
|
useChatContainer,
|
|
186
235
|
} from './components/chat-container';
|
|
187
|
-
export {
|
|
188
|
-
|
|
236
|
+
export type {
|
|
237
|
+
ChatContainerProps, ChatContainerRootProps, ChatContainerContentProps, ChatContainerScrollAnchorProps,
|
|
238
|
+
} from './components/chat-container';
|
|
239
|
+
export { Message, MessageAvatar, MessageContent, MessageActions, MessageAction, MessageCopyButton, MessageBody } from './components/message';
|
|
240
|
+
export type {
|
|
241
|
+
MessageProps, MessageAvatarProps, MessageContentProps, MessageActionsProps,
|
|
242
|
+
MessageActionProps, MessageCopyButtonProps, MessageBodyProps,
|
|
243
|
+
} from './components/message';
|
|
189
244
|
export { ResponseCompare, useResolved } from './components/response-compare';
|
|
190
245
|
export type { ResponseCompareProps, CompareLayout, ResolvedController } from './components/response-compare';
|
|
191
246
|
export {
|
|
@@ -201,14 +256,20 @@ export type {
|
|
|
201
256
|
CompareSelection,
|
|
202
257
|
} from './components/response-compare';
|
|
203
258
|
export { MessageSkills } from './components/message-skills';
|
|
204
|
-
export type { Skill as MessageSkill } from './components/message-skills';
|
|
259
|
+
export type { MessageSkillsProps, Skill as MessageSkill } from './components/message-skills';
|
|
205
260
|
export {
|
|
206
261
|
PromptInput, PromptInputTextarea, PromptInputActions, PromptInputAction,
|
|
207
262
|
usePromptInput,
|
|
208
263
|
} from './components/prompt-input';
|
|
264
|
+
export type {
|
|
265
|
+
PromptInputProps, PromptInputTextareaProps, PromptInputActionsProps, PromptInputActionProps,
|
|
266
|
+
} from './components/prompt-input';
|
|
209
267
|
export { ResponseStream } from './components/response-stream';
|
|
268
|
+
export type { ResponseStreamProps } from './components/response-stream';
|
|
210
269
|
export { Markdown } from './components/markdown';
|
|
270
|
+
export type { MarkdownProps } from './components/markdown';
|
|
211
271
|
export { CodeBlock, CodeBlockCode, CodeBlockGroup } from './components/code-block';
|
|
272
|
+
export type { CodeBlockProps, CodeBlockCodeProps, CodeBlockGroupProps } from './components/code-block';
|
|
212
273
|
export { Loader } from './components/loader';
|
|
213
274
|
export type { LoaderVariant, LoaderSize, LoaderProps } from './components/loader';
|
|
214
275
|
export {
|
|
@@ -216,13 +277,26 @@ export {
|
|
|
216
277
|
DotsLoader, TypingLoader, WaveLoader, BarsLoader,
|
|
217
278
|
TerminalLoader, TextBlinkLoader, TextShimmerLoader, TextDotsLoader,
|
|
218
279
|
} from './components/loader';
|
|
219
|
-
export
|
|
280
|
+
export type {
|
|
281
|
+
LoaderShapeProps, LoaderTextProps,
|
|
282
|
+
CircularLoaderProps, ClassicLoaderProps, PulseLoaderProps, PulseDotLoaderProps,
|
|
283
|
+
DotsLoaderProps, TypingLoaderProps, WaveLoaderProps, BarsLoaderProps,
|
|
284
|
+
TerminalLoaderProps, TextBlinkLoaderProps, TextShimmerLoaderProps, TextDotsLoaderProps,
|
|
285
|
+
} from './components/loader';
|
|
286
|
+
export { FeedbackBar, type FeedbackValue, type FeedbackDetail, type FeedbackBarProps } from './components/feedback-bar';
|
|
220
287
|
export {
|
|
221
288
|
ChainOfThought, ChainOfThoughtStep, ChainOfThoughtTrigger,
|
|
222
289
|
ChainOfThoughtContent, ChainOfThoughtItem,
|
|
223
290
|
} from './components/chain-of-thought';
|
|
291
|
+
export type {
|
|
292
|
+
ChainOfThoughtProps, ChainOfThoughtStepProps, ChainOfThoughtTriggerProps,
|
|
293
|
+
ChainOfThoughtContentProps, ChainOfThoughtItemProps,
|
|
294
|
+
ChainOfThoughtType, ChainOfThoughtStepData, ChainOfThoughtController,
|
|
295
|
+
} from './components/chain-of-thought';
|
|
224
296
|
export { Source, SourceTrigger, SourceContent, SourceList } from './components/source';
|
|
297
|
+
export type { SourceProps, SourceTriggerProps, SourceContentProps, SourceListProps } from './components/source';
|
|
225
298
|
export { PromptSuggestion } from './components/prompt-suggestion';
|
|
299
|
+
export type { PromptSuggestionProps } from './components/prompt-suggestion';
|
|
226
300
|
export {
|
|
227
301
|
Empty, EmptyHeader, EmptyMedia, EmptyTitle, EmptyDescription, EmptyContent, emptyMediaVariants,
|
|
228
302
|
} from './components/empty';
|
|
@@ -230,7 +304,9 @@ export type {
|
|
|
230
304
|
EmptyProps, EmptyHeaderProps, EmptyMediaProps, EmptyTitleProps, EmptyDescriptionProps, EmptyContentProps,
|
|
231
305
|
} from './components/empty';
|
|
232
306
|
export { ScrollButton } from './components/scroll-button';
|
|
307
|
+
export type { ScrollButtonProps } from './components/scroll-button';
|
|
233
308
|
export { TextShimmer } from './components/text-shimmer';
|
|
309
|
+
export type { TextShimmerProps } from './components/text-shimmer';
|
|
234
310
|
export { Checkpoint, CheckpointIcon, CheckpointTrigger } from './components/checkpoint';
|
|
235
311
|
export type { CheckpointProps, CheckpointIconProps, CheckpointTriggerProps } from './components/checkpoint';
|
|
236
312
|
export {
|
|
@@ -253,14 +329,29 @@ export type {
|
|
|
253
329
|
ContextContentBodyProps,
|
|
254
330
|
ContextContentFooterProps,
|
|
255
331
|
ContextUsageRowProps,
|
|
332
|
+
ContextInputUsageProps,
|
|
333
|
+
ContextOutputUsageProps,
|
|
334
|
+
ContextReasoningUsageProps,
|
|
335
|
+
ContextCacheUsageProps,
|
|
256
336
|
} from './components/context';
|
|
257
337
|
export { VoiceInput } from './components/voice-input';
|
|
338
|
+
export type { VoiceInputProps, VoiceInputController } from './components/voice-input';
|
|
258
339
|
export { ConversationList } from './components/conversation-list';
|
|
340
|
+
export type { ConversationListProps, ConversationListController } from './components/conversation-list';
|
|
259
341
|
export { ConversationItem } from './components/conversation-item';
|
|
342
|
+
export type { ConversationItemProps } from './components/conversation-item';
|
|
260
343
|
export { ModelSwitcher } from './components/model-switcher';
|
|
344
|
+
export type { ModelSwitcherProps } from './components/model-switcher';
|
|
261
345
|
export { ChatScopePicker } from './components/chat-scope-picker';
|
|
346
|
+
export type { ChatScopePickerProps } from './components/chat-scope-picker';
|
|
262
347
|
export { Tool } from './components/tool';
|
|
263
348
|
export type { ToolPart, ToolProps } from './components/tool';
|
|
349
|
+
// ToolPart.kind's doc comment says "Derive with `classifyTool(type)`", so the
|
|
350
|
+
// function has to be reachable from every entry that surfaces ToolPart. It is
|
|
351
|
+
// total, deterministic and terminates in 'generic', so it is safe public API and
|
|
352
|
+
// genuinely useful to anyone rendering tool calls themselves.
|
|
353
|
+
export { classifyTool } from './components/tool-classify';
|
|
354
|
+
export type { ToolKind } from './components/tool-classify';
|
|
264
355
|
export { ThinkingBar } from './components/thinking-bar';
|
|
265
356
|
export type { ThinkingBarProps } from './components/thinking-bar';
|
|
266
357
|
export { Reasoning, ReasoningTrigger, ReasoningContent } from './components/reasoning';
|
|
@@ -283,4 +374,52 @@ export type {
|
|
|
283
374
|
} from './components/attachments';
|
|
284
375
|
|
|
285
376
|
// Chat message types — public API for consumers who need to type their own message arrays.
|
|
286
|
-
|
|
377
|
+
// NOTE: chat-types.ts also exports an unrelated `Source` interface (a citation), and
|
|
378
|
+
// `Source` is already a public component export (./components/source, a citation
|
|
379
|
+
// chip/trigger), so re-exporting both under that name is a duplicate-identifier error.
|
|
380
|
+
// The citation type therefore ships under its alias `MessageSource`, which is also the
|
|
381
|
+
// argument type of the public `AssistantStream.addSource(source)`.
|
|
382
|
+
export type {
|
|
383
|
+
ChatMessage, ChatMessageAction, CustomAction, AvatarData, FeedbackVote, MessagePart,
|
|
384
|
+
MessageSource, RawOrigin,
|
|
385
|
+
} from './elements/chat-types';
|
|
386
|
+
|
|
387
|
+
// Composer document model. This belongs on "." rather than "./solid" because it
|
|
388
|
+
// is part of the ELEMENT contract, not the Solid-only surface: `ComposerDoc` is
|
|
389
|
+
// the non-string half of `kai-prompt-input` / `kai-composer` / `kai-default-input`'s
|
|
390
|
+
// `value` property, and `doc` + `entities` on their `kai-submit` /
|
|
391
|
+
// `kai-value-change` details. The shipped prop docs name `ComposerDoc` by name,
|
|
392
|
+
// so a React or Vue consumer reading them has to be able to import it. Type-only,
|
|
393
|
+
// so it is erased by the build and costs the root barrel nothing.
|
|
394
|
+
export type { ComposerDoc, Segment, EntityRef } from './primitives/composer-model';
|
|
395
|
+
|
|
396
|
+
// ---------------------------------------------------------------------------
|
|
397
|
+
// Named types for the remaining kai-* array/object PROPERTIES.
|
|
398
|
+
//
|
|
399
|
+
// Same rationale as `ComposerDoc` above, applied to the whole class instead of
|
|
400
|
+
// one instance: the generated `./elements` declarations and React wrappers expand
|
|
401
|
+
// every prop type structurally (deliberately — see the `IMPORTS = {}` note in
|
|
402
|
+
// scripts/gen-element-api.mjs), so a consumer who wants to NAME the shape had to
|
|
403
|
+
// write `NonNullable<KaiPromptInputElementProps['triggers']>`. Every element-prop
|
|
404
|
+
// type that has a name in source is now reachable from "." — the entry a React /
|
|
405
|
+
// Vue / Svelte / vanilla consumer imports — not only from "./solid".
|
|
406
|
+
//
|
|
407
|
+
// Type-only, so the root barrel pays nothing at runtime.
|
|
408
|
+
// Guarded by tests/elements/prop-types-exported.test.ts, which re-derives the
|
|
409
|
+
// list from the facades with the TS checker and fails on a new unexported one.
|
|
410
|
+
// ---------------------------------------------------------------------------
|
|
411
|
+
export type { TriggerDef, TriggerItem } from './components/composer';
|
|
412
|
+
export type { ChatThreadContextUsage } from './components/chat-thread';
|
|
413
|
+
export type { Skill } from './components/message-skills';
|
|
414
|
+
export type { AgentStatus } from './ui/agent-card';
|
|
415
|
+
export type { KaiNavItem } from './ui/nav';
|
|
416
|
+
export type { KaiTabItem } from './ui/tabs';
|
|
417
|
+
export type { PaneStatus } from './ui/pane';
|
|
418
|
+
export type { PaneTab } from './ui/pane-group';
|
|
419
|
+
export type {
|
|
420
|
+
KaiCommandItem, KaiContextUsage, KaiMenuItem, KaiSegmentedOption, KaiSourceItem,
|
|
421
|
+
} from './elements/element-data-types';
|
|
422
|
+
// `kai-audio-visualizer.shader` takes a ShaderSpec. The element arrived from main
|
|
423
|
+
// after this block was written, and prop-types-exported.test.ts caught it, which
|
|
424
|
+
// is the point of deriving that list from the facades rather than maintaining it.
|
|
425
|
+
export type { ShaderSpec } from './components/audio-visualizer';
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// src/primitives/card-component-types.ts
|
|
2
|
+
// `CardEnvelope.type` -> the Solid component that renders it, as a TYPE.
|
|
3
|
+
//
|
|
4
|
+
// TYPES ONLY, AND THAT IS THE WHOLE FILE. `BUILTIN_CARD_COMPONENTS` and
|
|
5
|
+
// `mergeCardComponents` stay in card-registry.tsx and cannot follow them here: they
|
|
6
|
+
// ARE JSX. So this is not the same split card-tags.ts made — that one moved data and
|
|
7
|
+
// its type; this one moves only the type, because the value half has nowhere else to
|
|
8
|
+
// go. Do not try to "finish" the symmetry by dragging the component map over.
|
|
9
|
+
//
|
|
10
|
+
// WHY THE TYPES ARE ALONE IN A `.ts`
|
|
11
|
+
// ----------------------------------
|
|
12
|
+
// The same reason, one layer along, that card-tags.ts exists — read that file's header
|
|
13
|
+
// first; this is the second instance of its problem, not a new one.
|
|
14
|
+
//
|
|
15
|
+
// `@kitn.ai/ui/schemas` is the server-safe entry, and src/schemas/registry.ts declares
|
|
16
|
+
// `CustomCardSpec.component` and `CardRegistry.components` in terms of
|
|
17
|
+
// `CardComponentMap`. That is a TYPE import and erases at runtime, but a type import
|
|
18
|
+
// still has to RESOLVE, and while these two types lived in card-registry.tsx it
|
|
19
|
+
// resolved to a `.tsx`. tsconfig.mcp.json has no `jsx` on purpose, so the `kai` MCP's
|
|
20
|
+
// typecheck pass reported, on any tree that had not been built:
|
|
21
|
+
//
|
|
22
|
+
// src/schemas/registry.ts(61,51): error TS6142: Module '../primitives/card-registry'
|
|
23
|
+
// was resolved to '.../card-registry.tsx', but '--jsx' is not set.
|
|
24
|
+
//
|
|
25
|
+
// Exactly one error, and the last one standing on an unbuilt tree. Moving the two type
|
|
26
|
+
// aliases into this file takes that pass to 0. Measured on this tree, both directions.
|
|
27
|
+
//
|
|
28
|
+
// Relaxing tsconfig.mcp.json instead is not an option, and that is measured too, not
|
|
29
|
+
// recalled: giving that project `jsx: "preserve"` + `jsxImportSource: "solid-js"` —
|
|
30
|
+
// the settings the main tsconfig.json actually uses — takes it from 1 error to 130,
|
|
31
|
+
// almost all `TS2304: Cannot find name 'HTMLDivElement' / 'window'`, because a `jsx`
|
|
32
|
+
// setting drags the whole Solid component tree into a Node-only, `lib: ["ESNext"]`
|
|
33
|
+
// pass. (`jsx: "preserve"` with no import source is worse still: 838.) card-tags.ts
|
|
34
|
+
// records 1364 for the broader case. The figures differ because the reachable set
|
|
35
|
+
// differs; the conclusion does not. The Node/no-DOM boundary is load-bearing.
|
|
36
|
+
//
|
|
37
|
+
// `import type { Component } from 'solid-js'` below does NOT reintroduce the problem
|
|
38
|
+
// it just solved. Type-importing from solid-js resolves to a `.d.ts`, and a
|
|
39
|
+
// declaration file needs no `jsx` to be read; `skipLibCheck` covers what is inside it.
|
|
40
|
+
// It is resolving a `.tsx` SOURCE file that TS6142 objects to, and this file resolves
|
|
41
|
+
// none.
|
|
42
|
+
//
|
|
43
|
+
// WHAT THIS SPLIT DOES NOT DO
|
|
44
|
+
// ---------------------------
|
|
45
|
+
// It changes nothing at runtime, and must not be sold as if it did. This module is
|
|
46
|
+
// types only, so it compiles to nothing and there is no emitted module to compare:
|
|
47
|
+
// `verify:ssr` and `verify:schemas` read the BUILT entry and cannot tell the two
|
|
48
|
+
// arrangements apart even in principle. card-tags.ts records the same finding for its
|
|
49
|
+
// own case from the harder direction, where there WAS a bundle to diff and it came out
|
|
50
|
+
// byte-identical. The boundary this file defends is a compile-time one. The
|
|
51
|
+
// discriminating check is `tsc --noEmit -p tsconfig.mcp.json` on an UNBUILT tree, and
|
|
52
|
+
// nothing else is evidence for it.
|
|
53
|
+
|
|
54
|
+
import type { Component } from 'solid-js';
|
|
55
|
+
import type { CardEnvelope, CardHost } from './card-contract';
|
|
56
|
+
|
|
57
|
+
/** Solid renderer for one envelope. `host` is the resolved CardHost so each wrapper
|
|
58
|
+
* can bridge its card's emit convention (form/confirm/tasks take `host`;
|
|
59
|
+
* link/embed take `onEmit`). */
|
|
60
|
+
export type CardComponent = Component<{ envelope: CardEnvelope; host?: CardHost }>;
|
|
61
|
+
|
|
62
|
+
/** Solid layer: envelope type → the component that draws it. */
|
|
63
|
+
export type CardComponentMap = Record<string, CardComponent>;
|