@kitn.ai/ui 0.28.0 → 0.30.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 +11 -7
- package/dist/{Icon-DObhsRtm.js → Icon-BzBET3E-.js} +1 -1
- package/dist/{action-icons-CcgNN2oT.js → action-icons-DaW2pU6m.js} +1 -1
- package/dist/agent-tooling/construct/public.d.ts +15 -0
- package/dist/agent-tooling/construct/schema.d.ts +111 -0
- package/dist/arrow-down-D783iMJj.js +1 -0
- package/dist/arrow-left-0VLM5kyg.js +1 -0
- package/dist/artifact-DGjzHYUT.js +1 -0
- package/dist/{attachments-Qr4kg-2b.js → attachments-YvXHlg88.js} +1 -1
- package/dist/{audio-visualizer-DToYdfSc.js → audio-visualizer-9lz5IHsL.js} +1 -1
- package/dist/{badge-CdEu_jn2.js → badge-Dh_vp8A5.js} +1 -1
- package/dist/{bell-DQAAOpDz.js → bell-CT7_WUwS.js} +1 -1
- package/dist/{button-DkuOnGLy.js → button-C_3te6fm.js} +1 -1
- package/dist/{card-renderer-Jx70m6_l.js → card-renderer-DZVaGH2e.js} +1 -1
- package/dist/check-CiEOVnEN.js +1 -0
- package/dist/{checkbox-D7iRB3nL.js → checkbox-Bu2T2e0U.js} +1 -1
- package/dist/{checkbox-group-B2_rpoPM.js → checkbox-group-BiryEXPQ.js} +1 -1
- package/dist/chevron-down-CSobuZRG.js +1 -0
- package/dist/chevron-right-DR9ZAP-2.js +1 -0
- package/dist/{choice-card-m0BYqqOK.js → choice-card-CM6IjkmL.js} +1 -1
- package/dist/circle-BC66EYF7.js +1 -0
- package/dist/circle-check-BqmahW0O.js +1 -0
- package/dist/{circle-x-BPG0iPst.js → circle-x-Bk-dA5Wf.js} +1 -1
- package/dist/{code-block-ClMLKb7C.js → code-block-B26t-Q7q.js} +1 -1
- package/dist/{collapsible-B4DlWicL.js → collapsible-Bhc636Cf.js} +1 -1
- package/dist/components/builder-composer-triggers.d.ts +62 -0
- package/dist/components/builder-layout.d.ts +54 -0
- package/dist/components/builder-message-actions.d.ts +72 -0
- package/dist/components/builder-panel.d.ts +189 -0
- package/dist/components/builder-preview.d.ts +11 -0
- package/dist/components/builder-shell-controls.d.ts +69 -0
- package/dist/components/builder-skeleton.d.ts +58 -0
- package/dist/components/builder-start.d.ts +75 -0
- package/dist/components/builder-workspace-variants.d.ts +23 -0
- package/dist/components/captions.d.ts +66 -0
- package/dist/{composer-sQ0HcvyG.js → composer-DMI85B6j.js} +1 -1
- package/dist/{confirm-card-rQWDQsnC.js → confirm-card-B0YIAwXp.js} +1 -1
- package/dist/construct-cli.es.js +3 -3
- package/dist/construct.d.ts +5 -0
- package/dist/construct.js +327 -0
- package/dist/{context-0kg4ZX1J.js → context-DWgfhqWp.js} +1 -1
- package/dist/controllable-BagRpyHv.js +1 -0
- package/dist/{conversation-item-BxwQLaFJ.js → conversation-item-BsOsVGmT.js} +1 -1
- package/dist/{conversation-list-BCfGN1JU.js → conversation-list-aX3Vtc7L.js} +1 -1
- package/dist/{copy-n9u9rqpi.js → copy-BmEwsNhJ.js} +1 -1
- package/dist/core-C8fzo39E.js +1 -12
- package/dist/{create-tween-uPkArjIG.js → create-tween-CNOAU3Fx.js} +1 -1
- package/dist/{create-tween-C-q-JCM-.js → create-tween-WfqiENls.js} +1 -1
- package/dist/{create-tween-CRrJXxBd.js → create-tween-wlFtW9Kh.js} +1 -1
- package/dist/{create-tween-DZ3RRDHD.js → create-tween-zt79ba32.js} +1 -1
- package/dist/{default-input-CaMrJkgH.js → default-input-DMV5Eaze.js} +1 -1
- package/dist/define-CI0y3eE4.js +1 -0
- package/dist/define.js +40 -40
- package/dist/define.server.js +45 -45
- package/dist/{disclosure-WUImBbDv.js → disclosure-NnACBxsC.js} +1 -1
- package/dist/{dropdown-wZVeJOMd.js → dropdown-DT7G0RGR.js} +1 -1
- 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-workspace.js +1 -1
- package/dist/elements/chat.js +1 -1
- package/dist/elements/checkbox-group.js +1 -1
- package/dist/elements/checkbox.js +1 -1
- package/dist/elements/checkpoint.js +1 -1
- package/dist/elements/choice.js +1 -1
- package/dist/elements/coachmark.js +1 -1
- package/dist/elements/code-block.js +1 -1
- package/dist/elements/command.js +1 -1
- package/dist/elements/compare.js +1 -1
- package/dist/elements/composer.js +1 -1
- package/dist/elements/confirm-card.js +1 -1
- package/dist/elements/context-meter.js +1 -1
- package/dist/elements/conversation-item.js +1 -1
- package/dist/elements/conversation-list.js +1 -1
- package/dist/elements/dialog.js +1 -1
- package/dist/elements/dock.js +1 -1
- package/dist/elements/dropdown.js +1 -1
- package/dist/elements/editable-label.js +1 -1
- 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-grid.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/radio-group.js +1 -1
- package/dist/elements/reasoning.js +1 -1
- 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/select.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/slider.js +1 -1
- package/dist/elements/source.js +1 -1
- package/dist/elements/status.js +1 -1
- package/dist/elements/switch.js +1 -1
- package/dist/elements/tabs.js +1 -1
- package/dist/elements/tasks.js +1 -1
- package/dist/elements/text-shimmer.js +1 -1
- package/dist/elements/thinking-bar.js +1 -1
- package/dist/elements/thread.js +1 -1
- package/dist/elements/toast.js +1 -1
- package/dist/elements/tool.js +1 -1
- package/dist/elements/tooltip.js +1 -1
- package/dist/elements/voice-input.js +1 -1
- package/dist/elements/voice-output.js +1 -1
- package/dist/{ellipsis-CbOpJnU3.js → ellipsis-6pJ7SxYT.js} +1 -1
- package/dist/{embed-CrfjkbUG.js → embed-BMje-nxj.js} +1 -1
- package/dist/engine-javascript-C1x7zo1_.js +1 -141
- package/dist/{external-link-ByXAwBBQ.js → external-link-Beh9DKeR.js} +1 -1
- package/dist/{file-text-DMib2qwt.js → file-text-D1GPfZ8Q.js} +1 -1
- package/dist/{file-tree-CJqM2aP7.js → file-tree-Dwj2lqg-.js} +1 -1
- package/dist/{folder-_BAb929C.js → folder-b6D8x1DY.js} +1 -1
- package/dist/{form-DSZgZQZk.js → form-DWgdxDXu.js} +1 -1
- package/dist/{hover-card-BQbul9eq.js → hover-card-CWRkqm40.js} +1 -1
- package/dist/{icon-CdcfRhYI.js → icon-CL0jdhsf.js} +1 -1
- package/dist/index.js +1741 -1725
- package/dist/index.server.js +1582 -1566
- package/dist/{info-DsFjGuI_.js → info-0cOUherQ.js} +1 -1
- package/dist/{input-DKbmkMos.js → input-BH6Ru91Q.js} +1 -1
- package/dist/kai.es.js +1 -1
- package/dist/{kbd-PvdGhX4s.js → kbd-DRAnVtNX.js} +1 -1
- package/dist/{link-zF8PzWfF.js → link-Dlr0vssB.js} +1 -1
- package/dist/{link-preview-DbM1866N.js → link-preview-DODgRyV9.js} +1 -1
- package/dist/loader-KvJB6NrT.js +1 -0
- package/dist/{markdown-LMvmAyBk.js → markdown-DX9tuJVj.js} +1 -1
- package/dist/mcp.es.js +9 -5
- package/dist/{message-BYZECyek.js → message-BqQ7Ot5q.js} +1 -1
- package/dist/{message-BSsgvHvf.js → message-DkaGfBd8.js} +1 -1
- package/dist/message-circle-BPpp5QKv.js +1 -0
- package/dist/message-square-BLbsd9BJ.js +1 -0
- package/dist/{minimize-2-BQRoBV1V.js → minimize-2-CyOHJwcN.js} +1 -1
- package/dist/{model-switcher-CMpCOYcB.js → model-switcher-0hrKDiK2.js} +1 -1
- package/dist/{overlay-Cb-MkyDa.js → overlay-DBMFXie6.js} +1 -1
- package/dist/{panel-right-i8warFxT.js → panel-right-t8SWJL6e.js} +1 -1
- package/dist/{paperclip-ByY3UVO6.js → paperclip-CdzuOjbU.js} +1 -1
- package/dist/play-BXy1u7rW.js +1 -0
- package/dist/primitives/use-auto-resize.d.ts +11 -0
- package/dist/{progress-bar-jVAHvMUf.js → progress-bar-CiBtxMWT.js} +1 -1
- package/dist/{prompt-suggestion-CD-qtNgC.js → prompt-suggestion-I_DHP21i.js} +1 -1
- package/dist/{radio-BsoBMhkF.js → radio-C_p3n39l.js} +1 -1
- package/dist/{reasoning-4kBPtlTx.js → reasoning-BDwy_tIe.js} +1 -1
- package/dist/register-impl-DvEnhIxx.js +424 -0
- package/dist/{resizable-uPmY9VY-.js → resizable-SYC-fStM.js} +1 -1
- package/dist/{rotate-ccw-B2xn93py.js → rotate-ccw-B1nwmwuY.js} +1 -1
- package/dist/{rotate-cw-CMVLoCyH.js → rotate-cw-CLAnBcm1.js} +1 -1
- package/dist/{scroll-area-BqLUo8ZZ.js → scroll-area-zRyXoLhI.js} +1 -1
- package/dist/{scroll-button-DslXiJyL.js → scroll-button-jzrbYCG9.js} +1 -1
- package/dist/{select-2cLRtPGT.js → select-DM-0nEe0.js} +1 -1
- package/dist/{separator-BWQtNJcM.js → separator-BToOOoOt.js} +1 -1
- package/dist/{settings-BBR63jLg.js → settings-PaGo_S4U.js} +1 -1
- package/dist/{settings-group-B2ciy-Iw.js → settings-group-BFXGIfXq.js} +1 -1
- package/dist/{skeleton-CkHI-HgC.js → skeleton-DYpmFnnm.js} +1 -1
- package/dist/{slider-DDR9U-i0.js → slider-ebutAmkQ.js} +1 -1
- package/dist/{solid-DruVOXnf.js → solid-15v_3WVL.js} +3563 -3412
- package/dist/{solid-BzCFdL25.js → solid-5P-otgdi.js} +4502 -4296
- package/dist/solid.d.ts +6 -0
- package/dist/solid.js +259 -254
- package/dist/solid.server.js +259 -254
- package/dist/{source-GEnFF528.js → source-c1gpRl9h.js} +1 -1
- package/dist/{star-CilHq8GP.js → star-pcV_3LqF.js} +1 -1
- package/dist/{store-Ciyk6eZG.js → store-CSgbFFCg.js} +1 -1
- package/dist/{switch-KkeQIbuH.js → switch-Bh2OdLV2.js} +1 -1
- package/dist/{tasks-card-BrN4bggJ.js → tasks-card-CbqQAn2S.js} +1 -1
- package/dist/text-shimmer-BSzgEnDH.js +1 -0
- package/dist/textarea-DrYNt_0z.js +1 -0
- package/dist/theme.tokens.css +22 -21
- package/dist/{thumbs-up-CsT9Wzb9.js → thumbs-up-BL3-NenK.js} +1 -1
- package/dist/{toast-store-tgK6MuMv.js → toast-store-DkOlYczt.js} +1 -1
- package/dist/{tool-DzUjIBT8.js → tool-CeIWUVUe.js} +1 -1
- package/dist/{tooltip-Bkkg_4t0.js → tooltip-GA-nmg06.js} +1 -1
- package/dist/{trash-2-jBKxjGGQ.js → trash-2-CT66QWlm.js} +1 -1
- package/dist/{triangle-alert-DlQ68ppf.js → triangle-alert-CeHLWxhD.js} +1 -1
- package/dist/ui/color-field.d.ts +48 -0
- package/dist/ui/textarea.d.ts +4 -0
- package/dist/ui/toggle-chip.d.ts +40 -0
- package/dist/{upload-TcAHXv9W.js → upload-9Csb0F0J.js} +1 -1
- package/dist/{use-card-resolution-DaZqAdWf.js → use-card-resolution-Zg0a08Z-.js} +1 -1
- package/dist/{variant-aurora-DbW_OWL2.js → variant-aurora-4VBQHIKV.js} +1 -1
- package/dist/{variant-aurora-CNmfHhcx.js → variant-aurora-DBeCAQNk.js} +2 -2
- package/dist/{variant-aurora-D6GsdTPA.js → variant-aurora-FzHVXHby.js} +2 -2
- package/dist/{variant-aurora-BhLuYxJR.js → variant-aurora-LE3fqxgw.js} +1 -1
- package/dist/{variant-custom-BvYHR62b.js → variant-custom-AFRGcOBS.js} +1 -1
- package/dist/{variant-custom-DV2x254s.js → variant-custom-BQkNuPpE.js} +2 -2
- package/dist/{variant-custom-BRvaNHSi.js → variant-custom-DI5R0rln.js} +1 -1
- package/dist/{variant-custom-DMTrEO5w.js → variant-custom-WWnrrRHS.js} +2 -2
- package/dist/{variant-wave-CyBueXj9.js → variant-wave-DUCbH5oI.js} +2 -2
- package/dist/{variant-wave-BNMGrDfj.js → variant-wave-DuQV7DhQ.js} +2 -2
- package/dist/{variant-wave-BpDd8t3Z.js → variant-wave-nSI2sfII.js} +1 -1
- package/dist/{variant-wave-sp-qwsdI.js → variant-wave-wTP5v_jU.js} +1 -1
- package/dist/x-eiO9V6J6.js +1 -0
- package/{src/elements/styles.css → kit-base.css} +27 -44
- package/package.json +32 -17
- package/solid.css +33 -0
- package/theme.css +39 -23
- package/bin/route.test.js +0 -58
- package/dist/arrow-down-CjRU3JgV.js +0 -1
- package/dist/arrow-left-Bnpb1UEW.js +0 -1
- package/dist/artifact-Bwt7OgcR.js +0 -1
- package/dist/check-njkVdZu2.js +0 -1
- package/dist/chevron-down-B72s6PXR.js +0 -1
- package/dist/chevron-right-BatuHzUm.js +0 -1
- package/dist/circle-check-B62pODB3.js +0 -1
- package/dist/circle-zx0ByzY9.js +0 -1
- package/dist/controllable-CnGpMF6r.js +0 -1
- package/dist/define-By-uL588.js +0 -1
- package/dist/loader-BM4CEz4G.js +0 -1
- package/dist/message-circle-DruwObfX.js +0 -1
- package/dist/message-square-BG6q6mlm.js +0 -1
- package/dist/play-BvKKq3fX.js +0 -1
- package/dist/register-impl-B1hLkrI8.js +0 -424
- package/dist/text-shimmer-Dcj1MHuq.js +0 -1
- package/dist/textarea-Dpvbngbg.js +0 -1
- package/dist/x-Z5UntkIJ.js +0 -1
- package/src/agent-tooling/README.md +0 -192
- package/src/agent-tooling/archetypes.ts +0 -205
- package/src/agent-tooling/catalog/README.md +0 -676
- package/src/agent-tooling/catalog/catalog-types.ts +0 -231
- package/src/agent-tooling/catalog/fabrications.ts +0 -96
- package/src/agent-tooling/catalog/invariants.ts +0 -284
- package/src/agent-tooling/catalog/labs-titles.ts +0 -114
- package/src/agent-tooling/catalog/scenarios.ts +0 -87
- package/src/agent-tooling/catalog/surfaces.ts +0 -347
- package/src/agent-tooling/construct/cli-entry.ts +0 -8
- package/src/agent-tooling/construct/cli.ts +0 -147
- package/src/agent-tooling/construct/codegen.ts +0 -1635
- package/src/agent-tooling/construct/construct.v1.schema.json +0 -319
- package/src/agent-tooling/construct/dev.ts +0 -148
- package/src/agent-tooling/construct/fixtures/demo-widget.construct.json +0 -7
- package/src/agent-tooling/construct/fixtures/ops-console.construct.json +0 -44
- package/src/agent-tooling/construct/fixtures/owner-widget.construct.json +0 -32
- package/src/agent-tooling/construct/schema.ts +0 -452
- package/src/agent-tooling/integrations/anthropic.ts +0 -442
- package/src/agent-tooling/integrations/cloudflare.ts +0 -218
- package/src/agent-tooling/integrations/langgraph.ts +0 -133
- package/src/agent-tooling/integrations/mastra.ts +0 -182
- package/src/agent-tooling/integrations/mock.ts +0 -148
- package/src/agent-tooling/integrations/ollama.ts +0 -97
- package/src/agent-tooling/integrations/openai.ts +0 -95
- package/src/agent-tooling/integrations/openrouter.ts +0 -82
- package/src/agent-tooling/integrations/pi.ts +0 -176
- package/src/agent-tooling/integrations/pydantic-ai.ts +0 -108
- package/src/agent-tooling/integrations/vercel-ai-sdk.ts +0 -398
- package/src/agent-tooling/mcp/css-raw.d.ts +0 -12
- package/src/agent-tooling/mcp/manifest.ts +0 -422
- package/src/agent-tooling/mcp/server.ts +0 -116
- package/src/agent-tooling/mcp/stdio.ts +0 -18
- package/src/agent-tooling/mcp/tools/construct.ts +0 -130
- package/src/agent-tooling/mcp/tools/debug.ts +0 -621
- package/src/agent-tooling/mcp/tools/reference.ts +0 -980
- package/src/agent-tooling/mcp/tools/scaffold.ts +0 -6708
- package/src/agent-tooling/mcp/tools/theme.ts +0 -456
- package/src/agent-tooling/mcp/tools/types.ts +0 -14
- package/src/agent-tooling/mcp/validate-args.ts +0 -141
- package/src/agent-tooling/recipes/composed-thread.ts +0 -714
- package/src/agent-tooling/recipes/index.ts +0 -22
- package/src/agent-tooling/recipes/types.ts +0 -32
- package/src/agent-tooling/registry.ts +0 -132
- package/src/agent-tooling/route-emit.ts +0 -305
- package/src/agent-tooling/types.ts +0 -390
- package/src/components/artifact-card.tsx +0 -120
- package/src/components/artifact.tsx +0 -914
- package/src/components/attachment-types.ts +0 -66
- package/src/components/attachments.tsx +0 -536
- package/src/components/audio-visualizer/audio-visualizer.voice-fixture.ts +0 -257
- package/src/components/audio-visualizer/aurora.glsl.ts +0 -330
- package/src/components/audio-visualizer/fit-scale.ts +0 -112
- package/src/components/audio-visualizer/index.tsx +0 -528
- package/src/components/audio-visualizer/labs/lab-choreography.ts +0 -187
- package/src/components/audio-visualizer/labs/lab-shaders.ts +0 -363
- package/src/components/audio-visualizer/labs/lab-visualizer.tsx +0 -102
- package/src/components/audio-visualizer/shader-canvas.tsx +0 -876
- package/src/components/audio-visualizer/sizes.ts +0 -54
- package/src/components/audio-visualizer/variant-aurora.tsx +0 -305
- package/src/components/audio-visualizer/variant-bar.tsx +0 -175
- package/src/components/audio-visualizer/variant-custom.tsx +0 -344
- package/src/components/audio-visualizer/variant-grid.tsx +0 -175
- package/src/components/audio-visualizer/variant-radial.tsx +0 -163
- package/src/components/audio-visualizer/variant-wave.tsx +0 -130
- package/src/components/audio-visualizer/wave.glsl.ts +0 -130
- package/src/components/card-fallback.tsx +0 -60
- package/src/components/card-renderer.tsx +0 -220
- package/src/components/card.tsx +0 -212
- package/src/components/chain-of-thought.tsx +0 -348
- package/src/components/chat-container.tsx +0 -89
- package/src/components/chat-scope-picker.tsx +0 -57
- package/src/components/chat-thread.tsx +0 -1014
- package/src/components/checkpoint.tsx +0 -88
- package/src/components/choice-card.tsx +0 -743
- package/src/components/coachmark.tsx +0 -249
- package/src/components/code-block.tsx +0 -181
- package/src/components/composer-dom.ts +0 -159
- package/src/components/composer-highlight.ts +0 -242
- package/src/components/composer-history.ts +0 -82
- package/src/components/composer.tsx +0 -1075
- package/src/components/confirm-card.tsx +0 -402
- package/src/components/context.tsx +0 -377
- package/src/components/conversation-item.tsx +0 -241
- package/src/components/conversation-list.tsx +0 -429
- package/src/components/conversation-panel.tsx +0 -118
- package/src/components/dismissed-stub.tsx +0 -80
- package/src/components/embed.tsx +0 -200
- package/src/components/empty.tsx +0 -177
- package/src/components/feedback-bar.tsx +0 -166
- package/src/components/file-tree.tsx +0 -530
- package/src/components/file-upload.tsx +0 -167
- package/src/components/form-widgets.tsx +0 -525
- package/src/components/form.tsx +0 -1296
- package/src/components/home-panel.tsx +0 -159
- package/src/components/image.tsx +0 -65
- package/src/components/link-preview.tsx +0 -195
- package/src/components/loader.tsx +0 -367
- package/src/components/markdown.tsx +0 -162
- package/src/components/message-skills.tsx +0 -40
- package/src/components/message.tsx +0 -765
- package/src/components/model-switcher.tsx +0 -132
- package/src/components/prompt-input.tsx +0 -188
- package/src/components/prompt-suggestion.tsx +0 -150
- package/src/components/reasoning.tsx +0 -293
- package/src/components/response-compare-types.ts +0 -152
- package/src/components/response-compare.tsx +0 -455
- package/src/components/response-stream.tsx +0 -109
- package/src/components/screen.tsx +0 -181
- package/src/components/scroll-button.tsx +0 -93
- package/src/components/source.tsx +0 -192
- package/src/components/tasks-card.tsx +0 -801
- package/src/components/text-shimmer.tsx +0 -37
- package/src/components/thinking-bar.tsx +0 -50
- package/src/components/thread.tsx +0 -228
- package/src/components/toast.tsx +0 -503
- package/src/components/tool-classify.ts +0 -26
- package/src/components/tool-types.ts +0 -49
- package/src/components/tool.tsx +0 -190
- package/src/components/use-card-resolution.ts +0 -44
- package/src/components/voice-input.tsx +0 -222
- package/src/components/voice-output.tsx +0 -242
- package/src/components/widget-tab-bar.tsx +0 -73
- package/src/components/workspace-shell.tsx +0 -285
- package/src/diagnostics/hook.ts +0 -352
- package/src/diagnostics/index.ts +0 -82
- package/src/diagnostics/report-request.ts +0 -296
- package/src/elements/agent-card.tsx +0 -67
- package/src/elements/artifact.tsx +0 -194
- package/src/elements/attachments.tsx +0 -140
- package/src/elements/audio-visualizer.tsx +0 -227
- package/src/elements/autoloader.ts +0 -89
- package/src/elements/avatar.tsx +0 -33
- package/src/elements/badge.tsx +0 -32
- package/src/elements/button.tsx +0 -149
- package/src/elements/card.tsx +0 -133
- package/src/elements/cards.tsx +0 -266
- package/src/elements/chain-of-thought.tsx +0 -141
- package/src/elements/chat-scope-picker.tsx +0 -65
- package/src/elements/chat-types.ts +0 -102
- package/src/elements/chat-workspace.tsx +0 -188
- package/src/elements/chat.tsx +0 -304
- package/src/elements/checkbox-group.tsx +0 -164
- package/src/elements/checkbox.tsx +0 -134
- package/src/elements/checkpoint.tsx +0 -47
- package/src/elements/choice.tsx +0 -100
- package/src/elements/coachmark.tsx +0 -90
- package/src/elements/code-block.tsx +0 -60
- package/src/elements/command.tsx +0 -197
- package/src/elements/compare.tsx +0 -111
- package/src/elements/compiled.css +0 -2
- package/src/elements/composer.tsx +0 -162
- package/src/elements/confirm-card.tsx +0 -76
- package/src/elements/context-meter.tsx +0 -107
- package/src/elements/conversation-item.tsx +0 -120
- package/src/elements/conversation-list.tsx +0 -203
- package/src/elements/css.ts +0 -5
- package/src/elements/default-input.tsx +0 -392
- package/src/elements/define-entry.ts +0 -12
- package/src/elements/define.tsx +0 -563
- package/src/elements/diagnostic-events.ts +0 -114
- package/src/elements/dialog.tsx +0 -145
- package/src/elements/disclosure.ts +0 -95
- package/src/elements/dock.tsx +0 -215
- package/src/elements/dropdown.tsx +0 -123
- package/src/elements/editable-label.tsx +0 -140
- package/src/elements/element-data-types.ts +0 -152
- package/src/elements/element-diagnostics.ts +0 -392
- package/src/elements/element-manifest.json +0 -354
- package/src/elements/element-nonscalar.json +0 -187
- package/src/elements/element-types.d.ts +0 -4353
- package/src/elements/embed.tsx +0 -35
- package/src/elements/empty.tsx +0 -29
- package/src/elements/feedback-bar.tsx +0 -66
- package/src/elements/file-tree.tsx +0 -62
- package/src/elements/file-upload.tsx +0 -44
- package/src/elements/form.tsx +0 -94
- package/src/elements/hover-card.tsx +0 -80
- package/src/elements/icon.tsx +0 -41
- package/src/elements/image.tsx +0 -32
- package/src/elements/input.tsx +0 -492
- package/src/elements/kbd.tsx +0 -45
- package/src/elements/link-preview.tsx +0 -34
- package/src/elements/loader.tsx +0 -25
- package/src/elements/markdown.tsx +0 -38
- package/src/elements/menu.tsx +0 -241
- package/src/elements/message-skills.tsx +0 -83
- package/src/elements/message.tsx +0 -361
- package/src/elements/model-switcher.tsx +0 -121
- package/src/elements/nav.tsx +0 -87
- package/src/elements/notice.tsx +0 -53
- package/src/elements/pane-grid.tsx +0 -111
- package/src/elements/pane-group.tsx +0 -119
- package/src/elements/pane.tsx +0 -129
- package/src/elements/popover.tsx +0 -81
- package/src/elements/progress-bar.tsx +0 -39
- package/src/elements/prompt-dock.tsx +0 -82
- package/src/elements/prompt-input.tsx +0 -240
- package/src/elements/prompt-suggestions.tsx +0 -113
- package/src/elements/radio-group.tsx +0 -129
- package/src/elements/reasoning.tsx +0 -71
- package/src/elements/register-impl.ts +0 -148
- package/src/elements/register.ts +0 -76
- package/src/elements/remote.tsx +0 -225
- package/src/elements/resizable.globals.d.ts +0 -36
- package/src/elements/resizable.tsx +0 -704
- package/src/elements/response-stream.tsx +0 -40
- package/src/elements/screen.tsx +0 -90
- package/src/elements/scroll-area.tsx +0 -33
- package/src/elements/scroll-button.tsx +0 -179
- package/src/elements/search.tsx +0 -185
- package/src/elements/segmented.tsx +0 -129
- package/src/elements/select.tsx +0 -165
- package/src/elements/separator.tsx +0 -36
- package/src/elements/setting-item.tsx +0 -50
- package/src/elements/settings-group.tsx +0 -37
- package/src/elements/skeleton.tsx +0 -45
- package/src/elements/slider.tsx +0 -171
- package/src/elements/slot-text.ts +0 -73
- package/src/elements/slots.ts +0 -787
- package/src/elements/source.tsx +0 -126
- package/src/elements/status.tsx +0 -42
- package/src/elements/switch.tsx +0 -118
- package/src/elements/tabs.tsx +0 -95
- package/src/elements/tasks.tsx +0 -103
- package/src/elements/text-shimmer.tsx +0 -28
- package/src/elements/thinking-bar.tsx +0 -43
- package/src/elements/thread.tsx +0 -139
- package/src/elements/toast.tsx +0 -106
- package/src/elements/tool.tsx +0 -78
- package/src/elements/tooltip.tsx +0 -85
- package/src/elements/validate-messages.ts +0 -76
- package/src/elements/voice-input.tsx +0 -100
- package/src/elements/voice-output.tsx +0 -82
- package/src/index.ts +0 -430
- package/src/primitives/audio-bands.ts +0 -174
- package/src/primitives/card-component-types.ts +0 -63
- package/src/primitives/card-contract.ts +0 -80
- package/src/primitives/card-data-types.ts +0 -361
- package/src/primitives/card-host.tsx +0 -37
- package/src/primitives/card-recovery.ts +0 -160
- package/src/primitives/card-registry.tsx +0 -78
- package/src/primitives/card-resolution.ts +0 -36
- package/src/primitives/card-routing.ts +0 -85
- package/src/primitives/card-schemas/artifact.schema.json +0 -92
- package/src/primitives/card-schemas/card-envelope.schema.json +0 -14
- package/src/primitives/card-schemas/card-event.schema.json +0 -12
- package/src/primitives/card-schemas/choice.schema.json +0 -75
- package/src/primitives/card-schemas/confirm.schema.json +0 -65
- package/src/primitives/card-schemas/embed.schema.json +0 -63
- package/src/primitives/card-schemas/form.result.schema.json +0 -7
- package/src/primitives/card-schemas/form.schema.json +0 -53
- package/src/primitives/card-schemas/link.schema.json +0 -54
- package/src/primitives/card-schemas/tasks.result.schema.json +0 -16
- package/src/primitives/card-schemas/tasks.schema.json +0 -83
- package/src/primitives/card-tags.ts +0 -61
- package/src/primitives/card-validate-cards.ts +0 -255
- package/src/primitives/card-validate-schemas.ts +0 -58
- package/src/primitives/card-validate.ts +0 -131
- package/src/primitives/chat-config.tsx +0 -103
- package/src/primitives/composer-model.ts +0 -49
- package/src/primitives/composer-triggers.ts +0 -35
- package/src/primitives/controllable.ts +0 -21
- package/src/primitives/conversation-store.ts +0 -248
- package/src/primitives/create-kai-chat.ts +0 -66
- package/src/primitives/create-tween.ts +0 -266
- package/src/primitives/embed-providers.ts +0 -254
- package/src/primitives/field-mask.ts +0 -256
- package/src/primitives/field-semantics.ts +0 -115
- package/src/primitives/highlighter.ts +0 -157
- package/src/primitives/input-mask.ts +0 -853
- package/src/primitives/link-preview.ts +0 -87
- package/src/primitives/message-feedback.ts +0 -124
- package/src/primitives/pdf-preview.ts +0 -121
- package/src/primitives/toast-store.ts +0 -338
- package/src/primitives/url-scheme-policy.ts +0 -70
- package/src/primitives/use-audio-analysis.ts +0 -340
- package/src/primitives/use-auto-resize.ts +0 -31
- package/src/primitives/use-resize-observer.ts +0 -45
- package/src/primitives/use-sequencer.ts +0 -72
- package/src/primitives/use-speech-recognition.ts +0 -146
- package/src/primitives/use-stick-to-bottom.ts +0 -75
- package/src/primitives/use-text-stream.ts +0 -143
- package/src/primitives/use-voice-recorder.ts +0 -62
- package/src/primitives/visualizer-sequences.ts +0 -350
- package/src/remote/host-embed.ts +0 -345
- package/src/remote/index.ts +0 -2
- package/src/remote/origin.ts +0 -30
- package/src/remote/provider-runtime.ts +0 -262
- package/src/remote/provider.ts +0 -2
- package/src/remote/validate.ts +0 -22
- package/src/remote/version.ts +0 -12
- package/src/remote/wire.ts +0 -48
- package/src/schemas/from-tool-call.ts +0 -151
- package/src/schemas/index.ts +0 -341
- package/src/schemas/provider-subsets.ts +0 -538
- package/src/schemas/registry.ts +0 -355
- package/src/schemas/tool-defs.ts +0 -793
- package/src/solid.ts +0 -173
- package/src/state/index.ts +0 -44
- package/src/state/messages.ts +0 -53
- package/src/state/mock.ts +0 -297
- package/src/state/parts.ts +0 -295
- package/src/state/persistence.ts +0 -180
- package/src/state/stream.ts +0 -246
- package/src/state/suggestions.ts +0 -9
- package/src/state/threads.ts +0 -142
- package/src/test-utils/fake-clock.ts +0 -88
- package/src/types.ts +0 -95
- package/src/ui/action-icons.ts +0 -53
- package/src/ui/agent-card.tsx +0 -218
- package/src/ui/avatar.tsx +0 -23
- package/src/ui/badge.tsx +0 -21
- package/src/ui/button.tsx +0 -49
- package/src/ui/card.tsx +0 -245
- package/src/ui/checkbox-group.tsx +0 -153
- package/src/ui/checkbox.tsx +0 -63
- package/src/ui/collapsible.tsx +0 -163
- package/src/ui/command.tsx +0 -103
- package/src/ui/dialog.tsx +0 -223
- package/src/ui/dock.tsx +0 -630
- package/src/ui/dropdown.tsx +0 -636
- package/src/ui/editable-label.tsx +0 -112
- package/src/ui/hover-card.tsx +0 -345
- package/src/ui/icon.tsx +0 -167
- package/src/ui/input.tsx +0 -391
- package/src/ui/kbd.tsx +0 -118
- package/src/ui/nav.tsx +0 -282
- package/src/ui/notice.tsx +0 -84
- package/src/ui/overlay.tsx +0 -277
- package/src/ui/pane-grid.tsx +0 -117
- package/src/ui/pane-group.tsx +0 -291
- package/src/ui/pane.tsx +0 -193
- package/src/ui/popover.tsx +0 -106
- package/src/ui/progress-bar.tsx +0 -83
- package/src/ui/prompt-dock.tsx +0 -145
- package/src/ui/radio.tsx +0 -150
- package/src/ui/resizable.tsx +0 -693
- package/src/ui/scroll-area.tsx +0 -26
- package/src/ui/segmented.tsx +0 -109
- package/src/ui/select.tsx +0 -168
- package/src/ui/separator.tsx +0 -10
- package/src/ui/settings-group.tsx +0 -67
- package/src/ui/skeleton.tsx +0 -73
- package/src/ui/slider.tsx +0 -178
- package/src/ui/status.tsx +0 -48
- package/src/ui/switch.tsx +0 -119
- package/src/ui/tabs.tsx +0 -168
- package/src/ui/textarea.tsx +0 -21
- package/src/ui/tooltip.tsx +0 -118
- package/src/utils/cn.ts +0 -30
- package/src/wire/chunk.ts +0 -248
- package/src/wire/consume.ts +0 -599
- package/src/wire/diagnostics.ts +0 -727
- package/src/wire/encode-probe.ts +0 -214
- package/src/wire/encode.ts +0 -947
- package/src/wire/files.ts +0 -342
- package/src/wire/formats/anthropic.ts +0 -274
- package/src/wire/formats/openai.ts +0 -228
- package/src/wire/index.ts +0 -95
- package/src/wire/media-types.ts +0 -344
- package/src/wire/read.ts +0 -396
- package/src/wire/sink-helpers.ts +0 -50
- package/src/wire/sse.ts +0 -153
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
import type { ToolPart, RawOrigin } from '../components/tool-types';
|
|
2
|
-
import type { AttachmentData } from '../components/attachment-types';
|
|
3
|
-
import type { CardEnvelope } from '../primitives/card-contract';
|
|
4
|
-
|
|
5
|
-
/** Re-exported so consumers of chat-types (and MessagePart) can keep using
|
|
6
|
-
* RawOrigin unqualified. It is defined in components/tool-types.ts, not here,
|
|
7
|
-
* to keep the components -> elements import direction one-way. */
|
|
8
|
-
export type { RawOrigin };
|
|
9
|
-
|
|
10
|
-
/** The five built-in action buttons (each carries its own curated icon + label). */
|
|
11
|
-
export type ChatMessageAction = 'copy' | 'like' | 'dislike' | 'regenerate' | 'edit';
|
|
12
|
-
|
|
13
|
-
/** A like/dislike feedback vote on an assistant message. */
|
|
14
|
-
export type FeedbackVote = 'like' | 'dislike';
|
|
15
|
-
|
|
16
|
-
/** A host-defined action button. `icon` is a curated registry name (see
|
|
17
|
-
* `src/ui/action-icons.ts`); unknown/absent icons render label-only. */
|
|
18
|
-
export interface CustomAction {
|
|
19
|
-
/** Emitted as the `kai-message-action` detail `action` when clicked. */
|
|
20
|
-
id: string;
|
|
21
|
-
/** Visible/`aria-label` text. */
|
|
22
|
-
label: string;
|
|
23
|
-
/** A curated icon name from the action-icon registry. */
|
|
24
|
-
icon?: string;
|
|
25
|
-
/** Tooltip text shown on hover. Defaults to `label` when omitted. */
|
|
26
|
-
tooltip?: string;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/** The speaker avatar for a message row. (Mirrors the `…Data` convention of
|
|
30
|
-
* `AttachmentData`; named to avoid clashing with the `MessageAvatar` component.) */
|
|
31
|
-
export interface AvatarData {
|
|
32
|
-
/** Image URL. When present, renders an `<img>`. */
|
|
33
|
-
src?: string;
|
|
34
|
-
/** Initials/short text shown when there is no `src`. */
|
|
35
|
-
fallback?: string;
|
|
36
|
-
/** Alt text for the image. */
|
|
37
|
-
alt?: string;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/** A citation the model produced. */
|
|
41
|
-
export interface Source {
|
|
42
|
-
id?: string;
|
|
43
|
-
url?: string;
|
|
44
|
-
title?: string;
|
|
45
|
-
snippet?: string;
|
|
46
|
-
/** Citation marker number, when the model numbers its citations. */
|
|
47
|
-
index?: number;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/** The public name for the citation carried by a `source` part, and the argument
|
|
51
|
-
* type of `AssistantStream.addSource`. The bare `Source` name is already taken
|
|
52
|
-
* on the public entry by the citation-chip COMPONENT (`./components/source`),
|
|
53
|
-
* so exporting this interface unaliased would be a duplicate identifier and the
|
|
54
|
-
* type would be unnameable from `@kitn.ai/ui`. */
|
|
55
|
-
export type MessageSource = Source;
|
|
56
|
-
|
|
57
|
-
/** One ordered piece of message content. Closed union: extension happens at the CARD
|
|
58
|
-
* layer via the card registry, not by adding variants here. */
|
|
59
|
-
export type MessagePart =
|
|
60
|
-
| { type: 'text'; text: string; raw?: RawOrigin }
|
|
61
|
-
| {
|
|
62
|
-
type: 'reasoning';
|
|
63
|
-
text: string;
|
|
64
|
-
label?: string;
|
|
65
|
-
/** Provider block index. Keeps parallel reasoning blocks distinct. */
|
|
66
|
-
index?: number;
|
|
67
|
-
/** Which provider RESPONSE STREAM `index` was counted in. Anthropic restarts
|
|
68
|
-
* content-block indices at 0 for every message, and a multi-round tool loop
|
|
69
|
-
* folds several of those messages into ONE assistant turn, so `index` alone
|
|
70
|
-
* is not unique within `parts`. Set by the wire adapter, one value per
|
|
71
|
-
* `consumeModelStream` call. See `appendReasoningPart`. */
|
|
72
|
-
streamId?: string;
|
|
73
|
-
/** Load-bearing on the OpenAI wire, informational on the Anthropic one.
|
|
74
|
-
* `toOpenAIMessages({ reasoning: 'include' })` REBUILDS a signed
|
|
75
|
-
* `reasoning_details` entry from `text` plus this, because `raw` after a
|
|
76
|
-
* streamed turn is a textless fragment: only the final frame carries the
|
|
77
|
-
* signature and it has no text, and `appendReasoningPart` resolves `raw`
|
|
78
|
-
* last-write-wins. `toAnthropicMessages` ignores this field and echoes
|
|
79
|
-
* `raw.payload` verbatim — a thinking block rebuilt from text plus
|
|
80
|
-
* signature is a hard 400. */
|
|
81
|
-
signature?: string;
|
|
82
|
-
raw?: RawOrigin;
|
|
83
|
-
}
|
|
84
|
-
| { type: 'tool'; tool: ToolPart; raw?: RawOrigin }
|
|
85
|
-
| { type: 'card'; envelope: CardEnvelope; raw?: RawOrigin }
|
|
86
|
-
| { type: 'source'; source: Source; raw?: RawOrigin }
|
|
87
|
-
| { type: 'file'; attachment: AttachmentData; raw?: RawOrigin };
|
|
88
|
-
|
|
89
|
-
export interface ChatMessage {
|
|
90
|
-
id: string;
|
|
91
|
-
role: 'user' | 'assistant';
|
|
92
|
-
/** The ONLY content channel. Ordered. */
|
|
93
|
-
parts: MessagePart[];
|
|
94
|
-
/** Action buttons under the message. Chrome, not content. */
|
|
95
|
-
actions?: (ChatMessageAction | CustomAction)[];
|
|
96
|
-
/** Optional speaker avatar shown to the left of the message column. */
|
|
97
|
-
avatar?: AvatarData;
|
|
98
|
-
/** Controlled feedback vote. When set, it wins over the facade's internal
|
|
99
|
-
* optimistic state (`m.feedback ?? feedbackMap[m.id]`), so a host that
|
|
100
|
-
* persists votes can re-hydrate them. */
|
|
101
|
-
feedback?: FeedbackVote;
|
|
102
|
-
}
|
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
import { createSignal, onMount, onCleanup, untrack } from 'solid-js';
|
|
2
|
-
import { defineWebComponent } from './define';
|
|
3
|
-
import { readSlots, WORKSPACE_SLOTS } from './slots';
|
|
4
|
-
import {
|
|
5
|
-
WorkspaceShell,
|
|
6
|
-
type WorkspaceShellController,
|
|
7
|
-
type WorkspaceAsideSide,
|
|
8
|
-
type WorkspaceAsideToggleDetail,
|
|
9
|
-
type WorkspaceAsideResizeDetail,
|
|
10
|
-
} from '../components/workspace-shell';
|
|
11
|
-
|
|
12
|
-
interface Props extends Record<string, unknown> {
|
|
13
|
-
/** Controlled collapsed state of the start aside. Set this as a JS property
|
|
14
|
-
* (`el.startCollapsed = true`) to drive the aside from your app, updating it
|
|
15
|
-
* in response to the `kai-aside-toggle` event. Omit for uncontrolled (the
|
|
16
|
-
* element manages it). */
|
|
17
|
-
startCollapsed?: boolean;
|
|
18
|
-
/** Initial collapsed state of the start aside when uncontrolled (default
|
|
19
|
-
* false). Use the `default-start-collapsed` attribute to start collapsed in
|
|
20
|
-
* plain HTML. */
|
|
21
|
-
defaultStartCollapsed?: boolean;
|
|
22
|
-
/** Controlled collapsed state of the end aside. Set this as a JS property
|
|
23
|
-
* (`el.endCollapsed = true`) to drive the aside from your app, updating it
|
|
24
|
-
* in response to the `kai-aside-toggle` event. Omit for uncontrolled (the
|
|
25
|
-
* element manages it). */
|
|
26
|
-
endCollapsed?: boolean;
|
|
27
|
-
/** Initial collapsed state of the end aside when uncontrolled (default
|
|
28
|
-
* false). Use the `default-end-collapsed` attribute to start collapsed in
|
|
29
|
-
* plain HTML. */
|
|
30
|
-
defaultEndCollapsed?: boolean;
|
|
31
|
-
/** Auto-collapse both asides when the shell's own width drops below this many
|
|
32
|
-
* px, and re-expand when it grows back above. Applies to uncontrolled asides
|
|
33
|
-
* only (it never fights an app-driven collapsed prop); omit to disable.
|
|
34
|
-
* Fires `kai-aside-toggle`. Attribute: `collapse-below`. */
|
|
35
|
-
collapseBelow?: number;
|
|
36
|
-
/** Below this shell width in px, an expanded aside renders as an overlay
|
|
37
|
-
* drawer over the main region instead of a column beside it. Escape inside
|
|
38
|
-
* the drawer closes it and returns focus to the element focused before it
|
|
39
|
-
* opened. Omit to disable. Attribute: `drawer-below`. */
|
|
40
|
-
drawerBelow?: number;
|
|
41
|
-
/** Density hint. Reflected as a `data-compact` hook on the root (and as the
|
|
42
|
-
* `compact` attribute on the element) for your CSS and slotted content; the
|
|
43
|
-
* shell itself keeps no other opinion about density. */
|
|
44
|
-
compact?: boolean;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/** Events fired by `<kai-workspace>`. Layout only: every chat event now belongs
|
|
48
|
-
* to the part that fires it, inside your own markup. */
|
|
49
|
-
interface Events {
|
|
50
|
-
/** An aside collapsed or expanded (a method, the breakpoint, the drawer's Escape). */
|
|
51
|
-
'kai-aside-toggle': WorkspaceAsideToggleDetail;
|
|
52
|
-
/** The aside was resized (fires per drag step, keyboard nudge, or a handle double-click reset), width in px. */
|
|
53
|
-
'kai-aside-resize': WorkspaceAsideResizeDetail;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* `<kai-workspace>` — the chat-agnostic layout shell: five slots (`header` ·
|
|
58
|
-
* `start` · `main` · `end` · `footer`), resize handles between the columns,
|
|
59
|
-
* per-aside collapse, collapse-below-breakpoint, and a mobile drawer mode for
|
|
60
|
-
* the asides. It knows nothing about chat: a file tree in `start` is as valid
|
|
61
|
-
* as `<kai-conversations>`, and the workspace app slots `<kai-conversations>`
|
|
62
|
-
* and `<kai-chat>` into it.
|
|
63
|
-
*
|
|
64
|
-
* ```html
|
|
65
|
-
* <kai-workspace collapse-below="720" drawer-below="640">
|
|
66
|
-
* <kai-conversations slot="start"></kai-conversations>
|
|
67
|
-
* <kai-chat></kai-chat>
|
|
68
|
-
* </kai-workspace>
|
|
69
|
-
* ```
|
|
70
|
-
*
|
|
71
|
-
* Aside geometry is CSS custom properties, not props (the `kai-dock` rule):
|
|
72
|
-
* `--kai-workspace-start-width` (280px) · `--kai-workspace-start-min-width`
|
|
73
|
-
* (200px) · `--kai-workspace-start-max-width` (480px) · `--kai-workspace-end-width`
|
|
74
|
-
* (320px) · `--kai-workspace-end-min-width` (200px) · `--kai-workspace-end-max-width`
|
|
75
|
-
* (480px). Read once at upgrade. Parts: `header` · `start` · `main` · `end` ·
|
|
76
|
-
* `footer` (the asides also match `::part(aside)`).
|
|
77
|
-
*
|
|
78
|
-
* **BREAKING (0.24):** this element was a chat
|
|
79
|
-
* preset; it is now a layout shell, and everything chat-shaped is gone from its
|
|
80
|
-
* surface. Where each removed prop went:
|
|
81
|
-
*
|
|
82
|
-
* - `conversations` / `activeId` / `groups` / `noConversations`: set them on your
|
|
83
|
-
* own `<kai-conversations slot="start">`.
|
|
84
|
-
* - `messages` / `loading` / `proseSize` / `codeTheme` / `codeHighlight` /
|
|
85
|
-
* `chatTitle` / `scrollButton` / `cardTypes` / `cardSchemas`: set them on your
|
|
86
|
-
* own `<kai-chat>` in the main region.
|
|
87
|
-
* - `value` / `placeholder` / `suggestions` / `suggestionMode` / `voice` /
|
|
88
|
-
* `triggers` / `kindIcons` and the renamed `webSearch` (was `search`): the
|
|
89
|
-
* composer surface on `<kai-chat>` or `<kai-prompt-input>`.
|
|
90
|
-
* - `models` / `currentModel` / `context`: header chrome you slot (a model
|
|
91
|
-
* picker is a part in a slot, not three orchestrator props).
|
|
92
|
-
* - `sidebarWidth` / `sidebarMinWidth` / `sidebarMaxWidth`: the
|
|
93
|
-
* `--kai-workspace-start-*` custom properties above.
|
|
94
|
-
* - `sidebarCollapsed` / `defaultSidebarCollapsed`: `startCollapsed` /
|
|
95
|
-
* `defaultStartCollapsed` (per-aside; the end aside has its own pair).
|
|
96
|
-
* - `collapseBelow`: kept, now collapsing both asides.
|
|
97
|
-
* - `compact`: kept as a reflected density hint; the rail's row density is
|
|
98
|
-
* `<kai-conversations>`' own `compact`.
|
|
99
|
-
* - Chat events (`kai-submit`, `kai-conversation-select`, `kai-message-action`,
|
|
100
|
-
* `kai-model-change`, `kai-search`, `kai-voice`, `kai-value-change`,
|
|
101
|
-
* `kai-suggestion-click`): listen on the part that fires them.
|
|
102
|
-
* `kai-sidebar-toggle` is now `kai-aside-toggle` with a `side`.
|
|
103
|
-
* - Methods: `toggleSidebar()` / `collapseSidebar()` / `expandSidebar()` are now
|
|
104
|
-
* `toggleAside(side)` / `collapseAside(side)` / `expandAside(side)`; the
|
|
105
|
-
* thread methods (`focus`/`clear`/`send`/`scrollToBottom`) live on your
|
|
106
|
-
* `<kai-chat>`.
|
|
107
|
-
*
|
|
108
|
-
* The migration path for a full app is the `workspace` block scaffold (the kai
|
|
109
|
-
* MCP `scaffold` tool), which emits this composition wired.
|
|
110
|
-
*/
|
|
111
|
-
defineWebComponent<Props, Events>('kai-workspace', {
|
|
112
|
-
startCollapsed: undefined,
|
|
113
|
-
defaultStartCollapsed: undefined,
|
|
114
|
-
endCollapsed: undefined,
|
|
115
|
-
defaultEndCollapsed: undefined,
|
|
116
|
-
collapseBelow: undefined,
|
|
117
|
-
drawerBelow: undefined,
|
|
118
|
-
compact: undefined,
|
|
119
|
-
}, (props, { dispatch, flag, expose, element, reflectFlag }) => {
|
|
120
|
-
// Which slots the consumer has filled. A bare <slot> is always a truthy JSX
|
|
121
|
-
// node, so each optional region renders ONLY when readSlots reports projected
|
|
122
|
-
// light-DOM content (re-read on childList mutation). Main always renders.
|
|
123
|
-
const [slots, setSlots] = createSignal<Record<string, boolean>>({});
|
|
124
|
-
onMount(() => {
|
|
125
|
-
const read = () => setSlots(readSlots(element, WORKSPACE_SLOTS));
|
|
126
|
-
read();
|
|
127
|
-
const observer = new MutationObserver(read);
|
|
128
|
-
observer.observe(element, { childList: true });
|
|
129
|
-
onCleanup(() => observer.disconnect());
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
// Reflect the read-back flags (the G-05 rule: a bare attribute parses to
|
|
133
|
-
// `undefined`, so without this the property would contradict the attribute).
|
|
134
|
-
reflectFlag('compact');
|
|
135
|
-
reflectFlag('defaultStartCollapsed');
|
|
136
|
-
reflectFlag('defaultEndCollapsed');
|
|
137
|
-
|
|
138
|
-
// Aside geometry from the element's CSS custom properties, read once at
|
|
139
|
-
// upgrade (inline style first so jsdom, which does not resolve custom
|
|
140
|
-
// properties through getComputedStyle, still honors a direct set).
|
|
141
|
-
const readVar = (name: string, fallback: number): number => {
|
|
142
|
-
const inline = element.style.getPropertyValue(name).trim();
|
|
143
|
-
const computed = inline || getComputedStyle(element).getPropertyValue(name).trim();
|
|
144
|
-
const n = parseFloat(computed);
|
|
145
|
-
return Number.isFinite(n) ? n : fallback;
|
|
146
|
-
};
|
|
147
|
-
const geometry = untrack(() => ({
|
|
148
|
-
startWidth: readVar('--kai-workspace-start-width', 280),
|
|
149
|
-
startMinWidth: readVar('--kai-workspace-start-min-width', 200),
|
|
150
|
-
startMaxWidth: readVar('--kai-workspace-start-max-width', 480),
|
|
151
|
-
endWidth: readVar('--kai-workspace-end-width', 320),
|
|
152
|
-
endMinWidth: readVar('--kai-workspace-end-min-width', 200),
|
|
153
|
-
endMaxWidth: readVar('--kai-workspace-end-max-width', 480),
|
|
154
|
-
}));
|
|
155
|
-
|
|
156
|
-
let controller: WorkspaceShellController | undefined;
|
|
157
|
-
expose({
|
|
158
|
-
/** Collapse/expand one aside (fires `kai-aside-toggle`). */
|
|
159
|
-
toggleAside: (side: WorkspaceAsideSide) => controller?.toggleAside(side),
|
|
160
|
-
/** Force one aside collapsed (fires `kai-aside-toggle`). */
|
|
161
|
-
collapseAside: (side: WorkspaceAsideSide) => controller?.collapseAside(side),
|
|
162
|
-
/** Force one aside expanded (fires `kai-aside-toggle`). */
|
|
163
|
-
expandAside: (side: WorkspaceAsideSide) => controller?.expandAside(side),
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
return (
|
|
167
|
-
<WorkspaceShell
|
|
168
|
-
header={slots()['header'] ? <slot name="header" /> : undefined}
|
|
169
|
-
start={slots()['start'] ? <slot name="start" /> : undefined}
|
|
170
|
-
end={slots()['end'] ? <slot name="end" /> : undefined}
|
|
171
|
-
footer={slots()['footer'] ? <slot name="footer" /> : undefined}
|
|
172
|
-
startCollapsed={props.startCollapsed as boolean | undefined}
|
|
173
|
-
defaultStartCollapsed={flag('defaultStartCollapsed')}
|
|
174
|
-
endCollapsed={props.endCollapsed as boolean | undefined}
|
|
175
|
-
defaultEndCollapsed={flag('defaultEndCollapsed')}
|
|
176
|
-
collapseBelow={props.collapseBelow as number | undefined}
|
|
177
|
-
drawerBelow={props.drawerBelow as number | undefined}
|
|
178
|
-
compact={flag('compact')}
|
|
179
|
-
{...geometry}
|
|
180
|
-
onAsideToggle={(detail) => dispatch('kai-aside-toggle', detail)}
|
|
181
|
-
onAsideResize={(detail) => dispatch('kai-aside-resize', detail)}
|
|
182
|
-
controllerRef={(c) => (controller = c)}
|
|
183
|
-
>
|
|
184
|
-
<slot name="main" />
|
|
185
|
-
<slot />
|
|
186
|
-
</WorkspaceShell>
|
|
187
|
-
);
|
|
188
|
-
});
|
package/src/elements/chat.tsx
DELETED
|
@@ -1,304 +0,0 @@
|
|
|
1
|
-
import { createSignal, onCleanup, onMount } from 'solid-js';
|
|
2
|
-
import { defineWebComponent } from './define';
|
|
3
|
-
import { CHAT_SLOTS, readSlots } from './slots';
|
|
4
|
-
import { ChatThread, type ChatThreadProps, type ChatThreadContextUsage, type ChatThreadController } from '../components/chat-thread';
|
|
5
|
-
import { cardComponentsFromTags } from './message';
|
|
6
|
-
import { createMessagesGuard } from './validate-messages';
|
|
7
|
-
import type { AttachmentData } from '../components/attachments';
|
|
8
|
-
import type { RejectedAttachment } from './default-input';
|
|
9
|
-
import type { ChatMessage } from './chat-types';
|
|
10
|
-
import type { TriggerDef } from '../components/composer';
|
|
11
|
-
import type { ComposerDoc } from '../primitives/composer-model';
|
|
12
|
-
import type { ProseSize } from '../primitives/chat-config';
|
|
13
|
-
import type { ModelOption, HomeConfig, HomeLinkEntry } from '../types';
|
|
14
|
-
import type { ConversationStore } from '../primitives/conversation-store';
|
|
15
|
-
|
|
16
|
-
type Props = Omit<ChatThreadProps,
|
|
17
|
-
'class' | 'onValueChange' | 'onSubmit' | 'onAttachmentsChange' | 'onSuggestionClick' | 'onModelChange'
|
|
18
|
-
| 'onMessageAction' | 'onWebSearch' | 'onVoice' | 'controllerRef' | 'cardTypes' | 'cardSchemas' | 'cardHostElement' | 'messages'
|
|
19
|
-
| 'accept' | 'onAttachmentsRejected'
|
|
20
|
-
// `conversations`/`store` are re-declared below (own doc comments, matching
|
|
21
|
-
// this element's own attribute/property conventions) rather than left to
|
|
22
|
-
// flow through `Omit`'s pass-through — same reason `messages` is excluded
|
|
23
|
-
// above. Left unexcluded, the intersection carries TWO declarations of the
|
|
24
|
-
// same property (the inherited `ChatThreadProps` one plus the re-declared
|
|
25
|
-
// one below) and `gen-element-api.mjs` concatenates both JSDoc comments into
|
|
26
|
-
// one duplicated, em-dash-laden description.
|
|
27
|
-
| 'conversations' | 'store'
|
|
28
|
-
// `home` is re-declared below for the same reason as `conversations`/`store`
|
|
29
|
-
// above (own element-facing doc comment rather than the ChatThread-level one
|
|
30
|
-
// flowing through `Omit`'s pass-through). `onHomeLink` is wired internally
|
|
31
|
-
// (JSX prop on `<ChatThread>` below) as a dispatched `kai-home-link` event,
|
|
32
|
-
// matching every other ChatThread callback on this element — same reasoning
|
|
33
|
-
// as `onConversationLoad` just below.
|
|
34
|
-
| 'home' | 'onHomeLink'
|
|
35
|
-
// `onConversationLoad` is wired internally (below, JSX prop on
|
|
36
|
-
// `<ChatThread>`) as a dispatched `kai-conversation-load` event — matching
|
|
37
|
-
// every other ChatThread callback on this element — rather than left as a
|
|
38
|
-
// settable JS property: a `JSX.Element`-shaped callback prop has no HTML-
|
|
39
|
-
// consumer analogue the way `store`/`messages` do, and the kai- contract's
|
|
40
|
-
// idiom for "this thread wants to tell you something" is already an event.
|
|
41
|
-
// Excluded from `Props` for the same reason `onValueChange`/`onSubmit`/etc
|
|
42
|
-
// are excluded above: it is not a property a consumer of `<kai-chat>` sets.
|
|
43
|
-
| 'onConversationLoad'
|
|
44
|
-
// `hostOpen`/`onUnreadChange` (unread indicators, 2026-08-26) are the SAME
|
|
45
|
-
// "types without forwarding" trap as `onConversationLoad` above, for the
|
|
46
|
-
// same reason: this facade does not read either off the host element and
|
|
47
|
-
// forward it onto `<ChatThread>` below. Both exist for a caller composing
|
|
48
|
-
// `ChatThread` directly as a Solid component with its OWN show/hide chrome
|
|
49
|
-
// to report through `hostOpen` and its own sibling control (a `Dock`'s
|
|
50
|
-
// `unread` badge) to mirror `onUnreadChange` onto — the construct engine's
|
|
51
|
-
// emitted App is the motivating case (codegen.ts's `emitChatThreadUnreadProps`),
|
|
52
|
-
// exactly like `headerEndContent`/`emptyContent` below. `<kai-chat>` has no
|
|
53
|
-
// such sibling chrome of its own to report to or read from, so there is
|
|
54
|
-
// nothing here for either prop to DO — left unexcluded, `gen-element-api.mjs`
|
|
55
|
-
// would still type them into the public API and docs as settable properties
|
|
56
|
-
// that silently do nothing when set.
|
|
57
|
-
| 'hostOpen' | 'onUnreadChange'
|
|
58
|
-
// `headerEndContent`/`emptyContent` are JSX.Element escape hatches for a caller
|
|
59
|
-
// composing `ChatThread` directly as a Solid component (see their doc comments in
|
|
60
|
-
// chat-thread.tsx — the construct-engine's emitted App is the motivating case).
|
|
61
|
-
// `<kai-chat>` is the OPPOSITE shape: a custom element crossing the shadow-DOM
|
|
62
|
-
// boundary, where a `JSX.Element` value cannot exist for a consumer to construct
|
|
63
|
-
// (React/Vue/plain HTML have no such type) and the facade already has its own
|
|
64
|
-
// working mechanism for both regions — `slot="header-end"` and `slot="empty"`.
|
|
65
|
-
// Omitted here rather than left to flow through `Omit`'s default pass-through:
|
|
66
|
-
// without this, `gen-element-api.mjs` picked them up and put a JSX.Element type
|
|
67
|
-
// (which it stringifies as Solid's internal array-like union — meaningless to a
|
|
68
|
-
// web-component consumer) into `<kai-chat>`'s public prop surface and docs.
|
|
69
|
-
| 'headerEndContent' | 'emptyContent'> & Record<string, unknown> & {
|
|
70
|
-
/** Which attachment media types the user may stage, in HTML `accept` syntax:
|
|
71
|
-
* `<kai-chat accept="image/*,application/pdf">`. A plain string, so unlike
|
|
72
|
-
* `messages` it DOES work as an attribute. Omitted means no filter.
|
|
73
|
-
*
|
|
74
|
-
* MEDIA TYPES ONLY -- exact (`image/png`) or subtype wildcard (`text/*`).
|
|
75
|
-
* HTML allows a file extension here and this does not: `accept=".py"` THROWS
|
|
76
|
-
* with the entry named, rather than silently resolving to a picker that
|
|
77
|
-
* accepts nothing.
|
|
78
|
-
*
|
|
79
|
-
* It can only NARROW what the kit can already encode: `accept="image/*"`
|
|
80
|
-
* resolves to the four image formats both APIs take, not to every image type
|
|
81
|
-
* the OS offers. Pass the SAME string to `toOpenAIMessages(msgs, { accept })`
|
|
82
|
-
* and the picker and the wire cannot disagree -- both resolve it through
|
|
83
|
-
* `resolveMediaPolicy` against one declaration. That declaration is readable
|
|
84
|
-
* as `encodableMediaTypes()` from `@kitn.ai/ui/wire`, if you would rather
|
|
85
|
-
* build your own picker than use this prop. */
|
|
86
|
-
accept?: string;
|
|
87
|
-
/** The full message thread to render, newest last. Each entry carries its
|
|
88
|
-
* role, ordered `parts`, and optional actions/avatar/feedback. Set as a JS
|
|
89
|
-
* property (`el.messages = [...]`); a NEW array reference per streaming
|
|
90
|
-
* chunk re-renders (mutating in place does not). Omit for an empty thread.
|
|
91
|
-
*
|
|
92
|
-
* Re-declared here (rather than inherited from `ChatThreadProps`) because
|
|
93
|
-
* the ELEMENT registers a `[]` default and renders the empty state without
|
|
94
|
-
* it, while the SolidJS `<ChatThread>` component still requires it. The
|
|
95
|
-
* facade hands it a validated array either way. Matches `<kai-thread>`. */
|
|
96
|
-
messages?: ChatMessage[];
|
|
97
|
-
/** Optional card type -> custom-element tag overrides/additions for `card`
|
|
98
|
-
* parts (merged over the built-ins). Property: `el.cardTypes`. Typed as a
|
|
99
|
-
* plain string map (not the `CardTagMap` alias) so the generated React
|
|
100
|
-
* wrapper inlines it instead of emitting an unresolved named type. */
|
|
101
|
-
cardTypes?: Record<string, string>;
|
|
102
|
-
/** JSON Schemas for the card types this app renders, keyed by envelope type. The
|
|
103
|
-
* companion of `cardTypes`, which says what DRAWS a card while this says what a
|
|
104
|
-
* VALID one looks like. An OBJECT, so it is a JS property only: `el.cardSchemas
|
|
105
|
-
* = { 'pricing-table': pricingSchema }`, never an attribute.
|
|
106
|
-
* `createCardRegistry(...).validationSchemas` is exactly this shape.
|
|
107
|
-
*
|
|
108
|
-
* Without it the kit validates its own seven built-ins and leaves your own card
|
|
109
|
-
* type, the one your app actually cares about, as the only unchecked thing on
|
|
110
|
-
* screen. A schema here WINS over a built-in of the same name.
|
|
111
|
-
*
|
|
112
|
-
* Typed `Record<string, object>` rather than `Record<string, JsonSchema>`
|
|
113
|
-
* deliberately: an imported `.json` schema widens `"type"` to `string`, and an
|
|
114
|
-
* authored one carries `$schema`/`title`/`description`/`additionalProperties`,
|
|
115
|
-
* so the tighter type would reject both of the normal ways to supply one. */
|
|
116
|
-
cardSchemas?: Record<string, object>;
|
|
117
|
-
/** Turns on the prior-conversations list (a list-toggle button in the
|
|
118
|
-
* header, plus a second list view sharing the panel, C-1). Attribute-
|
|
119
|
-
* settable like every other boolean flag on this element:
|
|
120
|
-
* `<kai-chat conversations>`. Requires `store`. A row select, "new
|
|
121
|
-
* conversation," or the visitor's mount-time auto-restore all deliver
|
|
122
|
-
* their messages the same way: listen for `kai-conversation-load` and
|
|
123
|
-
* set `el.messages` from `event.detail.messages` (a fresh array): this
|
|
124
|
-
* element does not update `messages` for you. Set with no `store`, the
|
|
125
|
-
* underlying `ChatThread` decides loudly (one console.error) and stays
|
|
126
|
-
* visually off; this facade always supplies its own internal load
|
|
127
|
-
* handler (the `kai-conversation-load` dispatch below), so the second
|
|
128
|
-
* ChatThread guard, missing `onConversationLoad`, never trips here,
|
|
129
|
-
* even for a consumer who never listens for the event. Default false. */
|
|
130
|
-
conversations?: boolean;
|
|
131
|
-
/** The adapter this thread persists conversations through: an object of
|
|
132
|
-
* three functions (`list`/`load`/`save`; `ConversationStore`, exported
|
|
133
|
-
* from `@kitn.ai/ui`'s `primitives/conversation-store`). A JS PROPERTY
|
|
134
|
-
* ONLY: `el.store = myAdapter`. It can never be an attribute, since a
|
|
135
|
-
* function-bearing object has no HTML string form, the same reasoning
|
|
136
|
-
* that keeps `messages`/`cardSchemas` property-only (the kai- contract:
|
|
137
|
-
* array/object props are JS properties, never attributes). Two built-ins
|
|
138
|
-
* ship: `localStorageStore(name, userId?)` and `fetchStore(url, userId?)`. */
|
|
139
|
-
store?: ConversationStore;
|
|
140
|
-
/** Turns on the widget home screen (Intercom-pattern): the panel boots into
|
|
141
|
-
* a `home` view, with a greeting, most-recent-conversation card, a "new
|
|
142
|
-
* conversation" CTA, and host-defined links, plus a Home/Messages tab bar
|
|
143
|
-
* for switching back to the thread. An OBJECT, so it is a JS property only:
|
|
144
|
-
* `el.home = { greeting: { title: 'Hey' }, links: [...] }`, never an
|
|
145
|
-
* attribute (the kai- contract: array/object props are JS properties).
|
|
146
|
-
* A `links` entry with no `href` fires `kai-home-link` with that entry when
|
|
147
|
-
* tapped, rather than navigating; one WITH `href` opens it directly
|
|
148
|
-
* (only when the URL passes the kit's own scheme allowlist). Omit for the
|
|
149
|
-
* no-home widget (chat view only, unchanged). */
|
|
150
|
-
home?: HomeConfig;
|
|
151
|
-
};
|
|
152
|
-
|
|
153
|
-
interface Events {
|
|
154
|
-
/** User submitted a message. */
|
|
155
|
-
'kai-submit': { value: string; attachments: AttachmentData[] };
|
|
156
|
-
/** Fired on every input change. */
|
|
157
|
-
'kai-value-change': { value: string };
|
|
158
|
-
/** The staged attachments changed (file added or removed). Carries the full
|
|
159
|
-
* current list so a consumer can react in real time. */
|
|
160
|
-
'kai-attachments-change': { attachments: AttachmentData[] };
|
|
161
|
-
/** One or more picked files were refused because `accept` excluded them. The
|
|
162
|
-
* element renders NO message of its own: it reports the facts (name, media
|
|
163
|
-
* type, whether the kit could have sent it) and what the user should see is
|
|
164
|
-
* the application's call. Only ever fires when `accept` is set. */
|
|
165
|
-
'kai-attachments-rejected': { rejected: RejectedAttachment[] };
|
|
166
|
-
/** A suggestion chip was clicked (only in `suggestion-mode="fill"`). */
|
|
167
|
-
'kai-suggestion-click': { value: string };
|
|
168
|
-
/** An action button on a message was clicked. `action` is the built-in name or
|
|
169
|
-
* custom id. `state` is present only for the toggleable feedback votes:
|
|
170
|
-
* `'on'` when a like/dislike is set, `'off'` when re-tapped to clear. */
|
|
171
|
-
'kai-message-action': { messageId: string; action: string; state?: 'on' | 'off' };
|
|
172
|
-
/** The header model switcher changed. */
|
|
173
|
-
'kai-model-change': { modelId: string };
|
|
174
|
-
/** The web-search (Globe) toolbar button was clicked. */
|
|
175
|
-
'kai-web-search': Record<string, never>;
|
|
176
|
-
/** The Mic / voice button was clicked. */
|
|
177
|
-
'kai-voice': Record<string, never>;
|
|
178
|
-
/** A conversation's history loaded: a row tap in the list, "new
|
|
179
|
-
* conversation," or the visitor's own mount-time auto-restore of their
|
|
180
|
-
* most recent thread (only fires when `conversations` is on and a `store`
|
|
181
|
-
* is set). `detail.id` is that conversation's id, `undefined` for the
|
|
182
|
-
* "new conversation" case (no id exists until the first message mints
|
|
183
|
-
* one, C-6). Set `el.messages = event.detail.messages` (already a fresh
|
|
184
|
-
* array) to actually render it, since this element does not do that for
|
|
185
|
-
* you; `messages` stays your own state like everywhere else on this
|
|
186
|
-
* element. */
|
|
187
|
-
'kai-conversation-load': { id: string | undefined; messages: ChatMessage[] };
|
|
188
|
-
/** A `home.links` entry with no `href` was activated (tapped/clicked/Enter).
|
|
189
|
-
* Meaningful only when `home` is set. */
|
|
190
|
-
'kai-home-link': { entry: HomeLinkEntry };
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
defineWebComponent<Props, Events>('kai-chat', {
|
|
194
|
-
messages: [], value: undefined, placeholder: 'Send a message...', loading: false,
|
|
195
|
-
suggestions: undefined, suggestionMode: 'submit', persistSuggestions: false, proseSize: 'sm',
|
|
196
|
-
codeTheme: 'github-dark-dimmed', codeHighlight: true, chatTitle: undefined,
|
|
197
|
-
models: undefined, currentModel: undefined, context: undefined, scrollButton: true,
|
|
198
|
-
attach: true, webSearch: false, voice: false, triggers: undefined, kindIcons: undefined,
|
|
199
|
-
actionsReveal: 'always', cardTypes: undefined, cardSchemas: undefined, accept: undefined,
|
|
200
|
-
reasoning: undefined, reasoningOpen: undefined, conversations: false, store: undefined,
|
|
201
|
-
home: undefined,
|
|
202
|
-
}, (props, { dispatch, flag, reflectFlag, element, expose }) => {
|
|
203
|
-
// `messages` is an untyped boundary: a consumer can hand it anything at
|
|
204
|
-
// runtime (a pre-0.20.0 `{ id, role, content }` array, in particular). Skip
|
|
205
|
-
// the invalid entries rather than let `groupMessageParts` throw deep inside a
|
|
206
|
-
// render pass, which would blank the whole chat instead of one message.
|
|
207
|
-
const validMessages = createMessagesGuard('kai-chat');
|
|
208
|
-
|
|
209
|
-
// Slot detection is driven by the CHAT_SLOTS registry (single source of truth)
|
|
210
|
-
// so slot names never drift between the view, the facade, and the docs.
|
|
211
|
-
const [slots, setSlots] = createSignal<Record<string, boolean>>({});
|
|
212
|
-
const slot = (name: string) => slots()[name] === true;
|
|
213
|
-
onMount(() => {
|
|
214
|
-
const read = () => setSlots(readSlots(element, CHAT_SLOTS));
|
|
215
|
-
read();
|
|
216
|
-
const observer = new MutationObserver(read);
|
|
217
|
-
observer.observe(element, { childList: true });
|
|
218
|
-
onCleanup(() => observer.disconnect());
|
|
219
|
-
});
|
|
220
|
-
|
|
221
|
-
// Reflect streaming state to a host attribute so slotted composer/notice CSS
|
|
222
|
-
// can react without reading internals (e.g. :host([loading]) ::slotted(...)).
|
|
223
|
-
// reflectFlag, not a hand-rolled toggleAttribute effect: the reflection is what
|
|
224
|
-
// makes the property read back `undefined`, so the two belong in one call. See
|
|
225
|
-
// WebComponentContext.reflectFlag.
|
|
226
|
-
reflectFlag('loading');
|
|
227
|
-
|
|
228
|
-
// Imperative method API — forward the chat-thread controller onto the host
|
|
229
|
-
// (focus the composer, clear it, send programmatically, scroll the thread).
|
|
230
|
-
let controller: ChatThreadController | undefined;
|
|
231
|
-
expose({
|
|
232
|
-
/** Focus the composer, meaning the contenteditable (or textarea) inside the
|
|
233
|
-
* shadow root. A native `focus()` on the host lands on the host itself and
|
|
234
|
-
* never reaches it, so this is the only way to focus the input
|
|
235
|
-
* programmatically. */
|
|
236
|
-
focus: (options?: FocusOptions) => controller?.focus(options),
|
|
237
|
-
/** Blur whatever currently holds focus inside the shadow root. The companion
|
|
238
|
-
* to `focus()`, for the same reason: a native `blur()` on the host misses
|
|
239
|
-
* the real focus target. */
|
|
240
|
-
blur: () => (element.shadowRoot?.activeElement as HTMLElement | null)?.blur(),
|
|
241
|
-
/** Empty the COMPOSER: drops the draft text and every staged attachment, then
|
|
242
|
-
* fires `kai-value-change` with `''`. It does NOT touch the thread. `messages`
|
|
243
|
-
* is the consumer's own state, so clearing history stays the consumer's call. */
|
|
244
|
-
clear: () => controller?.clear(),
|
|
245
|
-
/** Submit whatever the composer currently holds, on the same path as Enter or
|
|
246
|
-
* the send button: fires `kai-submit` with that value plus the staged
|
|
247
|
-
* attachments, then drops the attachments. It takes no argument, so to send
|
|
248
|
-
* text the user never typed, set `el.value` first. There is no empty-check,
|
|
249
|
-
* so an empty composer still fires. The draft is cleared afterwards only when
|
|
250
|
-
* `value` is uncontrolled; a controlled host owns its value and clears it
|
|
251
|
-
* itself. Named `send`, not `submit`, to match the shared vocabulary. */
|
|
252
|
-
send: () => controller?.send(),
|
|
253
|
-
/** Scroll the message viewport to the newest message. Defaults to `'smooth'`;
|
|
254
|
-
* pass `'instant'` to jump without animating. */
|
|
255
|
-
scrollToBottom: (behavior?: ScrollBehavior) => controller?.scrollToBottom(behavior),
|
|
256
|
-
});
|
|
257
|
-
|
|
258
|
-
return (
|
|
259
|
-
<ChatThread
|
|
260
|
-
messages={validMessages(props.messages)} value={props.value as string | ComposerDoc | undefined} placeholder={props.placeholder as string}
|
|
261
|
-
loading={flag('loading')} suggestions={props.suggestions as string[] | undefined}
|
|
262
|
-
suggestionMode={props.suggestionMode as 'submit' | 'fill'} persistSuggestions={flag('persistSuggestions')}
|
|
263
|
-
proseSize={props.proseSize as ProseSize}
|
|
264
|
-
codeTheme={props.codeTheme as string} codeHighlight={flag('codeHighlight')}
|
|
265
|
-
chatTitle={props.chatTitle as string | undefined} models={props.models as ModelOption[] | undefined}
|
|
266
|
-
currentModel={props.currentModel as string | undefined} context={props.context as ChatThreadContextUsage | undefined}
|
|
267
|
-
scrollButton={props.scrollButton !== false} attach={flag('attach')} webSearch={flag('webSearch')} voice={flag('voice')}
|
|
268
|
-
reasoning={props.reasoning as 'full' | 'compact' | 'off' | undefined}
|
|
269
|
-
reasoningOpen={flag('reasoningOpen')}
|
|
270
|
-
triggers={props.triggers as TriggerDef[] | undefined}
|
|
271
|
-
kindIcons={props.kindIcons as Record<string, string> | undefined}
|
|
272
|
-
actionsReveal={props.actionsReveal as 'always' | 'hover'}
|
|
273
|
-
cardTypes={cardComponentsFromTags(props.cardTypes as Record<string, string> | undefined, (props as { theme?: string }).theme)}
|
|
274
|
-
cardSchemas={props.cardSchemas as Record<string, object> | undefined}
|
|
275
|
-
conversations={flag('conversations')}
|
|
276
|
-
store={props.store as ConversationStore | undefined}
|
|
277
|
-
onConversationLoad={(messages, id) => dispatch('kai-conversation-load', { id, messages })}
|
|
278
|
-
home={props.home as HomeConfig | undefined}
|
|
279
|
-
onHomeLink={(entry) => dispatch('kai-home-link', { entry })}
|
|
280
|
-
/* F-26: card parts emit off THIS element as the bubbling `kai-card` event,
|
|
281
|
-
so `listenForCardEvents(el)` / addEventListener('kai-card') work. */
|
|
282
|
-
cardHostElement={element}
|
|
283
|
-
onValueChange={(value) => dispatch('kai-value-change', { value })}
|
|
284
|
-
onSubmit={(detail) => dispatch('kai-submit', detail)}
|
|
285
|
-
accept={props.accept as string | undefined}
|
|
286
|
-
onAttachmentsChange={(attachments) => dispatch('kai-attachments-change', { attachments })}
|
|
287
|
-
onAttachmentsRejected={(rejected) => dispatch('kai-attachments-rejected', { rejected })}
|
|
288
|
-
onSuggestionClick={(value) => dispatch('kai-suggestion-click', { value })}
|
|
289
|
-
onModelChange={(modelId) => dispatch('kai-model-change', { modelId })}
|
|
290
|
-
onMessageAction={(detail) => dispatch('kai-message-action', detail)}
|
|
291
|
-
onWebSearch={() => dispatch('kai-web-search', {})}
|
|
292
|
-
onVoice={() => dispatch('kai-voice', {})}
|
|
293
|
-
controllerRef={(c) => (controller = c)}
|
|
294
|
-
headerStart={slot('header-start')}
|
|
295
|
-
headerEnd={slot('header-end')}
|
|
296
|
-
headerFull={slot('header')}
|
|
297
|
-
sidebar={slot('sidebar')}
|
|
298
|
-
empty={slot('empty')}
|
|
299
|
-
composer={slot('composer')}
|
|
300
|
-
composerActions={slot('composer-actions')}
|
|
301
|
-
footer={slot('footer')}
|
|
302
|
-
/>
|
|
303
|
-
);
|
|
304
|
-
});
|