@opentiny/tiny-robot 0.5.1-alpha.1 → 0.5.1-alpha.14

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.
Files changed (287) hide show
  1. package/dist/attachments/index.js +261 -258
  2. package/dist/dropdown-menu/index.js +1 -1
  3. package/dist/extension-manager/index.js +473 -0
  4. package/dist/floating-ui.dom.js +970 -0
  5. package/dist/index.d.ts +5949 -51
  6. package/dist/index.js +116 -103
  7. package/dist/index4.js +2 -2
  8. package/dist/index6.js +441 -431
  9. package/dist/index8.js +87 -102
  10. package/dist/layout/index.js +1 -1
  11. package/dist/model-selector/index.js +1002 -0
  12. package/dist/sender/index.js +1232 -2114
  13. package/dist/style.css +1 -1
  14. package/dist/suggestion-pills/index.js +1 -1
  15. package/dist/suggestion-popover/index.js +37 -36
  16. package/dist/theme-provider/index.js +41 -32
  17. package/dist/useSenderContentRegistration.js +8 -0
  18. package/dist/useSlotRefs.js +1 -1
  19. package/dist/useTeleportTarget.js +25 -0
  20. package/dist/utils.js +1 -1
  21. package/package.json +4 -23
  22. package/README.md +0 -192
  23. package/README.zh-CN.md +0 -192
  24. package/dist/action-group/ActionGroup.vue.d.ts +0 -26
  25. package/dist/action-group/ActionGroupItem.vue.d.ts +0 -18
  26. package/dist/action-group/index.d.ts +0 -12
  27. package/dist/action-group/index.type.d.ts +0 -17
  28. package/dist/anchor/components/AnchorItem.vue.d.ts +0 -24
  29. package/dist/anchor/components/AnchorList.vue.d.ts +0 -20
  30. package/dist/anchor/components/AnchorOverlay.vue.d.ts +0 -33
  31. package/dist/anchor/components/AnchorSearch.vue.d.ts +0 -7
  32. package/dist/anchor/composables/index.d.ts +0 -5
  33. package/dist/anchor/composables/useActiveSync.d.ts +0 -10
  34. package/dist/anchor/composables/useFloatingOffset.d.ts +0 -6
  35. package/dist/anchor/composables/useNavController.d.ts +0 -12
  36. package/dist/anchor/composables/useOverlayInteractions.d.ts +0 -6
  37. package/dist/anchor/composables/useTargetFeedback.d.ts +0 -5
  38. package/dist/anchor/defaults.d.ts +0 -16
  39. package/dist/anchor/index.d.ts +0 -7
  40. package/dist/anchor/index.type.d.ts +0 -60
  41. package/dist/anchor/index.vue.d.ts +0 -159
  42. package/dist/anchor/internal.type.d.ts +0 -103
  43. package/dist/anchor/utils/scroll.d.ts +0 -7
  44. package/dist/anchor/utils/target.d.ts +0 -6
  45. package/dist/attachments/components/FileCard.vue.d.ts +0 -18
  46. package/dist/attachments/components/ImagePreview.vue.d.ts +0 -17
  47. package/dist/attachments/components/index.d.ts +0 -2
  48. package/dist/attachments/composables/index.d.ts +0 -5
  49. package/dist/attachments/composables/useFileCard.d.ts +0 -15
  50. package/dist/attachments/composables/useFileType.d.ts +0 -20
  51. package/dist/attachments/composables/useImagePreview.d.ts +0 -18
  52. package/dist/attachments/composables/useListType.d.ts +0 -11
  53. package/dist/attachments/index.d.ts +0 -7
  54. package/dist/attachments/index.type.d.ts +0 -70
  55. package/dist/attachments/index.vue.d.ts +0 -27
  56. package/dist/attachments/utils.d.ts +0 -3
  57. package/dist/base-popper/components/Popper.vue.d.ts +0 -28
  58. package/dist/base-popper/index.d.ts +0 -2
  59. package/dist/base-popper/index.vue.d.ts +0 -41
  60. package/dist/bubble/Bubble.vue.d.ts +0 -47
  61. package/dist/bubble/BubbleBoxWrapper.vue.d.ts +0 -22
  62. package/dist/bubble/BubbleContentWrapper.vue.d.ts +0 -22
  63. package/dist/bubble/BubbleItem.vue.d.ts +0 -44
  64. package/dist/bubble/BubbleList.vue.d.ts +0 -43
  65. package/dist/bubble/BubbleProvider.vue.d.ts +0 -18
  66. package/dist/bubble/composables/index.d.ts +0 -11
  67. package/dist/bubble/composables/useBubbleBoxRenderer.d.ts +0 -18
  68. package/dist/bubble/composables/useBubbleContentRenderer.d.ts +0 -18
  69. package/dist/bubble/composables/useBubbleEvent.d.ts +0 -3
  70. package/dist/bubble/composables/useBubbleStateChange.d.ts +0 -1
  71. package/dist/bubble/composables/useBubbleStore.d.ts +0 -16
  72. package/dist/bubble/composables/useContentResolver.d.ts +0 -5
  73. package/dist/bubble/composables/useCopyCleanup.d.ts +0 -6
  74. package/dist/bubble/composables/useMessageContent.d.ts +0 -5
  75. package/dist/bubble/composables/useMessageGroup.d.ts +0 -4
  76. package/dist/bubble/composables/useOmitMessageFields.d.ts +0 -12
  77. package/dist/bubble/composables/useToolCall.d.ts +0 -25
  78. package/dist/bubble/constants.d.ts +0 -42
  79. package/dist/bubble/index.d.ts +0 -19
  80. package/dist/bubble/index.type.d.ts +0 -185
  81. package/dist/bubble/renderers/Box.vue.d.ts +0 -18
  82. package/dist/bubble/renderers/Image.vue.d.ts +0 -4
  83. package/dist/bubble/renderers/Loading.vue.d.ts +0 -4
  84. package/dist/bubble/renderers/Markdown.vue.d.ts +0 -4
  85. package/dist/bubble/renderers/Reasoning.vue.d.ts +0 -9
  86. package/dist/bubble/renderers/Text.vue.d.ts +0 -4
  87. package/dist/bubble/renderers/Tool.vue.d.ts +0 -14
  88. package/dist/bubble/renderers/ToolRole.vue.d.ts +0 -4
  89. package/dist/bubble/renderers/Tools.vue.d.ts +0 -4
  90. package/dist/bubble/renderers/allRenderers.d.ts +0 -93
  91. package/dist/bubble/renderers/defaultRenderers.d.ts +0 -27
  92. package/dist/bubble/utils.d.ts +0 -7
  93. package/dist/chat/components/ChatConversation.vue.d.ts +0 -305
  94. package/dist/chat/components/ChatLauncherButton.vue.d.ts +0 -12
  95. package/dist/chat/components/ChatMcpTrigger.vue.d.ts +0 -30
  96. package/dist/chat/components/ChatThemeToggleButton.vue.d.ts +0 -6
  97. package/dist/chat/components/ChatWelcome.vue.d.ts +0 -14
  98. package/dist/chat/components/icons/IconModelAliyunBailian.vue.d.ts +0 -7
  99. package/dist/chat/components/icons/IconModelDeepseek.vue.d.ts +0 -7
  100. package/dist/chat/components/icons/index.d.ts +0 -5
  101. package/dist/chat/composables/useChatConversation.d.ts +0 -37
  102. package/dist/chat/composables/useChatMcp.d.ts +0 -29
  103. package/dist/chat/composables/useChatModel.d.ts +0 -27
  104. package/dist/chat/index.d.ts +0 -9
  105. package/dist/chat/index.js +0 -13904
  106. package/dist/chat/index.type.d.ts +0 -92
  107. package/dist/chat/index.vue.d.ts +0 -51
  108. package/dist/chat/locale.d.ts +0 -12
  109. package/dist/chat/mcpServers.d.ts +0 -3
  110. package/dist/container/index.d.ts +0 -7
  111. package/dist/container/index.type.d.ts +0 -20
  112. package/dist/container/index.vue.d.ts +0 -32
  113. package/dist/conversations/index.d.ts +0 -7
  114. package/dist/conversations/index.vue.d.ts +0 -2
  115. package/dist/drag-overlay/constants.d.ts +0 -17
  116. package/dist/drag-overlay/directives/vDropzone.d.ts +0 -14
  117. package/dist/drag-overlay/index.d.ts +0 -7
  118. package/dist/drag-overlay/index.type.d.ts +0 -105
  119. package/dist/drag-overlay/index.vue.d.ts +0 -20
  120. package/dist/dropdown-menu/composables/usePopperHover.d.ts +0 -6
  121. package/dist/dropdown-menu/index.d.ts +0 -7
  122. package/dist/dropdown-menu/index.type.d.ts +0 -42
  123. package/dist/dropdown-menu/index.vue.d.ts +0 -217
  124. package/dist/feedback/components/SourceList.vue.d.ts +0 -11
  125. package/dist/feedback/components/index.d.ts +0 -1
  126. package/dist/feedback/index.d.ts +0 -7
  127. package/dist/feedback/index.type.d.ts +0 -25
  128. package/dist/feedback/index.vue.d.ts +0 -13
  129. package/dist/flow-layout-buttons/index.d.ts +0 -7
  130. package/dist/flow-layout-buttons/index.type.d.ts +0 -35
  131. package/dist/flow-layout-buttons/index.vue.d.ts +0 -22
  132. package/dist/history/components/Empty.vue.d.ts +0 -7
  133. package/dist/history/components/MenuList.vue.d.ts +0 -24
  134. package/dist/history/composables/useRenameEditor.d.ts +0 -22
  135. package/dist/history/constants.d.ts +0 -1
  136. package/dist/history/index.d.ts +0 -7
  137. package/dist/history/index.type.d.ts +0 -33
  138. package/dist/history/index.vue.d.ts +0 -18
  139. package/dist/icon-button/index.d.ts +0 -7
  140. package/dist/icon-button/index.type.d.ts +0 -7
  141. package/dist/icon-button/index.vue.d.ts +0 -6
  142. package/dist/layout/Layout.vue.d.ts +0 -246
  143. package/dist/layout/LayoutAsideToggle.vue.d.ts +0 -20
  144. package/dist/layout/LayoutProxyScrollbar.vue.d.ts +0 -6
  145. package/dist/layout/components/AsideContent.vue.d.ts +0 -35
  146. package/dist/layout/components/AsideResizeTrigger.vue.d.ts +0 -20
  147. package/dist/layout/components/FloatingDragBar.vue.d.ts +0 -18
  148. package/dist/layout/components/FloatingResizeTrigger.vue.d.ts +0 -17
  149. package/dist/layout/components/FloatingResizeTriggers.vue.d.ts +0 -14
  150. package/dist/layout/components/LayoutSurface.vue.d.ts +0 -41
  151. package/dist/layout/composables/useLayoutAsideStates.d.ts +0 -21
  152. package/dist/layout/composables/useLayoutContext.d.ts +0 -4
  153. package/dist/layout/composables/usePointerDrag.d.ts +0 -19
  154. package/dist/layout/index.d.ts +0 -22
  155. package/dist/layout/index.type.d.ts +0 -111
  156. package/dist/layout/internal.type.d.ts +0 -43
  157. package/dist/layout/utils/asideEventEmitters.d.ts +0 -6
  158. package/dist/layout/utils/asidePresets.d.ts +0 -5
  159. package/dist/layout/utils/cssLength.d.ts +0 -2
  160. package/dist/layout/utils/domInteraction.d.ts +0 -1
  161. package/dist/layout/utils/number.d.ts +0 -1
  162. package/dist/layout/utils/surfaceGeometry.d.ts +0 -87
  163. package/dist/layout/utils/surfaceResize.d.ts +0 -10
  164. package/dist/mcp-add-form/components/CodeEditor.vue.d.ts +0 -9
  165. package/dist/mcp-add-form/components/FormEditor.vue.d.ts +0 -10
  166. package/dist/mcp-add-form/components/index.d.ts +0 -2
  167. package/dist/mcp-add-form/index.d.ts +0 -7
  168. package/dist/mcp-add-form/index.type.d.ts +0 -19
  169. package/dist/mcp-add-form/index.vue.d.ts +0 -13
  170. package/dist/mcp-server-picker/components/NoData.vue.d.ts +0 -7
  171. package/dist/mcp-server-picker/components/PluginCard.vue.d.ts +0 -40
  172. package/dist/mcp-server-picker/components/PluginModal.vue.d.ts +0 -15
  173. package/dist/mcp-server-picker/components/index.d.ts +0 -3
  174. package/dist/mcp-server-picker/index.d.ts +0 -7
  175. package/dist/mcp-server-picker/index.type.d.ts +0 -99
  176. package/dist/mcp-server-picker/index.vue.d.ts +0 -71
  177. package/dist/prompts/index.d.ts +0 -12
  178. package/dist/prompts/index.type.d.ts +0 -59
  179. package/dist/prompts/prompt.vue.d.ts +0 -5
  180. package/dist/prompts/prompts.vue.d.ts +0 -20
  181. package/dist/sender/components/editor-content/index.vue.d.ts +0 -4
  182. package/dist/sender/components/footer/index.vue.d.ts +0 -38
  183. package/dist/sender/components/layouts/MultiLineLayout.vue.d.ts +0 -43
  184. package/dist/sender/components/layouts/SingleLineLayout.vue.d.ts +0 -32
  185. package/dist/sender/composables/index.d.ts +0 -7
  186. package/dist/sender/composables/useAutoSize.d.ts +0 -5
  187. package/dist/sender/composables/useEditor.d.ts +0 -13
  188. package/dist/sender/composables/useKeyboardShortcuts.d.ts +0 -7
  189. package/dist/sender/composables/useModeSwitch.d.ts +0 -4
  190. package/dist/sender/composables/useSenderCore.d.ts +0 -31
  191. package/dist/sender/composables/useSlotScope.d.ts +0 -10
  192. package/dist/sender/context/index.d.ts +0 -6
  193. package/dist/sender/context/types.d.ts +0 -7
  194. package/dist/sender/extensions/constants.d.ts +0 -94
  195. package/dist/sender/extensions/index.d.ts +0 -12
  196. package/dist/sender/extensions/mention/commands.d.ts +0 -20
  197. package/dist/sender/extensions/mention/components/mention-list.vue.d.ts +0 -18
  198. package/dist/sender/extensions/mention/components/mention-view.vue.d.ts +0 -19
  199. package/dist/sender/extensions/mention/extension.d.ts +0 -6
  200. package/dist/sender/extensions/mention/index.d.ts +0 -22
  201. package/dist/sender/extensions/mention/plugin.d.ts +0 -16
  202. package/dist/sender/extensions/mention/types.d.ts +0 -126
  203. package/dist/sender/extensions/mention/utils.d.ts +0 -34
  204. package/dist/sender/extensions/suggestion/extension.d.ts +0 -8
  205. package/dist/sender/extensions/suggestion/index.d.ts +0 -20
  206. package/dist/sender/extensions/suggestion/plugin.d.ts +0 -21
  207. package/dist/sender/extensions/suggestion/suggestion-list.vue.d.ts +0 -46
  208. package/dist/sender/extensions/suggestion/types.d.ts +0 -254
  209. package/dist/sender/extensions/suggestion/utils/filter.d.ts +0 -29
  210. package/dist/sender/extensions/suggestion/utils/highlight.d.ts +0 -73
  211. package/dist/sender/extensions/template/block/extension.d.ts +0 -6
  212. package/dist/sender/extensions/template/block/plugins.d.ts +0 -13
  213. package/dist/sender/extensions/template/block/template-block-view.vue.d.ts +0 -14
  214. package/dist/sender/extensions/template/commands.d.ts +0 -31
  215. package/dist/sender/extensions/template/extension.d.ts +0 -6
  216. package/dist/sender/extensions/template/index.d.ts +0 -21
  217. package/dist/sender/extensions/template/select/dropdown-manager.d.ts +0 -23
  218. package/dist/sender/extensions/template/select/extension.d.ts +0 -5
  219. package/dist/sender/extensions/template/select/plugins.d.ts +0 -34
  220. package/dist/sender/extensions/template/select/template-select-view.vue.d.ts +0 -20
  221. package/dist/sender/extensions/template/types.d.ts +0 -100
  222. package/dist/sender/extensions/template/utils.d.ts +0 -20
  223. package/dist/sender/extensions/utils/id-generator.d.ts +0 -16
  224. package/dist/sender/extensions/utils/index.d.ts +0 -7
  225. package/dist/sender/extensions/utils/keyboard.d.ts +0 -49
  226. package/dist/sender/extensions/utils/position.d.ts +0 -25
  227. package/dist/sender/index.d.ts +0 -139
  228. package/dist/sender/index.type.d.ts +0 -311
  229. package/dist/sender/index.vue.d.ts +0 -93
  230. package/dist/sender/types/base.d.ts +0 -239
  231. package/dist/sender/types/components.d.ts +0 -68
  232. package/dist/sender/types/composables.d.ts +0 -122
  233. package/dist/sender/types/context.d.ts +0 -138
  234. package/dist/sender/types/slots.d.ts +0 -67
  235. package/dist/sender/utils/countGraphemes.d.ts +0 -1
  236. package/dist/sender-actions/action-button/index.vue.d.ts +0 -23
  237. package/dist/sender-actions/clear-button/index.vue.d.ts +0 -2
  238. package/dist/sender-actions/clear-button/useClearButtonState.d.ts +0 -6
  239. package/dist/sender-actions/default-actions/index.vue.d.ts +0 -17
  240. package/dist/sender-actions/index.d.ts +0 -21
  241. package/dist/sender-actions/index.type.d.ts +0 -7
  242. package/dist/sender-actions/submit-button/index.vue.d.ts +0 -2
  243. package/dist/sender-actions/types/common.d.ts +0 -40
  244. package/dist/sender-actions/types/index.d.ts +0 -5
  245. package/dist/sender-actions/types/tooltip.d.ts +0 -7
  246. package/dist/sender-actions/upload-button/index.type.d.ts +0 -57
  247. package/dist/sender-actions/upload-button/index.vue.d.ts +0 -16
  248. package/dist/sender-actions/utils/tooltip.d.ts +0 -8
  249. package/dist/sender-actions/voice-button/index.type.d.ts +0 -78
  250. package/dist/sender-actions/voice-button/index.vue.d.ts +0 -43
  251. package/dist/sender-actions/voice-button/speech.types.d.ts +0 -40
  252. package/dist/sender-actions/voice-button/useSpeechHandler.d.ts +0 -10
  253. package/dist/sender-actions/voice-button/webSpeechHandler.d.ts +0 -40
  254. package/dist/sender-actions/word-counter/index.vue.d.ts +0 -2
  255. package/dist/sender-compat/index.d.ts +0 -7
  256. package/dist/sender-compat/index.type.d.ts +0 -91
  257. package/dist/sender-compat/index.vue.d.ts +0 -538
  258. package/dist/shared/composables/createTeleport.d.ts +0 -2
  259. package/dist/shared/composables/index.d.ts +0 -6
  260. package/dist/shared/composables/useAutoScroll.d.ts +0 -25
  261. package/dist/shared/composables/useControllableState.d.ts +0 -20
  262. package/dist/shared/composables/useSlotRefs.d.ts +0 -12
  263. package/dist/shared/composables/useTeleportTarget.d.ts +0 -11
  264. package/dist/shared/composables/useTouchDevice.d.ts +0 -3
  265. package/dist/shared/utils.d.ts +0 -7
  266. package/dist/suggestion-pills/components/PillButton.vue.d.ts +0 -16
  267. package/dist/suggestion-pills/components/index.d.ts +0 -1
  268. package/dist/suggestion-pills/index.d.ts +0 -13
  269. package/dist/suggestion-pills/index.type.d.ts +0 -45
  270. package/dist/suggestion-pills/index.vue.d.ts +0 -44
  271. package/dist/suggestion-popover/components/Backdrop.vue.d.ts +0 -5
  272. package/dist/suggestion-popover/components/Header.vue.d.ts +0 -4
  273. package/dist/suggestion-popover/components/Loading.vue.d.ts +0 -17
  274. package/dist/suggestion-popover/components/NoData.vue.d.ts +0 -17
  275. package/dist/suggestion-popover/components/Tooltip.vue.d.ts +0 -19
  276. package/dist/suggestion-popover/index.d.ts +0 -7
  277. package/dist/suggestion-popover/index.type.d.ts +0 -80
  278. package/dist/suggestion-popover/index.vue.d.ts +0 -262
  279. package/dist/theme-provider/constants.d.ts +0 -6
  280. package/dist/theme-provider/index.d.ts +0 -9
  281. package/dist/theme-provider/index.type.d.ts +0 -18
  282. package/dist/theme-provider/index.vue.d.ts +0 -32
  283. package/dist/theme-provider/useTheme.d.ts +0 -11
  284. package/dist/useTheme.js +0 -22
  285. package/dist/welcome/index.d.ts +0 -7
  286. package/dist/welcome/index.type.d.ts +0 -10
  287. package/dist/welcome/index.vue.d.ts +0 -18
