@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
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
// src/primitives/card-data-types.ts
|
|
2
|
+
// The five built-in card PAYLOAD types — `CardEnvelope.data`, one per card type —
|
|
3
|
+
// authored beside the schemas they mirror rather than inside the components that
|
|
4
|
+
// render them.
|
|
5
|
+
//
|
|
6
|
+
// THE FOURTH INSTANCE OF ONE DEFECT, AND THE LAST ONE THAT WAS LEFT
|
|
7
|
+
// -----------------------------------------------------------------
|
|
8
|
+
// `BUILTIN_CARD_TAGS` (card-tags.ts), `CardComponentMap` (card-component-types.ts)
|
|
9
|
+
// and the tag map before it were each pulled out of a `.tsx` for the same reason,
|
|
10
|
+
// and each header says so. Read card-tags.ts first; this is the same problem one
|
|
11
|
+
// layer further out, and the reason it is worth a fourth file rather than a fourth
|
|
12
|
+
// exception is that these are the types a BACKEND names, which makes them the ones
|
|
13
|
+
// with the least business living under a Solid component.
|
|
14
|
+
//
|
|
15
|
+
// `tsconfig.mcp.json` is Node-only — `lib: ["ESNext"]`, no `jsx` — and a type import
|
|
16
|
+
// still has to RESOLVE even though it erases. While `ConfirmCardData` and friends
|
|
17
|
+
// lived in components/confirm-card.tsx, any Node/no-DOM project that named one got
|
|
18
|
+
//
|
|
19
|
+
// error TS6142: Module '../../components/choice-card' was resolved to
|
|
20
|
+
// '.../src/components/choice-card.tsx', but '--jsx' is not set.
|
|
21
|
+
//
|
|
22
|
+
// measured on this tree, and `@kitn.ai/ui/schemas` — the server-safe entry that
|
|
23
|
+
// exists precisely so a route can hand a model tool definitions — could not
|
|
24
|
+
// re-export them at all without dragging the Solid tree into that pass. So the one
|
|
25
|
+
// language the kit is AUTHORED in was the only one that could not name the contract
|
|
26
|
+
// it publishes: Python and Go read `./schemas/*.json` and get the full shape, while
|
|
27
|
+
// a TypeScript backend building a card envelope got `data: unknown`.
|
|
28
|
+
//
|
|
29
|
+
// Relaxing tsconfig.mcp.json is not the alternative, and that is measured rather
|
|
30
|
+
// than recalled: granting it `jsx: "preserve"` + `jsxImportSource: "solid-js"` takes
|
|
31
|
+
// it from 0 errors to 130 on this exact case (838 without the import source, and
|
|
32
|
+
// card-tags.ts records 1364 for the broader one), almost all `TS2304: Cannot find
|
|
33
|
+
// name 'HTMLDivElement' / 'window'`, because a `jsx` setting drags the whole Solid
|
|
34
|
+
// component tree into a Node-only pass. The Node/no-DOM boundary is load-bearing.
|
|
35
|
+
//
|
|
36
|
+
// WHY THEY ARE `type` ALIASES AND NOT `interface`S — DO NOT "TIDY" THIS BACK
|
|
37
|
+
// --------------------------------------------------------------------------
|
|
38
|
+
// This is the other half of the same story and it is not a style preference.
|
|
39
|
+
// TypeScript gives an object TYPE ALIAS an implicit index signature and gives an
|
|
40
|
+
// INTERFACE none. Measured, both directions, on a two-line file:
|
|
41
|
+
//
|
|
42
|
+
// interface IFace { a: string }
|
|
43
|
+
// type TAlias = { a: string }
|
|
44
|
+
// const r1: Record<string, unknown> = iface; // TS2322: Index signature for type
|
|
45
|
+
// // 'string' is missing in type 'IFace'
|
|
46
|
+
// const r2: Record<string, unknown> = alias; // OK
|
|
47
|
+
//
|
|
48
|
+
// Every card element's `data` prop is a `Record<string, unknown>` at some point in
|
|
49
|
+
// the chain — the generated `element-types.d.ts` used to declare it that way
|
|
50
|
+
// outright, and `renderType` in scripts/_ts-helpers.mjs still emits exactly that
|
|
51
|
+
// string as its cycle placeholder when it inlines a self-referential type (which
|
|
52
|
+
// `FormField` is). So as interfaces these types were not assignable to the very
|
|
53
|
+
// property each one's own doc comment tells a consumer to assign it to:
|
|
54
|
+
// `el.data = myChoiceCardData` was TS2322 while `<kai-choice>`'s JSDoc said "Import
|
|
55
|
+
// `ChoiceCardData` from `@kitn.ai/ui` for the full shape".
|
|
56
|
+
//
|
|
57
|
+
// Aliases fix that at the root instead of at each of the four call sites, and they
|
|
58
|
+
// are what makes `FormDefinition` work at all: it is self-referential, so the
|
|
59
|
+
// generator can only inline it down to a `Record<string, unknown>` placeholder, and
|
|
60
|
+
// an interface would fail against that placeholder no matter what the elements
|
|
61
|
+
// declare.
|
|
62
|
+
//
|
|
63
|
+
// Nothing here merges declarations, so the one capability `interface` has that
|
|
64
|
+
// `type` lacks is not in use.
|
|
65
|
+
//
|
|
66
|
+
// WHAT THIS FILE MAY CONTAIN
|
|
67
|
+
// --------------------------
|
|
68
|
+
// Types only, and only types with no DOM and no Solid below them. It must stay
|
|
69
|
+
// importable from a Node process with no `jsx`, which is the whole point; the
|
|
70
|
+
// discriminating check is `tsc --noEmit -p tsconfig.mcp.json` on a tree with no
|
|
71
|
+
// `dist/` present, and nothing else is evidence for it. `CardEnvelope` below comes
|
|
72
|
+
// from ./card-contract, which is already a `.ts` for the same reason.
|
|
73
|
+
//
|
|
74
|
+
// Each component re-exports its own types from here, so every existing importer of
|
|
75
|
+
// `components/confirm-card` etc. is unaffected, and `@kitn.ai/ui/schemas` exports
|
|
76
|
+
// them too so a backend route can finally name what it is building.
|
|
77
|
+
|
|
78
|
+
import type { CardEnvelope } from './card-contract';
|
|
79
|
+
|
|
80
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
81
|
+
// confirm (confirm.schema.json)
|
|
82
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
83
|
+
|
|
84
|
+
export type ConfirmActionStyle = 'primary' | 'default' | 'destructive';
|
|
85
|
+
export type ConfirmTone = 'default' | 'warning' | 'danger';
|
|
86
|
+
|
|
87
|
+
export type ConfirmAction = {
|
|
88
|
+
id: string;
|
|
89
|
+
label: string;
|
|
90
|
+
style?: ConfirmActionStyle;
|
|
91
|
+
payload?: unknown;
|
|
92
|
+
default?: boolean;
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
export type ConfirmCardData = {
|
|
96
|
+
heading?: string;
|
|
97
|
+
body?: string;
|
|
98
|
+
tone?: ConfirmTone;
|
|
99
|
+
actions: ConfirmAction[]; // 1..4
|
|
100
|
+
dismissible?: boolean;
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
export type ConfirmCardEnvelope = CardEnvelope<'confirm', ConfirmCardData>;
|
|
104
|
+
|
|
105
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
106
|
+
// choice (choice.schema.json)
|
|
107
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
108
|
+
|
|
109
|
+
export type ChoiceOptionMedia = {
|
|
110
|
+
image?: string;
|
|
111
|
+
imageAlt?: string;
|
|
112
|
+
icon?: string;
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
export type ChoiceOption = {
|
|
116
|
+
id: string; // required, unique within the card
|
|
117
|
+
label: string; // required
|
|
118
|
+
description?: string;
|
|
119
|
+
media?: ChoiceOptionMedia;
|
|
120
|
+
meta?: string; // trailing freeform text (e.g. price/badge)
|
|
121
|
+
recommended?: boolean; // renders a "Recommended" pill
|
|
122
|
+
disabled?: boolean; // not selectable; skipped in keyboard nav
|
|
123
|
+
payload?: unknown; // echoed back in the emitted action
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
export type ChoiceAllowOther = boolean | { label?: string; placeholder?: string };
|
|
127
|
+
|
|
128
|
+
export type ChoiceCardData = {
|
|
129
|
+
prompt?: string; // optional question/body above the options
|
|
130
|
+
options: ChoiceOption[]; // 1..N
|
|
131
|
+
allowOther?: ChoiceAllowOther; // free-text escape
|
|
132
|
+
submitLabel?: string; // label for the Submit button (default 'Submit')
|
|
133
|
+
dismissible?: boolean; // show a close affordance that emits `dismiss`
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
export type ChoiceCardEnvelope = CardEnvelope<'choice', ChoiceCardData>;
|
|
137
|
+
|
|
138
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
139
|
+
// tasks (tasks.schema.json)
|
|
140
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
141
|
+
|
|
142
|
+
export type TasksTask = {
|
|
143
|
+
id: string;
|
|
144
|
+
label: string;
|
|
145
|
+
description?: string;
|
|
146
|
+
checked?: boolean;
|
|
147
|
+
disabled?: boolean;
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
export type TasksCardData = {
|
|
151
|
+
/**
|
|
152
|
+
* `select` (default) = checkbox rows + a confirm button that emits the contract
|
|
153
|
+
* `submit`. `progress` = an onboarding/checklist look: a header `done / total`
|
|
154
|
+
* count, circular indicators, per-item title + muted description, and NO confirm
|
|
155
|
+
* button (checking a row is itself the terminal action). Both share the same
|
|
156
|
+
* selection model (toggle by id, the `max` gate, `kai-value-change`); `progress`
|
|
157
|
+
* is purely a presentational variant.
|
|
158
|
+
*/
|
|
159
|
+
mode?: 'select' | 'progress';
|
|
160
|
+
heading?: string;
|
|
161
|
+
tasks: TasksTask[]; // >=1
|
|
162
|
+
selectAll?: boolean;
|
|
163
|
+
confirmLabel?: string;
|
|
164
|
+
allowEmpty?: boolean;
|
|
165
|
+
min?: number;
|
|
166
|
+
max?: number;
|
|
167
|
+
dismissible?: boolean; // show a close affordance that emits `dismiss`
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
export type TasksCardResult = {
|
|
171
|
+
selected: string[];
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
export type TasksCardEnvelope = CardEnvelope<'tasks', TasksCardData>;
|
|
175
|
+
|
|
176
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
177
|
+
// form (form.schema.json)
|
|
178
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
179
|
+
|
|
180
|
+
/** A field definition (the JSON Schema subset kai-form renders). */
|
|
181
|
+
export type FormField = {
|
|
182
|
+
type: 'string' | 'number' | 'integer' | 'boolean' | 'array' | 'object';
|
|
183
|
+
title?: string;
|
|
184
|
+
description?: string;
|
|
185
|
+
default?: unknown;
|
|
186
|
+
enum?: unknown[];
|
|
187
|
+
format?: 'email' | 'uri' | 'url' | 'date' | 'date-time' | 'time';
|
|
188
|
+
minimum?: number;
|
|
189
|
+
maximum?: number;
|
|
190
|
+
minLength?: number;
|
|
191
|
+
maxLength?: number;
|
|
192
|
+
pattern?: string;
|
|
193
|
+
minItems?: number;
|
|
194
|
+
maxItems?: number;
|
|
195
|
+
items?: FormField | { enum: unknown[] };
|
|
196
|
+
properties?: Record<string, FormField>;
|
|
197
|
+
required?: string[];
|
|
198
|
+
readOnly?: boolean;
|
|
199
|
+
'x-kai-widget'?:
|
|
200
|
+
| 'textarea'
|
|
201
|
+
| 'slider'
|
|
202
|
+
| 'rating'
|
|
203
|
+
| 'radio'
|
|
204
|
+
| 'select'
|
|
205
|
+
| 'checkbox'
|
|
206
|
+
| 'password'
|
|
207
|
+
| 'switch';
|
|
208
|
+
'x-kai-placeholder'?: string;
|
|
209
|
+
'x-kai-step'?: number;
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
/** The form definition = CardEnvelope.data for type:'form'. */
|
|
213
|
+
export type FormDefinition = {
|
|
214
|
+
type: 'object';
|
|
215
|
+
title?: string;
|
|
216
|
+
description?: string;
|
|
217
|
+
required?: string[];
|
|
218
|
+
properties: Record<string, FormField>;
|
|
219
|
+
'x-kai-order'?: string[];
|
|
220
|
+
'x-kai-inlineMax'?: number;
|
|
221
|
+
'x-kai-submitLabel'?: string;
|
|
222
|
+
'x-kai-dismissible'?: boolean;
|
|
223
|
+
'x-kai-actions'?: { id: string; label: string; variant?: 'default' | 'ghost' | 'outline' }[];
|
|
224
|
+
};
|
|
225
|
+
|
|
226
|
+
export type FormCardEnvelope = CardEnvelope<'form', FormDefinition>;
|
|
227
|
+
|
|
228
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
229
|
+
// artifact (artifact.schema.json)
|
|
230
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* One file behind an artifact card: the Code tab's tree row, plus where the
|
|
234
|
+
* preview loads it.
|
|
235
|
+
*
|
|
236
|
+
* The SAME declaration the `FileTree` primitive uses — `components/file-tree.tsx`
|
|
237
|
+
* re-exports this as `FileTreeFile` and `components/artifact.tsx` aliases that to
|
|
238
|
+
* `ArtifactFile`, so there is one shape here and not a copy of one. It is authored
|
|
239
|
+
* in this file rather than in file-tree.tsx for this module's whole reason: it is
|
|
240
|
+
* reachable from `ArtifactCardData`, so leaving it in a `.tsx` would put TS6142
|
|
241
|
+
* back on any Node/no-DOM project that names an artifact card payload, and the
|
|
242
|
+
* extraction would have moved four of five types and quietly failed on the fifth.
|
|
243
|
+
* It mirrors `artifact.schema.json`'s `files[].items`, which carries the same
|
|
244
|
+
* fields with `additionalProperties: false`.
|
|
245
|
+
*/
|
|
246
|
+
export type ArtifactCardFile = {
|
|
247
|
+
/** Tree label/key. Folders are built from `/`-delimited segments. */
|
|
248
|
+
path: string;
|
|
249
|
+
/** Where the preview loads it (CDN/S3/dev-server/API). */
|
|
250
|
+
url?: string;
|
|
251
|
+
/** Source for the Code tab. */
|
|
252
|
+
code?: string;
|
|
253
|
+
/** Language id for syntax highlighting (e.g. `html`, `css`, `tsx`). */
|
|
254
|
+
language?: string;
|
|
255
|
+
/** Kind — drives the icon + whether Code applies. */
|
|
256
|
+
type?: 'html' | 'pdf' | 'image' | 'other';
|
|
257
|
+
/** Lines added vs the base. Rendered as a trailing `+N` stat (success hue,
|
|
258
|
+
* tabular-nums). Only shown when present; omit for a plain file row. */
|
|
259
|
+
additions?: number;
|
|
260
|
+
/** Lines removed vs the base. Rendered as a trailing `-N` stat (error hue). */
|
|
261
|
+
deletions?: number;
|
|
262
|
+
/** Change status vs the base. Drives a small trailing status letter in the
|
|
263
|
+
* conventional VCS hue (added=green, modified=amber, deleted=red,
|
|
264
|
+
* renamed=blue, untracked=muted). Only shown when present. */
|
|
265
|
+
status?: 'added' | 'modified' | 'deleted' | 'renamed' | 'untracked';
|
|
266
|
+
};
|
|
267
|
+
|
|
268
|
+
/** Which view an artifact card opens on. */
|
|
269
|
+
export type ArtifactCardTab = 'preview' | 'code';
|
|
270
|
+
|
|
271
|
+
/** The `artifact` card payload: a deliberately NARROW subset of `ArtifactProps`.
|
|
272
|
+
*
|
|
273
|
+
* A card envelope is written by a model, so the surface it can reach has to be
|
|
274
|
+
* the part that describes WHAT to show, not how the viewer behaves. Toolbar
|
|
275
|
+
* composition (`showNav`/`showTabs`/…), view-state (`maximized`), the iframe
|
|
276
|
+
* `sandbox` and the imperative `controllerRef` are all host concerns and stay
|
|
277
|
+
* off the wire — a model must not be able to widen its own sandbox or hide the
|
|
278
|
+
* chrome the user needs to inspect what it built. */
|
|
279
|
+
export type ArtifactCardData = {
|
|
280
|
+
/** URL the preview iframe frames. */
|
|
281
|
+
src?: string;
|
|
282
|
+
/** Files for the Code tab's tree (+ each file's preview `url`). */
|
|
283
|
+
files?: ArtifactCardFile[];
|
|
284
|
+
/** Which view the card OPENS on: `preview` (default) or `code`.
|
|
285
|
+
*
|
|
286
|
+
* Seed only, and deliberately so. This card exists to be revised — `addCard`
|
|
287
|
+
* upserts on `envelope.id` — and a revision hands the same live component a
|
|
288
|
+
* new envelope. Were this wired to `Artifact`'s CONTROLLED `tab` prop, every
|
|
289
|
+
* revision would re-assert it and yank a user who had switched views back to
|
|
290
|
+
* the model's choice. A model cannot move the user between tabs after the
|
|
291
|
+
* first render; the user's choice wins. */
|
|
292
|
+
tab?: ArtifactCardTab;
|
|
293
|
+
/** Path of the file selected in the tree when the card first renders.
|
|
294
|
+
*
|
|
295
|
+
* Seed only, for the same reason as `tab`, but achieved differently:
|
|
296
|
+
* `Artifact` has a `defaultTab` prop to seed the tab and no `defaultActiveFile`
|
|
297
|
+
* counterpart, so this is read ONCE via `untrack` at setup and handed over as
|
|
298
|
+
* a static value. That leaves `Artifact`'s unconditional
|
|
299
|
+
* `createEffect(() => setActiveFile(local.activeFile))` with nothing reactive
|
|
300
|
+
* to track, so it runs once instead of resetting the user's selection on
|
|
301
|
+
* every revision. Keep it static — passing `props.data.activeFile` straight
|
|
302
|
+
* through would silently restore that bug. */
|
|
303
|
+
activeFile?: string;
|
|
304
|
+
/** Friendly address shown INSTEAD of the real url. Use when `src` is not
|
|
305
|
+
* consumer-facing (e.g. a `data:` blob) so a clean address is shown. */
|
|
306
|
+
displayUrl?: string;
|
|
307
|
+
/** Frame height. A bare number is px; a string is any CSS length. Defaults to
|
|
308
|
+
* `DEFAULT_ARTIFACT_CARD_HEIGHT` — see the note on ArtifactCard. */
|
|
309
|
+
height?: number | string;
|
|
310
|
+
};
|
|
311
|
+
|
|
312
|
+
export type ArtifactCardEnvelope = CardEnvelope<'artifact', ArtifactCardData>;
|
|
@@ -96,9 +96,20 @@ function resolutionOf(cards: CardEnvelope[], cardId: string): CardResolution | u
|
|
|
96
96
|
return cards.find((c) => c.id === cardId)?.resolution;
|
|
97
97
|
}
|
|
98
98
|
|
|
99
|
+
// On the return type — `Required<Pick<…>>`, not a bare `Pick`. Both members are
|
|
100
|
+
// optional on CardPolicy, which is right there, where a host supplies one, the other,
|
|
101
|
+
// or neither; but `Pick` carries the `?` across even though the body below returns
|
|
102
|
+
// both handlers on every path, so the declaration said "may be missing" about two
|
|
103
|
+
// things that never are. That was consumer-facing, not internal tidiness: this
|
|
104
|
+
// function is exported from src/index.ts and the MCP scaffolder emits
|
|
105
|
+
// `const { onDismiss, onReopen } = dismissRecovery({…})`, so anyone who destructured
|
|
106
|
+
// and then INVOKED a handler hit TS2722 in code we generated for them. Assigning the
|
|
107
|
+
// result straight into a CardPolicy stays fine either way, both fields being optional
|
|
108
|
+
// there, which is why it stayed invisible. tests/primitives/card-recovery.test.ts pins
|
|
109
|
+
// the runtime side over the full cross-product of the optional options.
|
|
99
110
|
/**
|
|
100
111
|
* Build the `{ onDismiss, onReopen }` policy handlers for the card dismiss/recovery
|
|
101
|
-
* flow over a host store (`get`/`set`).
|
|
112
|
+
* flow over a host store (`get`/`set`). Both handlers are always returned.
|
|
102
113
|
*
|
|
103
114
|
* - `onDismiss(cardId)` — stamps `{ kind:'dismissed', at }` immutably and, when a
|
|
104
115
|
* `toast` is injected, shows "Dismissed" with an Undo that restores the card's
|
|
@@ -108,7 +119,7 @@ function resolutionOf(cards: CardEnvelope[], cardId: string): CardResolution | u
|
|
|
108
119
|
*/
|
|
109
120
|
export function dismissRecovery(
|
|
110
121
|
opts: DismissRecoveryOptions,
|
|
111
|
-
): Pick<CardPolicy, 'onDismiss' | 'onReopen'
|
|
122
|
+
): Required<Pick<CardPolicy, 'onDismiss' | 'onReopen'>> {
|
|
112
123
|
const now = opts.now ?? (() => Date.now());
|
|
113
124
|
const reopenable = opts.isReopenable ?? ((env: ReopenEnv) => defaultIsReopenable(env, opts.staleAfterMs));
|
|
114
125
|
const undoMs = opts.undoMs ?? 6000;
|
|
@@ -2,34 +2,43 @@
|
|
|
2
2
|
// One source of truth mapping a CardEnvelope.type to a renderer, for both layers:
|
|
3
3
|
// - CardComponentMap drives the Solid <CardRenderer>.
|
|
4
4
|
// - CardTagMap drives the <kai-cards> web component (child kai-* elements).
|
|
5
|
-
// Built-ins cover the
|
|
5
|
+
// Built-ins cover the 7 contract card types; consumers extend/override via a `types`
|
|
6
6
|
// prop (merged OVER the built-ins). kai-card (bare shell) is intentionally NOT a target.
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
//
|
|
8
|
+
// THE TAG HALF NOW LIVES IN ./card-tags — AND MUST STAY THERE.
|
|
9
|
+
// `BUILTIN_CARD_TAGS` / `mergeCardTags` / `CardTagMap` are plain data with no Solid in
|
|
10
|
+
// them, but while they shared this module with `BUILTIN_CARD_COMPONENTS` no Node/no-DOM
|
|
11
|
+
// project could import them AS SOURCE, and the `kai` MCP re-derived the map by
|
|
12
|
+
// convention as a result. ./card-tags.ts is that data on its own so
|
|
13
|
+
// `@kitn.ai/ui/schemas` can export it; the re-export below keeps every existing
|
|
14
|
+
// importer of this module working unchanged. Do not move them back — see the header
|
|
15
|
+
// of ./card-tags.ts for the measured cost of the alternative (0 -> 1364 tsc errors).
|
|
16
|
+
//
|
|
17
|
+
// THE COMPONENT TYPES NOW LIVE IN ./card-component-types — SAME REASON, SECOND TIME.
|
|
18
|
+
// `CardComponent` / `CardComponentMap` are named in the PUBLIC surface of
|
|
19
|
+
// `@kitn.ai/ui/schemas` (src/schemas/registry.ts), so a Node/no-DOM project resolving
|
|
20
|
+
// that entry's types reached this `.tsx` and hit TS6142. The types went to a `.ts`;
|
|
21
|
+
// `BUILTIN_CARD_COMPONENTS` and `mergeCardComponents` stayed, because they are JSX and
|
|
22
|
+
// have nowhere to go. Re-exported below, so this module's surface is unchanged.
|
|
23
|
+
import type { CardComponentMap } from './card-component-types';
|
|
9
24
|
import { Form } from '../components/form';
|
|
10
25
|
import { ConfirmCard } from '../components/confirm-card';
|
|
11
26
|
import { TasksCard } from '../components/tasks-card';
|
|
12
27
|
import { ChoiceCard } from '../components/choice-card';
|
|
13
28
|
import { LinkPreview } from '../components/link-preview';
|
|
14
29
|
import { Embed } from '../components/embed';
|
|
30
|
+
import { ArtifactCard, type ArtifactCardData } from '../components/artifact-card';
|
|
15
31
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
export
|
|
20
|
-
export type
|
|
32
|
+
// The tag half, re-exported so this module's surface is unchanged. Authored in
|
|
33
|
+
// ./card-tags.ts because that file has no Solid below it and can therefore be read
|
|
34
|
+
// from a Node process; this one cannot.
|
|
35
|
+
export { BUILTIN_CARD_TAGS, mergeCardTags } from './card-tags';
|
|
36
|
+
export type { CardTagMap } from './card-tags';
|
|
21
37
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
export
|
|
26
|
-
form: 'kai-form',
|
|
27
|
-
confirm: 'kai-confirm',
|
|
28
|
-
'tasks': 'kai-tasks',
|
|
29
|
-
choice: 'kai-choice',
|
|
30
|
-
link: 'kai-link-preview',
|
|
31
|
-
embed: 'kai-embed',
|
|
32
|
-
};
|
|
38
|
+
// The component TYPES, re-exported for the same reason. Authored in
|
|
39
|
+
// ./card-component-types.ts because resolving a `.tsx` is what a no-`jsx` project
|
|
40
|
+
// cannot do; the values below stay here because they are JSX.
|
|
41
|
+
export type { CardComponent, CardComponentMap } from './card-component-types';
|
|
33
42
|
|
|
34
43
|
export const BUILTIN_CARD_COMPONENTS: CardComponentMap = {
|
|
35
44
|
form: (p) => (
|
|
@@ -55,13 +64,15 @@ export const BUILTIN_CARD_COMPONENTS: CardComponentMap = {
|
|
|
55
64
|
embed: (p) => (
|
|
56
65
|
<Embed data={p.envelope.data as never} cardId={p.envelope.id} onEmit={(e) => p.host?.emit(e)} />
|
|
57
66
|
),
|
|
67
|
+
// artifact owns real chrome of its own (sizing + heading), so like the four
|
|
68
|
+
// above it lives in components/ and gets only a thin wrapper here.
|
|
69
|
+
artifact: (p) => (
|
|
70
|
+
<ArtifactCard data={p.envelope.data as ArtifactCardData} cardId={p.envelope.id}
|
|
71
|
+
heading={p.envelope.title} host={p.host} />
|
|
72
|
+
),
|
|
58
73
|
};
|
|
59
74
|
|
|
60
75
|
/** Built-ins with the consumer's overrides merged on top (consumer wins). */
|
|
61
76
|
export function mergeCardComponents(types?: CardComponentMap): CardComponentMap {
|
|
62
77
|
return types ? { ...BUILTIN_CARD_COMPONENTS, ...types } : { ...BUILTIN_CARD_COMPONENTS };
|
|
63
78
|
}
|
|
64
|
-
|
|
65
|
-
export function mergeCardTags(types?: CardTagMap): CardTagMap {
|
|
66
|
-
return types ? { ...BUILTIN_CARD_TAGS, ...types } : { ...BUILTIN_CARD_TAGS };
|
|
67
|
-
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://kitn.ai/schemas/card/artifact.schema.json",
|
|
4
|
+
"title": "ArtifactCardData",
|
|
5
|
+
"description": "Generated-artifact viewer payload: a framed preview plus the source files behind it. A deliberately NARROW subset of the Artifact component's props — it says WHAT to show, never how the viewer behaves. Toolbar composition, view-state and the iframe `sandbox` are host-owned and stay off the wire, so a model cannot widen its own sandbox or hide the chrome the user needs to inspect what it built.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"anyOf": [{ "required": ["src"] }, { "required": ["files"] }],
|
|
9
|
+
"properties": {
|
|
10
|
+
"src": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"format": "uri",
|
|
13
|
+
"description": "URL the preview iframe frames, and the target of the Home button. Omit for a source-only artifact (`tab: 'code'` with `files`).",
|
|
14
|
+
"x-kai-format": "url"
|
|
15
|
+
},
|
|
16
|
+
"files": {
|
|
17
|
+
"type": "array",
|
|
18
|
+
"description": "Files behind the artifact: the Code tab's tree, each optionally carrying its own preview url and source.",
|
|
19
|
+
"maxItems": 500,
|
|
20
|
+
"items": {
|
|
21
|
+
"type": "object",
|
|
22
|
+
"required": ["path"],
|
|
23
|
+
"additionalProperties": false,
|
|
24
|
+
"properties": {
|
|
25
|
+
"path": {
|
|
26
|
+
"type": "string",
|
|
27
|
+
"description": "Tree label/key. Folders are built from `/`-delimited segments.",
|
|
28
|
+
"maxLength": 1024
|
|
29
|
+
},
|
|
30
|
+
"url": {
|
|
31
|
+
"type": "string",
|
|
32
|
+
"format": "uri",
|
|
33
|
+
"description": "Where the preview loads this file. Defaults to `path` resolved against `src`.",
|
|
34
|
+
"x-kai-format": "url"
|
|
35
|
+
},
|
|
36
|
+
"code": {
|
|
37
|
+
"type": "string",
|
|
38
|
+
"description": "Source shown in the Code tab. Omit for binary files (image/pdf), which have no code view."
|
|
39
|
+
},
|
|
40
|
+
"language": {
|
|
41
|
+
"type": "string",
|
|
42
|
+
"description": "Language id for syntax highlighting (e.g. 'html', 'css', 'tsx').",
|
|
43
|
+
"maxLength": 40
|
|
44
|
+
},
|
|
45
|
+
"type": {
|
|
46
|
+
"type": "string",
|
|
47
|
+
"enum": ["html", "pdf", "image", "other"],
|
|
48
|
+
"description": "File kind. Drives the tree icon and whether the Code view applies; 'pdf' also routes the preview to the inline PDF viewer.",
|
|
49
|
+
"x-kai-control": "select"
|
|
50
|
+
},
|
|
51
|
+
"additions": {
|
|
52
|
+
"type": "integer",
|
|
53
|
+
"minimum": 0,
|
|
54
|
+
"description": "Lines added vs the base. Rendered as a trailing '+N' stat."
|
|
55
|
+
},
|
|
56
|
+
"deletions": {
|
|
57
|
+
"type": "integer",
|
|
58
|
+
"minimum": 0,
|
|
59
|
+
"description": "Lines removed vs the base. Rendered as a trailing '-N' stat."
|
|
60
|
+
},
|
|
61
|
+
"status": {
|
|
62
|
+
"type": "string",
|
|
63
|
+
"enum": ["added", "modified", "deleted", "renamed", "untracked"],
|
|
64
|
+
"description": "Change status vs the base. Drives a trailing status letter in the conventional VCS hue.",
|
|
65
|
+
"x-kai-control": "select"
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
"tab": {
|
|
71
|
+
"type": "string",
|
|
72
|
+
"enum": ["preview", "code"],
|
|
73
|
+
"default": "preview",
|
|
74
|
+
"description": "Which view the card OPENS on. SEED ONLY: the user can switch freely afterwards and a revision of this card will NOT move them back, because the user's choice wins over the model's. A switch is reported back as a `state` patch.",
|
|
75
|
+
"x-kai-control": "select"
|
|
76
|
+
},
|
|
77
|
+
"activeFile": {
|
|
78
|
+
"type": "string",
|
|
79
|
+
"description": "Path of the file selected in the tree when the card FIRST renders (must match a `files[].path`). Seeds the tree highlight, the Code source and the preview. SEED ONLY, like `tab`: revising this card will not move a user who has since selected a different file.",
|
|
80
|
+
"maxLength": 1024
|
|
81
|
+
},
|
|
82
|
+
"displayUrl": {
|
|
83
|
+
"type": "string",
|
|
84
|
+
"description": "Friendly address shown in the path field INSTEAD of the real url, which also makes the field read-only. Use when `src` is not consumer-facing (e.g. a `data:` blob) so a clean address is shown rather than leaking it.",
|
|
85
|
+
"maxLength": 2048
|
|
86
|
+
},
|
|
87
|
+
"height": {
|
|
88
|
+
"description": "Frame height. A bare number is px; a string is any CSS length. Defaults to 420px. REQUIRED CONCEPT, not decoration: the viewer is built to fill its container, and a message thread supplies no height, so the card sets one explicitly or the artifact collapses to zero and renders invisible.",
|
|
89
|
+
"oneOf": [{ "type": "number", "minimum": 1 }, { "type": "string", "maxLength": 32 }]
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
@@ -4,8 +4,6 @@
|
|
|
4
4
|
"title": "EmbedCardData",
|
|
5
5
|
"description": "Lazy media-embed payload (YouTube / Vimeo / generic player URL).",
|
|
6
6
|
"type": "object",
|
|
7
|
-
"x-kai-card-type": "embed",
|
|
8
|
-
"x-kai-contract-version": "1",
|
|
9
7
|
"required": ["provider"],
|
|
10
8
|
"additionalProperties": false,
|
|
11
9
|
"properties": {
|
|
@@ -4,8 +4,6 @@
|
|
|
4
4
|
"title": "LinkPreviewData",
|
|
5
5
|
"description": "Rich link / Open-Graph preview payload. The card renders from this; it never fetches.",
|
|
6
6
|
"type": "object",
|
|
7
|
-
"x-kai-card-type": "link",
|
|
8
|
-
"x-kai-contract-version": "1",
|
|
9
7
|
"required": ["url"],
|
|
10
8
|
"additionalProperties": false,
|
|
11
9
|
"properties": {
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// src/primitives/card-tags.ts
|
|
2
|
+
// `CardEnvelope.type` -> the `kai-*` element that renders it. The authoritative map,
|
|
3
|
+
// and the ONLY place it is written down.
|
|
4
|
+
//
|
|
5
|
+
// WHY IT IS ALONE IN A `.ts`
|
|
6
|
+
// --------------------------
|
|
7
|
+
// It used to live in card-registry.tsx beside `BUILTIN_CARD_COMPONENTS`, which is
|
|
8
|
+
// nothing but Solid. The map itself has no Solid in it — it is `Record<string, string>`
|
|
9
|
+
// — but sharing a module with the component map meant no Node/no-DOM project could
|
|
10
|
+
// import it AS SOURCE, and the `kai` MCP server is exactly that: tsconfig.mcp.json is
|
|
11
|
+
// Node-only, `lib: ["ESNext"]`, no `jsx`. So src/agent-tooling/mcp/manifest.ts
|
|
12
|
+
// RE-DERIVED each tag by convention (`kai-<type>`, else the single `kai-<type>-*`) —
|
|
13
|
+
// a second copy of a fact this repo already held, one that happened to agree.
|
|
14
|
+
//
|
|
15
|
+
// Relaxing tsconfig.mcp.json instead is not an option and was measured, not guessed:
|
|
16
|
+
// giving that project a `jsx` setting drags the Solid component tree into a Node-only
|
|
17
|
+
// pass and takes it from 0 errors to 1364. The Node/no-DOM boundary is load-bearing.
|
|
18
|
+
// Splitting the data out is the fix; this file is that split.
|
|
19
|
+
//
|
|
20
|
+
// Because it is plain data with no DOM and no Solid runtime below it,
|
|
21
|
+
// `@kitn.ai/ui/schemas` — the server-safe entry a backend route imports — re-exports
|
|
22
|
+
// it, so the MCP and any consumer route read the same map instead of guessing at it.
|
|
23
|
+
// card-registry.tsx re-exports everything here in turn, so every existing importer of
|
|
24
|
+
// `BUILTIN_CARD_TAGS` / `mergeCardTags` / `CardTagMap` is unaffected.
|
|
25
|
+
//
|
|
26
|
+
// WHAT THIS SPLIT DOES NOT DO, MEASURED
|
|
27
|
+
// -------------------------------------
|
|
28
|
+
// It does not change dist/schemas.js. Routing that entry's re-export back through
|
|
29
|
+
// card-registry.tsx yields a byte-identical bundle with zero `solid-js` references
|
|
30
|
+
// that imports clean under `node`: rollup compiles the Solid tree and discards it,
|
|
31
|
+
// since only the tag map is reachable. So no runtime guard tells the two apart, and
|
|
32
|
+
// this file must not be sold as one. What it changes is the dependency GRAPH — the
|
|
33
|
+
// server-safe entry no longer reaches the component tree at all, instead of reaching
|
|
34
|
+
// it and counting on tree-shaking to undo that. See src/schemas/index.ts.
|
|
35
|
+
//
|
|
36
|
+
// Built-ins cover the 7 contract card types; consumers extend/override via a `types`
|
|
37
|
+
// prop (merged OVER the built-ins). kai-card (bare shell) is intentionally NOT a target.
|
|
38
|
+
|
|
39
|
+
/** Web-component layer: envelope type → kai-* tag name. */
|
|
40
|
+
export type CardTagMap = Record<string, string>;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* The seven built-in card types and the element that draws each one.
|
|
44
|
+
*
|
|
45
|
+
* Note `link` → `kai-link-preview`: the one entry that is NOT `kai-<type>`, and the
|
|
46
|
+
* reason inferring these from the tag list is a guess rather than a lookup.
|
|
47
|
+
*/
|
|
48
|
+
export const BUILTIN_CARD_TAGS: CardTagMap = {
|
|
49
|
+
form: 'kai-form',
|
|
50
|
+
confirm: 'kai-confirm',
|
|
51
|
+
'tasks': 'kai-tasks',
|
|
52
|
+
choice: 'kai-choice',
|
|
53
|
+
link: 'kai-link-preview',
|
|
54
|
+
embed: 'kai-embed',
|
|
55
|
+
artifact: 'kai-artifact',
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
/** Built-ins with the consumer's overrides merged on top (consumer wins). */
|
|
59
|
+
export function mergeCardTags(types?: CardTagMap): CardTagMap {
|
|
60
|
+
return types ? { ...BUILTIN_CARD_TAGS, ...types } : { ...BUILTIN_CARD_TAGS };
|
|
61
|
+
}
|