@kitn.ai/ui 0.27.0 → 0.29.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 +10 -2
- package/dist/{Icon-BnFKqqtY.js → Icon-DObhsRtm.js} +1 -1
- package/dist/{action-icons-CBskfBMz.js → action-icons-CcgNN2oT.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-CjRU3JgV.js +1 -0
- package/dist/arrow-left-Bnpb1UEW.js +1 -0
- package/dist/{artifact-CvXEm1lS.js → artifact-Bwt7OgcR.js} +1 -1
- package/dist/{attachments-C43ZegEq.js → attachments-Qr4kg-2b.js} +1 -1
- package/dist/{audio-visualizer-B-79y1Tj.js → audio-visualizer-DToYdfSc.js} +1 -1
- package/dist/{badge-BpUbq8c0.js → badge-CdEu_jn2.js} +1 -1
- package/dist/{bell-sn17Ip9v.js → bell-DQAAOpDz.js} +1 -1
- package/dist/{button-BH6rN0U-.js → button-DkuOnGLy.js} +1 -1
- package/dist/{card-renderer-Cb1gQmth.js → card-renderer-Jx70m6_l.js} +1 -1
- package/dist/{card-routing-DifQgS7n.js → card-routing-0YidER_3.js} +1 -1
- package/dist/check-njkVdZu2.js +1 -0
- package/dist/{checkbox-Dc9Yov_B.js → checkbox-D7iRB3nL.js} +1 -1
- package/dist/{checkbox-group-B1kDLLYk.js → checkbox-group-B2_rpoPM.js} +1 -1
- package/dist/chevron-down-B72s6PXR.js +1 -0
- package/dist/chevron-right-BatuHzUm.js +1 -0
- package/dist/{choice-card-BT3c1S8g.js → choice-card-m0BYqqOK.js} +1 -1
- package/dist/circle-check-B62pODB3.js +1 -0
- package/dist/{circle-x-wobWkoSx.js → circle-x-BPG0iPst.js} +1 -1
- package/dist/circle-zx0ByzY9.js +1 -0
- package/dist/code-block-ClMLKb7C.js +1 -0
- package/dist/{collapsible-CPJbf6FM.js → collapsible-B4DlWicL.js} +1 -1
- package/dist/components/chat-thread.d.ts +89 -1
- package/dist/components/conversation-item.d.ts +16 -0
- package/dist/components/conversation-panel.d.ts +29 -0
- package/dist/components/home-panel.d.ts +34 -0
- package/dist/components/widget-tab-bar.d.ts +16 -0
- package/dist/{composer-CjngLzal.js → composer-sQ0HcvyG.js} +3 -3
- package/dist/{confirm-card-DCx_A4bU.js → confirm-card-rQWDQsnC.js} +1 -1
- package/dist/construct-cli.es.js +185 -17
- package/dist/construct.d.ts +5 -0
- package/dist/construct.js +327 -0
- package/dist/{context-BY8V-Nlp.js → context-0kg4ZX1J.js} +1 -1
- package/dist/controllable-CnGpMF6r.js +1 -0
- package/dist/conversation-item-BxwQLaFJ.js +1 -0
- package/dist/conversation-list-BCfGN1JU.js +1 -0
- package/dist/{copy-B6DO4PqB.js → copy-n9u9rqpi.js} +1 -1
- package/dist/core-C8fzo39E.js +1 -12
- package/dist/{create-tween-CnMHviKB.js → create-tween-C-q-JCM-.js} +1 -1
- package/dist/{create-tween-D1aiGZZh.js → create-tween-CRrJXxBd.js} +1 -1
- package/dist/{create-tween-BPzaefTp.js → create-tween-DZ3RRDHD.js} +1 -1
- package/dist/{create-tween-DUSQUKpr.js → create-tween-uPkArjIG.js} +1 -1
- package/dist/custom-elements.json +51 -2
- package/dist/{default-input-CucQEOqH.js → default-input-CaMrJkgH.js} +1 -1
- package/dist/define-By-uL588.js +1 -0
- package/dist/define.js +2 -2
- package/dist/define.server.js +2 -2
- package/dist/{disclosure-CbLtajUQ.js → disclosure-WUImBbDv.js} +1 -1
- package/dist/{dropdown-BwhViJFd.js → dropdown-wZVeJOMd.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 +3 -3
- 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/elements.d.ts +20 -4
- package/dist/{ellipsis-DFr4Vqr3.js → ellipsis-CbOpJnU3.js} +1 -1
- package/dist/{embed-5s_vU4J0.js → embed-CrfjkbUG.js} +1 -1
- package/dist/engine-javascript-C1x7zo1_.js +1 -141
- package/dist/{external-link-u9d85ORQ.js → external-link-ByXAwBBQ.js} +1 -1
- package/dist/{file-text-CX7_x42o.js → file-text-DMib2qwt.js} +1 -1
- package/dist/{file-tree-D3kBjXI5.js → file-tree-CJqM2aP7.js} +1 -1
- package/dist/{folder-V-YdIL8f.js → folder-_BAb929C.js} +1 -1
- package/dist/{form-BRNUMCN2.js → form-DSZgZQZk.js} +1 -1
- package/dist/{hover-card-DaeiYrTA.js → hover-card-BQbul9eq.js} +1 -1
- package/dist/{icon-BpixdZNq.js → icon-CdcfRhYI.js} +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +2842 -2703
- package/dist/index.server.js +2820 -2681
- package/dist/{info-8mFsIjS3.js → info-DsFjGuI_.js} +1 -1
- package/dist/{input-d1Yuu-hz.js → input-DKbmkMos.js} +1 -1
- package/dist/kai.es.js +1 -1
- package/dist/{kbd-961zMPFB.js → kbd-PvdGhX4s.js} +1 -1
- package/dist/{link-preview-DIIbV2Sd.js → link-preview-DbM1866N.js} +1 -1
- package/dist/{link-DlZZBGaR.js → link-zF8PzWfF.js} +1 -1
- package/dist/{loader-YQszHFaW.js → loader-BM4CEz4G.js} +1 -1
- package/dist/{markdown-CVk1MPsj.js → markdown-LMvmAyBk.js} +7 -7
- package/dist/mcp.es.js +79 -5
- package/dist/{message-CwKVEdZg.js → message-BSsgvHvf.js} +1 -1
- package/dist/{message-DS8lzHc1.js → message-BYZECyek.js} +1 -1
- package/dist/message-circle-DruwObfX.js +1 -0
- package/dist/message-square-BG6q6mlm.js +1 -0
- package/dist/{minimize-2-UEZmP2QT.js → minimize-2-BQRoBV1V.js} +1 -1
- package/dist/{model-switcher-Kk1jEQ5t.js → model-switcher-CMpCOYcB.js} +1 -1
- package/dist/{overlay-C1od6LOz.js → overlay-Cb-MkyDa.js} +1 -1
- package/dist/{panel-right-ryET0yyn.js → panel-right-i8warFxT.js} +1 -1
- package/dist/{paperclip-BDNoZFJP.js → paperclip-ByY3UVO6.js} +1 -1
- package/dist/play-BvKKq3fX.js +1 -0
- package/dist/primitives/conversation-store.d.ts +54 -0
- package/dist/{progress-bar-BvYX0aoy.js → progress-bar-jVAHvMUf.js} +1 -1
- package/dist/{prompt-suggestion-BRFu2lcu.js → prompt-suggestion-CD-qtNgC.js} +1 -1
- package/dist/{radio-DcL23cNJ.js → radio-BsoBMhkF.js} +1 -1
- package/dist/react/index.d.ts +393 -0
- package/dist/react.js +20 -20
- package/dist/{reasoning-Cackq4Rh.js → reasoning-4kBPtlTx.js} +1 -1
- package/dist/register-impl-B1hLkrI8.js +424 -0
- package/dist/{resizable-Cp9HUYih.js → resizable-uPmY9VY-.js} +1 -1
- package/dist/{rotate-ccw-0DLRDHH5.js → rotate-ccw-B2xn93py.js} +1 -1
- package/dist/{rotate-cw-DOB9IGcU.js → rotate-cw-CMVLoCyH.js} +1 -1
- package/dist/{scroll-area-emVmWP4K.js → scroll-area-BqLUo8ZZ.js} +1 -1
- package/dist/{scroll-button-CeP_gv1x.js → scroll-button-DslXiJyL.js} +1 -1
- package/dist/{select-CWmu00tS.js → select-2cLRtPGT.js} +1 -1
- package/dist/{separator-CE6vly6z.js → separator-BWQtNJcM.js} +1 -1
- package/dist/{settings-CE-78SvZ.js → settings-BBR63jLg.js} +1 -1
- package/dist/{settings-group-ZFWNxFQR.js → settings-group-B2ciy-Iw.js} +1 -1
- package/dist/{skeleton-BebdP4mf.js → skeleton-CkHI-HgC.js} +1 -1
- package/dist/{slider-BAKRYUlz.js → slider-DDR9U-i0.js} +1 -1
- package/dist/{solid-BE5ui6sy.js → solid-BzCFdL25.js} +7720 -7058
- package/dist/{solid-DFhsce3O.js → solid-DruVOXnf.js} +5864 -5283
- package/dist/solid.d.ts +6 -2
- package/dist/solid.js +217 -210
- package/dist/solid.server.js +217 -210
- package/dist/{source-B0FlguSx.js → source-GEnFF528.js} +1 -1
- package/dist/{star-CBMZvLuN.js → star-CilHq8GP.js} +1 -1
- package/dist/store-Ciyk6eZG.js +1 -0
- package/dist/{switch-CViARZCy.js → switch-KkeQIbuH.js} +1 -1
- package/dist/{tasks-card-MjCcOhR_.js → tasks-card-BrN4bggJ.js} +1 -1
- package/dist/{text-shimmer-DKlwRF2G.js → text-shimmer-Dcj1MHuq.js} +1 -1
- package/dist/{textarea-3ay2Me2-.js → textarea-Dpvbngbg.js} +1 -1
- package/dist/theme.tokens.css +28 -0
- package/dist/{thumbs-up-DQcu2HMO.js → thumbs-up-CsT9Wzb9.js} +1 -1
- package/dist/{toast-store-C6yKOhbk.js → toast-store-tgK6MuMv.js} +1 -1
- package/dist/{tool-BCYNlfKy.js → tool-DzUjIBT8.js} +1 -1
- package/dist/{tooltip-05zI4hjs.js → tooltip-Bkkg_4t0.js} +1 -1
- package/dist/{trash-2-BR1RxGky.js → trash-2-jBKxjGGQ.js} +1 -1
- package/dist/{triangle-alert-DHohDOCy.js → triangle-alert-DlQ68ppf.js} +1 -1
- package/dist/types.d.ts +48 -3
- package/dist/ui/dock.d.ts +29 -0
- package/dist/{upload-BbGW6A_u.js → upload-TcAHXv9W.js} +1 -1
- package/dist/{url-scheme-policy-DHpoTJwB.js → url-scheme-policy-DR5DgvkM.js} +1 -1
- package/dist/{use-card-resolution-CJW4grFa.js → use-card-resolution-DaZqAdWf.js} +1 -1
- package/dist/{variant-aurora-xiMPty8f.js → variant-aurora-BhLuYxJR.js} +1 -1
- package/dist/{variant-aurora-BUOVgPOB.js → variant-aurora-CNmfHhcx.js} +2 -2
- package/dist/{variant-aurora-CUsUJvFI.js → variant-aurora-D6GsdTPA.js} +2 -2
- package/dist/{variant-aurora-CW2i4bfr.js → variant-aurora-DbW_OWL2.js} +1 -1
- package/dist/{variant-custom-D91HjAKz.js → variant-custom-BRvaNHSi.js} +1 -1
- package/dist/{variant-custom-BQtOnmeO.js → variant-custom-BvYHR62b.js} +1 -1
- package/dist/{variant-custom-CAnzzppW.js → variant-custom-DMTrEO5w.js} +2 -2
- package/dist/{variant-custom-CAm9L-E5.js → variant-custom-DV2x254s.js} +2 -2
- package/dist/{variant-wave-Ca1Ls4_y.js → variant-wave-BNMGrDfj.js} +2 -2
- package/dist/{variant-wave-uY5crU_K.js → variant-wave-BpDd8t3Z.js} +1 -1
- package/dist/{variant-wave-CxX39DKd.js → variant-wave-CyBueXj9.js} +2 -2
- package/dist/{variant-wave-DYyzIIZv.js → variant-wave-sp-qwsdI.js} +1 -1
- package/dist/x-Z5UntkIJ.js +1 -0
- package/frameworks/react/index.tsx +14 -4
- package/llms-full.txt +7 -2
- package/package.json +16 -16
- package/src/elements/element-meta.json +49 -6
- package/theme.css +28 -0
- package/bin/route.test.js +0 -58
- package/dist/arrow-down-Br0qtpsz.js +0 -1
- package/dist/arrow-left-Dj7xgE12.js +0 -1
- package/dist/check-DPeeMUYx.js +0 -1
- package/dist/chevron-down-CHSWk7ZT.js +0 -1
- package/dist/chevron-right-B7l_fMgx.js +0 -1
- package/dist/circle-Bb0yOpqM.js +0 -1
- package/dist/circle-check-BGZpCiz7.js +0 -1
- package/dist/code-block-CUQ5mtv0.js +0 -1
- package/dist/controllable-D43BKmtX.js +0 -1
- package/dist/conversation-list-D4lLU_yS.js +0 -1
- package/dist/define-CGGX-7Vg.js +0 -1
- package/dist/message-circle-Xf8Q-vZp.js +0 -1
- package/dist/message-square-Cxnwgkns.js +0 -1
- package/dist/play-OFIvYXUQ.js +0 -1
- package/dist/register-impl-C7rENvPK.js +0 -424
- package/dist/store-7eoadydQ.js +0 -1
- package/dist/x-C5m1JFgi.js +0 -1
- 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 -131
- package/src/agent-tooling/construct/codegen.ts +0 -1353
- package/src/agent-tooling/construct/construct.v1.schema.json +0 -250
- 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 -23
- package/src/agent-tooling/construct/schema.ts +0 -371
- 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 -518
- 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 -218
- package/src/components/conversation-list.tsx +0 -429
- 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/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/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 -212
- 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 -185
- package/src/elements/element-types.d.ts +0 -4337
- 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/styles.css +0 -328
- 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 -428
- 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/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 -165
- 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 -53
- 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 -584
- 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,103 +0,0 @@
|
|
|
1
|
-
import { createContext, useContext, type Accessor, type JSX } from 'solid-js';
|
|
2
|
-
|
|
3
|
-
export type ProseSize = 'xs' | 'sm' | 'base' | 'lg';
|
|
4
|
-
|
|
5
|
-
export interface ChatConfigValue {
|
|
6
|
-
/** Prose/text size for messages, markdown, and UI elements */
|
|
7
|
-
proseSize: Accessor<ProseSize>;
|
|
8
|
-
/** Shiki theme for code blocks */
|
|
9
|
-
codeTheme: Accessor<string>;
|
|
10
|
-
/** Node the kit's overlays portal into; undefined → document.body */
|
|
11
|
-
portalMount: Accessor<HTMLElement | undefined>;
|
|
12
|
-
/** Whether code blocks are syntax-highlighted; false → plain text, no Shiki loaded */
|
|
13
|
-
codeHighlight: Accessor<boolean>;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
const defaultConfig: ChatConfigValue = {
|
|
17
|
-
proseSize: () => 'sm' as ProseSize,
|
|
18
|
-
codeTheme: () => 'github-dark-dimmed',
|
|
19
|
-
portalMount: () => undefined,
|
|
20
|
-
codeHighlight: () => true,
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
const ChatConfigContext = createContext<ChatConfigValue>(defaultConfig);
|
|
24
|
-
|
|
25
|
-
export interface ChatConfigProps {
|
|
26
|
-
proseSize?: ProseSize;
|
|
27
|
-
codeTheme?: string;
|
|
28
|
-
portalMount?: HTMLElement;
|
|
29
|
-
codeHighlight?: boolean;
|
|
30
|
-
children: JSX.Element;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Provides chat-wide appearance settings to all child components.
|
|
35
|
-
* Set once at the top level — MessageContent, Markdown, CodeBlock,
|
|
36
|
-
* ConversationList, and PromptInput all read from this.
|
|
37
|
-
*/
|
|
38
|
-
export function ChatConfig(props: ChatConfigProps) {
|
|
39
|
-
const value: ChatConfigValue = {
|
|
40
|
-
proseSize: () => props.proseSize ?? 'sm',
|
|
41
|
-
codeTheme: () => props.codeTheme ?? 'github-dark-dimmed',
|
|
42
|
-
portalMount: () => props.portalMount,
|
|
43
|
-
codeHighlight: () => props.codeHighlight ?? true,
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
return (
|
|
47
|
-
<ChatConfigContext.Provider value={value}>
|
|
48
|
-
{props.children}
|
|
49
|
-
</ChatConfigContext.Provider>
|
|
50
|
-
);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/** Read the current chat config. Returns defaults if no provider is present. */
|
|
54
|
-
export function useChatConfig(): ChatConfigValue {
|
|
55
|
-
return useContext(ChatConfigContext)!;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Maps prose size to the Tailwind Typography *size modifier* for consumers who
|
|
60
|
-
* render their own `prose` block.
|
|
61
|
-
*
|
|
62
|
-
* The `prose-*` names are deliberately NOT re-pointed at the --kai-text-* scale.
|
|
63
|
-
* They are not font sizes: each is a plugin-generated bundle of proportional
|
|
64
|
-
* margins, list indents, heading ratios and line-heights for every nested
|
|
65
|
-
* element, keyed to hardcoded rems, and they only do anything alongside `prose`
|
|
66
|
-
* itself. There is no `prose-body` to alias them to, and collapsing them to a
|
|
67
|
-
* bare font-size would throw away the vertical rhythm that is their whole job.
|
|
68
|
-
* The kit's own markdown does not go through them at all — it renders through
|
|
69
|
-
* `.chat-markdown` (theme.css), which is em-relative and therefore already
|
|
70
|
-
* scales off whatever `textClass` sets.
|
|
71
|
-
*
|
|
72
|
-
* The one raw font-size here (`xs`) DOES join the semantic scale, so it stays in
|
|
73
|
-
* step with `textClass('xs')`.
|
|
74
|
-
*/
|
|
75
|
-
export function proseClass(size: ProseSize): string {
|
|
76
|
-
switch (size) {
|
|
77
|
-
case 'xs': return 'prose-sm text-meta';
|
|
78
|
-
case 'sm': return 'prose-sm';
|
|
79
|
-
case 'base': return '';
|
|
80
|
-
case 'lg': return 'prose-lg';
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* Maps prose size to a text class for message content, markdown, and non-prose
|
|
86
|
-
* chrome (sidebar, input).
|
|
87
|
-
*
|
|
88
|
-
* These are the kit's SEMANTIC type-scale utilities, not Tailwind's raw scale:
|
|
89
|
-
* each resolves through a namespaced --kai-text-* token in theme.css, so a
|
|
90
|
-
* consumer setting `--kai-text-body` moves the reading text. The public
|
|
91
|
-
* `proseSize` strings ('xs' | 'sm' | 'base' | 'lg') are unchanged — this is an
|
|
92
|
-
* internal re-point only. Sizes are byte-identical to the Tailwind classes they
|
|
93
|
-
* replace (text-meta ≡ text-xs, text-body ≡ text-sm, text-title ≡ text-base),
|
|
94
|
-
* so nothing moves until a token is actually overridden.
|
|
95
|
-
*/
|
|
96
|
-
export function textClass(size: ProseSize): string {
|
|
97
|
-
switch (size) {
|
|
98
|
-
case 'xs': return 'text-meta';
|
|
99
|
-
case 'sm': return 'text-body';
|
|
100
|
-
case 'base': return 'text-title';
|
|
101
|
-
case 'lg': return 'text-lg';
|
|
102
|
-
}
|
|
103
|
-
}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
export interface EntityRef {
|
|
2
|
-
kind: string;
|
|
3
|
-
id: string;
|
|
4
|
-
label: string;
|
|
5
|
-
icon?: string;
|
|
6
|
-
promptText?: string;
|
|
7
|
-
data?: Record<string, unknown>;
|
|
8
|
-
}
|
|
9
|
-
export type Segment =
|
|
10
|
-
| { type: 'text'; text: string }
|
|
11
|
-
| { type: 'entity'; entity: EntityRef };
|
|
12
|
-
export type ComposerDoc = Segment[];
|
|
13
|
-
|
|
14
|
-
export function normalizeValue(value: string | ComposerDoc | null | undefined): ComposerDoc {
|
|
15
|
-
if (value == null) return [];
|
|
16
|
-
if (typeof value === 'string') return value.length ? [{ type: 'text', text: value }] : [];
|
|
17
|
-
const out: ComposerDoc = [];
|
|
18
|
-
for (const seg of value) {
|
|
19
|
-
if (seg.type === 'text') {
|
|
20
|
-
if (!seg.text) continue;
|
|
21
|
-
const last = out[out.length - 1];
|
|
22
|
-
// Replace (don't mutate) the prior segment so every object in the returned
|
|
23
|
-
// doc is freshly built and never an aliased/held reference.
|
|
24
|
-
if (last && last.type === 'text') out[out.length - 1] = { type: 'text', text: last.text + seg.text };
|
|
25
|
-
else out.push({ type: 'text', text: seg.text });
|
|
26
|
-
} else {
|
|
27
|
-
out.push({ type: 'entity', entity: seg.entity });
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
return out;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export function serializeToText(
|
|
34
|
-
doc: ComposerDoc,
|
|
35
|
-
opts?: { entity?: (e: EntityRef) => string },
|
|
36
|
-
): string {
|
|
37
|
-
let out = '';
|
|
38
|
-
for (const seg of doc) {
|
|
39
|
-
if (seg.type === 'text') out += seg.text;
|
|
40
|
-
else out += opts?.entity ? opts.entity(seg.entity) : (seg.entity.promptText ?? seg.entity.label);
|
|
41
|
-
}
|
|
42
|
-
return out;
|
|
43
|
-
}
|
|
44
|
-
export function entitiesOf(doc: ComposerDoc): EntityRef[] {
|
|
45
|
-
return doc.filter((s): s is Extract<Segment, { type: 'entity' }> => s.type === 'entity').map((s) => s.entity);
|
|
46
|
-
}
|
|
47
|
-
export function docIsEmpty(doc: ComposerDoc): boolean {
|
|
48
|
-
return doc.every((s) => s.type === 'text' && s.text.length === 0);
|
|
49
|
-
}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
export interface ActiveTrigger { char: string; query: string; start: number; }
|
|
2
|
-
|
|
3
|
-
export function detectTrigger(text: string, caret: number, chars: string[]): ActiveTrigger | null {
|
|
4
|
-
// Caret is a position within `text` (0..text.length). Out-of-range = no trigger.
|
|
5
|
-
if (caret < 0 || caret > text.length) return null;
|
|
6
|
-
for (let i = caret - 1; i >= 0; i--) {
|
|
7
|
-
const c = text[i];
|
|
8
|
-
if (/\s/.test(c)) return null; // hit whitespace before any trigger char
|
|
9
|
-
if (chars.includes(c)) {
|
|
10
|
-
const boundaryOk = i === 0 || /\s/.test(text[i - 1]);
|
|
11
|
-
if (!boundaryOk) return null;
|
|
12
|
-
return { char: c, query: text.slice(i + 1, caret), start: i };
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
return null;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Wraps detectTrigger with a list of trigger definitions.
|
|
20
|
-
* Returns { def, query, start } when a trigger is active, else null.
|
|
21
|
-
* Accepts generic defs so it does not import from composer.tsx (no cycle).
|
|
22
|
-
*/
|
|
23
|
-
export function activeTriggerFor<T extends { char: string; kind: string }>(
|
|
24
|
-
text: string,
|
|
25
|
-
caret: number,
|
|
26
|
-
defs: T[],
|
|
27
|
-
): { def: T; query: string; start: number } | null {
|
|
28
|
-
if (!defs.length) return null;
|
|
29
|
-
const chars = defs.map((d) => d.char);
|
|
30
|
-
const hit = detectTrigger(text, caret, chars);
|
|
31
|
-
if (!hit) return null;
|
|
32
|
-
const def = defs.find((d) => d.char === hit.char);
|
|
33
|
-
if (!def) return null;
|
|
34
|
-
return { def, query: hit.query, start: hit.start };
|
|
35
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { createSignal, type Accessor } from 'solid-js';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* The controlled/uncontrolled state pattern, as a reusable signal.
|
|
5
|
-
*
|
|
6
|
-
* `controlled` is an accessor for the controlling prop: when it returns a value,
|
|
7
|
-
* that value wins (controlled mode); when it returns `undefined`, the component
|
|
8
|
-
* manages its own state seeded from `initial` (uncontrolled mode). The returned
|
|
9
|
-
* setter always writes the internal value — harmless (masked) while controlled,
|
|
10
|
-
* authoritative while uncontrolled — so a single call site works in both modes.
|
|
11
|
-
*
|
|
12
|
-
* Mirrors `props.value ?? internal()` used elsewhere in the kit, without effects.
|
|
13
|
-
*/
|
|
14
|
-
export function createControllableSignal(
|
|
15
|
-
controlled: Accessor<boolean | undefined>,
|
|
16
|
-
initial: boolean,
|
|
17
|
-
): [Accessor<boolean>, (value: boolean) => void] {
|
|
18
|
-
const [internal, setInternal] = createSignal(initial);
|
|
19
|
-
const value: Accessor<boolean> = () => controlled() ?? internal();
|
|
20
|
-
return [value, (v: boolean) => setInternal(v)];
|
|
21
|
-
}
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
// src/primitives/create-kai-chat.ts
|
|
2
|
-
import { createSignal } from 'solid-js';
|
|
3
|
-
import type { ChatMessage } from '../elements/chat-types';
|
|
4
|
-
import type { AttachmentData } from '../components/attachments';
|
|
5
|
-
import {
|
|
6
|
-
appendMessage, updateMessage, removeMessage, addSuggestion, removeSuggestion,
|
|
7
|
-
createAssistantStream, onStreamSettled, type AssistantStream, type SetMessages,
|
|
8
|
-
} from '../state';
|
|
9
|
-
|
|
10
|
-
export interface CreateKaiChatOptions {
|
|
11
|
-
/** Seed messages, read once at creation and copied. Later changes are ignored — drive updates through the returned ops. */
|
|
12
|
-
initialMessages?: ChatMessage[];
|
|
13
|
-
/** Seed suggestions, read once at creation and copied. Later changes are ignored. */
|
|
14
|
-
initialSuggestions?: string[];
|
|
15
|
-
onSubmit?: (detail: { value: string; attachments: AttachmentData[] }) => void | Promise<void>;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/** Solid store: consumer-owned chat state + the same ergonomic ops as `useKaiChat`. */
|
|
19
|
-
export interface KaiChatStore {
|
|
20
|
-
messages: () => ChatMessage[];
|
|
21
|
-
setMessages: SetMessages;
|
|
22
|
-
suggestions: () => string[];
|
|
23
|
-
loading: () => boolean;
|
|
24
|
-
append: (msg: ChatMessage) => void;
|
|
25
|
-
update: (id: string, patch: Partial<ChatMessage> | ((m: ChatMessage) => ChatMessage)) => void;
|
|
26
|
-
remove: (id: string) => void;
|
|
27
|
-
addSuggestion: (s: string) => void;
|
|
28
|
-
removeSuggestion: (s: string) => void;
|
|
29
|
-
clearSuggestions: () => void;
|
|
30
|
-
streamAssistant: (init?: Partial<ChatMessage>) => AssistantStream;
|
|
31
|
-
handleSubmit: (event: CustomEvent<{ value: string; attachments: AttachmentData[] }>) => void;
|
|
32
|
-
/** Spread onto `<kai-chat {...chat.bind} />` (reactive getters). Wire submit via `on:kai-submit={chat.handleSubmit}`. */
|
|
33
|
-
bind: { readonly messages: ChatMessage[]; readonly loading: boolean; readonly suggestions: string[] };
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export function createKaiChat(options: CreateKaiChatOptions = {}): KaiChatStore {
|
|
37
|
-
// Copy the seed arrays so a caller mutating the array it passed in can't reach our state.
|
|
38
|
-
const [messages, setMessagesSignal] = createSignal<ChatMessage[]>([...(options.initialMessages ?? [])]);
|
|
39
|
-
const [suggestions, setSuggestions] = createSignal<string[]>([...(options.initialSuggestions ?? [])]);
|
|
40
|
-
const [loading, setLoading] = createSignal(false);
|
|
41
|
-
|
|
42
|
-
const setMessages: SetMessages = (updater) => setMessagesSignal((prev) => updater(prev));
|
|
43
|
-
|
|
44
|
-
return {
|
|
45
|
-
messages,
|
|
46
|
-
setMessages,
|
|
47
|
-
suggestions,
|
|
48
|
-
loading,
|
|
49
|
-
append: (msg) => setMessages((prev) => appendMessage(prev, msg)),
|
|
50
|
-
update: (id, patch) => setMessages((prev) => updateMessage(prev, id, patch)),
|
|
51
|
-
remove: (id) => setMessages((prev) => removeMessage(prev, id)),
|
|
52
|
-
addSuggestion: (s) => setSuggestions((prev) => addSuggestion(prev, s)),
|
|
53
|
-
removeSuggestion: (s) => setSuggestions((prev) => removeSuggestion(prev, s)),
|
|
54
|
-
clearSuggestions: () => setSuggestions([]),
|
|
55
|
-
streamAssistant: (init) => {
|
|
56
|
-
setLoading(true);
|
|
57
|
-
return onStreamSettled(createAssistantStream(setMessages, init), () => setLoading(false));
|
|
58
|
-
},
|
|
59
|
-
handleSubmit: (event) => { void options.onSubmit?.(event.detail); },
|
|
60
|
-
bind: {
|
|
61
|
-
get messages() { return messages(); },
|
|
62
|
-
get loading() { return loading(); },
|
|
63
|
-
get suggestions() { return suggestions(); },
|
|
64
|
-
},
|
|
65
|
-
};
|
|
66
|
-
}
|
|
@@ -1,266 +0,0 @@
|
|
|
1
|
-
import { createSignal, onCleanup, untrack, type Accessor } from 'solid-js';
|
|
2
|
-
|
|
3
|
-
export type Transition =
|
|
4
|
-
| { duration: number; ease?: 'linear' | 'easeIn' | 'easeOut' | 'easeInOut' }
|
|
5
|
-
| { type: 'spring'; duration: number; bounce: number };
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Builds an easing function from a CSS-style cubic bezier. The curve's
|
|
9
|
-
* endpoints are fixed at (0, 0) and (1, 1); (x1, y1) and (x2, y2) are the
|
|
10
|
-
* two control points. Given a progress value `t` used as the curve's `x`,
|
|
11
|
-
* solves `X(s) === t` for the curve parameter `s` via Newton-Raphson (a
|
|
12
|
-
* handful of iterations converges for these curves), falls back to
|
|
13
|
-
* bisection if the derivative gets too small or a step would leave
|
|
14
|
-
* [0, 1], then returns `Y(s)`.
|
|
15
|
-
*/
|
|
16
|
-
function cubicBezier(x1: number, y1: number, x2: number, y2: number): (t: number) => number {
|
|
17
|
-
const x = (s: number) => 3 * (1 - s) * (1 - s) * s * x1 + 3 * (1 - s) * s * s * x2 + s * s * s;
|
|
18
|
-
const y = (s: number) => 3 * (1 - s) * (1 - s) * s * y1 + 3 * (1 - s) * s * s * y2 + s * s * s;
|
|
19
|
-
const xDerivative = (s: number) =>
|
|
20
|
-
3 * (1 - s) * (1 - s) * x1 + 6 * (1 - s) * s * (x2 - x1) + 3 * s * s * (1 - x2);
|
|
21
|
-
|
|
22
|
-
function bisect(t: number): number {
|
|
23
|
-
let lo = 0;
|
|
24
|
-
let hi = 1;
|
|
25
|
-
for (let i = 0; i < 30; i++) {
|
|
26
|
-
const mid = (lo + hi) / 2;
|
|
27
|
-
if (x(mid) < t) lo = mid;
|
|
28
|
-
else hi = mid;
|
|
29
|
-
}
|
|
30
|
-
return (lo + hi) / 2;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
return (t: number) => {
|
|
34
|
-
if (t <= 0) return 0;
|
|
35
|
-
if (t >= 1) return 1;
|
|
36
|
-
|
|
37
|
-
let s = t;
|
|
38
|
-
for (let i = 0; i < 8; i++) {
|
|
39
|
-
const derivative = xDerivative(s);
|
|
40
|
-
if (Math.abs(derivative) < 1e-6) return y(bisect(t));
|
|
41
|
-
|
|
42
|
-
const next = s - (x(s) - t) / derivative;
|
|
43
|
-
if (next <= 0 || next >= 1) return y(bisect(t));
|
|
44
|
-
|
|
45
|
-
s = next;
|
|
46
|
-
}
|
|
47
|
-
return y(s);
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// Matches motion's named curves so the visualizers feel like their LiveKit
|
|
52
|
-
// counterparts rather than a plausible-looking approximation.
|
|
53
|
-
//
|
|
54
|
-
// Every easing here is TOTAL: it clamps `t` into [0, 1] itself rather than
|
|
55
|
-
// trusting its caller. `cubicBezier` already did (its Newton solve needs `t`
|
|
56
|
-
// in range to converge); `linear` was the bare identity and passed anything
|
|
57
|
-
// straight through. `step()` below clamps the top but not the bottom, so a
|
|
58
|
-
// frame timestamp EARLIER than the origin `to()` captured yields a negative
|
|
59
|
-
// `t` and, through an unclamped easing, a tween that runs backwards.
|
|
60
|
-
//
|
|
61
|
-
// That timestamp cannot occur in a browser -- requestAnimationFrame's
|
|
62
|
-
// timestamp and `performance.now()` share a time origin per spec -- so this is
|
|
63
|
-
// robustness, not a live bug. It does occur under vitest + jsdom, where the
|
|
64
|
-
// two do not share an origin. The clamp lives in the easings rather than at
|
|
65
|
-
// the `step()` call site so the tests can drive a negative `t` through each
|
|
66
|
-
// curve individually and prove which ones guard.
|
|
67
|
-
const EASINGS = {
|
|
68
|
-
linear: (t: number) => Math.min(1, Math.max(0, t)),
|
|
69
|
-
easeIn: cubicBezier(0.42, 0, 1, 1),
|
|
70
|
-
easeOut: cubicBezier(0, 0, 0.58, 1),
|
|
71
|
-
easeInOut: cubicBezier(0.42, 0, 0.58, 1),
|
|
72
|
-
} as const;
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Damped-spring position at normalized time `t` (0..1), settling at 1.
|
|
76
|
-
*
|
|
77
|
-
* `bounce` maps to the damping ratio: 0 is critically damped (no overshoot),
|
|
78
|
-
* higher values overshoot more. Matches the feel of motion's spring defaults
|
|
79
|
-
* closely enough for shader uniforms, without the dependency.
|
|
80
|
-
*
|
|
81
|
-
* `t` is clamped at 0 for the same reason the named easings are (see EASINGS),
|
|
82
|
-
* and the failure here is far louder than theirs: the decay term is
|
|
83
|
-
* `Math.exp(-zeta * omega * t)`, so a negative `t` makes it GROW rather than
|
|
84
|
-
* decay. At t = -0.25 with bounce 0.4 this returned ~5.9 instead of something
|
|
85
|
-
* in [0, ~1.3]. No top clamp: overshooting past 1 is what a spring is for.
|
|
86
|
-
*/
|
|
87
|
-
function spring(t: number, bounce: number): number {
|
|
88
|
-
t = Math.max(0, t);
|
|
89
|
-
const zeta = Math.max(0.05, 1 - Math.min(0.95, bounce));
|
|
90
|
-
const omega = 10;
|
|
91
|
-
const damped = omega * Math.sqrt(Math.max(0, 1 - zeta * zeta));
|
|
92
|
-
return (
|
|
93
|
-
1 -
|
|
94
|
-
Math.exp(-zeta * omega * t) *
|
|
95
|
-
(Math.cos(damped * t) + ((zeta * omega) / (damped || 1)) * Math.sin(damped * t))
|
|
96
|
-
);
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
function isSpring(tr: Transition): tr is { type: 'spring'; duration: number; bounce: number } {
|
|
100
|
-
return 'type' in tr && tr.type === 'spring';
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* A tweened number driven by requestAnimationFrame.
|
|
105
|
-
*
|
|
106
|
-
* Exists so shader uniforms can animate without pulling in a motion library.
|
|
107
|
-
* CSS transitions cannot help here: uniforms are plain JS numbers handed to
|
|
108
|
-
* WebGL every frame.
|
|
109
|
-
*
|
|
110
|
-
* `to()` interrupts whatever is in flight. An array target ping-pongs between
|
|
111
|
-
* its two values forever, which is how the listening and thinking pulses read.
|
|
112
|
-
* `duration: 0` (or no transition) sets instantly, which live volume needs so
|
|
113
|
-
* the picture never lags the audio.
|
|
114
|
-
*
|
|
115
|
-
* `animating` is true exactly while a frame loop is armed: from an animated
|
|
116
|
-
* `to()` until it lands (a ping-pong never lands, so it stays true), false
|
|
117
|
-
* for instant sets and after dispose. It is a real signal on purpose -- the
|
|
118
|
-
* aurora variant's volume-override effect reads it as its upstream-parity
|
|
119
|
-
* "scale tween idle" guard, and being reactive means that effect re-runs
|
|
120
|
-
* the moment a landing settles instead of waiting for the next volume tick.
|
|
121
|
-
*/
|
|
122
|
-
export function createTween(initial: number): {
|
|
123
|
-
value: Accessor<number>;
|
|
124
|
-
animating: Accessor<boolean>;
|
|
125
|
-
to(target: number | [number, number], transition?: Transition): void;
|
|
126
|
-
} {
|
|
127
|
-
const [value, setValue] = createSignal(initial);
|
|
128
|
-
const [animating, setAnimating] = createSignal(false);
|
|
129
|
-
let raf = 0;
|
|
130
|
-
let disposed = false;
|
|
131
|
-
|
|
132
|
-
/**
|
|
133
|
-
* `cancelAnimationFrame`, captured at SETUP.
|
|
134
|
-
*
|
|
135
|
-
* `stop()` below runs at dispose, and dispose is not guaranteed to happen
|
|
136
|
-
* while the page that mounted this tween is still standing -- a host can tear
|
|
137
|
-
* its DOM globals down in between (`component-register`'s
|
|
138
|
-
* `disconnectedCallback` defers a microtask; a test environment deletes the
|
|
139
|
-
* globals synchronously right after detaching). A bare `cancelAnimationFrame`
|
|
140
|
-
* there throws from a promise nobody holds, so it surfaces as an unhandled
|
|
141
|
-
* rejection that fails a run in which every test passed. See
|
|
142
|
-
* tests/components/teardown-without-dom-globals.test.tsx.
|
|
143
|
-
*
|
|
144
|
-
* The FUNCTION, not the view. The `const win = window` capture that fixes a
|
|
145
|
-
* bare `document` does nothing here: `window === globalThis` -- measured, in
|
|
146
|
-
* jsdom and in real Chromium/WebKit alike -- and the teardown deletes these
|
|
147
|
-
* keys off that very object, so `win.cancelAnimationFrame` is undefined by
|
|
148
|
-
* the time cleanup runs. It only trades the ReferenceError for a TypeError.
|
|
149
|
-
* `.bind` pins the receiver the WebIDL operation is specified on; Chromium
|
|
150
|
-
* and WebKit both accept a detached call (measured), so the bind is belt and
|
|
151
|
-
* braces against an engine that does not, at zero cost.
|
|
152
|
-
*
|
|
153
|
-
* GUARDED because "setup" for this primitive is the component body, and a
|
|
154
|
-
* server render executes component bodies. Node has no `cancelAnimationFrame`
|
|
155
|
-
* at all, so an unguarded capture here would trade the disposal crash for an
|
|
156
|
-
* SSR crash -- measured, not hypothesised. Nothing can be scheduled without
|
|
157
|
-
* `requestAnimationFrame` either, so the no-op fallback is exactly right.
|
|
158
|
-
*/
|
|
159
|
-
const cancelFrame = typeof cancelAnimationFrame === 'function'
|
|
160
|
-
? cancelAnimationFrame.bind(globalThis)
|
|
161
|
-
: () => {};
|
|
162
|
-
|
|
163
|
-
const stop = () => {
|
|
164
|
-
if (raf) cancelFrame(raf);
|
|
165
|
-
raf = 0;
|
|
166
|
-
};
|
|
167
|
-
|
|
168
|
-
onCleanup(() => {
|
|
169
|
-
disposed = true;
|
|
170
|
-
stop();
|
|
171
|
-
setAnimating(false);
|
|
172
|
-
});
|
|
173
|
-
|
|
174
|
-
function to(target: number | [number, number], transition?: Transition) {
|
|
175
|
-
stop();
|
|
176
|
-
if (disposed) return;
|
|
177
|
-
|
|
178
|
-
const pingPong = Array.isArray(target);
|
|
179
|
-
// Untracked: `.to()` is an imperative command ("animate to this
|
|
180
|
-
// target"), not a reactive read. Its normal caller is a createEffect
|
|
181
|
-
// reacting to some OTHER signal (e.g. state changing); reading this
|
|
182
|
-
// tween's own `value()` here without untrack() would make that effect
|
|
183
|
-
// implicitly depend on the tween's own signal too. That is invisible
|
|
184
|
-
// for a single tween (it would just restart itself every frame and
|
|
185
|
-
// still crawl toward the target) but is fatal the moment a caller
|
|
186
|
-
// creates a SECOND tween and `.to()`'s both from the same effect (see
|
|
187
|
-
// the wave shader variant, which does exactly this for amplitude and
|
|
188
|
-
// frequency): a browser fires one frame's queued
|
|
189
|
-
// requestAnimationFrame callbacks in the order they were registered, so
|
|
190
|
-
// the FIRST tween's step -- which runs first, and whose `setValue`
|
|
191
|
-
// synchronously re-triggers the (now-dependent) effect -- cancels the
|
|
192
|
-
// SECOND tween's already-queued step before the browser ever reaches
|
|
193
|
-
// it. That repeats identically every single frame, so the second
|
|
194
|
-
// tween's `step` never fires even once and its value never leaves its
|
|
195
|
-
// initial one, permanently, no matter how long the effect keeps
|
|
196
|
-
// "restarting" it.
|
|
197
|
-
const [a, b] = pingPong ? target : [untrack(value), target];
|
|
198
|
-
|
|
199
|
-
if (!transition || (!isSpring(transition) && transition.duration === 0)) {
|
|
200
|
-
setAnimating(false);
|
|
201
|
-
setValue(pingPong ? a : b);
|
|
202
|
-
return;
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
const durationMs = transition.duration * 1000;
|
|
206
|
-
if (durationMs <= 0) {
|
|
207
|
-
setAnimating(false);
|
|
208
|
-
setValue(b);
|
|
209
|
-
return;
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
if (typeof requestAnimationFrame === 'undefined') {
|
|
213
|
-
setAnimating(false);
|
|
214
|
-
setValue(b);
|
|
215
|
-
return;
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
const ease = isSpring(transition)
|
|
219
|
-
? (t: number) => spring(t, transition.bounce)
|
|
220
|
-
: EASINGS[transition.ease ?? 'easeOut'];
|
|
221
|
-
|
|
222
|
-
// A ping-pong starts from its first value rather than wherever it was, so
|
|
223
|
-
// the pulse reads the same every time it restarts. `a` is already an
|
|
224
|
-
// untracked read of the current value (or the ping-pong's first target
|
|
225
|
-
// value) from above -- reused here instead of reading `value()` again.
|
|
226
|
-
let from = a;
|
|
227
|
-
let to_ = b;
|
|
228
|
-
if (pingPong) setValue(a);
|
|
229
|
-
|
|
230
|
-
// requestAnimationFrame's timestamp and performance.now() share a time
|
|
231
|
-
// origin per spec, so capturing the origin here, at the moment to() is
|
|
232
|
-
// called, is directly comparable to the `now` a later frame reports.
|
|
233
|
-
// That means elapsed time is measured from when this leg actually
|
|
234
|
-
// started, correct on the very first frame with no lazy-capture dance
|
|
235
|
-
// and no risk of an idle gap since the last tween being charged against
|
|
236
|
-
// this one.
|
|
237
|
-
let legStart = performance.now();
|
|
238
|
-
const step = (now: number) => {
|
|
239
|
-
const t = Math.min(1, (now - legStart) / durationMs);
|
|
240
|
-
setValue(from + (to_ - from) * ease(t));
|
|
241
|
-
|
|
242
|
-
if (t < 1) {
|
|
243
|
-
raf = requestAnimationFrame(step);
|
|
244
|
-
return;
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
if (!pingPong) {
|
|
248
|
-
setValue(to_);
|
|
249
|
-
raf = 0;
|
|
250
|
-
setAnimating(false);
|
|
251
|
-
return;
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
// Reverse and run again, from a fresh origin for the new leg.
|
|
255
|
-
setValue(to_);
|
|
256
|
-
[from, to_] = [to_, from];
|
|
257
|
-
legStart = performance.now();
|
|
258
|
-
raf = requestAnimationFrame(step);
|
|
259
|
-
};
|
|
260
|
-
|
|
261
|
-
setAnimating(true);
|
|
262
|
-
raf = requestAnimationFrame(step);
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
return { value, animating, to };
|
|
266
|
-
}
|