@kitn.ai/ui 0.16.0 → 0.18.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 +55 -17
- package/dist/components/artifact.d.ts +39 -1
- package/dist/components/attachment-types.d.ts +12 -0
- package/dist/components/attachments.d.ts +2 -10
- package/dist/components/card.d.ts +27 -0
- package/dist/components/chain-of-thought.d.ts +78 -2
- package/dist/components/chat-scope-picker.d.ts +7 -0
- package/dist/components/chat-thread.d.ts +39 -16
- package/dist/components/choice-card.d.ts +27 -0
- package/dist/components/coachmark.d.ts +49 -0
- package/dist/components/composer-dom.d.ts +35 -0
- package/dist/components/composer-highlight.d.ts +48 -0
- package/dist/components/composer-history.d.ts +34 -0
- package/dist/components/composer.d.ts +86 -0
- package/dist/components/confirm-card.d.ts +17 -0
- package/dist/components/conversation-item.d.ts +9 -0
- package/dist/components/conversation-list.d.ts +36 -1
- package/dist/components/dismissed-stub.d.ts +22 -0
- package/dist/components/file-tree.d.ts +15 -0
- package/dist/components/form.d.ts +34 -0
- package/dist/components/markdown.d.ts +3 -0
- package/dist/components/message.d.ts +71 -2
- package/dist/components/model-switcher.d.ts +7 -0
- package/dist/components/prompt-input.d.ts +13 -4
- package/dist/components/prompt-suggestion.d.ts +9 -1
- package/dist/components/reasoning.d.ts +14 -1
- package/dist/components/response-compare-types.d.ts +66 -0
- package/dist/components/response-compare.d.ts +65 -0
- package/dist/components/screen.d.ts +46 -0
- package/dist/components/tasks-card.d.ts +50 -1
- package/dist/components/toast.d.ts +58 -0
- package/dist/components/tool-types.d.ts +10 -0
- package/dist/components/tool.d.ts +8 -8
- package/dist/components/use-card-resolution.d.ts +10 -6
- package/dist/components/voice-input.d.ts +27 -0
- package/dist/components/voice-output.d.ts +33 -0
- package/dist/core-C8fzo39E.js +12 -0
- package/dist/custom-elements.json +8472 -1691
- package/dist/elements/agent-card.d.ts +1 -0
- package/dist/elements/agent-card.js +1 -0
- package/dist/elements/artifact.js +1 -0
- package/dist/elements/attachments.js +1 -0
- package/dist/elements/autoloader.d.ts +2 -0
- package/dist/elements/autoloader.js +1 -0
- package/dist/elements/avatar.d.ts +1 -0
- package/dist/elements/avatar.js +1 -0
- package/dist/elements/badge.d.ts +1 -0
- package/dist/elements/badge.js +1 -0
- package/dist/elements/button.d.ts +1 -0
- package/dist/elements/button.js +1 -0
- package/dist/elements/card.js +1 -0
- package/dist/elements/cards.d.ts +1 -0
- package/dist/elements/cards.js +1 -0
- package/dist/elements/chain-of-thought.d.ts +0 -12
- package/dist/elements/chain-of-thought.js +1 -0
- package/dist/elements/chat-scope-picker.js +1 -0
- package/dist/elements/chat-types.d.ts +8 -2
- package/dist/elements/chat-workspace.js +1 -0
- package/dist/elements/chat.js +1 -0
- package/dist/elements/checkpoint.js +1 -0
- package/dist/elements/choice.js +1 -0
- package/dist/elements/chunks/Icon-DLLBeLG5.js +1 -0
- package/dist/elements/chunks/action-icons-UB4V5FNq.js +1 -0
- package/dist/elements/chunks/arrow-left-C-gwlUmx.js +1 -0
- package/dist/elements/chunks/attachments-CgbErf1r.js +1 -0
- package/dist/elements/chunks/badge-DTQpgB6N.js +1 -0
- package/dist/elements/chunks/bash-InADTalH.js +1 -0
- package/dist/elements/chunks/button-XDUM6lXs.js +1 -0
- package/dist/elements/chunks/card-CBlFZ-7I.js +1 -0
- package/dist/elements/chunks/card-routing-C986KuUA.js +1 -0
- package/dist/elements/chunks/chat-thread-BIhmqwNL.js +1 -0
- package/dist/elements/chunks/check-hGUoVIKb.js +1 -0
- package/dist/elements/chunks/chevron-down-DDoaSUtO.js +1 -0
- package/dist/elements/chunks/chevron-right-CdGEUakB.js +1 -0
- package/dist/elements/chunks/circle-BKAZdmzb.js +1 -0
- package/dist/elements/chunks/circle-check-CmYG-y3I.js +1 -0
- package/dist/elements/chunks/circle-x-DewgAEym.js +1 -0
- package/dist/elements/chunks/cn-CU7UAWzk.js +1 -0
- package/dist/elements/chunks/code-block-DedwxwFI.js +1 -0
- package/dist/elements/chunks/collapsible-FfgmTHtM.js +1 -0
- package/dist/elements/chunks/composer-Cfbw5HKT.js +65 -0
- package/dist/elements/chunks/context-DwJmxlRE.js +1 -0
- package/dist/elements/chunks/conversation-list-DsCQMfPq.js +1 -0
- package/dist/elements/chunks/core-AYMC6_lb.js +12 -0
- package/dist/elements/chunks/css-M7EaDHN_.js +1 -0
- package/dist/elements/chunks/default-input-BuqsoENC.js +1 -0
- package/dist/elements/chunks/define-rGsaWsLL.js +1 -0
- package/dist/elements/chunks/disclosure-CwoAkpMH.js +1 -0
- package/dist/elements/chunks/download-DJ06G3Bz.js +1 -0
- package/dist/elements/chunks/dropdown-BFg8ri_R.js +1 -0
- package/dist/elements/chunks/ellipsis-dlN6YvGw.js +1 -0
- package/dist/elements/chunks/engine-javascript-vq0WuIJl.js +141 -0
- package/dist/elements/chunks/external-link-DBX2lc_R.js +1 -0
- package/dist/elements/chunks/file-text-HfwUx4F9.js +1 -0
- package/dist/elements/chunks/file-tree-C6Toj71u.js +1 -0
- package/dist/elements/chunks/folder-MYuqa9Xp.js +1 -0
- package/dist/elements/chunks/github-dark-dimmed-DUshB20C.js +1 -0
- package/dist/elements/chunks/github-light-JYsPkUQd.js +1 -0
- package/dist/elements/chunks/hover-card-gE7iyXdW.js +1 -0
- package/dist/elements/chunks/html-CPZ3oZQ7.js +1 -0
- package/dist/elements/chunks/icon-Vqz4ivrY.js +1 -0
- package/dist/elements/chunks/index-BCRhi84a.js +1 -0
- package/dist/elements/chunks/info-B_toFS0l.js +1 -0
- package/dist/elements/chunks/input-gzbHYZvQ.js +1 -0
- package/dist/elements/chunks/javascript-C25yR2R2.js +1 -0
- package/dist/elements/chunks/json-DxJze_jm.js +1 -0
- package/dist/elements/chunks/kbd-n49c4KZm.js +1 -0
- package/dist/elements/chunks/link-CKPs9yM0.js +1 -0
- package/dist/elements/chunks/loader-q6MamGus.js +1 -0
- package/dist/elements/chunks/markdown-DBrcqq4S.js +64 -0
- package/dist/elements/chunks/message-CTqaYI0s.js +1 -0
- package/dist/elements/chunks/message-feedback-Cvzm03w0.js +1 -0
- package/dist/elements/chunks/message-square-CUg9eRCi.js +1 -0
- package/dist/elements/chunks/minimize-2-l2klxP6K.js +1 -0
- package/dist/elements/chunks/model-switcher-CmyjiHO1.js +1 -0
- package/dist/elements/chunks/overlay-C8sOYqjT.js +1 -0
- package/dist/elements/chunks/paperclip-42Ia7xHD.js +1 -0
- package/dist/elements/chunks/progress-bar-tzKMWAwO.js +1 -0
- package/dist/elements/chunks/prompt-suggestion-D3F6vP_A.js +1 -0
- package/dist/elements/chunks/reasoning-BJNmmyov.js +1 -0
- package/dist/elements/chunks/resizable-BRsk19qI.js +1 -0
- package/dist/elements/chunks/rotate-cw-BgcggLHC.js +1 -0
- package/dist/elements/chunks/scroll-area-CgGbFFbT.js +1 -0
- package/dist/elements/chunks/separator-8hM4GdHE.js +1 -0
- package/dist/elements/chunks/settings-CaUIYOg-.js +1 -0
- package/dist/elements/chunks/settings-group-CYjOVIZQ.js +1 -0
- package/dist/elements/chunks/share-BTYM3Ddt.js +1 -0
- package/dist/elements/chunks/skeleton-DsTYrPUe.js +1 -0
- package/dist/elements/chunks/slots-DkZ-Cmha.js +1 -0
- package/dist/elements/chunks/star-9R3LBQ9n.js +1 -0
- package/dist/elements/chunks/store-CYl5Y0_u.js +1 -0
- package/dist/elements/chunks/svelte--5p79yCD.js +1 -0
- package/dist/elements/chunks/text-shimmer-CaYGv8Se.js +1 -0
- package/dist/elements/chunks/textarea-NEr2SLcD.js +1 -0
- package/dist/elements/chunks/thumbs-up-DZYZkFfc.js +1 -0
- package/dist/elements/chunks/toast-store-ClxVZRcc.js +1 -0
- package/dist/elements/chunks/tool-CHZOmoe9.js +1 -0
- package/dist/elements/chunks/tooltip-WpHElELC.js +1 -0
- package/dist/elements/chunks/triangle-alert-BlS80PUg.js +1 -0
- package/dist/elements/chunks/tsx-B8rCNbgL.js +1 -0
- package/dist/elements/chunks/typescript-RycA9KXf.js +1 -0
- package/dist/elements/chunks/use-card-resolution-VSVoxDeJ.js +1 -0
- package/dist/elements/chunks/video-DxTPZqT8.js +1 -0
- package/dist/elements/chunks/vue-BmIZj4XD.js +1 -0
- package/dist/elements/chunks/x-C1qtndxn.js +1 -0
- package/dist/elements/coachmark.d.ts +1 -0
- package/dist/elements/coachmark.js +1 -0
- package/dist/elements/code-block.js +1 -0
- package/dist/elements/command.d.ts +1 -0
- package/dist/elements/command.js +1 -0
- package/dist/elements/compare.d.ts +1 -0
- package/dist/elements/compare.js +1 -0
- package/dist/elements/composer.d.ts +1 -0
- package/dist/elements/composer.js +1 -0
- package/dist/elements/confirm-card.js +1 -0
- package/dist/elements/context-meter.js +1 -0
- package/dist/elements/conversation-list.d.ts +1 -11
- package/dist/elements/conversation-list.js +1 -0
- package/dist/elements/default-input.d.ts +20 -9
- package/dist/elements/define.d.ts +11 -0
- package/dist/elements/dialog.d.ts +1 -0
- package/dist/elements/dialog.js +1 -0
- package/dist/elements/disclosure.d.ts +37 -0
- package/dist/elements/editable-label.d.ts +1 -0
- package/dist/elements/editable-label.js +1 -0
- package/dist/elements/embed.js +1 -0
- package/dist/elements/empty.js +1 -0
- package/dist/elements/feedback-bar.js +1 -0
- package/dist/elements/file-tree.js +1 -0
- package/dist/elements/file-upload.js +1 -0
- package/dist/elements/form.js +1 -0
- package/dist/elements/hover-card.d.ts +1 -0
- package/dist/elements/hover-card.js +1 -0
- package/dist/elements/icon.d.ts +1 -0
- package/dist/elements/icon.js +1 -0
- package/dist/elements/image.js +1 -0
- package/dist/elements/input.d.ts +1 -0
- package/dist/elements/input.js +1 -0
- package/dist/elements/kbd.d.ts +1 -0
- package/dist/elements/kbd.js +1 -0
- package/dist/elements/link-preview.js +1 -0
- package/dist/elements/loader.js +1 -0
- package/dist/elements/markdown.js +1 -0
- package/dist/elements/menu.d.ts +1 -0
- package/dist/elements/menu.js +1 -0
- package/dist/elements/message-skills.d.ts +0 -16
- package/dist/elements/message-skills.js +1 -0
- package/dist/elements/message.js +1 -0
- package/dist/elements/model-switcher.d.ts +1 -11
- package/dist/elements/model-switcher.js +1 -0
- package/dist/elements/nav.d.ts +1 -0
- package/dist/elements/nav.js +1 -0
- package/dist/elements/notice.d.ts +1 -0
- package/dist/elements/notice.js +1 -0
- package/dist/elements/pane-group.d.ts +1 -0
- package/dist/elements/pane-group.js +1 -0
- package/dist/elements/pane.d.ts +1 -0
- package/dist/elements/pane.js +1 -0
- package/dist/elements/popover.js +1 -0
- package/dist/elements/progress-bar.d.ts +1 -0
- package/dist/elements/progress-bar.js +1 -0
- package/dist/elements/prompt-dock.d.ts +1 -0
- package/dist/elements/prompt-dock.js +1 -0
- package/dist/elements/prompt-input.d.ts +1 -9
- package/dist/elements/prompt-input.js +1 -0
- package/dist/elements/prompt-suggestions.d.ts +0 -6
- package/dist/elements/prompt-suggestions.js +1 -0
- package/dist/elements/reasoning.js +1 -0
- package/dist/elements/register.d.ts +10 -0
- package/dist/elements/remote.js +1 -0
- package/dist/elements/resizable.d.ts +1 -17
- package/dist/elements/resizable.js +1 -0
- package/dist/elements/response-stream.js +14 -0
- package/dist/elements/screen.d.ts +1 -0
- package/dist/elements/screen.js +1 -0
- package/dist/elements/scroll-area.d.ts +1 -0
- package/dist/elements/scroll-area.js +1 -0
- package/dist/elements/scroll-button.js +1 -0
- package/dist/elements/search.d.ts +1 -0
- package/dist/elements/search.js +1 -0
- package/dist/elements/segmented.d.ts +1 -0
- package/dist/elements/segmented.js +1 -0
- package/dist/elements/separator.d.ts +1 -0
- package/dist/elements/separator.js +1 -0
- package/dist/elements/setting-item.d.ts +1 -0
- package/dist/elements/setting-item.js +1 -0
- package/dist/elements/settings-group.d.ts +1 -0
- package/dist/elements/settings-group.js +1 -0
- package/dist/elements/skeleton.d.ts +1 -0
- package/dist/elements/skeleton.js +1 -0
- package/dist/elements/slots.d.ts +176 -0
- package/dist/elements/source.d.ts +0 -17
- package/dist/elements/source.js +1 -0
- package/dist/elements/status.d.ts +1 -0
- package/dist/elements/status.js +1 -0
- package/dist/elements/switch.js +1 -0
- package/dist/elements/tabs.d.ts +1 -0
- package/dist/elements/tabs.js +1 -0
- package/dist/elements/tasks.js +1 -0
- package/dist/elements/text-shimmer.js +1 -0
- package/dist/elements/thinking-bar.js +1 -0
- package/dist/elements/toast.d.ts +1 -0
- package/dist/elements/toast.js +1 -0
- package/dist/elements/tool.js +1 -0
- package/dist/elements/tooltip.d.ts +1 -0
- package/dist/elements/tooltip.js +1 -0
- package/dist/elements/voice-input.js +1 -0
- package/dist/elements/voice-output.d.ts +1 -0
- package/dist/elements/voice-output.js +1 -0
- package/dist/elements.d.ts +772 -61
- package/dist/engine-javascript-C1x7zo1_.js +141 -0
- package/dist/index.d.ts +15 -2
- package/dist/index.js +14405 -9810
- package/dist/kai.es.js +1 -0
- package/dist/llms/llms-full.txt +1234 -107
- package/dist/llms/llms.txt +4 -4
- package/dist/mcp.es.js +217 -6
- package/dist/primitives/card-contract.d.ts +20 -4
- package/dist/primitives/card-recovery.d.ts +55 -0
- package/dist/primitives/composer-model.d.ts +22 -0
- package/dist/primitives/composer-triggers.d.ts +19 -0
- package/dist/primitives/create-kai-chat.d.ts +38 -0
- package/dist/primitives/message-feedback.d.ts +35 -0
- package/dist/primitives/toast-store.d.ts +118 -0
- package/dist/primitives/use-speech-recognition.d.ts +26 -0
- package/dist/react/index.d.ts +1166 -98
- package/dist/react/runtime.d.ts +9 -2
- package/dist/react/use-kai-chat.d.ts +41 -0
- package/dist/react.js +575 -186
- package/dist/register-impl-CYWGkgbI.js +141 -0
- package/dist/schemas/choice.schema.json +5 -0
- package/dist/schemas/tasks.schema.json +7 -2
- package/dist/state/index.d.ts +4 -0
- package/dist/state/messages.d.ts +11 -0
- package/dist/state/stream.d.ts +22 -0
- package/dist/state/suggestions.d.ts +4 -0
- package/dist/state.js +117 -0
- package/dist/theme.tokens.css +87 -0
- package/dist/types.d.ts +4 -0
- package/dist/ui/agent-card.d.ts +61 -0
- package/dist/ui/button.d.ts +5 -2
- package/dist/ui/card.d.ts +61 -0
- package/dist/ui/collapsible.d.ts +15 -1
- package/dist/ui/command.d.ts +33 -0
- package/dist/ui/dialog.d.ts +42 -0
- package/dist/ui/dropdown.d.ts +95 -1
- package/dist/ui/editable-label.d.ts +26 -0
- package/dist/ui/hover-card.d.ts +13 -1
- package/dist/ui/icon.d.ts +18 -0
- package/dist/ui/input.d.ts +33 -0
- package/dist/ui/kbd.d.ts +21 -0
- package/dist/ui/nav.d.ts +62 -0
- package/dist/ui/notice.d.ts +31 -0
- package/dist/ui/overlay.d.ts +12 -0
- package/dist/ui/pane-grid.d.ts +58 -0
- package/dist/ui/pane-group.d.ts +75 -0
- package/dist/ui/pane.d.ts +78 -0
- package/dist/ui/popover.d.ts +11 -1
- package/dist/ui/progress-bar.d.ts +23 -0
- package/dist/ui/prompt-dock.d.ts +96 -0
- package/dist/ui/resizable.d.ts +12 -0
- package/dist/ui/scroll-area.d.ts +4 -0
- package/dist/ui/segmented.d.ts +28 -0
- package/dist/ui/settings-group.d.ts +32 -0
- package/dist/ui/skeleton.d.ts +12 -0
- package/dist/ui/stat.d.ts +16 -0
- package/dist/ui/status.d.ts +13 -0
- package/dist/ui/switch.d.ts +8 -1
- package/dist/ui/tabs.d.ts +35 -0
- package/dist/ui/tooltip.d.ts +20 -1
- package/frameworks/react/index.tsx +1100 -163
- package/frameworks/react/runtime.tsx +30 -1
- package/frameworks/react/use-kai-chat.tsx +87 -0
- package/llms-full.txt +1234 -107
- package/llms.txt +4 -4
- package/package.json +36 -12
- package/src/agent-tooling/mcp/manifest.ts +14 -0
- package/src/agent-tooling/mcp/tools/debug.ts +194 -6
- package/src/agent-tooling/mcp/tools/reference.ts +32 -0
- package/src/agent-tooling/mcp/tools/scaffold.ts +162 -1
- package/src/components/artifact.tsx +98 -13
- package/src/components/attachment-types.ts +13 -0
- package/src/components/attachments.tsx +4 -14
- package/src/components/card.tsx +109 -15
- package/src/components/chain-of-thought.tsx +210 -1
- package/src/components/chat-scope-picker.tsx +13 -3
- package/src/components/chat-thread.tsx +238 -137
- package/src/components/choice-card.tsx +136 -15
- package/src/components/coachmark.tsx +245 -0
- package/src/components/component-meta.json +921 -108
- package/src/components/composer-dom.ts +159 -0
- package/src/components/composer-highlight.ts +242 -0
- package/src/components/composer-history.ts +82 -0
- package/src/components/composer.tsx +979 -0
- package/src/components/confirm-card.tsx +69 -2
- package/src/components/conversation-item.tsx +69 -7
- package/src/components/conversation-list.tsx +134 -37
- package/src/components/dismissed-stub.tsx +80 -0
- package/src/components/file-tree.tsx +197 -47
- package/src/components/form-widgets.tsx +9 -7
- package/src/components/form.tsx +161 -20
- package/src/components/image.tsx +3 -5
- package/src/components/link-preview.tsx +5 -4
- package/src/components/markdown.tsx +5 -2
- package/src/components/message.tsx +174 -14
- package/src/components/model-switcher.tsx +19 -4
- package/src/components/prompt-input.tsx +46 -75
- package/src/components/prompt-suggestion.tsx +48 -16
- package/src/components/reasoning.tsx +29 -6
- package/src/components/response-compare-types.ts +127 -0
- package/src/components/response-compare.tsx +460 -0
- package/src/components/screen.tsx +176 -0
- package/src/components/tasks-card.tsx +374 -23
- package/src/components/toast.tsx +486 -0
- package/src/components/tool-types.ts +10 -0
- package/src/components/tool.tsx +22 -16
- package/src/components/use-card-resolution.ts +24 -8
- package/src/components/voice-input.tsx +102 -19
- package/src/components/voice-output.tsx +202 -0
- package/src/elements/agent-card.tsx +67 -0
- package/src/elements/artifact.tsx +53 -4
- package/src/elements/attachments.tsx +1 -0
- package/src/elements/autoloader.ts +89 -0
- package/src/elements/avatar.tsx +33 -0
- package/src/elements/badge.tsx +32 -0
- package/src/elements/button.tsx +126 -0
- package/src/elements/card-media.jpg +0 -0
- package/src/elements/card.tsx +124 -31
- package/src/elements/cards.tsx +81 -7
- package/src/elements/chain-of-thought.tsx +77 -32
- package/src/elements/chat-scope-picker.tsx +35 -8
- package/src/elements/chat-types.ts +9 -2
- package/src/elements/chat-workspace.tsx +157 -43
- package/src/elements/chat.tsx +49 -25
- package/src/elements/choice.tsx +71 -19
- package/src/elements/coachmark.tsx +90 -0
- package/src/elements/command.tsx +209 -0
- package/src/elements/compare.tsx +110 -0
- package/src/elements/compiled.css +1 -1
- package/src/elements/composer.tsx +151 -0
- package/src/elements/confirm-card.tsx +36 -11
- package/src/elements/conversation-list.tsx +80 -11
- package/src/elements/default-input.tsx +75 -53
- package/src/elements/define.tsx +47 -6
- package/src/elements/dialog.tsx +98 -0
- package/src/elements/disclosure.ts +73 -0
- package/src/elements/editable-label.tsx +125 -0
- package/src/elements/element-manifest.json +310 -0
- package/src/elements/element-meta.json +5954 -1605
- package/src/elements/element-types.d.ts +771 -60
- package/src/elements/file-tree.tsx +12 -2
- package/src/elements/file-upload.tsx +1 -1
- package/src/elements/form.tsx +54 -11
- package/src/elements/hover-card.tsx +80 -0
- package/src/elements/icon-names.json +48 -0
- package/src/elements/icon.tsx +41 -0
- package/src/elements/input.tsx +203 -0
- package/src/elements/kbd.tsx +45 -0
- package/src/elements/menu.tsx +217 -0
- package/src/elements/message.tsx +84 -55
- package/src/elements/model-switcher.tsx +27 -1
- package/src/elements/nav.tsx +87 -0
- package/src/elements/notice.tsx +53 -0
- package/src/elements/pane-group.tsx +119 -0
- package/src/elements/pane.tsx +129 -0
- package/src/elements/popover.tsx +39 -17
- package/src/elements/progress-bar.tsx +39 -0
- package/src/elements/prompt-dock.tsx +81 -0
- package/src/elements/prompt-input.tsx +112 -63
- package/src/elements/prompt-suggestions.tsx +25 -9
- package/src/elements/reasoning.tsx +30 -9
- package/src/elements/register-impl.ts +41 -3
- package/src/elements/register.ts +20 -3
- package/src/elements/remote.tsx +4 -0
- package/src/elements/resizable.tsx +48 -11
- package/src/elements/screen.tsx +90 -0
- package/src/elements/scroll-area.tsx +33 -0
- package/src/elements/search.tsx +180 -0
- package/src/elements/segmented.tsx +135 -0
- package/src/elements/separator.tsx +36 -0
- package/src/elements/setting-item.tsx +50 -0
- package/src/elements/settings-group.tsx +37 -0
- package/src/elements/skeleton.tsx +45 -0
- package/src/elements/slots.ts +607 -0
- package/src/elements/source.tsx +13 -6
- package/src/elements/status.tsx +42 -0
- package/src/elements/styles.css +19 -0
- package/src/elements/switch.tsx +89 -14
- package/src/elements/tabs.tsx +95 -0
- package/src/elements/tasks.tsx +70 -14
- package/src/elements/toast.tsx +89 -0
- package/src/elements/tool.tsx +43 -9
- package/src/elements/tooltip.tsx +85 -0
- package/src/elements/video-poster.jpg +0 -0
- package/src/elements/voice-input.tsx +66 -16
- package/src/elements/voice-output.tsx +69 -0
- package/src/index.ts +35 -2
- package/src/primitives/card-contract.ts +14 -5
- package/src/primitives/card-recovery.ts +149 -0
- package/src/primitives/card-routing.ts +3 -0
- package/src/primitives/card-schemas/choice.schema.json +5 -0
- package/src/primitives/card-schemas/tasks.schema.json +7 -2
- package/src/primitives/composer-model.ts +49 -0
- package/src/primitives/composer-triggers.ts +35 -0
- package/src/primitives/create-kai-chat.ts +66 -0
- package/src/primitives/message-feedback.ts +123 -0
- package/src/primitives/toast-store.ts +276 -0
- package/src/primitives/use-speech-recognition.ts +135 -0
- package/src/state/index.ts +6 -0
- package/src/state/messages.ts +36 -0
- package/src/state/stream.ts +92 -0
- package/src/state/suggestions.ts +9 -0
- package/src/types.ts +4 -0
- package/src/ui/agent-card.tsx +212 -0
- package/src/ui/button.tsx +16 -5
- package/src/ui/card.tsx +245 -0
- package/src/ui/collapsible.tsx +30 -4
- package/src/ui/command.tsx +99 -0
- package/src/ui/dialog.tsx +217 -0
- package/src/ui/dropdown.tsx +375 -13
- package/src/ui/editable-label.tsx +112 -0
- package/src/ui/hover-card.tsx +28 -5
- package/src/ui/icon.tsx +110 -0
- package/src/ui/input.tsx +132 -0
- package/src/ui/kbd.tsx +118 -0
- package/src/ui/nav.tsx +282 -0
- package/src/ui/notice.tsx +84 -0
- package/src/ui/overlay.tsx +108 -2
- package/src/ui/pane-grid.tsx +116 -0
- package/src/ui/pane-group.tsx +280 -0
- package/src/ui/pane.tsx +193 -0
- package/src/ui/popover.tsx +16 -2
- package/src/ui/progress-bar.tsx +83 -0
- package/src/ui/prompt-dock.tsx +145 -0
- package/src/ui/resizable.tsx +69 -1
- package/src/ui/scroll-area.tsx +14 -3
- package/src/ui/segmented.tsx +109 -0
- package/src/ui/settings-group.tsx +67 -0
- package/src/ui/skeleton.tsx +62 -5
- package/src/ui/stat.tsx +41 -0
- package/src/ui/status.tsx +48 -0
- package/src/ui/switch.tsx +49 -23
- package/src/ui/tabs.tsx +168 -0
- package/src/ui/tooltip.tsx +57 -7
- package/theme.css +113 -0
- package/dist/components/slash-command.d.ts +0 -15
- package/dist/kitn-chat.es.js +0 -1
- package/dist/register-impl-wCsFPoh9.js +0 -77
- package/dist/register-ujhr1nBS.js +0 -1
- package/src/components/slash-command.tsx +0 -232
- package/src/elements/framework-usage.json +0 -563
- /package/dist/{kitn-chat-provider.d.ts → kai-provider.d.ts} +0 -0
- /package/dist/{kitn-chat-provider.es.js → kai-provider.es.js} +0 -0
|
@@ -1,20 +1,30 @@
|
|
|
1
1
|
import { type JSX, Show, splitProps } from 'solid-js';
|
|
2
2
|
import { cn } from '../utils/cn';
|
|
3
3
|
import { Button } from '../ui/button';
|
|
4
|
+
import { renderIcon } from '../ui/icon';
|
|
4
5
|
|
|
5
6
|
export interface PromptSuggestionProps extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {
|
|
6
7
|
children: JSX.Element | string;
|
|
7
8
|
variant?: 'outline' | 'ghost' | 'default';
|
|
8
|
-
|
|
9
|
+
/** Row height for the `list` layout: `'md'` (default) or `'lg'` for taller
|
|
10
|
+
* rows (more vertical padding). Chips/block/highlight are unaffected. */
|
|
11
|
+
size?: 'md' | 'lg';
|
|
12
|
+
/** Optional leading icon (named icon, image URL/data-URI, or text). */
|
|
13
|
+
icon?: string;
|
|
9
14
|
highlight?: string;
|
|
10
15
|
/** Render as a full-width, left-aligned list row (the "suggested questions"
|
|
11
16
|
* idiom) instead of a rounded pill. Wraps long text. Ignored in highlight
|
|
12
17
|
* mode, which is always a list row. */
|
|
13
18
|
block?: boolean;
|
|
19
|
+
/** Render as a full-width "Ideas for you" list row: a leading icon, a
|
|
20
|
+
* left-aligned label, and a hover background. Like `block`, but keeps the
|
|
21
|
+
* leading icon. Ignored in highlight mode. */
|
|
22
|
+
list?: boolean;
|
|
14
23
|
}
|
|
15
24
|
|
|
16
25
|
function PromptSuggestion(props: PromptSuggestionProps) {
|
|
17
|
-
const [local, rest] = splitProps(props, ['children', 'variant', 'size', 'class', 'highlight', 'block']);
|
|
26
|
+
const [local, rest] = splitProps(props, ['children', 'variant', 'size', 'class', 'icon', 'highlight', 'block', 'list']);
|
|
27
|
+
const Icon = () => <Show when={local.icon}>{renderIcon(local.icon, { class: 'size-3.5 shrink-0' })}</Show>;
|
|
18
28
|
|
|
19
29
|
const isHighlightMode = () => local.highlight !== undefined && local.highlight.trim() !== '';
|
|
20
30
|
const content = () => typeof local.children === 'string' ? local.children : '';
|
|
@@ -24,29 +34,51 @@ function PromptSuggestion(props: PromptSuggestionProps) {
|
|
|
24
34
|
when={isHighlightMode()}
|
|
25
35
|
fallback={
|
|
26
36
|
<Show
|
|
27
|
-
when={local.
|
|
37
|
+
when={local.list}
|
|
28
38
|
fallback={
|
|
29
|
-
<
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
39
|
+
<Show
|
|
40
|
+
when={local.block}
|
|
41
|
+
fallback={
|
|
42
|
+
<Button
|
|
43
|
+
variant={local.variant ?? 'outline'}
|
|
44
|
+
size="lg"
|
|
45
|
+
class={cn('rounded-full', local.class)}
|
|
46
|
+
{...rest}
|
|
47
|
+
>
|
|
48
|
+
<Icon />
|
|
49
|
+
{local.children}
|
|
50
|
+
</Button>
|
|
51
|
+
}
|
|
34
52
|
>
|
|
35
|
-
|
|
36
|
-
|
|
53
|
+
<Button
|
|
54
|
+
variant={local.variant ?? 'outline'}
|
|
55
|
+
size="md"
|
|
56
|
+
class={cn(
|
|
57
|
+
'h-auto w-full cursor-pointer justify-start rounded-xl px-4 py-2.5',
|
|
58
|
+
'text-left text-sm leading-snug whitespace-normal text-pretty',
|
|
59
|
+
local.class,
|
|
60
|
+
)}
|
|
61
|
+
{...rest}
|
|
62
|
+
>
|
|
63
|
+
{local.children}
|
|
64
|
+
</Button>
|
|
65
|
+
</Show>
|
|
37
66
|
}
|
|
38
67
|
>
|
|
39
68
|
<Button
|
|
40
|
-
variant={local.variant ?? '
|
|
41
|
-
size=
|
|
69
|
+
variant={local.variant ?? 'ghost'}
|
|
70
|
+
size="md"
|
|
42
71
|
class={cn(
|
|
43
|
-
'h-auto w-full cursor-pointer justify-start rounded-xl px-
|
|
72
|
+
'group h-auto w-full cursor-pointer items-center justify-start gap-2.5 rounded-xl px-3',
|
|
73
|
+
local.size === 'lg' ? 'py-3.5' : 'py-2.5',
|
|
44
74
|
'text-left text-sm leading-snug whitespace-normal text-pretty',
|
|
75
|
+
'hover:bg-accent',
|
|
45
76
|
local.class,
|
|
46
77
|
)}
|
|
47
78
|
{...rest}
|
|
48
79
|
>
|
|
49
|
-
|
|
80
|
+
<Icon />
|
|
81
|
+
<span class="min-w-0 flex-1">{local.children}</span>
|
|
50
82
|
</Button>
|
|
51
83
|
</Show>
|
|
52
84
|
}
|
|
@@ -56,7 +88,7 @@ function PromptSuggestion(props: PromptSuggestionProps) {
|
|
|
56
88
|
fallback={
|
|
57
89
|
<Button
|
|
58
90
|
variant={local.variant ?? 'ghost'}
|
|
59
|
-
size=
|
|
91
|
+
size="sm"
|
|
60
92
|
class={cn(
|
|
61
93
|
'w-full cursor-pointer justify-start rounded-xl py-2',
|
|
62
94
|
'hover:bg-accent',
|
|
@@ -70,7 +102,7 @@ function PromptSuggestion(props: PromptSuggestionProps) {
|
|
|
70
102
|
>
|
|
71
103
|
<Button
|
|
72
104
|
variant={local.variant ?? 'ghost'}
|
|
73
|
-
size=
|
|
105
|
+
size="sm"
|
|
74
106
|
class={cn(
|
|
75
107
|
'w-full cursor-pointer justify-start gap-0 rounded-xl py-2',
|
|
76
108
|
'hover:bg-accent',
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type JSX, splitProps, createSignal, createContext, useContext, createEffect, onCleanup, Show } from 'solid-js';
|
|
1
|
+
import { type JSX, type Accessor, splitProps, createSignal, createContext, useContext, createEffect, onCleanup, Show } from 'solid-js';
|
|
2
2
|
import { cn } from '../utils/cn';
|
|
3
3
|
import { ChevronDown } from 'lucide-solid';
|
|
4
4
|
import { Markdown } from './markdown';
|
|
@@ -7,8 +7,14 @@ import { observeContentHeight } from '../primitives/use-resize-observer';
|
|
|
7
7
|
interface ReasoningContextValue {
|
|
8
8
|
isOpen: () => boolean;
|
|
9
9
|
onOpenChange: (open: boolean) => void;
|
|
10
|
+
disabled: () => boolean;
|
|
10
11
|
}
|
|
11
12
|
|
|
13
|
+
/** Imperative open controller, handed to a parent (the kai-reasoning facade) via
|
|
14
|
+
* `controllerRef` so it can drive/observe open state — mirrors
|
|
15
|
+
* CollapsibleController/HoverCardController. */
|
|
16
|
+
export interface ReasoningController { open: Accessor<boolean>; setOpen: (v: boolean) => void; }
|
|
17
|
+
|
|
12
18
|
const ReasoningContext = createContext<ReasoningContextValue>();
|
|
13
19
|
|
|
14
20
|
function useReasoningContext() {
|
|
@@ -25,19 +31,30 @@ export interface ReasoningProps {
|
|
|
25
31
|
children: JSX.Element;
|
|
26
32
|
class?: string;
|
|
27
33
|
open?: boolean;
|
|
34
|
+
/** Initial open state (uncontrolled seed). */
|
|
35
|
+
defaultOpen?: boolean;
|
|
28
36
|
onOpenChange?: (open: boolean) => void;
|
|
29
37
|
isStreaming?: boolean;
|
|
38
|
+
/** Gate the trigger — programmatic control via the controller still works. */
|
|
39
|
+
disabled?: boolean;
|
|
40
|
+
/** Receive the open controller (open accessor + setOpen) once mounted. */
|
|
41
|
+
controllerRef?: (api: ReasoningController) => void;
|
|
30
42
|
}
|
|
31
43
|
|
|
32
44
|
function Reasoning(props: ReasoningProps) {
|
|
33
|
-
const [local] = splitProps(props, ['children', 'class', 'open', 'onOpenChange', 'isStreaming']);
|
|
34
|
-
const [internalOpen, setInternalOpen] = createSignal(false);
|
|
45
|
+
const [local] = splitProps(props, ['children', 'class', 'open', 'defaultOpen', 'onOpenChange', 'isStreaming', 'disabled', 'controllerRef']);
|
|
46
|
+
const [internalOpen, setInternalOpen] = createSignal(local.defaultOpen ?? false);
|
|
35
47
|
const [wasAutoOpened, setWasAutoOpened] = createSignal(false);
|
|
36
48
|
|
|
37
49
|
const isControlled = () => local.open !== undefined;
|
|
38
50
|
const isOpen = () => (isControlled() ? local.open! : internalOpen());
|
|
51
|
+
const disabled = () => !!local.disabled;
|
|
39
52
|
|
|
53
|
+
// The single open-mutate path, shared by the trigger and the imperative
|
|
54
|
+
// controller. In controlled mode we don't touch internal state; the consumer
|
|
55
|
+
// reflects via the `open` prop and observes via onOpenChange.
|
|
40
56
|
const handleOpenChange = (newOpen: boolean) => {
|
|
57
|
+
if (isOpen() === newOpen) return;
|
|
41
58
|
if (!isControlled()) {
|
|
42
59
|
setInternalOpen(newOpen);
|
|
43
60
|
}
|
|
@@ -56,8 +73,13 @@ function Reasoning(props: ReasoningProps) {
|
|
|
56
73
|
}
|
|
57
74
|
});
|
|
58
75
|
|
|
76
|
+
// Hand the controller up once. setOpen routes through handleOpenChange so it
|
|
77
|
+
// notifies onOpenChange and respects controlled/uncontrolled mode. Not gated
|
|
78
|
+
// by disabled — the facade's wireDisclosure applies disabled-gating itself.
|
|
79
|
+
local.controllerRef?.({ open: isOpen, setOpen: handleOpenChange });
|
|
80
|
+
|
|
59
81
|
return (
|
|
60
|
-
<ReasoningContext.Provider value={{ isOpen, onOpenChange: handleOpenChange }}>
|
|
82
|
+
<ReasoningContext.Provider value={{ isOpen, onOpenChange: handleOpenChange, disabled }}>
|
|
61
83
|
<div class={local.class}>{local.children}</div>
|
|
62
84
|
</ReasoningContext.Provider>
|
|
63
85
|
);
|
|
@@ -71,12 +93,13 @@ export interface ReasoningTriggerProps extends JSX.ButtonHTMLAttributes<HTMLButt
|
|
|
71
93
|
|
|
72
94
|
function ReasoningTrigger(props: ReasoningTriggerProps) {
|
|
73
95
|
const [local, rest] = splitProps(props, ['children', 'class']);
|
|
74
|
-
const { isOpen, onOpenChange } = useReasoningContext();
|
|
96
|
+
const { isOpen, onOpenChange, disabled } = useReasoningContext();
|
|
75
97
|
|
|
76
98
|
return (
|
|
77
99
|
<button
|
|
78
100
|
class={cn('flex cursor-pointer items-center gap-2 text-meta', local.class)}
|
|
79
|
-
|
|
101
|
+
disabled={disabled() || undefined}
|
|
102
|
+
onClick={() => { if (!disabled()) onOpenChange(!isOpen()); }}
|
|
80
103
|
{...rest}
|
|
81
104
|
>
|
|
82
105
|
<span class="text-primary">{local.children}</span>
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
// Types + pure helpers for the dual-response comparison card (`ResponseCompare` /
|
|
2
|
+
// `<kai-compare>`). A compare presents exactly TWO assistant candidates for the
|
|
3
|
+
// same prompt side-by-side; the user picks the better one (a COMMIT, not a
|
|
4
|
+
// Submit), which the consumer turns into a `(prompt, chosen, rejected)`
|
|
5
|
+
// preference pair. Kept framework-agnostic and DOM-free so it unit-tests in
|
|
6
|
+
// isolation.
|
|
7
|
+
import type { ToolPart } from './tool';
|
|
8
|
+
import type { AttachmentData } from './attachments';
|
|
9
|
+
|
|
10
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
11
|
+
// Types
|
|
12
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
13
|
+
|
|
14
|
+
/** One assistant response in a comparison. Rendered identically to an assistant
|
|
15
|
+
* message (reasoning + tools + attachments + markdown content) via `MessageBody`. */
|
|
16
|
+
export interface CompareCandidate {
|
|
17
|
+
/** Stable id, unique within the pair; echoed back in the selection. */
|
|
18
|
+
id: string;
|
|
19
|
+
/** The response text/markdown. */
|
|
20
|
+
content: string;
|
|
21
|
+
/** Optional collapsible reasoning block. */
|
|
22
|
+
reasoning?: { text: string; label?: string };
|
|
23
|
+
/** Tool-call parts rendered above the content. */
|
|
24
|
+
tools?: ToolPart[];
|
|
25
|
+
/** Inline attachment previews rendered above the content. */
|
|
26
|
+
attachments?: AttachmentData[];
|
|
27
|
+
/** Optional short column label (e.g. "A" / "B" / "Concise"). */
|
|
28
|
+
label?: string;
|
|
29
|
+
/** Optional model name shown as a sub-label. */
|
|
30
|
+
model?: string;
|
|
31
|
+
/** When true this candidate is still streaming — its pick control is disabled
|
|
32
|
+
* and a per-column shimmer shows until it (and its sibling) settle. */
|
|
33
|
+
streaming?: boolean;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** The two-candidate tuple. Enforced at the type level; validated at runtime by
|
|
37
|
+
* `normalizeCandidates`. */
|
|
38
|
+
export type ComparePair = [CompareCandidate, CompareCandidate];
|
|
39
|
+
|
|
40
|
+
/** How the card collapses once the user picks. `'winner'` (default) shows just the
|
|
41
|
+
* chosen candidate's body; `'none'` keeps both columns but marks the choice. */
|
|
42
|
+
export type CompareCollapse = 'winner' | 'none';
|
|
43
|
+
|
|
44
|
+
/** The compare definition (set as the `data` JS property on `<kai-compare>`). */
|
|
45
|
+
export interface ResponseCompareData {
|
|
46
|
+
/** Optional prompt/question shown above the two columns. */
|
|
47
|
+
prompt?: string;
|
|
48
|
+
/** Exactly two candidates: [A, B]. */
|
|
49
|
+
candidates: ComparePair;
|
|
50
|
+
/** Collapse behaviour after a pick. Default `'winner'`. */
|
|
51
|
+
collapse?: CompareCollapse;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** Emitted (and re-hydratable) when the user picks. The consumer pairs
|
|
55
|
+
* `(prompt, chosenId, rejectedIds)` for preference capture / RLHF. */
|
|
56
|
+
export interface CompareSelection {
|
|
57
|
+
/** The id of the chosen candidate. */
|
|
58
|
+
chosenId: string;
|
|
59
|
+
/** The id(s) of the rejected candidate(s) — for a pair, the other one. */
|
|
60
|
+
rejectedIds: string[];
|
|
61
|
+
/** Epoch ms when the pick was made. */
|
|
62
|
+
at?: number;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
66
|
+
// Pure helpers (unit-tested in isolation).
|
|
67
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Validate + normalize the candidate list. A compare requires EXACTLY two
|
|
71
|
+
* candidates with unique, non-empty string ids. Returns the usable pair, or an
|
|
72
|
+
* error message when the definition is unusable (rendered as an inline error /
|
|
73
|
+
* emitted as a `kai-error`). Modeled on `normalizeOptions`.
|
|
74
|
+
*/
|
|
75
|
+
export function normalizeCandidates(candidates: unknown): {
|
|
76
|
+
candidates: ComparePair | null;
|
|
77
|
+
error?: string;
|
|
78
|
+
} {
|
|
79
|
+
if (!Array.isArray(candidates)) {
|
|
80
|
+
return { candidates: null, error: "This comparison couldn't be displayed." };
|
|
81
|
+
}
|
|
82
|
+
if (candidates.length !== 2) {
|
|
83
|
+
return {
|
|
84
|
+
candidates: null,
|
|
85
|
+
error: `A comparison needs exactly two candidates (got ${candidates.length}).`,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
const out: CompareCandidate[] = [];
|
|
89
|
+
const seen = new Set<string>();
|
|
90
|
+
for (const c of candidates) {
|
|
91
|
+
if (!c || typeof c !== 'object') {
|
|
92
|
+
return { candidates: null, error: "This comparison couldn't be displayed." };
|
|
93
|
+
}
|
|
94
|
+
const cand = c as Partial<CompareCandidate>;
|
|
95
|
+
if (typeof cand.id !== 'string' || cand.id.length === 0) {
|
|
96
|
+
return { candidates: null, error: 'Each candidate needs a non-empty id.' };
|
|
97
|
+
}
|
|
98
|
+
if (seen.has(cand.id)) {
|
|
99
|
+
return { candidates: null, error: `Duplicate candidate id "${cand.id}".` };
|
|
100
|
+
}
|
|
101
|
+
seen.add(cand.id);
|
|
102
|
+
out.push({
|
|
103
|
+
id: cand.id,
|
|
104
|
+
content: typeof cand.content === 'string' ? cand.content : '',
|
|
105
|
+
reasoning: cand.reasoning,
|
|
106
|
+
tools: Array.isArray(cand.tools) ? cand.tools : undefined,
|
|
107
|
+
attachments: Array.isArray(cand.attachments) ? cand.attachments : undefined,
|
|
108
|
+
label: typeof cand.label === 'string' ? cand.label : undefined,
|
|
109
|
+
model: typeof cand.model === 'string' ? cand.model : undefined,
|
|
110
|
+
streaming: cand.streaming === true,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
return { candidates: [out[0], out[1]] };
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/** Build the selection payload for choosing `chosenId` out of the pair (the other
|
|
117
|
+
* candidate is the rejected one). Stamps `at` with the current time. */
|
|
118
|
+
export function buildSelection(pair: ComparePair, chosenId: string): CompareSelection {
|
|
119
|
+
const rejectedIds = pair.filter((c) => c.id !== chosenId).map((c) => c.id);
|
|
120
|
+
return { chosenId, rejectedIds, at: Date.now() };
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/** Whether any candidate in the pair is still streaming (pick stays disabled). */
|
|
124
|
+
export function isAnyStreaming(pair: ComparePair | null): boolean {
|
|
125
|
+
if (!pair) return false;
|
|
126
|
+
return pair.some((c) => c.streaming === true);
|
|
127
|
+
}
|