@@ -0,0 +1,1002 @@
1
+ import { shallowRef as V, computed as g, watch as Y, nextTick as Z, defineComponent as J, openBlock as p, createElementBlock as w, createElementVNode as z, toDisplayString as q, Fragment as ne, renderList as ae, normalizeClass as N, withModifiers as ge, renderSlot as I, createBlock as _, resolveDynamicComponent as ie, createCommentVNode as B, createVNode as j, unref as P, createSlots as te, withCtx as A, mergeProps as se, onMounted as ue, onBeforeUnmount as pe, normalizeStyle as ye, normalizeProps as H, guardReactiveProps as U, onScopeDispose as be, toRaw as we, getCurrentInstance as ke, Teleport as $e } from "vue";
2
+ import { IconCheck as Ee, IconSearch as Oe, IconNoData as Se, IconArrowDown as xe } from "@opentiny/tiny-robot-svgs";
3
+ import { a as Me, c as Pe, o as Ve, f as Te, s as Ce, b as De } from "../floating-ui.dom.js";
4
+ import { u as Ie } from "../useTeleportTarget.js";
5
+ function ze(e) {
6
+ const a = V(""), n = g(() => a.value.trim()), t = g(() => {
7
+ const h = e.options(), i = n.value;
8
+ if (!e.searchable() || !i)
9
+ return h;
10
+ const r = e.filterMethod();
11
+ if (r)
12
+ return h.filter((v) => r(i, v.raw));
13
+ const s = i.toLocaleLowerCase();
14
+ return h.filter((v) => v.searchText.includes(s));
15
+ }), u = g(() => {
16
+ const h = /* @__PURE__ */ new Map();
17
+ return t.value.forEach((i) => {
18
+ var s, v;
19
+ const r = h.get(i.groupKey);
20
+ if (r) {
21
+ r.items.push(i);
22
+ return;
23
+ }
24
+ h.set(i.groupKey, {
25
+ key: i.groupKey,
26
+ index: h.size,
27
+ group: ((s = i.raw.group) == null ? void 0 : s.trim()) ?? "",
28
+ label: ((v = i.raw.group) == null ? void 0 : v.trim()) ?? "",
29
+ items: [i]
30
+ });
31
+ }), [...h.values()];
32
+ }), c = g(() => t.value.length === 0);
33
+ function d(h) {
34
+ a.value = h;
35
+ }
36
+ function f() {
37
+ a.value = "";
38
+ }
39
+ return {
40
+ query: a,
41
+ visibleOptions: t,
42
+ groups: u,
43
+ isEmpty: c,
44
+ setQuery: d,
45
+ clearQuery: f
46
+ };
47
+ }
48
+ function Be(e) {
49
+ const a = V(null), n = g(() => e.options().find((i) => i.key === a.value) ?? null);
50
+ function t() {
51
+ return e.options().filter((i) => !i.disabled);
52
+ }
53
+ function u(i) {
54
+ if (i === null) {
55
+ a.value = null;
56
+ return;
57
+ }
58
+ const r = e.options().find((s) => s.key === i);
59
+ r && !r.disabled && (a.value = r.key);
60
+ }
61
+ function c() {
62
+ a.value = null;
63
+ }
64
+ function d(i) {
65
+ const r = t(), s = i === "first" ? r[0] : r[r.length - 1];
66
+ a.value = (s == null ? void 0 : s.key) ?? null;
67
+ }
68
+ function f(i = "first") {
69
+ const r = e.selectedValue(), s = e.options().find((v) => v.value === r && !v.disabled);
70
+ if (s) {
71
+ a.value = s.key;
72
+ return;
73
+ }
74
+ d(i);
75
+ }
76
+ function h(i) {
77
+ var y, S;
78
+ const r = t();
79
+ if (r.length === 0) {
80
+ c();
81
+ return;
82
+ }
83
+ const s = r.findIndex((E) => E.key === a.value);
84
+ if (s < 0) {
85
+ const E = i === 1 ? 0 : r.length - 1;
86
+ a.value = ((y = r[E]) == null ? void 0 : y.key) ?? null;
87
+ return;
88
+ }
89
+ const v = (s + i + r.length) % r.length;
90
+ a.value = ((S = r[v]) == null ? void 0 : S.key) ?? null;
91
+ }
92
+ return Y(
93
+ () => [e.enabled(), e.options(), e.selectedValue()],
94
+ ([i, r, s], v) => {
95
+ if (!i) {
96
+ c();
97
+ return;
98
+ }
99
+ const y = v == null ? void 0 : v[2], S = r.find((b) => b.value === s && !b.disabled);
100
+ if (s !== y && S) {
101
+ a.value = S.key;
102
+ return;
103
+ }
104
+ (a.value ? r.some((b) => b.key === a.value && !b.disabled) : !1) || f("first");
105
+ },
106
+ { immediate: !0 }
107
+ ), Y(a, async (i) => {
108
+ if (!i || !e.enabled())
109
+ return;
110
+ await Z();
111
+ const r = e.containerEl.value, s = Array.from(
112
+ (r == null ? void 0 : r.querySelectorAll("[data-model-selector-option-key]")) ?? []
113
+ ).find((v) => v.dataset.modelSelectorOptionKey === i);
114
+ s == null || s.scrollIntoView({ block: "nearest" });
115
+ }), {
116
+ highlightedKey: a,
117
+ highlightedOption: n,
118
+ setHighlightedKey: u,
119
+ resetHighlight: c,
120
+ highlightBoundary: d,
121
+ highlightSelectedOrBoundary: f,
122
+ moveHighlight: h
123
+ };
124
+ }
125
+ const Le = { class: "tr-model-selector__effort" }, Re = { class: "tr-model-selector__effort-label" }, Ke = ["aria-label"], qe = ["disabled", "aria-pressed", "data-model-selector-effort-value", "onClick"], Fe = /* @__PURE__ */ J({
126
+ name: "TrModelSelectorEffort",
127
+ __name: "ModelSelectorEffort",
128
+ props: {
129
+ options: {},
130
+ value: {},
131
+ label: {},
132
+ disabled: { type: Boolean }
133
+ },
134
+ emits: ["select"],
135
+ setup(e) {
136
+ return (a, n) => (p(), w("div", Le, [
137
+ z("span", Re, q(e.label), 1),
138
+ z("div", {
139
+ class: "tr-model-selector__effort-options",
140
+ role: "group",
141
+ "aria-label": e.label
142
+ }, [
143
+ (p(!0), w(ne, null, ae(e.options, (t) => (p(), w("button", {
144
+ key: t.value,
145
+ type: "button",
146
+ class: N(["tr-model-selector__effort-option", { "is-active": t.value === e.value }]),
147
+ disabled: e.disabled || t.disabled,
148
+ "aria-pressed": t.value === e.value,
149
+ "data-model-selector-effort-value": t.value,
150
+ onClick: (u) => a.$emit("select", t.value)
151
+ }, q(t.label), 11, qe))), 128))
152
+ ], 8, Ke)
153
+ ]));
154
+ }
155
+ }), Ae = ["id", "data-model-selector-option-key", "aria-selected", "aria-disabled", "aria-describedby"], He = { class: "tr-model-selector__option-main" }, Ue = ["src"], je = { class: "tr-model-selector__option-text" }, Ne = ["title"], We = ["id", "title"], Qe = /* @__PURE__ */ J({
156
+ name: "TrModelSelectorItem",
157
+ __name: "ModelSelectorItem",
158
+ props: {
159
+ option: {},
160
+ selected: { type: Boolean },
161
+ highlighted: { type: Boolean },
162
+ optionId: {},
163
+ descriptionId: {}
164
+ },
165
+ emits: ["hover", "select"],
166
+ setup(e, { emit: a }) {
167
+ const n = e, t = a;
168
+ function u() {
169
+ n.option.disabled || t("hover", n.option.key);
170
+ }
171
+ function c() {
172
+ n.option.disabled || t("select", n.option.raw);
173
+ }
174
+ return (d, f) => (p(), w("div", {
175
+ id: e.optionId,
176
+ class: N(["tr-model-selector__option", {
177
+ "is-selected": e.selected,
178
+ "is-highlighted": e.highlighted,
179
+ "is-disabled": e.option.disabled
180
+ }]),
181
+ "data-model-selector-option-key": e.option.key,
182
+ role: "option",
183
+ "aria-selected": e.selected,
184
+ "aria-disabled": e.option.disabled || void 0,
185
+ "aria-describedby": e.option.description && !d.$slots.item ? e.descriptionId : void 0,
186
+ onMouseenter: u,
187
+ onMousedown: f[0] || (f[0] = ge(() => {
188
+ }, ["prevent"])),
189
+ onClick: c
190
+ }, [
191
+ I(d.$slots, "item", {
192
+ option: e.option.raw,
193
+ selected: e.selected,
194
+ highlighted: e.highlighted
195
+ }, () => [
196
+ z("span", He, [
197
+ typeof e.option.icon == "string" ? (p(), w("img", {
198
+ key: 0,
199
+ src: e.option.icon,
200
+ class: "tr-model-selector__option-icon",
201
+ alt: "",
202
+ "aria-hidden": "true"
203
+ }, null, 8, Ue)) : e.option.icon ? (p(), _(ie(e.option.icon), {
204
+ key: 1,
205
+ class: "tr-model-selector__option-icon",
206
+ "aria-hidden": "true",
207
+ focusable: "false"
208
+ })) : B("", !0),
209
+ z("span", je, [
210
+ z("span", {
211
+ class: "tr-model-selector__option-label",
212
+ title: e.option.label
213
+ }, q(e.option.label), 9, Ne),
214
+ e.option.description ? (p(), w("span", {
215
+ key: 0,
216
+ id: e.descriptionId,
217
+ class: "tr-model-selector__option-description",
218
+ title: e.option.description
219
+ }, q(e.option.description), 9, We)) : B("", !0)
220
+ ])
221
+ ]),
222
+ j(P(Ee), {
223
+ class: "tr-model-selector__option-check",
224
+ "aria-hidden": "true",
225
+ focusable: "false"
226
+ })
227
+ ])
228
+ ], 42, Ae));
229
+ }
230
+ }), Ge = ["role", "aria-labelledby"], Ye = ["id"], Je = /* @__PURE__ */ J({
231
+ name: "TrModelSelectorGroup",
232
+ __name: "ModelSelectorGroup",
233
+ props: {
234
+ group: {},
235
+ selectedValue: {},
236
+ highlightedKey: {},
237
+ optionIdPrefix: {}
238
+ },
239
+ emits: ["hover", "select"],
240
+ setup(e) {
241
+ return (a, n) => (p(), w("div", {
242
+ class: "tr-model-selector__group",
243
+ role: e.group.label ? "group" : "presentation",
244
+ "aria-labelledby": e.group.label ? `${e.optionIdPrefix}-group-${e.group.index}` : void 0
245
+ }, [
246
+ e.group.label ? (p(), w("div", {
247
+ key: 0,
248
+ id: `${e.optionIdPrefix}-group-${e.group.index}`,
249
+ class: "tr-model-selector__group-title"
250
+ }, q(e.group.label), 9, Ye)) : B("", !0),
251
+ (p(!0), w(ne, null, ae(e.group.items, (t) => (p(), _(Qe, {
252
+ key: t.key,
253
+ option: t,
254
+ selected: e.selectedValue === t.value,
255
+ highlighted: e.highlightedKey === t.key,
256
+ "option-id": `${e.optionIdPrefix}-option-${t.index}`,
257
+ "description-id": `${e.optionIdPrefix}-option-${t.index}-description`,
258
+ onHover: n[0] || (n[0] = (u) => a.$emit("hover", u)),
259
+ onSelect: n[1] || (n[1] = (u) => a.$emit("select", u))
260
+ }, te({ _: 2 }, [
261
+ a.$slots.item ? {
262
+ name: "item",
263
+ fn: A((u) => [
264
+ I(a.$slots, "item", se({ ref_for: !0 }, u))
265
+ ]),
266
+ key: "0"
267
+ } : void 0
268
+ ]), 1032, ["option", "selected", "highlighted", "option-id", "description-id"]))), 128))
269
+ ], 8, Ge));
270
+ }
271
+ }), Xe = {
272
+ key: 0,
273
+ class: "tr-model-selector__header"
274
+ }, Ze = {
275
+ key: 1,
276
+ class: "tr-model-selector__search"
277
+ }, _e = ["value", "placeholder", "aria-label", "aria-controls", "aria-activedescendant"], et = {
278
+ key: 2,
279
+ class: "tr-model-selector__empty",
280
+ role: "status",
281
+ "aria-live": "polite"
282
+ }, tt = ["id", "aria-label", "aria-activedescendant"], lt = {
283
+ key: 3,
284
+ class: "tr-model-selector__footer"
285
+ }, ot = /* @__PURE__ */ J({
286
+ name: "TrModelSelectorPanel",
287
+ __name: "ModelSelectorPanel",
288
+ props: {
289
+ options: {},
290
+ selectedValue: {},
291
+ searchable: { type: Boolean },
292
+ filterMethod: { type: Function },
293
+ listboxId: {},
294
+ optionIdPrefix: {},
295
+ placeholder: {},
296
+ searchPlaceholder: {},
297
+ emptyText: {},
298
+ effortOptions: {},
299
+ effortValue: {},
300
+ effortLabel: {},
301
+ effortDisabled: { type: Boolean },
302
+ size: {},
303
+ panelClass: {},
304
+ slotContext: {}
305
+ },
306
+ emits: ["select", "select-effort", "close"],
307
+ setup(e, { emit: a }) {
308
+ const n = e, t = a, u = V(null), c = V(null), d = V(null), f = V(null);
309
+ let h;
310
+ const i = g(
311
+ () => f.value === null ? void 0 : { "--tr-model-selector-open-min-width": `${f.value}px` }
312
+ ), r = ze({
313
+ options: () => n.options,
314
+ searchable: () => n.searchable,
315
+ filterMethod: () => n.filterMethod
316
+ }), s = Be({
317
+ enabled: () => !0,
318
+ options: () => r.visibleOptions.value,
319
+ selectedValue: () => n.selectedValue,
320
+ containerEl: c
321
+ }), v = g(() => {
322
+ const l = s.highlightedOption.value;
323
+ return l ? `${n.optionIdPrefix}-option-${l.index}` : void 0;
324
+ }), y = g(() => ({
325
+ ...n.slotContext,
326
+ query: r.query.value
327
+ })), S = g(() => ({
328
+ ...y.value,
329
+ reasoningEfforts: n.effortOptions,
330
+ reasoningEffortOption: n.effortOptions.find((l) => l.value === n.effortValue) ?? null,
331
+ setReasoningEffort: (l) => t("select-effort", l)
332
+ }));
333
+ function E(l) {
334
+ r.setQuery(l.target.value);
335
+ }
336
+ function b() {
337
+ const l = n.searchable ? u.value : c.value;
338
+ l == null || l.focus({ preventScroll: !0 });
339
+ }
340
+ async function R() {
341
+ var x, M;
342
+ await Z();
343
+ const l = ((x = u.value) == null ? void 0 : x.ownerDocument.defaultView) ?? ((M = c.value) == null ? void 0 : M.ownerDocument.defaultView);
344
+ if (!l || typeof l.requestAnimationFrame != "function") {
345
+ b();
346
+ return;
347
+ }
348
+ l.requestAnimationFrame(() => {
349
+ b();
350
+ });
351
+ }
352
+ function T() {
353
+ const l = s.highlightedOption.value;
354
+ l && t("select", l.raw);
355
+ }
356
+ function k(l) {
357
+ return l.isComposing || l.keyCode === 229;
358
+ }
359
+ function K(l) {
360
+ if (!(l.defaultPrevented || k(l))) {
361
+ if (l.key === "ArrowDown" || l.key === "ArrowUp") {
362
+ l.preventDefault(), s.moveHighlight(l.key === "ArrowDown" ? 1 : -1);
363
+ return;
364
+ }
365
+ if (l.key === "Enter") {
366
+ l.preventDefault(), T();
367
+ return;
368
+ }
369
+ l.key === "Escape" && (l.preventDefault(), t("close", !0));
370
+ }
371
+ }
372
+ function W(l) {
373
+ if (!(l.defaultPrevented || k(l))) {
374
+ if (l.key === "ArrowDown" || l.key === "ArrowUp") {
375
+ l.preventDefault(), s.moveHighlight(l.key === "ArrowDown" ? 1 : -1);
376
+ return;
377
+ }
378
+ if (l.key === "Home" || l.key === "End") {
379
+ l.preventDefault(), s.highlightBoundary(l.key === "Home" ? "first" : "last");
380
+ return;
381
+ }
382
+ (l.key === "Enter" || l.key === " " || l.key === "Spacebar") && (l.preventDefault(), T());
383
+ }
384
+ }
385
+ function O(l) {
386
+ l.defaultPrevented || l.key === "Escape" && (l.preventDefault(), t("close", !0));
387
+ }
388
+ return ue(() => {
389
+ var D;
390
+ const l = d.value, x = (D = l == null ? void 0 : l.ownerDocument.defaultView) == null ? void 0 : D.ResizeObserver;
391
+ function M() {
392
+ if (!l)
393
+ return;
394
+ const Q = Math.ceil(l.getBoundingClientRect().width);
395
+ Q > (f.value ?? 0) && (f.value = Q);
396
+ }
397
+ M(), l && x && (h = new x(M), h.observe(l)), R();
398
+ }), pe(() => {
399
+ h == null || h.disconnect();
400
+ }), Y(
401
+ () => n.searchable,
402
+ async () => {
403
+ r.clearQuery(), await R();
404
+ }
405
+ ), (l, x) => (p(), w("div", {
406
+ ref_key: "panelEl",
407
+ ref: d,
408
+ class: N(["tr-model-selector__panel", [`tr-model-selector__panel--${e.size}`, e.panelClass]]),
409
+ style: ye(i.value),
410
+ onKeydown: O
411
+ }, [
412
+ l.$slots.header ? (p(), w("div", Xe, [
413
+ I(l.$slots, "header", H(U(y.value)))
414
+ ])) : B("", !0),
415
+ e.searchable ? (p(), w("div", Ze, [
416
+ j(P(Oe), {
417
+ class: "tr-model-selector__search-icon",
418
+ "aria-hidden": "true",
419
+ focusable: "false"
420
+ }),
421
+ z("input", {
422
+ ref_key: "searchInputEl",
423
+ ref: u,
424
+ type: "text",
425
+ class: "tr-model-selector__search-input",
426
+ "data-model-selector-search-input": "",
427
+ role: "combobox",
428
+ value: P(r).query.value,
429
+ placeholder: e.searchPlaceholder,
430
+ "aria-label": e.searchPlaceholder,
431
+ "aria-controls": e.listboxId,
432
+ "aria-activedescendant": v.value,
433
+ "aria-autocomplete": "list",
434
+ "aria-expanded": "true",
435
+ "aria-haspopup": "listbox",
436
+ autocomplete: "off",
437
+ spellcheck: !1,
438
+ onInput: E,
439
+ onKeydown: K
440
+ }, null, 40, _e)
441
+ ])) : B("", !0),
442
+ P(r).isEmpty.value ? (p(), w("div", et, [
443
+ I(l.$slots, "empty", {
444
+ query: P(r).query.value
445
+ }, () => [
446
+ j(P(Se), {
447
+ class: "tr-model-selector__empty-icon",
448
+ "aria-hidden": "true",
449
+ focusable: "false"
450
+ }),
451
+ z("span", null, q(e.emptyText), 1)
452
+ ])
453
+ ])) : B("", !0),
454
+ z("div", {
455
+ id: e.listboxId,
456
+ ref_key: "listboxEl",
457
+ ref: c,
458
+ class: N(["tr-model-selector__content", { "is-empty": P(r).isEmpty.value }]),
459
+ role: "listbox",
460
+ tabindex: "-1",
461
+ "aria-label": e.placeholder,
462
+ "aria-activedescendant": e.searchable ? void 0 : v.value,
463
+ onKeydown: W
464
+ }, [
465
+ (p(!0), w(ne, null, ae(P(r).groups.value, (M) => (p(), _(Je, {
466
+ key: M.key,
467
+ group: M,
468
+ "selected-value": e.selectedValue,
469
+ "highlighted-key": P(s).highlightedKey.value,
470
+ "option-id-prefix": e.optionIdPrefix,
471
+ onHover: P(s).setHighlightedKey,
472
+ onSelect: x[0] || (x[0] = (D) => l.$emit("select", D))
473
+ }, te({ _: 2 }, [
474
+ l.$slots.item ? {
475
+ name: "item",
476
+ fn: A((D) => [
477
+ I(l.$slots, "item", se({ ref_for: !0 }, D))
478
+ ]),
479
+ key: "0"
480
+ } : void 0
481
+ ]), 1032, ["group", "selected-value", "highlighted-key", "option-id-prefix", "onHover"]))), 128))
482
+ ], 42, tt),
483
+ l.$slots.footer || e.effortOptions.length > 0 ? (p(), w("div", lt, [
484
+ I(l.$slots, "footer", H(U(S.value)), () => [
485
+ j(Fe, {
486
+ options: e.effortOptions,
487
+ value: e.effortValue,
488
+ label: e.effortLabel,
489
+ disabled: e.effortDisabled,
490
+ onSelect: x[1] || (x[1] = (M) => l.$emit("select-effort", M))
491
+ }, null, 8, ["options", "value", "label", "disabled"])
492
+ ])
493
+ ])) : B("", !0)
494
+ ], 38));
495
+ }
496
+ }), nt = ["title", "disabled", "aria-label", "aria-expanded", "aria-controls"], at = { class: "tr-model-selector__trigger-content" }, rt = ["src"], it = { class: "tr-model-selector__trigger-label" }, st = {
497
+ key: 2,
498
+ class: "tr-model-selector__trigger-effort"
499
+ }, ut = /* @__PURE__ */ J({
500
+ name: "TrModelSelectorTrigger",
501
+ __name: "ModelSelectorTrigger",
502
+ props: {
503
+ open: { type: Boolean },
504
+ disabled: { type: Boolean },
505
+ label: {},
506
+ effortLabel: {},
507
+ icon: {},
508
+ controlsId: {},
509
+ variant: {},
510
+ size: {}
511
+ },
512
+ emits: ["click", "enter"],
513
+ setup(e, { emit: a }) {
514
+ const n = e, t = g(() => n.effortLabel ? `${n.label} · ${n.effortLabel}` : n.label), u = a;
515
+ function c(d) {
516
+ d.key === "Enter" && !d.defaultPrevented && (d.preventDefault(), u("enter", d));
517
+ }
518
+ return (d, f) => (p(), w("button", {
519
+ type: "button",
520
+ class: N(["tr-model-selector__trigger", [`tr-model-selector__trigger--${e.variant}`, `tr-model-selector__trigger--${e.size}`, { "is-open": e.open }]]),
521
+ title: t.value,
522
+ disabled: e.disabled,
523
+ "aria-label": t.value,
524
+ "aria-expanded": e.open,
525
+ "aria-controls": e.controlsId,
526
+ "aria-haspopup": "listbox",
527
+ onClick: f[0] || (f[0] = (h) => d.$emit("click", h)),
528
+ onKeydown: c
529
+ }, [
530
+ I(d.$slots, "default", {}, () => [
531
+ z("span", at, [
532
+ typeof e.icon == "string" ? (p(), w("img", {
533
+ key: 0,
534
+ src: e.icon,
535
+ class: "tr-model-selector__trigger-icon",
536
+ alt: "",
537
+ "aria-hidden": "true"
538
+ }, null, 8, rt)) : e.icon ? (p(), _(ie(e.icon), {
539
+ key: 1,
540
+ class: "tr-model-selector__trigger-icon",
541
+ "aria-hidden": "true",
542
+ focusable: "false"
543
+ })) : B("", !0),
544
+ z("span", it, q(e.label), 1),
545
+ e.effortLabel ? (p(), w("span", st, q(e.effortLabel), 1)) : B("", !0)
546
+ ]),
547
+ j(P(xe), {
548
+ class: "tr-model-selector__trigger-chevron",
549
+ "aria-hidden": "true",
550
+ focusable: "false"
551
+ })
552
+ ])
553
+ ], 42, nt));
554
+ }
555
+ });
556
+ function dt(e) {
557
+ const a = e.controlled, n = V(e.defaultValue), t = g(() => a ? e.value() ?? null : n.value), u = g(() => e.efforts().find((d) => d.value === t.value) ?? null);
558
+ function c(d) {
559
+ if (Object.is(t.value, d))
560
+ return !1;
561
+ if (d !== null) {
562
+ const f = e.efforts().find((h) => h.value === d);
563
+ if (!f || f.disabled)
564
+ return !1;
565
+ }
566
+ return a || (n.value = d), e.onUpdateValue(d), !0;
567
+ }
568
+ return {
569
+ value: t,
570
+ activeOption: u,
571
+ setValue: c
572
+ };
573
+ }
574
+ function re(e, a) {
575
+ var u, c;
576
+ if ((((u = e.composedPath) == null ? void 0 : u.call(e)) ?? []).includes(a))
577
+ return !0;
578
+ const t = (c = a.ownerDocument.defaultView) == null ? void 0 : c.Node;
579
+ return !!(t && e.target instanceof t && a.contains(e.target));
580
+ }
581
+ function ct(e) {
582
+ const a = V(!1), n = Y(
583
+ () => [
584
+ e.open(),
585
+ e.referenceEl.value,
586
+ e.floatingEl.value,
587
+ e.placement(),
588
+ e.offset(),
589
+ e.teleportTarget()
590
+ ],
591
+ async ([t, u, c, d, f, h], i, r) => {
592
+ if (a.value = !1, !t || !u || !c)
593
+ return;
594
+ const s = u, v = c;
595
+ let y = !0, S = 0;
596
+ const E = {}, b = s.ownerDocument, R = (k) => {
597
+ re(k, s) || re(k, v) || e.onOutsidePointerDown(k);
598
+ };
599
+ b.addEventListener("pointerdown", R, !0), r(() => {
600
+ var k;
601
+ y = !1, S += 1, (k = E.current) == null || k.call(E), b.removeEventListener("pointerdown", R, !0), a.value = !1;
602
+ });
603
+ async function T() {
604
+ var K;
605
+ const k = ++S;
606
+ try {
607
+ const W = await Pe(s, v, {
608
+ placement: d,
609
+ strategy: "fixed",
610
+ middleware: [
611
+ Ve(f),
612
+ Te({ padding: 8 }),
613
+ Ce({ padding: 8 }),
614
+ De({
615
+ padding: 8,
616
+ apply({ availableHeight: M, availableWidth: D, rects: Q, elements: G }) {
617
+ const ee = Math.min(Q.reference.width, Math.max(0, D));
618
+ G.floating.style.minWidth = `${Math.round(ee)}px`, G.floating.style.maxWidth = `${Math.max(0, Math.floor(D))}px`, G.floating.style.setProperty(
619
+ "--tr-model-selector-available-height",
620
+ `${Math.max(0, Math.floor(M))}px`
621
+ ), G.floating.style.setProperty(
622
+ "--tr-model-selector-available-width",
623
+ `${Math.max(0, Math.floor(D))}px`
624
+ );
625
+ }
626
+ })
627
+ ]
628
+ });
629
+ if (!y || k !== S || !e.open() || e.referenceEl.value !== s || e.floatingEl.value !== v)
630
+ return;
631
+ const O = ((K = b.defaultView) == null ? void 0 : K.devicePixelRatio) || 1, l = Math.round(W.x * O) / O, x = Math.round(W.y * O) / O;
632
+ Object.assign(v.style, {
633
+ left: `${l}px`,
634
+ top: `${x}px`
635
+ }), a.value = !0;
636
+ } catch {
637
+ y && k === S && (a.value = !1);
638
+ }
639
+ }
640
+ await Z(), !(!y || !e.open()) && (E.current = Me(s, v, () => {
641
+ T();
642
+ }));
643
+ },
644
+ { flush: "post", immediate: !0 }
645
+ );
646
+ return be(() => {
647
+ n();
648
+ }), {
649
+ isPositioned: a
650
+ };
651
+ }
652
+ function ft(e) {
653
+ const a = e.valueControlled, n = e.openControlled, t = V(e.defaultValue), u = V(e.defaultOpen), c = g(() => a ? e.value() ?? null : t.value), d = g(() => n ? !!e.open() : u.value);
654
+ function f(i) {
655
+ return Object.is(c.value, i) ? !1 : (a || (t.value = i), e.onUpdateValue(i), !0);
656
+ }
657
+ function h(i) {
658
+ return d.value === i ? !1 : (n || (u.value = i), e.onUpdateOpen(i), !0);
659
+ }
660
+ return {
661
+ value: c,
662
+ open: d,
663
+ setValue: f,
664
+ setOpen: h
665
+ };
666
+ }
667
+ const ht = Object.freeze([
668
+ Object.freeze({ value: "low", label: "Low" }),
669
+ Object.freeze({ value: "medium", label: "Medium" }),
670
+ Object.freeze({ value: "high", label: "High" })
671
+ ]);
672
+ function vt(e) {
673
+ if (!e)
674
+ return [];
675
+ if (e === !0)
676
+ return ht;
677
+ const a = /* @__PURE__ */ new Set(), n = [];
678
+ for (const t of e)
679
+ a.has(t.value) || (a.add(t.value), n.push(t));
680
+ return n;
681
+ }
682
+ function mt(e) {
683
+ if (!e || e === !0)
684
+ return [];
685
+ const a = /* @__PURE__ */ new Set(), n = /* @__PURE__ */ new Set();
686
+ for (const t of e)
687
+ a.has(t.value) ? n.add(t.value) : a.add(t.value);
688
+ return Array.from(n);
689
+ }
690
+ const gt = "__tr-model-selector-ungrouped__";
691
+ function oe(e) {
692
+ return (e == null ? void 0 : e.trim()) ?? "";
693
+ }
694
+ function pt(e) {
695
+ return e.filter((a) => !!(a && a.trim())).join(" ").toLocaleLowerCase();
696
+ }
697
+ function yt(e) {
698
+ const a = /* @__PURE__ */ new Set(), n = [];
699
+ return e.forEach((t, u) => {
700
+ if (a.has(t.value))
701
+ return;
702
+ a.add(t.value);
703
+ const c = oe(t.label) || t.value, d = oe(t.description) || void 0, f = oe(t.group), h = f ? `group:${f}` : gt, i = typeof t.icon == "string" ? t.icon : t.icon ? we(t.icon) : void 0;
704
+ n.push({
705
+ key: `value:${t.value}`,
706
+ index: u,
707
+ value: t.value,
708
+ label: c,
709
+ description: d,
710
+ icon: i,
711
+ disabled: !!t.disabled,
712
+ groupKey: h,
713
+ searchText: pt([c, t.value, d, f]),
714
+ raw: t
715
+ });
716
+ }), n;
717
+ }
718
+ function bt(e) {
719
+ const a = /* @__PURE__ */ new Set(), n = /* @__PURE__ */ new Set();
720
+ return e.forEach((t) => {
721
+ a.has(t.value) ? n.add(t.value) : a.add(t.value);
722
+ }), [...n];
723
+ }
724
+ const wt = { class: "tr-model-selector__dropdown-surface" }, le = /* @__PURE__ */ J({
725
+ name: "TrModelSelector",
726
+ __name: "index",
727
+ props: {
728
+ models: { default: () => [] },
729
+ modelValue: {},
730
+ defaultValue: { default: null },
731
+ reasoningEffort: { default: void 0 },
732
+ defaultReasoningEffort: { default: null },
733
+ open: { type: Boolean, default: void 0 },
734
+ defaultOpen: { type: Boolean, default: !1 },
735
+ disabled: { type: Boolean, default: !1 },
736
+ searchable: { type: Boolean, default: !1 },
737
+ placeholder: { default: "选择模型" },
738
+ searchPlaceholder: { default: "搜索模型" },
739
+ emptyText: { default: "暂无可用模型" },
740
+ filterMethod: {},
741
+ variant: { default: "outline" },
742
+ size: { default: "normal" },
743
+ placement: { default: "bottom-start" },
744
+ offset: { default: 8 },
745
+ appendTo: {},
746
+ panelClass: {},
747
+ reasoningEffortLabel: { default: "Thinking" }
748
+ },
749
+ emits: ["update:modelValue", "change", "update:reasoningEffort", "reasoning-effort-change", "update:open"],
750
+ setup(e, { emit: a }) {
751
+ const n = e, t = a, u = ke(), c = (u == null ? void 0 : u.uid) ?? 0, d = (u == null ? void 0 : u.vnode.props) ?? {}, f = (...o) => o.some((m) => Object.prototype.hasOwnProperty.call(d, m)), h = `tr-model-selector-${c}`, i = `${h}-listbox`, r = V(null), s = V(null), v = V(!1), y = V(null), S = Ie(r), E = g(() => {
752
+ var C, L;
753
+ if (!v.value)
754
+ return null;
755
+ const o = S.value, m = n.appendTo;
756
+ if (!m)
757
+ return o;
758
+ if (typeof m != "string")
759
+ return m;
760
+ if (m === "body" && o === ((C = r.value) == null ? void 0 : C.ownerDocument.body))
761
+ return o;
762
+ const $ = o;
763
+ try {
764
+ return ((L = $.querySelector) == null ? void 0 : L.call($, m)) ?? o;
765
+ } catch {
766
+ return o;
767
+ }
768
+ }), b = ft({
769
+ value: () => n.modelValue,
770
+ defaultValue: n.defaultValue,
771
+ valueControlled: f("modelValue", "model-value"),
772
+ open: () => n.open,
773
+ defaultOpen: n.disabled ? !1 : n.defaultOpen,
774
+ openControlled: f("open"),
775
+ onUpdateValue: (o) => t("update:modelValue", o),
776
+ onUpdateOpen: (o) => t("update:open", o)
777
+ }), R = g(() => yt(n.models));
778
+ g(() => bt(n.models));
779
+ const T = g(() => R.value.find((o) => o.value === b.value.value) ?? null), k = g(() => {
780
+ var o;
781
+ return vt((o = T.value) == null ? void 0 : o.raw.reasoningEfforts);
782
+ });
783
+ g(() => {
784
+ var o;
785
+ return mt((o = T.value) == null ? void 0 : o.raw.reasoningEfforts);
786
+ });
787
+ const K = dt({
788
+ value: () => n.reasoningEffort,
789
+ defaultValue: n.defaultReasoningEffort,
790
+ efforts: () => k.value,
791
+ controlled: f("reasoningEffort", "reasoning-effort"),
792
+ onUpdateValue: (o) => t("update:reasoningEffort", o)
793
+ }), W = g(() => {
794
+ var o;
795
+ return ((o = K.activeOption.value) == null ? void 0 : o.value) ?? null;
796
+ }), O = g(() => b.open.value && !n.disabled), l = g(() => {
797
+ var o;
798
+ return ((o = T.value) == null ? void 0 : o.label) ?? n.placeholder;
799
+ }), x = g(() => {
800
+ var o;
801
+ return {
802
+ option: ((o = T.value) == null ? void 0 : o.raw) ?? null,
803
+ label: l.value,
804
+ open: O.value,
805
+ reasoningEffortOption: K.activeOption.value
806
+ };
807
+ }), M = g(() => {
808
+ var o;
809
+ return {
810
+ option: ((o = T.value) == null ? void 0 : o.raw) ?? null,
811
+ close: ve
812
+ };
813
+ });
814
+ function D() {
815
+ var o, m;
816
+ (m = (o = r.value) == null ? void 0 : o.querySelector(".tr-model-selector__trigger")) == null || m.focus({ preventScroll: !0 });
817
+ }
818
+ function Q() {
819
+ var m, $;
820
+ let o = ((m = r.value) == null ? void 0 : m.ownerDocument.activeElement) ?? null;
821
+ for (; ($ = o == null ? void 0 : o.shadowRoot) != null && $.activeElement; )
822
+ o = o.shadowRoot.activeElement;
823
+ return o;
824
+ }
825
+ function G() {
826
+ var m;
827
+ const o = Q();
828
+ return !!(o && ((m = s.value) != null && m.contains(o)));
829
+ }
830
+ function ee() {
831
+ n.disabled || b.setOpen(!0);
832
+ }
833
+ function X(o) {
834
+ var L;
835
+ if (!O.value || y.value !== null)
836
+ return;
837
+ if (y.value = o, !b.setOpen(!1)) {
838
+ y.value = null;
839
+ return;
840
+ }
841
+ const $ = () => {
842
+ O.value && y.value === o && (y.value = null);
843
+ }, C = (L = r.value) == null ? void 0 : L.ownerDocument.defaultView;
844
+ C ? C.setTimeout($, 0) : Z().then($);
845
+ }
846
+ function de() {
847
+ O.value ? X(!1) : ee();
848
+ }
849
+ function ce() {
850
+ ee();
851
+ }
852
+ function fe(o) {
853
+ const m = R.value.find((C) => C.value === o.value);
854
+ if (!m || m.disabled)
855
+ return;
856
+ b.setValue(m.value) && t("change", m.raw), X(!0);
857
+ }
858
+ function he(o) {
859
+ var C;
860
+ if (n.disabled || (C = T.value) != null && C.disabled)
861
+ return;
862
+ const m = o === null ? null : k.value.find((L) => L.value === o) ?? null;
863
+ K.setValue(o) && t("reasoning-effort-change", m);
864
+ }
865
+ function ve() {
866
+ X(!0);
867
+ }
868
+ const { isPositioned: me } = ct({
869
+ referenceEl: r,
870
+ floatingEl: s,
871
+ open: () => O.value,
872
+ placement: () => n.placement,
873
+ offset: () => n.offset,
874
+ teleportTarget: () => E.value,
875
+ onOutsidePointerDown: () => X(!1)
876
+ });
877
+ return Y(
878
+ () => n.disabled,
879
+ (o) => {
880
+ o && b.open.value && (y.value = !1, b.setOpen(!1));
881
+ }
882
+ ), Y(
883
+ O,
884
+ async (o, m) => {
885
+ if (!o) {
886
+ if (m) {
887
+ const $ = y.value ?? G();
888
+ y.value = null, $ && (await Z(), D());
889
+ }
890
+ return;
891
+ }
892
+ },
893
+ { immediate: !0 }
894
+ ), ue(() => {
895
+ v.value = !0;
896
+ }), (o, m) => {
897
+ var $, C, L;
898
+ return p(), w("div", {
899
+ class: N(["tr-model-selector", [`tr-model-selector--${e.variant}`, `tr-model-selector--${e.size}`]])
900
+ }, [
901
+ z("span", {
902
+ ref_key: "referenceEl",
903
+ ref: r,
904
+ class: "tr-model-selector__anchor"
905
+ }, [
906
+ j(ut, {
907
+ open: O.value,
908
+ disabled: e.disabled,
909
+ label: l.value,
910
+ "effort-label": ($ = P(K).activeOption.value) == null ? void 0 : $.label,
911
+ icon: (C = T.value) == null ? void 0 : C.icon,
912
+ "controls-id": i,
913
+ variant: e.variant,
914
+ size: e.size,
915
+ onClick: de,
916
+ onEnter: ce
917
+ }, te({ _: 2 }, [
918
+ o.$slots.trigger ? {
919
+ name: "default",
920
+ fn: A(() => [
921
+ I(o.$slots, "trigger", H(U(x.value)))
922
+ ]),
923
+ key: "0"
924
+ } : void 0
925
+ ]), 1032, ["open", "disabled", "label", "effort-label", "icon", "variant", "size"])
926
+ ], 512),
927
+ E.value ? (p(), _($e, {
928
+ key: 0,
929
+ to: E.value
930
+ }, [
931
+ O.value ? (p(), w("div", {
932
+ key: 0,
933
+ ref_key: "floatingEl",
934
+ ref: s,
935
+ class: N(["tr-model-selector__dropdown-wrapper", { "is-positioned": P(me) }])
936
+ }, [
937
+ z("div", wt, [
938
+ j(ot, {
939
+ options: R.value,
940
+ "selected-value": P(b).value.value,
941
+ searchable: e.searchable,
942
+ "filter-method": e.filterMethod,
943
+ "listbox-id": i,
944
+ "option-id-prefix": h,
945
+ placeholder: e.placeholder,
946
+ "search-placeholder": e.searchPlaceholder,
947
+ "empty-text": e.emptyText,
948
+ "effort-options": k.value,
949
+ "effort-value": W.value,
950
+ "effort-label": e.reasoningEffortLabel,
951
+ "effort-disabled": !!((L = T.value) != null && L.disabled),
952
+ size: e.size,
953
+ "panel-class": e.panelClass,
954
+ "slot-context": M.value,
955
+ onSelect: fe,
956
+ onSelectEffort: he,
957
+ onClose: X
958
+ }, te({ _: 2 }, [
959
+ o.$slots.header ? {
960
+ name: "header",
961
+ fn: A((F) => [
962
+ I(o.$slots, "header", H(U(F)))
963
+ ]),
964
+ key: "0"
965
+ } : void 0,
966
+ o.$slots.item ? {
967
+ name: "item",
968
+ fn: A((F) => [
969
+ I(o.$slots, "item", H(U(F)))
970
+ ]),
971
+ key: "1"
972
+ } : void 0,
973
+ o.$slots.empty ? {
974
+ name: "empty",
975
+ fn: A((F) => [
976
+ I(o.$slots, "empty", H(U(F)))
977
+ ]),
978
+ key: "2"
979
+ } : void 0,
980
+ o.$slots.footer ? {
981
+ name: "footer",
982
+ fn: A((F) => [
983
+ I(o.$slots, "footer", H(U(F)))
984
+ ]),
985
+ key: "3"
986
+ } : void 0
987
+ ]), 1032, ["options", "selected-value", "searchable", "filter-method", "placeholder", "search-placeholder", "empty-text", "effort-options", "effort-value", "effort-label", "effort-disabled", "size", "panel-class", "slot-context"])
988
+ ])
989
+ ], 2)) : B("", !0)
990
+ ], 8, ["to"])) : B("", !0)
991
+ ], 2);
992
+ };
993
+ }
994
+ });
995
+ le.name = "TrModelSelector";
996
+ const kt = function(e) {
997
+ e.component(le.name, le);
998
+ };
999
+ le.install = kt;
1000
+ export {
1001
+ le as default
1002
+ };