@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
package/src/components/tool.tsx
DELETED
|
@@ -1,190 +0,0 @@
|
|
|
1
|
-
import { type JSX, splitProps, createSignal, Show, For } from 'solid-js';
|
|
2
|
-
import { cn } from '../utils/cn';
|
|
3
|
-
import { Collapsible, CollapsibleTrigger, CollapsibleContent, type CollapsibleController } from '../ui/collapsible';
|
|
4
|
-
import { Button } from '../ui/button';
|
|
5
|
-
import { CheckCircle, ChevronDown, Loader2, Settings, XCircle } from 'lucide-solid';
|
|
6
|
-
import type { ToolPart } from './tool-types';
|
|
7
|
-
export type { ToolPart } from './tool-types';
|
|
8
|
-
|
|
9
|
-
export interface ToolProps {
|
|
10
|
-
toolPart: ToolPart;
|
|
11
|
-
defaultOpen?: boolean;
|
|
12
|
-
/** Gate the disclosure trigger (programmatic control still works). */
|
|
13
|
-
disabled?: boolean;
|
|
14
|
-
/** Receive the open controller once mounted (forwarded from the Collapsible),
|
|
15
|
-
* so a parent (the kai-tool facade) can drive/observe open state. */
|
|
16
|
-
controllerRef?: (api: CollapsibleController) => void;
|
|
17
|
-
class?: string;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
function formatValue(value: unknown): string {
|
|
21
|
-
if (value === null) return 'null';
|
|
22
|
-
if (value === undefined) return 'undefined';
|
|
23
|
-
if (typeof value === 'string') return value;
|
|
24
|
-
if (typeof value === 'object') return JSON.stringify(value, null, 2);
|
|
25
|
-
return String(value);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
function ToolStateIcon(props: { state: ToolPart['state'] }) {
|
|
29
|
-
return (
|
|
30
|
-
<>
|
|
31
|
-
<Show when={props.state === 'input-streaming'}>
|
|
32
|
-
<Loader2 class="size-4 animate-spin text-blue-500" />
|
|
33
|
-
</Show>
|
|
34
|
-
<Show when={props.state === 'input-available'}>
|
|
35
|
-
<Settings class="size-4 text-orange-500" />
|
|
36
|
-
</Show>
|
|
37
|
-
<Show when={props.state === 'output-available'}>
|
|
38
|
-
<CheckCircle class="size-4 text-green-500" />
|
|
39
|
-
</Show>
|
|
40
|
-
<Show when={props.state === 'output-error'}>
|
|
41
|
-
<XCircle class="size-4 text-red-500" />
|
|
42
|
-
</Show>
|
|
43
|
-
</>
|
|
44
|
-
);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
// Status chips: a hue as text over a 15% translucent fill of the same hue
|
|
48
|
-
// (mirroring the inline-code chip). The TEXT color comes from a theme token
|
|
49
|
-
// (--color-tool-*) whose light value is darkened so it reaches WCAG AA (4.5:1)
|
|
50
|
-
// on the faint fill, while dark mode keeps a brighter hue for AA on the dark
|
|
51
|
-
// surface — both modes resolve via the token's `.dark` override. The FILL keeps
|
|
52
|
-
// a fixed bright hue so the chip's colored tint looks the same in both modes.
|
|
53
|
-
const STATE_TOKEN: Record<ToolPart['state'], string> = {
|
|
54
|
-
'input-streaming': 'var(--color-tool-blue)',
|
|
55
|
-
'input-available': 'var(--color-tool-amber)',
|
|
56
|
-
'output-available': 'var(--color-tool-green)',
|
|
57
|
-
'output-error': 'var(--color-tool-red)',
|
|
58
|
-
};
|
|
59
|
-
const STATE_FILL: Record<ToolPart['state'], string> = {
|
|
60
|
-
'input-streaming': 'hsl(217 91% 60%)', // blue
|
|
61
|
-
'input-available': 'hsl(38 92% 50%)', // amber
|
|
62
|
-
'output-available': 'hsl(142 71% 45%)', // green
|
|
63
|
-
'output-error': 'hsl(0 84% 60%)', // red
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
function stateChip(state: ToolPart['state']): JSX.CSSProperties {
|
|
67
|
-
return {
|
|
68
|
-
color: STATE_TOKEN[state],
|
|
69
|
-
background: `color-mix(in oklab, ${STATE_FILL[state]} 15%, transparent)`,
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
function ToolStateBadge(props: { state: ToolPart['state'] }) {
|
|
74
|
-
const baseClasses = 'px-2 py-1 rounded-full text-xs font-medium';
|
|
75
|
-
return (
|
|
76
|
-
<>
|
|
77
|
-
<Show when={props.state === 'input-streaming'}>
|
|
78
|
-
<span class={baseClasses} style={stateChip('input-streaming')}>
|
|
79
|
-
Processing
|
|
80
|
-
</span>
|
|
81
|
-
</Show>
|
|
82
|
-
<Show when={props.state === 'input-available'}>
|
|
83
|
-
<span class={baseClasses} style={stateChip('input-available')}>
|
|
84
|
-
Ready
|
|
85
|
-
</span>
|
|
86
|
-
</Show>
|
|
87
|
-
<Show when={props.state === 'output-available'}>
|
|
88
|
-
<span class={baseClasses} style={stateChip('output-available')}>
|
|
89
|
-
Completed
|
|
90
|
-
</span>
|
|
91
|
-
</Show>
|
|
92
|
-
<Show when={props.state === 'output-error'}>
|
|
93
|
-
<span class={baseClasses} style={stateChip('output-error')}>
|
|
94
|
-
Error
|
|
95
|
-
</span>
|
|
96
|
-
</Show>
|
|
97
|
-
</>
|
|
98
|
-
);
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
function Tool(props: ToolProps) {
|
|
102
|
-
const [local, rest] = splitProps(props, ['toolPart', 'defaultOpen', 'disabled', 'controllerRef', 'class']);
|
|
103
|
-
// Drive the Collapsible UNCONTROLLED (seed from defaultOpen) and read its open
|
|
104
|
-
// state via the controller it hands up — that same controller is forwarded to
|
|
105
|
-
// the facade so wireDisclosure can drive show/hide/toggle.
|
|
106
|
-
const [api, setApi] = createSignal<CollapsibleController>();
|
|
107
|
-
const isOpen = () => api()?.open() ?? (local.defaultOpen ?? false);
|
|
108
|
-
|
|
109
|
-
const state = () => local.toolPart.state;
|
|
110
|
-
const input = () => local.toolPart.input;
|
|
111
|
-
const output = () => local.toolPart.output;
|
|
112
|
-
|
|
113
|
-
return (
|
|
114
|
-
<div class={cn('mt-3 overflow-hidden rounded-lg bg-surface', local.class)}>
|
|
115
|
-
<Collapsible
|
|
116
|
-
defaultOpen={local.defaultOpen}
|
|
117
|
-
disabled={local.disabled}
|
|
118
|
-
controllerRef={(a) => { setApi(a); local.controllerRef?.(a); }}
|
|
119
|
-
>
|
|
120
|
-
<CollapsibleTrigger
|
|
121
|
-
as={(triggerProps: JSX.HTMLAttributes<HTMLButtonElement>) => (
|
|
122
|
-
<Button
|
|
123
|
-
variant="ghost"
|
|
124
|
-
class="h-auto w-full justify-between rounded-b-none px-3 py-2 font-normal"
|
|
125
|
-
{...triggerProps}
|
|
126
|
-
>
|
|
127
|
-
<div class="flex items-center gap-2">
|
|
128
|
-
<ToolStateIcon state={state()} />
|
|
129
|
-
<span class="font-mono text-sm font-medium">{local.toolPart.type}</span>
|
|
130
|
-
<ToolStateBadge state={state()} />
|
|
131
|
-
</div>
|
|
132
|
-
<ChevronDown class={cn('size-4 transition-transform', isOpen() && 'rotate-180')} />
|
|
133
|
-
</Button>
|
|
134
|
-
)}
|
|
135
|
-
/>
|
|
136
|
-
<CollapsibleContent
|
|
137
|
-
class="data-[state=closed]:animate-collapsible-up data-[state=open]:animate-collapsible-down overflow-hidden"
|
|
138
|
-
>
|
|
139
|
-
<div class="space-y-3 p-3">
|
|
140
|
-
<Show when={input() && Object.keys(input()!).length > 0}>
|
|
141
|
-
<div>
|
|
142
|
-
<h4 class="text-muted-foreground mb-2 text-sm font-medium">Input</h4>
|
|
143
|
-
<div class="rounded bg-surface-strong p-2 font-mono text-sm">
|
|
144
|
-
<For each={Object.entries(input()!)}>
|
|
145
|
-
{([key, value]) => (
|
|
146
|
-
<div class="mb-1">
|
|
147
|
-
<span class="text-muted-foreground">{key}:</span>{' '}
|
|
148
|
-
<span>{formatValue(value)}</span>
|
|
149
|
-
</div>
|
|
150
|
-
)}
|
|
151
|
-
</For>
|
|
152
|
-
</div>
|
|
153
|
-
</div>
|
|
154
|
-
</Show>
|
|
155
|
-
|
|
156
|
-
<Show when={output()}>
|
|
157
|
-
<div>
|
|
158
|
-
<h4 class="text-muted-foreground mb-2 text-sm font-medium">Output</h4>
|
|
159
|
-
<div tabindex={0} class="max-h-60 overflow-auto rounded bg-surface-strong p-2 font-mono text-sm">
|
|
160
|
-
<pre class="whitespace-pre-wrap">{formatValue(output())}</pre>
|
|
161
|
-
</div>
|
|
162
|
-
</div>
|
|
163
|
-
</Show>
|
|
164
|
-
|
|
165
|
-
<Show when={state() === 'output-error' && local.toolPart.errorText}>
|
|
166
|
-
<div>
|
|
167
|
-
<h4 class="mb-2 text-sm font-medium text-red-600 dark:text-red-400">Error</h4>
|
|
168
|
-
<div class="rounded bg-red-500/10 p-2 text-sm">
|
|
169
|
-
{local.toolPart.errorText}
|
|
170
|
-
</div>
|
|
171
|
-
</div>
|
|
172
|
-
</Show>
|
|
173
|
-
|
|
174
|
-
<Show when={state() === 'input-streaming'}>
|
|
175
|
-
<div class="text-muted-foreground text-sm">Processing tool call...</div>
|
|
176
|
-
</Show>
|
|
177
|
-
|
|
178
|
-
<Show when={local.toolPart.toolCallId}>
|
|
179
|
-
<div class="text-muted-foreground pt-2 text-xs">
|
|
180
|
-
<span class="font-mono">Call ID: {local.toolPart.toolCallId}</span>
|
|
181
|
-
</div>
|
|
182
|
-
</Show>
|
|
183
|
-
</div>
|
|
184
|
-
</CollapsibleContent>
|
|
185
|
-
</Collapsible>
|
|
186
|
-
</div>
|
|
187
|
-
);
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
export { Tool };
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
// Shared resolution controller for interactive cards. Precedence:
|
|
2
|
-
// props.resolution (host-driven / re-hydrated) > local optimistic flip > none
|
|
3
|
-
// A new `data` identity clears the local flip (a fresh card definition is interactive
|
|
4
|
-
// again), but an explicit prop keeps it resolved. `isOptimistic` is true only for a
|
|
5
|
-
// flip made this session (used to announce via role="status"; silent on re-hydrate).
|
|
6
|
-
//
|
|
7
|
-
// A resolution is `isResolved` when present at all; `isTerminal` for the finished
|
|
8
|
-
// states (action | submit | expired) and `isDeferred` for `dismissed` — a set-aside
|
|
9
|
-
// card that still offers a Reopen affordance.
|
|
10
|
-
import { createSignal, createMemo, createEffect, on, type Accessor } from 'solid-js';
|
|
11
|
-
import type { CardResolution } from '../primitives/card-contract';
|
|
12
|
-
|
|
13
|
-
export interface ResolutionController<R extends CardResolution = CardResolution> {
|
|
14
|
-
resolution: Accessor<R | undefined>;
|
|
15
|
-
isResolved: Accessor<boolean>;
|
|
16
|
-
/** A finished resolution the user can't take back here (action | submit | expired). */
|
|
17
|
-
isTerminal: Accessor<boolean>;
|
|
18
|
-
/** A deferred resolution (`dismissed`) — set aside, still re-openable. */
|
|
19
|
-
isDeferred: Accessor<boolean>;
|
|
20
|
-
isOptimistic: Accessor<boolean>;
|
|
21
|
-
setLocal: (r: R) => void;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/** The resolution kinds that are finished and not re-openable from the card. */
|
|
25
|
-
const TERMINAL_KINDS = new Set<CardResolution['kind']>(['action', 'submit', 'expired']);
|
|
26
|
-
|
|
27
|
-
export function useCardResolution<R extends CardResolution = CardResolution>(opts: {
|
|
28
|
-
prop: Accessor<R | undefined>;
|
|
29
|
-
data: Accessor<unknown>;
|
|
30
|
-
}): ResolutionController<R> {
|
|
31
|
-
const [local, setLocal] = createSignal<R | undefined>(undefined);
|
|
32
|
-
// Reset the optimistic flip when a NEW data identity arrives (deferred so mount
|
|
33
|
-
// doesn't clobber an initial prop). The prop still wins via the memo below.
|
|
34
|
-
createEffect(on(opts.data, () => setLocal(undefined), { defer: true }));
|
|
35
|
-
const resolution = createMemo(() => opts.prop() ?? local());
|
|
36
|
-
const isResolved = createMemo(() => resolution() !== undefined);
|
|
37
|
-
const isTerminal = createMemo(() => {
|
|
38
|
-
const r = resolution();
|
|
39
|
-
return r !== undefined && TERMINAL_KINDS.has(r.kind);
|
|
40
|
-
});
|
|
41
|
-
const isDeferred = createMemo(() => resolution()?.kind === 'dismissed');
|
|
42
|
-
const isOptimistic = createMemo(() => opts.prop() === undefined && local() !== undefined);
|
|
43
|
-
return { resolution, isResolved, isTerminal, isDeferred, isOptimistic, setLocal };
|
|
44
|
-
}
|
|
@@ -1,222 +0,0 @@
|
|
|
1
|
-
import { splitProps, Show, For, createSignal, createEffect, on } from 'solid-js';
|
|
2
|
-
import { cn } from '../utils/cn';
|
|
3
|
-
import { Button } from '../ui/button';
|
|
4
|
-
import { Tooltip } from '../ui/tooltip';
|
|
5
|
-
import { useVoiceRecorder } from '../primitives/use-voice-recorder';
|
|
6
|
-
import { useSpeechRecognition } from '../primitives/use-speech-recognition';
|
|
7
|
-
|
|
8
|
-
/** Imperative handle exposed via `controllerRef` — surfaces the recorder's latent
|
|
9
|
-
* start/stop so the `<kai-voice-input>` facade can forward them as instance
|
|
10
|
-
* methods (push-to-talk). Both run the SAME getUserMedia → blob → transcription
|
|
11
|
-
* path as clicking the mic, so manual + programmatic emit identically. */
|
|
12
|
-
export interface VoiceInputController {
|
|
13
|
-
/** Begin recording programmatically (same path as clicking the mic). */
|
|
14
|
-
start(): void;
|
|
15
|
-
/** Stop the in-progress recording (produces the blob → onTranscribe). */
|
|
16
|
-
stop(): void;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export interface VoiceInputProps {
|
|
20
|
-
onTranscribe: (audio: Blob) => Promise<string>;
|
|
21
|
-
onTranscription: (text: string) => void;
|
|
22
|
-
disabled?: boolean;
|
|
23
|
-
class?: string;
|
|
24
|
-
/** Host supplied a `transcribe` callback. When true the MediaRecorder →
|
|
25
|
-
* onTranscribe path runs. When false the component prefers native
|
|
26
|
-
* SpeechRecognition (capable browsers), falling back to record-only. */
|
|
27
|
-
hasTranscribe?: boolean;
|
|
28
|
-
/** BCP-47 language tag for native recognition (e.g. `en-US`). */
|
|
29
|
-
lang?: string;
|
|
30
|
-
/** Emit live partial transcripts via `onInterim` (native path only). */
|
|
31
|
-
interim?: boolean;
|
|
32
|
-
/** Live partial transcript from native recognition (when `interim`). */
|
|
33
|
-
onInterim?: (text: string) => void;
|
|
34
|
-
/** Fires whenever recording starts or stops. Guarded against the spurious
|
|
35
|
-
* initial `false` — only true transitions emit (the facade maps this to
|
|
36
|
-
* kai-recording-change). */
|
|
37
|
-
onRecordingChange?: (recording: boolean) => void;
|
|
38
|
-
/** Receive the imperative controller once mounted. The `<kai-voice-input>`
|
|
39
|
-
* facade forwards these as element methods (start/stop). */
|
|
40
|
-
controllerRef?: (controller: VoiceInputController) => void;
|
|
41
|
-
/** A recognition session failed or produced nothing. `error` is the platform
|
|
42
|
-
* error code, the thrown exception's name, or `no-result` when the session
|
|
43
|
-
* ended with no error and no text. The facade maps this to kai-voice-error. */
|
|
44
|
-
onError?: (detail: { source: 'recognition'; error: string; message: string }) => void;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export function VoiceInput(props: VoiceInputProps) {
|
|
48
|
-
const [local] = splitProps(props, ['onTranscribe', 'onTranscription', 'disabled', 'class']);
|
|
49
|
-
const { isRecording, start, stop } = useVoiceRecorder();
|
|
50
|
-
const speech = useSpeechRecognition({ interim: props.interim });
|
|
51
|
-
const [isProcessing, setIsProcessing] = createSignal(false);
|
|
52
|
-
|
|
53
|
-
// Path selection (§6): a `transcribe` callback always wins (MediaRecorder →
|
|
54
|
-
// host transcriber). Otherwise prefer native SpeechRecognition when the browser
|
|
55
|
-
// supports it. The unsupported-no-callback case falls through to recording the
|
|
56
|
-
// blob (→ onTranscribe → kai-audio-captured) with no text.
|
|
57
|
-
const useNative = () => !props.hasTranscribe && speech.isSupported;
|
|
58
|
-
|
|
59
|
-
const label = () =>
|
|
60
|
-
isProcessing() ? 'Transcribing...' : isActive() ? 'Stop recording' : 'Voice input';
|
|
61
|
-
|
|
62
|
-
const isActive = () => (useNative() ? speech.isListening() : isRecording());
|
|
63
|
-
|
|
64
|
-
// Native path: SpeechRecognition resolves with the final transcript when it
|
|
65
|
-
// ends (click again or controller.stop()). Final text → onTranscription.
|
|
66
|
-
// Every other outcome reaches onError, so a session can never end in silence
|
|
67
|
-
// (W4 symptom 1: runtime errors set a signal nothing read, and an empty
|
|
68
|
-
// result fired no event at all).
|
|
69
|
-
async function beginRecognition() {
|
|
70
|
-
let errored = false;
|
|
71
|
-
try {
|
|
72
|
-
const text = await speech.start({
|
|
73
|
-
lang: props.lang,
|
|
74
|
-
onInterim: props.interim ? (t) => props.onInterim?.(t) : undefined,
|
|
75
|
-
onError: (error, message) => {
|
|
76
|
-
errored = true;
|
|
77
|
-
props.onError?.({ source: 'recognition', error, message });
|
|
78
|
-
},
|
|
79
|
-
});
|
|
80
|
-
if (text.trim()) {
|
|
81
|
-
local.onTranscription(text.trim());
|
|
82
|
-
} else if (!errored) {
|
|
83
|
-
// No error, no text: the session ended cleanly having heard nothing.
|
|
84
|
-
// Reported through the SAME error event (as `no-result`) rather than an
|
|
85
|
-
// empty kai-transcription, so kai-transcription keeps its contract
|
|
86
|
-
// (final text exists) and one listener covers every failed session; the
|
|
87
|
-
// code distinguishes "user said nothing" from "recognition broke".
|
|
88
|
-
props.onError?.({
|
|
89
|
-
source: 'recognition',
|
|
90
|
-
error: 'no-result',
|
|
91
|
-
message: 'Speech recognition ended without capturing any text',
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
} catch (err) {
|
|
95
|
-
// start() itself threw (unsupported, or the platform refused to start).
|
|
96
|
-
if (!errored) {
|
|
97
|
-
props.onError?.({
|
|
98
|
-
source: 'recognition',
|
|
99
|
-
error: err instanceof Error ? err.name : 'unknown',
|
|
100
|
-
message: err instanceof Error ? err.message : String(err),
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
// Begin recording, then run transcription once the blob resolves. Shared by the
|
|
107
|
-
// mic click and the imperative start() so both flows emit identically. start()
|
|
108
|
-
// resolves its Blob when the recorder stops (click again or controller.stop()).
|
|
109
|
-
async function beginRecording() {
|
|
110
|
-
try {
|
|
111
|
-
const blob = await start();
|
|
112
|
-
setIsProcessing(true);
|
|
113
|
-
try {
|
|
114
|
-
const text = await local.onTranscribe(blob);
|
|
115
|
-
if (text.trim()) local.onTranscription(text.trim());
|
|
116
|
-
} finally {
|
|
117
|
-
setIsProcessing(false);
|
|
118
|
-
}
|
|
119
|
-
} catch {
|
|
120
|
-
setIsProcessing(false);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
// Drive whichever path is active (§6: start/stop must follow the live path).
|
|
125
|
-
function begin() {
|
|
126
|
-
if (useNative()) void beginRecognition();
|
|
127
|
-
else void beginRecording();
|
|
128
|
-
}
|
|
129
|
-
function end() {
|
|
130
|
-
if (useNative()) speech.stop();
|
|
131
|
-
else stop();
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
async function handleClick() {
|
|
135
|
-
if (isActive()) end();
|
|
136
|
-
else begin();
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
// Emit recording transitions to the host. `on(..., { defer: true })` skips the
|
|
140
|
-
// initial mount value (a spurious {recording:false}) — only real start/stop
|
|
141
|
-
// transitions fire. Drives BOTH manual (click) and programmatic (start/stop)
|
|
142
|
-
// since they all flip the active path's signal (MediaRecorder or recognition).
|
|
143
|
-
createEffect(on(isActive, (recording) => {
|
|
144
|
-
props.onRecordingChange?.(recording);
|
|
145
|
-
}, { defer: true }));
|
|
146
|
-
|
|
147
|
-
// Imperative controller (Pattern C): hand the facade a start/stop handle.
|
|
148
|
-
// start() runs the active path; stop() ends the in-progress session (resolving
|
|
149
|
-
// the active path's promise). Guard start() so a double-start while already
|
|
150
|
-
// active is a no-op (matches the click toggle).
|
|
151
|
-
props.controllerRef?.({
|
|
152
|
-
start: () => { if (!isActive()) begin(); },
|
|
153
|
-
stop: () => end(),
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
// Mic icon (not recording)
|
|
157
|
-
const MicIcon = () => (
|
|
158
|
-
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
159
|
-
<path d="M12 1a3 3 0 00-3 3v8a3 3 0 006 0V4a3 3 0 00-3-3z" />
|
|
160
|
-
<path d="M19 10v2a7 7 0 01-14 0v-2" />
|
|
161
|
-
<line x1="12" y1="19" x2="12" y2="23" />
|
|
162
|
-
<line x1="8" y1="23" x2="16" y2="23" />
|
|
163
|
-
</svg>
|
|
164
|
-
);
|
|
165
|
-
|
|
166
|
-
// Square stop icon (recording)
|
|
167
|
-
const StopIcon = () => (
|
|
168
|
-
<svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor">
|
|
169
|
-
<rect x="4" y="4" width="16" height="16" rx="2" />
|
|
170
|
-
</svg>
|
|
171
|
-
);
|
|
172
|
-
|
|
173
|
-
// Spinner (processing transcription)
|
|
174
|
-
const Spinner = () => (
|
|
175
|
-
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class="animate-spin">
|
|
176
|
-
<path d="M21 12a9 9 0 11-6.219-8.56" />
|
|
177
|
-
</svg>
|
|
178
|
-
);
|
|
179
|
-
|
|
180
|
-
return (
|
|
181
|
-
<div class={cn('relative inline-flex items-center justify-center', local.class)}>
|
|
182
|
-
{/* Animated pulse rings when recording */}
|
|
183
|
-
<Show when={isActive()}>
|
|
184
|
-
<For each={[0, 1, 2]}>
|
|
185
|
-
{(index) => (
|
|
186
|
-
<div
|
|
187
|
-
class="absolute inset-0 animate-ping rounded-full border-2 border-red-400/30"
|
|
188
|
-
style={{
|
|
189
|
-
"animation-delay": `${index * 0.3}s`,
|
|
190
|
-
"animation-duration": "2s",
|
|
191
|
-
}}
|
|
192
|
-
/>
|
|
193
|
-
)}
|
|
194
|
-
</For>
|
|
195
|
-
</Show>
|
|
196
|
-
|
|
197
|
-
<Tooltip content={label()}>
|
|
198
|
-
<Button
|
|
199
|
-
variant="ghost"
|
|
200
|
-
size="icon-sm"
|
|
201
|
-
aria-label={label()}
|
|
202
|
-
onClick={handleClick}
|
|
203
|
-
disabled={local.disabled || isProcessing()}
|
|
204
|
-
class={cn(
|
|
205
|
-
'relative z-10 rounded-full transition-all duration-300',
|
|
206
|
-
isActive() && 'bg-destructive text-white hover:bg-destructive/80',
|
|
207
|
-
)}
|
|
208
|
-
>
|
|
209
|
-
<Show when={isProcessing()}>
|
|
210
|
-
<Spinner />
|
|
211
|
-
</Show>
|
|
212
|
-
<Show when={!isProcessing() && isActive()}>
|
|
213
|
-
<StopIcon />
|
|
214
|
-
</Show>
|
|
215
|
-
<Show when={!isProcessing() && !isActive()}>
|
|
216
|
-
<MicIcon />
|
|
217
|
-
</Show>
|
|
218
|
-
</Button>
|
|
219
|
-
</Tooltip>
|
|
220
|
-
</div>
|
|
221
|
-
);
|
|
222
|
-
}
|