@adea-ai/ui 0.140.0 → 0.142.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/dist/components/composites/appearance-editor/appearance-editor.js +2 -2
- package/dist/components/composites/appearance-editor/appearance-editor.js.map +1 -1
- package/dist/components/composites/catalog-browser/catalog-browser-group.js +1 -1
- package/dist/components/composites/chain-of-thought/chain-of-thought.d.ts +56 -0
- package/dist/components/composites/chain-of-thought/chain-of-thought.d.ts.map +1 -0
- package/dist/components/composites/chain-of-thought/chain-of-thought.js +117 -0
- package/dist/components/composites/chain-of-thought/chain-of-thought.js.map +1 -0
- package/dist/components/composites/chain-of-thought/index.d.ts +2 -0
- package/dist/components/composites/chain-of-thought/index.d.ts.map +1 -0
- package/dist/components/composites/chain-of-thought/index.js +2 -0
- package/dist/components/composites/chat/chat.d.ts +67 -0
- package/dist/components/composites/chat/chat.d.ts.map +1 -0
- package/dist/components/composites/chat/chat.js +179 -0
- package/dist/components/composites/chat/chat.js.map +1 -0
- package/dist/components/composites/chat/index.d.ts +2 -0
- package/dist/components/composites/chat/index.d.ts.map +1 -0
- package/dist/components/composites/chat/index.js +2 -0
- package/dist/components/composites/checkpoint/checkpoint-model.d.ts +34 -0
- package/dist/components/composites/checkpoint/checkpoint-model.d.ts.map +1 -0
- package/dist/components/composites/checkpoint/checkpoint-model.js +48 -0
- package/dist/components/composites/checkpoint/checkpoint-model.js.map +1 -0
- package/dist/components/composites/checkpoint/checkpoint.d.ts +48 -0
- package/dist/components/composites/checkpoint/checkpoint.d.ts.map +1 -0
- package/dist/components/composites/checkpoint/checkpoint.js +160 -0
- package/dist/components/composites/checkpoint/checkpoint.js.map +1 -0
- package/dist/components/composites/checkpoint/index.d.ts +3 -0
- package/dist/components/composites/checkpoint/index.d.ts.map +1 -0
- package/dist/components/composites/checkpoint/index.js +3 -0
- package/dist/components/composites/confirmation/confirmation-model.d.ts +45 -0
- package/dist/components/composites/confirmation/confirmation-model.d.ts.map +1 -0
- package/dist/components/composites/confirmation/confirmation-model.js +51 -0
- package/dist/components/composites/confirmation/confirmation-model.js.map +1 -0
- package/dist/components/composites/confirmation/confirmation.d.ts +72 -0
- package/dist/components/composites/confirmation/confirmation.d.ts.map +1 -0
- package/dist/components/composites/confirmation/confirmation.js +300 -0
- package/dist/components/composites/confirmation/confirmation.js.map +1 -0
- package/dist/components/composites/confirmation/index.d.ts +3 -0
- package/dist/components/composites/confirmation/index.d.ts.map +1 -0
- package/dist/components/composites/confirmation/index.js +3 -0
- package/dist/components/composites/context/context-model.d.ts +69 -0
- package/dist/components/composites/context/context-model.d.ts.map +1 -0
- package/dist/components/composites/context/context-model.js +122 -0
- package/dist/components/composites/context/context-model.js.map +1 -0
- package/dist/components/composites/context/context.d.ts +38 -0
- package/dist/components/composites/context/context.d.ts.map +1 -0
- package/dist/components/composites/context/context.js +234 -0
- package/dist/components/composites/context/context.js.map +1 -0
- package/dist/components/composites/context/index.d.ts +3 -0
- package/dist/components/composites/context/index.d.ts.map +1 -0
- package/dist/components/composites/context/index.js +3 -0
- package/dist/components/composites/file-tree/build-file-tree.d.ts +138 -0
- package/dist/components/composites/file-tree/build-file-tree.d.ts.map +1 -0
- package/dist/components/composites/file-tree/build-file-tree.js +325 -0
- package/dist/components/composites/file-tree/build-file-tree.js.map +1 -0
- package/dist/components/composites/file-tree/file-tree.d.ts +74 -0
- package/dist/components/composites/file-tree/file-tree.d.ts.map +1 -0
- package/dist/components/composites/file-tree/file-tree.js +389 -0
- package/dist/components/composites/file-tree/file-tree.js.map +1 -0
- package/dist/components/composites/file-tree/index.d.ts +3 -0
- package/dist/components/composites/file-tree/index.d.ts.map +1 -0
- package/dist/components/composites/file-tree/index.js +3 -0
- package/dist/components/composites/inline-citation/citation.d.ts +37 -0
- package/dist/components/composites/inline-citation/citation.d.ts.map +1 -0
- package/dist/components/composites/inline-citation/citation.js +52 -0
- package/dist/components/composites/inline-citation/citation.js.map +1 -0
- package/dist/components/composites/inline-citation/index.d.ts +3 -0
- package/dist/components/composites/inline-citation/index.d.ts.map +1 -0
- package/dist/components/composites/inline-citation/index.js +3 -0
- package/dist/components/composites/inline-citation/inline-citation.d.ts +64 -0
- package/dist/components/composites/inline-citation/inline-citation.d.ts.map +1 -0
- package/dist/components/composites/inline-citation/inline-citation.js +272 -0
- package/dist/components/composites/inline-citation/inline-citation.js.map +1 -0
- package/dist/components/composites/message-scroller/index.d.ts +3 -0
- package/dist/components/composites/message-scroller/index.d.ts.map +1 -0
- package/dist/components/composites/message-scroller/index.js +3 -0
- package/dist/components/composites/message-scroller/message-scroller.d.ts +55 -0
- package/dist/components/composites/message-scroller/message-scroller.d.ts.map +1 -0
- package/dist/components/composites/message-scroller/message-scroller.js +201 -0
- package/dist/components/composites/message-scroller/message-scroller.js.map +1 -0
- package/dist/components/composites/message-scroller/scroll-anchor.d.ts +66 -0
- package/dist/components/composites/message-scroller/scroll-anchor.d.ts.map +1 -0
- package/dist/components/composites/message-scroller/scroll-anchor.js +122 -0
- package/dist/components/composites/message-scroller/scroll-anchor.js.map +1 -0
- package/dist/components/composites/model-selector/index.d.ts +3 -0
- package/dist/components/composites/model-selector/index.d.ts.map +1 -0
- package/dist/components/composites/model-selector/index.js +3 -0
- package/dist/components/composites/model-selector/model-selector.d.ts +55 -0
- package/dist/components/composites/model-selector/model-selector.d.ts.map +1 -0
- package/dist/components/composites/model-selector/model-selector.js +490 -0
- package/dist/components/composites/model-selector/model-selector.js.map +1 -0
- package/dist/components/composites/model-selector/models.d.ts +51 -0
- package/dist/components/composites/model-selector/models.d.ts.map +1 -0
- package/dist/components/composites/model-selector/models.js +71 -0
- package/dist/components/composites/model-selector/models.js.map +1 -0
- package/dist/components/composites/plan/index.d.ts +2 -0
- package/dist/components/composites/plan/index.d.ts.map +1 -0
- package/dist/components/composites/plan/index.js +2 -0
- package/dist/components/composites/plan/plan.d.ts +61 -0
- package/dist/components/composites/plan/plan.d.ts.map +1 -0
- package/dist/components/composites/plan/plan.js +130 -0
- package/dist/components/composites/plan/plan.js.map +1 -0
- package/dist/components/composites/queue/index.d.ts +2 -0
- package/dist/components/composites/queue/index.d.ts.map +1 -0
- package/dist/components/composites/queue/index.js +2 -0
- package/dist/components/composites/queue/queue.d.ts +77 -0
- package/dist/components/composites/queue/queue.d.ts.map +1 -0
- package/dist/components/composites/queue/queue.js +271 -0
- package/dist/components/composites/queue/queue.js.map +1 -0
- package/dist/components/composites/reasoning/index.d.ts +2 -0
- package/dist/components/composites/reasoning/index.d.ts.map +1 -0
- package/dist/components/composites/reasoning/index.js +2 -0
- package/dist/components/composites/reasoning/reasoning.d.ts +62 -0
- package/dist/components/composites/reasoning/reasoning.d.ts.map +1 -0
- package/dist/components/composites/reasoning/reasoning.js +156 -0
- package/dist/components/composites/reasoning/reasoning.js.map +1 -0
- package/dist/components/composites/sources/index.d.ts +3 -0
- package/dist/components/composites/sources/index.d.ts.map +1 -0
- package/dist/components/composites/sources/index.js +3 -0
- package/dist/components/composites/sources/source.d.ts +46 -0
- package/dist/components/composites/sources/source.d.ts.map +1 -0
- package/dist/components/composites/sources/source.js +74 -0
- package/dist/components/composites/sources/source.js.map +1 -0
- package/dist/components/composites/sources/sources.d.ts +45 -0
- package/dist/components/composites/sources/sources.d.ts.map +1 -0
- package/dist/components/composites/sources/sources.js +175 -0
- package/dist/components/composites/sources/sources.js.map +1 -0
- package/dist/components/composites/stack-trace/index.d.ts +3 -0
- package/dist/components/composites/stack-trace/index.d.ts.map +1 -0
- package/dist/components/composites/stack-trace/index.js +3 -0
- package/dist/components/composites/stack-trace/parse-stack-trace.d.ts +118 -0
- package/dist/components/composites/stack-trace/parse-stack-trace.d.ts.map +1 -0
- package/dist/components/composites/stack-trace/parse-stack-trace.js +376 -0
- package/dist/components/composites/stack-trace/parse-stack-trace.js.map +1 -0
- package/dist/components/composites/stack-trace/stack-trace.d.ts +63 -0
- package/dist/components/composites/stack-trace/stack-trace.d.ts.map +1 -0
- package/dist/components/composites/stack-trace/stack-trace.js +491 -0
- package/dist/components/composites/stack-trace/stack-trace.js.map +1 -0
- package/dist/components/composites/subagent/index.d.ts +2 -0
- package/dist/components/composites/subagent/index.d.ts.map +1 -0
- package/dist/components/composites/subagent/index.js +2 -0
- package/dist/components/composites/subagent/subagent.d.ts +55 -0
- package/dist/components/composites/subagent/subagent.d.ts.map +1 -0
- package/dist/components/composites/subagent/subagent.js +138 -0
- package/dist/components/composites/subagent/subagent.js.map +1 -0
- package/dist/components/composites/suggestion/index.d.ts +2 -0
- package/dist/components/composites/suggestion/index.d.ts.map +1 -0
- package/dist/components/composites/suggestion/index.js +2 -0
- package/dist/components/composites/suggestion/suggestion.d.ts +37 -0
- package/dist/components/composites/suggestion/suggestion.d.ts.map +1 -0
- package/dist/components/composites/suggestion/suggestion.js +100 -0
- package/dist/components/composites/suggestion/suggestion.js.map +1 -0
- package/dist/components/composites/task/index.d.ts +2 -0
- package/dist/components/composites/task/index.d.ts.map +1 -0
- package/dist/components/composites/task/index.js +2 -0
- package/dist/components/composites/task/task.d.ts +96 -0
- package/dist/components/composites/task/task.d.ts.map +1 -0
- package/dist/components/composites/task/task.js +311 -0
- package/dist/components/composites/task/task.js.map +1 -0
- package/dist/components/composites/terminal/ansi.d.ts +101 -0
- package/dist/components/composites/terminal/ansi.d.ts.map +1 -0
- package/dist/components/composites/terminal/ansi.js +544 -0
- package/dist/components/composites/terminal/ansi.js.map +1 -0
- package/dist/components/composites/terminal/index.d.ts +4 -0
- package/dist/components/composites/terminal/index.d.ts.map +1 -0
- package/dist/components/composites/terminal/index.js +4 -0
- package/dist/components/composites/terminal/terminal-model.d.ts +63 -0
- package/dist/components/composites/terminal/terminal-model.d.ts.map +1 -0
- package/dist/components/composites/terminal/terminal-model.js +69 -0
- package/dist/components/composites/terminal/terminal-model.js.map +1 -0
- package/dist/components/composites/terminal/terminal.d.ts +88 -0
- package/dist/components/composites/terminal/terminal.d.ts.map +1 -0
- package/dist/components/composites/terminal/terminal.js +500 -0
- package/dist/components/composites/terminal/terminal.js.map +1 -0
- package/dist/components/composites/test-results/index.d.ts +3 -0
- package/dist/components/composites/test-results/index.d.ts.map +1 -0
- package/dist/components/composites/test-results/index.js +3 -0
- package/dist/components/composites/test-results/test-results-model.d.ts +154 -0
- package/dist/components/composites/test-results/test-results-model.d.ts.map +1 -0
- package/dist/components/composites/test-results/test-results-model.js +252 -0
- package/dist/components/composites/test-results/test-results-model.js.map +1 -0
- package/dist/components/composites/test-results/test-results.d.ts +60 -0
- package/dist/components/composites/test-results/test-results.d.ts.map +1 -0
- package/dist/components/composites/test-results/test-results.js +631 -0
- package/dist/components/composites/test-results/test-results.js.map +1 -0
- package/dist/components/composites/tool/format-tool-value.d.ts +37 -0
- package/dist/components/composites/tool/format-tool-value.d.ts.map +1 -0
- package/dist/components/composites/tool/format-tool-value.js +135 -0
- package/dist/components/composites/tool/format-tool-value.js.map +1 -0
- package/dist/components/composites/tool/index.d.ts +3 -0
- package/dist/components/composites/tool/index.d.ts.map +1 -0
- package/dist/components/composites/tool/index.js +3 -0
- package/dist/components/composites/tool/tool.d.ts +69 -0
- package/dist/components/composites/tool/tool.d.ts.map +1 -0
- package/dist/components/composites/tool/tool.js +214 -0
- package/dist/components/composites/tool/tool.js.map +1 -0
- package/dist/components/composites/update-dialog/update-dialog.js +1 -1
- package/dist/components/conversation/conversation-surface.d.ts +7 -0
- package/dist/components/conversation/conversation-surface.d.ts.map +1 -1
- package/dist/components/conversation/conversation-surface.js +2 -0
- package/dist/components/conversation/conversation-surface.js.map +1 -1
- package/dist/components/conversation/scroll-follow-core.d.ts +24 -0
- package/dist/components/conversation/scroll-follow-core.d.ts.map +1 -1
- package/dist/components/conversation/scroll-follow-core.js +23 -1
- package/dist/components/conversation/scroll-follow-core.js.map +1 -1
- package/dist/components/conversation/scroll-follow.d.ts +3 -0
- package/dist/components/conversation/scroll-follow.d.ts.map +1 -1
- package/dist/components/conversation/scroll-follow.js +80 -1
- package/dist/components/conversation/scroll-follow.js.map +1 -1
- package/dist/components/ui/attachment/attachment.d.ts +58 -0
- package/dist/components/ui/attachment/attachment.d.ts.map +1 -0
- package/dist/components/ui/attachment/attachment.js +279 -0
- package/dist/components/ui/attachment/attachment.js.map +1 -0
- package/dist/components/ui/attachment/index.d.ts +2 -0
- package/dist/components/ui/attachment/index.d.ts.map +1 -0
- package/dist/components/ui/attachment/index.js +2 -0
- package/dist/components/ui/badge/badge.d.ts +1 -1
- package/dist/components/ui/bubble/bubble.d.ts +33 -0
- package/dist/components/ui/bubble/bubble.d.ts.map +1 -0
- package/dist/components/ui/bubble/bubble.js +95 -0
- package/dist/components/ui/bubble/bubble.js.map +1 -0
- package/dist/components/ui/bubble/index.d.ts +2 -0
- package/dist/components/ui/bubble/index.d.ts.map +1 -0
- package/dist/components/ui/bubble/index.js +2 -0
- package/dist/components/ui/button/button.d.ts +1 -1
- package/dist/components/ui/code-block/code-block.d.ts +56 -3
- package/dist/components/ui/code-block/code-block.d.ts.map +1 -1
- package/dist/components/ui/code-block/code-block.js +231 -50
- package/dist/components/ui/code-block/code-block.js.map +1 -1
- package/dist/components/ui/code-block/index.d.ts +1 -1
- package/dist/components/ui/code-block/index.d.ts.map +1 -1
- package/dist/components/ui/code-block/index.js +2 -2
- package/dist/components/ui/field/number-field.d.ts +21 -4
- package/dist/components/ui/field/number-field.d.ts.map +1 -1
- package/dist/components/ui/field/number-field.js +22 -11
- package/dist/components/ui/field/number-field.js.map +1 -1
- package/dist/components/ui/marker/index.d.ts +2 -0
- package/dist/components/ui/marker/index.d.ts.map +1 -0
- package/dist/components/ui/marker/index.js +2 -0
- package/dist/components/ui/marker/marker.d.ts +35 -0
- package/dist/components/ui/marker/marker.d.ts.map +1 -0
- package/dist/components/ui/marker/marker.js +123 -0
- package/dist/components/ui/marker/marker.js.map +1 -0
- package/dist/components/ui/message/cite-ranges.d.ts +42 -0
- package/dist/components/ui/message/cite-ranges.d.ts.map +1 -0
- package/dist/components/ui/message/cite-ranges.js +105 -0
- package/dist/components/ui/message/cite-ranges.js.map +1 -0
- package/dist/components/ui/message/index.d.ts +4 -0
- package/dist/components/ui/message/index.d.ts.map +1 -0
- package/dist/components/ui/message/index.js +4 -0
- package/dist/components/ui/message/message.d.ts +95 -0
- package/dist/components/ui/message/message.d.ts.map +1 -0
- package/dist/components/ui/message/message.js +443 -0
- package/dist/components/ui/message/message.js.map +1 -0
- package/dist/components/ui/message/parse-message-text.d.ts +93 -0
- package/dist/components/ui/message/parse-message-text.d.ts.map +1 -0
- package/dist/components/ui/message/parse-message-text.js +365 -0
- package/dist/components/ui/message/parse-message-text.js.map +1 -0
- package/dist/components/ui/questionnaire/index.d.ts +2 -0
- package/dist/components/ui/questionnaire/index.d.ts.map +1 -0
- package/dist/components/ui/questionnaire/index.js +2 -0
- package/dist/components/ui/questionnaire/questionnaire.d.ts +83 -0
- package/dist/components/ui/questionnaire/questionnaire.d.ts.map +1 -0
- package/dist/components/ui/questionnaire/questionnaire.js +470 -0
- package/dist/components/ui/questionnaire/questionnaire.js.map +1 -0
- package/dist/components/ui/status-chip/status-chip.d.ts +1 -1
- package/dist/components/ui/switch/switch.js +11 -11
- package/dist/components/ui/switch/switch.js.map +1 -1
- package/dist/components/ui/trace/index.d.ts +2 -0
- package/dist/components/ui/trace/index.d.ts.map +1 -0
- package/dist/components/ui/trace/index.js +2 -0
- package/dist/components/ui/trace/trace.d.ts +72 -0
- package/dist/components/ui/trace/trace.d.ts.map +1 -0
- package/dist/components/ui/trace/trace.js +340 -0
- package/dist/components/ui/trace/trace.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +46 -5
- package/dist/r/attachment.json +25 -0
- package/dist/r/bubble.json +22 -0
- package/dist/r/chain-of-thought.json +26 -0
- package/dist/r/chat.json +24 -0
- package/dist/r/checkpoint.json +35 -0
- package/dist/r/confirmation.json +34 -0
- package/dist/r/context.json +33 -0
- package/dist/r/file-tree.json +32 -0
- package/dist/r/inline-citation.json +35 -0
- package/dist/r/marker.json +22 -0
- package/dist/r/message-scroller.json +31 -0
- package/dist/r/message.json +33 -0
- package/dist/r/model-selector.json +34 -0
- package/dist/r/plan.json +26 -0
- package/dist/r/questionnaire.json +28 -0
- package/dist/r/queue.json +26 -0
- package/dist/r/reasoning.json +26 -0
- package/dist/r/registry.json +811 -52
- package/dist/r/sources.json +32 -0
- package/dist/r/src/components/composites/chain-of-thought/chain-of-thought.tsx +141 -0
- package/dist/r/src/components/composites/chain-of-thought/index.ts +11 -0
- package/dist/r/src/components/composites/chat/chat.tsx +190 -0
- package/dist/r/src/components/composites/chat/index.ts +11 -0
- package/dist/r/src/components/composites/checkpoint/checkpoint-model.ts +71 -0
- package/dist/r/src/components/composites/checkpoint/checkpoint.tsx +214 -0
- package/dist/r/src/components/composites/checkpoint/index.ts +8 -0
- package/dist/r/src/components/composites/confirmation/confirmation-model.ts +83 -0
- package/dist/r/src/components/composites/confirmation/confirmation.tsx +311 -0
- package/dist/r/src/components/composites/confirmation/index.ts +9 -0
- package/dist/r/src/components/composites/context/context-model.ts +168 -0
- package/dist/r/src/components/composites/context/context.tsx +187 -0
- package/dist/r/src/components/composites/context/index.ts +18 -0
- package/dist/r/src/components/composites/file-tree/build-file-tree.ts +456 -0
- package/dist/r/src/components/composites/file-tree/file-tree.tsx +405 -0
- package/dist/r/src/components/composites/file-tree/index.ts +25 -0
- package/dist/r/src/components/composites/inline-citation/citation.ts +78 -0
- package/dist/r/src/components/composites/inline-citation/index.ts +9 -0
- package/dist/r/src/components/composites/inline-citation/inline-citation.tsx +285 -0
- package/dist/r/src/components/composites/message-scroller/index.ts +2 -0
- package/dist/r/src/components/composites/message-scroller/message-scroller.tsx +301 -0
- package/dist/r/src/components/composites/message-scroller/scroll-anchor.ts +170 -0
- package/dist/r/src/components/composites/model-selector/index.ts +14 -0
- package/dist/r/src/components/composites/model-selector/model-selector.tsx +420 -0
- package/dist/r/src/components/composites/model-selector/models.ts +103 -0
- package/dist/r/src/components/composites/plan/index.ts +1 -0
- package/dist/r/src/components/composites/plan/plan.tsx +155 -0
- package/dist/r/src/components/composites/queue/index.ts +10 -0
- package/dist/r/src/components/composites/queue/queue.tsx +264 -0
- package/dist/r/src/components/composites/reasoning/index.ts +1 -0
- package/dist/r/src/components/composites/reasoning/reasoning.tsx +176 -0
- package/dist/r/src/components/composites/sources/index.ts +11 -0
- package/dist/r/src/components/composites/sources/source.ts +116 -0
- package/dist/r/src/components/composites/sources/sources.tsx +163 -0
- package/dist/r/src/components/composites/stack-trace/index.ts +19 -0
- package/dist/r/src/components/composites/stack-trace/parse-stack-trace.ts +507 -0
- package/dist/r/src/components/composites/stack-trace/stack-trace.tsx +395 -0
- package/dist/r/src/components/composites/subagent/index.ts +1 -0
- package/dist/r/src/components/composites/subagent/subagent.tsx +159 -0
- package/dist/r/src/components/composites/suggestion/index.ts +1 -0
- package/dist/r/src/components/composites/suggestion/suggestion.tsx +140 -0
- package/dist/r/src/components/composites/task/index.ts +14 -0
- package/dist/r/src/components/composites/task/task.tsx +317 -0
- package/dist/r/src/components/composites/terminal/ansi.ts +674 -0
- package/dist/r/src/components/composites/terminal/index.ts +20 -0
- package/dist/r/src/components/composites/terminal/terminal-model.ts +111 -0
- package/dist/r/src/components/composites/terminal/terminal.tsx +574 -0
- package/dist/r/src/components/composites/test-results/index.ts +20 -0
- package/dist/r/src/components/composites/test-results/test-results-model.ts +368 -0
- package/dist/r/src/components/composites/test-results/test-results.tsx +586 -0
- package/dist/r/src/components/composites/tool/format-tool-value.ts +221 -0
- package/dist/r/src/components/composites/tool/index.ts +2 -0
- package/dist/r/src/components/composites/tool/tool.tsx +228 -0
- package/dist/r/src/components/conversation/conversation-surface.tsx +9 -0
- package/dist/r/src/components/conversation/scroll-follow-core.ts +31 -0
- package/dist/r/src/components/conversation/scroll-follow.ts +92 -0
- package/dist/r/src/components/ui/attachment/attachment.tsx +282 -0
- package/dist/r/src/components/ui/attachment/index.ts +10 -0
- package/dist/r/src/components/ui/bubble/bubble.tsx +86 -0
- package/dist/r/src/components/ui/bubble/index.ts +1 -0
- package/dist/r/src/components/ui/code-block/code-block.tsx +256 -26
- package/dist/r/src/components/ui/code-block/index.ts +9 -1
- package/dist/r/src/components/ui/field/number-field.tsx +51 -14
- package/dist/r/src/components/ui/marker/index.ts +1 -0
- package/dist/r/src/components/ui/marker/marker.tsx +90 -0
- package/dist/r/src/components/ui/message/cite-ranges.ts +144 -0
- package/dist/r/src/components/ui/message/index.ts +23 -0
- package/dist/r/src/components/ui/message/message.tsx +434 -0
- package/dist/r/src/components/ui/message/parse-message-text.ts +450 -0
- package/dist/r/src/components/ui/questionnaire/index.ts +10 -0
- package/dist/r/src/components/ui/questionnaire/questionnaire.tsx +446 -0
- package/dist/r/src/components/ui/trace/index.ts +9 -0
- package/dist/r/src/components/ui/trace/trace.tsx +334 -0
- package/dist/r/src/styles/base.css +34 -0
- package/dist/r/stack-trace.json +32 -0
- package/dist/r/subagent.json +27 -0
- package/dist/r/suggestion.json +24 -0
- package/dist/r/task.json +28 -0
- package/dist/r/terminal.json +35 -0
- package/dist/r/test-results.json +33 -0
- package/dist/r/tool.json +31 -0
- package/dist/r/trace.json +25 -0
- package/package.json +6 -3
- package/registry.json +811 -52
- package/src/components/composites/chain-of-thought/chain-of-thought.tsx +141 -0
- package/src/components/composites/chain-of-thought/index.ts +11 -0
- package/src/components/composites/chat/chat.tsx +190 -0
- package/src/components/composites/chat/index.ts +11 -0
- package/src/components/composites/checkpoint/checkpoint-model.ts +71 -0
- package/src/components/composites/checkpoint/checkpoint.tsx +214 -0
- package/src/components/composites/checkpoint/index.ts +8 -0
- package/src/components/composites/confirmation/confirmation-model.ts +83 -0
- package/src/components/composites/confirmation/confirmation.tsx +311 -0
- package/src/components/composites/confirmation/index.ts +9 -0
- package/src/components/composites/context/context-model.ts +168 -0
- package/src/components/composites/context/context.tsx +187 -0
- package/src/components/composites/context/index.ts +18 -0
- package/src/components/composites/file-tree/build-file-tree.ts +456 -0
- package/src/components/composites/file-tree/file-tree.tsx +405 -0
- package/src/components/composites/file-tree/index.ts +25 -0
- package/src/components/composites/inline-citation/citation.ts +78 -0
- package/src/components/composites/inline-citation/index.ts +9 -0
- package/src/components/composites/inline-citation/inline-citation.tsx +285 -0
- package/src/components/composites/message-scroller/index.ts +2 -0
- package/src/components/composites/message-scroller/message-scroller.tsx +301 -0
- package/src/components/composites/message-scroller/scroll-anchor.ts +170 -0
- package/src/components/composites/model-selector/index.ts +14 -0
- package/src/components/composites/model-selector/model-selector.tsx +420 -0
- package/src/components/composites/model-selector/models.ts +103 -0
- package/src/components/composites/plan/index.ts +1 -0
- package/src/components/composites/plan/plan.tsx +155 -0
- package/src/components/composites/queue/index.ts +10 -0
- package/src/components/composites/queue/queue.tsx +264 -0
- package/src/components/composites/reasoning/index.ts +1 -0
- package/src/components/composites/reasoning/reasoning.tsx +176 -0
- package/src/components/composites/sources/index.ts +11 -0
- package/src/components/composites/sources/source.ts +116 -0
- package/src/components/composites/sources/sources.tsx +163 -0
- package/src/components/composites/stack-trace/index.ts +19 -0
- package/src/components/composites/stack-trace/parse-stack-trace.ts +507 -0
- package/src/components/composites/stack-trace/stack-trace.tsx +395 -0
- package/src/components/composites/subagent/index.ts +1 -0
- package/src/components/composites/subagent/subagent.tsx +159 -0
- package/src/components/composites/suggestion/index.ts +1 -0
- package/src/components/composites/suggestion/suggestion.tsx +140 -0
- package/src/components/composites/task/index.ts +14 -0
- package/src/components/composites/task/task.tsx +317 -0
- package/src/components/composites/terminal/ansi.ts +674 -0
- package/src/components/composites/terminal/index.ts +20 -0
- package/src/components/composites/terminal/terminal-model.ts +111 -0
- package/src/components/composites/terminal/terminal.tsx +574 -0
- package/src/components/composites/test-results/index.ts +20 -0
- package/src/components/composites/test-results/test-results-model.ts +368 -0
- package/src/components/composites/test-results/test-results.tsx +586 -0
- package/src/components/composites/tool/format-tool-value.ts +221 -0
- package/src/components/composites/tool/index.ts +2 -0
- package/src/components/composites/tool/tool.tsx +228 -0
- package/src/components/conversation/conversation-surface.tsx +9 -0
- package/src/components/conversation/scroll-follow-core.ts +31 -0
- package/src/components/conversation/scroll-follow.ts +92 -0
- package/src/components/ui/attachment/attachment.tsx +282 -0
- package/src/components/ui/attachment/index.ts +10 -0
- package/src/components/ui/bubble/bubble.tsx +86 -0
- package/src/components/ui/bubble/index.ts +1 -0
- package/src/components/ui/code-block/code-block.tsx +256 -26
- package/src/components/ui/code-block/index.ts +9 -1
- package/src/components/ui/field/number-field.tsx +51 -14
- package/src/components/ui/marker/index.ts +1 -0
- package/src/components/ui/marker/marker.tsx +90 -0
- package/src/components/ui/message/cite-ranges.ts +144 -0
- package/src/components/ui/message/index.ts +23 -0
- package/src/components/ui/message/message.tsx +434 -0
- package/src/components/ui/message/parse-message-text.ts +450 -0
- package/src/components/ui/questionnaire/index.ts +10 -0
- package/src/components/ui/questionnaire/questionnaire.tsx +446 -0
- package/src/components/ui/trace/index.ts +9 -0
- package/src/components/ui/trace/trace.tsx +334 -0
- package/src/index.ts +26 -0
- package/src/styles/base.css +34 -0
|
@@ -0,0 +1,490 @@
|
|
|
1
|
+
import { cn } from "../../../lib/utils.js";
|
|
2
|
+
import { Button } from "../../ui/button/button.js";
|
|
3
|
+
import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from "../../ui/command/command.js";
|
|
4
|
+
import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuLabel, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuTrigger } from "../../ui/dropdown-menu/dropdown-menu.js";
|
|
5
|
+
import { Popover, PopoverContent, PopoverTrigger } from "../../ui/popover/popover.js";
|
|
6
|
+
import { boundText } from "../sources/source.js";
|
|
7
|
+
import { findModel, groupModels, modelSearchValue, needsSearch, normalizeEfforts, resolveEffort } from "./models.js";
|
|
8
|
+
import { className, createComponent, effect, insert, memo, setAttribute, template } from "solid-js/web";
|
|
9
|
+
import { Brain, Check, ChevronsUpDown } from "lucide-solid";
|
|
10
|
+
import { For, Show, createEffect, createMemo, createSignal, createUniqueId, splitProps } from "solid-js";
|
|
11
|
+
//#region src/components/composites/model-selector/model-selector.tsx
|
|
12
|
+
var _tmpl$ = /*#__PURE__*/ template(`<p role=status class="m-0 text-xs text-muted-foreground">`);
|
|
13
|
+
var _tmpl$2 = /*#__PURE__*/ template(`<div data-slot=model-selector><div role=group class="flex min-w-0 items-center gap-1">`);
|
|
14
|
+
var _tmpl$3 = /*#__PURE__*/ template(`<span class="truncate px-2 text-sm text-muted-foreground"><span class=visually-hidden>Model: `);
|
|
15
|
+
var _tmpl$4 = /*#__PURE__*/ template(`<span class="flex items-center gap-1 truncate px-2 text-sm text-muted-foreground"><span class=visually-hidden>Thinking effort: `);
|
|
16
|
+
var _tmpl$5 = /*#__PURE__*/ template(`<span class="text-xs text-muted-foreground [overflow-wrap:anywhere]">`);
|
|
17
|
+
var _tmpl$6 = /*#__PURE__*/ template(`<span class="text-xs text-muted-foreground [overflow-wrap:anywhere]"><span class=visually-hidden>Unavailable: `);
|
|
18
|
+
var _tmpl$7 = /*#__PURE__*/ template(`<span class="flex min-w-0 flex-col"><span class=[overflow-wrap:anywhere]>`);
|
|
19
|
+
var _tmpl$8 = /*#__PURE__*/ template(`<span class="max-w-48 truncate">`);
|
|
20
|
+
var _tmpl$9 = /*#__PURE__*/ template(`<span class=visually-hidden>Current model`);
|
|
21
|
+
var _tmpl$0 = /*#__PURE__*/ template(`<span aria-hidden=true>`);
|
|
22
|
+
var _tmpl$1 = /*#__PURE__*/ template(`<span class="flex min-w-0 flex-col"><span>`);
|
|
23
|
+
function ModelSelector(props) {
|
|
24
|
+
const [local] = splitProps(props, [
|
|
25
|
+
"models",
|
|
26
|
+
"value",
|
|
27
|
+
"effort",
|
|
28
|
+
"onChange",
|
|
29
|
+
"onEffortChange",
|
|
30
|
+
"searchThreshold",
|
|
31
|
+
"disabledReason",
|
|
32
|
+
"label",
|
|
33
|
+
"class"
|
|
34
|
+
]);
|
|
35
|
+
const blocked = () => local.disabledReason !== void 0;
|
|
36
|
+
const selected = () => findModel(local.models, local.value);
|
|
37
|
+
const efforts = createMemo(() => normalizeEfforts(selected()?.efforts));
|
|
38
|
+
const effortChoice = () => resolveEffort(selected(), local.effort);
|
|
39
|
+
const reason = () => local.disabledReason ? boundText(local.disabledReason, 240) : void 0;
|
|
40
|
+
const reasonId = `${createUniqueId()}-reason`;
|
|
41
|
+
const describedBy = () => reason() ? reasonId : void 0;
|
|
42
|
+
return (() => {
|
|
43
|
+
var _el$ = _tmpl$2(), _el$2 = _el$.firstChild;
|
|
44
|
+
insert(_el$2, createComponent(Show, {
|
|
45
|
+
get when() {
|
|
46
|
+
return local.onChange;
|
|
47
|
+
},
|
|
48
|
+
get fallback() {
|
|
49
|
+
return createComponent(Show, {
|
|
50
|
+
get when() {
|
|
51
|
+
return local.value;
|
|
52
|
+
},
|
|
53
|
+
get children() {
|
|
54
|
+
var _el$4 = _tmpl$3();
|
|
55
|
+
_el$4.firstChild;
|
|
56
|
+
insert(_el$4, () => triggerText({
|
|
57
|
+
selected: selected(),
|
|
58
|
+
value: local.value
|
|
59
|
+
}), null);
|
|
60
|
+
return _el$4;
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
},
|
|
64
|
+
get children() {
|
|
65
|
+
return createComponent(Show, {
|
|
66
|
+
get when() {
|
|
67
|
+
return needsSearch(local.models.length, local.searchThreshold);
|
|
68
|
+
},
|
|
69
|
+
get fallback() {
|
|
70
|
+
return createComponent(ModelMenu, {
|
|
71
|
+
get models() {
|
|
72
|
+
return local.models;
|
|
73
|
+
},
|
|
74
|
+
get selected() {
|
|
75
|
+
return selected();
|
|
76
|
+
},
|
|
77
|
+
get value() {
|
|
78
|
+
return local.value;
|
|
79
|
+
},
|
|
80
|
+
get blocked() {
|
|
81
|
+
return blocked();
|
|
82
|
+
},
|
|
83
|
+
get describedBy() {
|
|
84
|
+
return describedBy();
|
|
85
|
+
},
|
|
86
|
+
onChange: (id) => local.onChange?.(id)
|
|
87
|
+
});
|
|
88
|
+
},
|
|
89
|
+
get children() {
|
|
90
|
+
return createComponent(ModelSearch, {
|
|
91
|
+
get models() {
|
|
92
|
+
return local.models;
|
|
93
|
+
},
|
|
94
|
+
get selected() {
|
|
95
|
+
return selected();
|
|
96
|
+
},
|
|
97
|
+
get value() {
|
|
98
|
+
return local.value;
|
|
99
|
+
},
|
|
100
|
+
get blocked() {
|
|
101
|
+
return blocked();
|
|
102
|
+
},
|
|
103
|
+
get describedBy() {
|
|
104
|
+
return describedBy();
|
|
105
|
+
},
|
|
106
|
+
onChange: (id) => local.onChange?.(id)
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
}), null);
|
|
112
|
+
insert(_el$2, createComponent(Show, {
|
|
113
|
+
get when() {
|
|
114
|
+
return efforts().length > 0;
|
|
115
|
+
},
|
|
116
|
+
get children() {
|
|
117
|
+
return createComponent(Show, {
|
|
118
|
+
get when() {
|
|
119
|
+
return local.onEffortChange;
|
|
120
|
+
},
|
|
121
|
+
get fallback() {
|
|
122
|
+
return createComponent(Show, {
|
|
123
|
+
get when() {
|
|
124
|
+
return effortChoice();
|
|
125
|
+
},
|
|
126
|
+
children: (choice) => (() => {
|
|
127
|
+
var _el$6 = _tmpl$4(), _el$7 = _el$6.firstChild;
|
|
128
|
+
insert(_el$6, createComponent(Brain, {
|
|
129
|
+
"aria-hidden": "true",
|
|
130
|
+
"class": "size-3.5 shrink-0"
|
|
131
|
+
}), _el$7);
|
|
132
|
+
insert(_el$6, () => choice().label, null);
|
|
133
|
+
return _el$6;
|
|
134
|
+
})()
|
|
135
|
+
});
|
|
136
|
+
},
|
|
137
|
+
get children() {
|
|
138
|
+
return createComponent(EffortMenu, {
|
|
139
|
+
get efforts() {
|
|
140
|
+
return efforts();
|
|
141
|
+
},
|
|
142
|
+
get value() {
|
|
143
|
+
return effortChoice()?.id;
|
|
144
|
+
},
|
|
145
|
+
get blocked() {
|
|
146
|
+
return blocked();
|
|
147
|
+
},
|
|
148
|
+
get describedBy() {
|
|
149
|
+
return describedBy();
|
|
150
|
+
},
|
|
151
|
+
onChange: (id) => local.onEffortChange?.(id)
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
}), null);
|
|
157
|
+
insert(_el$, createComponent(Show, {
|
|
158
|
+
get when() {
|
|
159
|
+
return reason();
|
|
160
|
+
},
|
|
161
|
+
get children() {
|
|
162
|
+
var _el$3 = _tmpl$();
|
|
163
|
+
setAttribute(_el$3, "id", reasonId);
|
|
164
|
+
insert(_el$3, reason);
|
|
165
|
+
return _el$3;
|
|
166
|
+
}
|
|
167
|
+
}), null);
|
|
168
|
+
effect((_p$) => {
|
|
169
|
+
var _v$ = cn("flex min-w-0 flex-col gap-1", local.class), _v$2 = local.label ?? "Model and thinking effort";
|
|
170
|
+
_v$ !== _p$.e && className(_el$, _p$.e = _v$);
|
|
171
|
+
_v$2 !== _p$.t && setAttribute(_el$2, "aria-label", _p$.t = _v$2);
|
|
172
|
+
return _p$;
|
|
173
|
+
}, {
|
|
174
|
+
e: void 0,
|
|
175
|
+
t: void 0
|
|
176
|
+
});
|
|
177
|
+
return _el$;
|
|
178
|
+
})();
|
|
179
|
+
}
|
|
180
|
+
function triggerText(props) {
|
|
181
|
+
if (props.selected) return boundText(props.selected.label, 60);
|
|
182
|
+
return props.value ? boundText(props.value, 60) : "Choose a model";
|
|
183
|
+
}
|
|
184
|
+
function ModelOptionBody(props) {
|
|
185
|
+
return (() => {
|
|
186
|
+
var _el$8 = _tmpl$7(), _el$9 = _el$8.firstChild;
|
|
187
|
+
insert(_el$9, () => boundText(props.model.label, 60));
|
|
188
|
+
insert(_el$8, createComponent(Show, {
|
|
189
|
+
get when() {
|
|
190
|
+
return props.model.description;
|
|
191
|
+
},
|
|
192
|
+
get children() {
|
|
193
|
+
var _el$0 = _tmpl$5();
|
|
194
|
+
insert(_el$0, () => boundText(props.model.description ?? "", 160));
|
|
195
|
+
return _el$0;
|
|
196
|
+
}
|
|
197
|
+
}), null);
|
|
198
|
+
insert(_el$8, createComponent(Show, {
|
|
199
|
+
get when() {
|
|
200
|
+
return props.model.disabledReason;
|
|
201
|
+
},
|
|
202
|
+
get children() {
|
|
203
|
+
var _el$1 = _tmpl$6();
|
|
204
|
+
_el$1.firstChild;
|
|
205
|
+
insert(_el$1, () => boundText(props.model.disabledReason ?? "", 160), null);
|
|
206
|
+
return _el$1;
|
|
207
|
+
}
|
|
208
|
+
}), null);
|
|
209
|
+
return _el$8;
|
|
210
|
+
})();
|
|
211
|
+
}
|
|
212
|
+
function ModelTrigger(props) {
|
|
213
|
+
return [(() => {
|
|
214
|
+
var _el$11 = _tmpl$8();
|
|
215
|
+
insert(_el$11, (() => {
|
|
216
|
+
var _c$ = memo(() => !!props.empty);
|
|
217
|
+
return () => _c$() ? "No models available" : triggerText(props);
|
|
218
|
+
})());
|
|
219
|
+
return _el$11;
|
|
220
|
+
})(), createComponent(ChevronsUpDown, { "aria-hidden": "true" })];
|
|
221
|
+
}
|
|
222
|
+
function ModelMenu(props) {
|
|
223
|
+
const [open, setOpen] = createSignal(false);
|
|
224
|
+
const groups = createMemo(() => groupModels(props.models));
|
|
225
|
+
const inert = () => props.blocked || props.models.length === 0;
|
|
226
|
+
createEffect(() => {
|
|
227
|
+
if (inert()) setOpen(false);
|
|
228
|
+
});
|
|
229
|
+
return createComponent(DropdownMenu, {
|
|
230
|
+
get open() {
|
|
231
|
+
return open();
|
|
232
|
+
},
|
|
233
|
+
onOpenChange: (next) => setOpen(next && !inert()),
|
|
234
|
+
placement: "top-start",
|
|
235
|
+
gutter: 6,
|
|
236
|
+
get children() {
|
|
237
|
+
return [createComponent(DropdownMenuTrigger, {
|
|
238
|
+
as: Button,
|
|
239
|
+
variant: "ghost",
|
|
240
|
+
size: "sm",
|
|
241
|
+
get ["aria-label"]() {
|
|
242
|
+
return `Model: ${props.models.length === 0 ? "none available" : triggerText(props)}`;
|
|
243
|
+
},
|
|
244
|
+
get ["aria-disabled"]() {
|
|
245
|
+
return inert() || void 0;
|
|
246
|
+
},
|
|
247
|
+
get ["aria-describedby"]() {
|
|
248
|
+
return props.describedBy;
|
|
249
|
+
},
|
|
250
|
+
get children() {
|
|
251
|
+
return createComponent(ModelTrigger, {
|
|
252
|
+
get selected() {
|
|
253
|
+
return props.selected;
|
|
254
|
+
},
|
|
255
|
+
get value() {
|
|
256
|
+
return props.value;
|
|
257
|
+
},
|
|
258
|
+
get empty() {
|
|
259
|
+
return props.models.length === 0;
|
|
260
|
+
}
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
}), createComponent(DropdownMenuContent, {
|
|
264
|
+
hideArrow: true,
|
|
265
|
+
"class": "w-72 max-w-full",
|
|
266
|
+
get children() {
|
|
267
|
+
return createComponent(DropdownMenuRadioGroup, {
|
|
268
|
+
get value() {
|
|
269
|
+
return props.value ?? "";
|
|
270
|
+
},
|
|
271
|
+
onChange: (id) => {
|
|
272
|
+
const model = typeof id === "string" ? findModel(props.models, id) : void 0;
|
|
273
|
+
if (!props.blocked && model && model.disabledReason === void 0) props.onChange(model.id);
|
|
274
|
+
},
|
|
275
|
+
get children() {
|
|
276
|
+
return createComponent(For, {
|
|
277
|
+
get each() {
|
|
278
|
+
return groups();
|
|
279
|
+
},
|
|
280
|
+
children: (group) => createComponent(DropdownMenuGroup, { get children() {
|
|
281
|
+
return [createComponent(DropdownMenuLabel, { get children() {
|
|
282
|
+
return group.provider;
|
|
283
|
+
} }), createComponent(For, {
|
|
284
|
+
get each() {
|
|
285
|
+
return group.models;
|
|
286
|
+
},
|
|
287
|
+
children: (model) => createComponent(DropdownMenuRadioItem, {
|
|
288
|
+
get value() {
|
|
289
|
+
return model.id;
|
|
290
|
+
},
|
|
291
|
+
get disabled() {
|
|
292
|
+
return inert() || model.disabledReason !== void 0;
|
|
293
|
+
},
|
|
294
|
+
get children() {
|
|
295
|
+
return createComponent(ModelOptionBody, { model });
|
|
296
|
+
}
|
|
297
|
+
})
|
|
298
|
+
})];
|
|
299
|
+
} })
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
})];
|
|
305
|
+
}
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
function ModelSearch(props) {
|
|
309
|
+
const [open, setOpen] = createSignal(false);
|
|
310
|
+
const groups = createMemo(() => groupModels(props.models));
|
|
311
|
+
createEffect(() => {
|
|
312
|
+
if (props.blocked) setOpen(false);
|
|
313
|
+
});
|
|
314
|
+
return createComponent(Popover, {
|
|
315
|
+
get open() {
|
|
316
|
+
return open();
|
|
317
|
+
},
|
|
318
|
+
onOpenChange: (next) => setOpen(next && !props.blocked),
|
|
319
|
+
placement: "top-start",
|
|
320
|
+
gutter: 6,
|
|
321
|
+
get children() {
|
|
322
|
+
return [createComponent(PopoverTrigger, {
|
|
323
|
+
as: Button,
|
|
324
|
+
variant: "ghost",
|
|
325
|
+
size: "sm",
|
|
326
|
+
get ["aria-label"]() {
|
|
327
|
+
return `Model: ${triggerText(props)}`;
|
|
328
|
+
},
|
|
329
|
+
get ["aria-disabled"]() {
|
|
330
|
+
return props.blocked || void 0;
|
|
331
|
+
},
|
|
332
|
+
get ["aria-describedby"]() {
|
|
333
|
+
return props.describedBy;
|
|
334
|
+
},
|
|
335
|
+
get children() {
|
|
336
|
+
return createComponent(ModelTrigger, {
|
|
337
|
+
get selected() {
|
|
338
|
+
return props.selected;
|
|
339
|
+
},
|
|
340
|
+
get value() {
|
|
341
|
+
return props.value;
|
|
342
|
+
},
|
|
343
|
+
empty: false
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
}), createComponent(PopoverContent, {
|
|
347
|
+
"class": "w-80 max-w-full",
|
|
348
|
+
get children() {
|
|
349
|
+
return createComponent(Command, {
|
|
350
|
+
label: "Choose a model",
|
|
351
|
+
get children() {
|
|
352
|
+
return [createComponent(CommandInput, { placeholder: "Search models" }), createComponent(CommandList, { get children() {
|
|
353
|
+
return [createComponent(CommandEmpty, { children: "No model matches." }), createComponent(For, {
|
|
354
|
+
get each() {
|
|
355
|
+
return groups();
|
|
356
|
+
},
|
|
357
|
+
children: (group) => createComponent(CommandGroup, {
|
|
358
|
+
get heading() {
|
|
359
|
+
return group.provider;
|
|
360
|
+
},
|
|
361
|
+
get children() {
|
|
362
|
+
return createComponent(For, {
|
|
363
|
+
get each() {
|
|
364
|
+
return group.models;
|
|
365
|
+
},
|
|
366
|
+
children: (model) => createComponent(CommandItem, {
|
|
367
|
+
get value() {
|
|
368
|
+
return modelSearchValue(model);
|
|
369
|
+
},
|
|
370
|
+
get disabled() {
|
|
371
|
+
return props.blocked || model.disabledReason !== void 0;
|
|
372
|
+
},
|
|
373
|
+
onSelect: () => {
|
|
374
|
+
if (props.blocked || model.disabledReason !== void 0) return;
|
|
375
|
+
props.onChange(model.id);
|
|
376
|
+
setOpen(false);
|
|
377
|
+
},
|
|
378
|
+
get children() {
|
|
379
|
+
return [createComponent(ModelOptionBody, { model }), createComponent(Show, {
|
|
380
|
+
get when() {
|
|
381
|
+
return model.id === props.value;
|
|
382
|
+
},
|
|
383
|
+
get children() {
|
|
384
|
+
return [createComponent(Check, {
|
|
385
|
+
"aria-hidden": "true",
|
|
386
|
+
"class": "ms-auto text-primary"
|
|
387
|
+
}), _tmpl$9()];
|
|
388
|
+
}
|
|
389
|
+
})];
|
|
390
|
+
}
|
|
391
|
+
})
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
})
|
|
395
|
+
})];
|
|
396
|
+
} })];
|
|
397
|
+
}
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
})];
|
|
401
|
+
}
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
function EffortMenu(props) {
|
|
405
|
+
const [open, setOpen] = createSignal(false);
|
|
406
|
+
const label = () => props.efforts.find((effort) => effort.id === props.value)?.label;
|
|
407
|
+
createEffect(() => {
|
|
408
|
+
if (props.blocked) setOpen(false);
|
|
409
|
+
});
|
|
410
|
+
return createComponent(DropdownMenu, {
|
|
411
|
+
get open() {
|
|
412
|
+
return open();
|
|
413
|
+
},
|
|
414
|
+
onOpenChange: (next) => setOpen(next && !props.blocked),
|
|
415
|
+
placement: "top-start",
|
|
416
|
+
gutter: 6,
|
|
417
|
+
get children() {
|
|
418
|
+
return [createComponent(DropdownMenuTrigger, {
|
|
419
|
+
as: Button,
|
|
420
|
+
variant: "ghost",
|
|
421
|
+
size: "sm",
|
|
422
|
+
get ["aria-label"]() {
|
|
423
|
+
return `Thinking effort: ${label() ?? "not set"}`;
|
|
424
|
+
},
|
|
425
|
+
get ["aria-disabled"]() {
|
|
426
|
+
return props.blocked || void 0;
|
|
427
|
+
},
|
|
428
|
+
get ["aria-describedby"]() {
|
|
429
|
+
return props.describedBy;
|
|
430
|
+
},
|
|
431
|
+
get children() {
|
|
432
|
+
return [createComponent(Brain, { "aria-hidden": "true" }), (() => {
|
|
433
|
+
var _el$13 = _tmpl$0();
|
|
434
|
+
insert(_el$13, () => label() ?? "Effort");
|
|
435
|
+
return _el$13;
|
|
436
|
+
})()];
|
|
437
|
+
}
|
|
438
|
+
}), createComponent(DropdownMenuContent, {
|
|
439
|
+
hideArrow: true,
|
|
440
|
+
"class": "w-56 max-w-full",
|
|
441
|
+
get children() {
|
|
442
|
+
return createComponent(DropdownMenuRadioGroup, {
|
|
443
|
+
get value() {
|
|
444
|
+
return props.value ?? "";
|
|
445
|
+
},
|
|
446
|
+
onChange: (id) => {
|
|
447
|
+
if (!props.blocked && typeof id === "string") props.onChange(id);
|
|
448
|
+
},
|
|
449
|
+
get children() {
|
|
450
|
+
return createComponent(DropdownMenuGroup, { get children() {
|
|
451
|
+
return [createComponent(DropdownMenuLabel, { children: "Thinking effort" }), createComponent(For, {
|
|
452
|
+
get each() {
|
|
453
|
+
return props.efforts;
|
|
454
|
+
},
|
|
455
|
+
children: (effort) => createComponent(DropdownMenuRadioItem, {
|
|
456
|
+
get value() {
|
|
457
|
+
return effort.id;
|
|
458
|
+
},
|
|
459
|
+
get disabled() {
|
|
460
|
+
return props.blocked;
|
|
461
|
+
},
|
|
462
|
+
get children() {
|
|
463
|
+
var _el$14 = _tmpl$1(), _el$15 = _el$14.firstChild;
|
|
464
|
+
insert(_el$15, () => effort.label);
|
|
465
|
+
insert(_el$14, createComponent(Show, {
|
|
466
|
+
get when() {
|
|
467
|
+
return effort.description;
|
|
468
|
+
},
|
|
469
|
+
get children() {
|
|
470
|
+
var _el$16 = _tmpl$5();
|
|
471
|
+
insert(_el$16, () => effort.description);
|
|
472
|
+
return _el$16;
|
|
473
|
+
}
|
|
474
|
+
}), null);
|
|
475
|
+
return _el$14;
|
|
476
|
+
}
|
|
477
|
+
})
|
|
478
|
+
})];
|
|
479
|
+
} });
|
|
480
|
+
}
|
|
481
|
+
});
|
|
482
|
+
}
|
|
483
|
+
})];
|
|
484
|
+
}
|
|
485
|
+
});
|
|
486
|
+
}
|
|
487
|
+
//#endregion
|
|
488
|
+
export { ModelSelector };
|
|
489
|
+
|
|
490
|
+
//# sourceMappingURL=model-selector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-selector.js","names":["Brain","Check","ChevronsUpDown","createEffect","createMemo","createSignal","createUniqueId","For","Show","splitProps","cn","Button","Command","CommandEmpty","CommandGroup","CommandInput","CommandItem","CommandList","DropdownMenu","DropdownMenuContent","DropdownMenuGroup","DropdownMenuLabel","DropdownMenuRadioGroup","DropdownMenuRadioItem","DropdownMenuTrigger","Popover","PopoverContent","PopoverTrigger","boundText","findModel","groupModels","modelSearchValue","needsSearch","normalizeEfforts","resolveEffort","ModelOption","ModelSelectorProps","models","value","effort","onChange","id","onEffortChange","searchThreshold","disabledReason","label","class","ModelSelector","props","local","blocked","undefined","selected","efforts","effortChoice","reason","reasonId","describedBy","_el$","_tmpl$2","_el$2","firstChild","_$insert","_$createComponent","when","fallback","children","_el$4","_tmpl$3","_el$5","triggerText","length","ModelMenu","ModelSearch","choice","_el$6","_tmpl$4","_el$7","EffortMenu","_el$3","_tmpl$","_$setAttribute","_$effect","_p$","_v$","_v$2","e","_$className","t","ModelOptionBody","model","_el$8","_tmpl$7","_el$9","description","_el$0","_tmpl$5","_el$1","_tmpl$6","_el$10","PickerProps","ModelTrigger","empty","_el$11","_tmpl$8","_c$","_$memo","open","setOpen","groups","inert","onOpenChange","next","placement","gutter","as","variant","size","aria-label","aria-disabled","aria-describedby","hideArrow","each","group","provider","disabled","placeholder","heading","onSelect","_tmpl$9","ReturnType","find","_el$13","_tmpl$0","_el$14","_tmpl$1","_el$15","_el$16","_$createComponent","_$className","_$setAttribute","_$memo"],"sources":["../../../../src/components/composites/model-selector/model-selector.tsx"],"sourcesContent":["import { Brain, Check, ChevronsUpDown } from 'lucide-solid'\nimport {\n createEffect,\n createMemo,\n createSignal,\n createUniqueId,\n For,\n Show,\n splitProps,\n} from 'solid-js'\nimport { cn } from '#lib/utils'\nimport { Button } from '../../ui/button'\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from '../../ui/command'\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuTrigger,\n} from '../../ui/dropdown-menu'\nimport { Popover, PopoverContent, PopoverTrigger } from '../../ui/popover'\nimport { boundText } from '../sources/source'\nimport {\n findModel,\n groupModels,\n modelSearchValue,\n needsSearch,\n normalizeEfforts,\n resolveEffort,\n type ModelOption,\n} from './models'\n\n/**\n * ModelSelector.\n *\n * Two controls in one group beside the composer: *which model*, and *how hard it\n * thinks*. They are one component because the second depends on the first — an\n * effort level belongs to a model, and switching model can make the chosen effort\n * meaningless — so a host should not have to keep two menus consistent by hand.\n *\n * ## What it takes and what it will not decide\n *\n * `models` carries each option's provider, optional description and optional\n * `disabledReason`; `value` and `effort` are the current choice; `onChange` and\n * `onEffortChange` report a new one. The component holds no selection of its own\n * (the host may veto, persist or reset it) and never decides what is allowed:\n *\n * - **An unavailable model stays in the list**, disabled, with the host's reason\n * beside it in words. Hiding it would leave the person guessing where it went.\n * - **No `onChange`, no menu.** The model is then plain text — a read-only\n * statement of what is running — not a button that does nothing. The same holds\n * for effort and `onEffortChange`.\n * - **Effort renders only when the selected model advertises `efforts`.** A model\n * that does not has no effort control, and a stored `effort` the model does not\n * offer is shown as unset rather than as a level the model never had.\n * - **A `value` that is not in the list is shown as given**, not swapped for a\n * model the person did not choose.\n * - `disabledReason` disables both and says why under the group.\n *\n * ## Short list or long\n *\n * Up to `searchThreshold` models (7) the model picker is a `DropdownMenu` with\n * radio rows grouped by provider: arrows, typeahead and Escape come from the menu\n * contract. Beyond it the list is a `Popover` holding a `Command` palette with a\n * search box, because scanning thirty rows is slower than typing four letters.\n * Both close on choice and return focus to the trigger. Triggers use\n * `aria-disabled` so a blocked control is still reachable and its reason read.\n */\nexport type ModelSelectorProps = {\n models: readonly ModelOption[]\n /** The selected model's id. */\n value?: string\n /** The selected effort's id. */\n effort?: string\n onChange?: (id: string) => void\n onEffortChange?: (effort: string) => void\n /** Show a search box above this many models. Default 7. */\n searchThreshold?: number\n /** Why neither control can be used right now. */\n disabledReason?: string\n /** The group's accessible name. */\n label?: string\n class?: string\n}\n\nexport function ModelSelector(props: ModelSelectorProps) {\n const [local] = splitProps(props, [\n 'models',\n 'value',\n 'effort',\n 'onChange',\n 'onEffortChange',\n 'searchThreshold',\n 'disabledReason',\n 'label',\n 'class',\n ])\n const blocked = () => local.disabledReason !== undefined\n const selected = () => findModel(local.models, local.value)\n const efforts = createMemo(() => normalizeEfforts(selected()?.efforts))\n const effortChoice = () => resolveEffort(selected(), local.effort)\n const reason = () => (local.disabledReason ? boundText(local.disabledReason, 240) : undefined)\n const reasonId = `${createUniqueId()}-reason`\n const describedBy = () => (reason() ? reasonId : undefined)\n\n return (\n <div data-slot=\"model-selector\" class={cn('flex min-w-0 flex-col gap-1', local.class)}>\n <div\n role=\"group\"\n aria-label={local.label ?? 'Model and thinking effort'}\n class=\"flex min-w-0 items-center gap-1\"\n >\n <Show\n when={local.onChange}\n fallback={\n <Show when={local.value}>\n <span class=\"truncate px-2 text-sm text-muted-foreground\">\n <span class=\"visually-hidden\">Model: </span>\n {triggerText({ selected: selected(), value: local.value })}\n </span>\n </Show>\n }\n >\n <Show\n when={needsSearch(local.models.length, local.searchThreshold)}\n fallback={\n <ModelMenu\n models={local.models}\n selected={selected()}\n value={local.value}\n blocked={blocked()}\n describedBy={describedBy()}\n onChange={(id) => local.onChange?.(id)}\n />\n }\n >\n <ModelSearch\n models={local.models}\n selected={selected()}\n value={local.value}\n blocked={blocked()}\n describedBy={describedBy()}\n onChange={(id) => local.onChange?.(id)}\n />\n </Show>\n </Show>\n <Show when={efforts().length > 0}>\n <Show\n when={local.onEffortChange}\n fallback={\n <Show when={effortChoice()}>\n {(choice) => (\n <span class=\"flex items-center gap-1 truncate px-2 text-sm text-muted-foreground\">\n <Brain aria-hidden=\"true\" class=\"size-3.5 shrink-0\" />\n <span class=\"visually-hidden\">Thinking effort: </span>\n {choice().label}\n </span>\n )}\n </Show>\n }\n >\n <EffortMenu\n efforts={efforts()}\n value={effortChoice()?.id}\n blocked={blocked()}\n describedBy={describedBy()}\n onChange={(id) => local.onEffortChange?.(id)}\n />\n </Show>\n </Show>\n </div>\n <Show when={reason()}>\n <p id={reasonId} role=\"status\" class=\"m-0 text-xs text-muted-foreground\">\n {reason()}\n </p>\n </Show>\n </div>\n )\n}\n\nfunction triggerText(props: { selected?: ModelOption; value?: string }): string {\n if (props.selected) return boundText(props.selected.label, 60)\n return props.value ? boundText(props.value, 60) : 'Choose a model'\n}\n\nfunction ModelOptionBody(props: { model: ModelOption }) {\n return (\n <span class=\"flex min-w-0 flex-col\">\n <span class=\"[overflow-wrap:anywhere]\">{boundText(props.model.label, 60)}</span>\n <Show when={props.model.description}>\n <span class=\"text-xs text-muted-foreground [overflow-wrap:anywhere]\">\n {boundText(props.model.description ?? '', 160)}\n </span>\n </Show>\n <Show when={props.model.disabledReason}>\n <span class=\"text-xs text-muted-foreground [overflow-wrap:anywhere]\">\n <span class=\"visually-hidden\">Unavailable: </span>\n {boundText(props.model.disabledReason ?? '', 160)}\n </span>\n </Show>\n </span>\n )\n}\n\ntype PickerProps = {\n models: readonly ModelOption[]\n selected?: ModelOption\n value?: string\n blocked: boolean\n describedBy?: string\n onChange: (id: string) => void\n}\n\nfunction ModelTrigger(props: { selected?: ModelOption; value?: string; empty: boolean }) {\n return (\n <>\n <span class=\"max-w-48 truncate\">\n {props.empty ? 'No models available' : triggerText(props)}\n </span>\n <ChevronsUpDown aria-hidden=\"true\" />\n </>\n )\n}\n\nfunction ModelMenu(props: PickerProps) {\n const [open, setOpen] = createSignal(false)\n const groups = createMemo(() => groupModels(props.models))\n const inert = () => props.blocked || props.models.length === 0\n\n createEffect(() => {\n if (inert()) setOpen(false)\n })\n\n return (\n <DropdownMenu\n open={open()}\n onOpenChange={(next) => setOpen(next && !inert())}\n placement=\"top-start\"\n gutter={6}\n >\n <DropdownMenuTrigger\n as={Button}\n variant=\"ghost\"\n size=\"sm\"\n aria-label={`Model: ${props.models.length === 0 ? 'none available' : triggerText(props)}`}\n aria-disabled={inert() || undefined}\n aria-describedby={props.describedBy}\n >\n <ModelTrigger\n selected={props.selected}\n value={props.value}\n empty={props.models.length === 0}\n />\n </DropdownMenuTrigger>\n <DropdownMenuContent hideArrow class=\"w-72 max-w-full\">\n <DropdownMenuRadioGroup\n value={props.value ?? ''}\n onChange={(id: unknown) => {\n // Disabled rows cannot be activated, but the guard is the contract.\n const model = typeof id === 'string' ? findModel(props.models, id) : undefined\n if (!props.blocked && model && model.disabledReason === undefined) {\n props.onChange(model.id)\n }\n }}\n >\n <For each={groups()}>\n {(group) => (\n <DropdownMenuGroup>\n <DropdownMenuLabel>{group.provider}</DropdownMenuLabel>\n <For each={group.models}>\n {(model) => (\n <DropdownMenuRadioItem\n value={model.id}\n disabled={inert() || model.disabledReason !== undefined}\n >\n <ModelOptionBody model={model} />\n </DropdownMenuRadioItem>\n )}\n </For>\n </DropdownMenuGroup>\n )}\n </For>\n </DropdownMenuRadioGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\nfunction ModelSearch(props: PickerProps) {\n const [open, setOpen] = createSignal(false)\n const groups = createMemo(() => groupModels(props.models))\n\n createEffect(() => {\n if (props.blocked) setOpen(false)\n })\n\n return (\n <Popover\n open={open()}\n onOpenChange={(next) => setOpen(next && !props.blocked)}\n placement=\"top-start\"\n gutter={6}\n >\n <PopoverTrigger\n as={Button}\n variant=\"ghost\"\n size=\"sm\"\n aria-label={`Model: ${triggerText(props)}`}\n aria-disabled={props.blocked || undefined}\n aria-describedby={props.describedBy}\n >\n <ModelTrigger selected={props.selected} value={props.value} empty={false} />\n </PopoverTrigger>\n <PopoverContent class=\"w-80 max-w-full\">\n <Command label=\"Choose a model\">\n <CommandInput placeholder=\"Search models\" />\n <CommandList>\n <CommandEmpty>No model matches.</CommandEmpty>\n <For each={groups()}>\n {(group) => (\n <CommandGroup heading={group.provider}>\n <For each={group.models}>\n {(model) => (\n <CommandItem\n value={modelSearchValue(model)}\n disabled={props.blocked || model.disabledReason !== undefined}\n onSelect={() => {\n if (props.blocked || model.disabledReason !== undefined) return\n props.onChange(model.id)\n setOpen(false)\n }}\n >\n <ModelOptionBody model={model} />\n <Show when={model.id === props.value}>\n <Check aria-hidden=\"true\" class=\"ms-auto text-primary\" />\n <span class=\"visually-hidden\">Current model</span>\n </Show>\n </CommandItem>\n )}\n </For>\n </CommandGroup>\n )}\n </For>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n )\n}\n\nfunction EffortMenu(props: {\n efforts: ReturnType<typeof normalizeEfforts>\n value?: string\n blocked: boolean\n describedBy?: string\n onChange: (id: string) => void\n}) {\n const [open, setOpen] = createSignal(false)\n const label = () => props.efforts.find((effort) => effort.id === props.value)?.label\n\n createEffect(() => {\n if (props.blocked) setOpen(false)\n })\n\n return (\n <DropdownMenu\n open={open()}\n onOpenChange={(next) => setOpen(next && !props.blocked)}\n placement=\"top-start\"\n gutter={6}\n >\n <DropdownMenuTrigger\n as={Button}\n variant=\"ghost\"\n size=\"sm\"\n aria-label={`Thinking effort: ${label() ?? 'not set'}`}\n aria-disabled={props.blocked || undefined}\n aria-describedby={props.describedBy}\n >\n <Brain aria-hidden=\"true\" />\n <span aria-hidden=\"true\">{label() ?? 'Effort'}</span>\n </DropdownMenuTrigger>\n <DropdownMenuContent hideArrow class=\"w-56 max-w-full\">\n <DropdownMenuRadioGroup\n value={props.value ?? ''}\n onChange={(id: unknown) => {\n if (!props.blocked && typeof id === 'string') props.onChange(id)\n }}\n >\n <DropdownMenuGroup>\n <DropdownMenuLabel>Thinking effort</DropdownMenuLabel>\n <For each={props.efforts}>\n {(effort) => (\n <DropdownMenuRadioItem value={effort.id} disabled={props.blocked}>\n <span class=\"flex min-w-0 flex-col\">\n <span>{effort.label}</span>\n <Show when={effort.description}>\n <span class=\"text-xs text-muted-foreground [overflow-wrap:anywhere]\">\n {effort.description}\n </span>\n </Show>\n </span>\n </DropdownMenuRadioItem>\n )}\n </For>\n </DropdownMenuGroup>\n </DropdownMenuRadioGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An effort level a model supports: just its id (`'high'`), or an id with the
|
|
3
|
+
* words to show. A bare id is labelled by capitalising it, which is right for
|
|
4
|
+
* `low` / `medium` / `high` and wrong for anything else — pass a label then.
|
|
5
|
+
*/
|
|
6
|
+
export type ModelEffort = string | Readonly<{
|
|
7
|
+
id: string;
|
|
8
|
+
label?: string;
|
|
9
|
+
description?: string;
|
|
10
|
+
}>;
|
|
11
|
+
export type EffortOption = Readonly<{
|
|
12
|
+
id: string;
|
|
13
|
+
label: string;
|
|
14
|
+
description?: string;
|
|
15
|
+
}>;
|
|
16
|
+
/**
|
|
17
|
+
* A model the person may pick. `efforts` lists the effort levels *this* model
|
|
18
|
+
* advertises; a model without it has no effort control, because showing one would
|
|
19
|
+
* claim the model can be told how hard to think. `disabledReason` is the host's
|
|
20
|
+
* authority speaking (plan, quota, region): the model stays in the list, disabled,
|
|
21
|
+
* with the reason beside it.
|
|
22
|
+
*/
|
|
23
|
+
export type ModelOption = Readonly<{
|
|
24
|
+
/** Unique within the list. */
|
|
25
|
+
id: string;
|
|
26
|
+
label: string;
|
|
27
|
+
provider: string;
|
|
28
|
+
description?: string;
|
|
29
|
+
disabledReason?: string;
|
|
30
|
+
efforts?: readonly ModelEffort[];
|
|
31
|
+
}>;
|
|
32
|
+
/** Efforts as options: blanks dropped, duplicate ids kept once (first wins), text bounded. */
|
|
33
|
+
export declare function normalizeEfforts(efforts: readonly ModelEffort[] | undefined): EffortOption[];
|
|
34
|
+
export declare function findModel(models: readonly ModelOption[], id: string | undefined): ModelOption | undefined;
|
|
35
|
+
/** The selected effort, only if the selected model actually offers it. */
|
|
36
|
+
export declare function resolveEffort(model: ModelOption | undefined, effort: string | undefined): EffortOption | undefined;
|
|
37
|
+
export type ModelGroup = Readonly<{
|
|
38
|
+
provider: string;
|
|
39
|
+
models: readonly ModelOption[];
|
|
40
|
+
}>;
|
|
41
|
+
/** Group by provider, in the order providers first appear, so the host controls ranking. */
|
|
42
|
+
export declare function groupModels(models: readonly ModelOption[]): ModelGroup[];
|
|
43
|
+
/** Past this many models the list gets a search box; a short list is quicker to read. */
|
|
44
|
+
export declare const MODEL_SEARCH_THRESHOLD = 7;
|
|
45
|
+
export declare function needsSearch(count: number, threshold?: number): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* What the search matches against: everything a person might type to find a model
|
|
48
|
+
* — its name, its provider, its id, and its description.
|
|
49
|
+
*/
|
|
50
|
+
export declare function modelSearchValue(model: ModelOption): string;
|
|
51
|
+
//# sourceMappingURL=models.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../../../src/components/composites/model-selector/models.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,QAAQ,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAA;AAEjG,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAA;AAExF;;;;;;GAMG;AACH,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC;IACjC,8BAA8B;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,OAAO,CAAC,EAAE,SAAS,WAAW,EAAE,CAAA;CACjC,CAAC,CAAA;AAUF,8FAA8F;AAC9F,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,GAAG,SAAS,GAAG,YAAY,EAAE,CAoB5F;AAED,wBAAgB,SAAS,CACvB,MAAM,EAAE,SAAS,WAAW,EAAE,EAC9B,EAAE,EAAE,MAAM,GAAG,SAAS,GACrB,WAAW,GAAG,SAAS,CAEzB;AAED,0EAA0E;AAC1E,wBAAgB,aAAa,CAC3B,KAAK,EAAE,WAAW,GAAG,SAAS,EAC9B,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,YAAY,GAAG,SAAS,CAG1B;AAED,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAA;CAAE,CAAC,CAAA;AAEvF,4FAA4F;AAC5F,wBAAgB,WAAW,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,GAAG,UAAU,EAAE,CASxE;AAED,yFAAyF;AACzF,eAAO,MAAM,sBAAsB,IAAI,CAAA;AAEvC,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,SAAyB,GAAG,OAAO,CAEtF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAE3D"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { boundText } from "../sources/source.js";
|
|
2
|
+
//#region src/components/composites/model-selector/models.ts
|
|
3
|
+
var LABEL_LIMIT = 60;
|
|
4
|
+
var DESCRIPTION_LIMIT = 160;
|
|
5
|
+
function titleCase(id) {
|
|
6
|
+
const clean = boundText(id, LABEL_LIMIT);
|
|
7
|
+
return clean.charAt(0).toUpperCase() + clean.slice(1);
|
|
8
|
+
}
|
|
9
|
+
/** Efforts as options: blanks dropped, duplicate ids kept once (first wins), text bounded. */
|
|
10
|
+
function normalizeEfforts(efforts) {
|
|
11
|
+
const seen = /* @__PURE__ */ new Set();
|
|
12
|
+
const out = [];
|
|
13
|
+
for (const effort of efforts ?? []) {
|
|
14
|
+
const id = typeof effort === "string" ? effort : effort.id;
|
|
15
|
+
if (id.trim() === "" || seen.has(id)) continue;
|
|
16
|
+
seen.add(id);
|
|
17
|
+
if (typeof effort === "string") out.push({
|
|
18
|
+
id,
|
|
19
|
+
label: titleCase(id)
|
|
20
|
+
});
|
|
21
|
+
else out.push({
|
|
22
|
+
id,
|
|
23
|
+
label: (effort.label ? boundText(effort.label, LABEL_LIMIT) : "") || titleCase(id),
|
|
24
|
+
description: effort.description ? boundText(effort.description, DESCRIPTION_LIMIT) : void 0
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
return out;
|
|
28
|
+
}
|
|
29
|
+
function findModel(models, id) {
|
|
30
|
+
return id === void 0 ? void 0 : models.find((model) => model.id === id);
|
|
31
|
+
}
|
|
32
|
+
/** The selected effort, only if the selected model actually offers it. */
|
|
33
|
+
function resolveEffort(model, effort) {
|
|
34
|
+
if (!model || effort === void 0) return void 0;
|
|
35
|
+
return normalizeEfforts(model.efforts).find((option) => option.id === effort);
|
|
36
|
+
}
|
|
37
|
+
/** Group by provider, in the order providers first appear, so the host controls ranking. */
|
|
38
|
+
function groupModels(models) {
|
|
39
|
+
const groups = /* @__PURE__ */ new Map();
|
|
40
|
+
for (const model of models) {
|
|
41
|
+
const provider = boundText(model.provider, LABEL_LIMIT) || "Other";
|
|
42
|
+
const bucket = groups.get(provider);
|
|
43
|
+
if (bucket) bucket.push(model);
|
|
44
|
+
else groups.set(provider, [model]);
|
|
45
|
+
}
|
|
46
|
+
return [...groups].map(([provider, list]) => ({
|
|
47
|
+
provider,
|
|
48
|
+
models: list
|
|
49
|
+
}));
|
|
50
|
+
}
|
|
51
|
+
/** Past this many models the list gets a search box; a short list is quicker to read. */
|
|
52
|
+
var MODEL_SEARCH_THRESHOLD = 7;
|
|
53
|
+
function needsSearch(count, threshold = 7) {
|
|
54
|
+
return count > threshold;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* What the search matches against: everything a person might type to find a model
|
|
58
|
+
* — its name, its provider, its id, and its description.
|
|
59
|
+
*/
|
|
60
|
+
function modelSearchValue(model) {
|
|
61
|
+
return [
|
|
62
|
+
model.label,
|
|
63
|
+
model.provider,
|
|
64
|
+
model.id,
|
|
65
|
+
model.description ?? ""
|
|
66
|
+
].join(" ");
|
|
67
|
+
}
|
|
68
|
+
//#endregion
|
|
69
|
+
export { MODEL_SEARCH_THRESHOLD, findModel, groupModels, modelSearchValue, needsSearch, normalizeEfforts, resolveEffort };
|
|
70
|
+
|
|
71
|
+
//# sourceMappingURL=models.js.map
|